From 73d2340f6c79a0de2050c66526ce9f682aa34695 Mon Sep 17 00:00:00 2001 From: Tom French <15848336+TomAFrench@users.noreply.github.com> Date: Tue, 15 Jul 2025 17:12:36 +0000 Subject: [PATCH 1/5] feat: mark instructions after invalid array operations as unreachable --- .../opt/remove_unreachable_instructions.rs | 70 +++ ...ig_false_inliner_-9223372036854775808.snap | 74 +-- ..._tests__force_brillig_false_inliner_0.snap | 74 +-- ...lig_false_inliner_9223372036854775807.snap | 74 +-- ...lig_true_inliner_-9223372036854775808.snap | 15 +- ...__tests__force_brillig_true_inliner_0.snap | 15 +- ...llig_true_inliner_9223372036854775807.snap | 15 +- ...ig_false_inliner_-9223372036854775808.snap | 13 +- ..._tests__force_brillig_false_inliner_0.snap | 13 +- ...lig_false_inliner_9223372036854775807.snap | 13 +- ...lig_true_inliner_-9223372036854775808.snap | 4 +- ...__tests__force_brillig_true_inliner_0.snap | 4 +- ...llig_true_inliner_9223372036854775807.snap | 4 +- ...ig_false_inliner_-9223372036854775808.snap | 535 +++--------------- ..._tests__force_brillig_false_inliner_0.snap | 535 +++--------------- ...lig_false_inliner_9223372036854775807.snap | 535 +++--------------- ...lig_true_inliner_-9223372036854775808.snap | 4 +- ...__tests__force_brillig_true_inliner_0.snap | 4 +- ...ig_false_inliner_-9223372036854775808.snap | 3 +- ..._tests__force_brillig_false_inliner_0.snap | 3 +- ...lig_false_inliner_9223372036854775807.snap | 3 +- ...ig_false_inliner_-9223372036854775808.snap | 26 +- ..._tests__force_brillig_false_inliner_0.snap | 26 +- ...lig_false_inliner_9223372036854775807.snap | 26 +- ...ig_false_inliner_-9223372036854775808.snap | 11 +- ..._tests__force_brillig_false_inliner_0.snap | 11 +- ...lig_false_inliner_9223372036854775807.snap | 11 +- ...ig_false_inliner_-9223372036854775808.snap | 33 +- ..._tests__force_brillig_false_inliner_0.snap | 33 +- ...lig_false_inliner_9223372036854775807.snap | 33 +- ...lig_true_inliner_-9223372036854775808.snap | 4 +- ...__tests__force_brillig_true_inliner_0.snap | 15 +- ...llig_true_inliner_9223372036854775807.snap | 15 +- ...ig_false_inliner_-9223372036854775808.snap | 12 +- ...lig_true_inliner_-9223372036854775808.snap | 12 +- ...lig_true_inliner_-9223372036854775808.snap | 4 +- ...__tests__force_brillig_true_inliner_0.snap | 4 +- ...llig_true_inliner_9223372036854775807.snap | 4 +- ...lig_true_inliner_-9223372036854775808.snap | 15 +- ...__tests__force_brillig_true_inliner_0.snap | 15 +- ...llig_true_inliner_9223372036854775807.snap | 15 +- ...ig_false_inliner_-9223372036854775808.snap | 304 +--------- ..._tests__force_brillig_false_inliner_0.snap | 304 +--------- ...lig_false_inliner_9223372036854775807.snap | 304 +--------- ...ig_false_inliner_-9223372036854775808.snap | 12 +- ..._tests__force_brillig_false_inliner_0.snap | 12 +- ...lig_false_inliner_9223372036854775807.snap | 12 +- 47 files changed, 425 insertions(+), 2858 deletions(-) diff --git a/compiler/noirc_evaluator/src/ssa/opt/remove_unreachable_instructions.rs b/compiler/noirc_evaluator/src/ssa/opt/remove_unreachable_instructions.rs index 992ce2771d3..8a85845d052 100644 --- a/compiler/noirc_evaluator/src/ssa/opt/remove_unreachable_instructions.rs +++ b/compiler/noirc_evaluator/src/ssa/opt/remove_unreachable_instructions.rs @@ -126,6 +126,37 @@ impl Function { false } } + + Instruction::ArrayGet { array, index, offset } + | Instruction::ArraySet { array, index, offset, .. } => { + let predicate = context.dfg.get_numeric_constant(side_effects_condition); + match predicate { + Some(predicate) => { + if predicate.is_zero() { + // The predicate is zero + return; + } + } + None => { + // The predicate is a variable + return; + } + } + + let array_or_slice_type = context.dfg.type_of_value(*array); + match array_or_slice_type { + Type::Slice(_) => false, + Type::Array(_, len) => { + len == 0 + || context.dfg.get_numeric_constant(*index).is_some_and(|index| { + (index.try_to_u32().unwrap() - offset.to_u32()) >= len + }) + } + _ => unreachable!( + "Encountered non-array type during array read/write operation" + ), + } + } _ => false, }; @@ -305,6 +336,45 @@ mod test { assert_normalized_ssa_equals(ssa, src); } + #[test] + fn removes_unreachable_instructions_in_block_for_invalid_array_get() { + let src = r#" + acir(inline) predicate_pure fn main f0 { + b0(v0: [Field; 10], v1: u32): + v2 = make_array [] : [Field; 0] + jmpif u1 0 then: b1, else: b2 + b1(): + jmp b3() + b2(): + v3 = array_get v2, index v1 -> Field + jmp b4() + b3(): + v4 = array_get v0, index u32 11 -> Field + jmp b4() + b4(): + return Field 1 + } + "#; + let ssa = Ssa::from_str(src).unwrap(); + let ssa = ssa.remove_unreachable_instructions(); + + assert_ssa_snapshot!(ssa, @r" + acir(inline) predicate_pure fn main f0 { + b0(v0: [Field; 10]): + v1 = make_array [] : [Field; 0] + jmpif u1 0 then: b1, else: b2 + b1(): + jmp b3() + b2(): + v4 = array_get v1, index u32 0 -> Field + unreachable + b3(): + v6 = array_get v0, index u32 11 -> Field + unreachable + } + "); + } + #[test] fn does_not_replace_sub_that_overflows_but_is_disabled_because_of_unknown_side_effects_condition() { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index a134c1bd4f7..e6c38a50a96 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -34,79 +34,15 @@ expression: artifact }, "bytecode": [ "func 0", - "current witness index : _63", + "current witness index : _2", "private parameters indices : [_0]", "public parameters indices : [_1, _2]", - "return value indices : []", - "BLACKBOX::MULTI_SCALAR_MUL [(1, 254), (17631683881184975370165255887551781615748388533673675138860, 254), (0, 1), (_0, 254), (0, 254)] [_3, _4, _5]", - "EXPR [ (-1, _1) (1, _3) 0 ]", - "EXPR [ (-1, _2) (1, _4) 0 ]", - "EXPR [ (-1, _6) 0 ]", - "BLACKBOX::EMBEDDED_CURVE_ADD [(_1, 254), (_2, 254), (_6, 1), (_1, 254), (_2, 254), (_6, 1)] [_7, _8, _9]", - "EXPR [ (-1, _7) 3078034153852398078128400807926804309327113743808504829582559963737223069694 ]", - "BLACKBOX::MULTI_SCALAR_MUL [(1, 254), (17631683881184975370165255887551781615748388533673675138860, 254), (0, 1), (1, 254), (17631683881184975370165255887551781615748388533673675138860, 254), (0, 1), (_0, 254), (0, 254), (_0, 254), (0, 254)] [_10, _11, _12]", - "EXPR [ (-1, _10) 3078034153852398078128400807926804309327113743808504829582559963737223069694 ]", - "BLACKBOX::MULTI_SCALAR_MUL [(1, 254), (17631683881184975370165255887551781615748388533673675138860, 254), (0, 1), (_1, 254), (_2, 254), (0, 1), (11179562631109628533987091031692370366552561688588090155835439555627259799605, 254), (3443719903172018228650470536370404288991794296383447657609081676265727805364, 254), (0, 1), (_0, 254), (0, 254), (_0, 254), (0, 254), (1, 254), (0, 254)] [_13, _14, _15]", - "EXPR [ (1, _13) 7349266043899242844836273743257843180744506495159104166319746739537754653274 ]", - "BLACKBOX::MULTI_SCALAR_MUL [(1, 254), (17631683881184975370165255887551781615748388533673675138860, 254), (0, 1), (_0, 254), (0, 254)] [_16, _17, _18]", - "EXPR [ (1, _18) 0 ]", - "EXPR [ (1, _16) -1 ]", - "EXPR [ (1, _17) -17631683881184975370165255887551781615748388533673675138860 ]", - "EXPR [ (1, _1) (-1, _2) (-1, _19) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(19))], q_c: 0 })], outputs: [Simple(Witness(20))]", - "EXPR [ (1, _19, _20) (1, _21) -1 ]", - "EXPR [ (1, _19, _21) 0 ]", - "EXPR [ (-17631683881184975370165255887551781615748388533673675138858, _21) (-1, _22) 17631683881184975370165255887551781615748388533673675138860 ]", - "EXPR [ (-1, _23) 1 ]", - "BLACKBOX::EMBEDDED_CURVE_ADD [(_23, 254), (_22, 254), (_6, 1), (_23, 254), (_22, 254), (_6, 1)] [_24, _25, _26]", - "EXPR [ (1, _21, _24) (-1, _21) 0 ]", - "EXPR [ (-3078034153852398078128400807926804309327113743808504829582559963737223069693, _21) (-1, _27) 3078034153852398078128400807926804309327113743808504829582559963737223069694 ]", - "EXPR [ (9191351987198133172789796342745422989482268917117950487758512501574271532888, _21) (-1, _28) -9191351987198133172789796342745422989482268917117950487758512501574271532885 ]", - "BLACKBOX::EMBEDDED_CURVE_ADD [(_23, 254), (_22, 254), (_6, 1), (_27, 254), (_28, 254), (_6, 1)] [_29, _30, _31]", - "EXPR [ (1, _21, _29) (-1, _21) 0 ]", - "EXPR [ (1, _1, _21) (-1, _32) 1 ]", - "EXPR [ (1, _2, _21) (-17631683881184975370165255887551781615748388533673675138860, _21) (-1, _33) 17631683881184975370165255887551781615748388533673675138860 ]", - "BLACKBOX::EMBEDDED_CURVE_ADD [(_32, 254), (_33, 254), (_6, 1), (_32, 254), (_33, 254), (_6, 1)] [_34, _35, _36]", - "EXPR [ (1, _21, _34) (-1, _21) 0 ]", - "EXPR [ (1, _1, _21) (-3078034153852398078128400807926804309327113743808504829582559963737223069693, _21) (-1, _37) 3078034153852398078128400807926804309327113743808504829582559963737223069694 ]", - "EXPR [ (1, _2, _21) (9191351987198133172789796342745422989482268917117950487758512501574271532886, _21) (-1, _38) -9191351987198133172789796342745422989482268917117950487758512501574271532885 ]", - "BLACKBOX::EMBEDDED_CURVE_ADD [(_32, 254), (_33, 254), (_6, 1), (_37, 254), (_38, 254), (_6, 1)] [_39, _40, _41]", - "EXPR [ (1, _21, _39) (-1, _21) 0 ]", - "EXPR [ (1, _21) (-1, _42) 1 ]", - "EXPR [ (-17631683881184975370165255887551781615748388533673675138857, _21) (-1, _43) 17631683881184975370165255887551781615748388533673675138860 ]", - "EXPR [ (1, _1, _21) (-3078034153852398078128400807926804309327113743808504829582559963737223069694, _21) (-1, _44) 3078034153852398078128400807926804309327113743808504829582559963737223069694 ]", - "BLACKBOX::EMBEDDED_CURVE_ADD [(_42, 254), (_43, 254), (_6, 1), (_44, 254), (_38, 254), (_6, 1)] [_45, _46, _47]", - "EXPR [ (1, _21, _45) (-1, _21) 0 ]", - "EXPR [ (-3078034153852398078128400807926804309327113743808504829582559963737223069692, _21) (-1, _48) 3078034153852398078128400807926804309327113743808504829582559963737223069694 ]", - "EXPR [ (9191351987198133172789796342745422989482268917117950487758512501574271532889, _21) (-1, _49) -9191351987198133172789796342745422989482268917117950487758512501574271532885 ]", - "BLACKBOX::EMBEDDED_CURVE_ADD [(_42, 254), (_43, 254), (_6, 1), (_48, 254), (_49, 254), (_6, 1)] [_50, _51, _52]", - "EXPR [ (1, _21, _50) (-1, _21) 0 ]", - "BLACKBOX::EMBEDDED_CURVE_ADD [(_42, 254), (_43, 254), (_6, 1), (_42, 254), (_43, 254), (_6, 1)] [_53, _54, _55]", - "EXPR [ (1, _21, _53) (-1, _21) 0 ]", - "BLACKBOX::EMBEDDED_CURVE_ADD [(_23, 254), (_43, 254), (_6, 1), (_23, 254), (_43, 254), (_6, 1)] [_56, _57, _58]", - "EXPR [ (1, _21, _56) (-1, _21) 0 ]", - "EXPR [ (1, _1, _21) (-1, _21) (-1, _59) 1 ]", - "EXPR [ (9191351987198133172789796342745422989482268917117950487758512501574271532887, _21) (-1, _60) -9191351987198133172789796342745422989482268917117950487758512501574271532885 ]", - "BLACKBOX::EMBEDDED_CURVE_ADD [(_59, 254), (_43, 254), (_6, 1), (_44, 254), (_60, 254), (_6, 1)] [_61, _62, _63]", - "EXPR [ (1, _21, _61) (-1, _21) 0 ]", - "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) } }]" + "return value indices : []" ], - "debug_symbols": "tVjLbuowEP0Xr7PwvPzor1xdVZSmFVIEKIUrXVX9946LndCFUWuS1QGSOcwce04yfjfP/dP59XG3fzm8mYc/7+Zp3A3D7vVxOGw3p91hr7++f3SmfH08jX2vP5mr6xp13Iz9/mQe9udh6My/zXD+uuntuNl/4Wkz6lXbmX7/rKiEL7uhT58+ujna1kMxSA7G4KZw+XE8ecjxjKEWj/V4lsiFwPFcALg2Bqox3KiBeapBpEEDdrHEB2qId7GsgQeoxfsb8VjydwK1+kM93qNgSQAjNTAEsiWFQIw1BrghAgBanzn0s/ASJL5hN3hxRQzfsprBFSki2Vo88N0t8XOKlp4Ay1SEtM426ADkJwahqpIQ7lcirKqEcNkQ4DC2KBF8yQFi5KpLLmCTq/ok2qm50CI3KIHan4UBqImBpFSB5Kq7Cu+1S7zldnbyy2Bj1WMwLuB2eL/rEiyQx29IWlwXKeC0rlea/mJncPKBCwNL9TlKsoQasrIa7OZafGhRw/PUaZ5bXAsDTN0esPpuyPbOTmO4u9MYF1jTm3n8rNOYl8iDV95bga9e+W3TzghFDYxQdXEOS6gRVlYj0lwLQ8sEhFjecwil2ieyxB79DUmLGoR+rqVpliGOZRgiIayq4ZZQw62shvBci7R4KHlfeo2Crfq4W2IucivPRfqAnmuhpjnZSnkmsa3vLreEi7qVXZTBTrUAtLgoE5VeY3JV33BLuKhb2UVZd8RUS/y+sn/122a7G7+dfBmru6gzoLd0BjXBzlD6+87wBSQNkJ1xaf7qjFfQHEMaoDoT0/SgwTa9KyoqS9qagBkpo1KhEoNkdBl9xpBcTjFeEG1GSDamqHyk9yFl5IySOkDRpaFK0WcMGZWPNVtSvmQgBBkxo/KJ5k/KJ5o/SUaX0WdUPlE+Uj5RPrYZIaPyifKx8qUzB1Y+p3Es6X1LUflcus+nIybFkDFeUGw6cPpIqzruNk9Dn48kX8777dUJ5en/sVwpZ5jH8bDtn89jn9b065qu8ic=", - "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", - "path": "std/embedded_curve_ops.nr" - }, - "50": { - "source": "use std::{embedded_curve_ops::embedded_curve_add_unsafe, ops::Add};\n\nfn main(priv_key: Field, pub_x: pub Field, pub_y: pub Field) {\n let g1 = std::embedded_curve_ops::EmbeddedCurvePoint::generator();\n let scalar = std::embedded_curve_ops::EmbeddedCurveScalar { lo: priv_key, hi: 0 };\n // Test that multi_scalar_mul correctly derives the public key\n let res = std::embedded_curve_ops::multi_scalar_mul([g1], [scalar]);\n assert(res.x == pub_x);\n assert(res.y == pub_y);\n\n // Test that double function calling embedded_curve_add works as expected\n let pub_point =\n std::embedded_curve_ops::EmbeddedCurvePoint { x: pub_x, y: pub_y, is_infinite: false };\n let res = pub_point.double();\n let double = g1.add(g1);\n\n assert(double.x == res.x);\n\n // Test calling multi_scalar_mul with multiple points and scalars\n let res = std::embedded_curve_ops::multi_scalar_mul([g1, g1], [scalar, scalar]);\n\n // The results should be double the g1 point because the scalars are 1 and we pass in g1 twice\n assert(double.x == res.x);\n\n // Tests for #6549\n let const_scalar1 = std::embedded_curve_ops::EmbeddedCurveScalar { lo: 23, hi: 0 };\n let const_scalar2 = std::embedded_curve_ops::EmbeddedCurveScalar { lo: 0, hi: 23 };\n let const_scalar3 = std::embedded_curve_ops::EmbeddedCurveScalar { lo: 13, hi: 4 };\n let partial_mul = std::embedded_curve_ops::multi_scalar_mul(\n [g1, double, pub_point, g1, g1],\n [scalar, const_scalar1, scalar, const_scalar2, const_scalar3],\n );\n assert(partial_mul.x == 0x2024c4eebfbc8a20018f8c95c7aab77c6f34f10cf785a6f04e97452d8708fda7);\n // Check simplification by zero\n let zero_point = std::embedded_curve_ops::EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true };\n let const_zero = std::embedded_curve_ops::EmbeddedCurveScalar { lo: 0, hi: 0 };\n let partial_mul = std::embedded_curve_ops::multi_scalar_mul(\n [zero_point, double, g1],\n [scalar, const_zero, scalar],\n );\n assert(partial_mul == g1);\n\n // Additional tests for validating embedded_curve_add_unsafe under a conditional\n if pub_x == pub_y {\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 1, y: 2, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 1, y: 3, is_infinite: false };\n let doubling = a1.double();\n assert(doubling.x == 1);\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint {\n x: pub_x + 1,\n y: pub_y,\n is_infinite: false,\n };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint {\n x: pub_x + 1,\n y: pub_y + 1,\n is_infinite: false,\n };\n let doubling = a1.double();\n assert(doubling.x == 1);\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint {\n x: pub_x,\n y: pub_y + 1 as Field,\n is_infinite: false,\n };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 4, is_infinite: false };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 3, is_infinite: false };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 1, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 1, y: 3, is_infinite: false };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: pub_x, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: pub_x, y: 2, is_infinite: false };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n }\n}\n", - "path": "" - } - }, + "debug_symbols": "XY5BCsQwCEXv4rqLWfcqw1BsaosgJtikMITefWyYQOlK/3/6tcJCc9km1jXuML4rzMYivE0SA2aO6m49B+hyykbkFty4byU00gyjFpEBDpTShvaE2mpGc/oagHTx6oErC13d+XGBge158UBjnIX+ci0abjR/Uyf942Qx0FKMrqTGPPsH", + "file_map": {}, "names": [ "main" ], - "brillig_names": [ - "directive_invert" - ] + "brillig_names": [] } diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__force_brillig_false_inliner_0.snap index a134c1bd4f7..e6c38a50a96 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__force_brillig_false_inliner_0.snap @@ -34,79 +34,15 @@ expression: artifact }, "bytecode": [ "func 0", - "current witness index : _63", + "current witness index : _2", "private parameters indices : [_0]", "public parameters indices : [_1, _2]", - "return value indices : []", - "BLACKBOX::MULTI_SCALAR_MUL [(1, 254), (17631683881184975370165255887551781615748388533673675138860, 254), (0, 1), (_0, 254), (0, 254)] [_3, _4, _5]", - "EXPR [ (-1, _1) (1, _3) 0 ]", - "EXPR [ (-1, _2) (1, _4) 0 ]", - "EXPR [ (-1, _6) 0 ]", - "BLACKBOX::EMBEDDED_CURVE_ADD [(_1, 254), (_2, 254), (_6, 1), (_1, 254), (_2, 254), (_6, 1)] [_7, _8, _9]", - "EXPR [ (-1, _7) 3078034153852398078128400807926804309327113743808504829582559963737223069694 ]", - "BLACKBOX::MULTI_SCALAR_MUL [(1, 254), (17631683881184975370165255887551781615748388533673675138860, 254), (0, 1), (1, 254), (17631683881184975370165255887551781615748388533673675138860, 254), (0, 1), (_0, 254), (0, 254), (_0, 254), (0, 254)] [_10, _11, _12]", - "EXPR [ (-1, _10) 3078034153852398078128400807926804309327113743808504829582559963737223069694 ]", - "BLACKBOX::MULTI_SCALAR_MUL [(1, 254), (17631683881184975370165255887551781615748388533673675138860, 254), (0, 1), (_1, 254), (_2, 254), (0, 1), (11179562631109628533987091031692370366552561688588090155835439555627259799605, 254), (3443719903172018228650470536370404288991794296383447657609081676265727805364, 254), (0, 1), (_0, 254), (0, 254), (_0, 254), (0, 254), (1, 254), (0, 254)] [_13, _14, _15]", - "EXPR [ (1, _13) 7349266043899242844836273743257843180744506495159104166319746739537754653274 ]", - "BLACKBOX::MULTI_SCALAR_MUL [(1, 254), (17631683881184975370165255887551781615748388533673675138860, 254), (0, 1), (_0, 254), (0, 254)] [_16, _17, _18]", - "EXPR [ (1, _18) 0 ]", - "EXPR [ (1, _16) -1 ]", - "EXPR [ (1, _17) -17631683881184975370165255887551781615748388533673675138860 ]", - "EXPR [ (1, _1) (-1, _2) (-1, _19) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(19))], q_c: 0 })], outputs: [Simple(Witness(20))]", - "EXPR [ (1, _19, _20) (1, _21) -1 ]", - "EXPR [ (1, _19, _21) 0 ]", - "EXPR [ (-17631683881184975370165255887551781615748388533673675138858, _21) (-1, _22) 17631683881184975370165255887551781615748388533673675138860 ]", - "EXPR [ (-1, _23) 1 ]", - "BLACKBOX::EMBEDDED_CURVE_ADD [(_23, 254), (_22, 254), (_6, 1), (_23, 254), (_22, 254), (_6, 1)] [_24, _25, _26]", - "EXPR [ (1, _21, _24) (-1, _21) 0 ]", - "EXPR [ (-3078034153852398078128400807926804309327113743808504829582559963737223069693, _21) (-1, _27) 3078034153852398078128400807926804309327113743808504829582559963737223069694 ]", - "EXPR [ (9191351987198133172789796342745422989482268917117950487758512501574271532888, _21) (-1, _28) -9191351987198133172789796342745422989482268917117950487758512501574271532885 ]", - "BLACKBOX::EMBEDDED_CURVE_ADD [(_23, 254), (_22, 254), (_6, 1), (_27, 254), (_28, 254), (_6, 1)] [_29, _30, _31]", - "EXPR [ (1, _21, _29) (-1, _21) 0 ]", - "EXPR [ (1, _1, _21) (-1, _32) 1 ]", - "EXPR [ (1, _2, _21) (-17631683881184975370165255887551781615748388533673675138860, _21) (-1, _33) 17631683881184975370165255887551781615748388533673675138860 ]", - "BLACKBOX::EMBEDDED_CURVE_ADD [(_32, 254), (_33, 254), (_6, 1), (_32, 254), (_33, 254), (_6, 1)] [_34, _35, _36]", - "EXPR [ (1, _21, _34) (-1, _21) 0 ]", - "EXPR [ (1, _1, _21) (-3078034153852398078128400807926804309327113743808504829582559963737223069693, _21) (-1, _37) 3078034153852398078128400807926804309327113743808504829582559963737223069694 ]", - "EXPR [ (1, _2, _21) (9191351987198133172789796342745422989482268917117950487758512501574271532886, _21) (-1, _38) -9191351987198133172789796342745422989482268917117950487758512501574271532885 ]", - "BLACKBOX::EMBEDDED_CURVE_ADD [(_32, 254), (_33, 254), (_6, 1), (_37, 254), (_38, 254), (_6, 1)] [_39, _40, _41]", - "EXPR [ (1, _21, _39) (-1, _21) 0 ]", - "EXPR [ (1, _21) (-1, _42) 1 ]", - "EXPR [ (-17631683881184975370165255887551781615748388533673675138857, _21) (-1, _43) 17631683881184975370165255887551781615748388533673675138860 ]", - "EXPR [ (1, _1, _21) (-3078034153852398078128400807926804309327113743808504829582559963737223069694, _21) (-1, _44) 3078034153852398078128400807926804309327113743808504829582559963737223069694 ]", - "BLACKBOX::EMBEDDED_CURVE_ADD [(_42, 254), (_43, 254), (_6, 1), (_44, 254), (_38, 254), (_6, 1)] [_45, _46, _47]", - "EXPR [ (1, _21, _45) (-1, _21) 0 ]", - "EXPR [ (-3078034153852398078128400807926804309327113743808504829582559963737223069692, _21) (-1, _48) 3078034153852398078128400807926804309327113743808504829582559963737223069694 ]", - "EXPR [ (9191351987198133172789796342745422989482268917117950487758512501574271532889, _21) (-1, _49) -9191351987198133172789796342745422989482268917117950487758512501574271532885 ]", - "BLACKBOX::EMBEDDED_CURVE_ADD [(_42, 254), (_43, 254), (_6, 1), (_48, 254), (_49, 254), (_6, 1)] [_50, _51, _52]", - "EXPR [ (1, _21, _50) (-1, _21) 0 ]", - "BLACKBOX::EMBEDDED_CURVE_ADD [(_42, 254), (_43, 254), (_6, 1), (_42, 254), (_43, 254), (_6, 1)] [_53, _54, _55]", - "EXPR [ (1, _21, _53) (-1, _21) 0 ]", - "BLACKBOX::EMBEDDED_CURVE_ADD [(_23, 254), (_43, 254), (_6, 1), (_23, 254), (_43, 254), (_6, 1)] [_56, _57, _58]", - "EXPR [ (1, _21, _56) (-1, _21) 0 ]", - "EXPR [ (1, _1, _21) (-1, _21) (-1, _59) 1 ]", - "EXPR [ (9191351987198133172789796342745422989482268917117950487758512501574271532887, _21) (-1, _60) -9191351987198133172789796342745422989482268917117950487758512501574271532885 ]", - "BLACKBOX::EMBEDDED_CURVE_ADD [(_59, 254), (_43, 254), (_6, 1), (_44, 254), (_60, 254), (_6, 1)] [_61, _62, _63]", - "EXPR [ (1, _21, _61) (-1, _21) 0 ]", - "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) } }]" + "return value indices : []" ], - "debug_symbols": "tVjLbuowEP0Xr7PwvPzor1xdVZSmFVIEKIUrXVX9946LndCFUWuS1QGSOcwce04yfjfP/dP59XG3fzm8mYc/7+Zp3A3D7vVxOGw3p91hr7++f3SmfH08jX2vP5mr6xp13Iz9/mQe9udh6My/zXD+uuntuNl/4Wkz6lXbmX7/rKiEL7uhT58+ujna1kMxSA7G4KZw+XE8ecjxjKEWj/V4lsiFwPFcALg2Bqox3KiBeapBpEEDdrHEB2qId7GsgQeoxfsb8VjydwK1+kM93qNgSQAjNTAEsiWFQIw1BrghAgBanzn0s/ASJL5hN3hxRQzfsprBFSki2Vo88N0t8XOKlp4Ay1SEtM426ADkJwahqpIQ7lcirKqEcNkQ4DC2KBF8yQFi5KpLLmCTq/ok2qm50CI3KIHan4UBqImBpFSB5Kq7Cu+1S7zldnbyy2Bj1WMwLuB2eL/rEiyQx29IWlwXKeC0rlea/mJncPKBCwNL9TlKsoQasrIa7OZafGhRw/PUaZ5bXAsDTN0esPpuyPbOTmO4u9MYF1jTm3n8rNOYl8iDV95bga9e+W3TzghFDYxQdXEOS6gRVlYj0lwLQ8sEhFjecwil2ieyxB79DUmLGoR+rqVpliGOZRgiIayq4ZZQw62shvBci7R4KHlfeo2Crfq4W2IucivPRfqAnmuhpjnZSnkmsa3vLreEi7qVXZTBTrUAtLgoE5VeY3JV33BLuKhb2UVZd8RUS/y+sn/122a7G7+dfBmru6gzoLd0BjXBzlD6+87wBSQNkJ1xaf7qjFfQHEMaoDoT0/SgwTa9KyoqS9qagBkpo1KhEoNkdBl9xpBcTjFeEG1GSDamqHyk9yFl5IySOkDRpaFK0WcMGZWPNVtSvmQgBBkxo/KJ5k/KJ5o/SUaX0WdUPlE+Uj5RPrYZIaPyifKx8qUzB1Y+p3Es6X1LUflcus+nIybFkDFeUGw6cPpIqzruNk9Dn48kX8777dUJ5en/sVwpZ5jH8bDtn89jn9b065qu8ic=", - "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", - "path": "std/embedded_curve_ops.nr" - }, - "50": { - "source": "use std::{embedded_curve_ops::embedded_curve_add_unsafe, ops::Add};\n\nfn main(priv_key: Field, pub_x: pub Field, pub_y: pub Field) {\n let g1 = std::embedded_curve_ops::EmbeddedCurvePoint::generator();\n let scalar = std::embedded_curve_ops::EmbeddedCurveScalar { lo: priv_key, hi: 0 };\n // Test that multi_scalar_mul correctly derives the public key\n let res = std::embedded_curve_ops::multi_scalar_mul([g1], [scalar]);\n assert(res.x == pub_x);\n assert(res.y == pub_y);\n\n // Test that double function calling embedded_curve_add works as expected\n let pub_point =\n std::embedded_curve_ops::EmbeddedCurvePoint { x: pub_x, y: pub_y, is_infinite: false };\n let res = pub_point.double();\n let double = g1.add(g1);\n\n assert(double.x == res.x);\n\n // Test calling multi_scalar_mul with multiple points and scalars\n let res = std::embedded_curve_ops::multi_scalar_mul([g1, g1], [scalar, scalar]);\n\n // The results should be double the g1 point because the scalars are 1 and we pass in g1 twice\n assert(double.x == res.x);\n\n // Tests for #6549\n let const_scalar1 = std::embedded_curve_ops::EmbeddedCurveScalar { lo: 23, hi: 0 };\n let const_scalar2 = std::embedded_curve_ops::EmbeddedCurveScalar { lo: 0, hi: 23 };\n let const_scalar3 = std::embedded_curve_ops::EmbeddedCurveScalar { lo: 13, hi: 4 };\n let partial_mul = std::embedded_curve_ops::multi_scalar_mul(\n [g1, double, pub_point, g1, g1],\n [scalar, const_scalar1, scalar, const_scalar2, const_scalar3],\n );\n assert(partial_mul.x == 0x2024c4eebfbc8a20018f8c95c7aab77c6f34f10cf785a6f04e97452d8708fda7);\n // Check simplification by zero\n let zero_point = std::embedded_curve_ops::EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true };\n let const_zero = std::embedded_curve_ops::EmbeddedCurveScalar { lo: 0, hi: 0 };\n let partial_mul = std::embedded_curve_ops::multi_scalar_mul(\n [zero_point, double, g1],\n [scalar, const_zero, scalar],\n );\n assert(partial_mul == g1);\n\n // Additional tests for validating embedded_curve_add_unsafe under a conditional\n if pub_x == pub_y {\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 1, y: 2, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 1, y: 3, is_infinite: false };\n let doubling = a1.double();\n assert(doubling.x == 1);\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint {\n x: pub_x + 1,\n y: pub_y,\n is_infinite: false,\n };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint {\n x: pub_x + 1,\n y: pub_y + 1,\n is_infinite: false,\n };\n let doubling = a1.double();\n assert(doubling.x == 1);\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint {\n x: pub_x,\n y: pub_y + 1 as Field,\n is_infinite: false,\n };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 4, is_infinite: false };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 3, is_infinite: false };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 1, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 1, y: 3, is_infinite: false };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: pub_x, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: pub_x, y: 2, is_infinite: false };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n }\n}\n", - "path": "" - } - }, + "debug_symbols": "XY5BCsQwCEXv4rqLWfcqw1BsaosgJtikMITefWyYQOlK/3/6tcJCc9km1jXuML4rzMYivE0SA2aO6m49B+hyykbkFty4byU00gyjFpEBDpTShvaE2mpGc/oagHTx6oErC13d+XGBge158UBjnIX+ci0abjR/Uyf942Qx0FKMrqTGPPsH", + "file_map": {}, "names": [ "main" ], - "brillig_names": [ - "directive_invert" - ] + "brillig_names": [] } diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__force_brillig_false_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__force_brillig_false_inliner_9223372036854775807.snap index a134c1bd4f7..e6c38a50a96 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__force_brillig_false_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__force_brillig_false_inliner_9223372036854775807.snap @@ -34,79 +34,15 @@ expression: artifact }, "bytecode": [ "func 0", - "current witness index : _63", + "current witness index : _2", "private parameters indices : [_0]", "public parameters indices : [_1, _2]", - "return value indices : []", - "BLACKBOX::MULTI_SCALAR_MUL [(1, 254), (17631683881184975370165255887551781615748388533673675138860, 254), (0, 1), (_0, 254), (0, 254)] [_3, _4, _5]", - "EXPR [ (-1, _1) (1, _3) 0 ]", - "EXPR [ (-1, _2) (1, _4) 0 ]", - "EXPR [ (-1, _6) 0 ]", - "BLACKBOX::EMBEDDED_CURVE_ADD [(_1, 254), (_2, 254), (_6, 1), (_1, 254), (_2, 254), (_6, 1)] [_7, _8, _9]", - "EXPR [ (-1, _7) 3078034153852398078128400807926804309327113743808504829582559963737223069694 ]", - "BLACKBOX::MULTI_SCALAR_MUL [(1, 254), (17631683881184975370165255887551781615748388533673675138860, 254), (0, 1), (1, 254), (17631683881184975370165255887551781615748388533673675138860, 254), (0, 1), (_0, 254), (0, 254), (_0, 254), (0, 254)] [_10, _11, _12]", - "EXPR [ (-1, _10) 3078034153852398078128400807926804309327113743808504829582559963737223069694 ]", - "BLACKBOX::MULTI_SCALAR_MUL [(1, 254), (17631683881184975370165255887551781615748388533673675138860, 254), (0, 1), (_1, 254), (_2, 254), (0, 1), (11179562631109628533987091031692370366552561688588090155835439555627259799605, 254), (3443719903172018228650470536370404288991794296383447657609081676265727805364, 254), (0, 1), (_0, 254), (0, 254), (_0, 254), (0, 254), (1, 254), (0, 254)] [_13, _14, _15]", - "EXPR [ (1, _13) 7349266043899242844836273743257843180744506495159104166319746739537754653274 ]", - "BLACKBOX::MULTI_SCALAR_MUL [(1, 254), (17631683881184975370165255887551781615748388533673675138860, 254), (0, 1), (_0, 254), (0, 254)] [_16, _17, _18]", - "EXPR [ (1, _18) 0 ]", - "EXPR [ (1, _16) -1 ]", - "EXPR [ (1, _17) -17631683881184975370165255887551781615748388533673675138860 ]", - "EXPR [ (1, _1) (-1, _2) (-1, _19) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(19))], q_c: 0 })], outputs: [Simple(Witness(20))]", - "EXPR [ (1, _19, _20) (1, _21) -1 ]", - "EXPR [ (1, _19, _21) 0 ]", - "EXPR [ (-17631683881184975370165255887551781615748388533673675138858, _21) (-1, _22) 17631683881184975370165255887551781615748388533673675138860 ]", - "EXPR [ (-1, _23) 1 ]", - "BLACKBOX::EMBEDDED_CURVE_ADD [(_23, 254), (_22, 254), (_6, 1), (_23, 254), (_22, 254), (_6, 1)] [_24, _25, _26]", - "EXPR [ (1, _21, _24) (-1, _21) 0 ]", - "EXPR [ (-3078034153852398078128400807926804309327113743808504829582559963737223069693, _21) (-1, _27) 3078034153852398078128400807926804309327113743808504829582559963737223069694 ]", - "EXPR [ (9191351987198133172789796342745422989482268917117950487758512501574271532888, _21) (-1, _28) -9191351987198133172789796342745422989482268917117950487758512501574271532885 ]", - "BLACKBOX::EMBEDDED_CURVE_ADD [(_23, 254), (_22, 254), (_6, 1), (_27, 254), (_28, 254), (_6, 1)] [_29, _30, _31]", - "EXPR [ (1, _21, _29) (-1, _21) 0 ]", - "EXPR [ (1, _1, _21) (-1, _32) 1 ]", - "EXPR [ (1, _2, _21) (-17631683881184975370165255887551781615748388533673675138860, _21) (-1, _33) 17631683881184975370165255887551781615748388533673675138860 ]", - "BLACKBOX::EMBEDDED_CURVE_ADD [(_32, 254), (_33, 254), (_6, 1), (_32, 254), (_33, 254), (_6, 1)] [_34, _35, _36]", - "EXPR [ (1, _21, _34) (-1, _21) 0 ]", - "EXPR [ (1, _1, _21) (-3078034153852398078128400807926804309327113743808504829582559963737223069693, _21) (-1, _37) 3078034153852398078128400807926804309327113743808504829582559963737223069694 ]", - "EXPR [ (1, _2, _21) (9191351987198133172789796342745422989482268917117950487758512501574271532886, _21) (-1, _38) -9191351987198133172789796342745422989482268917117950487758512501574271532885 ]", - "BLACKBOX::EMBEDDED_CURVE_ADD [(_32, 254), (_33, 254), (_6, 1), (_37, 254), (_38, 254), (_6, 1)] [_39, _40, _41]", - "EXPR [ (1, _21, _39) (-1, _21) 0 ]", - "EXPR [ (1, _21) (-1, _42) 1 ]", - "EXPR [ (-17631683881184975370165255887551781615748388533673675138857, _21) (-1, _43) 17631683881184975370165255887551781615748388533673675138860 ]", - "EXPR [ (1, _1, _21) (-3078034153852398078128400807926804309327113743808504829582559963737223069694, _21) (-1, _44) 3078034153852398078128400807926804309327113743808504829582559963737223069694 ]", - "BLACKBOX::EMBEDDED_CURVE_ADD [(_42, 254), (_43, 254), (_6, 1), (_44, 254), (_38, 254), (_6, 1)] [_45, _46, _47]", - "EXPR [ (1, _21, _45) (-1, _21) 0 ]", - "EXPR [ (-3078034153852398078128400807926804309327113743808504829582559963737223069692, _21) (-1, _48) 3078034153852398078128400807926804309327113743808504829582559963737223069694 ]", - "EXPR [ (9191351987198133172789796342745422989482268917117950487758512501574271532889, _21) (-1, _49) -9191351987198133172789796342745422989482268917117950487758512501574271532885 ]", - "BLACKBOX::EMBEDDED_CURVE_ADD [(_42, 254), (_43, 254), (_6, 1), (_48, 254), (_49, 254), (_6, 1)] [_50, _51, _52]", - "EXPR [ (1, _21, _50) (-1, _21) 0 ]", - "BLACKBOX::EMBEDDED_CURVE_ADD [(_42, 254), (_43, 254), (_6, 1), (_42, 254), (_43, 254), (_6, 1)] [_53, _54, _55]", - "EXPR [ (1, _21, _53) (-1, _21) 0 ]", - "BLACKBOX::EMBEDDED_CURVE_ADD [(_23, 254), (_43, 254), (_6, 1), (_23, 254), (_43, 254), (_6, 1)] [_56, _57, _58]", - "EXPR [ (1, _21, _56) (-1, _21) 0 ]", - "EXPR [ (1, _1, _21) (-1, _21) (-1, _59) 1 ]", - "EXPR [ (9191351987198133172789796342745422989482268917117950487758512501574271532887, _21) (-1, _60) -9191351987198133172789796342745422989482268917117950487758512501574271532885 ]", - "BLACKBOX::EMBEDDED_CURVE_ADD [(_59, 254), (_43, 254), (_6, 1), (_44, 254), (_60, 254), (_6, 1)] [_61, _62, _63]", - "EXPR [ (1, _21, _61) (-1, _21) 0 ]", - "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) } }]" + "return value indices : []" ], - "debug_symbols": "tVjLbuowEP0Xr7PwvPzor1xdVZSmFVIEKIUrXVX9946LndCFUWuS1QGSOcwce04yfjfP/dP59XG3fzm8mYc/7+Zp3A3D7vVxOGw3p91hr7++f3SmfH08jX2vP5mr6xp13Iz9/mQe9udh6My/zXD+uuntuNl/4Wkz6lXbmX7/rKiEL7uhT58+ujna1kMxSA7G4KZw+XE8ecjxjKEWj/V4lsiFwPFcALg2Bqox3KiBeapBpEEDdrHEB2qId7GsgQeoxfsb8VjydwK1+kM93qNgSQAjNTAEsiWFQIw1BrghAgBanzn0s/ASJL5hN3hxRQzfsprBFSki2Vo88N0t8XOKlp4Ay1SEtM426ADkJwahqpIQ7lcirKqEcNkQ4DC2KBF8yQFi5KpLLmCTq/ok2qm50CI3KIHan4UBqImBpFSB5Kq7Cu+1S7zldnbyy2Bj1WMwLuB2eL/rEiyQx29IWlwXKeC0rlea/mJncPKBCwNL9TlKsoQasrIa7OZafGhRw/PUaZ5bXAsDTN0esPpuyPbOTmO4u9MYF1jTm3n8rNOYl8iDV95bga9e+W3TzghFDYxQdXEOS6gRVlYj0lwLQ8sEhFjecwil2ieyxB79DUmLGoR+rqVpliGOZRgiIayq4ZZQw62shvBci7R4KHlfeo2Crfq4W2IucivPRfqAnmuhpjnZSnkmsa3vLreEi7qVXZTBTrUAtLgoE5VeY3JV33BLuKhb2UVZd8RUS/y+sn/122a7G7+dfBmru6gzoLd0BjXBzlD6+87wBSQNkJ1xaf7qjFfQHEMaoDoT0/SgwTa9KyoqS9qagBkpo1KhEoNkdBl9xpBcTjFeEG1GSDamqHyk9yFl5IySOkDRpaFK0WcMGZWPNVtSvmQgBBkxo/KJ5k/KJ5o/SUaX0WdUPlE+Uj5RPrYZIaPyifKx8qUzB1Y+p3Es6X1LUflcus+nIybFkDFeUGw6cPpIqzruNk9Dn48kX8777dUJ5en/sVwpZ5jH8bDtn89jn9b065qu8ic=", - "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", - "path": "std/embedded_curve_ops.nr" - }, - "50": { - "source": "use std::{embedded_curve_ops::embedded_curve_add_unsafe, ops::Add};\n\nfn main(priv_key: Field, pub_x: pub Field, pub_y: pub Field) {\n let g1 = std::embedded_curve_ops::EmbeddedCurvePoint::generator();\n let scalar = std::embedded_curve_ops::EmbeddedCurveScalar { lo: priv_key, hi: 0 };\n // Test that multi_scalar_mul correctly derives the public key\n let res = std::embedded_curve_ops::multi_scalar_mul([g1], [scalar]);\n assert(res.x == pub_x);\n assert(res.y == pub_y);\n\n // Test that double function calling embedded_curve_add works as expected\n let pub_point =\n std::embedded_curve_ops::EmbeddedCurvePoint { x: pub_x, y: pub_y, is_infinite: false };\n let res = pub_point.double();\n let double = g1.add(g1);\n\n assert(double.x == res.x);\n\n // Test calling multi_scalar_mul with multiple points and scalars\n let res = std::embedded_curve_ops::multi_scalar_mul([g1, g1], [scalar, scalar]);\n\n // The results should be double the g1 point because the scalars are 1 and we pass in g1 twice\n assert(double.x == res.x);\n\n // Tests for #6549\n let const_scalar1 = std::embedded_curve_ops::EmbeddedCurveScalar { lo: 23, hi: 0 };\n let const_scalar2 = std::embedded_curve_ops::EmbeddedCurveScalar { lo: 0, hi: 23 };\n let const_scalar3 = std::embedded_curve_ops::EmbeddedCurveScalar { lo: 13, hi: 4 };\n let partial_mul = std::embedded_curve_ops::multi_scalar_mul(\n [g1, double, pub_point, g1, g1],\n [scalar, const_scalar1, scalar, const_scalar2, const_scalar3],\n );\n assert(partial_mul.x == 0x2024c4eebfbc8a20018f8c95c7aab77c6f34f10cf785a6f04e97452d8708fda7);\n // Check simplification by zero\n let zero_point = std::embedded_curve_ops::EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true };\n let const_zero = std::embedded_curve_ops::EmbeddedCurveScalar { lo: 0, hi: 0 };\n let partial_mul = std::embedded_curve_ops::multi_scalar_mul(\n [zero_point, double, g1],\n [scalar, const_zero, scalar],\n );\n assert(partial_mul == g1);\n\n // Additional tests for validating embedded_curve_add_unsafe under a conditional\n if pub_x == pub_y {\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 1, y: 2, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 1, y: 3, is_infinite: false };\n let doubling = a1.double();\n assert(doubling.x == 1);\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint {\n x: pub_x + 1,\n y: pub_y,\n is_infinite: false,\n };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint {\n x: pub_x + 1,\n y: pub_y + 1,\n is_infinite: false,\n };\n let doubling = a1.double();\n assert(doubling.x == 1);\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint {\n x: pub_x,\n y: pub_y + 1 as Field,\n is_infinite: false,\n };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 4, is_infinite: false };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 3, is_infinite: false };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 1, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 1, y: 3, is_infinite: false };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: pub_x, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: pub_x, y: 2, is_infinite: false };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n }\n}\n", - "path": "" - } - }, + "debug_symbols": "XY5BCsQwCEXv4rqLWfcqw1BsaosgJtikMITefWyYQOlK/3/6tcJCc9km1jXuML4rzMYivE0SA2aO6m49B+hyykbkFty4byU00gyjFpEBDpTShvaE2mpGc/oagHTx6oErC13d+XGBge158UBjnIX+ci0abjR/Uyf942Qx0FKMrqTGPPsH", + "file_map": {}, "names": [ "main" ], - "brillig_names": [ - "directive_invert" - ] + "brillig_names": [] } diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 4e4ecc82ff4..c1154ee25c4 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -45,19 +45,10 @@ expression: artifact "return value indices : []", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(2))], q_c: 0 })], outputs: []", "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(4), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32838), size_address: Relative(4), offset_address: Relative(5) }, Mov { destination: Relative(1), source: Direct(32838) }, Mov { destination: Relative(2), source: Direct(32839) }, Mov { destination: Relative(3), source: Direct(32840) }, Call { location: 14 }, Call { location: 18 }, 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: Integer(U32), value: 1 }, Const { destination: Direct(32836), bit_size: Integer(U32), value: 2 }, Const { destination: Direct(32837), bit_size: Integer(U32), value: 3 }, Return, Call { location: 391 }, Const { destination: Relative(4), bit_size: Field, value: 1 }, Const { destination: Relative(5), bit_size: Field, value: 17631683881184975370165255887551781615748388533673675138860 }, Const { destination: Relative(6), bit_size: Integer(U1), value: 0 }, 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(4) }, 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(8), bit_size: Field, value: 0 }, Mov { destination: Relative(9), 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(9), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Mov { destination: Relative(11), source: Relative(10) }, 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: Relative(8) }, 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(7), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 2 }, 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(9), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32835) }, Load { destination: Relative(7), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32836) }, Load { destination: Relative(9), source_pointer: Relative(11) }, BinaryFieldOp { destination: Relative(10), op: Equals, lhs: Relative(7), rhs: Relative(2) }, JumpIf { condition: Relative(10), location: 61 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(11) } }, BinaryFieldOp { destination: Relative(7), op: Equals, lhs: Relative(9), rhs: Relative(3) }, JumpIf { condition: Relative(7), location: 65 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(10) } }, 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(6) }, 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(11) }, Call { location: 397 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(7), source: Relative(13) }, Mov { destination: Relative(9), source: Relative(14) }, Mov { destination: Relative(10), source: Relative(15) }, 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) }, Mov { destination: Relative(19), source: Relative(4) }, Mov { destination: Relative(20), source: Relative(5) }, Mov { destination: Relative(21), source: Relative(6) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(14) }, Call { location: 397 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(11), source: Relative(16) }, Mov { destination: Relative(12), source: Relative(17) }, Mov { destination: Relative(13), source: Relative(18) }, BinaryFieldOp { destination: Relative(14), op: Equals, lhs: Relative(11), rhs: Relative(7) }, JumpIf { condition: Relative(14), location: 97 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(15) } }, Mov { destination: Relative(7), 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(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(7), 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(6) }, 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(5) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(6) }, Mov { destination: Relative(14), source: Direct(1) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 5 }, 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(1) }, 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(1) }, 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(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(7), rhs: Direct(2) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(16), size: Relative(17) }, scalars: HeapVector { pointer: Relative(18), size: Relative(19) }, outputs: HeapArray { pointer: Relative(20), size: 3 } }), BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(32835) }, Load { destination: Relative(7), source_pointer: Relative(14) }, BinaryFieldOp { destination: Relative(14), op: Equals, lhs: Relative(11), rhs: Relative(7) }, JumpIf { condition: Relative(14), location: 143 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(15) } }, Const { destination: Relative(7), bit_size: Field, value: 23 }, Mov { destination: Relative(14), source: Direct(1) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 9 }, 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(1) }, 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(7) }, 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(1) }, 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(4) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(8) }, Const { destination: Relative(7), bit_size: Field, value: 10456889356757736161582760391335869408742580538510966583040563008531594628700 }, Const { destination: Relative(15), bit_size: Field, value: 4714263418031017792755226781102360879566029698463912436805212494059649164343 }, Mov { destination: Relative(16), source: Direct(1) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 13 }, 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(4) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(5) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(6) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, 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(12) }, 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: Relative(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(3) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(6) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(7) }, 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: Relative(6) }, Mov { destination: Relative(7), 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(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 12 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 8 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(11), size: Relative(12) }, scalars: HeapVector { pointer: Relative(13), size: Relative(15) }, outputs: HeapArray { pointer: Relative(17), size: 3 } }), BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32835) }, Load { destination: Relative(11), source_pointer: Relative(12) }, Const { destination: Relative(7), bit_size: Field, value: -7349266043899242844836273743257843180744506495159104166319746739537754653274 }, BinaryFieldOp { destination: Relative(12), op: Equals, lhs: Relative(11), rhs: Relative(7) }, JumpIf { condition: Relative(12), location: 213 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(13) } }, Mov { destination: Relative(7), 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(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(7), 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(8) }, Mov { destination: Relative(1), 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(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(11), source: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(4) }, 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(6) }, Mov { destination: Relative(8), 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(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(8), 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(7), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32835) }, Load { destination: Relative(1), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32836) }, Load { destination: Relative(7), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32837) }, Load { destination: Relative(11), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U1, lhs: Relative(11), rhs: Relative(6) }, JumpIf { condition: Relative(8), location: 253 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(12) } }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(1), rhs: Relative(4) }, JumpIf { condition: Relative(8), location: 257 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(11) } }, BinaryFieldOp { destination: Relative(1), op: Equals, lhs: Relative(7), rhs: Relative(5) }, JumpIf { condition: Relative(1), location: 261 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(8) } }, BinaryFieldOp { destination: Relative(1), op: Equals, lhs: Relative(2), rhs: Relative(3) }, JumpIf { condition: Relative(1), location: 264 }, Jump { location: 390 }, Const { destination: Relative(1), bit_size: Field, 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(4) }, Mov { destination: Relative(12), source: Relative(1) }, Mov { destination: Relative(13), source: Relative(6) }, Mov { destination: Relative(14), source: Relative(4) }, Mov { destination: Relative(15), source: Relative(1) }, Mov { destination: Relative(16), source: Relative(6) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 397 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(5), source: Relative(11) }, Mov { destination: Relative(7), source: Relative(12) }, Mov { destination: Relative(8), source: Relative(13) }, BinaryFieldOp { destination: Relative(9), op: Equals, lhs: Relative(5), rhs: Relative(4) }, JumpIf { condition: Relative(9), location: 283 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(10) } }, Const { destination: Relative(5), bit_size: Field, value: 3 }, Mov { destination: Relative(9), 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(9), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(4), input1_y: Relative(1), input1_infinite: Relative(6), input2_x: Relative(4), input2_y: Relative(5), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(10), size: 3 } }), BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32835) }, Load { destination: Relative(10), source_pointer: Relative(11) }, BinaryFieldOp { destination: Relative(9), op: Equals, lhs: Relative(10), rhs: Relative(4) }, JumpIf { condition: Relative(9), location: 296 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(11) } }, BinaryFieldOp { destination: Relative(9), op: Add, lhs: Relative(2), rhs: Relative(4) }, BinaryFieldOp { destination: Relative(10), op: Add, lhs: Relative(3), rhs: Relative(4) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 15 }, Mov { destination: Relative(15), source: Direct(0) }, Mov { destination: Relative(16), source: Relative(9) }, Mov { destination: Relative(17), source: Relative(3) }, Mov { destination: Relative(18), source: Relative(6) }, Mov { destination: Relative(19), source: Relative(9) }, Mov { destination: Relative(20), source: Relative(3) }, Mov { destination: Relative(21), source: Relative(6) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(14) }, Call { location: 397 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(11), source: Relative(16) }, Mov { destination: Relative(12), source: Relative(17) }, Mov { destination: Relative(13), source: Relative(18) }, BinaryFieldOp { destination: Relative(14), op: Equals, lhs: Relative(11), rhs: Relative(4) }, JumpIf { condition: Relative(14), location: 316 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(15) } }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 4 }, 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) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(9), input1_y: Relative(3), input1_infinite: Relative(6), input2_x: Relative(9), input2_y: Relative(10), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(14), size: 3 } }), BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32835) }, Load { destination: Relative(3), source_pointer: Relative(9) }, BinaryFieldOp { destination: Relative(9), op: Equals, lhs: Relative(3), rhs: Relative(4) }, JumpIf { condition: Relative(9), location: 328 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(11) } }, Mov { destination: Relative(3), 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(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(1), input1_y: Relative(5), input1_infinite: Relative(6), input2_x: Relative(2), input2_y: Relative(10), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(9), size: 3 } }), BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32835) }, Load { destination: Relative(9), source_pointer: Relative(10) }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(9), rhs: Relative(4) }, JumpIf { condition: Relative(3), location: 340 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(10) } }, Const { destination: Relative(3), bit_size: Field, value: 4 }, Mov { destination: Relative(9), 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(9), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(1), input1_y: Relative(5), input1_infinite: Relative(6), input2_x: Relative(1), input2_y: Relative(3), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(10), size: 3 } }), BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32835) }, Load { destination: Relative(3), source_pointer: Relative(10) }, BinaryFieldOp { destination: Relative(9), op: Equals, lhs: Relative(3), rhs: Relative(4) }, JumpIf { condition: Relative(9), location: 353 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(10) } }, Mov { destination: Relative(3), 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(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(1), input1_y: Relative(5), input1_infinite: Relative(6), input2_x: Relative(1), input2_y: Relative(5), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(9), size: 3 } }), BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32835) }, Load { destination: Relative(9), source_pointer: Relative(10) }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(9), rhs: Relative(4) }, JumpIf { condition: Relative(3), location: 365 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(10) } }, Mov { destination: Relative(3), 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(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(4), input1_y: Relative(5), input1_infinite: Relative(6), input2_x: Relative(4), input2_y: Relative(5), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(9), size: 3 } }), BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32835) }, Load { destination: Relative(9), source_pointer: Relative(10) }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(9), rhs: Relative(4) }, JumpIf { condition: Relative(3), location: 377 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(10) } }, Mov { destination: Relative(3), 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(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(2), input1_y: Relative(5), input1_infinite: Relative(6), input2_x: Relative(2), input2_y: Relative(1), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(9), size: 3 } }), BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32835) }, Load { destination: Relative(1), source_pointer: Relative(2) }, BinaryFieldOp { destination: Relative(2), op: Equals, lhs: Relative(1), rhs: Relative(4) }, JumpIf { condition: Relative(2), location: 389 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(3) } }, Jump { location: 390 }, 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: 396 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 391 }, JumpIf { condition: Relative(3), location: 426 }, Jump { location: 400 }, JumpIf { condition: Relative(6), location: 418 }, Jump { location: 402 }, Mov { destination: Relative(13), source: Direct(1) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 4 }, 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) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(1), input1_y: Relative(2), input1_infinite: Relative(3), input2_x: Relative(4), input2_y: Relative(5), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(14), size: 3 } }), BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(32835) }, Load { destination: Relative(1), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(32836) }, Load { destination: Relative(2), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(32837) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Mov { destination: Relative(10), source: Relative(1) }, Mov { destination: Relative(11), source: Relative(2) }, Mov { destination: Relative(12), source: Relative(3) }, Jump { location: 422 }, Mov { destination: Relative(10), source: Relative(1) }, Mov { destination: Relative(11), source: Relative(2) }, Mov { destination: Relative(12), source: Relative(3) }, Jump { location: 422 }, Mov { destination: Relative(7), source: Relative(10) }, Mov { destination: Relative(8), source: Relative(11) }, Mov { destination: Relative(9), source: Relative(12) }, Jump { location: 430 }, Mov { destination: Relative(7), source: Relative(4) }, Mov { destination: Relative(8), source: Relative(5) }, Mov { destination: Relative(9), source: Relative(6) }, Jump { location: 430 }, Mov { destination: Relative(1), source: Relative(7) }, Mov { destination: Relative(2), source: Relative(8) }, Mov { destination: Relative(3), source: Relative(9) }, Return]" + "[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: 15 }, 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) } }, Return, Call { location: 16 }, 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: 21 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "tZndTls7EEbfJddcbHv821epqiqFUEWKAkrhSEeIdz8ze7wSzsVGZUNu+BalXmw7HsdDXjZ3u1/Pv3/uj/cPfzbfvr9sfp32h8P+98/Dw+32af9w1H992Uz2JfTNt3CziZNH8Ige4pE8skfxqB7Nwy3iFnGLuEXcIm4Rt4hbxC3iFnFLcktyS3JLUotoJI/sUTyqR/Poc+TJI3hED7UkjeSRPYqHWrJG8+hzlMlDLUUjeohH8lBL0yge1aN59Dnq5BE8ood4JA+3VLdUt1S3VFuX6WbTppFhZBwpI9PIPLKMrCPbyOHrw9eHrw9fN5+ueU8j88gyso5sI7tnmCYgABEQIAEZKEAFGoA5YA6YA+aAOWAOmAPmgDlgDpgj5og5Yo6YI+aIOWKe60AMGtAHzNUwQwAiIEACMlAAMyeDBphZd2OYK2SGAETAzNUgARkoQAUa0AdY1TgEIAKYM+aMOWPOmDPmjLlgLpgL5oK5YC6YC+aCuWAumCvmirlirpgr5oq5Yq6YK+aKuWFumBvmhrlhbpgb5oa5YW6YO+aOuWPumDvmjrlj7pg75j7McZqAAERAgARkwMzNoAJm7gZ9wFyDMwQgAmqO8/tHAjJQgAo0oA+wGnQIQAQwR8wRc8QcMUfMEbNgFsyCWTALZsEsmAWzYBbMCXPCnDBbDcZokIAMFKACDTCz2PvsBAQgAgIkIAMFqEADMBfMVoMxGZinGGSgABVoQB9gFecQgAgIgLlirpgr5orZKi7aPrSKcwhABMxsm80qziEDBahAA/oAqziZDAJgd4L58iJAAjJgNwx7dazixJbOKk6yQXcQqziHAERAgARkoAAVaADmgDlgtoqTYiBAAjJg5mZQgQb0AVZxDgEwczcQwG5Jk0EGClABNado0AdYxTkEIAICmFkMMmDmZFCBBvQBVnHJJmgV5xABARKQgQKYuRo0wMw2d6s4hwBEQM3ZZmoV55CBAlSgAXZ7nK+5E6DmbHO3dz0HARJgZpup1aBDBRrQB1gNOpjZ9obVoIOZbcpWgw4ZKICZbYJWgw59gNWgQwAiYGbbG1aDDmouNmWrQYcKNIdk5VCigQAJyEABKmDD7T5v5TCDlYNDACJgZnl9vdnQ4vx8Ou121uG86Xm0E3rcnnbHp8234/PhcLP5Z3t4nv/Tn8ftcc6n7Ul/qk+9O95pqvB+f9gZvd5cRk/LQ/VUGoP1WDoPz389Xl/PMT7FtjQ+Lo9PuScEJV0mEMo6gywZ3plDSuc55LxiDVLpjG+yYnzpvAY1hKXx9Z3xkecvOayYf7W3DP/9svga9uXxesGvQ6AX+rbmCazI/QnqmhVshRXoMi2ND5/fhuGq+1CbTWEdpzKtWAftws6GLIsrGcrnV6JcdSVyYkNo39XXrESrPIM2G2nxZJo+fzRN11wJbZCoLe2M0oqV0LaH9wdtfFYZJDML7TUWd1XM1zuitKOJ50fodc0kkvWJbkh58ZiN7Z09pSt5Puj0jytpcUt8QFLXrEYql7nUtmY1cjlvilzWFJh2TGdDTasMLZy3douLlw9JV9xWLb25/kyrJtF4BG3VFqtL6hdsq49IVm2rLpe5pLDmNhgj7z/ahi2+pHbf+vRqfESyZjW0a7zMZdW9Tjs2LobamMXF1chfsRr5yquR02UueU25aw9HrWnPtnhopf4Vq9GvvBotXuYiq3qGKXN8auu4uLuyfMFqfESyZjW00z3PRT/6WLMaItRa0j8nLK7GV5yi+cqnqHZAl7n0Vf3gdK61MvXFi2f5ilO0rD5Ff+h329v96X+f0r6a7bTf/jrsxrf3z8fbNz99+veRn/Ap7+Pp4XZ393zamenNR7369bv0cCO9/Hi13/cf", - "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", - "path": "std/embedded_curve_ops.nr" - }, - "50": { - "source": "use std::{embedded_curve_ops::embedded_curve_add_unsafe, ops::Add};\n\nfn main(priv_key: Field, pub_x: pub Field, pub_y: pub Field) {\n let g1 = std::embedded_curve_ops::EmbeddedCurvePoint::generator();\n let scalar = std::embedded_curve_ops::EmbeddedCurveScalar { lo: priv_key, hi: 0 };\n // Test that multi_scalar_mul correctly derives the public key\n let res = std::embedded_curve_ops::multi_scalar_mul([g1], [scalar]);\n assert(res.x == pub_x);\n assert(res.y == pub_y);\n\n // Test that double function calling embedded_curve_add works as expected\n let pub_point =\n std::embedded_curve_ops::EmbeddedCurvePoint { x: pub_x, y: pub_y, is_infinite: false };\n let res = pub_point.double();\n let double = g1.add(g1);\n\n assert(double.x == res.x);\n\n // Test calling multi_scalar_mul with multiple points and scalars\n let res = std::embedded_curve_ops::multi_scalar_mul([g1, g1], [scalar, scalar]);\n\n // The results should be double the g1 point because the scalars are 1 and we pass in g1 twice\n assert(double.x == res.x);\n\n // Tests for #6549\n let const_scalar1 = std::embedded_curve_ops::EmbeddedCurveScalar { lo: 23, hi: 0 };\n let const_scalar2 = std::embedded_curve_ops::EmbeddedCurveScalar { lo: 0, hi: 23 };\n let const_scalar3 = std::embedded_curve_ops::EmbeddedCurveScalar { lo: 13, hi: 4 };\n let partial_mul = std::embedded_curve_ops::multi_scalar_mul(\n [g1, double, pub_point, g1, g1],\n [scalar, const_scalar1, scalar, const_scalar2, const_scalar3],\n );\n assert(partial_mul.x == 0x2024c4eebfbc8a20018f8c95c7aab77c6f34f10cf785a6f04e97452d8708fda7);\n // Check simplification by zero\n let zero_point = std::embedded_curve_ops::EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true };\n let const_zero = std::embedded_curve_ops::EmbeddedCurveScalar { lo: 0, hi: 0 };\n let partial_mul = std::embedded_curve_ops::multi_scalar_mul(\n [zero_point, double, g1],\n [scalar, const_zero, scalar],\n );\n assert(partial_mul == g1);\n\n // Additional tests for validating embedded_curve_add_unsafe under a conditional\n if pub_x == pub_y {\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 1, y: 2, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 1, y: 3, is_infinite: false };\n let doubling = a1.double();\n assert(doubling.x == 1);\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint {\n x: pub_x + 1,\n y: pub_y,\n is_infinite: false,\n };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint {\n x: pub_x + 1,\n y: pub_y + 1,\n is_infinite: false,\n };\n let doubling = a1.double();\n assert(doubling.x == 1);\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint {\n x: pub_x,\n y: pub_y + 1 as Field,\n is_infinite: false,\n };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 4, is_infinite: false };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 3, is_infinite: false };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 1, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 1, y: 3, is_infinite: false };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: pub_x, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: pub_x, y: 2, is_infinite: false };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n }\n}\n", - "path": "" - } - }, + "debug_symbols": "XY7BCoRACIbfxfMcag976FUiwiaLAXEGmwmW6N3XiQ1iL+rvp/4eMNNU1jHIEjfo+gMmDcxhHTl6zCGKdY/TwS3HrETWgge3rYRKkqGTwuxgRy7X0JZQrpxRjTYOSGbLdnAJTLU6BxPog/477qgBJ6afXIr4B82fdJP746TR01yU6qXKoKmhtdi3b/dqh7O6fQE=", + "file_map": {}, "names": [ "main" ], diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__force_brillig_true_inliner_0.snap index 3ebd817e856..c1154ee25c4 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__force_brillig_true_inliner_0.snap @@ -45,19 +45,10 @@ expression: artifact "return value indices : []", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(2))], q_c: 0 })], outputs: []", "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: 15 }, 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) } }, Return, Call { location: 349 }, Const { destination: Relative(4), bit_size: Field, value: 1 }, Const { destination: Relative(5), bit_size: Field, value: 17631683881184975370165255887551781615748388533673675138860 }, Const { destination: Relative(6), bit_size: Integer(U1), value: 0 }, 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(4) }, 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(8), bit_size: Field, value: 0 }, Mov { destination: Relative(9), 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(9), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Mov { destination: Relative(11), source: Relative(10) }, 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: Relative(8) }, 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(7), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 2 }, 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 } }), Const { destination: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(7) }, Load { destination: Relative(9), source_pointer: Relative(11) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(11) }, Load { destination: Relative(12), source_pointer: Relative(13) }, BinaryFieldOp { destination: Relative(10), op: Equals, lhs: Relative(9), rhs: Relative(2) }, JumpIf { condition: Relative(10), location: 60 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(13) } }, BinaryFieldOp { destination: Relative(9), op: Equals, lhs: Relative(12), rhs: Relative(3) }, JumpIf { condition: Relative(9), location: 64 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(10) } }, Mov { destination: Relative(9), 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(9), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(2), input1_y: Relative(3), input1_infinite: Relative(6), input2_x: Relative(2), input2_y: Relative(3), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(10), size: 3 } }), BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(7) }, Load { destination: Relative(10), source_pointer: Relative(12) }, Const { destination: Relative(9), bit_size: Field, value: 3078034153852398078128400807926804309327113743808504829582559963737223069694 }, BinaryFieldOp { destination: Relative(12), op: Equals, lhs: Relative(9), rhs: Relative(10) }, JumpIf { condition: Relative(12), location: 77 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(13) } }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Relative(13), source: Relative(12) }, 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(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(4) }, 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) }, Mov { destination: Relative(12), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 5 }, 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(1) }, 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(1) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(8) }, Mov { destination: Relative(13), source: Direct(1) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 4 }, 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(10), rhs: Direct(2) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(14), size: Relative(15) }, scalars: HeapVector { pointer: Relative(16), size: Relative(17) }, outputs: HeapArray { pointer: Relative(18), size: 3 } }), BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(7) }, Load { destination: Relative(10), source_pointer: Relative(12) }, BinaryFieldOp { destination: Relative(12), op: Equals, lhs: Relative(9), rhs: Relative(10) }, JumpIf { condition: Relative(12), location: 123 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(13) } }, Mov { destination: Relative(9), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(9), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Mov { destination: Relative(12), source: Relative(10) }, 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(8) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, 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(8) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(4) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(8) }, Const { destination: Relative(10), bit_size: Field, value: 11179562631109628533987091031692370366552561688588090155835439555627259799605 }, Const { destination: Relative(12), bit_size: Field, value: 3443719903172018228650470536370404288991794296383447657609081676265727805364 }, Mov { destination: Relative(13), 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(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(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(6) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(3) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(6) }, 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(12) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(6) }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(12), size: Relative(14) }, scalars: HeapVector { pointer: Relative(15), size: Relative(16) }, outputs: HeapArray { pointer: Relative(17), size: 3 } }), BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(7) }, Load { destination: Relative(9), source_pointer: Relative(12) }, Const { destination: Relative(10), bit_size: Field, value: -7349266043899242844836273743257843180744506495159104166319746739537754653274 }, BinaryFieldOp { destination: Relative(12), op: Equals, lhs: Relative(9), rhs: Relative(10) }, JumpIf { condition: Relative(12), location: 182 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(13) } }, Mov { destination: Relative(9), 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(9), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Mov { destination: Relative(12), source: Relative(10) }, 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(8) }, Mov { destination: Relative(1), 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(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(10), source: Relative(8) }, 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(5) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(6) }, Mov { destination: Relative(8), 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(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(10), size: Relative(12) }, scalars: HeapVector { pointer: Relative(13), size: Relative(14) }, outputs: HeapArray { pointer: Relative(15), size: 3 } }), BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Load { destination: Relative(1), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(11) }, Load { destination: Relative(9), source_pointer: Relative(10) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(10) }, Load { destination: Relative(11), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U1, lhs: Relative(11), rhs: Relative(6) }, JumpIf { condition: Relative(8), location: 223 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(10) } }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(1), rhs: Relative(4) }, JumpIf { condition: Relative(8), location: 227 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(10) } }, BinaryFieldOp { destination: Relative(1), op: Equals, lhs: Relative(9), rhs: Relative(5) }, JumpIf { condition: Relative(1), location: 231 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(8) } }, BinaryFieldOp { destination: Relative(1), op: Equals, lhs: Relative(2), rhs: Relative(3) }, JumpIf { condition: Relative(1), location: 234 }, Jump { location: 348 }, Const { destination: Relative(1), bit_size: Field, value: 2 }, 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) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(4), input1_y: Relative(1), input1_infinite: Relative(6), input2_x: Relative(4), input2_y: Relative(1), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(8), size: 3 } }), BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Load { destination: Relative(8), source_pointer: Relative(9) }, BinaryFieldOp { destination: Relative(5), op: Equals, lhs: Relative(8), rhs: Relative(4) }, JumpIf { condition: Relative(5), location: 247 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(9) } }, Const { destination: Relative(5), bit_size: Field, value: 3 }, 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) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(4), input1_y: Relative(1), input1_infinite: Relative(6), input2_x: Relative(4), input2_y: Relative(5), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(9), size: 3 } }), BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Load { destination: Relative(9), source_pointer: Relative(10) }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(9), rhs: Relative(4) }, JumpIf { condition: Relative(8), location: 260 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(10) } }, BinaryFieldOp { destination: Relative(8), op: Add, lhs: Relative(2), rhs: Relative(4) }, BinaryFieldOp { destination: Relative(9), op: Add, lhs: Relative(3), rhs: Relative(4) }, 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) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(8), input1_y: Relative(3), input1_infinite: Relative(6), input2_x: Relative(8), input2_y: Relative(3), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(11), size: 3 } }), BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(7) }, Load { destination: Relative(11), source_pointer: Relative(12) }, BinaryFieldOp { destination: Relative(10), op: Equals, lhs: Relative(11), rhs: Relative(4) }, JumpIf { condition: Relative(10), location: 274 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(12) } }, 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) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(8), input1_y: Relative(3), input1_infinite: Relative(6), input2_x: Relative(8), input2_y: Relative(9), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(11), size: 3 } }), BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(7) }, Load { destination: Relative(3), source_pointer: Relative(8) }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(3), rhs: Relative(4) }, JumpIf { condition: Relative(8), location: 286 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(10) } }, Mov { destination: Relative(3), 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(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(1), input1_y: Relative(5), input1_infinite: Relative(6), input2_x: Relative(2), input2_y: Relative(9), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(8), size: 3 } }), BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(7) }, Load { destination: Relative(8), source_pointer: Relative(9) }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(8), rhs: Relative(4) }, JumpIf { condition: Relative(3), location: 298 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(9) } }, Const { destination: Relative(3), bit_size: Field, value: 4 }, 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) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(1), input1_y: Relative(5), input1_infinite: Relative(6), input2_x: Relative(1), input2_y: Relative(3), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(9), size: 3 } }), BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Load { destination: Relative(3), source_pointer: Relative(9) }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(3), rhs: Relative(4) }, JumpIf { condition: Relative(8), location: 311 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(9) } }, Mov { destination: Relative(3), 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(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(1), input1_y: Relative(5), input1_infinite: Relative(6), input2_x: Relative(1), input2_y: Relative(5), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(8), size: 3 } }), BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(7) }, Load { destination: Relative(8), source_pointer: Relative(9) }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(8), rhs: Relative(4) }, JumpIf { condition: Relative(3), location: 323 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(9) } }, Mov { destination: Relative(3), 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(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(4), input1_y: Relative(5), input1_infinite: Relative(6), input2_x: Relative(4), input2_y: Relative(5), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(8), size: 3 } }), BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(7) }, Load { destination: Relative(8), source_pointer: Relative(9) }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(8), rhs: Relative(4) }, JumpIf { condition: Relative(3), location: 335 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(9) } }, Mov { destination: Relative(3), 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(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(2), input1_y: Relative(5), input1_infinite: Relative(6), input2_x: Relative(2), input2_y: Relative(1), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(8), size: 3 } }), BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(7) }, Load { destination: Relative(1), source_pointer: Relative(2) }, BinaryFieldOp { destination: Relative(2), op: Equals, lhs: Relative(1), rhs: Relative(4) }, JumpIf { condition: Relative(2), location: 347 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(3) } }, Jump { location: 348 }, 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: 354 }, 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(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: 15 }, 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) } }, Return, Call { location: 16 }, 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: 21 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "tZndThs9EIbvJccc2J4f29xKVaEAoYoUBZTCJ31C3Htndvwm9GBR2SQnfR9K/TT2euxZ5X31uLl/+3W33T89/17d/nhf3R+2u932193u+WH9un3e29++r5L/kXV1m29WuUa0iD5FSRE5okRQBEdIRFhKWEpYSlgoLBQWCguFhcJCYaGwUFgoLBQWNgtZ5IgSQREcIREaUSNaRJ9CzMIWOaJEUARHSIRZxKJGtIg+hZpFLXJEiaAIn1GylJE6so5sI3tk9dWx+dU80tenWNJIHikjdWQd2Ub2yJZG5pHD14avDV8bvjZ8bfja8LXh68PXh68PXx++Pnx9+Prw9eHrw9eHL6cEyIACIAADBKAA97JDA/QBOQEyoAAIwAABKMDN4tAAbrZnmqdCmCADCsDNzYEBAlBABTRAHzAVxwQZUAAwE8wEM8FMMBPMBDPDzDAzzAwzw8wwM8wMM8PMMAvMArPALDALzAKzwCwwC8wCs8KsMCvMCrPCrDArzAqzwqwwV5grzBXmCnOFeaq17qAAM5fk0AB9gBdcQAaYufhe9ZoLYIAAFFABDdAHeOkFZADMHeYOc4e5w9xh7jD3YS4pATKgAAjAAAEooAIaAOYMc4bZa7CQAwEYIAAFVEADuJn99kmADCgAAjBAAAqogAaAmWD2Gizi4J7uIAAFVEAD9AFecQF+SSWHAvCLaro1GSAABfiF5VOerqwJ+gCvuIAMKAACuNln4RUX4GafjldcQAP0AV5xpA5urg5+KU5XOgEYIAAFVICZ2R+3V9wEXnHsH8wrLqAACOBm/xhecQEKqIAG6AO84tg/s1dcgJv9w3vFBTBAAG72p+MVF9AAfYBXXEAGmFn8CXrFBZhZpu5GAAqoAG8XfIJecQ7kFReQAQVAAAa4mR0U4GZxaIA+wCsuwM3VoQAIwAABKMDNzaEB3Ny9U0uADCgAb3ambo4BAlBABTSAmbV485cA3kL5lP3WCyAAA9zsE/QaDKiABugDvAYD3KwOBeBmn7LXYIAA3Fw/Pm5WaJDvXg+bjffHnzpm66Nf1ofN/nV1u3/b7W5W/613b9M/+v2y3k/5uj7Yb22bbPaPliZ82u42Th83p9Fpfqjt1zHYNuxxuPzzeKp5jOfS5saX+fEsnSFQPk0g6zIDzRm+mAPzcQ4iC9aAtWN8owXjteMZ1Jznxtcvxhd8fpU8N//2xfjEmICmPvsM+rzBGt9Uh8JY+AKOuuBJVlGsZF3yJJpiJTulufGZzt7O/65Ysp/tdYawkEnTgnWwPv9oEJpdyVzPX4l61ZUQxoawzr4vWYlW8RmsneXZEy6ff8Tla66EteAoLuu9ecFKWGONe8Za60UGEszC+tvZXVX0zKOu1LPPutIucNh9R7LktLNXgnJcz16XPBH2988wsMzePVQusBrfkSxaDdbTXGpbshqixx0uuuS0sBeMo6HyIkPLxzptZbYjo3ZmjVA/u0Y4XWBXfEeyaFc0/tTgpkVPpGE97TVt9txjvsRq8JVXo9NpLpyX9PuloDOwV7DZ/cmXOD/5yuenvTGe5rKocyfuqBQSKnMGucT5KVc+P+1yPs1FlpxdVCtqjVqaPYFFL7EaeuXVaOU0F1r0VpgEdwGn+d2llzhF9cqnKNu3KJiLfe2xZDWIUGtMOntu6CVOUb3yKcq2I45z6X8/2Z/20/phe/jrm88Pdx226/vdZvz49LZ/+PTb1/9f8Bt8c/pyeH7YPL4dNm769PWp/fnDjp0bK9efH/7//QE=", - "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", - "path": "std/embedded_curve_ops.nr" - }, - "50": { - "source": "use std::{embedded_curve_ops::embedded_curve_add_unsafe, ops::Add};\n\nfn main(priv_key: Field, pub_x: pub Field, pub_y: pub Field) {\n let g1 = std::embedded_curve_ops::EmbeddedCurvePoint::generator();\n let scalar = std::embedded_curve_ops::EmbeddedCurveScalar { lo: priv_key, hi: 0 };\n // Test that multi_scalar_mul correctly derives the public key\n let res = std::embedded_curve_ops::multi_scalar_mul([g1], [scalar]);\n assert(res.x == pub_x);\n assert(res.y == pub_y);\n\n // Test that double function calling embedded_curve_add works as expected\n let pub_point =\n std::embedded_curve_ops::EmbeddedCurvePoint { x: pub_x, y: pub_y, is_infinite: false };\n let res = pub_point.double();\n let double = g1.add(g1);\n\n assert(double.x == res.x);\n\n // Test calling multi_scalar_mul with multiple points and scalars\n let res = std::embedded_curve_ops::multi_scalar_mul([g1, g1], [scalar, scalar]);\n\n // The results should be double the g1 point because the scalars are 1 and we pass in g1 twice\n assert(double.x == res.x);\n\n // Tests for #6549\n let const_scalar1 = std::embedded_curve_ops::EmbeddedCurveScalar { lo: 23, hi: 0 };\n let const_scalar2 = std::embedded_curve_ops::EmbeddedCurveScalar { lo: 0, hi: 23 };\n let const_scalar3 = std::embedded_curve_ops::EmbeddedCurveScalar { lo: 13, hi: 4 };\n let partial_mul = std::embedded_curve_ops::multi_scalar_mul(\n [g1, double, pub_point, g1, g1],\n [scalar, const_scalar1, scalar, const_scalar2, const_scalar3],\n );\n assert(partial_mul.x == 0x2024c4eebfbc8a20018f8c95c7aab77c6f34f10cf785a6f04e97452d8708fda7);\n // Check simplification by zero\n let zero_point = std::embedded_curve_ops::EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true };\n let const_zero = std::embedded_curve_ops::EmbeddedCurveScalar { lo: 0, hi: 0 };\n let partial_mul = std::embedded_curve_ops::multi_scalar_mul(\n [zero_point, double, g1],\n [scalar, const_zero, scalar],\n );\n assert(partial_mul == g1);\n\n // Additional tests for validating embedded_curve_add_unsafe under a conditional\n if pub_x == pub_y {\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 1, y: 2, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 1, y: 3, is_infinite: false };\n let doubling = a1.double();\n assert(doubling.x == 1);\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint {\n x: pub_x + 1,\n y: pub_y,\n is_infinite: false,\n };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint {\n x: pub_x + 1,\n y: pub_y + 1,\n is_infinite: false,\n };\n let doubling = a1.double();\n assert(doubling.x == 1);\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint {\n x: pub_x,\n y: pub_y + 1 as Field,\n is_infinite: false,\n };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 4, is_infinite: false };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 3, is_infinite: false };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 1, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 1, y: 3, is_infinite: false };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: pub_x, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: pub_x, y: 2, is_infinite: false };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n }\n}\n", - "path": "" - } - }, + "debug_symbols": "XY7BCoRACIbfxfMcag976FUiwiaLAXEGmwmW6N3XiQ1iL+rvp/4eMNNU1jHIEjfo+gMmDcxhHTl6zCGKdY/TwS3HrETWgge3rYRKkqGTwuxgRy7X0JZQrpxRjTYOSGbLdnAJTLU6BxPog/477qgBJ6afXIr4B82fdJP746TR01yU6qXKoKmhtdi3b/dqh7O6fQE=", + "file_map": {}, "names": [ "main" ], diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 3ebd817e856..c1154ee25c4 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -45,19 +45,10 @@ expression: artifact "return value indices : []", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(2))], q_c: 0 })], outputs: []", "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: 15 }, 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) } }, Return, Call { location: 349 }, Const { destination: Relative(4), bit_size: Field, value: 1 }, Const { destination: Relative(5), bit_size: Field, value: 17631683881184975370165255887551781615748388533673675138860 }, Const { destination: Relative(6), bit_size: Integer(U1), value: 0 }, 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(4) }, 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(8), bit_size: Field, value: 0 }, Mov { destination: Relative(9), 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(9), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Mov { destination: Relative(11), source: Relative(10) }, 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: Relative(8) }, 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(7), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 2 }, 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 } }), Const { destination: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(7) }, Load { destination: Relative(9), source_pointer: Relative(11) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(11) }, Load { destination: Relative(12), source_pointer: Relative(13) }, BinaryFieldOp { destination: Relative(10), op: Equals, lhs: Relative(9), rhs: Relative(2) }, JumpIf { condition: Relative(10), location: 60 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(13) } }, BinaryFieldOp { destination: Relative(9), op: Equals, lhs: Relative(12), rhs: Relative(3) }, JumpIf { condition: Relative(9), location: 64 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(10) } }, Mov { destination: Relative(9), 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(9), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(2), input1_y: Relative(3), input1_infinite: Relative(6), input2_x: Relative(2), input2_y: Relative(3), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(10), size: 3 } }), BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(7) }, Load { destination: Relative(10), source_pointer: Relative(12) }, Const { destination: Relative(9), bit_size: Field, value: 3078034153852398078128400807926804309327113743808504829582559963737223069694 }, BinaryFieldOp { destination: Relative(12), op: Equals, lhs: Relative(9), rhs: Relative(10) }, JumpIf { condition: Relative(12), location: 77 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(13) } }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Relative(13), source: Relative(12) }, 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(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(4) }, 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) }, Mov { destination: Relative(12), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 5 }, 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(1) }, 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(1) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(8) }, Mov { destination: Relative(13), source: Direct(1) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 4 }, 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(10), rhs: Direct(2) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(14), size: Relative(15) }, scalars: HeapVector { pointer: Relative(16), size: Relative(17) }, outputs: HeapArray { pointer: Relative(18), size: 3 } }), BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(7) }, Load { destination: Relative(10), source_pointer: Relative(12) }, BinaryFieldOp { destination: Relative(12), op: Equals, lhs: Relative(9), rhs: Relative(10) }, JumpIf { condition: Relative(12), location: 123 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(13) } }, Mov { destination: Relative(9), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(9), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Mov { destination: Relative(12), source: Relative(10) }, 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(8) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, 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(8) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(4) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(8) }, Const { destination: Relative(10), bit_size: Field, value: 11179562631109628533987091031692370366552561688588090155835439555627259799605 }, Const { destination: Relative(12), bit_size: Field, value: 3443719903172018228650470536370404288991794296383447657609081676265727805364 }, Mov { destination: Relative(13), 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(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(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(6) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(3) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(6) }, 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(12) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(6) }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(12), size: Relative(14) }, scalars: HeapVector { pointer: Relative(15), size: Relative(16) }, outputs: HeapArray { pointer: Relative(17), size: 3 } }), BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(7) }, Load { destination: Relative(9), source_pointer: Relative(12) }, Const { destination: Relative(10), bit_size: Field, value: -7349266043899242844836273743257843180744506495159104166319746739537754653274 }, BinaryFieldOp { destination: Relative(12), op: Equals, lhs: Relative(9), rhs: Relative(10) }, JumpIf { condition: Relative(12), location: 182 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(13) } }, Mov { destination: Relative(9), 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(9), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Mov { destination: Relative(12), source: Relative(10) }, 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(8) }, Mov { destination: Relative(1), 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(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(10), source: Relative(8) }, 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(5) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(6) }, Mov { destination: Relative(8), 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(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(10), size: Relative(12) }, scalars: HeapVector { pointer: Relative(13), size: Relative(14) }, outputs: HeapArray { pointer: Relative(15), size: 3 } }), BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Load { destination: Relative(1), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(11) }, Load { destination: Relative(9), source_pointer: Relative(10) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(10) }, Load { destination: Relative(11), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U1, lhs: Relative(11), rhs: Relative(6) }, JumpIf { condition: Relative(8), location: 223 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(10) } }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(1), rhs: Relative(4) }, JumpIf { condition: Relative(8), location: 227 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(10) } }, BinaryFieldOp { destination: Relative(1), op: Equals, lhs: Relative(9), rhs: Relative(5) }, JumpIf { condition: Relative(1), location: 231 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(8) } }, BinaryFieldOp { destination: Relative(1), op: Equals, lhs: Relative(2), rhs: Relative(3) }, JumpIf { condition: Relative(1), location: 234 }, Jump { location: 348 }, Const { destination: Relative(1), bit_size: Field, value: 2 }, 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) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(4), input1_y: Relative(1), input1_infinite: Relative(6), input2_x: Relative(4), input2_y: Relative(1), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(8), size: 3 } }), BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Load { destination: Relative(8), source_pointer: Relative(9) }, BinaryFieldOp { destination: Relative(5), op: Equals, lhs: Relative(8), rhs: Relative(4) }, JumpIf { condition: Relative(5), location: 247 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(9) } }, Const { destination: Relative(5), bit_size: Field, value: 3 }, 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) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(4), input1_y: Relative(1), input1_infinite: Relative(6), input2_x: Relative(4), input2_y: Relative(5), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(9), size: 3 } }), BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Load { destination: Relative(9), source_pointer: Relative(10) }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(9), rhs: Relative(4) }, JumpIf { condition: Relative(8), location: 260 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(10) } }, BinaryFieldOp { destination: Relative(8), op: Add, lhs: Relative(2), rhs: Relative(4) }, BinaryFieldOp { destination: Relative(9), op: Add, lhs: Relative(3), rhs: Relative(4) }, 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) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(8), input1_y: Relative(3), input1_infinite: Relative(6), input2_x: Relative(8), input2_y: Relative(3), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(11), size: 3 } }), BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(7) }, Load { destination: Relative(11), source_pointer: Relative(12) }, BinaryFieldOp { destination: Relative(10), op: Equals, lhs: Relative(11), rhs: Relative(4) }, JumpIf { condition: Relative(10), location: 274 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(12) } }, 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) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(8), input1_y: Relative(3), input1_infinite: Relative(6), input2_x: Relative(8), input2_y: Relative(9), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(11), size: 3 } }), BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(7) }, Load { destination: Relative(3), source_pointer: Relative(8) }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(3), rhs: Relative(4) }, JumpIf { condition: Relative(8), location: 286 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(10) } }, Mov { destination: Relative(3), 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(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(1), input1_y: Relative(5), input1_infinite: Relative(6), input2_x: Relative(2), input2_y: Relative(9), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(8), size: 3 } }), BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(7) }, Load { destination: Relative(8), source_pointer: Relative(9) }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(8), rhs: Relative(4) }, JumpIf { condition: Relative(3), location: 298 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(9) } }, Const { destination: Relative(3), bit_size: Field, value: 4 }, 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) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(1), input1_y: Relative(5), input1_infinite: Relative(6), input2_x: Relative(1), input2_y: Relative(3), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(9), size: 3 } }), BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Load { destination: Relative(3), source_pointer: Relative(9) }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(3), rhs: Relative(4) }, JumpIf { condition: Relative(8), location: 311 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(9) } }, Mov { destination: Relative(3), 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(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(1), input1_y: Relative(5), input1_infinite: Relative(6), input2_x: Relative(1), input2_y: Relative(5), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(8), size: 3 } }), BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(7) }, Load { destination: Relative(8), source_pointer: Relative(9) }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(8), rhs: Relative(4) }, JumpIf { condition: Relative(3), location: 323 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(9) } }, Mov { destination: Relative(3), 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(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(4), input1_y: Relative(5), input1_infinite: Relative(6), input2_x: Relative(4), input2_y: Relative(5), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(8), size: 3 } }), BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(7) }, Load { destination: Relative(8), source_pointer: Relative(9) }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(8), rhs: Relative(4) }, JumpIf { condition: Relative(3), location: 335 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(9) } }, Mov { destination: Relative(3), 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(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(2), input1_y: Relative(5), input1_infinite: Relative(6), input2_x: Relative(2), input2_y: Relative(1), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(8), size: 3 } }), BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(7) }, Load { destination: Relative(1), source_pointer: Relative(2) }, BinaryFieldOp { destination: Relative(2), op: Equals, lhs: Relative(1), rhs: Relative(4) }, JumpIf { condition: Relative(2), location: 347 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(3) } }, Jump { location: 348 }, 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: 354 }, 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(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: 15 }, 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) } }, Return, Call { location: 16 }, 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: 21 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "tZndThs9EIbvJccc2J4f29xKVaEAoYoUBZTCJ31C3Htndvwm9GBR2SQnfR9K/TT2euxZ5X31uLl/+3W33T89/17d/nhf3R+2u932193u+WH9un3e29++r5L/kXV1m29WuUa0iD5FSRE5okRQBEdIRFhKWEpYSlgoLBQWCguFhcJCYaGwUFgoLBQWNgtZ5IgSQREcIREaUSNaRJ9CzMIWOaJEUARHSIRZxKJGtIg+hZpFLXJEiaAIn1GylJE6so5sI3tk9dWx+dU80tenWNJIHikjdWQd2Ub2yJZG5pHD14avDV8bvjZ8bfja8LXh68PXh68PXx++Pnx9+Prw9eHrw9eHL6cEyIACIAADBKAA97JDA/QBOQEyoAAIwAABKMDN4tAAbrZnmqdCmCADCsDNzYEBAlBABTRAHzAVxwQZUAAwE8wEM8FMMBPMBDPDzDAzzAwzw8wwM8wMM8PMMAvMArPALDALzAKzwCwwC8wCs8KsMCvMCrPCrDArzAqzwqwwV5grzBXmCnOFeaq17qAAM5fk0AB9gBdcQAaYufhe9ZoLYIAAFFABDdAHeOkFZADMHeYOc4e5w9xh7jD3YS4pATKgAAjAAAEooAIaAOYMc4bZa7CQAwEYIAAFVEADuJn99kmADCgAAjBAAAqogAaAmWD2Gizi4J7uIAAFVEAD9AFecQF+SSWHAvCLaro1GSAABfiF5VOerqwJ+gCvuIAMKAACuNln4RUX4GafjldcQAP0AV5xpA5urg5+KU5XOgEYIAAFVICZ2R+3V9wEXnHsH8wrLqAACOBm/xhecQEKqIAG6AO84tg/s1dcgJv9w3vFBTBAAG72p+MVF9AAfYBXXEAGmFn8CXrFBZhZpu5GAAqoAG8XfIJecQ7kFReQAQVAAAa4mR0U4GZxaIA+wCsuwM3VoQAIwAABKMDNzaEB3Ny9U0uADCgAb3ambo4BAlBABTSAmbV485cA3kL5lP3WCyAAA9zsE/QaDKiABugDvAYD3KwOBeBmn7LXYIAA3Fw/Pm5WaJDvXg+bjffHnzpm66Nf1ofN/nV1u3/b7W5W/613b9M/+v2y3k/5uj7Yb22bbPaPliZ82u42Th83p9Fpfqjt1zHYNuxxuPzzeKp5jOfS5saX+fEsnSFQPk0g6zIDzRm+mAPzcQ4iC9aAtWN8owXjteMZ1Jznxtcvxhd8fpU8N//2xfjEmICmPvsM+rzBGt9Uh8JY+AKOuuBJVlGsZF3yJJpiJTulufGZzt7O/65Ysp/tdYawkEnTgnWwPv9oEJpdyVzPX4l61ZUQxoawzr4vWYlW8RmsneXZEy6ff8Tla66EteAoLuu9ecFKWGONe8Za60UGEszC+tvZXVX0zKOu1LPPutIucNh9R7LktLNXgnJcz16XPBH2988wsMzePVQusBrfkSxaDdbTXGpbshqixx0uuuS0sBeMo6HyIkPLxzptZbYjo3ZmjVA/u0Y4XWBXfEeyaFc0/tTgpkVPpGE97TVt9txjvsRq8JVXo9NpLpyX9PuloDOwV7DZ/cmXOD/5yuenvTGe5rKocyfuqBQSKnMGucT5KVc+P+1yPs1FlpxdVCtqjVqaPYFFL7EaeuXVaOU0F1r0VpgEdwGn+d2llzhF9cqnKNu3KJiLfe2xZDWIUGtMOntu6CVOUb3yKcq2I45z6X8/2Z/20/phe/jrm88Pdx226/vdZvz49LZ/+PTb1/9f8Bt8c/pyeH7YPL4dNm769PWp/fnDjp0bK9efH/7//QE=", - "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", - "path": "std/embedded_curve_ops.nr" - }, - "50": { - "source": "use std::{embedded_curve_ops::embedded_curve_add_unsafe, ops::Add};\n\nfn main(priv_key: Field, pub_x: pub Field, pub_y: pub Field) {\n let g1 = std::embedded_curve_ops::EmbeddedCurvePoint::generator();\n let scalar = std::embedded_curve_ops::EmbeddedCurveScalar { lo: priv_key, hi: 0 };\n // Test that multi_scalar_mul correctly derives the public key\n let res = std::embedded_curve_ops::multi_scalar_mul([g1], [scalar]);\n assert(res.x == pub_x);\n assert(res.y == pub_y);\n\n // Test that double function calling embedded_curve_add works as expected\n let pub_point =\n std::embedded_curve_ops::EmbeddedCurvePoint { x: pub_x, y: pub_y, is_infinite: false };\n let res = pub_point.double();\n let double = g1.add(g1);\n\n assert(double.x == res.x);\n\n // Test calling multi_scalar_mul with multiple points and scalars\n let res = std::embedded_curve_ops::multi_scalar_mul([g1, g1], [scalar, scalar]);\n\n // The results should be double the g1 point because the scalars are 1 and we pass in g1 twice\n assert(double.x == res.x);\n\n // Tests for #6549\n let const_scalar1 = std::embedded_curve_ops::EmbeddedCurveScalar { lo: 23, hi: 0 };\n let const_scalar2 = std::embedded_curve_ops::EmbeddedCurveScalar { lo: 0, hi: 23 };\n let const_scalar3 = std::embedded_curve_ops::EmbeddedCurveScalar { lo: 13, hi: 4 };\n let partial_mul = std::embedded_curve_ops::multi_scalar_mul(\n [g1, double, pub_point, g1, g1],\n [scalar, const_scalar1, scalar, const_scalar2, const_scalar3],\n );\n assert(partial_mul.x == 0x2024c4eebfbc8a20018f8c95c7aab77c6f34f10cf785a6f04e97452d8708fda7);\n // Check simplification by zero\n let zero_point = std::embedded_curve_ops::EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true };\n let const_zero = std::embedded_curve_ops::EmbeddedCurveScalar { lo: 0, hi: 0 };\n let partial_mul = std::embedded_curve_ops::multi_scalar_mul(\n [zero_point, double, g1],\n [scalar, const_zero, scalar],\n );\n assert(partial_mul == g1);\n\n // Additional tests for validating embedded_curve_add_unsafe under a conditional\n if pub_x == pub_y {\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 1, y: 2, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 1, y: 3, is_infinite: false };\n let doubling = a1.double();\n assert(doubling.x == 1);\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint {\n x: pub_x + 1,\n y: pub_y,\n is_infinite: false,\n };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint {\n x: pub_x + 1,\n y: pub_y + 1,\n is_infinite: false,\n };\n let doubling = a1.double();\n assert(doubling.x == 1);\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint {\n x: pub_x,\n y: pub_y + 1 as Field,\n is_infinite: false,\n };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 4, is_infinite: false };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 3, is_infinite: false };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 1, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 1, y: 3, is_infinite: false };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: pub_x, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: pub_x, y: 2, is_infinite: false };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n }\n}\n", - "path": "" - } - }, + "debug_symbols": "XY7BCoRACIbfxfMcag976FUiwiaLAXEGmwmW6N3XiQ1iL+rvp/4eMNNU1jHIEjfo+gMmDcxhHTl6zCGKdY/TwS3HrETWgge3rYRKkqGTwuxgRy7X0JZQrpxRjTYOSGbLdnAJTLU6BxPog/477qgBJ6afXIr4B82fdJP746TR01yU6qXKoKmhtdi3b/dqh7O6fQE=", + "file_map": {}, "names": [ "main" ], 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 4462c186f46..7c13743c247 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 @@ -32,20 +32,16 @@ expression: artifact }, "bytecode": [ "func 0", - "current witness index : _4", + "current witness index : _3", "private parameters indices : [_0, _1]", "public parameters indices : []", "return value indices : []", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 })], outputs: [Simple(Witness(2)), Simple(Witness(3))]", "EXPR [ (1, _0) (-1, _2) (-340282366920938463463374607431768211456, _3) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(0)), (-1, Witness(1))], q_c: 0 })], outputs: [Simple(Witness(4))]", - "EXPR [ (1, _0, _4) (-1, _1, _4) -1 ]", "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]", - "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) } }]" + "[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": "pZRRjoMgEEDvwjcfDAKCV2mahlrakBA0VDfZNN59h65sazaajfvDiPAejDA+yMWdx9vJx2t3J83hQc7Jh+Bvp9C1dvBdxLcPwnIDijScEqi/gyZNhcGQRlDCcYaYJkoKdhqSc5l686C9t8nFgTRxDIGSDxvG56R7b+MzDjbhKKPExQtGFF59cPlpoi+araOa8RnWXP3gUC94WOeVEDOvZLWH11B4rXfxJfmara6/lX9JH5ApuIQFLtdxUFD2D0rK1wbMwqA2DMbo2cAZXzXU6wYBzMwGAZLvMfCqZCG4MrsMXP7XAPUfDBtHCbJcRajl4iyP2LOtT7+KFL885KPHgsSAV6HKYcprJG/PweWJWTXGtnDYHT77MlLKv09d6y5jcnmNt38AtgcuKDfHKe/jCw==", + "debug_symbols": "pZPBjsIgEED/Zc4cGAQK/RVjDFY0JIQ22G6yMf33BbesNhs81AtTOvMeTJu5w9mepuvRhUt/g3Z/h1N03rvr0fedGV0f0ts70LyghJYRwOY3KGh3KWhoOQGWKvg8EyjYcYzWZurFk+yDiTaM0IbJewJfxk+PottgwiOOJqYsJWDDOcUkvDhv89NMnjSto4qyBVZM/uHYrHis85LzhZdit4VXWHilNvGl+YZWz3/Xf2kfE1NwgStc1HGUWO6PUojnBfTKIN8YtFaLgVFWNTR1A0eqFwNHwbYY2K50wZnUmwxMfGrApmY4pJ3pXPw3ZOnLYf51c/ZGZ07e5lSGp9CVyrQdv4eSKQM7xL6z5ynabH2Z2rTuGSdMH+Z88g8=", "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", @@ -64,7 +60,6 @@ expression: artifact "main" ], "brillig_names": [ - "decompose_hint", - "directive_invert" + "decompose_hint" ] } 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 4462c186f46..7c13743c247 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 @@ -32,20 +32,16 @@ expression: artifact }, "bytecode": [ "func 0", - "current witness index : _4", + "current witness index : _3", "private parameters indices : [_0, _1]", "public parameters indices : []", "return value indices : []", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 })], outputs: [Simple(Witness(2)), Simple(Witness(3))]", "EXPR [ (1, _0) (-1, _2) (-340282366920938463463374607431768211456, _3) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(0)), (-1, Witness(1))], q_c: 0 })], outputs: [Simple(Witness(4))]", - "EXPR [ (1, _0, _4) (-1, _1, _4) -1 ]", "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]", - "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) } }]" + "[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": "pZRRjoMgEEDvwjcfDAKCV2mahlrakBA0VDfZNN59h65sazaajfvDiPAejDA+yMWdx9vJx2t3J83hQc7Jh+Bvp9C1dvBdxLcPwnIDijScEqi/gyZNhcGQRlDCcYaYJkoKdhqSc5l686C9t8nFgTRxDIGSDxvG56R7b+MzDjbhKKPExQtGFF59cPlpoi+araOa8RnWXP3gUC94WOeVEDOvZLWH11B4rXfxJfmara6/lX9JH5ApuIQFLtdxUFD2D0rK1wbMwqA2DMbo2cAZXzXU6wYBzMwGAZLvMfCqZCG4MrsMXP7XAPUfDBtHCbJcRajl4iyP2LOtT7+KFL885KPHgsSAV6HKYcprJG/PweWJWTXGtnDYHT77MlLKv09d6y5jcnmNt38AtgcuKDfHKe/jCw==", + "debug_symbols": "pZPBjsIgEED/Zc4cGAQK/RVjDFY0JIQ22G6yMf33BbesNhs81AtTOvMeTJu5w9mepuvRhUt/g3Z/h1N03rvr0fedGV0f0ts70LyghJYRwOY3KGh3KWhoOQGWKvg8EyjYcYzWZurFk+yDiTaM0IbJewJfxk+PottgwiOOJqYsJWDDOcUkvDhv89NMnjSto4qyBVZM/uHYrHis85LzhZdit4VXWHilNvGl+YZWz3/Xf2kfE1NwgStc1HGUWO6PUojnBfTKIN8YtFaLgVFWNTR1A0eqFwNHwbYY2K50wZnUmwxMfGrApmY4pJ3pXPw3ZOnLYf51c/ZGZ07e5lSGp9CVyrQdv4eSKQM7xL6z5ynabH2Z2rTuGSdMH+Z88g8=", "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", @@ -64,7 +60,6 @@ expression: artifact "main" ], "brillig_names": [ - "decompose_hint", - "directive_invert" + "decompose_hint" ] } 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 4462c186f46..7c13743c247 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 @@ -32,20 +32,16 @@ expression: artifact }, "bytecode": [ "func 0", - "current witness index : _4", + "current witness index : _3", "private parameters indices : [_0, _1]", "public parameters indices : []", "return value indices : []", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 })], outputs: [Simple(Witness(2)), Simple(Witness(3))]", "EXPR [ (1, _0) (-1, _2) (-340282366920938463463374607431768211456, _3) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(0)), (-1, Witness(1))], q_c: 0 })], outputs: [Simple(Witness(4))]", - "EXPR [ (1, _0, _4) (-1, _1, _4) -1 ]", "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]", - "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) } }]" + "[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": "pZRRjoMgEEDvwjcfDAKCV2mahlrakBA0VDfZNN59h65sazaajfvDiPAejDA+yMWdx9vJx2t3J83hQc7Jh+Bvp9C1dvBdxLcPwnIDijScEqi/gyZNhcGQRlDCcYaYJkoKdhqSc5l686C9t8nFgTRxDIGSDxvG56R7b+MzDjbhKKPExQtGFF59cPlpoi+araOa8RnWXP3gUC94WOeVEDOvZLWH11B4rXfxJfmara6/lX9JH5ApuIQFLtdxUFD2D0rK1wbMwqA2DMbo2cAZXzXU6wYBzMwGAZLvMfCqZCG4MrsMXP7XAPUfDBtHCbJcRajl4iyP2LOtT7+KFL885KPHgsSAV6HKYcprJG/PweWJWTXGtnDYHT77MlLKv09d6y5jcnmNt38AtgcuKDfHKe/jCw==", + "debug_symbols": "pZPBjsIgEED/Zc4cGAQK/RVjDFY0JIQ22G6yMf33BbesNhs81AtTOvMeTJu5w9mepuvRhUt/g3Z/h1N03rvr0fedGV0f0ts70LyghJYRwOY3KGh3KWhoOQGWKvg8EyjYcYzWZurFk+yDiTaM0IbJewJfxk+PottgwiOOJqYsJWDDOcUkvDhv89NMnjSto4qyBVZM/uHYrHis85LzhZdit4VXWHilNvGl+YZWz3/Xf2kfE1NwgStc1HGUWO6PUojnBfTKIN8YtFaLgVFWNTR1A0eqFwNHwbYY2K50wZnUmwxMfGrApmY4pJ3pXPw3ZOnLYf51c/ZGZ07e5lSGp9CVyrQdv4eSKQM7xL6z5ynabH2Z2rTuGSdMH+Z88g8=", "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", @@ -64,7 +60,6 @@ expression: artifact "main" ], "brillig_names": [ - "decompose_hint", - "directive_invert" + "decompose_hint" ] } 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 85aec2c99b5..7877bab58a4 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 @@ -38,9 +38,9 @@ expression: artifact "return value indices : []", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1))], q_c: 0 })], outputs: []", "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]" + "[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: 27 }, 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) } }, 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: 32 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "pZTBjoMgFEX/hbULHgKCvzJpGmtpQ0LQUJ1k0vjv86jQ1gVm0tlwRLyHJxDu5GxO8/Vo/WW4kfbrTk7BOmevRzf03WQHj2/vhMYGJGllRaBZoUjbIDRpVUUYXQGk1QhGWqDIGglInigSZSKqgCFVol5Z00RIjD62LBXJVR2nYEws6q1MLH7sgvETaf3sXEW+Ozc/PrqNnX9w6gKOYmXGn5EovFhn4tNSvdK0HFUsZQGaZ1rAJg7lOMj426tACvE0gN4Y2I5Ba5UMjLKioS4bOFCdDBwEKxn4ziLQvAqKyVe+2eRFOS85T3kp6k/yKi+iVOqjfD4BDS3Ov7eCrM4FcCb1J3vAmPivAZo/GHaOMoi8C9CIzVk+YK/rbdjcAUs0BdudnEndy+z7t9HpZ8wj+Q4Zw9Cb8xxMNL1dJNh+1byq9WGJs/0C", + "debug_symbols": "pZPNjsIgFIXfhXUXcMv/qxhjsKIhIbTBdpKJ6bsPKKhd4MLZcEpvz3fobe8NnexxuRxcOI9XpHc3dIzOe3c5+HEwsxtDuntDOC+EI807RMRDJNIiiUJadgjwQwjSKgkgTXDSPilJSouyojzrunaophzmaG0OeYtNh5lMtGFGOized+jH+OX+0HUy4a6ziamakmw4JU3As/M2X63dy43bVgnFS4h4uhnZ2EnbTnh+nQeAM/YkELUhwAeCUrIQAEOT0LcJlGBVCJQwaBHohybg2gUJ/OUXGz9r+zmlxc9Z/41f1iZyKb/y1z9A4Gb+pw5CXw9AgatvvgEA+y+BiBZhn3ZmcHEzk2tmRWeO3pbteQnDW3X+nWqlzvQUx8Gelmgz6W2w07oD0fWwX3PaHw==", "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", 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 85aec2c99b5..7877bab58a4 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 @@ -38,9 +38,9 @@ expression: artifact "return value indices : []", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1))], q_c: 0 })], outputs: []", "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]" + "[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: 27 }, 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) } }, 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: 32 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "pZTBjoMgFEX/hbULHgKCvzJpGmtpQ0LQUJ1k0vjv86jQ1gVm0tlwRLyHJxDu5GxO8/Vo/WW4kfbrTk7BOmevRzf03WQHj2/vhMYGJGllRaBZoUjbIDRpVUUYXQGk1QhGWqDIGglInigSZSKqgCFVol5Z00RIjD62LBXJVR2nYEws6q1MLH7sgvETaf3sXEW+Ozc/PrqNnX9w6gKOYmXGn5EovFhn4tNSvdK0HFUsZQGaZ1rAJg7lOMj426tACvE0gN4Y2I5Ba5UMjLKioS4bOFCdDBwEKxn4ziLQvAqKyVe+2eRFOS85T3kp6k/yKi+iVOqjfD4BDS3Ov7eCrM4FcCb1J3vAmPivAZo/GHaOMoi8C9CIzVk+YK/rbdjcAUs0BdudnEndy+z7t9HpZ8wj+Q4Zw9Cb8xxMNL1dJNh+1byq9WGJs/0C", + "debug_symbols": "pZPNjsIgFIXfhXUXcMv/qxhjsKIhIbTBdpKJ6bsPKKhd4MLZcEpvz3fobe8NnexxuRxcOI9XpHc3dIzOe3c5+HEwsxtDuntDOC+EI807RMRDJNIiiUJadgjwQwjSKgkgTXDSPilJSouyojzrunaophzmaG0OeYtNh5lMtGFGOized+jH+OX+0HUy4a6ziamakmw4JU3As/M2X63dy43bVgnFS4h4uhnZ2EnbTnh+nQeAM/YkELUhwAeCUrIQAEOT0LcJlGBVCJQwaBHohybg2gUJ/OUXGz9r+zmlxc9Z/41f1iZyKb/y1z9A4Gb+pw5CXw9AgatvvgEA+y+BiBZhn3ZmcHEzk2tmRWeO3pbteQnDW3X+nWqlzvQUx8Gelmgz6W2w07oD0fWwX3PaHw==", "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", 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 85aec2c99b5..7877bab58a4 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 @@ -38,9 +38,9 @@ expression: artifact "return value indices : []", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1))], q_c: 0 })], outputs: []", "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]" + "[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: 27 }, 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) } }, 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: 32 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "pZTBjoMgFEX/hbULHgKCvzJpGmtpQ0LQUJ1k0vjv86jQ1gVm0tlwRLyHJxDu5GxO8/Vo/WW4kfbrTk7BOmevRzf03WQHj2/vhMYGJGllRaBZoUjbIDRpVUUYXQGk1QhGWqDIGglInigSZSKqgCFVol5Z00RIjD62LBXJVR2nYEws6q1MLH7sgvETaf3sXEW+Ozc/PrqNnX9w6gKOYmXGn5EovFhn4tNSvdK0HFUsZQGaZ1rAJg7lOMj426tACvE0gN4Y2I5Ba5UMjLKioS4bOFCdDBwEKxn4ziLQvAqKyVe+2eRFOS85T3kp6k/yKi+iVOqjfD4BDS3Ov7eCrM4FcCb1J3vAmPivAZo/GHaOMoi8C9CIzVk+YK/rbdjcAUs0BdudnEndy+z7t9HpZ8wj+Q4Zw9Cb8xxMNL1dJNh+1byq9WGJs/0C", + "debug_symbols": "pZPNjsIgFIXfhXUXcMv/qxhjsKIhIbTBdpKJ6bsPKKhd4MLZcEpvz3fobe8NnexxuRxcOI9XpHc3dIzOe3c5+HEwsxtDuntDOC+EI807RMRDJNIiiUJadgjwQwjSKgkgTXDSPilJSouyojzrunaophzmaG0OeYtNh5lMtGFGOized+jH+OX+0HUy4a6ziamakmw4JU3As/M2X63dy43bVgnFS4h4uhnZ2EnbTnh+nQeAM/YkELUhwAeCUrIQAEOT0LcJlGBVCJQwaBHohybg2gUJ/OUXGz9r+zmlxc9Z/41f1iZyKb/y1z9A4Gb+pw5CXw9AgatvvgEA+y+BiBZhn3ZmcHEzk2tmRWeO3pbteQnDW3X+nWqlzvQUx8Gelmgz6W2w07oD0fWwX3PaHw==", "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", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index 50b77b14496..19a8103bb78 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -80,7 +80,7 @@ expression: artifact }, "bytecode": [ "func 0", - "current witness index : _3326", + "current witness index : _2988", "private parameters indices : [_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27]", "public parameters indices : [_28]", "return value indices : []", @@ -1840,56 +1840,56 @@ expression: artifact "MEM (id: 19, read at: EXPR [ (1, _1590) 0 ], value: EXPR [ (1, _1591) 0 ]) ", "EXPR [ (1, _1590) (-1, _1592) 1 ]", "MEM (id: 19, read at: EXPR [ (1, _1592) 0 ], value: EXPR [ (1, _1593) 0 ]) ", - "EXPR [ (1, _190, _748) (-1, _3284) 0 ]", - "EXPR [ (1, _93, _1158) (-1, _1594) (1, _3284) 0 ]", - "EXPR [ (1, _190, _749) (-1, _3286) 0 ]", - "EXPR [ (1, _93, _1160) (-1, _1595) (1, _3286) 0 ]", - "EXPR [ (1, _190, _750) (-1, _3288) 0 ]", - "EXPR [ (1, _93, _1162) (-1, _1596) (1, _3288) 0 ]", - "EXPR [ (1, _190, _751) (-1, _3290) 0 ]", - "EXPR [ (1, _93, _1164) (-1, _1597) (1, _3290) 0 ]", - "EXPR [ (1, _190, _752) (-1, _3292) 0 ]", - "EXPR [ (1, _93, _1166) (-1, _1598) (1, _3292) 0 ]", - "EXPR [ (1, _190, _753) (-1, _3294) 0 ]", - "EXPR [ (1, _93, _1168) (-1, _1599) (1, _3294) 0 ]", - "EXPR [ (1, _190, _754) (-1, _3296) 0 ]", - "EXPR [ (1, _93, _1170) (-1, _1600) (1, _3296) 0 ]", - "EXPR [ (1, _190, _755) (-1, _3298) 0 ]", - "EXPR [ (1, _93, _1172) (-1, _1601) (1, _3298) 0 ]", + "EXPR [ (1, _190, _748) (-1, _2946) 0 ]", + "EXPR [ (1, _93, _1158) (-1, _1594) (1, _2946) 0 ]", + "EXPR [ (1, _190, _749) (-1, _2948) 0 ]", + "EXPR [ (1, _93, _1160) (-1, _1595) (1, _2948) 0 ]", + "EXPR [ (1, _190, _750) (-1, _2950) 0 ]", + "EXPR [ (1, _93, _1162) (-1, _1596) (1, _2950) 0 ]", + "EXPR [ (1, _190, _751) (-1, _2952) 0 ]", + "EXPR [ (1, _93, _1164) (-1, _1597) (1, _2952) 0 ]", + "EXPR [ (1, _190, _752) (-1, _2954) 0 ]", + "EXPR [ (1, _93, _1166) (-1, _1598) (1, _2954) 0 ]", + "EXPR [ (1, _190, _753) (-1, _2956) 0 ]", + "EXPR [ (1, _93, _1168) (-1, _1599) (1, _2956) 0 ]", + "EXPR [ (1, _190, _754) (-1, _2958) 0 ]", + "EXPR [ (1, _93, _1170) (-1, _1600) (1, _2958) 0 ]", + "EXPR [ (1, _190, _755) (-1, _2960) 0 ]", + "EXPR [ (1, _93, _1172) (-1, _1601) (1, _2960) 0 ]", "EXPR [ (1, _93, _1174) (5, _190) (-1, _1602) 0 ]", "EXPR [ (1, _93, _1176) (6, _190) (-1, _1603) 0 ]", "EXPR [ (1, _93, _1178) (21, _190) (-1, _1604) 0 ]", - "EXPR [ (1, _190, _759) (-1, _3300) 0 ]", - "EXPR [ (1, _93, _1180) (-1, _1605) (1, _3300) 0 ]", - "EXPR [ (1, _190, _760) (-1, _3302) 0 ]", - "EXPR [ (1, _93, _1182) (-1, _1606) (1, _3302) 0 ]", - "EXPR [ (1, _190, _761) (-1, _3304) 0 ]", - "EXPR [ (1, _93, _1184) (-1, _1607) (1, _3304) 0 ]", - "EXPR [ (1, _190, _762) (-1, _3306) 0 ]", - "EXPR [ (1, _93, _1186) (-1, _1608) (1, _3306) 0 ]", + "EXPR [ (1, _190, _759) (-1, _2962) 0 ]", + "EXPR [ (1, _93, _1180) (-1, _1605) (1, _2962) 0 ]", + "EXPR [ (1, _190, _760) (-1, _2964) 0 ]", + "EXPR [ (1, _93, _1182) (-1, _1606) (1, _2964) 0 ]", + "EXPR [ (1, _190, _761) (-1, _2966) 0 ]", + "EXPR [ (1, _93, _1184) (-1, _1607) (1, _2966) 0 ]", + "EXPR [ (1, _190, _762) (-1, _2968) 0 ]", + "EXPR [ (1, _93, _1186) (-1, _1608) (1, _2968) 0 ]", "EXPR [ (1, _93, _1188) (100, _190) (-1, _1609) 0 ]", "EXPR [ (1, _93, _1190) (101, _190) (-1, _1610) 0 ]", "EXPR [ (1, _93, _1192) (102, _190) (-1, _1611) 0 ]", - "EXPR [ (1, _190, _766) (-1, _3308) 0 ]", - "EXPR [ (1, _93, _1194) (-1, _1612) (1, _3308) 0 ]", - "EXPR [ (1, _190, _767) (-1, _3310) 0 ]", - "EXPR [ (1, _93, _1196) (-1, _1613) (1, _3310) 0 ]", - "EXPR [ (1, _190, _768) (-1, _3312) 0 ]", - "EXPR [ (1, _93, _1198) (-1, _1614) (1, _3312) 0 ]", - "EXPR [ (1, _190, _769) (-1, _3314) 0 ]", - "EXPR [ (1, _93, _1200) (-1, _1615) (1, _3314) 0 ]", - "EXPR [ (1, _190, _770) (-1, _3316) 0 ]", - "EXPR [ (1, _93, _1202) (-1, _1616) (1, _3316) 0 ]", - "EXPR [ (1, _190, _771) (-1, _3318) 0 ]", - "EXPR [ (1, _93, _1204) (-1, _1617) (1, _3318) 0 ]", - "EXPR [ (1, _190, _772) (-1, _3320) 0 ]", - "EXPR [ (1, _93, _1206) (-1, _1618) (1, _3320) 0 ]", - "EXPR [ (1, _190, _773) (-1, _3322) 0 ]", - "EXPR [ (1, _93, _1208) (-1, _1619) (1, _3322) 0 ]", - "EXPR [ (1, _190, _774) (-1, _3324) 0 ]", - "EXPR [ (1, _93, _1210) (-1, _1620) (1, _3324) 0 ]", - "EXPR [ (1, _190, _775) (-1, _3326) 0 ]", - "EXPR [ (1, _93, _1212) (-1, _1621) (1, _3326) 0 ]", + "EXPR [ (1, _190, _766) (-1, _2970) 0 ]", + "EXPR [ (1, _93, _1194) (-1, _1612) (1, _2970) 0 ]", + "EXPR [ (1, _190, _767) (-1, _2972) 0 ]", + "EXPR [ (1, _93, _1196) (-1, _1613) (1, _2972) 0 ]", + "EXPR [ (1, _190, _768) (-1, _2974) 0 ]", + "EXPR [ (1, _93, _1198) (-1, _1614) (1, _2974) 0 ]", + "EXPR [ (1, _190, _769) (-1, _2976) 0 ]", + "EXPR [ (1, _93, _1200) (-1, _1615) (1, _2976) 0 ]", + "EXPR [ (1, _190, _770) (-1, _2978) 0 ]", + "EXPR [ (1, _93, _1202) (-1, _1616) (1, _2978) 0 ]", + "EXPR [ (1, _190, _771) (-1, _2980) 0 ]", + "EXPR [ (1, _93, _1204) (-1, _1617) (1, _2980) 0 ]", + "EXPR [ (1, _190, _772) (-1, _2982) 0 ]", + "EXPR [ (1, _93, _1206) (-1, _1618) (1, _2982) 0 ]", + "EXPR [ (1, _190, _773) (-1, _2984) 0 ]", + "EXPR [ (1, _93, _1208) (-1, _1619) (1, _2984) 0 ]", + "EXPR [ (1, _190, _774) (-1, _2986) 0 ]", + "EXPR [ (1, _93, _1210) (-1, _1620) (1, _2986) 0 ]", + "EXPR [ (1, _190, _775) (-1, _2988) 0 ]", + "EXPR [ (1, _93, _1212) (-1, _1621) (1, _2988) 0 ]", "EXPR [ (2, _190) (-1, _1622) 0 ]", "MEM (id: 31, read at: EXPR [ (1, _1622) 0 ], value: EXPR [ (1, _1623) 0 ]) ", "MEM (id: 19, read at: EXPR [ (1, _1623) 0 ], value: EXPR [ (1, _1624) 0 ]) ", @@ -1957,34 +1957,34 @@ expression: artifact "MEM (id: 19, read at: EXPR [ (1, _1685) 0 ], value: EXPR [ (1, _1686) 0 ]) ", "EXPR [ (1, _1685) (-1, _1687) 1 ]", "MEM (id: 19, read at: EXPR [ (1, _1687) 0 ], value: EXPR [ (1, _1688) 0 ]) ", - "EXPR [ (1, _93, _1222) (-1, _1689) (1, _3284) 0 ]", - "EXPR [ (1, _93, _1224) (-1, _1690) (1, _3286) 0 ]", - "EXPR [ (1, _93, _1226) (-1, _1691) (1, _3288) 0 ]", - "EXPR [ (1, _93, _1228) (-1, _1692) (1, _3290) 0 ]", - "EXPR [ (1, _93, _1230) (-1, _1693) (1, _3292) 0 ]", - "EXPR [ (1, _93, _1232) (-1, _1694) (1, _3294) 0 ]", - "EXPR [ (1, _93, _1234) (-1, _1695) (1, _3296) 0 ]", - "EXPR [ (1, _93, _1236) (-1, _1696) (1, _3298) 0 ]", + "EXPR [ (1, _93, _1222) (-1, _1689) (1, _2946) 0 ]", + "EXPR [ (1, _93, _1224) (-1, _1690) (1, _2948) 0 ]", + "EXPR [ (1, _93, _1226) (-1, _1691) (1, _2950) 0 ]", + "EXPR [ (1, _93, _1228) (-1, _1692) (1, _2952) 0 ]", + "EXPR [ (1, _93, _1230) (-1, _1693) (1, _2954) 0 ]", + "EXPR [ (1, _93, _1232) (-1, _1694) (1, _2956) 0 ]", + "EXPR [ (1, _93, _1234) (-1, _1695) (1, _2958) 0 ]", + "EXPR [ (1, _93, _1236) (-1, _1696) (1, _2960) 0 ]", "EXPR [ (1, _93, _1238) (5, _190) (-1, _1697) 0 ]", "EXPR [ (1, _93, _1240) (6, _190) (-1, _1698) 0 ]", "EXPR [ (1, _93, _1242) (21, _190) (-1, _1699) 0 ]", - "EXPR [ (1, _93, _1244) (-1, _1700) (1, _3300) 0 ]", - "EXPR [ (1, _93, _1246) (-1, _1701) (1, _3302) 0 ]", - "EXPR [ (1, _93, _1248) (-1, _1702) (1, _3304) 0 ]", - "EXPR [ (1, _93, _1250) (-1, _1703) (1, _3306) 0 ]", + "EXPR [ (1, _93, _1244) (-1, _1700) (1, _2962) 0 ]", + "EXPR [ (1, _93, _1246) (-1, _1701) (1, _2964) 0 ]", + "EXPR [ (1, _93, _1248) (-1, _1702) (1, _2966) 0 ]", + "EXPR [ (1, _93, _1250) (-1, _1703) (1, _2968) 0 ]", "EXPR [ (1, _93, _1252) (100, _190) (-1, _1704) 0 ]", "EXPR [ (1, _93, _1254) (101, _190) (-1, _1705) 0 ]", "EXPR [ (1, _93, _1256) (102, _190) (-1, _1706) 0 ]", - "EXPR [ (1, _93, _1258) (-1, _1707) (1, _3308) 0 ]", - "EXPR [ (1, _93, _1260) (-1, _1708) (1, _3310) 0 ]", - "EXPR [ (1, _93, _1262) (-1, _1709) (1, _3312) 0 ]", - "EXPR [ (1, _93, _1264) (-1, _1710) (1, _3314) 0 ]", - "EXPR [ (1, _93, _1266) (-1, _1711) (1, _3316) 0 ]", - "EXPR [ (1, _93, _1268) (-1, _1712) (1, _3318) 0 ]", - "EXPR [ (1, _93, _1270) (-1, _1713) (1, _3320) 0 ]", - "EXPR [ (1, _93, _1272) (-1, _1714) (1, _3322) 0 ]", - "EXPR [ (1, _93, _1274) (-1, _1715) (1, _3324) 0 ]", - "EXPR [ (1, _93, _1276) (-1, _1716) (1, _3326) 0 ]", + "EXPR [ (1, _93, _1258) (-1, _1707) (1, _2970) 0 ]", + "EXPR [ (1, _93, _1260) (-1, _1708) (1, _2972) 0 ]", + "EXPR [ (1, _93, _1262) (-1, _1709) (1, _2974) 0 ]", + "EXPR [ (1, _93, _1264) (-1, _1710) (1, _2976) 0 ]", + "EXPR [ (1, _93, _1266) (-1, _1711) (1, _2978) 0 ]", + "EXPR [ (1, _93, _1268) (-1, _1712) (1, _2980) 0 ]", + "EXPR [ (1, _93, _1270) (-1, _1713) (1, _2982) 0 ]", + "EXPR [ (1, _93, _1272) (-1, _1714) (1, _2984) 0 ]", + "EXPR [ (1, _93, _1274) (-1, _1715) (1, _2986) 0 ]", + "EXPR [ (1, _93, _1276) (-1, _1716) (1, _2988) 0 ]", "EXPR [ (1, _93, _1697) (1, _190, _1650) -20 ]", "EXPR [ (1, _93, _1698) (1, _190, _1652) -19 ]", "EXPR [ (1, _93, _1699) (1, _190, _1654) -18 ]", @@ -2874,14 +2874,14 @@ expression: artifact "MEM (id: 40, read at: EXPR [ (1, _120) 0 ], value: EXPR [ (1, _2504) 0 ]) ", "MEM (id: 40, read at: EXPR [ (1, _32) 0 ], value: EXPR [ (1, _2505) 0 ]) ", "INIT (id: 45, len: 5, witnesses: [_2501, _2502, _2503, _2504, _2505])", - "MEM (id: 45, read at: EXPR [ (1, _30) 0 ], value: EXPR [ (1, _2506) 0 ]) ", - "MEM (id: 39, read at: EXPR [ (1, _2506) 0 ], value: EXPR [ (1, _2507) 0 ]) ", - "EXPR [ (1, _2506) (-1, _2508) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2508) 0 ], value: EXPR [ (1, _2509) 0 ]) ", - "EXPR [ (1, _2508) (-1, _2510) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2510) 0 ], value: EXPR [ (1, _2511) 0 ]) ", - "EXPR [ (-1, _1718) (-1, _2512) 1 ]", - "MEM (id: 45, read at: EXPR [ (1, _2512) 0 ], value: EXPR [ (1, _2513) 0 ]) ", + "EXPR [ (-3, _1718) (-1, _2506) 3 ]", + "MEM (id: 45, read at: EXPR [ (1, _2506) 0 ], value: EXPR [ (1, _2507) 0 ]) ", + "MEM (id: 39, read at: EXPR [ (1, _2507) 0 ], value: EXPR [ (1, _2508) 0 ]) ", + "EXPR [ (1, _2507) (-1, _2509) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2509) 0 ], value: EXPR [ (1, _2510) 0 ]) ", + "EXPR [ (1, _2509) (-1, _2511) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2511) 0 ], value: EXPR [ (1, _2512) 0 ]) ", + "EXPR [ (1, _2511) (-1, _2513) 1 ]", "MEM (id: 39, read at: EXPR [ (1, _2513) 0 ], value: EXPR [ (1, _2514) 0 ]) ", "EXPR [ (1, _2513) (-1, _2515) 1 ]", "MEM (id: 39, read at: EXPR [ (1, _2515) 0 ], value: EXPR [ (1, _2516) 0 ]) ", @@ -2931,395 +2931,14 @@ expression: artifact "MEM (id: 39, read at: EXPR [ (1, _2559) 0 ], value: EXPR [ (1, _2560) 0 ]) ", "EXPR [ (1, _2559) (-1, _2561) 1 ]", "MEM (id: 39, read at: EXPR [ (1, _2561) 0 ], value: EXPR [ (1, _2562) 0 ]) ", - "EXPR [ (1, _2561) (-1, _2563) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2563) 0 ], value: EXPR [ (1, _2564) 0 ]) ", - "EXPR [ (1, _2563) (-1, _2565) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2565) 0 ], value: EXPR [ (1, _2566) 0 ]) ", - "EXPR [ (1, _2565) (-1, _2567) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2567) 0 ], value: EXPR [ (1, _2568) 0 ]) ", - "EXPR [ (2, _2512) (-1, _2569) 0 ]", - "MEM (id: 45, read at: EXPR [ (1, _2569) 0 ], value: EXPR [ (1, _2570) 0 ]) ", - "MEM (id: 39, read at: EXPR [ (1, _2570) 0 ], value: EXPR [ (1, _2571) 0 ]) ", - "EXPR [ (1, _2570) (-1, _2572) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2572) 0 ], value: EXPR [ (1, _2573) 0 ]) ", - "EXPR [ (1, _2572) (-1, _2574) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2574) 0 ], value: EXPR [ (1, _2575) 0 ]) ", - "EXPR [ (3, _2512) (-1, _2576) 0 ]", - "MEM (id: 45, read at: EXPR [ (1, _2576) 0 ], value: EXPR [ (1, _2577) 0 ]) ", - "MEM (id: 39, read at: EXPR [ (1, _2577) 0 ], value: EXPR [ (1, _2578) 0 ]) ", - "EXPR [ (1, _2577) (-1, _2579) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2579) 0 ], value: EXPR [ (1, _2580) 0 ]) ", - "EXPR [ (1, _2579) (-1, _2581) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2581) 0 ], value: EXPR [ (1, _2582) 0 ]) ", - "EXPR [ (1, _2581) (-1, _2583) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2583) 0 ], value: EXPR [ (1, _2584) 0 ]) ", - "EXPR [ (1, _2583) (-1, _2585) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2585) 0 ], value: EXPR [ (1, _2586) 0 ]) ", - "EXPR [ (1, _2585) (-1, _2587) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2587) 0 ], value: EXPR [ (1, _2588) 0 ]) ", - "EXPR [ (1, _2587) (-1, _2589) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2589) 0 ], value: EXPR [ (1, _2590) 0 ]) ", - "EXPR [ (1, _2589) (-1, _2591) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2591) 0 ], value: EXPR [ (1, _2592) 0 ]) ", - "EXPR [ (1, _2591) (-1, _2593) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2593) 0 ], value: EXPR [ (1, _2594) 0 ]) ", - "EXPR [ (1, _2593) (-1, _2595) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2595) 0 ], value: EXPR [ (1, _2596) 0 ]) ", - "EXPR [ (1, _2595) (-1, _2597) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2597) 0 ], value: EXPR [ (1, _2598) 0 ]) ", - "EXPR [ (1, _2597) (-1, _2599) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2599) 0 ], value: EXPR [ (1, _2600) 0 ]) ", - "EXPR [ (1, _2599) (-1, _2601) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2601) 0 ], value: EXPR [ (1, _2602) 0 ]) ", - "EXPR [ (1, _2601) (-1, _2603) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2603) 0 ], value: EXPR [ (1, _2604) 0 ]) ", - "EXPR [ (1, _2603) (-1, _2605) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2605) 0 ], value: EXPR [ (1, _2606) 0 ]) ", - "EXPR [ (1, _2605) (-1, _2607) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2607) 0 ], value: EXPR [ (1, _2608) 0 ]) ", - "EXPR [ (1, _2607) (-1, _2609) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2609) 0 ], value: EXPR [ (1, _2610) 0 ]) ", - "EXPR [ (1, _2609) (-1, _2611) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2611) 0 ], value: EXPR [ (1, _2612) 0 ]) ", - "EXPR [ (1, _2611) (-1, _2613) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2613) 0 ], value: EXPR [ (1, _2614) 0 ]) ", - "EXPR [ (1, _2613) (-1, _2615) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2615) 0 ], value: EXPR [ (1, _2616) 0 ]) ", - "EXPR [ (1, _2615) (-1, _2617) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2617) 0 ], value: EXPR [ (1, _2618) 0 ]) ", - "EXPR [ (1, _2617) (-1, _2619) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2619) 0 ], value: EXPR [ (1, _2620) 0 ]) ", - "EXPR [ (1, _2619) (-1, _2621) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2621) 0 ], value: EXPR [ (1, _2622) 0 ]) ", - "EXPR [ (1, _2621) (-1, _2623) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2623) 0 ], value: EXPR [ (1, _2624) 0 ]) ", - "EXPR [ (1, _2623) (-1, _2625) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2625) 0 ], value: EXPR [ (1, _2626) 0 ]) ", - "EXPR [ (1, _2625) (-1, _2627) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2627) 0 ], value: EXPR [ (1, _2628) 0 ]) ", - "EXPR [ (1, _2627) (-1, _2629) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2629) 0 ], value: EXPR [ (1, _2630) 0 ]) ", - "EXPR [ (1, _2629) (-1, _2631) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2631) 0 ], value: EXPR [ (1, _2632) 0 ]) ", - "EXPR [ (1, _1718, _2221) (1, _2512, _2598) -5000 ]", + "EXPR [ (1, _1718, _2221) (-1, _1718, _2528) (1, _2528) -5000 ]", "BLACKBOX::RANGE [(_53, 1)] []", - "EXPR [ (1, _1718, _2177) (-1, _1718, _2507) (1, _2507) (-1, _2633) 0 ]", - "EXPR [ (1, _1718, _2178) (-1, _1718, _2509) (1, _2509) (-1, _2634) 0 ]", - "EXPR [ (1, _1718, _2179) (-1, _1718, _2511) (1, _2511) (-1, _2635) 0 ]", - "EXPR [ (1, _1718, _2180) (1, _2512, _2514) (-1, _2636) 0 ]", - "EXPR [ (1, _1718, _2181) (1, _2512, _2516) (-1, _2637) 0 ]", - "EXPR [ (1, _1718, _2182) (1, _2512, _2518) (-1, _2638) 0 ]", - "EXPR [ (1, _1718, _2183) (1, _2512, _2520) (-1, _2639) 0 ]", - "EXPR [ (1, _1718, _2184) (1, _2512, _2522) (-1, _2640) 0 ]", - "EXPR [ (1, _1718, _2185) (1, _2512, _2524) (-1, _2641) 0 ]", - "EXPR [ (1, _1718, _2186) (1, _2512, _2526) (-1, _2642) 0 ]", - "EXPR [ (1, _1718, _2187) (1, _2512, _2528) (-1, _2643) 0 ]", - "EXPR [ (1, _1718, _2188) (1, _2512, _2530) (-1, _2644) 0 ]", - "EXPR [ (1, _1718, _2189) (1, _2512, _2532) (-1, _2645) 0 ]", - "EXPR [ (1, _1718, _2190) (1, _2512, _2534) (-1, _2646) 0 ]", - "EXPR [ (1, _1718, _2191) (1, _2512, _2536) (-1, _2647) 0 ]", - "EXPR [ (1, _1718, _2192) (1, _2512, _2538) (-1, _2648) 0 ]", - "EXPR [ (1, _1718, _2193) (1, _2512, _2540) (-1, _2649) 0 ]", - "EXPR [ (1, _1718, _2194) (1, _2512, _2542) (-1, _2650) 0 ]", - "EXPR [ (1, _1718, _2195) (1, _2512, _2544) (-1, _2651) 0 ]", - "EXPR [ (1, _1718, _2196) (1, _2512, _2546) (-1, _2652) 0 ]", - "EXPR [ (1, _1718, _2197) (1, _2512, _2548) (-1, _2653) 0 ]", - "EXPR [ (1, _1718, _2198) (1, _2512, _2550) (-1, _2654) 0 ]", - "EXPR [ (1, _1718, _2199) (1, _2512, _2552) (-1, _2655) 0 ]", - "EXPR [ (1, _1718, _2200) (1, _2512, _2554) (-1, _2656) 0 ]", - "EXPR [ (1, _1718, _2201) (1, _2512, _2556) (-1, _2657) 0 ]", - "EXPR [ (1, _1718, _2202) (1, _2512, _2558) (-1, _2658) 0 ]", - "EXPR [ (1, _1718, _2203) (1, _2512, _2560) (-1, _2659) 0 ]", - "EXPR [ (1, _1718, _2204) (1, _2512, _2562) (-1, _2660) 0 ]", - "EXPR [ (1, _1718, _2205) (1, _2512, _2564) (-1, _2661) 0 ]", - "EXPR [ (1, _1718, _2206) (1, _2512, _2566) (-1, _2662) 0 ]", - "EXPR [ (1, _1718, _2207) (1, _2512, _2568) (-1, _2663) 0 ]", - "EXPR [ (1, _1718, _2208) (1, _2512, _2571) (-1, _2664) 0 ]", - "EXPR [ (1, _1718, _2209) (1, _2512, _2573) (-1, _2665) 0 ]", - "EXPR [ (1, _1718, _2210) (1, _2512, _2575) (-1, _2666) 0 ]", - "EXPR [ (1, _1718, _2211) (1, _2512, _2578) (-1, _2667) 0 ]", - "EXPR [ (1, _1718, _2212) (1, _2512, _2580) (-1, _2668) 0 ]", - "EXPR [ (1, _1718, _2213) (1, _2512, _2582) (-1, _2669) 0 ]", - "EXPR [ (1, _1718, _2214) (1, _2512, _2584) (-1, _2670) 0 ]", - "EXPR [ (1, _1718, _2215) (1, _2512, _2586) (-1, _2671) 0 ]", - "EXPR [ (1, _1718, _2216) (1, _2512, _2588) (-1, _2672) 0 ]", - "EXPR [ (1, _1718, _2217) (1, _2512, _2590) (-1, _2673) 0 ]", - "EXPR [ (1, _1718, _2218) (1, _2512, _2592) (-1, _2674) 0 ]", - "EXPR [ (1, _1718, _2219) (1, _2512, _2594) (-1, _2675) 0 ]", - "EXPR [ (1, _1718, _2220) (1, _2512, _2596) (-1, _2676) 0 ]", - "EXPR [ (-1, _2677) 5000 ]", - "EXPR [ (1, _1718, _2222) (1, _2512, _2600) (-1, _2678) 0 ]", - "EXPR [ (1, _1718, _2223) (1, _2512, _2602) (-1, _2679) 0 ]", - "EXPR [ (1, _1718, _2224) (1, _2512, _2604) (-1, _2680) 0 ]", - "EXPR [ (1, _1718, _2225) (1, _2512, _2606) (-1, _2681) 0 ]", - "EXPR [ (1, _1718, _2226) (1, _2512, _2608) (-1, _2682) 0 ]", - "EXPR [ (1, _1718, _2227) (1, _2512, _2610) (-1, _2683) 0 ]", - "EXPR [ (1, _1718, _2228) (1, _2512, _2612) (-1, _2684) 0 ]", - "EXPR [ (1, _1718, _2229) (1, _2512, _2614) (-1, _2685) 0 ]", - "EXPR [ (1, _1718, _2230) (1, _2512, _2616) (-1, _2686) 0 ]", - "EXPR [ (1, _1718, _2231) (1, _2512, _2618) (-1, _2687) 0 ]", - "EXPR [ (1, _1718, _2232) (1, _2512, _2620) (-1, _2688) 0 ]", - "EXPR [ (1, _1718, _2233) (1, _2512, _2622) (-1, _2689) 0 ]", - "EXPR [ (1, _1718, _2234) (1, _2512, _2624) (-1, _2690) 0 ]", - "EXPR [ (1, _1718, _2235) (1, _2512, _2626) (-1, _2691) 0 ]", - "EXPR [ (1, _1718, _2236) (1, _2512, _2628) (-1, _2692) 0 ]", - "EXPR [ (1, _1718, _2237) (1, _2512, _2630) (-1, _2693) 0 ]", - "EXPR [ (1, _1718, _2238) (1, _2512, _2632) (-1, _2694) 0 ]", - "INIT (id: 46, len: 62, witnesses: [_2633, _2634, _2635, _2636, _2637, _2638, _2639, _2640, _2641, _2642, _2643, _2644, _2645, _2646, _2647, _2648, _2649, _2650, _2651, _2652, _2653, _2654, _2655, _2656, _2657, _2658, _2659, _2660, _2661, _2662, _2663, _2664, _2665, _2666, _2667, _2668, _2669, _2670, _2671, _2672, _2673, _2674, _2675, _2676, _2677, _2678, _2679, _2680, _2681, _2682, _2683, _2684, _2685, _2686, _2687, _2688, _2689, _2690, _2691, _2692, _2693, _2694])", - "INIT (id: 47, len: 5, witnesses: [_30, _120, _803, _804, _805])", - "EXPR [ (2, _53) (-1, _2695) 1 ]", - "MEM (id: 47, read at: EXPR [ (1, _2695) 0 ], value: EXPR [ (1, _2696) 0 ]) ", - "MEM (id: 46, read at: EXPR [ (1, _2696) 0 ], value: EXPR [ (1, _2697) 0 ]) ", - "EXPR [ (1, _2696) (-1, _2698) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2698) 0 ], value: EXPR [ (1, _2699) 0 ]) ", - "EXPR [ (1, _2698) (-1, _2700) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2700) 0 ], value: EXPR [ (1, _2701) 0 ]) ", - "EXPR [ (1, _2700) (-1, _2702) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2702) 0 ], value: EXPR [ (1, _2703) 0 ]) ", - "EXPR [ (1, _2702) (-1, _2704) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2704) 0 ], value: EXPR [ (1, _2705) 0 ]) ", - "EXPR [ (1, _2704) (-1, _2706) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2706) 0 ], value: EXPR [ (1, _2707) 0 ]) ", - "EXPR [ (1, _2706) (-1, _2708) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2708) 0 ], value: EXPR [ (1, _2709) 0 ]) ", - "EXPR [ (1, _2708) (-1, _2710) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2710) 0 ], value: EXPR [ (1, _2711) 0 ]) ", - "EXPR [ (1, _2710) (-1, _2712) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2712) 0 ], value: EXPR [ (1, _2713) 0 ]) ", - "EXPR [ (1, _2712) (-1, _2714) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2714) 0 ], value: EXPR [ (1, _2715) 0 ]) ", - "EXPR [ (1, _2714) (-1, _2716) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2716) 0 ], value: EXPR [ (1, _2717) 0 ]) ", - "EXPR [ (1, _2716) (-1, _2718) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2718) 0 ], value: EXPR [ (1, _2719) 0 ]) ", - "EXPR [ (1, _2718) (-1, _2720) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2720) 0 ], value: EXPR [ (1, _2721) 0 ]) ", - "EXPR [ (1, _2720) (-1, _2722) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2722) 0 ], value: EXPR [ (1, _2723) 0 ]) ", - "EXPR [ (1, _2722) (-1, _2724) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2724) 0 ], value: EXPR [ (1, _2725) 0 ]) ", - "EXPR [ (1, _2724) (-1, _2726) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2726) 0 ], value: EXPR [ (1, _2727) 0 ]) ", - "EXPR [ (1, _2726) (-1, _2728) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2728) 0 ], value: EXPR [ (1, _2729) 0 ]) ", - "EXPR [ (1, _2728) (-1, _2730) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2730) 0 ], value: EXPR [ (1, _2731) 0 ]) ", - "EXPR [ (1, _2730) (-1, _2732) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2732) 0 ], value: EXPR [ (1, _2733) 0 ]) ", - "EXPR [ (1, _2732) (-1, _2734) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2734) 0 ], value: EXPR [ (1, _2735) 0 ]) ", - "EXPR [ (1, _2734) (-1, _2736) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2736) 0 ], value: EXPR [ (1, _2737) 0 ]) ", - "EXPR [ (1, _2736) (-1, _2738) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2738) 0 ], value: EXPR [ (1, _2739) 0 ]) ", - "EXPR [ (1, _2738) (-1, _2740) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2740) 0 ], value: EXPR [ (1, _2741) 0 ]) ", - "EXPR [ (1, _2740) (-1, _2742) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2742) 0 ], value: EXPR [ (1, _2743) 0 ]) ", - "EXPR [ (1, _2742) (-1, _2744) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2744) 0 ], value: EXPR [ (1, _2745) 0 ]) ", - "EXPR [ (1, _2744) (-1, _2746) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2746) 0 ], value: EXPR [ (1, _2747) 0 ]) ", - "EXPR [ (1, _2746) (-1, _2748) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2748) 0 ], value: EXPR [ (1, _2749) 0 ]) ", - "EXPR [ (1, _2748) (-1, _2750) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2750) 0 ], value: EXPR [ (1, _2751) 0 ]) ", - "INIT (id: 48, len: 28, witnesses: [_2697, _2699, _2701, _2703, _2705, _2707, _2709, _2711, _2713, _2715, _2717, _2719, _2721, _2723, _2725, _2727, _2729, _2731, _2733, _2735, _2737, _2739, _2741, _2743, _2745, _2747, _2749, _2751])", - "INIT (id: 49, len: 13, witnesses: [_30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42])", - "MEM (id: 49, read at: EXPR [ (1, _57) 0 ], value: EXPR [ (1, _2752) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _2752) 0 ], value: EXPR [ (1, _2753) 0 ]) ", - "EXPR [ (1, _2752) (-1, _2754) 1 ]", - "MEM (id: 48, read at: EXPR [ (1, _2754) 0 ], value: EXPR [ (1, _2755) 0 ]) ", - "EXPR [ (1, _2754) (-1, _2756) 1 ]", - "MEM (id: 48, read at: EXPR [ (1, _2756) 0 ], value: EXPR [ (1, _2757) 0 ]) ", - "MEM (id: 49, read at: EXPR [ (1, _776) 0 ], value: EXPR [ (1, _2758) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _2758) 0 ], value: EXPR [ (1, _2759) 0 ]) ", - "EXPR [ (1, _2758) (-1, _2760) 1 ]", - "MEM (id: 48, read at: EXPR [ (1, _2760) 0 ], value: EXPR [ (1, _2761) 0 ]) ", - "EXPR [ (1, _2760) (-1, _2762) 1 ]", - "MEM (id: 48, read at: EXPR [ (1, _2762) 0 ], value: EXPR [ (1, _2763) 0 ]) ", - "MEM (id: 49, read at: EXPR [ (1, _46) 0 ], value: EXPR [ (1, _2764) 0 ]) ", - "MEM (id: 48, write EXPR [ (1, _2753) 0 ] at: EXPR [ (1, _2764) 0 ]) ", - "EXPR [ (1, _2764) (-1, _2765) 1 ]", - "MEM (id: 48, write EXPR [ (1, _2755) 0 ] at: EXPR [ (1, _2765) 0 ]) ", - "EXPR [ (1, _2765) (-1, _2766) 1 ]", - "MEM (id: 48, write EXPR [ (1, _2757) 0 ] at: EXPR [ (1, _2766) 0 ]) ", - "MEM (id: 49, read at: EXPR [ (1, _30) 0 ], value: EXPR [ (1, _2767) 0 ]) ", - "MEM (id: 49, read at: EXPR [ (1, _31) 0 ], value: EXPR [ (1, _2768) 0 ]) ", - "MEM (id: 49, read at: EXPR [ (1, _118) 0 ], value: EXPR [ (1, _2769) 0 ]) ", - "MEM (id: 49, read at: EXPR [ (1, _120) 0 ], value: EXPR [ (1, _2770) 0 ]) ", - "MEM (id: 49, read at: EXPR [ (1, _32) 0 ], value: EXPR [ (1, _2771) 0 ]) ", - "MEM (id: 49, read at: EXPR [ (1, _123) 0 ], value: EXPR [ (1, _2772) 0 ]) ", - "MEM (id: 49, read at: EXPR [ (1, _125) 0 ], value: EXPR [ (1, _2773) 0 ]) ", - "MEM (id: 49, read at: EXPR [ (1, _33) 0 ], value: EXPR [ (1, _2774) 0 ]) ", - "MEM (id: 49, read at: EXPR [ (1, _34) 0 ], value: EXPR [ (1, _2775) 0 ]) ", - "MEM (id: 49, read at: EXPR [ (1, _129) 0 ], value: EXPR [ (1, _2776) 0 ]) ", - "MEM (id: 49, read at: EXPR [ (1, _131) 0 ], value: EXPR [ (1, _2777) 0 ]) ", - "MEM (id: 49, read at: EXPR [ (1, _35) 0 ], value: EXPR [ (1, _2778) 0 ]) ", - "MEM (id: 49, read at: EXPR [ (1, _134) 0 ], value: EXPR [ (1, _2779) 0 ]) ", - "INIT (id: 50, len: 13, witnesses: [_2767, _2768, _2769, _2770, _2771, _2772, _2773, _2774, _2775, _2776, _2777, _2778, _2779])", - "EXPR [ (1, _46) (-1, _2780) 1 ]", - "MEM (id: 50, read at: EXPR [ (1, _2780) 0 ], value: EXPR [ (1, _2781) 0 ]) ", - "MEM (id: 48, write EXPR [ (1, _2759) 0 ] at: EXPR [ (1, _2781) 0 ]) ", - "EXPR [ (1, _2781) (-1, _2782) 1 ]", - "MEM (id: 48, write EXPR [ (1, _2761) 0 ] at: EXPR [ (1, _2782) 0 ]) ", - "EXPR [ (1, _2782) (-1, _2783) 1 ]", - "MEM (id: 48, write EXPR [ (1, _2763) 0 ] at: EXPR [ (1, _2783) 0 ]) ", - "MEM (id: 47, read at: EXPR [ (1, _2695) 0 ], value: EXPR [ (1, _2784) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _30) 0 ], value: EXPR [ (1, _2785) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _31) 0 ], value: EXPR [ (1, _2786) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _118) 0 ], value: EXPR [ (1, _2787) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _120) 0 ], value: EXPR [ (1, _2788) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _32) 0 ], value: EXPR [ (1, _2789) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _123) 0 ], value: EXPR [ (1, _2790) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _125) 0 ], value: EXPR [ (1, _2791) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _33) 0 ], value: EXPR [ (1, _2792) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _34) 0 ], value: EXPR [ (1, _2793) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _129) 0 ], value: EXPR [ (1, _2794) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _131) 0 ], value: EXPR [ (1, _2795) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _35) 0 ], value: EXPR [ (1, _2796) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _134) 0 ], value: EXPR [ (1, _2797) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _1067) 0 ], value: EXPR [ (1, _2798) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _36) 0 ], value: EXPR [ (1, _2799) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _37) 0 ], value: EXPR [ (1, _2800) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _1071) 0 ], value: EXPR [ (1, _2801) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _1073) 0 ], value: EXPR [ (1, _2802) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _38) 0 ], value: EXPR [ (1, _2803) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _1076) 0 ], value: EXPR [ (1, _2804) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _1078) 0 ], value: EXPR [ (1, _2805) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _39) 0 ], value: EXPR [ (1, _2806) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _40) 0 ], value: EXPR [ (1, _2807) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _1082) 0 ], value: EXPR [ (1, _2808) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _1084) 0 ], value: EXPR [ (1, _2809) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _41) 0 ], value: EXPR [ (1, _2810) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _1087) 0 ], value: EXPR [ (1, _2811) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _1089) 0 ], value: EXPR [ (1, _2812) 0 ]) ", - "MEM (id: 46, write EXPR [ (1, _2785) 0 ] at: EXPR [ (1, _2784) 0 ]) ", - "EXPR [ (1, _2784) (-1, _2813) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2786) 0 ] at: EXPR [ (1, _2813) 0 ]) ", - "EXPR [ (1, _2813) (-1, _2814) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2787) 0 ] at: EXPR [ (1, _2814) 0 ]) ", - "EXPR [ (1, _2814) (-1, _2815) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2788) 0 ] at: EXPR [ (1, _2815) 0 ]) ", - "EXPR [ (1, _2815) (-1, _2816) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2789) 0 ] at: EXPR [ (1, _2816) 0 ]) ", - "EXPR [ (1, _2816) (-1, _2817) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2790) 0 ] at: EXPR [ (1, _2817) 0 ]) ", - "EXPR [ (1, _2817) (-1, _2818) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2791) 0 ] at: EXPR [ (1, _2818) 0 ]) ", - "EXPR [ (1, _2818) (-1, _2819) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2792) 0 ] at: EXPR [ (1, _2819) 0 ]) ", - "EXPR [ (1, _2819) (-1, _2820) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2793) 0 ] at: EXPR [ (1, _2820) 0 ]) ", - "EXPR [ (1, _2820) (-1, _2821) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2794) 0 ] at: EXPR [ (1, _2821) 0 ]) ", - "EXPR [ (1, _2821) (-1, _2822) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2795) 0 ] at: EXPR [ (1, _2822) 0 ]) ", - "EXPR [ (1, _2822) (-1, _2823) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2796) 0 ] at: EXPR [ (1, _2823) 0 ]) ", - "EXPR [ (1, _2823) (-1, _2824) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2797) 0 ] at: EXPR [ (1, _2824) 0 ]) ", - "EXPR [ (1, _2824) (-1, _2825) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2798) 0 ] at: EXPR [ (1, _2825) 0 ]) ", - "EXPR [ (1, _2825) (-1, _2826) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2799) 0 ] at: EXPR [ (1, _2826) 0 ]) ", - "EXPR [ (1, _2826) (-1, _2827) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2800) 0 ] at: EXPR [ (1, _2827) 0 ]) ", - "EXPR [ (1, _2827) (-1, _2828) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2801) 0 ] at: EXPR [ (1, _2828) 0 ]) ", - "EXPR [ (1, _2828) (-1, _2829) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2802) 0 ] at: EXPR [ (1, _2829) 0 ]) ", - "EXPR [ (1, _2829) (-1, _2830) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2803) 0 ] at: EXPR [ (1, _2830) 0 ]) ", - "EXPR [ (1, _2830) (-1, _2831) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2804) 0 ] at: EXPR [ (1, _2831) 0 ]) ", - "EXPR [ (1, _2831) (-1, _2832) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2805) 0 ] at: EXPR [ (1, _2832) 0 ]) ", - "EXPR [ (1, _2832) (-1, _2833) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2806) 0 ] at: EXPR [ (1, _2833) 0 ]) ", - "EXPR [ (1, _2833) (-1, _2834) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2807) 0 ] at: EXPR [ (1, _2834) 0 ]) ", - "EXPR [ (1, _2834) (-1, _2835) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2808) 0 ] at: EXPR [ (1, _2835) 0 ]) ", - "EXPR [ (1, _2835) (-1, _2836) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2809) 0 ] at: EXPR [ (1, _2836) 0 ]) ", - "EXPR [ (1, _2836) (-1, _2837) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2810) 0 ] at: EXPR [ (1, _2837) 0 ]) ", - "EXPR [ (1, _2837) (-1, _2838) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2811) 0 ] at: EXPR [ (1, _2838) 0 ]) ", - "EXPR [ (1, _2838) (-1, _2839) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2812) 0 ] at: EXPR [ (1, _2839) 0 ]) ", - "MEM (id: 47, read at: EXPR [ (1, _30) 0 ], value: EXPR [ (1, _2840) 0 ]) ", - "MEM (id: 47, read at: EXPR [ (1, _31) 0 ], value: EXPR [ (1, _2841) 0 ]) ", - "MEM (id: 47, read at: EXPR [ (1, _118) 0 ], value: EXPR [ (1, _2842) 0 ]) ", - "MEM (id: 47, read at: EXPR [ (1, _120) 0 ], value: EXPR [ (1, _2843) 0 ]) ", - "MEM (id: 47, read at: EXPR [ (1, _32) 0 ], value: EXPR [ (1, _2844) 0 ]) ", - "INIT (id: 51, len: 5, witnesses: [_2840, _2841, _2842, _2843, _2844])", - "MEM (id: 51, read at: EXPR [ (1, _120) 0 ], value: EXPR [ (1, _2845) 0 ]) ", - "MEM (id: 46, read at: EXPR [ (1, _2845) 0 ], value: EXPR [ (1, _2846) 0 ]) ", - "EXPR [ (1, _2845) (-1, _2847) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2847) 0 ], value: EXPR [ (1, _2848) 0 ]) ", - "EXPR [ (1, _2847) (-1, _2849) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2849) 0 ], value: EXPR [ (1, _2850) 0 ]) ", - "EXPR [ (1, _2849) (-1, _2851) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2851) 0 ], value: EXPR [ (1, _2852) 0 ]) ", - "EXPR [ (1, _2851) (-1, _2853) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2853) 0 ], value: EXPR [ (1, _2854) 0 ]) ", - "EXPR [ (1, _2853) (-1, _2855) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2855) 0 ], value: EXPR [ (1, _2856) 0 ]) ", - "EXPR [ (1, _2855) (-1, _2857) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2857) 0 ], value: EXPR [ (1, _2858) 0 ]) ", - "EXPR [ (1, _2857) (-1, _2859) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2859) 0 ], value: EXPR [ (1, _2860) 0 ]) ", - "EXPR [ (1, _2859) (-1, _2861) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2861) 0 ], value: EXPR [ (1, _2862) 0 ]) ", - "EXPR [ (1, _2861) (-1, _2863) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2863) 0 ], value: EXPR [ (1, _2864) 0 ]) ", - "EXPR [ (1, _2863) (-1, _2865) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2865) 0 ], value: EXPR [ (1, _2866) 0 ]) ", - "EXPR [ (1, _2865) (-1, _2867) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2867) 0 ], value: EXPR [ (1, _2868) 0 ]) ", - "EXPR [ (1, _2867) (-1, _2869) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2869) 0 ], value: EXPR [ (1, _2870) 0 ]) ", - "EXPR [ (1, _2869) (-1, _2871) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2871) 0 ], value: EXPR [ (1, _2872) 0 ]) ", - "EXPR [ (1, _2871) (-1, _2873) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2873) 0 ], value: EXPR [ (1, _2874) 0 ]) ", - "EXPR [ (1, _2873) (-1, _2875) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2875) 0 ], value: EXPR [ (1, _2876) 0 ]) ", - "EXPR [ (1, _2875) (-1, _2877) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2877) 0 ], value: EXPR [ (1, _2878) 0 ]) ", - "EXPR [ (1, _2877) (-1, _2879) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2879) 0 ], value: EXPR [ (1, _2880) 0 ]) ", - "EXPR [ (1, _2879) (-1, _2881) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2881) 0 ], value: EXPR [ (1, _2882) 0 ]) ", - "EXPR [ (1, _2881) (-1, _2883) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2883) 0 ], value: EXPR [ (1, _2884) 0 ]) ", - "EXPR [ (1, _2883) (-1, _2885) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2885) 0 ], value: EXPR [ (1, _2886) 0 ]) ", - "EXPR [ (1, _2885) (-1, _2887) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2887) 0 ], value: EXPR [ (1, _2888) 0 ]) ", - "EXPR [ (1, _2887) (-1, _2889) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2889) 0 ], value: EXPR [ (1, _2890) 0 ]) ", - "EXPR [ (1, _2889) (-1, _2891) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2891) 0 ], value: EXPR [ (1, _2892) 0 ]) ", - "EXPR [ (1, _2891) (-1, _2893) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2893) 0 ], value: EXPR [ (1, _2894) 0 ]) ", - "EXPR [ (1, _2893) (-1, _2895) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2895) 0 ], value: EXPR [ (1, _2896) 0 ]) ", - "EXPR [ (1, _2895) (-1, _2897) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2897) 0 ], value: EXPR [ (1, _2898) 0 ]) ", - "EXPR [ (1, _2897) (-1, _2899) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2899) 0 ], value: EXPR [ (1, _2900) 0 ]) ", - "EXPR [ (1, _2848) -20 ]", - "EXPR [ (1, _2850) -19 ]", - "EXPR [ (1, _2852) -5000 ]", "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) } }]", "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": { "50": { "source": "struct Bar {\n inner: [Field; 3],\n}\n\nstruct Foo {\n a: Field,\n b: [Field; 3],\n bar: Bar,\n}\n\nstruct FooParent {\n array: [Field; 3],\n foos: [Foo; 4],\n}\n\nfn main(mut x: [Foo; 4], y: pub u32) {\n assert(x[y - 3].a == 1);\n assert(x[y - 3].b == [2, 3, 20]);\n assert(x[y - 2].a == 4);\n assert(x[y - 2].b == [5, 6, 21]);\n assert(x[y - 1].a == 7);\n assert(x[y - 1].b == [8, 9, 22]);\n assert(x[y].a == 10);\n assert(x[y].b == [11, 12, 23]);\n assert(x[y].bar.inner == [109, 110, 111]);\n // Check dynamic array set\n if y != 2 {\n x[y].a = 50;\n } else {\n x[y].a = 100;\n }\n assert(x[3].a == 50);\n\n if y == 2 {\n x[y - 1].b = [50, 51, 52];\n } else {\n x[y - 1].b = [100, 101, 102];\n }\n assert(x[2].b == [100, 101, 102]);\n\n assert(x[y - 3].bar.inner == [100, 101, 102]);\n assert(x[y - 2].bar.inner == [103, 104, 105]);\n assert(x[y - 1].bar.inner == [106, 107, 108]);\n assert(x[y].bar.inner == [109, 110, 111]);\n\n let foo_parent_one = FooParent { array: [0, 1, 2], foos: x };\n let foo_parent_two = FooParent { array: [3, 4, 5], foos: x };\n let mut foo_parents = [foo_parent_one, foo_parent_two];\n\n assert(foo_parents[y - 3].foos[y - 3].b == [2, 3, 20]);\n assert(foo_parents[y - 3].foos[y - 2].b == [5, 6, 21]);\n assert(foo_parents[y - 3].foos[y - 1].b == [100, 101, 102]);\n assert(foo_parents[y - 3].foos[y].b == [11, 12, 23]);\n\n assert(foo_parents[y - 3].foos[y].a == 50);\n\n assert(foo_parents[1].foos[1].b == [5, 6, 21]);\n if y == 2 {\n foo_parents[y - 2].foos[y - 2].b = [10, 9, 8];\n } else {\n foo_parents[y - 2].foos[y - 2].b = [20, 19, 18];\n }\n assert(foo_parents[1].foos[1].b == [20, 19, 18]);\n\n assert(foo_parents[1].foos[1].b[2] == 18);\n if y == 3 {\n foo_parents[y - 2].foos[y - 2].b[y - 1] = 5000;\n } else {\n foo_parents[y - 2].foos[y - 2].b[y - 1] = 1000;\n }\n assert(foo_parents[1].foos[1].b[2] == 5000);\n // Set a dynamic array value\n foo_parents[y - 2].foos[y - 3].b = foo_parents[y - 2].foos[y - 2].b;\n assert(foo_parents[1].foos[0].b == [20, 19, 5000]);\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_false_inliner_0.snap index 50b77b14496..19a8103bb78 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_false_inliner_0.snap @@ -80,7 +80,7 @@ expression: artifact }, "bytecode": [ "func 0", - "current witness index : _3326", + "current witness index : _2988", "private parameters indices : [_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27]", "public parameters indices : [_28]", "return value indices : []", @@ -1840,56 +1840,56 @@ expression: artifact "MEM (id: 19, read at: EXPR [ (1, _1590) 0 ], value: EXPR [ (1, _1591) 0 ]) ", "EXPR [ (1, _1590) (-1, _1592) 1 ]", "MEM (id: 19, read at: EXPR [ (1, _1592) 0 ], value: EXPR [ (1, _1593) 0 ]) ", - "EXPR [ (1, _190, _748) (-1, _3284) 0 ]", - "EXPR [ (1, _93, _1158) (-1, _1594) (1, _3284) 0 ]", - "EXPR [ (1, _190, _749) (-1, _3286) 0 ]", - "EXPR [ (1, _93, _1160) (-1, _1595) (1, _3286) 0 ]", - "EXPR [ (1, _190, _750) (-1, _3288) 0 ]", - "EXPR [ (1, _93, _1162) (-1, _1596) (1, _3288) 0 ]", - "EXPR [ (1, _190, _751) (-1, _3290) 0 ]", - "EXPR [ (1, _93, _1164) (-1, _1597) (1, _3290) 0 ]", - "EXPR [ (1, _190, _752) (-1, _3292) 0 ]", - "EXPR [ (1, _93, _1166) (-1, _1598) (1, _3292) 0 ]", - "EXPR [ (1, _190, _753) (-1, _3294) 0 ]", - "EXPR [ (1, _93, _1168) (-1, _1599) (1, _3294) 0 ]", - "EXPR [ (1, _190, _754) (-1, _3296) 0 ]", - "EXPR [ (1, _93, _1170) (-1, _1600) (1, _3296) 0 ]", - "EXPR [ (1, _190, _755) (-1, _3298) 0 ]", - "EXPR [ (1, _93, _1172) (-1, _1601) (1, _3298) 0 ]", + "EXPR [ (1, _190, _748) (-1, _2946) 0 ]", + "EXPR [ (1, _93, _1158) (-1, _1594) (1, _2946) 0 ]", + "EXPR [ (1, _190, _749) (-1, _2948) 0 ]", + "EXPR [ (1, _93, _1160) (-1, _1595) (1, _2948) 0 ]", + "EXPR [ (1, _190, _750) (-1, _2950) 0 ]", + "EXPR [ (1, _93, _1162) (-1, _1596) (1, _2950) 0 ]", + "EXPR [ (1, _190, _751) (-1, _2952) 0 ]", + "EXPR [ (1, _93, _1164) (-1, _1597) (1, _2952) 0 ]", + "EXPR [ (1, _190, _752) (-1, _2954) 0 ]", + "EXPR [ (1, _93, _1166) (-1, _1598) (1, _2954) 0 ]", + "EXPR [ (1, _190, _753) (-1, _2956) 0 ]", + "EXPR [ (1, _93, _1168) (-1, _1599) (1, _2956) 0 ]", + "EXPR [ (1, _190, _754) (-1, _2958) 0 ]", + "EXPR [ (1, _93, _1170) (-1, _1600) (1, _2958) 0 ]", + "EXPR [ (1, _190, _755) (-1, _2960) 0 ]", + "EXPR [ (1, _93, _1172) (-1, _1601) (1, _2960) 0 ]", "EXPR [ (1, _93, _1174) (5, _190) (-1, _1602) 0 ]", "EXPR [ (1, _93, _1176) (6, _190) (-1, _1603) 0 ]", "EXPR [ (1, _93, _1178) (21, _190) (-1, _1604) 0 ]", - "EXPR [ (1, _190, _759) (-1, _3300) 0 ]", - "EXPR [ (1, _93, _1180) (-1, _1605) (1, _3300) 0 ]", - "EXPR [ (1, _190, _760) (-1, _3302) 0 ]", - "EXPR [ (1, _93, _1182) (-1, _1606) (1, _3302) 0 ]", - "EXPR [ (1, _190, _761) (-1, _3304) 0 ]", - "EXPR [ (1, _93, _1184) (-1, _1607) (1, _3304) 0 ]", - "EXPR [ (1, _190, _762) (-1, _3306) 0 ]", - "EXPR [ (1, _93, _1186) (-1, _1608) (1, _3306) 0 ]", + "EXPR [ (1, _190, _759) (-1, _2962) 0 ]", + "EXPR [ (1, _93, _1180) (-1, _1605) (1, _2962) 0 ]", + "EXPR [ (1, _190, _760) (-1, _2964) 0 ]", + "EXPR [ (1, _93, _1182) (-1, _1606) (1, _2964) 0 ]", + "EXPR [ (1, _190, _761) (-1, _2966) 0 ]", + "EXPR [ (1, _93, _1184) (-1, _1607) (1, _2966) 0 ]", + "EXPR [ (1, _190, _762) (-1, _2968) 0 ]", + "EXPR [ (1, _93, _1186) (-1, _1608) (1, _2968) 0 ]", "EXPR [ (1, _93, _1188) (100, _190) (-1, _1609) 0 ]", "EXPR [ (1, _93, _1190) (101, _190) (-1, _1610) 0 ]", "EXPR [ (1, _93, _1192) (102, _190) (-1, _1611) 0 ]", - "EXPR [ (1, _190, _766) (-1, _3308) 0 ]", - "EXPR [ (1, _93, _1194) (-1, _1612) (1, _3308) 0 ]", - "EXPR [ (1, _190, _767) (-1, _3310) 0 ]", - "EXPR [ (1, _93, _1196) (-1, _1613) (1, _3310) 0 ]", - "EXPR [ (1, _190, _768) (-1, _3312) 0 ]", - "EXPR [ (1, _93, _1198) (-1, _1614) (1, _3312) 0 ]", - "EXPR [ (1, _190, _769) (-1, _3314) 0 ]", - "EXPR [ (1, _93, _1200) (-1, _1615) (1, _3314) 0 ]", - "EXPR [ (1, _190, _770) (-1, _3316) 0 ]", - "EXPR [ (1, _93, _1202) (-1, _1616) (1, _3316) 0 ]", - "EXPR [ (1, _190, _771) (-1, _3318) 0 ]", - "EXPR [ (1, _93, _1204) (-1, _1617) (1, _3318) 0 ]", - "EXPR [ (1, _190, _772) (-1, _3320) 0 ]", - "EXPR [ (1, _93, _1206) (-1, _1618) (1, _3320) 0 ]", - "EXPR [ (1, _190, _773) (-1, _3322) 0 ]", - "EXPR [ (1, _93, _1208) (-1, _1619) (1, _3322) 0 ]", - "EXPR [ (1, _190, _774) (-1, _3324) 0 ]", - "EXPR [ (1, _93, _1210) (-1, _1620) (1, _3324) 0 ]", - "EXPR [ (1, _190, _775) (-1, _3326) 0 ]", - "EXPR [ (1, _93, _1212) (-1, _1621) (1, _3326) 0 ]", + "EXPR [ (1, _190, _766) (-1, _2970) 0 ]", + "EXPR [ (1, _93, _1194) (-1, _1612) (1, _2970) 0 ]", + "EXPR [ (1, _190, _767) (-1, _2972) 0 ]", + "EXPR [ (1, _93, _1196) (-1, _1613) (1, _2972) 0 ]", + "EXPR [ (1, _190, _768) (-1, _2974) 0 ]", + "EXPR [ (1, _93, _1198) (-1, _1614) (1, _2974) 0 ]", + "EXPR [ (1, _190, _769) (-1, _2976) 0 ]", + "EXPR [ (1, _93, _1200) (-1, _1615) (1, _2976) 0 ]", + "EXPR [ (1, _190, _770) (-1, _2978) 0 ]", + "EXPR [ (1, _93, _1202) (-1, _1616) (1, _2978) 0 ]", + "EXPR [ (1, _190, _771) (-1, _2980) 0 ]", + "EXPR [ (1, _93, _1204) (-1, _1617) (1, _2980) 0 ]", + "EXPR [ (1, _190, _772) (-1, _2982) 0 ]", + "EXPR [ (1, _93, _1206) (-1, _1618) (1, _2982) 0 ]", + "EXPR [ (1, _190, _773) (-1, _2984) 0 ]", + "EXPR [ (1, _93, _1208) (-1, _1619) (1, _2984) 0 ]", + "EXPR [ (1, _190, _774) (-1, _2986) 0 ]", + "EXPR [ (1, _93, _1210) (-1, _1620) (1, _2986) 0 ]", + "EXPR [ (1, _190, _775) (-1, _2988) 0 ]", + "EXPR [ (1, _93, _1212) (-1, _1621) (1, _2988) 0 ]", "EXPR [ (2, _190) (-1, _1622) 0 ]", "MEM (id: 31, read at: EXPR [ (1, _1622) 0 ], value: EXPR [ (1, _1623) 0 ]) ", "MEM (id: 19, read at: EXPR [ (1, _1623) 0 ], value: EXPR [ (1, _1624) 0 ]) ", @@ -1957,34 +1957,34 @@ expression: artifact "MEM (id: 19, read at: EXPR [ (1, _1685) 0 ], value: EXPR [ (1, _1686) 0 ]) ", "EXPR [ (1, _1685) (-1, _1687) 1 ]", "MEM (id: 19, read at: EXPR [ (1, _1687) 0 ], value: EXPR [ (1, _1688) 0 ]) ", - "EXPR [ (1, _93, _1222) (-1, _1689) (1, _3284) 0 ]", - "EXPR [ (1, _93, _1224) (-1, _1690) (1, _3286) 0 ]", - "EXPR [ (1, _93, _1226) (-1, _1691) (1, _3288) 0 ]", - "EXPR [ (1, _93, _1228) (-1, _1692) (1, _3290) 0 ]", - "EXPR [ (1, _93, _1230) (-1, _1693) (1, _3292) 0 ]", - "EXPR [ (1, _93, _1232) (-1, _1694) (1, _3294) 0 ]", - "EXPR [ (1, _93, _1234) (-1, _1695) (1, _3296) 0 ]", - "EXPR [ (1, _93, _1236) (-1, _1696) (1, _3298) 0 ]", + "EXPR [ (1, _93, _1222) (-1, _1689) (1, _2946) 0 ]", + "EXPR [ (1, _93, _1224) (-1, _1690) (1, _2948) 0 ]", + "EXPR [ (1, _93, _1226) (-1, _1691) (1, _2950) 0 ]", + "EXPR [ (1, _93, _1228) (-1, _1692) (1, _2952) 0 ]", + "EXPR [ (1, _93, _1230) (-1, _1693) (1, _2954) 0 ]", + "EXPR [ (1, _93, _1232) (-1, _1694) (1, _2956) 0 ]", + "EXPR [ (1, _93, _1234) (-1, _1695) (1, _2958) 0 ]", + "EXPR [ (1, _93, _1236) (-1, _1696) (1, _2960) 0 ]", "EXPR [ (1, _93, _1238) (5, _190) (-1, _1697) 0 ]", "EXPR [ (1, _93, _1240) (6, _190) (-1, _1698) 0 ]", "EXPR [ (1, _93, _1242) (21, _190) (-1, _1699) 0 ]", - "EXPR [ (1, _93, _1244) (-1, _1700) (1, _3300) 0 ]", - "EXPR [ (1, _93, _1246) (-1, _1701) (1, _3302) 0 ]", - "EXPR [ (1, _93, _1248) (-1, _1702) (1, _3304) 0 ]", - "EXPR [ (1, _93, _1250) (-1, _1703) (1, _3306) 0 ]", + "EXPR [ (1, _93, _1244) (-1, _1700) (1, _2962) 0 ]", + "EXPR [ (1, _93, _1246) (-1, _1701) (1, _2964) 0 ]", + "EXPR [ (1, _93, _1248) (-1, _1702) (1, _2966) 0 ]", + "EXPR [ (1, _93, _1250) (-1, _1703) (1, _2968) 0 ]", "EXPR [ (1, _93, _1252) (100, _190) (-1, _1704) 0 ]", "EXPR [ (1, _93, _1254) (101, _190) (-1, _1705) 0 ]", "EXPR [ (1, _93, _1256) (102, _190) (-1, _1706) 0 ]", - "EXPR [ (1, _93, _1258) (-1, _1707) (1, _3308) 0 ]", - "EXPR [ (1, _93, _1260) (-1, _1708) (1, _3310) 0 ]", - "EXPR [ (1, _93, _1262) (-1, _1709) (1, _3312) 0 ]", - "EXPR [ (1, _93, _1264) (-1, _1710) (1, _3314) 0 ]", - "EXPR [ (1, _93, _1266) (-1, _1711) (1, _3316) 0 ]", - "EXPR [ (1, _93, _1268) (-1, _1712) (1, _3318) 0 ]", - "EXPR [ (1, _93, _1270) (-1, _1713) (1, _3320) 0 ]", - "EXPR [ (1, _93, _1272) (-1, _1714) (1, _3322) 0 ]", - "EXPR [ (1, _93, _1274) (-1, _1715) (1, _3324) 0 ]", - "EXPR [ (1, _93, _1276) (-1, _1716) (1, _3326) 0 ]", + "EXPR [ (1, _93, _1258) (-1, _1707) (1, _2970) 0 ]", + "EXPR [ (1, _93, _1260) (-1, _1708) (1, _2972) 0 ]", + "EXPR [ (1, _93, _1262) (-1, _1709) (1, _2974) 0 ]", + "EXPR [ (1, _93, _1264) (-1, _1710) (1, _2976) 0 ]", + "EXPR [ (1, _93, _1266) (-1, _1711) (1, _2978) 0 ]", + "EXPR [ (1, _93, _1268) (-1, _1712) (1, _2980) 0 ]", + "EXPR [ (1, _93, _1270) (-1, _1713) (1, _2982) 0 ]", + "EXPR [ (1, _93, _1272) (-1, _1714) (1, _2984) 0 ]", + "EXPR [ (1, _93, _1274) (-1, _1715) (1, _2986) 0 ]", + "EXPR [ (1, _93, _1276) (-1, _1716) (1, _2988) 0 ]", "EXPR [ (1, _93, _1697) (1, _190, _1650) -20 ]", "EXPR [ (1, _93, _1698) (1, _190, _1652) -19 ]", "EXPR [ (1, _93, _1699) (1, _190, _1654) -18 ]", @@ -2874,14 +2874,14 @@ expression: artifact "MEM (id: 40, read at: EXPR [ (1, _120) 0 ], value: EXPR [ (1, _2504) 0 ]) ", "MEM (id: 40, read at: EXPR [ (1, _32) 0 ], value: EXPR [ (1, _2505) 0 ]) ", "INIT (id: 45, len: 5, witnesses: [_2501, _2502, _2503, _2504, _2505])", - "MEM (id: 45, read at: EXPR [ (1, _30) 0 ], value: EXPR [ (1, _2506) 0 ]) ", - "MEM (id: 39, read at: EXPR [ (1, _2506) 0 ], value: EXPR [ (1, _2507) 0 ]) ", - "EXPR [ (1, _2506) (-1, _2508) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2508) 0 ], value: EXPR [ (1, _2509) 0 ]) ", - "EXPR [ (1, _2508) (-1, _2510) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2510) 0 ], value: EXPR [ (1, _2511) 0 ]) ", - "EXPR [ (-1, _1718) (-1, _2512) 1 ]", - "MEM (id: 45, read at: EXPR [ (1, _2512) 0 ], value: EXPR [ (1, _2513) 0 ]) ", + "EXPR [ (-3, _1718) (-1, _2506) 3 ]", + "MEM (id: 45, read at: EXPR [ (1, _2506) 0 ], value: EXPR [ (1, _2507) 0 ]) ", + "MEM (id: 39, read at: EXPR [ (1, _2507) 0 ], value: EXPR [ (1, _2508) 0 ]) ", + "EXPR [ (1, _2507) (-1, _2509) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2509) 0 ], value: EXPR [ (1, _2510) 0 ]) ", + "EXPR [ (1, _2509) (-1, _2511) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2511) 0 ], value: EXPR [ (1, _2512) 0 ]) ", + "EXPR [ (1, _2511) (-1, _2513) 1 ]", "MEM (id: 39, read at: EXPR [ (1, _2513) 0 ], value: EXPR [ (1, _2514) 0 ]) ", "EXPR [ (1, _2513) (-1, _2515) 1 ]", "MEM (id: 39, read at: EXPR [ (1, _2515) 0 ], value: EXPR [ (1, _2516) 0 ]) ", @@ -2931,395 +2931,14 @@ expression: artifact "MEM (id: 39, read at: EXPR [ (1, _2559) 0 ], value: EXPR [ (1, _2560) 0 ]) ", "EXPR [ (1, _2559) (-1, _2561) 1 ]", "MEM (id: 39, read at: EXPR [ (1, _2561) 0 ], value: EXPR [ (1, _2562) 0 ]) ", - "EXPR [ (1, _2561) (-1, _2563) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2563) 0 ], value: EXPR [ (1, _2564) 0 ]) ", - "EXPR [ (1, _2563) (-1, _2565) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2565) 0 ], value: EXPR [ (1, _2566) 0 ]) ", - "EXPR [ (1, _2565) (-1, _2567) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2567) 0 ], value: EXPR [ (1, _2568) 0 ]) ", - "EXPR [ (2, _2512) (-1, _2569) 0 ]", - "MEM (id: 45, read at: EXPR [ (1, _2569) 0 ], value: EXPR [ (1, _2570) 0 ]) ", - "MEM (id: 39, read at: EXPR [ (1, _2570) 0 ], value: EXPR [ (1, _2571) 0 ]) ", - "EXPR [ (1, _2570) (-1, _2572) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2572) 0 ], value: EXPR [ (1, _2573) 0 ]) ", - "EXPR [ (1, _2572) (-1, _2574) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2574) 0 ], value: EXPR [ (1, _2575) 0 ]) ", - "EXPR [ (3, _2512) (-1, _2576) 0 ]", - "MEM (id: 45, read at: EXPR [ (1, _2576) 0 ], value: EXPR [ (1, _2577) 0 ]) ", - "MEM (id: 39, read at: EXPR [ (1, _2577) 0 ], value: EXPR [ (1, _2578) 0 ]) ", - "EXPR [ (1, _2577) (-1, _2579) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2579) 0 ], value: EXPR [ (1, _2580) 0 ]) ", - "EXPR [ (1, _2579) (-1, _2581) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2581) 0 ], value: EXPR [ (1, _2582) 0 ]) ", - "EXPR [ (1, _2581) (-1, _2583) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2583) 0 ], value: EXPR [ (1, _2584) 0 ]) ", - "EXPR [ (1, _2583) (-1, _2585) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2585) 0 ], value: EXPR [ (1, _2586) 0 ]) ", - "EXPR [ (1, _2585) (-1, _2587) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2587) 0 ], value: EXPR [ (1, _2588) 0 ]) ", - "EXPR [ (1, _2587) (-1, _2589) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2589) 0 ], value: EXPR [ (1, _2590) 0 ]) ", - "EXPR [ (1, _2589) (-1, _2591) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2591) 0 ], value: EXPR [ (1, _2592) 0 ]) ", - "EXPR [ (1, _2591) (-1, _2593) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2593) 0 ], value: EXPR [ (1, _2594) 0 ]) ", - "EXPR [ (1, _2593) (-1, _2595) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2595) 0 ], value: EXPR [ (1, _2596) 0 ]) ", - "EXPR [ (1, _2595) (-1, _2597) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2597) 0 ], value: EXPR [ (1, _2598) 0 ]) ", - "EXPR [ (1, _2597) (-1, _2599) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2599) 0 ], value: EXPR [ (1, _2600) 0 ]) ", - "EXPR [ (1, _2599) (-1, _2601) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2601) 0 ], value: EXPR [ (1, _2602) 0 ]) ", - "EXPR [ (1, _2601) (-1, _2603) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2603) 0 ], value: EXPR [ (1, _2604) 0 ]) ", - "EXPR [ (1, _2603) (-1, _2605) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2605) 0 ], value: EXPR [ (1, _2606) 0 ]) ", - "EXPR [ (1, _2605) (-1, _2607) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2607) 0 ], value: EXPR [ (1, _2608) 0 ]) ", - "EXPR [ (1, _2607) (-1, _2609) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2609) 0 ], value: EXPR [ (1, _2610) 0 ]) ", - "EXPR [ (1, _2609) (-1, _2611) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2611) 0 ], value: EXPR [ (1, _2612) 0 ]) ", - "EXPR [ (1, _2611) (-1, _2613) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2613) 0 ], value: EXPR [ (1, _2614) 0 ]) ", - "EXPR [ (1, _2613) (-1, _2615) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2615) 0 ], value: EXPR [ (1, _2616) 0 ]) ", - "EXPR [ (1, _2615) (-1, _2617) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2617) 0 ], value: EXPR [ (1, _2618) 0 ]) ", - "EXPR [ (1, _2617) (-1, _2619) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2619) 0 ], value: EXPR [ (1, _2620) 0 ]) ", - "EXPR [ (1, _2619) (-1, _2621) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2621) 0 ], value: EXPR [ (1, _2622) 0 ]) ", - "EXPR [ (1, _2621) (-1, _2623) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2623) 0 ], value: EXPR [ (1, _2624) 0 ]) ", - "EXPR [ (1, _2623) (-1, _2625) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2625) 0 ], value: EXPR [ (1, _2626) 0 ]) ", - "EXPR [ (1, _2625) (-1, _2627) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2627) 0 ], value: EXPR [ (1, _2628) 0 ]) ", - "EXPR [ (1, _2627) (-1, _2629) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2629) 0 ], value: EXPR [ (1, _2630) 0 ]) ", - "EXPR [ (1, _2629) (-1, _2631) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2631) 0 ], value: EXPR [ (1, _2632) 0 ]) ", - "EXPR [ (1, _1718, _2221) (1, _2512, _2598) -5000 ]", + "EXPR [ (1, _1718, _2221) (-1, _1718, _2528) (1, _2528) -5000 ]", "BLACKBOX::RANGE [(_53, 1)] []", - "EXPR [ (1, _1718, _2177) (-1, _1718, _2507) (1, _2507) (-1, _2633) 0 ]", - "EXPR [ (1, _1718, _2178) (-1, _1718, _2509) (1, _2509) (-1, _2634) 0 ]", - "EXPR [ (1, _1718, _2179) (-1, _1718, _2511) (1, _2511) (-1, _2635) 0 ]", - "EXPR [ (1, _1718, _2180) (1, _2512, _2514) (-1, _2636) 0 ]", - "EXPR [ (1, _1718, _2181) (1, _2512, _2516) (-1, _2637) 0 ]", - "EXPR [ (1, _1718, _2182) (1, _2512, _2518) (-1, _2638) 0 ]", - "EXPR [ (1, _1718, _2183) (1, _2512, _2520) (-1, _2639) 0 ]", - "EXPR [ (1, _1718, _2184) (1, _2512, _2522) (-1, _2640) 0 ]", - "EXPR [ (1, _1718, _2185) (1, _2512, _2524) (-1, _2641) 0 ]", - "EXPR [ (1, _1718, _2186) (1, _2512, _2526) (-1, _2642) 0 ]", - "EXPR [ (1, _1718, _2187) (1, _2512, _2528) (-1, _2643) 0 ]", - "EXPR [ (1, _1718, _2188) (1, _2512, _2530) (-1, _2644) 0 ]", - "EXPR [ (1, _1718, _2189) (1, _2512, _2532) (-1, _2645) 0 ]", - "EXPR [ (1, _1718, _2190) (1, _2512, _2534) (-1, _2646) 0 ]", - "EXPR [ (1, _1718, _2191) (1, _2512, _2536) (-1, _2647) 0 ]", - "EXPR [ (1, _1718, _2192) (1, _2512, _2538) (-1, _2648) 0 ]", - "EXPR [ (1, _1718, _2193) (1, _2512, _2540) (-1, _2649) 0 ]", - "EXPR [ (1, _1718, _2194) (1, _2512, _2542) (-1, _2650) 0 ]", - "EXPR [ (1, _1718, _2195) (1, _2512, _2544) (-1, _2651) 0 ]", - "EXPR [ (1, _1718, _2196) (1, _2512, _2546) (-1, _2652) 0 ]", - "EXPR [ (1, _1718, _2197) (1, _2512, _2548) (-1, _2653) 0 ]", - "EXPR [ (1, _1718, _2198) (1, _2512, _2550) (-1, _2654) 0 ]", - "EXPR [ (1, _1718, _2199) (1, _2512, _2552) (-1, _2655) 0 ]", - "EXPR [ (1, _1718, _2200) (1, _2512, _2554) (-1, _2656) 0 ]", - "EXPR [ (1, _1718, _2201) (1, _2512, _2556) (-1, _2657) 0 ]", - "EXPR [ (1, _1718, _2202) (1, _2512, _2558) (-1, _2658) 0 ]", - "EXPR [ (1, _1718, _2203) (1, _2512, _2560) (-1, _2659) 0 ]", - "EXPR [ (1, _1718, _2204) (1, _2512, _2562) (-1, _2660) 0 ]", - "EXPR [ (1, _1718, _2205) (1, _2512, _2564) (-1, _2661) 0 ]", - "EXPR [ (1, _1718, _2206) (1, _2512, _2566) (-1, _2662) 0 ]", - "EXPR [ (1, _1718, _2207) (1, _2512, _2568) (-1, _2663) 0 ]", - "EXPR [ (1, _1718, _2208) (1, _2512, _2571) (-1, _2664) 0 ]", - "EXPR [ (1, _1718, _2209) (1, _2512, _2573) (-1, _2665) 0 ]", - "EXPR [ (1, _1718, _2210) (1, _2512, _2575) (-1, _2666) 0 ]", - "EXPR [ (1, _1718, _2211) (1, _2512, _2578) (-1, _2667) 0 ]", - "EXPR [ (1, _1718, _2212) (1, _2512, _2580) (-1, _2668) 0 ]", - "EXPR [ (1, _1718, _2213) (1, _2512, _2582) (-1, _2669) 0 ]", - "EXPR [ (1, _1718, _2214) (1, _2512, _2584) (-1, _2670) 0 ]", - "EXPR [ (1, _1718, _2215) (1, _2512, _2586) (-1, _2671) 0 ]", - "EXPR [ (1, _1718, _2216) (1, _2512, _2588) (-1, _2672) 0 ]", - "EXPR [ (1, _1718, _2217) (1, _2512, _2590) (-1, _2673) 0 ]", - "EXPR [ (1, _1718, _2218) (1, _2512, _2592) (-1, _2674) 0 ]", - "EXPR [ (1, _1718, _2219) (1, _2512, _2594) (-1, _2675) 0 ]", - "EXPR [ (1, _1718, _2220) (1, _2512, _2596) (-1, _2676) 0 ]", - "EXPR [ (-1, _2677) 5000 ]", - "EXPR [ (1, _1718, _2222) (1, _2512, _2600) (-1, _2678) 0 ]", - "EXPR [ (1, _1718, _2223) (1, _2512, _2602) (-1, _2679) 0 ]", - "EXPR [ (1, _1718, _2224) (1, _2512, _2604) (-1, _2680) 0 ]", - "EXPR [ (1, _1718, _2225) (1, _2512, _2606) (-1, _2681) 0 ]", - "EXPR [ (1, _1718, _2226) (1, _2512, _2608) (-1, _2682) 0 ]", - "EXPR [ (1, _1718, _2227) (1, _2512, _2610) (-1, _2683) 0 ]", - "EXPR [ (1, _1718, _2228) (1, _2512, _2612) (-1, _2684) 0 ]", - "EXPR [ (1, _1718, _2229) (1, _2512, _2614) (-1, _2685) 0 ]", - "EXPR [ (1, _1718, _2230) (1, _2512, _2616) (-1, _2686) 0 ]", - "EXPR [ (1, _1718, _2231) (1, _2512, _2618) (-1, _2687) 0 ]", - "EXPR [ (1, _1718, _2232) (1, _2512, _2620) (-1, _2688) 0 ]", - "EXPR [ (1, _1718, _2233) (1, _2512, _2622) (-1, _2689) 0 ]", - "EXPR [ (1, _1718, _2234) (1, _2512, _2624) (-1, _2690) 0 ]", - "EXPR [ (1, _1718, _2235) (1, _2512, _2626) (-1, _2691) 0 ]", - "EXPR [ (1, _1718, _2236) (1, _2512, _2628) (-1, _2692) 0 ]", - "EXPR [ (1, _1718, _2237) (1, _2512, _2630) (-1, _2693) 0 ]", - "EXPR [ (1, _1718, _2238) (1, _2512, _2632) (-1, _2694) 0 ]", - "INIT (id: 46, len: 62, witnesses: [_2633, _2634, _2635, _2636, _2637, _2638, _2639, _2640, _2641, _2642, _2643, _2644, _2645, _2646, _2647, _2648, _2649, _2650, _2651, _2652, _2653, _2654, _2655, _2656, _2657, _2658, _2659, _2660, _2661, _2662, _2663, _2664, _2665, _2666, _2667, _2668, _2669, _2670, _2671, _2672, _2673, _2674, _2675, _2676, _2677, _2678, _2679, _2680, _2681, _2682, _2683, _2684, _2685, _2686, _2687, _2688, _2689, _2690, _2691, _2692, _2693, _2694])", - "INIT (id: 47, len: 5, witnesses: [_30, _120, _803, _804, _805])", - "EXPR [ (2, _53) (-1, _2695) 1 ]", - "MEM (id: 47, read at: EXPR [ (1, _2695) 0 ], value: EXPR [ (1, _2696) 0 ]) ", - "MEM (id: 46, read at: EXPR [ (1, _2696) 0 ], value: EXPR [ (1, _2697) 0 ]) ", - "EXPR [ (1, _2696) (-1, _2698) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2698) 0 ], value: EXPR [ (1, _2699) 0 ]) ", - "EXPR [ (1, _2698) (-1, _2700) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2700) 0 ], value: EXPR [ (1, _2701) 0 ]) ", - "EXPR [ (1, _2700) (-1, _2702) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2702) 0 ], value: EXPR [ (1, _2703) 0 ]) ", - "EXPR [ (1, _2702) (-1, _2704) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2704) 0 ], value: EXPR [ (1, _2705) 0 ]) ", - "EXPR [ (1, _2704) (-1, _2706) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2706) 0 ], value: EXPR [ (1, _2707) 0 ]) ", - "EXPR [ (1, _2706) (-1, _2708) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2708) 0 ], value: EXPR [ (1, _2709) 0 ]) ", - "EXPR [ (1, _2708) (-1, _2710) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2710) 0 ], value: EXPR [ (1, _2711) 0 ]) ", - "EXPR [ (1, _2710) (-1, _2712) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2712) 0 ], value: EXPR [ (1, _2713) 0 ]) ", - "EXPR [ (1, _2712) (-1, _2714) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2714) 0 ], value: EXPR [ (1, _2715) 0 ]) ", - "EXPR [ (1, _2714) (-1, _2716) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2716) 0 ], value: EXPR [ (1, _2717) 0 ]) ", - "EXPR [ (1, _2716) (-1, _2718) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2718) 0 ], value: EXPR [ (1, _2719) 0 ]) ", - "EXPR [ (1, _2718) (-1, _2720) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2720) 0 ], value: EXPR [ (1, _2721) 0 ]) ", - "EXPR [ (1, _2720) (-1, _2722) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2722) 0 ], value: EXPR [ (1, _2723) 0 ]) ", - "EXPR [ (1, _2722) (-1, _2724) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2724) 0 ], value: EXPR [ (1, _2725) 0 ]) ", - "EXPR [ (1, _2724) (-1, _2726) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2726) 0 ], value: EXPR [ (1, _2727) 0 ]) ", - "EXPR [ (1, _2726) (-1, _2728) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2728) 0 ], value: EXPR [ (1, _2729) 0 ]) ", - "EXPR [ (1, _2728) (-1, _2730) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2730) 0 ], value: EXPR [ (1, _2731) 0 ]) ", - "EXPR [ (1, _2730) (-1, _2732) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2732) 0 ], value: EXPR [ (1, _2733) 0 ]) ", - "EXPR [ (1, _2732) (-1, _2734) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2734) 0 ], value: EXPR [ (1, _2735) 0 ]) ", - "EXPR [ (1, _2734) (-1, _2736) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2736) 0 ], value: EXPR [ (1, _2737) 0 ]) ", - "EXPR [ (1, _2736) (-1, _2738) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2738) 0 ], value: EXPR [ (1, _2739) 0 ]) ", - "EXPR [ (1, _2738) (-1, _2740) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2740) 0 ], value: EXPR [ (1, _2741) 0 ]) ", - "EXPR [ (1, _2740) (-1, _2742) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2742) 0 ], value: EXPR [ (1, _2743) 0 ]) ", - "EXPR [ (1, _2742) (-1, _2744) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2744) 0 ], value: EXPR [ (1, _2745) 0 ]) ", - "EXPR [ (1, _2744) (-1, _2746) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2746) 0 ], value: EXPR [ (1, _2747) 0 ]) ", - "EXPR [ (1, _2746) (-1, _2748) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2748) 0 ], value: EXPR [ (1, _2749) 0 ]) ", - "EXPR [ (1, _2748) (-1, _2750) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2750) 0 ], value: EXPR [ (1, _2751) 0 ]) ", - "INIT (id: 48, len: 28, witnesses: [_2697, _2699, _2701, _2703, _2705, _2707, _2709, _2711, _2713, _2715, _2717, _2719, _2721, _2723, _2725, _2727, _2729, _2731, _2733, _2735, _2737, _2739, _2741, _2743, _2745, _2747, _2749, _2751])", - "INIT (id: 49, len: 13, witnesses: [_30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42])", - "MEM (id: 49, read at: EXPR [ (1, _57) 0 ], value: EXPR [ (1, _2752) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _2752) 0 ], value: EXPR [ (1, _2753) 0 ]) ", - "EXPR [ (1, _2752) (-1, _2754) 1 ]", - "MEM (id: 48, read at: EXPR [ (1, _2754) 0 ], value: EXPR [ (1, _2755) 0 ]) ", - "EXPR [ (1, _2754) (-1, _2756) 1 ]", - "MEM (id: 48, read at: EXPR [ (1, _2756) 0 ], value: EXPR [ (1, _2757) 0 ]) ", - "MEM (id: 49, read at: EXPR [ (1, _776) 0 ], value: EXPR [ (1, _2758) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _2758) 0 ], value: EXPR [ (1, _2759) 0 ]) ", - "EXPR [ (1, _2758) (-1, _2760) 1 ]", - "MEM (id: 48, read at: EXPR [ (1, _2760) 0 ], value: EXPR [ (1, _2761) 0 ]) ", - "EXPR [ (1, _2760) (-1, _2762) 1 ]", - "MEM (id: 48, read at: EXPR [ (1, _2762) 0 ], value: EXPR [ (1, _2763) 0 ]) ", - "MEM (id: 49, read at: EXPR [ (1, _46) 0 ], value: EXPR [ (1, _2764) 0 ]) ", - "MEM (id: 48, write EXPR [ (1, _2753) 0 ] at: EXPR [ (1, _2764) 0 ]) ", - "EXPR [ (1, _2764) (-1, _2765) 1 ]", - "MEM (id: 48, write EXPR [ (1, _2755) 0 ] at: EXPR [ (1, _2765) 0 ]) ", - "EXPR [ (1, _2765) (-1, _2766) 1 ]", - "MEM (id: 48, write EXPR [ (1, _2757) 0 ] at: EXPR [ (1, _2766) 0 ]) ", - "MEM (id: 49, read at: EXPR [ (1, _30) 0 ], value: EXPR [ (1, _2767) 0 ]) ", - "MEM (id: 49, read at: EXPR [ (1, _31) 0 ], value: EXPR [ (1, _2768) 0 ]) ", - "MEM (id: 49, read at: EXPR [ (1, _118) 0 ], value: EXPR [ (1, _2769) 0 ]) ", - "MEM (id: 49, read at: EXPR [ (1, _120) 0 ], value: EXPR [ (1, _2770) 0 ]) ", - "MEM (id: 49, read at: EXPR [ (1, _32) 0 ], value: EXPR [ (1, _2771) 0 ]) ", - "MEM (id: 49, read at: EXPR [ (1, _123) 0 ], value: EXPR [ (1, _2772) 0 ]) ", - "MEM (id: 49, read at: EXPR [ (1, _125) 0 ], value: EXPR [ (1, _2773) 0 ]) ", - "MEM (id: 49, read at: EXPR [ (1, _33) 0 ], value: EXPR [ (1, _2774) 0 ]) ", - "MEM (id: 49, read at: EXPR [ (1, _34) 0 ], value: EXPR [ (1, _2775) 0 ]) ", - "MEM (id: 49, read at: EXPR [ (1, _129) 0 ], value: EXPR [ (1, _2776) 0 ]) ", - "MEM (id: 49, read at: EXPR [ (1, _131) 0 ], value: EXPR [ (1, _2777) 0 ]) ", - "MEM (id: 49, read at: EXPR [ (1, _35) 0 ], value: EXPR [ (1, _2778) 0 ]) ", - "MEM (id: 49, read at: EXPR [ (1, _134) 0 ], value: EXPR [ (1, _2779) 0 ]) ", - "INIT (id: 50, len: 13, witnesses: [_2767, _2768, _2769, _2770, _2771, _2772, _2773, _2774, _2775, _2776, _2777, _2778, _2779])", - "EXPR [ (1, _46) (-1, _2780) 1 ]", - "MEM (id: 50, read at: EXPR [ (1, _2780) 0 ], value: EXPR [ (1, _2781) 0 ]) ", - "MEM (id: 48, write EXPR [ (1, _2759) 0 ] at: EXPR [ (1, _2781) 0 ]) ", - "EXPR [ (1, _2781) (-1, _2782) 1 ]", - "MEM (id: 48, write EXPR [ (1, _2761) 0 ] at: EXPR [ (1, _2782) 0 ]) ", - "EXPR [ (1, _2782) (-1, _2783) 1 ]", - "MEM (id: 48, write EXPR [ (1, _2763) 0 ] at: EXPR [ (1, _2783) 0 ]) ", - "MEM (id: 47, read at: EXPR [ (1, _2695) 0 ], value: EXPR [ (1, _2784) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _30) 0 ], value: EXPR [ (1, _2785) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _31) 0 ], value: EXPR [ (1, _2786) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _118) 0 ], value: EXPR [ (1, _2787) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _120) 0 ], value: EXPR [ (1, _2788) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _32) 0 ], value: EXPR [ (1, _2789) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _123) 0 ], value: EXPR [ (1, _2790) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _125) 0 ], value: EXPR [ (1, _2791) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _33) 0 ], value: EXPR [ (1, _2792) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _34) 0 ], value: EXPR [ (1, _2793) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _129) 0 ], value: EXPR [ (1, _2794) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _131) 0 ], value: EXPR [ (1, _2795) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _35) 0 ], value: EXPR [ (1, _2796) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _134) 0 ], value: EXPR [ (1, _2797) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _1067) 0 ], value: EXPR [ (1, _2798) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _36) 0 ], value: EXPR [ (1, _2799) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _37) 0 ], value: EXPR [ (1, _2800) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _1071) 0 ], value: EXPR [ (1, _2801) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _1073) 0 ], value: EXPR [ (1, _2802) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _38) 0 ], value: EXPR [ (1, _2803) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _1076) 0 ], value: EXPR [ (1, _2804) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _1078) 0 ], value: EXPR [ (1, _2805) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _39) 0 ], value: EXPR [ (1, _2806) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _40) 0 ], value: EXPR [ (1, _2807) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _1082) 0 ], value: EXPR [ (1, _2808) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _1084) 0 ], value: EXPR [ (1, _2809) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _41) 0 ], value: EXPR [ (1, _2810) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _1087) 0 ], value: EXPR [ (1, _2811) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _1089) 0 ], value: EXPR [ (1, _2812) 0 ]) ", - "MEM (id: 46, write EXPR [ (1, _2785) 0 ] at: EXPR [ (1, _2784) 0 ]) ", - "EXPR [ (1, _2784) (-1, _2813) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2786) 0 ] at: EXPR [ (1, _2813) 0 ]) ", - "EXPR [ (1, _2813) (-1, _2814) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2787) 0 ] at: EXPR [ (1, _2814) 0 ]) ", - "EXPR [ (1, _2814) (-1, _2815) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2788) 0 ] at: EXPR [ (1, _2815) 0 ]) ", - "EXPR [ (1, _2815) (-1, _2816) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2789) 0 ] at: EXPR [ (1, _2816) 0 ]) ", - "EXPR [ (1, _2816) (-1, _2817) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2790) 0 ] at: EXPR [ (1, _2817) 0 ]) ", - "EXPR [ (1, _2817) (-1, _2818) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2791) 0 ] at: EXPR [ (1, _2818) 0 ]) ", - "EXPR [ (1, _2818) (-1, _2819) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2792) 0 ] at: EXPR [ (1, _2819) 0 ]) ", - "EXPR [ (1, _2819) (-1, _2820) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2793) 0 ] at: EXPR [ (1, _2820) 0 ]) ", - "EXPR [ (1, _2820) (-1, _2821) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2794) 0 ] at: EXPR [ (1, _2821) 0 ]) ", - "EXPR [ (1, _2821) (-1, _2822) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2795) 0 ] at: EXPR [ (1, _2822) 0 ]) ", - "EXPR [ (1, _2822) (-1, _2823) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2796) 0 ] at: EXPR [ (1, _2823) 0 ]) ", - "EXPR [ (1, _2823) (-1, _2824) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2797) 0 ] at: EXPR [ (1, _2824) 0 ]) ", - "EXPR [ (1, _2824) (-1, _2825) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2798) 0 ] at: EXPR [ (1, _2825) 0 ]) ", - "EXPR [ (1, _2825) (-1, _2826) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2799) 0 ] at: EXPR [ (1, _2826) 0 ]) ", - "EXPR [ (1, _2826) (-1, _2827) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2800) 0 ] at: EXPR [ (1, _2827) 0 ]) ", - "EXPR [ (1, _2827) (-1, _2828) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2801) 0 ] at: EXPR [ (1, _2828) 0 ]) ", - "EXPR [ (1, _2828) (-1, _2829) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2802) 0 ] at: EXPR [ (1, _2829) 0 ]) ", - "EXPR [ (1, _2829) (-1, _2830) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2803) 0 ] at: EXPR [ (1, _2830) 0 ]) ", - "EXPR [ (1, _2830) (-1, _2831) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2804) 0 ] at: EXPR [ (1, _2831) 0 ]) ", - "EXPR [ (1, _2831) (-1, _2832) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2805) 0 ] at: EXPR [ (1, _2832) 0 ]) ", - "EXPR [ (1, _2832) (-1, _2833) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2806) 0 ] at: EXPR [ (1, _2833) 0 ]) ", - "EXPR [ (1, _2833) (-1, _2834) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2807) 0 ] at: EXPR [ (1, _2834) 0 ]) ", - "EXPR [ (1, _2834) (-1, _2835) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2808) 0 ] at: EXPR [ (1, _2835) 0 ]) ", - "EXPR [ (1, _2835) (-1, _2836) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2809) 0 ] at: EXPR [ (1, _2836) 0 ]) ", - "EXPR [ (1, _2836) (-1, _2837) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2810) 0 ] at: EXPR [ (1, _2837) 0 ]) ", - "EXPR [ (1, _2837) (-1, _2838) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2811) 0 ] at: EXPR [ (1, _2838) 0 ]) ", - "EXPR [ (1, _2838) (-1, _2839) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2812) 0 ] at: EXPR [ (1, _2839) 0 ]) ", - "MEM (id: 47, read at: EXPR [ (1, _30) 0 ], value: EXPR [ (1, _2840) 0 ]) ", - "MEM (id: 47, read at: EXPR [ (1, _31) 0 ], value: EXPR [ (1, _2841) 0 ]) ", - "MEM (id: 47, read at: EXPR [ (1, _118) 0 ], value: EXPR [ (1, _2842) 0 ]) ", - "MEM (id: 47, read at: EXPR [ (1, _120) 0 ], value: EXPR [ (1, _2843) 0 ]) ", - "MEM (id: 47, read at: EXPR [ (1, _32) 0 ], value: EXPR [ (1, _2844) 0 ]) ", - "INIT (id: 51, len: 5, witnesses: [_2840, _2841, _2842, _2843, _2844])", - "MEM (id: 51, read at: EXPR [ (1, _120) 0 ], value: EXPR [ (1, _2845) 0 ]) ", - "MEM (id: 46, read at: EXPR [ (1, _2845) 0 ], value: EXPR [ (1, _2846) 0 ]) ", - "EXPR [ (1, _2845) (-1, _2847) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2847) 0 ], value: EXPR [ (1, _2848) 0 ]) ", - "EXPR [ (1, _2847) (-1, _2849) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2849) 0 ], value: EXPR [ (1, _2850) 0 ]) ", - "EXPR [ (1, _2849) (-1, _2851) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2851) 0 ], value: EXPR [ (1, _2852) 0 ]) ", - "EXPR [ (1, _2851) (-1, _2853) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2853) 0 ], value: EXPR [ (1, _2854) 0 ]) ", - "EXPR [ (1, _2853) (-1, _2855) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2855) 0 ], value: EXPR [ (1, _2856) 0 ]) ", - "EXPR [ (1, _2855) (-1, _2857) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2857) 0 ], value: EXPR [ (1, _2858) 0 ]) ", - "EXPR [ (1, _2857) (-1, _2859) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2859) 0 ], value: EXPR [ (1, _2860) 0 ]) ", - "EXPR [ (1, _2859) (-1, _2861) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2861) 0 ], value: EXPR [ (1, _2862) 0 ]) ", - "EXPR [ (1, _2861) (-1, _2863) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2863) 0 ], value: EXPR [ (1, _2864) 0 ]) ", - "EXPR [ (1, _2863) (-1, _2865) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2865) 0 ], value: EXPR [ (1, _2866) 0 ]) ", - "EXPR [ (1, _2865) (-1, _2867) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2867) 0 ], value: EXPR [ (1, _2868) 0 ]) ", - "EXPR [ (1, _2867) (-1, _2869) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2869) 0 ], value: EXPR [ (1, _2870) 0 ]) ", - "EXPR [ (1, _2869) (-1, _2871) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2871) 0 ], value: EXPR [ (1, _2872) 0 ]) ", - "EXPR [ (1, _2871) (-1, _2873) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2873) 0 ], value: EXPR [ (1, _2874) 0 ]) ", - "EXPR [ (1, _2873) (-1, _2875) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2875) 0 ], value: EXPR [ (1, _2876) 0 ]) ", - "EXPR [ (1, _2875) (-1, _2877) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2877) 0 ], value: EXPR [ (1, _2878) 0 ]) ", - "EXPR [ (1, _2877) (-1, _2879) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2879) 0 ], value: EXPR [ (1, _2880) 0 ]) ", - "EXPR [ (1, _2879) (-1, _2881) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2881) 0 ], value: EXPR [ (1, _2882) 0 ]) ", - "EXPR [ (1, _2881) (-1, _2883) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2883) 0 ], value: EXPR [ (1, _2884) 0 ]) ", - "EXPR [ (1, _2883) (-1, _2885) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2885) 0 ], value: EXPR [ (1, _2886) 0 ]) ", - "EXPR [ (1, _2885) (-1, _2887) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2887) 0 ], value: EXPR [ (1, _2888) 0 ]) ", - "EXPR [ (1, _2887) (-1, _2889) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2889) 0 ], value: EXPR [ (1, _2890) 0 ]) ", - "EXPR [ (1, _2889) (-1, _2891) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2891) 0 ], value: EXPR [ (1, _2892) 0 ]) ", - "EXPR [ (1, _2891) (-1, _2893) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2893) 0 ], value: EXPR [ (1, _2894) 0 ]) ", - "EXPR [ (1, _2893) (-1, _2895) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2895) 0 ], value: EXPR [ (1, _2896) 0 ]) ", - "EXPR [ (1, _2895) (-1, _2897) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2897) 0 ], value: EXPR [ (1, _2898) 0 ]) ", - "EXPR [ (1, _2897) (-1, _2899) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2899) 0 ], value: EXPR [ (1, _2900) 0 ]) ", - "EXPR [ (1, _2848) -20 ]", - "EXPR [ (1, _2850) -19 ]", - "EXPR [ (1, _2852) -5000 ]", "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) } }]", "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": { "50": { "source": "struct Bar {\n inner: [Field; 3],\n}\n\nstruct Foo {\n a: Field,\n b: [Field; 3],\n bar: Bar,\n}\n\nstruct FooParent {\n array: [Field; 3],\n foos: [Foo; 4],\n}\n\nfn main(mut x: [Foo; 4], y: pub u32) {\n assert(x[y - 3].a == 1);\n assert(x[y - 3].b == [2, 3, 20]);\n assert(x[y - 2].a == 4);\n assert(x[y - 2].b == [5, 6, 21]);\n assert(x[y - 1].a == 7);\n assert(x[y - 1].b == [8, 9, 22]);\n assert(x[y].a == 10);\n assert(x[y].b == [11, 12, 23]);\n assert(x[y].bar.inner == [109, 110, 111]);\n // Check dynamic array set\n if y != 2 {\n x[y].a = 50;\n } else {\n x[y].a = 100;\n }\n assert(x[3].a == 50);\n\n if y == 2 {\n x[y - 1].b = [50, 51, 52];\n } else {\n x[y - 1].b = [100, 101, 102];\n }\n assert(x[2].b == [100, 101, 102]);\n\n assert(x[y - 3].bar.inner == [100, 101, 102]);\n assert(x[y - 2].bar.inner == [103, 104, 105]);\n assert(x[y - 1].bar.inner == [106, 107, 108]);\n assert(x[y].bar.inner == [109, 110, 111]);\n\n let foo_parent_one = FooParent { array: [0, 1, 2], foos: x };\n let foo_parent_two = FooParent { array: [3, 4, 5], foos: x };\n let mut foo_parents = [foo_parent_one, foo_parent_two];\n\n assert(foo_parents[y - 3].foos[y - 3].b == [2, 3, 20]);\n assert(foo_parents[y - 3].foos[y - 2].b == [5, 6, 21]);\n assert(foo_parents[y - 3].foos[y - 1].b == [100, 101, 102]);\n assert(foo_parents[y - 3].foos[y].b == [11, 12, 23]);\n\n assert(foo_parents[y - 3].foos[y].a == 50);\n\n assert(foo_parents[1].foos[1].b == [5, 6, 21]);\n if y == 2 {\n foo_parents[y - 2].foos[y - 2].b = [10, 9, 8];\n } else {\n foo_parents[y - 2].foos[y - 2].b = [20, 19, 18];\n }\n assert(foo_parents[1].foos[1].b == [20, 19, 18]);\n\n assert(foo_parents[1].foos[1].b[2] == 18);\n if y == 3 {\n foo_parents[y - 2].foos[y - 2].b[y - 1] = 5000;\n } else {\n foo_parents[y - 2].foos[y - 2].b[y - 1] = 1000;\n }\n assert(foo_parents[1].foos[1].b[2] == 5000);\n // Set a dynamic array value\n foo_parents[y - 2].foos[y - 3].b = foo_parents[y - 2].foos[y - 2].b;\n assert(foo_parents[1].foos[0].b == [20, 19, 5000]);\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_false_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_false_inliner_9223372036854775807.snap index 50b77b14496..19a8103bb78 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_false_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_false_inliner_9223372036854775807.snap @@ -80,7 +80,7 @@ expression: artifact }, "bytecode": [ "func 0", - "current witness index : _3326", + "current witness index : _2988", "private parameters indices : [_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27]", "public parameters indices : [_28]", "return value indices : []", @@ -1840,56 +1840,56 @@ expression: artifact "MEM (id: 19, read at: EXPR [ (1, _1590) 0 ], value: EXPR [ (1, _1591) 0 ]) ", "EXPR [ (1, _1590) (-1, _1592) 1 ]", "MEM (id: 19, read at: EXPR [ (1, _1592) 0 ], value: EXPR [ (1, _1593) 0 ]) ", - "EXPR [ (1, _190, _748) (-1, _3284) 0 ]", - "EXPR [ (1, _93, _1158) (-1, _1594) (1, _3284) 0 ]", - "EXPR [ (1, _190, _749) (-1, _3286) 0 ]", - "EXPR [ (1, _93, _1160) (-1, _1595) (1, _3286) 0 ]", - "EXPR [ (1, _190, _750) (-1, _3288) 0 ]", - "EXPR [ (1, _93, _1162) (-1, _1596) (1, _3288) 0 ]", - "EXPR [ (1, _190, _751) (-1, _3290) 0 ]", - "EXPR [ (1, _93, _1164) (-1, _1597) (1, _3290) 0 ]", - "EXPR [ (1, _190, _752) (-1, _3292) 0 ]", - "EXPR [ (1, _93, _1166) (-1, _1598) (1, _3292) 0 ]", - "EXPR [ (1, _190, _753) (-1, _3294) 0 ]", - "EXPR [ (1, _93, _1168) (-1, _1599) (1, _3294) 0 ]", - "EXPR [ (1, _190, _754) (-1, _3296) 0 ]", - "EXPR [ (1, _93, _1170) (-1, _1600) (1, _3296) 0 ]", - "EXPR [ (1, _190, _755) (-1, _3298) 0 ]", - "EXPR [ (1, _93, _1172) (-1, _1601) (1, _3298) 0 ]", + "EXPR [ (1, _190, _748) (-1, _2946) 0 ]", + "EXPR [ (1, _93, _1158) (-1, _1594) (1, _2946) 0 ]", + "EXPR [ (1, _190, _749) (-1, _2948) 0 ]", + "EXPR [ (1, _93, _1160) (-1, _1595) (1, _2948) 0 ]", + "EXPR [ (1, _190, _750) (-1, _2950) 0 ]", + "EXPR [ (1, _93, _1162) (-1, _1596) (1, _2950) 0 ]", + "EXPR [ (1, _190, _751) (-1, _2952) 0 ]", + "EXPR [ (1, _93, _1164) (-1, _1597) (1, _2952) 0 ]", + "EXPR [ (1, _190, _752) (-1, _2954) 0 ]", + "EXPR [ (1, _93, _1166) (-1, _1598) (1, _2954) 0 ]", + "EXPR [ (1, _190, _753) (-1, _2956) 0 ]", + "EXPR [ (1, _93, _1168) (-1, _1599) (1, _2956) 0 ]", + "EXPR [ (1, _190, _754) (-1, _2958) 0 ]", + "EXPR [ (1, _93, _1170) (-1, _1600) (1, _2958) 0 ]", + "EXPR [ (1, _190, _755) (-1, _2960) 0 ]", + "EXPR [ (1, _93, _1172) (-1, _1601) (1, _2960) 0 ]", "EXPR [ (1, _93, _1174) (5, _190) (-1, _1602) 0 ]", "EXPR [ (1, _93, _1176) (6, _190) (-1, _1603) 0 ]", "EXPR [ (1, _93, _1178) (21, _190) (-1, _1604) 0 ]", - "EXPR [ (1, _190, _759) (-1, _3300) 0 ]", - "EXPR [ (1, _93, _1180) (-1, _1605) (1, _3300) 0 ]", - "EXPR [ (1, _190, _760) (-1, _3302) 0 ]", - "EXPR [ (1, _93, _1182) (-1, _1606) (1, _3302) 0 ]", - "EXPR [ (1, _190, _761) (-1, _3304) 0 ]", - "EXPR [ (1, _93, _1184) (-1, _1607) (1, _3304) 0 ]", - "EXPR [ (1, _190, _762) (-1, _3306) 0 ]", - "EXPR [ (1, _93, _1186) (-1, _1608) (1, _3306) 0 ]", + "EXPR [ (1, _190, _759) (-1, _2962) 0 ]", + "EXPR [ (1, _93, _1180) (-1, _1605) (1, _2962) 0 ]", + "EXPR [ (1, _190, _760) (-1, _2964) 0 ]", + "EXPR [ (1, _93, _1182) (-1, _1606) (1, _2964) 0 ]", + "EXPR [ (1, _190, _761) (-1, _2966) 0 ]", + "EXPR [ (1, _93, _1184) (-1, _1607) (1, _2966) 0 ]", + "EXPR [ (1, _190, _762) (-1, _2968) 0 ]", + "EXPR [ (1, _93, _1186) (-1, _1608) (1, _2968) 0 ]", "EXPR [ (1, _93, _1188) (100, _190) (-1, _1609) 0 ]", "EXPR [ (1, _93, _1190) (101, _190) (-1, _1610) 0 ]", "EXPR [ (1, _93, _1192) (102, _190) (-1, _1611) 0 ]", - "EXPR [ (1, _190, _766) (-1, _3308) 0 ]", - "EXPR [ (1, _93, _1194) (-1, _1612) (1, _3308) 0 ]", - "EXPR [ (1, _190, _767) (-1, _3310) 0 ]", - "EXPR [ (1, _93, _1196) (-1, _1613) (1, _3310) 0 ]", - "EXPR [ (1, _190, _768) (-1, _3312) 0 ]", - "EXPR [ (1, _93, _1198) (-1, _1614) (1, _3312) 0 ]", - "EXPR [ (1, _190, _769) (-1, _3314) 0 ]", - "EXPR [ (1, _93, _1200) (-1, _1615) (1, _3314) 0 ]", - "EXPR [ (1, _190, _770) (-1, _3316) 0 ]", - "EXPR [ (1, _93, _1202) (-1, _1616) (1, _3316) 0 ]", - "EXPR [ (1, _190, _771) (-1, _3318) 0 ]", - "EXPR [ (1, _93, _1204) (-1, _1617) (1, _3318) 0 ]", - "EXPR [ (1, _190, _772) (-1, _3320) 0 ]", - "EXPR [ (1, _93, _1206) (-1, _1618) (1, _3320) 0 ]", - "EXPR [ (1, _190, _773) (-1, _3322) 0 ]", - "EXPR [ (1, _93, _1208) (-1, _1619) (1, _3322) 0 ]", - "EXPR [ (1, _190, _774) (-1, _3324) 0 ]", - "EXPR [ (1, _93, _1210) (-1, _1620) (1, _3324) 0 ]", - "EXPR [ (1, _190, _775) (-1, _3326) 0 ]", - "EXPR [ (1, _93, _1212) (-1, _1621) (1, _3326) 0 ]", + "EXPR [ (1, _190, _766) (-1, _2970) 0 ]", + "EXPR [ (1, _93, _1194) (-1, _1612) (1, _2970) 0 ]", + "EXPR [ (1, _190, _767) (-1, _2972) 0 ]", + "EXPR [ (1, _93, _1196) (-1, _1613) (1, _2972) 0 ]", + "EXPR [ (1, _190, _768) (-1, _2974) 0 ]", + "EXPR [ (1, _93, _1198) (-1, _1614) (1, _2974) 0 ]", + "EXPR [ (1, _190, _769) (-1, _2976) 0 ]", + "EXPR [ (1, _93, _1200) (-1, _1615) (1, _2976) 0 ]", + "EXPR [ (1, _190, _770) (-1, _2978) 0 ]", + "EXPR [ (1, _93, _1202) (-1, _1616) (1, _2978) 0 ]", + "EXPR [ (1, _190, _771) (-1, _2980) 0 ]", + "EXPR [ (1, _93, _1204) (-1, _1617) (1, _2980) 0 ]", + "EXPR [ (1, _190, _772) (-1, _2982) 0 ]", + "EXPR [ (1, _93, _1206) (-1, _1618) (1, _2982) 0 ]", + "EXPR [ (1, _190, _773) (-1, _2984) 0 ]", + "EXPR [ (1, _93, _1208) (-1, _1619) (1, _2984) 0 ]", + "EXPR [ (1, _190, _774) (-1, _2986) 0 ]", + "EXPR [ (1, _93, _1210) (-1, _1620) (1, _2986) 0 ]", + "EXPR [ (1, _190, _775) (-1, _2988) 0 ]", + "EXPR [ (1, _93, _1212) (-1, _1621) (1, _2988) 0 ]", "EXPR [ (2, _190) (-1, _1622) 0 ]", "MEM (id: 31, read at: EXPR [ (1, _1622) 0 ], value: EXPR [ (1, _1623) 0 ]) ", "MEM (id: 19, read at: EXPR [ (1, _1623) 0 ], value: EXPR [ (1, _1624) 0 ]) ", @@ -1957,34 +1957,34 @@ expression: artifact "MEM (id: 19, read at: EXPR [ (1, _1685) 0 ], value: EXPR [ (1, _1686) 0 ]) ", "EXPR [ (1, _1685) (-1, _1687) 1 ]", "MEM (id: 19, read at: EXPR [ (1, _1687) 0 ], value: EXPR [ (1, _1688) 0 ]) ", - "EXPR [ (1, _93, _1222) (-1, _1689) (1, _3284) 0 ]", - "EXPR [ (1, _93, _1224) (-1, _1690) (1, _3286) 0 ]", - "EXPR [ (1, _93, _1226) (-1, _1691) (1, _3288) 0 ]", - "EXPR [ (1, _93, _1228) (-1, _1692) (1, _3290) 0 ]", - "EXPR [ (1, _93, _1230) (-1, _1693) (1, _3292) 0 ]", - "EXPR [ (1, _93, _1232) (-1, _1694) (1, _3294) 0 ]", - "EXPR [ (1, _93, _1234) (-1, _1695) (1, _3296) 0 ]", - "EXPR [ (1, _93, _1236) (-1, _1696) (1, _3298) 0 ]", + "EXPR [ (1, _93, _1222) (-1, _1689) (1, _2946) 0 ]", + "EXPR [ (1, _93, _1224) (-1, _1690) (1, _2948) 0 ]", + "EXPR [ (1, _93, _1226) (-1, _1691) (1, _2950) 0 ]", + "EXPR [ (1, _93, _1228) (-1, _1692) (1, _2952) 0 ]", + "EXPR [ (1, _93, _1230) (-1, _1693) (1, _2954) 0 ]", + "EXPR [ (1, _93, _1232) (-1, _1694) (1, _2956) 0 ]", + "EXPR [ (1, _93, _1234) (-1, _1695) (1, _2958) 0 ]", + "EXPR [ (1, _93, _1236) (-1, _1696) (1, _2960) 0 ]", "EXPR [ (1, _93, _1238) (5, _190) (-1, _1697) 0 ]", "EXPR [ (1, _93, _1240) (6, _190) (-1, _1698) 0 ]", "EXPR [ (1, _93, _1242) (21, _190) (-1, _1699) 0 ]", - "EXPR [ (1, _93, _1244) (-1, _1700) (1, _3300) 0 ]", - "EXPR [ (1, _93, _1246) (-1, _1701) (1, _3302) 0 ]", - "EXPR [ (1, _93, _1248) (-1, _1702) (1, _3304) 0 ]", - "EXPR [ (1, _93, _1250) (-1, _1703) (1, _3306) 0 ]", + "EXPR [ (1, _93, _1244) (-1, _1700) (1, _2962) 0 ]", + "EXPR [ (1, _93, _1246) (-1, _1701) (1, _2964) 0 ]", + "EXPR [ (1, _93, _1248) (-1, _1702) (1, _2966) 0 ]", + "EXPR [ (1, _93, _1250) (-1, _1703) (1, _2968) 0 ]", "EXPR [ (1, _93, _1252) (100, _190) (-1, _1704) 0 ]", "EXPR [ (1, _93, _1254) (101, _190) (-1, _1705) 0 ]", "EXPR [ (1, _93, _1256) (102, _190) (-1, _1706) 0 ]", - "EXPR [ (1, _93, _1258) (-1, _1707) (1, _3308) 0 ]", - "EXPR [ (1, _93, _1260) (-1, _1708) (1, _3310) 0 ]", - "EXPR [ (1, _93, _1262) (-1, _1709) (1, _3312) 0 ]", - "EXPR [ (1, _93, _1264) (-1, _1710) (1, _3314) 0 ]", - "EXPR [ (1, _93, _1266) (-1, _1711) (1, _3316) 0 ]", - "EXPR [ (1, _93, _1268) (-1, _1712) (1, _3318) 0 ]", - "EXPR [ (1, _93, _1270) (-1, _1713) (1, _3320) 0 ]", - "EXPR [ (1, _93, _1272) (-1, _1714) (1, _3322) 0 ]", - "EXPR [ (1, _93, _1274) (-1, _1715) (1, _3324) 0 ]", - "EXPR [ (1, _93, _1276) (-1, _1716) (1, _3326) 0 ]", + "EXPR [ (1, _93, _1258) (-1, _1707) (1, _2970) 0 ]", + "EXPR [ (1, _93, _1260) (-1, _1708) (1, _2972) 0 ]", + "EXPR [ (1, _93, _1262) (-1, _1709) (1, _2974) 0 ]", + "EXPR [ (1, _93, _1264) (-1, _1710) (1, _2976) 0 ]", + "EXPR [ (1, _93, _1266) (-1, _1711) (1, _2978) 0 ]", + "EXPR [ (1, _93, _1268) (-1, _1712) (1, _2980) 0 ]", + "EXPR [ (1, _93, _1270) (-1, _1713) (1, _2982) 0 ]", + "EXPR [ (1, _93, _1272) (-1, _1714) (1, _2984) 0 ]", + "EXPR [ (1, _93, _1274) (-1, _1715) (1, _2986) 0 ]", + "EXPR [ (1, _93, _1276) (-1, _1716) (1, _2988) 0 ]", "EXPR [ (1, _93, _1697) (1, _190, _1650) -20 ]", "EXPR [ (1, _93, _1698) (1, _190, _1652) -19 ]", "EXPR [ (1, _93, _1699) (1, _190, _1654) -18 ]", @@ -2874,14 +2874,14 @@ expression: artifact "MEM (id: 40, read at: EXPR [ (1, _120) 0 ], value: EXPR [ (1, _2504) 0 ]) ", "MEM (id: 40, read at: EXPR [ (1, _32) 0 ], value: EXPR [ (1, _2505) 0 ]) ", "INIT (id: 45, len: 5, witnesses: [_2501, _2502, _2503, _2504, _2505])", - "MEM (id: 45, read at: EXPR [ (1, _30) 0 ], value: EXPR [ (1, _2506) 0 ]) ", - "MEM (id: 39, read at: EXPR [ (1, _2506) 0 ], value: EXPR [ (1, _2507) 0 ]) ", - "EXPR [ (1, _2506) (-1, _2508) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2508) 0 ], value: EXPR [ (1, _2509) 0 ]) ", - "EXPR [ (1, _2508) (-1, _2510) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2510) 0 ], value: EXPR [ (1, _2511) 0 ]) ", - "EXPR [ (-1, _1718) (-1, _2512) 1 ]", - "MEM (id: 45, read at: EXPR [ (1, _2512) 0 ], value: EXPR [ (1, _2513) 0 ]) ", + "EXPR [ (-3, _1718) (-1, _2506) 3 ]", + "MEM (id: 45, read at: EXPR [ (1, _2506) 0 ], value: EXPR [ (1, _2507) 0 ]) ", + "MEM (id: 39, read at: EXPR [ (1, _2507) 0 ], value: EXPR [ (1, _2508) 0 ]) ", + "EXPR [ (1, _2507) (-1, _2509) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2509) 0 ], value: EXPR [ (1, _2510) 0 ]) ", + "EXPR [ (1, _2509) (-1, _2511) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2511) 0 ], value: EXPR [ (1, _2512) 0 ]) ", + "EXPR [ (1, _2511) (-1, _2513) 1 ]", "MEM (id: 39, read at: EXPR [ (1, _2513) 0 ], value: EXPR [ (1, _2514) 0 ]) ", "EXPR [ (1, _2513) (-1, _2515) 1 ]", "MEM (id: 39, read at: EXPR [ (1, _2515) 0 ], value: EXPR [ (1, _2516) 0 ]) ", @@ -2931,395 +2931,14 @@ expression: artifact "MEM (id: 39, read at: EXPR [ (1, _2559) 0 ], value: EXPR [ (1, _2560) 0 ]) ", "EXPR [ (1, _2559) (-1, _2561) 1 ]", "MEM (id: 39, read at: EXPR [ (1, _2561) 0 ], value: EXPR [ (1, _2562) 0 ]) ", - "EXPR [ (1, _2561) (-1, _2563) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2563) 0 ], value: EXPR [ (1, _2564) 0 ]) ", - "EXPR [ (1, _2563) (-1, _2565) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2565) 0 ], value: EXPR [ (1, _2566) 0 ]) ", - "EXPR [ (1, _2565) (-1, _2567) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2567) 0 ], value: EXPR [ (1, _2568) 0 ]) ", - "EXPR [ (2, _2512) (-1, _2569) 0 ]", - "MEM (id: 45, read at: EXPR [ (1, _2569) 0 ], value: EXPR [ (1, _2570) 0 ]) ", - "MEM (id: 39, read at: EXPR [ (1, _2570) 0 ], value: EXPR [ (1, _2571) 0 ]) ", - "EXPR [ (1, _2570) (-1, _2572) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2572) 0 ], value: EXPR [ (1, _2573) 0 ]) ", - "EXPR [ (1, _2572) (-1, _2574) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2574) 0 ], value: EXPR [ (1, _2575) 0 ]) ", - "EXPR [ (3, _2512) (-1, _2576) 0 ]", - "MEM (id: 45, read at: EXPR [ (1, _2576) 0 ], value: EXPR [ (1, _2577) 0 ]) ", - "MEM (id: 39, read at: EXPR [ (1, _2577) 0 ], value: EXPR [ (1, _2578) 0 ]) ", - "EXPR [ (1, _2577) (-1, _2579) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2579) 0 ], value: EXPR [ (1, _2580) 0 ]) ", - "EXPR [ (1, _2579) (-1, _2581) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2581) 0 ], value: EXPR [ (1, _2582) 0 ]) ", - "EXPR [ (1, _2581) (-1, _2583) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2583) 0 ], value: EXPR [ (1, _2584) 0 ]) ", - "EXPR [ (1, _2583) (-1, _2585) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2585) 0 ], value: EXPR [ (1, _2586) 0 ]) ", - "EXPR [ (1, _2585) (-1, _2587) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2587) 0 ], value: EXPR [ (1, _2588) 0 ]) ", - "EXPR [ (1, _2587) (-1, _2589) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2589) 0 ], value: EXPR [ (1, _2590) 0 ]) ", - "EXPR [ (1, _2589) (-1, _2591) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2591) 0 ], value: EXPR [ (1, _2592) 0 ]) ", - "EXPR [ (1, _2591) (-1, _2593) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2593) 0 ], value: EXPR [ (1, _2594) 0 ]) ", - "EXPR [ (1, _2593) (-1, _2595) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2595) 0 ], value: EXPR [ (1, _2596) 0 ]) ", - "EXPR [ (1, _2595) (-1, _2597) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2597) 0 ], value: EXPR [ (1, _2598) 0 ]) ", - "EXPR [ (1, _2597) (-1, _2599) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2599) 0 ], value: EXPR [ (1, _2600) 0 ]) ", - "EXPR [ (1, _2599) (-1, _2601) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2601) 0 ], value: EXPR [ (1, _2602) 0 ]) ", - "EXPR [ (1, _2601) (-1, _2603) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2603) 0 ], value: EXPR [ (1, _2604) 0 ]) ", - "EXPR [ (1, _2603) (-1, _2605) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2605) 0 ], value: EXPR [ (1, _2606) 0 ]) ", - "EXPR [ (1, _2605) (-1, _2607) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2607) 0 ], value: EXPR [ (1, _2608) 0 ]) ", - "EXPR [ (1, _2607) (-1, _2609) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2609) 0 ], value: EXPR [ (1, _2610) 0 ]) ", - "EXPR [ (1, _2609) (-1, _2611) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2611) 0 ], value: EXPR [ (1, _2612) 0 ]) ", - "EXPR [ (1, _2611) (-1, _2613) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2613) 0 ], value: EXPR [ (1, _2614) 0 ]) ", - "EXPR [ (1, _2613) (-1, _2615) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2615) 0 ], value: EXPR [ (1, _2616) 0 ]) ", - "EXPR [ (1, _2615) (-1, _2617) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2617) 0 ], value: EXPR [ (1, _2618) 0 ]) ", - "EXPR [ (1, _2617) (-1, _2619) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2619) 0 ], value: EXPR [ (1, _2620) 0 ]) ", - "EXPR [ (1, _2619) (-1, _2621) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2621) 0 ], value: EXPR [ (1, _2622) 0 ]) ", - "EXPR [ (1, _2621) (-1, _2623) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2623) 0 ], value: EXPR [ (1, _2624) 0 ]) ", - "EXPR [ (1, _2623) (-1, _2625) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2625) 0 ], value: EXPR [ (1, _2626) 0 ]) ", - "EXPR [ (1, _2625) (-1, _2627) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2627) 0 ], value: EXPR [ (1, _2628) 0 ]) ", - "EXPR [ (1, _2627) (-1, _2629) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2629) 0 ], value: EXPR [ (1, _2630) 0 ]) ", - "EXPR [ (1, _2629) (-1, _2631) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2631) 0 ], value: EXPR [ (1, _2632) 0 ]) ", - "EXPR [ (1, _1718, _2221) (1, _2512, _2598) -5000 ]", + "EXPR [ (1, _1718, _2221) (-1, _1718, _2528) (1, _2528) -5000 ]", "BLACKBOX::RANGE [(_53, 1)] []", - "EXPR [ (1, _1718, _2177) (-1, _1718, _2507) (1, _2507) (-1, _2633) 0 ]", - "EXPR [ (1, _1718, _2178) (-1, _1718, _2509) (1, _2509) (-1, _2634) 0 ]", - "EXPR [ (1, _1718, _2179) (-1, _1718, _2511) (1, _2511) (-1, _2635) 0 ]", - "EXPR [ (1, _1718, _2180) (1, _2512, _2514) (-1, _2636) 0 ]", - "EXPR [ (1, _1718, _2181) (1, _2512, _2516) (-1, _2637) 0 ]", - "EXPR [ (1, _1718, _2182) (1, _2512, _2518) (-1, _2638) 0 ]", - "EXPR [ (1, _1718, _2183) (1, _2512, _2520) (-1, _2639) 0 ]", - "EXPR [ (1, _1718, _2184) (1, _2512, _2522) (-1, _2640) 0 ]", - "EXPR [ (1, _1718, _2185) (1, _2512, _2524) (-1, _2641) 0 ]", - "EXPR [ (1, _1718, _2186) (1, _2512, _2526) (-1, _2642) 0 ]", - "EXPR [ (1, _1718, _2187) (1, _2512, _2528) (-1, _2643) 0 ]", - "EXPR [ (1, _1718, _2188) (1, _2512, _2530) (-1, _2644) 0 ]", - "EXPR [ (1, _1718, _2189) (1, _2512, _2532) (-1, _2645) 0 ]", - "EXPR [ (1, _1718, _2190) (1, _2512, _2534) (-1, _2646) 0 ]", - "EXPR [ (1, _1718, _2191) (1, _2512, _2536) (-1, _2647) 0 ]", - "EXPR [ (1, _1718, _2192) (1, _2512, _2538) (-1, _2648) 0 ]", - "EXPR [ (1, _1718, _2193) (1, _2512, _2540) (-1, _2649) 0 ]", - "EXPR [ (1, _1718, _2194) (1, _2512, _2542) (-1, _2650) 0 ]", - "EXPR [ (1, _1718, _2195) (1, _2512, _2544) (-1, _2651) 0 ]", - "EXPR [ (1, _1718, _2196) (1, _2512, _2546) (-1, _2652) 0 ]", - "EXPR [ (1, _1718, _2197) (1, _2512, _2548) (-1, _2653) 0 ]", - "EXPR [ (1, _1718, _2198) (1, _2512, _2550) (-1, _2654) 0 ]", - "EXPR [ (1, _1718, _2199) (1, _2512, _2552) (-1, _2655) 0 ]", - "EXPR [ (1, _1718, _2200) (1, _2512, _2554) (-1, _2656) 0 ]", - "EXPR [ (1, _1718, _2201) (1, _2512, _2556) (-1, _2657) 0 ]", - "EXPR [ (1, _1718, _2202) (1, _2512, _2558) (-1, _2658) 0 ]", - "EXPR [ (1, _1718, _2203) (1, _2512, _2560) (-1, _2659) 0 ]", - "EXPR [ (1, _1718, _2204) (1, _2512, _2562) (-1, _2660) 0 ]", - "EXPR [ (1, _1718, _2205) (1, _2512, _2564) (-1, _2661) 0 ]", - "EXPR [ (1, _1718, _2206) (1, _2512, _2566) (-1, _2662) 0 ]", - "EXPR [ (1, _1718, _2207) (1, _2512, _2568) (-1, _2663) 0 ]", - "EXPR [ (1, _1718, _2208) (1, _2512, _2571) (-1, _2664) 0 ]", - "EXPR [ (1, _1718, _2209) (1, _2512, _2573) (-1, _2665) 0 ]", - "EXPR [ (1, _1718, _2210) (1, _2512, _2575) (-1, _2666) 0 ]", - "EXPR [ (1, _1718, _2211) (1, _2512, _2578) (-1, _2667) 0 ]", - "EXPR [ (1, _1718, _2212) (1, _2512, _2580) (-1, _2668) 0 ]", - "EXPR [ (1, _1718, _2213) (1, _2512, _2582) (-1, _2669) 0 ]", - "EXPR [ (1, _1718, _2214) (1, _2512, _2584) (-1, _2670) 0 ]", - "EXPR [ (1, _1718, _2215) (1, _2512, _2586) (-1, _2671) 0 ]", - "EXPR [ (1, _1718, _2216) (1, _2512, _2588) (-1, _2672) 0 ]", - "EXPR [ (1, _1718, _2217) (1, _2512, _2590) (-1, _2673) 0 ]", - "EXPR [ (1, _1718, _2218) (1, _2512, _2592) (-1, _2674) 0 ]", - "EXPR [ (1, _1718, _2219) (1, _2512, _2594) (-1, _2675) 0 ]", - "EXPR [ (1, _1718, _2220) (1, _2512, _2596) (-1, _2676) 0 ]", - "EXPR [ (-1, _2677) 5000 ]", - "EXPR [ (1, _1718, _2222) (1, _2512, _2600) (-1, _2678) 0 ]", - "EXPR [ (1, _1718, _2223) (1, _2512, _2602) (-1, _2679) 0 ]", - "EXPR [ (1, _1718, _2224) (1, _2512, _2604) (-1, _2680) 0 ]", - "EXPR [ (1, _1718, _2225) (1, _2512, _2606) (-1, _2681) 0 ]", - "EXPR [ (1, _1718, _2226) (1, _2512, _2608) (-1, _2682) 0 ]", - "EXPR [ (1, _1718, _2227) (1, _2512, _2610) (-1, _2683) 0 ]", - "EXPR [ (1, _1718, _2228) (1, _2512, _2612) (-1, _2684) 0 ]", - "EXPR [ (1, _1718, _2229) (1, _2512, _2614) (-1, _2685) 0 ]", - "EXPR [ (1, _1718, _2230) (1, _2512, _2616) (-1, _2686) 0 ]", - "EXPR [ (1, _1718, _2231) (1, _2512, _2618) (-1, _2687) 0 ]", - "EXPR [ (1, _1718, _2232) (1, _2512, _2620) (-1, _2688) 0 ]", - "EXPR [ (1, _1718, _2233) (1, _2512, _2622) (-1, _2689) 0 ]", - "EXPR [ (1, _1718, _2234) (1, _2512, _2624) (-1, _2690) 0 ]", - "EXPR [ (1, _1718, _2235) (1, _2512, _2626) (-1, _2691) 0 ]", - "EXPR [ (1, _1718, _2236) (1, _2512, _2628) (-1, _2692) 0 ]", - "EXPR [ (1, _1718, _2237) (1, _2512, _2630) (-1, _2693) 0 ]", - "EXPR [ (1, _1718, _2238) (1, _2512, _2632) (-1, _2694) 0 ]", - "INIT (id: 46, len: 62, witnesses: [_2633, _2634, _2635, _2636, _2637, _2638, _2639, _2640, _2641, _2642, _2643, _2644, _2645, _2646, _2647, _2648, _2649, _2650, _2651, _2652, _2653, _2654, _2655, _2656, _2657, _2658, _2659, _2660, _2661, _2662, _2663, _2664, _2665, _2666, _2667, _2668, _2669, _2670, _2671, _2672, _2673, _2674, _2675, _2676, _2677, _2678, _2679, _2680, _2681, _2682, _2683, _2684, _2685, _2686, _2687, _2688, _2689, _2690, _2691, _2692, _2693, _2694])", - "INIT (id: 47, len: 5, witnesses: [_30, _120, _803, _804, _805])", - "EXPR [ (2, _53) (-1, _2695) 1 ]", - "MEM (id: 47, read at: EXPR [ (1, _2695) 0 ], value: EXPR [ (1, _2696) 0 ]) ", - "MEM (id: 46, read at: EXPR [ (1, _2696) 0 ], value: EXPR [ (1, _2697) 0 ]) ", - "EXPR [ (1, _2696) (-1, _2698) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2698) 0 ], value: EXPR [ (1, _2699) 0 ]) ", - "EXPR [ (1, _2698) (-1, _2700) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2700) 0 ], value: EXPR [ (1, _2701) 0 ]) ", - "EXPR [ (1, _2700) (-1, _2702) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2702) 0 ], value: EXPR [ (1, _2703) 0 ]) ", - "EXPR [ (1, _2702) (-1, _2704) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2704) 0 ], value: EXPR [ (1, _2705) 0 ]) ", - "EXPR [ (1, _2704) (-1, _2706) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2706) 0 ], value: EXPR [ (1, _2707) 0 ]) ", - "EXPR [ (1, _2706) (-1, _2708) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2708) 0 ], value: EXPR [ (1, _2709) 0 ]) ", - "EXPR [ (1, _2708) (-1, _2710) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2710) 0 ], value: EXPR [ (1, _2711) 0 ]) ", - "EXPR [ (1, _2710) (-1, _2712) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2712) 0 ], value: EXPR [ (1, _2713) 0 ]) ", - "EXPR [ (1, _2712) (-1, _2714) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2714) 0 ], value: EXPR [ (1, _2715) 0 ]) ", - "EXPR [ (1, _2714) (-1, _2716) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2716) 0 ], value: EXPR [ (1, _2717) 0 ]) ", - "EXPR [ (1, _2716) (-1, _2718) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2718) 0 ], value: EXPR [ (1, _2719) 0 ]) ", - "EXPR [ (1, _2718) (-1, _2720) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2720) 0 ], value: EXPR [ (1, _2721) 0 ]) ", - "EXPR [ (1, _2720) (-1, _2722) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2722) 0 ], value: EXPR [ (1, _2723) 0 ]) ", - "EXPR [ (1, _2722) (-1, _2724) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2724) 0 ], value: EXPR [ (1, _2725) 0 ]) ", - "EXPR [ (1, _2724) (-1, _2726) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2726) 0 ], value: EXPR [ (1, _2727) 0 ]) ", - "EXPR [ (1, _2726) (-1, _2728) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2728) 0 ], value: EXPR [ (1, _2729) 0 ]) ", - "EXPR [ (1, _2728) (-1, _2730) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2730) 0 ], value: EXPR [ (1, _2731) 0 ]) ", - "EXPR [ (1, _2730) (-1, _2732) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2732) 0 ], value: EXPR [ (1, _2733) 0 ]) ", - "EXPR [ (1, _2732) (-1, _2734) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2734) 0 ], value: EXPR [ (1, _2735) 0 ]) ", - "EXPR [ (1, _2734) (-1, _2736) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2736) 0 ], value: EXPR [ (1, _2737) 0 ]) ", - "EXPR [ (1, _2736) (-1, _2738) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2738) 0 ], value: EXPR [ (1, _2739) 0 ]) ", - "EXPR [ (1, _2738) (-1, _2740) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2740) 0 ], value: EXPR [ (1, _2741) 0 ]) ", - "EXPR [ (1, _2740) (-1, _2742) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2742) 0 ], value: EXPR [ (1, _2743) 0 ]) ", - "EXPR [ (1, _2742) (-1, _2744) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2744) 0 ], value: EXPR [ (1, _2745) 0 ]) ", - "EXPR [ (1, _2744) (-1, _2746) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2746) 0 ], value: EXPR [ (1, _2747) 0 ]) ", - "EXPR [ (1, _2746) (-1, _2748) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2748) 0 ], value: EXPR [ (1, _2749) 0 ]) ", - "EXPR [ (1, _2748) (-1, _2750) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2750) 0 ], value: EXPR [ (1, _2751) 0 ]) ", - "INIT (id: 48, len: 28, witnesses: [_2697, _2699, _2701, _2703, _2705, _2707, _2709, _2711, _2713, _2715, _2717, _2719, _2721, _2723, _2725, _2727, _2729, _2731, _2733, _2735, _2737, _2739, _2741, _2743, _2745, _2747, _2749, _2751])", - "INIT (id: 49, len: 13, witnesses: [_30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42])", - "MEM (id: 49, read at: EXPR [ (1, _57) 0 ], value: EXPR [ (1, _2752) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _2752) 0 ], value: EXPR [ (1, _2753) 0 ]) ", - "EXPR [ (1, _2752) (-1, _2754) 1 ]", - "MEM (id: 48, read at: EXPR [ (1, _2754) 0 ], value: EXPR [ (1, _2755) 0 ]) ", - "EXPR [ (1, _2754) (-1, _2756) 1 ]", - "MEM (id: 48, read at: EXPR [ (1, _2756) 0 ], value: EXPR [ (1, _2757) 0 ]) ", - "MEM (id: 49, read at: EXPR [ (1, _776) 0 ], value: EXPR [ (1, _2758) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _2758) 0 ], value: EXPR [ (1, _2759) 0 ]) ", - "EXPR [ (1, _2758) (-1, _2760) 1 ]", - "MEM (id: 48, read at: EXPR [ (1, _2760) 0 ], value: EXPR [ (1, _2761) 0 ]) ", - "EXPR [ (1, _2760) (-1, _2762) 1 ]", - "MEM (id: 48, read at: EXPR [ (1, _2762) 0 ], value: EXPR [ (1, _2763) 0 ]) ", - "MEM (id: 49, read at: EXPR [ (1, _46) 0 ], value: EXPR [ (1, _2764) 0 ]) ", - "MEM (id: 48, write EXPR [ (1, _2753) 0 ] at: EXPR [ (1, _2764) 0 ]) ", - "EXPR [ (1, _2764) (-1, _2765) 1 ]", - "MEM (id: 48, write EXPR [ (1, _2755) 0 ] at: EXPR [ (1, _2765) 0 ]) ", - "EXPR [ (1, _2765) (-1, _2766) 1 ]", - "MEM (id: 48, write EXPR [ (1, _2757) 0 ] at: EXPR [ (1, _2766) 0 ]) ", - "MEM (id: 49, read at: EXPR [ (1, _30) 0 ], value: EXPR [ (1, _2767) 0 ]) ", - "MEM (id: 49, read at: EXPR [ (1, _31) 0 ], value: EXPR [ (1, _2768) 0 ]) ", - "MEM (id: 49, read at: EXPR [ (1, _118) 0 ], value: EXPR [ (1, _2769) 0 ]) ", - "MEM (id: 49, read at: EXPR [ (1, _120) 0 ], value: EXPR [ (1, _2770) 0 ]) ", - "MEM (id: 49, read at: EXPR [ (1, _32) 0 ], value: EXPR [ (1, _2771) 0 ]) ", - "MEM (id: 49, read at: EXPR [ (1, _123) 0 ], value: EXPR [ (1, _2772) 0 ]) ", - "MEM (id: 49, read at: EXPR [ (1, _125) 0 ], value: EXPR [ (1, _2773) 0 ]) ", - "MEM (id: 49, read at: EXPR [ (1, _33) 0 ], value: EXPR [ (1, _2774) 0 ]) ", - "MEM (id: 49, read at: EXPR [ (1, _34) 0 ], value: EXPR [ (1, _2775) 0 ]) ", - "MEM (id: 49, read at: EXPR [ (1, _129) 0 ], value: EXPR [ (1, _2776) 0 ]) ", - "MEM (id: 49, read at: EXPR [ (1, _131) 0 ], value: EXPR [ (1, _2777) 0 ]) ", - "MEM (id: 49, read at: EXPR [ (1, _35) 0 ], value: EXPR [ (1, _2778) 0 ]) ", - "MEM (id: 49, read at: EXPR [ (1, _134) 0 ], value: EXPR [ (1, _2779) 0 ]) ", - "INIT (id: 50, len: 13, witnesses: [_2767, _2768, _2769, _2770, _2771, _2772, _2773, _2774, _2775, _2776, _2777, _2778, _2779])", - "EXPR [ (1, _46) (-1, _2780) 1 ]", - "MEM (id: 50, read at: EXPR [ (1, _2780) 0 ], value: EXPR [ (1, _2781) 0 ]) ", - "MEM (id: 48, write EXPR [ (1, _2759) 0 ] at: EXPR [ (1, _2781) 0 ]) ", - "EXPR [ (1, _2781) (-1, _2782) 1 ]", - "MEM (id: 48, write EXPR [ (1, _2761) 0 ] at: EXPR [ (1, _2782) 0 ]) ", - "EXPR [ (1, _2782) (-1, _2783) 1 ]", - "MEM (id: 48, write EXPR [ (1, _2763) 0 ] at: EXPR [ (1, _2783) 0 ]) ", - "MEM (id: 47, read at: EXPR [ (1, _2695) 0 ], value: EXPR [ (1, _2784) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _30) 0 ], value: EXPR [ (1, _2785) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _31) 0 ], value: EXPR [ (1, _2786) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _118) 0 ], value: EXPR [ (1, _2787) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _120) 0 ], value: EXPR [ (1, _2788) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _32) 0 ], value: EXPR [ (1, _2789) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _123) 0 ], value: EXPR [ (1, _2790) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _125) 0 ], value: EXPR [ (1, _2791) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _33) 0 ], value: EXPR [ (1, _2792) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _34) 0 ], value: EXPR [ (1, _2793) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _129) 0 ], value: EXPR [ (1, _2794) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _131) 0 ], value: EXPR [ (1, _2795) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _35) 0 ], value: EXPR [ (1, _2796) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _134) 0 ], value: EXPR [ (1, _2797) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _1067) 0 ], value: EXPR [ (1, _2798) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _36) 0 ], value: EXPR [ (1, _2799) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _37) 0 ], value: EXPR [ (1, _2800) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _1071) 0 ], value: EXPR [ (1, _2801) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _1073) 0 ], value: EXPR [ (1, _2802) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _38) 0 ], value: EXPR [ (1, _2803) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _1076) 0 ], value: EXPR [ (1, _2804) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _1078) 0 ], value: EXPR [ (1, _2805) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _39) 0 ], value: EXPR [ (1, _2806) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _40) 0 ], value: EXPR [ (1, _2807) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _1082) 0 ], value: EXPR [ (1, _2808) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _1084) 0 ], value: EXPR [ (1, _2809) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _41) 0 ], value: EXPR [ (1, _2810) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _1087) 0 ], value: EXPR [ (1, _2811) 0 ]) ", - "MEM (id: 48, read at: EXPR [ (1, _1089) 0 ], value: EXPR [ (1, _2812) 0 ]) ", - "MEM (id: 46, write EXPR [ (1, _2785) 0 ] at: EXPR [ (1, _2784) 0 ]) ", - "EXPR [ (1, _2784) (-1, _2813) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2786) 0 ] at: EXPR [ (1, _2813) 0 ]) ", - "EXPR [ (1, _2813) (-1, _2814) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2787) 0 ] at: EXPR [ (1, _2814) 0 ]) ", - "EXPR [ (1, _2814) (-1, _2815) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2788) 0 ] at: EXPR [ (1, _2815) 0 ]) ", - "EXPR [ (1, _2815) (-1, _2816) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2789) 0 ] at: EXPR [ (1, _2816) 0 ]) ", - "EXPR [ (1, _2816) (-1, _2817) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2790) 0 ] at: EXPR [ (1, _2817) 0 ]) ", - "EXPR [ (1, _2817) (-1, _2818) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2791) 0 ] at: EXPR [ (1, _2818) 0 ]) ", - "EXPR [ (1, _2818) (-1, _2819) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2792) 0 ] at: EXPR [ (1, _2819) 0 ]) ", - "EXPR [ (1, _2819) (-1, _2820) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2793) 0 ] at: EXPR [ (1, _2820) 0 ]) ", - "EXPR [ (1, _2820) (-1, _2821) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2794) 0 ] at: EXPR [ (1, _2821) 0 ]) ", - "EXPR [ (1, _2821) (-1, _2822) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2795) 0 ] at: EXPR [ (1, _2822) 0 ]) ", - "EXPR [ (1, _2822) (-1, _2823) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2796) 0 ] at: EXPR [ (1, _2823) 0 ]) ", - "EXPR [ (1, _2823) (-1, _2824) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2797) 0 ] at: EXPR [ (1, _2824) 0 ]) ", - "EXPR [ (1, _2824) (-1, _2825) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2798) 0 ] at: EXPR [ (1, _2825) 0 ]) ", - "EXPR [ (1, _2825) (-1, _2826) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2799) 0 ] at: EXPR [ (1, _2826) 0 ]) ", - "EXPR [ (1, _2826) (-1, _2827) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2800) 0 ] at: EXPR [ (1, _2827) 0 ]) ", - "EXPR [ (1, _2827) (-1, _2828) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2801) 0 ] at: EXPR [ (1, _2828) 0 ]) ", - "EXPR [ (1, _2828) (-1, _2829) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2802) 0 ] at: EXPR [ (1, _2829) 0 ]) ", - "EXPR [ (1, _2829) (-1, _2830) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2803) 0 ] at: EXPR [ (1, _2830) 0 ]) ", - "EXPR [ (1, _2830) (-1, _2831) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2804) 0 ] at: EXPR [ (1, _2831) 0 ]) ", - "EXPR [ (1, _2831) (-1, _2832) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2805) 0 ] at: EXPR [ (1, _2832) 0 ]) ", - "EXPR [ (1, _2832) (-1, _2833) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2806) 0 ] at: EXPR [ (1, _2833) 0 ]) ", - "EXPR [ (1, _2833) (-1, _2834) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2807) 0 ] at: EXPR [ (1, _2834) 0 ]) ", - "EXPR [ (1, _2834) (-1, _2835) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2808) 0 ] at: EXPR [ (1, _2835) 0 ]) ", - "EXPR [ (1, _2835) (-1, _2836) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2809) 0 ] at: EXPR [ (1, _2836) 0 ]) ", - "EXPR [ (1, _2836) (-1, _2837) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2810) 0 ] at: EXPR [ (1, _2837) 0 ]) ", - "EXPR [ (1, _2837) (-1, _2838) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2811) 0 ] at: EXPR [ (1, _2838) 0 ]) ", - "EXPR [ (1, _2838) (-1, _2839) 1 ]", - "MEM (id: 46, write EXPR [ (1, _2812) 0 ] at: EXPR [ (1, _2839) 0 ]) ", - "MEM (id: 47, read at: EXPR [ (1, _30) 0 ], value: EXPR [ (1, _2840) 0 ]) ", - "MEM (id: 47, read at: EXPR [ (1, _31) 0 ], value: EXPR [ (1, _2841) 0 ]) ", - "MEM (id: 47, read at: EXPR [ (1, _118) 0 ], value: EXPR [ (1, _2842) 0 ]) ", - "MEM (id: 47, read at: EXPR [ (1, _120) 0 ], value: EXPR [ (1, _2843) 0 ]) ", - "MEM (id: 47, read at: EXPR [ (1, _32) 0 ], value: EXPR [ (1, _2844) 0 ]) ", - "INIT (id: 51, len: 5, witnesses: [_2840, _2841, _2842, _2843, _2844])", - "MEM (id: 51, read at: EXPR [ (1, _120) 0 ], value: EXPR [ (1, _2845) 0 ]) ", - "MEM (id: 46, read at: EXPR [ (1, _2845) 0 ], value: EXPR [ (1, _2846) 0 ]) ", - "EXPR [ (1, _2845) (-1, _2847) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2847) 0 ], value: EXPR [ (1, _2848) 0 ]) ", - "EXPR [ (1, _2847) (-1, _2849) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2849) 0 ], value: EXPR [ (1, _2850) 0 ]) ", - "EXPR [ (1, _2849) (-1, _2851) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2851) 0 ], value: EXPR [ (1, _2852) 0 ]) ", - "EXPR [ (1, _2851) (-1, _2853) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2853) 0 ], value: EXPR [ (1, _2854) 0 ]) ", - "EXPR [ (1, _2853) (-1, _2855) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2855) 0 ], value: EXPR [ (1, _2856) 0 ]) ", - "EXPR [ (1, _2855) (-1, _2857) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2857) 0 ], value: EXPR [ (1, _2858) 0 ]) ", - "EXPR [ (1, _2857) (-1, _2859) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2859) 0 ], value: EXPR [ (1, _2860) 0 ]) ", - "EXPR [ (1, _2859) (-1, _2861) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2861) 0 ], value: EXPR [ (1, _2862) 0 ]) ", - "EXPR [ (1, _2861) (-1, _2863) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2863) 0 ], value: EXPR [ (1, _2864) 0 ]) ", - "EXPR [ (1, _2863) (-1, _2865) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2865) 0 ], value: EXPR [ (1, _2866) 0 ]) ", - "EXPR [ (1, _2865) (-1, _2867) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2867) 0 ], value: EXPR [ (1, _2868) 0 ]) ", - "EXPR [ (1, _2867) (-1, _2869) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2869) 0 ], value: EXPR [ (1, _2870) 0 ]) ", - "EXPR [ (1, _2869) (-1, _2871) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2871) 0 ], value: EXPR [ (1, _2872) 0 ]) ", - "EXPR [ (1, _2871) (-1, _2873) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2873) 0 ], value: EXPR [ (1, _2874) 0 ]) ", - "EXPR [ (1, _2873) (-1, _2875) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2875) 0 ], value: EXPR [ (1, _2876) 0 ]) ", - "EXPR [ (1, _2875) (-1, _2877) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2877) 0 ], value: EXPR [ (1, _2878) 0 ]) ", - "EXPR [ (1, _2877) (-1, _2879) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2879) 0 ], value: EXPR [ (1, _2880) 0 ]) ", - "EXPR [ (1, _2879) (-1, _2881) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2881) 0 ], value: EXPR [ (1, _2882) 0 ]) ", - "EXPR [ (1, _2881) (-1, _2883) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2883) 0 ], value: EXPR [ (1, _2884) 0 ]) ", - "EXPR [ (1, _2883) (-1, _2885) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2885) 0 ], value: EXPR [ (1, _2886) 0 ]) ", - "EXPR [ (1, _2885) (-1, _2887) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2887) 0 ], value: EXPR [ (1, _2888) 0 ]) ", - "EXPR [ (1, _2887) (-1, _2889) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2889) 0 ], value: EXPR [ (1, _2890) 0 ]) ", - "EXPR [ (1, _2889) (-1, _2891) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2891) 0 ], value: EXPR [ (1, _2892) 0 ]) ", - "EXPR [ (1, _2891) (-1, _2893) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2893) 0 ], value: EXPR [ (1, _2894) 0 ]) ", - "EXPR [ (1, _2893) (-1, _2895) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2895) 0 ], value: EXPR [ (1, _2896) 0 ]) ", - "EXPR [ (1, _2895) (-1, _2897) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2897) 0 ], value: EXPR [ (1, _2898) 0 ]) ", - "EXPR [ (1, _2897) (-1, _2899) 1 ]", - "MEM (id: 46, read at: EXPR [ (1, _2899) 0 ], value: EXPR [ (1, _2900) 0 ]) ", - "EXPR [ (1, _2848) -20 ]", - "EXPR [ (1, _2850) -19 ]", - "EXPR [ (1, _2852) -5000 ]", "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) } }]", "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": { "50": { "source": "struct Bar {\n inner: [Field; 3],\n}\n\nstruct Foo {\n a: Field,\n b: [Field; 3],\n bar: Bar,\n}\n\nstruct FooParent {\n array: [Field; 3],\n foos: [Foo; 4],\n}\n\nfn main(mut x: [Foo; 4], y: pub u32) {\n assert(x[y - 3].a == 1);\n assert(x[y - 3].b == [2, 3, 20]);\n assert(x[y - 2].a == 4);\n assert(x[y - 2].b == [5, 6, 21]);\n assert(x[y - 1].a == 7);\n assert(x[y - 1].b == [8, 9, 22]);\n assert(x[y].a == 10);\n assert(x[y].b == [11, 12, 23]);\n assert(x[y].bar.inner == [109, 110, 111]);\n // Check dynamic array set\n if y != 2 {\n x[y].a = 50;\n } else {\n x[y].a = 100;\n }\n assert(x[3].a == 50);\n\n if y == 2 {\n x[y - 1].b = [50, 51, 52];\n } else {\n x[y - 1].b = [100, 101, 102];\n }\n assert(x[2].b == [100, 101, 102]);\n\n assert(x[y - 3].bar.inner == [100, 101, 102]);\n assert(x[y - 2].bar.inner == [103, 104, 105]);\n assert(x[y - 1].bar.inner == [106, 107, 108]);\n assert(x[y].bar.inner == [109, 110, 111]);\n\n let foo_parent_one = FooParent { array: [0, 1, 2], foos: x };\n let foo_parent_two = FooParent { array: [3, 4, 5], foos: x };\n let mut foo_parents = [foo_parent_one, foo_parent_two];\n\n assert(foo_parents[y - 3].foos[y - 3].b == [2, 3, 20]);\n assert(foo_parents[y - 3].foos[y - 2].b == [5, 6, 21]);\n assert(foo_parents[y - 3].foos[y - 1].b == [100, 101, 102]);\n assert(foo_parents[y - 3].foos[y].b == [11, 12, 23]);\n\n assert(foo_parents[y - 3].foos[y].a == 50);\n\n assert(foo_parents[1].foos[1].b == [5, 6, 21]);\n if y == 2 {\n foo_parents[y - 2].foos[y - 2].b = [10, 9, 8];\n } else {\n foo_parents[y - 2].foos[y - 2].b = [20, 19, 18];\n }\n assert(foo_parents[1].foos[1].b == [20, 19, 18]);\n\n assert(foo_parents[1].foos[1].b[2] == 18);\n if y == 3 {\n foo_parents[y - 2].foos[y - 2].b[y - 1] = 5000;\n } else {\n foo_parents[y - 2].foos[y - 2].b[y - 1] = 1000;\n }\n assert(foo_parents[1].foos[1].b[2] == 5000);\n // Set a dynamic array value\n foo_parents[y - 2].foos[y - 3].b = foo_parents[y - 2].foos[y - 2].b;\n assert(foo_parents[1].foos[0].b == [20, 19, 5000]);\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index ca85221a540..fdf6b844ae1 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -94,9 +94,9 @@ expression: artifact "return value indices : []", "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 }]), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(28))], q_c: 0 })], outputs: []", "unconstrained func 0", - "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32867 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 29 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32838), size_address: Relative(3), offset_address: Relative(4) }, Cast { destination: Direct(32866), source: Direct(32866), bit_size: Integer(U32) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32838 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 13 }, 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) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 7 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 11 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 14 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 15 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 18 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 8 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 21 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 22 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 25 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 11 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Mov { destination: Relative(1), source: Relative(3) }, Mov { destination: Relative(2), source: Direct(32866) }, Call { location: 176 }, Call { location: 180 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32867 }, 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: 175 }, 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: 168 }, Return, Const { destination: Direct(32835), bit_size: Integer(U1), value: 1 }, Const { destination: Direct(32836), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(32837), bit_size: Integer(U32), value: 3 }, Return, Call { location: 1781 }, 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) }, BinaryIntOp { destination: Relative(4), op: Sub, bit_size: U32, lhs: Relative(2), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U32, lhs: Direct(32837), rhs: Relative(2) }, JumpIf { condition: Relative(5), location: 188 }, Call { location: 1787 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(5) }, JumpIf { condition: Relative(6), location: 192 }, Call { location: 1790 }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, 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(32836) }, 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) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(10) }, 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(6), source_pointer: Relative(13) }, Load { destination: Relative(12), 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(12) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 211 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(12) }, Load { destination: Relative(12), source_pointer: Relative(6) }, 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: 219 }, Call { location: 1793 }, 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(12), bit_size: Field, value: 1 }, BinaryFieldOp { destination: Relative(15), op: Equals, lhs: Relative(7), rhs: Relative(12) }, JumpIf { condition: Relative(15), location: 226 }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(16) } }, Load { destination: Relative(7), 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(7) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 232 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(7) }, Load { destination: Relative(7), source_pointer: Relative(6) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(17), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(7) }, Not { destination: Relative(17), source: Relative(17), bit_size: U1 }, JumpIf { condition: Relative(17), location: 240 }, Call { location: 1793 }, 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: Field, value: 2 }, Const { destination: Relative(7), bit_size: Field, value: 3 }, Const { destination: Relative(17), bit_size: Field, value: 20 }, Mov { destination: Relative(18), 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(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(6) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Relative(7) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Relative(17) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 21 }, Mov { destination: Relative(21), source: Direct(0) }, Mov { destination: Relative(22), source: Relative(9) }, Mov { destination: Relative(23), source: Relative(18) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(20) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(19), source: Relative(22) }, JumpIf { condition: Relative(19), location: 267 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(9) } }, BinaryIntOp { destination: Relative(9), op: Sub, bit_size: U32, lhs: Relative(2), rhs: Relative(10) }, BinaryIntOp { destination: Relative(19), op: LessThanEquals, bit_size: U32, lhs: Relative(10), rhs: Relative(2) }, JumpIf { condition: Relative(19), location: 271 }, Call { location: 1787 }, BinaryIntOp { destination: Relative(19), op: LessThan, bit_size: U32, lhs: Relative(9), rhs: Relative(5) }, JumpIf { condition: Relative(19), location: 274 }, Call { location: 1790 }, BinaryIntOp { destination: Relative(19), op: Mul, bit_size: U32, lhs: Relative(9), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(1), 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(32836) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(1), 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: Relative(10) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(23) }, Load { destination: Relative(19), source_pointer: Relative(25) }, Load { destination: Relative(24), source_pointer: Relative(22) }, Const { destination: Relative(25), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(26), op: Equals, bit_size: U32, lhs: Relative(25), rhs: Relative(24) }, Not { destination: Relative(26), source: Relative(26), bit_size: U1 }, JumpIf { condition: Relative(26), location: 292 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(24), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(24) }, Load { destination: Relative(24), source_pointer: Relative(19) }, Const { destination: Relative(26), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(27), op: Equals, bit_size: U32, lhs: Relative(26), rhs: Relative(24) }, Not { destination: Relative(27), source: Relative(27), bit_size: U1 }, JumpIf { condition: Relative(27), location: 300 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(24), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(24) }, Const { destination: Relative(24), bit_size: Field, value: 4 }, BinaryFieldOp { destination: Relative(27), op: Equals, lhs: Relative(20), rhs: Relative(24) }, JumpIf { condition: Relative(27), location: 307 }, Const { destination: Relative(28), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(28) } }, Load { destination: Relative(20), source_pointer: Relative(22) }, Const { destination: Relative(27), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(28), op: Equals, bit_size: U32, lhs: Relative(27), rhs: Relative(20) }, Not { destination: Relative(28), source: Relative(28), bit_size: U1 }, JumpIf { condition: Relative(28), location: 313 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(20) }, Load { destination: Relative(20), source_pointer: Relative(19) }, Const { destination: Relative(28), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(29), op: Equals, bit_size: U32, lhs: Relative(28), rhs: Relative(20) }, Not { destination: Relative(29), source: Relative(29), bit_size: U1 }, JumpIf { condition: Relative(29), location: 321 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(20) }, Const { destination: Relative(19), bit_size: Field, value: 5 }, Const { destination: Relative(20), bit_size: Field, value: 6 }, Const { destination: Relative(29), bit_size: Field, value: 21 }, Mov { destination: Relative(30), source: Direct(1) }, Const { destination: Relative(31), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(31) }, IndirectConst { destination_pointer: Relative(30), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(30), rhs: Direct(2) }, Mov { destination: Relative(32), source: Relative(31) }, Store { destination_pointer: Relative(32), source: Relative(19) }, BinaryIntOp { destination: Relative(32), op: Add, bit_size: U32, lhs: Relative(32), rhs: Direct(2) }, Store { destination_pointer: Relative(32), source: Relative(20) }, BinaryIntOp { destination: Relative(32), op: Add, bit_size: U32, lhs: Relative(32), rhs: Direct(2) }, Store { destination_pointer: Relative(32), source: Relative(29) }, Const { destination: Relative(29), bit_size: Integer(U32), value: 31 }, Mov { destination: Relative(31), source: Direct(0) }, Mov { destination: Relative(32), source: Relative(22) }, Mov { destination: Relative(33), source: Relative(30) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(29) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(20), source: Relative(32) }, JumpIf { condition: Relative(20), location: 348 }, Const { destination: Relative(22), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(22) } }, BinaryIntOp { destination: Relative(20), op: Sub, bit_size: U32, lhs: Relative(2), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(22), op: LessThanEquals, bit_size: U32, lhs: Direct(32836), rhs: Relative(2) }, JumpIf { condition: Relative(22), location: 352 }, Call { location: 1787 }, BinaryIntOp { destination: Relative(22), op: LessThan, bit_size: U32, lhs: Relative(20), rhs: Relative(5) }, JumpIf { condition: Relative(22), location: 355 }, Call { location: 1790 }, BinaryIntOp { destination: Relative(22), op: Mul, bit_size: U32, lhs: Relative(20), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(32), op: Add, bit_size: U32, lhs: Relative(31), rhs: Relative(22) }, Load { destination: Relative(29), source_pointer: Relative(32) }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(33), op: Add, bit_size: U32, lhs: Relative(1), 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) }, BinaryIntOp { destination: Relative(33), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(10) }, BinaryIntOp { destination: Relative(34), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(35), op: Add, bit_size: U32, lhs: Relative(34), rhs: Relative(33) }, Load { destination: Relative(22), source_pointer: Relative(35) }, Load { destination: Relative(34), source_pointer: Relative(32) }, Const { destination: Relative(35), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(36), op: Equals, bit_size: U32, lhs: Relative(35), rhs: Relative(34) }, Not { destination: Relative(36), source: Relative(36), bit_size: U1 }, JumpIf { condition: Relative(36), location: 373 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(34), op: Add, bit_size: U32, lhs: Relative(34), rhs: Direct(2) }, Store { destination_pointer: Relative(32), source: Relative(34) }, Load { destination: Relative(34), source_pointer: Relative(22) }, Const { destination: Relative(36), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(37), op: Equals, bit_size: U32, lhs: Relative(36), rhs: Relative(34) }, Not { destination: Relative(37), source: Relative(37), bit_size: U1 }, JumpIf { condition: Relative(37), location: 381 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(34), op: Add, bit_size: U32, lhs: Relative(34), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(34) }, Const { destination: Relative(34), bit_size: Field, value: 7 }, BinaryFieldOp { destination: Relative(37), op: Equals, lhs: Relative(29), rhs: Relative(34) }, JumpIf { condition: Relative(37), location: 388 }, Const { destination: Relative(38), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(38) } }, Load { destination: Relative(29), source_pointer: Relative(32) }, Const { destination: Relative(34), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(37), op: Equals, bit_size: U32, lhs: Relative(34), rhs: Relative(29) }, Not { destination: Relative(37), source: Relative(37), bit_size: U1 }, JumpIf { condition: Relative(37), location: 394 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(29), rhs: Direct(2) }, Store { destination_pointer: Relative(32), source: Relative(29) }, Load { destination: Relative(29), source_pointer: Relative(22) }, Const { destination: Relative(37), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(38), op: Equals, bit_size: U32, lhs: Relative(37), rhs: Relative(29) }, Not { destination: Relative(38), source: Relative(38), bit_size: U1 }, JumpIf { condition: Relative(38), location: 402 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(29), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(29) }, Const { destination: Relative(22), bit_size: Field, value: 8 }, Const { destination: Relative(29), bit_size: Field, value: 9 }, Const { destination: Relative(38), bit_size: Field, value: 22 }, Mov { destination: Relative(39), source: Direct(1) }, Const { destination: Relative(40), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(40) }, IndirectConst { destination_pointer: Relative(39), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(40), op: Add, bit_size: U32, lhs: Relative(39), rhs: Direct(2) }, Mov { destination: Relative(41), source: Relative(40) }, Store { destination_pointer: Relative(41), source: Relative(22) }, BinaryIntOp { destination: Relative(41), op: Add, bit_size: U32, lhs: Relative(41), rhs: Direct(2) }, Store { destination_pointer: Relative(41), source: Relative(29) }, BinaryIntOp { destination: Relative(41), op: Add, bit_size: U32, lhs: Relative(41), rhs: Direct(2) }, Store { destination_pointer: Relative(41), source: Relative(38) }, Const { destination: Relative(40), bit_size: Integer(U32), value: 41 }, Mov { destination: Relative(41), source: Direct(0) }, Mov { destination: Relative(42), source: Relative(32) }, Mov { destination: Relative(43), source: Relative(39) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(40) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(38), source: Relative(42) }, JumpIf { condition: Relative(38), location: 429 }, Const { destination: Relative(32), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(32) } }, BinaryIntOp { destination: Relative(32), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, JumpIf { condition: Relative(32), location: 432 }, Call { location: 1790 }, BinaryIntOp { destination: Relative(32), op: Mul, bit_size: U32, lhs: Relative(2), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(39), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(40), op: Add, bit_size: U32, lhs: Relative(39), rhs: Relative(32) }, Load { destination: Relative(38), source_pointer: Relative(40) }, BinaryIntOp { destination: Relative(39), op: Add, bit_size: U32, lhs: Relative(32), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(41), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(42), op: Add, bit_size: U32, lhs: Relative(41), rhs: Relative(39) }, Load { destination: Relative(40), source_pointer: Relative(42) }, BinaryIntOp { destination: Relative(41), op: Add, bit_size: U32, lhs: Relative(32), rhs: Relative(10) }, BinaryIntOp { destination: Relative(43), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(44), op: Add, bit_size: U32, lhs: Relative(43), rhs: Relative(41) }, Load { destination: Relative(42), source_pointer: Relative(44) }, Load { destination: Relative(43), source_pointer: Relative(40) }, Const { destination: Relative(44), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(45), op: Equals, bit_size: U32, lhs: Relative(44), rhs: Relative(43) }, Not { destination: Relative(45), source: Relative(45), bit_size: U1 }, JumpIf { condition: Relative(45), location: 450 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(43), op: Add, bit_size: U32, lhs: Relative(43), rhs: Direct(2) }, Store { destination_pointer: Relative(40), source: Relative(43) }, Load { destination: Relative(43), source_pointer: Relative(42) }, Const { destination: Relative(45), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(46), op: Equals, bit_size: U32, lhs: Relative(45), rhs: Relative(43) }, Not { destination: Relative(46), source: Relative(46), bit_size: U1 }, JumpIf { condition: Relative(46), location: 458 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(43), op: Add, bit_size: U32, lhs: Relative(43), rhs: Direct(2) }, Store { destination_pointer: Relative(42), source: Relative(43) }, Const { destination: Relative(43), bit_size: Field, value: 10 }, BinaryFieldOp { destination: Relative(46), op: Equals, lhs: Relative(38), rhs: Relative(43) }, JumpIf { condition: Relative(46), location: 465 }, Const { destination: Relative(47), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(47) } }, Load { destination: Relative(38), source_pointer: Relative(40) }, Const { destination: Relative(46), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(47), op: Equals, bit_size: U32, lhs: Relative(46), rhs: Relative(38) }, Not { destination: Relative(47), source: Relative(47), bit_size: U1 }, JumpIf { condition: Relative(47), location: 471 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(38), op: Add, bit_size: U32, lhs: Relative(38), rhs: Direct(2) }, Store { destination_pointer: Relative(40), source: Relative(38) }, Load { destination: Relative(38), source_pointer: Relative(42) }, Const { destination: Relative(47), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(48), op: Equals, bit_size: U32, lhs: Relative(47), rhs: Relative(38) }, Not { destination: Relative(48), source: Relative(48), bit_size: U1 }, JumpIf { condition: Relative(48), location: 479 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(38), op: Add, bit_size: U32, lhs: Relative(38), rhs: Direct(2) }, Store { destination_pointer: Relative(42), source: Relative(38) }, Const { destination: Relative(38), bit_size: Field, value: 11 }, Const { destination: Relative(48), bit_size: Field, value: 12 }, Const { destination: Relative(49), bit_size: Field, value: 23 }, Mov { destination: Relative(50), source: Direct(1) }, Const { destination: Relative(51), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(51) }, IndirectConst { destination_pointer: Relative(50), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(51), op: Add, bit_size: U32, lhs: Relative(50), rhs: Direct(2) }, Mov { destination: Relative(52), source: Relative(51) }, Store { destination_pointer: Relative(52), source: Relative(38) }, BinaryIntOp { destination: Relative(52), op: Add, bit_size: U32, lhs: Relative(52), rhs: Direct(2) }, Store { destination_pointer: Relative(52), source: Relative(48) }, BinaryIntOp { destination: Relative(52), op: Add, bit_size: U32, lhs: Relative(52), rhs: Direct(2) }, Store { destination_pointer: Relative(52), source: Relative(49) }, Const { destination: Relative(48), bit_size: Integer(U32), value: 51 }, Mov { destination: Relative(51), source: Direct(0) }, Mov { destination: Relative(52), source: Relative(40) }, Mov { destination: Relative(53), source: Relative(50) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(48) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(38), source: Relative(52) }, JumpIf { condition: Relative(38), location: 506 }, Const { destination: Relative(48), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(48) } }, Load { destination: Relative(38), source_pointer: Relative(40) }, Const { destination: Relative(48), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(49), op: Equals, bit_size: U32, lhs: Relative(48), rhs: Relative(38) }, Not { destination: Relative(49), source: Relative(49), bit_size: U1 }, JumpIf { condition: Relative(49), location: 512 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(38), op: Add, bit_size: U32, lhs: Relative(38), rhs: Direct(2) }, Store { destination_pointer: Relative(40), source: Relative(38) }, Load { destination: Relative(38), source_pointer: Relative(42) }, Const { destination: Relative(49), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(51), op: Equals, bit_size: U32, lhs: Relative(49), rhs: Relative(38) }, Not { destination: Relative(51), source: Relative(51), bit_size: U1 }, JumpIf { condition: Relative(51), location: 520 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(38), op: Add, bit_size: U32, lhs: Relative(38), rhs: Direct(2) }, Store { destination_pointer: Relative(42), source: Relative(38) }, Const { destination: Relative(38), bit_size: Field, value: 109 }, Const { destination: Relative(51), bit_size: Field, value: 110 }, Const { destination: Relative(52), bit_size: Field, value: 111 }, Mov { destination: Relative(53), source: Direct(1) }, Const { destination: Relative(54), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(54) }, IndirectConst { destination_pointer: Relative(53), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(54), op: Add, bit_size: U32, lhs: Relative(53), rhs: Direct(2) }, Mov { destination: Relative(55), source: Relative(54) }, Store { destination_pointer: Relative(55), source: Relative(38) }, BinaryIntOp { destination: Relative(55), op: Add, bit_size: U32, lhs: Relative(55), rhs: Direct(2) }, Store { destination_pointer: Relative(55), source: Relative(51) }, BinaryIntOp { destination: Relative(55), op: Add, bit_size: U32, lhs: Relative(55), rhs: Direct(2) }, Store { destination_pointer: Relative(55), source: Relative(52) }, Const { destination: Relative(51), bit_size: Integer(U32), value: 54 }, Mov { destination: Relative(54), source: Direct(0) }, Mov { destination: Relative(55), source: Relative(42) }, Mov { destination: Relative(56), source: Relative(53) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(51) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(38), source: Relative(55) }, JumpIf { condition: Relative(38), location: 547 }, Const { destination: Relative(51), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(51) } }, BinaryIntOp { destination: Relative(38), op: Equals, bit_size: U32, lhs: Relative(2), rhs: Relative(10) }, BinaryIntOp { destination: Relative(51), op: Add, bit_size: U32, lhs: Relative(39), rhs: Direct(32836) }, Const { destination: Relative(52), bit_size: Field, value: 100 }, Const { destination: Relative(54), bit_size: Field, value: 50 }, JumpIf { condition: Relative(38), location: 576 }, Jump { location: 553 }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, 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(32) }, Store { destination_pointer: Relative(15), source: Relative(54) }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, Mov { destination: Relative(1), source: Direct(32773) }, 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(39) }, Store { destination_pointer: Relative(15), source: Relative(40) }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, 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(51) }, Store { destination_pointer: Relative(15), source: Relative(42) }, Store { destination_pointer: Relative(3), source: Relative(13) }, Jump { location: 599 }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, 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(32) }, Store { destination_pointer: Relative(15), source: Relative(52) }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, Mov { destination: Relative(1), source: Direct(32773) }, 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(39) }, Store { destination_pointer: Relative(15), source: Relative(40) }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, 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(51) }, Store { destination_pointer: Relative(15), source: Relative(42) }, Store { destination_pointer: Relative(3), source: Relative(13) }, Jump { location: 599 }, Load { destination: Relative(1), source_pointer: Relative(3) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(13) }, Load { destination: Relative(14), source_pointer: Relative(15) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 11 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(16) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 12 }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(13) }, Load { destination: Relative(16), source_pointer: Relative(25) }, Load { destination: Relative(1), source_pointer: Relative(15) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(25), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(1) }, Not { destination: Relative(25), source: Relative(25), bit_size: U1 }, JumpIf { condition: Relative(25), location: 615 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(1) }, Load { destination: Relative(1), source_pointer: Relative(16) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(25), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(1) }, Not { destination: Relative(25), source: Relative(25), bit_size: U1 }, JumpIf { condition: Relative(25), location: 623 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(1) }, BinaryFieldOp { destination: Relative(1), op: Equals, lhs: Relative(14), rhs: Relative(54) }, JumpIf { condition: Relative(1), location: 629 }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(16) } }, Const { destination: Relative(1), bit_size: Field, value: 101 }, Const { destination: Relative(14), bit_size: Field, value: 102 }, Mov { destination: Relative(16), source: Direct(1) }, Const { destination: Relative(25), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(25) }, IndirectConst { destination_pointer: Relative(16), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Mov { destination: Relative(26), source: Relative(25) }, Store { destination_pointer: Relative(26), source: Relative(52) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(26), rhs: Direct(2) }, Store { destination_pointer: Relative(26), source: Relative(1) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(26), rhs: Direct(2) }, Store { destination_pointer: Relative(26), source: Relative(14) }, Load { destination: Relative(1), source_pointer: Relative(16) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(25), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(1) }, Not { destination: Relative(25), source: Relative(25), bit_size: U1 }, JumpIf { condition: Relative(25), location: 648 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(1) }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(31), rhs: Direct(32836) }, JumpIf { condition: Relative(38), location: 681 }, Jump { location: 653 }, Load { destination: Relative(13), source_pointer: Relative(16) }, 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: 659 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(13) }, Load { destination: Relative(13), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Relative(33) }, Load { destination: Relative(15), source_pointer: Relative(26) }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, 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(31) }, Store { destination_pointer: Relative(27), source: Relative(16) }, Mov { destination: Direct(32771), source: Relative(25) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, Mov { destination: Relative(13), source: Direct(32773) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(26), rhs: Relative(1) }, Store { destination_pointer: Relative(27), source: Relative(15) }, Store { destination_pointer: Relative(3), source: Relative(13) }, Jump { location: 715 }, Const { destination: Relative(1), bit_size: Field, value: 51 }, Const { destination: Relative(13), bit_size: Field, value: 52 }, 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(25), source: Relative(15) }, Store { destination_pointer: Relative(25), source: Relative(54) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, Store { destination_pointer: Relative(25), source: Relative(1) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, Store { destination_pointer: Relative(25), source: Relative(13) }, Load { destination: Relative(1), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(33) }, Load { destination: Relative(13), source_pointer: Relative(25) }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Relative(31) }, Store { destination_pointer: Relative(26), source: Relative(14) }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(31), rhs: Direct(32836) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, Mov { destination: Relative(14), source: Direct(32773) }, 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(1) }, Store { destination_pointer: Relative(26), source: Relative(13) }, Store { destination_pointer: Relative(3), source: Relative(14) }, Jump { location: 715 }, Load { destination: Relative(1), source_pointer: Relative(3) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 8 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Load { destination: Relative(13), source_pointer: Relative(14) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Load { destination: Relative(14), source_pointer: Relative(15) }, Load { destination: Relative(3), source_pointer: Relative(13) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(25), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(3) }, Not { destination: Relative(25), source: Relative(25), bit_size: U1 }, JumpIf { condition: Relative(25), location: 728 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(3) }, Load { destination: Relative(3), source_pointer: Relative(14) }, Const { destination: Relative(25), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(26), op: Equals, bit_size: U32, lhs: Relative(25), rhs: Relative(3) }, Not { destination: Relative(26), source: Relative(26), bit_size: U1 }, JumpIf { condition: Relative(26), location: 736 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(3) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 55 }, Mov { destination: Relative(55), source: Direct(0) }, Mov { destination: Relative(56), source: Relative(13) }, Mov { destination: Relative(57), source: Relative(16) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(14) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(3), source: Relative(56) }, JumpIf { condition: Relative(3), location: 749 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(13) } }, 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(8) }, Load { destination: Relative(3), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(11) }, Load { destination: Relative(13), source_pointer: Relative(26) }, Load { destination: Relative(14), source_pointer: Relative(3) }, Const { destination: Relative(26), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(27), op: Equals, bit_size: U32, lhs: Relative(26), rhs: Relative(14) }, Not { destination: Relative(27), source: Relative(27), bit_size: U1 }, JumpIf { condition: Relative(27), location: 761 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(14) }, Load { destination: Relative(3), source_pointer: Relative(13) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(27), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(3) }, Not { destination: Relative(27), source: Relative(27), bit_size: U1 }, JumpIf { condition: Relative(27), location: 769 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(3) }, Const { destination: Relative(27), bit_size: Integer(U32), value: 55 }, Mov { destination: Relative(55), source: Direct(0) }, Mov { destination: Relative(56), source: Relative(13) }, Mov { destination: Relative(57), source: Relative(16) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(27) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(3), source: Relative(56) }, JumpIf { condition: Relative(3), location: 782 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(13) } }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(21) }, Load { destination: Relative(3), source_pointer: Relative(27) }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(28), op: Add, bit_size: U32, lhs: Relative(27), rhs: Relative(23) }, Load { destination: Relative(13), source_pointer: Relative(28) }, Load { destination: Relative(27), source_pointer: Relative(3) }, Const { destination: Relative(28), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(34), op: Equals, bit_size: U32, lhs: Relative(28), rhs: Relative(27) }, Not { destination: Relative(34), source: Relative(34), bit_size: U1 }, JumpIf { condition: Relative(34), location: 794 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(27), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(27) }, Load { destination: Relative(3), source_pointer: Relative(13) }, Const { destination: Relative(27), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(34), op: Equals, bit_size: U32, lhs: Relative(27), rhs: Relative(3) }, Not { destination: Relative(34), source: Relative(34), bit_size: U1 }, JumpIf { condition: Relative(34), location: 802 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(3) }, Const { destination: Relative(3), bit_size: Field, value: 103 }, Const { destination: Relative(34), bit_size: Field, value: 104 }, Const { destination: Relative(35), bit_size: Field, value: 105 }, Mov { destination: Relative(36), source: Direct(1) }, Const { destination: Relative(37), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(37) }, IndirectConst { destination_pointer: Relative(36), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(37), op: Add, bit_size: U32, lhs: Relative(36), rhs: Direct(2) }, Mov { destination: Relative(40), source: Relative(37) }, Store { destination_pointer: Relative(40), source: Relative(3) }, BinaryIntOp { destination: Relative(40), op: Add, bit_size: U32, lhs: Relative(40), rhs: Direct(2) }, Store { destination_pointer: Relative(40), source: Relative(34) }, BinaryIntOp { destination: Relative(40), op: Add, bit_size: U32, lhs: Relative(40), rhs: Direct(2) }, Store { destination_pointer: Relative(40), source: Relative(35) }, Const { destination: Relative(34), bit_size: Integer(U32), value: 55 }, Mov { destination: Relative(55), source: Direct(0) }, Mov { destination: Relative(56), source: Relative(13) }, Mov { destination: Relative(57), source: Relative(36) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(34) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(3), source: Relative(56) }, JumpIf { condition: Relative(3), location: 829 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(13) } }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(34), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(31) }, Load { destination: Relative(3), source_pointer: Relative(34) }, BinaryIntOp { destination: Relative(34), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(35), op: Add, bit_size: U32, lhs: Relative(34), rhs: Relative(33) }, Load { destination: Relative(13), source_pointer: Relative(35) }, Load { destination: Relative(34), source_pointer: Relative(3) }, Const { destination: Relative(35), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(36), op: Equals, bit_size: U32, lhs: Relative(35), rhs: Relative(34) }, Not { destination: Relative(36), source: Relative(36), bit_size: U1 }, JumpIf { condition: Relative(36), location: 841 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(34), op: Add, bit_size: U32, lhs: Relative(34), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(34) }, Load { destination: Relative(3), source_pointer: Relative(13) }, Const { destination: Relative(34), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(36), op: Equals, bit_size: U32, lhs: Relative(34), rhs: Relative(3) }, Not { destination: Relative(36), source: Relative(36), bit_size: U1 }, JumpIf { condition: Relative(36), location: 849 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(3) }, Const { destination: Relative(3), bit_size: Field, value: 106 }, Const { destination: Relative(36), bit_size: Field, value: 107 }, Const { destination: Relative(37), bit_size: Field, value: 108 }, Mov { destination: Relative(40), source: Direct(1) }, Const { destination: Relative(42), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(42) }, IndirectConst { destination_pointer: Relative(40), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(42), op: Add, bit_size: U32, lhs: Relative(40), rhs: Direct(2) }, Mov { destination: Relative(44), source: Relative(42) }, Store { destination_pointer: Relative(44), source: Relative(3) }, BinaryIntOp { destination: Relative(44), op: Add, bit_size: U32, lhs: Relative(44), rhs: Direct(2) }, Store { destination_pointer: Relative(44), source: Relative(36) }, BinaryIntOp { destination: Relative(44), op: Add, bit_size: U32, lhs: Relative(44), rhs: Direct(2) }, Store { destination_pointer: Relative(44), source: Relative(37) }, Const { destination: Relative(36), bit_size: Integer(U32), value: 55 }, Mov { destination: Relative(55), source: Direct(0) }, Mov { destination: Relative(56), source: Relative(13) }, Mov { destination: Relative(57), source: Relative(40) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(36) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(3), source: Relative(56) }, JumpIf { condition: Relative(3), location: 876 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(13) } }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(36), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(39) }, Load { destination: Relative(3), source_pointer: Relative(36) }, BinaryIntOp { destination: Relative(36), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(37), op: Add, bit_size: U32, lhs: Relative(36), rhs: Relative(41) }, Load { destination: Relative(13), source_pointer: Relative(37) }, Load { destination: Relative(36), source_pointer: Relative(3) }, Const { destination: Relative(37), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(40), op: Equals, bit_size: U32, lhs: Relative(37), rhs: Relative(36) }, Not { destination: Relative(40), source: Relative(40), bit_size: U1 }, JumpIf { condition: Relative(40), location: 888 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(36), op: Add, bit_size: U32, lhs: Relative(36), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(36) }, Load { destination: Relative(3), source_pointer: Relative(13) }, Const { destination: Relative(36), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(40), op: Equals, bit_size: U32, lhs: Relative(36), rhs: Relative(3) }, Not { destination: Relative(40), source: Relative(40), bit_size: U1 }, JumpIf { condition: Relative(40), location: 896 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(3) }, Load { destination: Relative(3), source_pointer: Relative(53) }, Const { destination: Relative(40), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(42), op: Equals, bit_size: U32, lhs: Relative(40), rhs: Relative(3) }, Not { destination: Relative(42), source: Relative(42), bit_size: U1 }, JumpIf { condition: Relative(42), location: 904 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(53), source: Relative(3) }, Const { destination: Relative(42), bit_size: Integer(U32), value: 55 }, Mov { destination: Relative(55), source: Direct(0) }, Mov { destination: Relative(56), source: Relative(13) }, Mov { destination: Relative(57), source: Relative(53) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(42) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(3), source: Relative(56) }, JumpIf { condition: Relative(3), location: 917 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(13) } }, Const { destination: Relative(3), bit_size: Field, value: 0 }, Mov { destination: Relative(13), source: Direct(1) }, Const { destination: Relative(42), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(42) }, IndirectConst { destination_pointer: Relative(13), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(42), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Mov { destination: Relative(44), source: Relative(42) }, Store { destination_pointer: Relative(44), source: Relative(3) }, BinaryIntOp { destination: Relative(44), op: Add, bit_size: U32, lhs: Relative(44), rhs: Direct(2) }, Store { destination_pointer: Relative(44), source: Relative(12) }, BinaryIntOp { destination: Relative(44), op: Add, bit_size: U32, lhs: Relative(44), rhs: Direct(2) }, Store { destination_pointer: Relative(44), source: Relative(6) }, Load { destination: Relative(3), source_pointer: Relative(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(3) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 935 }, Call { location: 1793 }, 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(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(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Mov { destination: Relative(42), source: Relative(12) }, Store { destination_pointer: Relative(42), source: Relative(7) }, BinaryIntOp { destination: Relative(42), op: Add, bit_size: U32, lhs: Relative(42), rhs: Direct(2) }, Store { destination_pointer: Relative(42), source: Relative(24) }, BinaryIntOp { destination: Relative(42), op: Add, bit_size: U32, lhs: Relative(42), rhs: Direct(2) }, Store { destination_pointer: Relative(42), source: Relative(19) }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 5 }, 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(19), source: Relative(12) }, 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(1) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(3) }, 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(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(7) }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(10) }, JumpIf { condition: Relative(13), location: 967 }, Call { location: 1790 }, BinaryIntOp { destination: Relative(13), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Relative(10) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(13) }, Load { destination: Relative(4), source_pointer: Relative(24) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(42), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(19) }, Load { destination: Relative(13), source_pointer: Relative(42) }, Load { destination: Relative(19), source_pointer: Relative(4) }, Const { destination: Relative(24), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(42), op: Equals, bit_size: U32, lhs: Relative(24), rhs: Relative(19) }, Not { destination: Relative(42), source: Relative(42), bit_size: U1 }, JumpIf { condition: Relative(42), location: 981 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(19) }, Load { destination: Relative(19), source_pointer: Relative(13) }, Const { destination: Relative(42), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(44), op: Equals, bit_size: U32, lhs: Relative(42), rhs: Relative(19) }, Not { destination: Relative(44), source: Relative(44), bit_size: U1 }, JumpIf { condition: Relative(44), location: 989 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(19) }, BinaryIntOp { destination: Relative(44), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(45), op: Add, bit_size: U32, lhs: Relative(44), rhs: Relative(8) }, Load { destination: Relative(19), source_pointer: Relative(45) }, BinaryIntOp { destination: Relative(45), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(46), op: Add, bit_size: U32, lhs: Relative(45), rhs: Relative(11) }, Load { destination: Relative(44), source_pointer: Relative(46) }, Load { destination: Relative(45), source_pointer: Relative(19) }, Const { destination: Relative(46), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(47), op: Equals, bit_size: U32, lhs: Relative(46), rhs: Relative(45) }, Not { destination: Relative(47), source: Relative(47), bit_size: U1 }, JumpIf { condition: Relative(47), location: 1003 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(45), op: Add, bit_size: U32, lhs: Relative(45), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(45) }, Load { destination: Relative(45), source_pointer: Relative(44) }, Const { destination: Relative(47), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(48), op: Equals, bit_size: U32, lhs: Relative(47), rhs: Relative(45) }, Not { destination: Relative(48), source: Relative(48), bit_size: U1 }, JumpIf { condition: Relative(48), location: 1011 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(45), op: Add, bit_size: U32, lhs: Relative(45), rhs: Direct(2) }, Store { destination_pointer: Relative(44), source: Relative(45) }, Load { destination: Relative(44), source_pointer: Relative(18) }, Const { destination: Relative(45), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(48), op: Equals, bit_size: U32, lhs: Relative(45), rhs: Relative(44) }, Not { destination: Relative(48), source: Relative(48), bit_size: U1 }, JumpIf { condition: Relative(48), location: 1019 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(44), op: Add, bit_size: U32, lhs: Relative(44), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(44) }, Const { destination: Relative(48), bit_size: Integer(U32), value: 55 }, Mov { destination: Relative(55), source: Direct(0) }, Mov { destination: Relative(56), source: Relative(19) }, Mov { destination: Relative(57), source: Relative(18) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(48) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(44), source: Relative(56) }, JumpIf { condition: Relative(44), location: 1032 }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(18) } }, Load { destination: Relative(18), source_pointer: Relative(4) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(44), op: Equals, bit_size: U32, lhs: Relative(19), rhs: Relative(18) }, Not { destination: Relative(44), source: Relative(44), bit_size: U1 }, JumpIf { condition: Relative(44), location: 1038 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(18) }, Load { destination: Relative(18), source_pointer: Relative(13) }, Const { destination: Relative(44), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(48), op: Equals, bit_size: U32, lhs: Relative(44), rhs: Relative(18) }, Not { destination: Relative(48), source: Relative(48), bit_size: U1 }, JumpIf { condition: Relative(48), location: 1046 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(18) }, BinaryIntOp { destination: Relative(48), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(49), op: Add, bit_size: U32, lhs: Relative(48), rhs: Relative(21) }, Load { destination: Relative(18), source_pointer: Relative(49) }, BinaryIntOp { destination: Relative(49), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(51), op: Add, bit_size: U32, lhs: Relative(49), rhs: Relative(23) }, Load { destination: Relative(48), source_pointer: Relative(51) }, Load { destination: Relative(49), source_pointer: Relative(18) }, Const { destination: Relative(51), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(52), op: Equals, bit_size: U32, lhs: Relative(51), rhs: Relative(49) }, Not { destination: Relative(52), source: Relative(52), bit_size: U1 }, JumpIf { condition: Relative(52), location: 1060 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(49), op: Add, bit_size: U32, lhs: Relative(49), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(49) }, Load { destination: Relative(49), source_pointer: Relative(48) }, Const { destination: Relative(52), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(53), op: Equals, bit_size: U32, lhs: Relative(52), rhs: Relative(49) }, Not { destination: Relative(53), source: Relative(53), bit_size: U1 }, JumpIf { condition: Relative(53), location: 1068 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(49), op: Add, bit_size: U32, lhs: Relative(49), rhs: Direct(2) }, Store { destination_pointer: Relative(48), source: Relative(49) }, Load { destination: Relative(48), source_pointer: Relative(30) }, Const { destination: Relative(49), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(53), op: Equals, bit_size: U32, lhs: Relative(49), rhs: Relative(48) }, Not { destination: Relative(53), source: Relative(53), bit_size: U1 }, JumpIf { condition: Relative(53), location: 1076 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(48), op: Add, bit_size: U32, lhs: Relative(48), rhs: Direct(2) }, Store { destination_pointer: Relative(30), source: Relative(48) }, Const { destination: Relative(53), bit_size: Integer(U32), value: 55 }, Mov { destination: Relative(55), source: Direct(0) }, Mov { destination: Relative(56), source: Relative(18) }, Mov { destination: Relative(57), source: Relative(30) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(53) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(48), source: Relative(56) }, JumpIf { condition: Relative(48), location: 1089 }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(18) } }, Load { destination: Relative(18), source_pointer: Relative(4) }, Const { destination: Relative(48), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(53), op: Equals, bit_size: U32, lhs: Relative(48), rhs: Relative(18) }, Not { destination: Relative(53), source: Relative(53), bit_size: U1 }, JumpIf { condition: Relative(53), location: 1095 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(18) }, Load { destination: Relative(18), source_pointer: Relative(13) }, Const { destination: Relative(53), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(55), op: Equals, bit_size: U32, lhs: Relative(53), rhs: Relative(18) }, Not { destination: Relative(55), source: Relative(55), bit_size: U1 }, JumpIf { condition: Relative(55), location: 1103 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(18) }, BinaryIntOp { destination: Relative(55), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(56), op: Add, bit_size: U32, lhs: Relative(55), rhs: Relative(31) }, Load { destination: Relative(18), source_pointer: Relative(56) }, BinaryIntOp { destination: Relative(55), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(56), op: Add, bit_size: U32, lhs: Relative(55), rhs: Relative(33) }, Load { destination: Relative(31), source_pointer: Relative(56) }, Load { destination: Relative(33), source_pointer: Relative(18) }, Const { destination: Relative(55), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(56), op: Equals, bit_size: U32, lhs: Relative(55), rhs: Relative(33) }, Not { destination: Relative(56), source: Relative(56), bit_size: U1 }, JumpIf { condition: Relative(56), location: 1117 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(33), op: Add, bit_size: U32, lhs: Relative(33), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(33) }, Load { destination: Relative(33), source_pointer: Relative(31) }, Const { destination: Relative(56), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(57), op: Equals, bit_size: U32, lhs: Relative(56), rhs: Relative(33) }, Not { destination: Relative(57), source: Relative(57), bit_size: U1 }, JumpIf { condition: Relative(57), location: 1125 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(33), op: Add, bit_size: U32, lhs: Relative(33), rhs: Direct(2) }, Store { destination_pointer: Relative(31), source: Relative(33) }, Const { destination: Relative(33), bit_size: Integer(U32), value: 57 }, Mov { destination: Relative(57), source: Direct(0) }, Mov { destination: Relative(58), source: Relative(18) }, Mov { destination: Relative(59), source: Relative(16) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(33) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(31), source: Relative(58) }, JumpIf { condition: Relative(31), location: 1138 }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(16) } }, Load { destination: Relative(16), source_pointer: Relative(4) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(31), op: Equals, bit_size: U32, lhs: Relative(18), rhs: Relative(16) }, Not { destination: Relative(31), source: Relative(31), bit_size: U1 }, JumpIf { condition: Relative(31), location: 1144 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(16) }, Load { destination: Relative(16), source_pointer: Relative(13) }, Const { destination: Relative(31), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(33), op: Equals, bit_size: U32, lhs: Relative(31), rhs: Relative(16) }, Not { destination: Relative(33), source: Relative(33), bit_size: U1 }, JumpIf { condition: Relative(33), location: 1152 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(16) }, BinaryIntOp { destination: Relative(33), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(57), op: Add, bit_size: U32, lhs: Relative(33), rhs: Relative(39) }, Load { destination: Relative(16), source_pointer: Relative(57) }, BinaryIntOp { destination: Relative(39), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(57), op: Add, bit_size: U32, lhs: Relative(39), rhs: Relative(41) }, Load { destination: Relative(33), source_pointer: Relative(57) }, Load { destination: Relative(39), source_pointer: Relative(16) }, Const { destination: Relative(41), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(57), op: Equals, bit_size: U32, lhs: Relative(41), rhs: Relative(39) }, Not { destination: Relative(57), source: Relative(57), bit_size: U1 }, JumpIf { condition: Relative(57), location: 1166 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(39), op: Add, bit_size: U32, lhs: Relative(39), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(39) }, Load { destination: Relative(39), source_pointer: Relative(33) }, Const { destination: Relative(57), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(58), op: Equals, bit_size: U32, lhs: Relative(57), rhs: Relative(39) }, Not { destination: Relative(58), source: Relative(58), bit_size: U1 }, JumpIf { condition: Relative(58), location: 1174 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(39), op: Add, bit_size: U32, lhs: Relative(39), rhs: Direct(2) }, Store { destination_pointer: Relative(33), source: Relative(39) }, Load { destination: Relative(39), source_pointer: Relative(50) }, Const { destination: Relative(58), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(59), op: Equals, bit_size: U32, lhs: Relative(58), rhs: Relative(39) }, Not { destination: Relative(59), source: Relative(59), bit_size: U1 }, JumpIf { condition: Relative(59), location: 1182 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(39), op: Add, bit_size: U32, lhs: Relative(39), rhs: Direct(2) }, Store { destination_pointer: Relative(50), source: Relative(39) }, Const { destination: Relative(59), bit_size: Integer(U32), value: 60 }, Mov { destination: Relative(60), source: Direct(0) }, Mov { destination: Relative(61), source: Relative(16) }, Mov { destination: Relative(62), source: Relative(50) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(59) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(39), source: Relative(61) }, JumpIf { condition: Relative(39), location: 1195 }, Const { destination: Relative(50), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(50) } }, Load { destination: Relative(39), source_pointer: Relative(4) }, Const { destination: Relative(50), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(59), op: Equals, bit_size: U32, lhs: Relative(50), rhs: Relative(39) }, Not { destination: Relative(59), source: Relative(59), bit_size: U1 }, JumpIf { condition: Relative(59), location: 1201 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(39), op: Add, bit_size: U32, lhs: Relative(39), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(39) }, Load { destination: Relative(4), source_pointer: Relative(13) }, Const { destination: Relative(39), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(59), op: Equals, bit_size: U32, lhs: Relative(39), rhs: Relative(4) }, Not { destination: Relative(59), source: Relative(59), bit_size: U1 }, JumpIf { condition: Relative(59), location: 1209 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(4) }, BinaryIntOp { destination: Relative(59), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(60), op: Add, bit_size: U32, lhs: Relative(59), rhs: Relative(32) }, Load { destination: Relative(4), source_pointer: Relative(60) }, Load { destination: Relative(13), source_pointer: Relative(16) }, Const { destination: Relative(32), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(59), op: Equals, bit_size: U32, lhs: Relative(32), rhs: Relative(13) }, Not { destination: Relative(59), source: Relative(59), bit_size: U1 }, JumpIf { condition: Relative(59), location: 1220 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(13) }, Load { destination: Relative(13), source_pointer: Relative(33) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(59), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(13) }, Not { destination: Relative(59), source: Relative(59), bit_size: U1 }, JumpIf { condition: Relative(59), location: 1228 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(33), source: Relative(13) }, BinaryFieldOp { destination: Relative(13), op: Equals, lhs: Relative(4), rhs: Relative(54) }, JumpIf { condition: Relative(13), location: 1234 }, Const { destination: Relative(33), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(33) } }, Load { destination: Relative(4), source_pointer: Relative(3) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(33), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(4) }, Not { destination: Relative(33), source: Relative(33), bit_size: U1 }, JumpIf { condition: Relative(33), location: 1240 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(4) }, Load { destination: Relative(3), source_pointer: Relative(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(33), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, Not { destination: Relative(33), source: Relative(33), bit_size: U1 }, JumpIf { condition: Relative(33), location: 1248 }, Call { location: 1793 }, 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(3), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Relative(54), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Load { destination: Relative(33), source_pointer: Relative(54) }, Const { destination: Relative(54), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(60), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(54) }, Load { destination: Relative(59), source_pointer: Relative(60) }, Load { destination: Relative(1), source_pointer: Relative(33) }, Const { destination: Relative(60), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(61), op: Equals, bit_size: U32, lhs: Relative(60), rhs: Relative(1) }, Not { destination: Relative(61), source: Relative(61), bit_size: U1 }, JumpIf { condition: Relative(61), location: 1262 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(33), source: Relative(1) }, Load { destination: Relative(1), source_pointer: Relative(59) }, Const { destination: Relative(61), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(62), op: Equals, bit_size: U32, lhs: Relative(61), rhs: Relative(1) }, Not { destination: Relative(62), source: Relative(62), bit_size: U1 }, JumpIf { condition: Relative(62), location: 1270 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(59), source: Relative(1) }, Load { destination: Relative(1), source_pointer: Relative(30) }, Const { destination: Relative(59), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(62), op: Equals, bit_size: U32, lhs: Relative(59), rhs: Relative(1) }, Not { destination: Relative(62), source: Relative(62), bit_size: U1 }, JumpIf { condition: Relative(62), location: 1278 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(30), source: Relative(1) }, Const { destination: Relative(62), bit_size: Integer(U32), value: 63 }, Mov { destination: Relative(63), source: Direct(0) }, Mov { destination: Relative(64), source: Relative(33) }, Mov { destination: Relative(65), source: Relative(30) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(62) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(64) }, JumpIf { condition: Relative(1), location: 1291 }, Const { destination: Relative(30), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(30) } }, Const { destination: Relative(1), bit_size: Field, value: 19 }, Const { destination: Relative(30), bit_size: Field, value: 18 }, Mov { destination: Relative(33), source: Direct(1) }, Const { destination: Relative(62), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(62) }, IndirectConst { destination_pointer: Relative(33), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(62), op: Add, bit_size: U32, lhs: Relative(33), rhs: Direct(2) }, Mov { destination: Relative(63), source: Relative(62) }, Store { destination_pointer: Relative(63), source: Relative(17) }, BinaryIntOp { destination: Relative(63), op: Add, bit_size: U32, lhs: Relative(63), rhs: Direct(2) }, Store { destination_pointer: Relative(63), source: Relative(1) }, BinaryIntOp { destination: Relative(63), op: Add, bit_size: U32, lhs: Relative(63), rhs: Direct(2) }, Store { destination_pointer: Relative(63), source: Relative(30) }, BinaryIntOp { destination: Relative(62), op: LessThan, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(63), op: Mul, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(64), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(65), op: LessThan, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(66), op: Mul, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(67), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(68), op: LessThan, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(69), op: Mul, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(70), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(71), op: LessThan, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(72), op: Mul, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(73), op: LessThan, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(74), op: Mul, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, JumpIf { condition: Relative(38), location: 1359 }, Jump { location: 1319 }, Load { destination: Relative(4), source_pointer: Relative(33) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(4) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 1325 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(33), source: Relative(4) }, JumpIf { condition: Relative(62), location: 1329 }, Call { location: 1790 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(63), rhs: Direct(32836) }, 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(4) }, Load { destination: Relative(9), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(23) }, Load { destination: Relative(13), source_pointer: Relative(15) }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, 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(21) }, Store { destination_pointer: Relative(16), source: Relative(33) }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, Mov { destination: Relative(9), source: Direct(32773) }, 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(64) }, Store { destination_pointer: Relative(16), source: Relative(13) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 1829 }, 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(4) }, Store { destination_pointer: Relative(15), source: Relative(9) }, Store { destination_pointer: Relative(12), source: Relative(13) }, Jump { location: 1405 }, 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(13), source: Relative(6) }, Store { destination_pointer: Relative(13), source: Relative(43) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(29) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(22) }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, JumpIf { condition: Relative(6), location: 1373 }, Call { location: 1790 }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32836) }, 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(9) }, Load { destination: Relative(6), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(23) }, Load { destination: Relative(13), source_pointer: Relative(15) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, 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(21) }, Store { destination_pointer: Relative(16), source: Relative(4) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(32836) }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, Mov { destination: Relative(6), source: Direct(32773) }, 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(4) }, Store { destination_pointer: Relative(16), source: Relative(13) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 1829 }, 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(9) }, Store { destination_pointer: Relative(14), source: Relative(6) }, Store { destination_pointer: Relative(12), source: Relative(4) }, Jump { location: 1405 }, Load { destination: Relative(4), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, Load { destination: Relative(6), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(9) }, Load { destination: Relative(4), source_pointer: Relative(6) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(4) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 1416 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(4) }, Load { destination: Relative(4), 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(4) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 1424 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(4) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(3) }, Load { destination: Relative(4), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(54) }, Load { destination: Relative(14), source_pointer: Relative(15) }, Load { destination: Relative(15), source_pointer: Relative(4) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(18), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(15) }, Not { destination: Relative(18), source: Relative(18), bit_size: U1 }, JumpIf { condition: Relative(18), location: 1436 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(15) }, Load { destination: Relative(15), source_pointer: Relative(14) }, 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: 1444 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(15) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 75 }, Mov { destination: Relative(75), source: Direct(0) }, Mov { destination: Relative(76), source: Relative(4) }, Mov { destination: Relative(77), source: Relative(33) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(19) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(15), source: Relative(76) }, JumpIf { condition: Relative(15), location: 1457 }, Const { destination: Relative(19), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(19) } }, Load { destination: Relative(15), source_pointer: Relative(6) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(22), op: Equals, bit_size: U32, lhs: Relative(19), rhs: Relative(15) }, Not { destination: Relative(22), source: Relative(22), bit_size: U1 }, JumpIf { condition: Relative(22), location: 1463 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(15) }, Load { destination: Relative(6), source_pointer: Relative(7) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(22), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(6) }, Not { destination: Relative(22), source: Relative(22), bit_size: U1 }, JumpIf { condition: Relative(22), location: 1471 }, Call { location: 1793 }, 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(4) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(22), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(22), source: Relative(22), bit_size: U1 }, JumpIf { condition: Relative(22), location: 1479 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, Load { destination: Relative(6), source_pointer: Relative(14) }, Const { destination: Relative(22), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(24), op: Equals, bit_size: U32, lhs: Relative(22), rhs: Relative(6) }, Not { destination: Relative(24), source: Relative(24), bit_size: U1 }, JumpIf { condition: Relative(24), location: 1487 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(6) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, Load { destination: Relative(6), source_pointer: Relative(14) }, BinaryFieldOp { destination: Relative(4), op: Equals, lhs: Relative(6), rhs: Relative(30) }, JumpIf { condition: Relative(4), location: 1495 }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(14) } }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(2), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(2), op: LessThan, bit_size: U32, lhs: Relative(20), rhs: Direct(32837) }, Const { destination: Relative(6), bit_size: Field, value: 5000 }, JumpIf { condition: Relative(4), location: 1546 }, Jump { location: 1500 }, Load { destination: Relative(4), source_pointer: Relative(12) }, JumpIf { condition: Relative(68), location: 1503 }, Call { location: 1790 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(69), rhs: Direct(32836) }, 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(7) }, Load { destination: Relative(9), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(21) }, Load { destination: Relative(13), source_pointer: Relative(15) }, 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(23) }, Load { destination: Relative(14), source_pointer: Relative(16) }, JumpIf { condition: Relative(2), location: 1515 }, Call { location: 1790 }, Const { destination: Relative(2), bit_size: Field, value: 1000 }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 1829 }, 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(18), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(20) }, Store { destination_pointer: Relative(18), source: Relative(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, 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(16), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(21) }, Store { destination_pointer: Relative(16), source: Relative(15) }, Mov { destination: Direct(32771), source: Relative(2) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(70) }, Store { destination_pointer: Relative(15), source: Relative(14) }, Mov { destination: Direct(32771), source: Relative(4) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 1829 }, 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(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(7) }, Store { destination_pointer: Relative(14), source: Relative(9) }, Store { destination_pointer: Relative(12), source: Relative(2) }, Jump { location: 1592 }, Load { destination: Relative(2), source_pointer: Relative(12) }, JumpIf { condition: Relative(65), location: 1549 }, Call { location: 1790 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(66), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(4) }, Load { destination: Relative(7), source_pointer: Relative(13) }, 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(21) }, Load { destination: Relative(9), source_pointer: Relative(14) }, 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(23) }, Load { destination: Relative(13), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(20), rhs: Direct(32837) }, JumpIf { condition: Relative(14), location: 1562 }, Call { location: 1790 }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 1829 }, 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(20) }, Store { destination_pointer: Relative(16), source: Relative(6) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, Mov { destination: Relative(9), source: Direct(32773) }, 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(21) }, Store { destination_pointer: Relative(16), source: Relative(14) }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, 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(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(67) }, Store { destination_pointer: Relative(15), source: Relative(13) }, Mov { destination: Direct(32771), source: Relative(2) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 1829 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(9), 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) }, Store { destination_pointer: Relative(12), source: Relative(9) }, Jump { location: 1592 }, Load { destination: Relative(2), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32837) }, Load { destination: Relative(4), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(9) }, Load { destination: Relative(9), 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(9) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 1603 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(9) }, Load { destination: Relative(4), source_pointer: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(4) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 1611 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(4) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(3) }, Load { destination: Relative(4), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(54) }, Load { destination: Relative(3), source_pointer: Relative(14) }, Load { destination: Relative(7), 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(7) }, Not { destination: Relative(15), source: Relative(15), bit_size: U1 }, JumpIf { condition: Relative(15), location: 1623 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(7) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(7) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 1631 }, Call { location: 1793 }, 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(7), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, Load { destination: Relative(3), source_pointer: Relative(7) }, BinaryFieldOp { destination: Relative(4), op: Equals, lhs: Relative(3), rhs: Relative(6) }, JumpIf { condition: Relative(4), location: 1639 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(7) } }, JumpIf { condition: Relative(71), location: 1641 }, Call { location: 1790 }, 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(72) }, Load { destination: Relative(3), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(72), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(4) }, Load { destination: Relative(7), source_pointer: Relative(18) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(18), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(4) }, Not { destination: Relative(18), source: Relative(18), bit_size: U1 }, JumpIf { condition: Relative(18), location: 1654 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(4) }, Load { destination: Relative(3), source_pointer: Relative(7) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(18), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, Not { destination: Relative(18), source: Relative(18), bit_size: U1 }, JumpIf { condition: Relative(18), location: 1662 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(3) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(21) }, Load { destination: Relative(3), source_pointer: Relative(19) }, 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(23) }, Load { destination: Relative(18), source_pointer: Relative(20) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(20), op: Equals, bit_size: U32, lhs: Relative(19), rhs: Relative(7) }, Not { destination: Relative(20), source: Relative(20), bit_size: U1 }, JumpIf { condition: Relative(20), location: 1676 }, Call { location: 1793 }, 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(18) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(21), op: Equals, bit_size: U32, lhs: Relative(20), rhs: Relative(7) }, Not { destination: Relative(21), source: Relative(21), bit_size: U1 }, JumpIf { condition: Relative(21), location: 1684 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(7) }, JumpIf { condition: Relative(73), location: 1688 }, Call { location: 1790 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(74), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(7) }, Load { destination: Relative(18), source_pointer: Relative(22) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(11) }, Load { destination: Relative(21), source_pointer: Relative(23) }, Mov { destination: Direct(32771), source: Relative(18) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, Mov { destination: Relative(11), source: Direct(32773) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(8) }, Store { destination_pointer: Relative(23), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32836) }, Mov { destination: Direct(32771), source: Relative(11) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, Mov { destination: Relative(8), source: Direct(32773) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(3) }, Store { destination_pointer: Relative(22), source: Relative(21) }, Mov { destination: Direct(32771), source: Relative(2) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 1829 }, Mov { destination: Relative(3), source: Direct(32773) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(7) }, Store { destination_pointer: Relative(18), source: Relative(8) }, Store { destination_pointer: Relative(12), source: Relative(3) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32837) }, Load { destination: Relative(2), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(8) }, Load { destination: Relative(3), source_pointer: Relative(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(3) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 1728 }, Call { location: 1793 }, 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(2), source_pointer: Relative(7) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 1736 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(10) }, Load { destination: Relative(2), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32837) }, Load { destination: Relative(8), source_pointer: Relative(10) }, Load { destination: Relative(7), 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(7) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 1748 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(7) }, Load { destination: Relative(7), 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(7) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 1756 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, 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(12), source: Relative(8) }, Store { destination_pointer: Relative(12), source: Relative(17) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, 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(6) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 21 }, Mov { destination: Relative(21), source: Direct(0) }, Mov { destination: Relative(22), source: Relative(2) }, Mov { destination: Relative(23), source: Relative(7) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(22) }, JumpIf { condition: Relative(1), location: 1780 }, 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: 1786 }, 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: 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, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 1781 }, 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: 1806 }, Call { location: 1793 }, 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 }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 1811 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32837) }, JumpIf { condition: Relative(5), location: 1816 }, Jump { location: 1814 }, 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(32836) }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 1811 }, 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: 1833 }, Jump { location: 1835 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 1850 }, 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: 1847 }, 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: 1840 }, 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: 1850 }, Return]" + "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32867 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 29 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32838), size_address: Relative(3), offset_address: Relative(4) }, Cast { destination: Direct(32866), source: Direct(32866), bit_size: Integer(U32) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32838 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 13 }, 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) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 7 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 11 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 14 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 15 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 18 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 8 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 21 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 22 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 25 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 11 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Mov { destination: Relative(1), source: Relative(3) }, Mov { destination: Relative(2), source: Direct(32866) }, Call { location: 176 }, Call { location: 180 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32867 }, 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: 175 }, 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: 168 }, Return, Const { destination: Direct(32835), bit_size: Integer(U1), value: 1 }, Const { destination: Direct(32836), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(32837), bit_size: Integer(U32), value: 3 }, Return, Call { location: 599 }, 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) }, BinaryIntOp { destination: Relative(4), op: Sub, bit_size: U32, lhs: Relative(2), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U32, lhs: Direct(32837), rhs: Relative(2) }, JumpIf { condition: Relative(5), location: 188 }, Call { location: 605 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(5) }, JumpIf { condition: Relative(6), location: 192 }, Call { location: 608 }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, 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(6) }, Load { destination: Relative(4), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32836) }, 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) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(7) }, 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(6), source_pointer: Relative(11) }, 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: 211 }, Call { location: 611 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(9) }, Load { destination: Relative(9), 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(9) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 219 }, Call { location: 611 }, 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: Field, value: 1 }, BinaryFieldOp { destination: Relative(12), op: Equals, lhs: Relative(4), rhs: Relative(9) }, JumpIf { condition: Relative(12), location: 226 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(13) } }, Load { destination: Relative(4), source_pointer: Relative(8) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(4) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 232 }, Call { location: 611 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(4) }, Load { destination: Relative(4), 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(4) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 240 }, Call { location: 611 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(4) }, Const { destination: Relative(4), bit_size: Field, value: 2 }, Const { destination: Relative(6), bit_size: Field, value: 3 }, Const { destination: Relative(13), bit_size: Field, value: 20 }, 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(6) }, 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(6), 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(14) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 614 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(16) }, JumpIf { condition: Relative(4), location: 267 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(6) } }, BinaryIntOp { destination: Relative(4), op: Sub, bit_size: U32, lhs: Relative(2), rhs: Relative(7) }, BinaryIntOp { destination: Relative(6), op: LessThanEquals, bit_size: U32, lhs: Relative(7), rhs: Relative(2) }, JumpIf { condition: Relative(6), location: 271 }, Call { location: 605 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(5) }, JumpIf { condition: Relative(6), location: 274 }, Call { location: 608 }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(6) }, Load { destination: Relative(4), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32836) }, 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(13), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(7) }, 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(6), source_pointer: Relative(15) }, Load { destination: Relative(8), source_pointer: Relative(13) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(15), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(8) }, Not { destination: Relative(15), source: Relative(15), bit_size: U1 }, JumpIf { condition: Relative(15), location: 292 }, Call { location: 611 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(8) }, Load { destination: Relative(8), 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(8) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 300 }, Call { location: 611 }, 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(8), bit_size: Field, value: 4 }, BinaryFieldOp { destination: Relative(16), op: Equals, lhs: Relative(4), rhs: Relative(8) }, JumpIf { condition: Relative(16), location: 307 }, Const { destination: Relative(17), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(17) } }, Load { destination: Relative(4), source_pointer: Relative(13) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(4) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 313 }, Call { location: 611 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(6) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(17), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(4) }, Not { destination: Relative(17), source: Relative(17), bit_size: U1 }, JumpIf { condition: Relative(17), location: 321 }, Call { location: 611 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(4) }, Const { destination: Relative(4), bit_size: Field, value: 5 }, Const { destination: Relative(6), bit_size: Field, value: 6 }, Const { destination: Relative(17), bit_size: Field, value: 21 }, Mov { destination: Relative(18), 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(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(4) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Relative(6) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Relative(17) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 19 }, Mov { destination: Relative(19), source: Direct(0) }, Mov { destination: Relative(20), source: Relative(13) }, Mov { destination: Relative(21), source: Relative(18) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 614 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(20) }, JumpIf { condition: Relative(4), location: 348 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(6) } }, BinaryIntOp { destination: Relative(4), op: Sub, bit_size: U32, lhs: Relative(2), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(6), op: LessThanEquals, bit_size: U32, lhs: Direct(32836), rhs: Relative(2) }, JumpIf { condition: Relative(6), location: 352 }, Call { location: 605 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(5) }, JumpIf { condition: Relative(6), location: 355 }, Call { location: 608 }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(6) }, Load { destination: Relative(4), source_pointer: Relative(17) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(13) }, Load { destination: Relative(17), source_pointer: Relative(19) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(7) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(13) }, Load { destination: Relative(6), source_pointer: Relative(19) }, Load { destination: Relative(13), source_pointer: Relative(17) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(19), op: Equals, bit_size: U32, lhs: Relative(18), rhs: Relative(13) }, Not { destination: Relative(19), source: Relative(19), bit_size: U1 }, JumpIf { condition: Relative(19), location: 373 }, Call { location: 611 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(13) }, Load { destination: Relative(13), source_pointer: Relative(6) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(20), op: Equals, bit_size: U32, lhs: Relative(19), rhs: Relative(13) }, Not { destination: Relative(20), source: Relative(20), bit_size: U1 }, JumpIf { condition: Relative(20), location: 381 }, Call { location: 611 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(13) }, Const { destination: Relative(13), bit_size: Field, value: 7 }, BinaryFieldOp { destination: Relative(20), op: Equals, lhs: Relative(4), rhs: Relative(13) }, JumpIf { condition: Relative(20), location: 388 }, Const { destination: Relative(21), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(21) } }, Load { destination: Relative(4), source_pointer: Relative(17) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(20), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(4) }, Not { destination: Relative(20), source: Relative(20), bit_size: U1 }, JumpIf { condition: Relative(20), location: 394 }, Call { location: 611 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(6) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(21), op: Equals, bit_size: U32, lhs: Relative(20), rhs: Relative(4) }, Not { destination: Relative(21), source: Relative(21), bit_size: U1 }, JumpIf { condition: Relative(21), location: 402 }, Call { location: 611 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(4) }, Const { destination: Relative(4), bit_size: Field, value: 8 }, Const { destination: Relative(6), bit_size: Field, value: 9 }, Const { destination: Relative(21), bit_size: Field, value: 22 }, Mov { destination: Relative(22), source: Direct(1) }, Const { destination: Relative(23), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(23) }, IndirectConst { destination_pointer: Relative(22), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Mov { destination: Relative(24), source: Relative(23) }, Store { destination_pointer: Relative(24), source: Relative(4) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(24), rhs: Direct(2) }, Store { destination_pointer: Relative(24), source: Relative(6) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(24), rhs: Direct(2) }, Store { destination_pointer: Relative(24), source: Relative(21) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 23 }, Mov { destination: Relative(23), source: Direct(0) }, Mov { destination: Relative(24), source: Relative(17) }, Mov { destination: Relative(25), source: Relative(22) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 614 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(24) }, JumpIf { condition: Relative(4), location: 429 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(6) } }, BinaryIntOp { destination: Relative(4), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, JumpIf { condition: Relative(4), location: 432 }, Call { location: 608 }, BinaryIntOp { destination: Relative(4), op: Mul, bit_size: U32, lhs: Relative(2), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(4) }, Load { destination: Relative(5), source_pointer: Relative(17) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(6) }, Load { destination: Relative(17), source_pointer: Relative(22) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(7) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(1), 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) }, Load { destination: Relative(21), source_pointer: Relative(17) }, Const { destination: Relative(23), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(24), op: Equals, bit_size: U32, lhs: Relative(23), rhs: Relative(21) }, Not { destination: Relative(24), source: Relative(24), bit_size: U1 }, JumpIf { condition: Relative(24), location: 450 }, Call { location: 611 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(21) }, Load { destination: Relative(21), source_pointer: Relative(22) }, Const { destination: Relative(24), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(25), op: Equals, bit_size: U32, lhs: Relative(24), rhs: Relative(21) }, Not { destination: Relative(25), source: Relative(25), bit_size: U1 }, JumpIf { condition: Relative(25), location: 458 }, Call { location: 611 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(21) }, Const { destination: Relative(21), bit_size: Field, value: 10 }, BinaryFieldOp { destination: Relative(25), op: Equals, lhs: Relative(5), rhs: Relative(21) }, JumpIf { condition: Relative(25), location: 465 }, Const { destination: Relative(26), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(26) } }, Load { destination: Relative(5), source_pointer: Relative(17) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(25), op: Equals, bit_size: U32, lhs: Relative(21), rhs: Relative(5) }, Not { destination: Relative(25), source: Relative(25), bit_size: U1 }, JumpIf { condition: Relative(25), location: 471 }, Call { location: 611 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(5) }, Load { destination: Relative(5), source_pointer: Relative(22) }, Const { destination: Relative(25), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(26), op: Equals, bit_size: U32, lhs: Relative(25), rhs: Relative(5) }, Not { destination: Relative(26), source: Relative(26), bit_size: U1 }, JumpIf { condition: Relative(26), location: 479 }, Call { location: 611 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(5) }, Const { destination: Relative(5), bit_size: Field, value: 11 }, Const { destination: Relative(26), bit_size: Field, value: 12 }, Const { destination: Relative(27), bit_size: Field, value: 23 }, Mov { destination: Relative(28), 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(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(5) }, BinaryIntOp { destination: Relative(30), op: Add, bit_size: U32, lhs: Relative(30), rhs: Direct(2) }, Store { destination_pointer: Relative(30), source: Relative(26) }, BinaryIntOp { destination: Relative(30), op: Add, bit_size: U32, lhs: Relative(30), rhs: Direct(2) }, Store { destination_pointer: Relative(30), source: Relative(27) }, Const { destination: Relative(26), bit_size: Integer(U32), value: 29 }, Mov { destination: Relative(29), source: Direct(0) }, Mov { destination: Relative(30), source: Relative(17) }, Mov { destination: Relative(31), source: Relative(28) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(26) }, Call { location: 614 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(5), source: Relative(30) }, JumpIf { condition: Relative(5), location: 506 }, Const { destination: Relative(26), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(26) } }, Load { destination: Relative(5), source_pointer: Relative(17) }, Const { destination: Relative(26), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(27), op: Equals, bit_size: U32, lhs: Relative(26), rhs: Relative(5) }, Not { destination: Relative(27), source: Relative(27), bit_size: U1 }, JumpIf { condition: Relative(27), location: 512 }, Call { location: 611 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(5) }, Load { destination: Relative(5), source_pointer: Relative(22) }, Const { destination: Relative(27), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(28), op: Equals, bit_size: U32, lhs: Relative(27), rhs: Relative(5) }, Not { destination: Relative(28), source: Relative(28), bit_size: U1 }, JumpIf { condition: Relative(28), location: 520 }, Call { location: 611 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(5) }, Const { destination: Relative(5), bit_size: Field, value: 109 }, Const { destination: Relative(28), bit_size: Field, value: 110 }, Const { destination: Relative(29), bit_size: Field, value: 111 }, Mov { destination: Relative(30), source: Direct(1) }, Const { destination: Relative(31), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(31) }, IndirectConst { destination_pointer: Relative(30), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(30), rhs: Direct(2) }, Mov { destination: Relative(32), source: Relative(31) }, Store { destination_pointer: Relative(32), source: Relative(5) }, BinaryIntOp { destination: Relative(32), op: Add, bit_size: U32, lhs: Relative(32), rhs: Direct(2) }, Store { destination_pointer: Relative(32), source: Relative(28) }, BinaryIntOp { destination: Relative(32), op: Add, bit_size: U32, lhs: Relative(32), rhs: Direct(2) }, Store { destination_pointer: Relative(32), source: Relative(29) }, Const { destination: Relative(28), bit_size: Integer(U32), value: 31 }, Mov { destination: Relative(31), source: Direct(0) }, Mov { destination: Relative(32), source: Relative(22) }, Mov { destination: Relative(33), source: Relative(30) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(28) }, Call { location: 614 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(5), source: Relative(32) }, JumpIf { condition: Relative(5), location: 547 }, Const { destination: Relative(28), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(28) } }, BinaryIntOp { destination: Relative(5), op: Equals, bit_size: U32, lhs: Relative(2), rhs: Relative(7) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32836) }, JumpIf { condition: Relative(5), location: 575 }, Jump { location: 551 }, Const { destination: Relative(5), bit_size: Field, value: 50 }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 647 }, 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(5) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 647 }, Mov { destination: Relative(1), source: Direct(32773) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(6) }, Store { destination_pointer: Relative(5), source: Relative(17) }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 647 }, Mov { destination: Relative(4), source: Direct(32773) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(2) }, Store { destination_pointer: Relative(6), source: Relative(22) }, Store { destination_pointer: Relative(3), source: Relative(4) }, Jump { location: 599 }, Const { destination: Relative(5), bit_size: Field, value: 100 }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 647 }, 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(5) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 647 }, Mov { destination: Relative(1), source: Direct(32773) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(6) }, Store { destination_pointer: Relative(5), source: Relative(17) }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 647 }, Mov { destination: Relative(4), source: Direct(32773) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(2) }, Store { destination_pointer: Relative(6), source: Relative(22) }, Store { destination_pointer: Relative(3), source: Relative(4) }, Jump { location: 599 }, 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: 604 }, 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: 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, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 599 }, 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: 624 }, Call { location: 611 }, 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 }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 629 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32837) }, JumpIf { condition: Relative(5), location: 634 }, Jump { location: 632 }, 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(32836) }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 629 }, 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: 651 }, Jump { location: 653 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 668 }, 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: 665 }, 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: 658 }, 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: 668 }, Return]" ], - "debug_symbols": "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", + "debug_symbols": "pZnLbttIEEX/RWsvWP0u/0oQBI6jDAwIsqHYAwwC//t0kffIySLADLXxPbRUpymqS+qmfh6+Hb++/fXl6fz9+cfh/tPPw9fL0+n09NeX0/Pjw+vT83n+9+dhiT82yuHe7mZWZVN25VD6lr4oTZkO9ykyK4uyKpuyK4fS10zLojRlUmZlUVZlU3blUMpn8pl8Jp/JZ/KZfCafyWfymXxJvjR9OTIps7Ioq3L6SmRXDqVvmRelKZMyK4uyKuXL8mX5snxFviJfmb4amZVFWZVN2ZVD6VvWRWlK+ap8Vb4qX52+FtmVQ+lbtkVpyqTMyqKsSvna9PXIofQt+6I0ZVJm5fSNyKpsyq4cSt9yLEpTJmVWyjfkG/IN+YZ8Qz6Xz+Vz+Vw+l8/lc/lcPpfPN19eFqUpp88js7Ioq7Ipo3+XgAG4IFpkAwMSkIECVKABmA2zYU6YE+aEOfrFLKAAFWhABwbggmibDQxIAOaMOWPOmKN7LAUMwAXRQBsYkIAMFKACDcAcjWQ5wAXRShsYkIAMFCDMJaABHRiAC6KpNjAgARkoAOaGuWFumBvmjrlj7pg75o65Y+6YO+aOuWMemAfmgTl6zWpAASrQgA6EuQW4YP1KWsGABGSgABVoQAcwu8xlWQADEpCBMPeACjSgAwNwwdqDKxiQgAxgNsyG2TCvPTgCXLD24AoGJCADBahAAzqAOWHOmDPmtQc9IAMFqEADOjAAF6w9uIIBmAvmgrlgLpgL5oK5YK6YK+aKuWKumCvmirlirpgr5ujBtAQYkIAMFCBWGxbQgA4MwAXRgxsYkIAMFABzx9wxd8wd88AcPZhSQAIyUIAKNKADA3BB9OAGmB2zY3bM69owBzSgAwPwDeq6QFzBgARkoAAVCHMJ6MAAXLAuFVcwIAEZKEAFMBtmw2yYE+aEOXow1YAMFKACDejAAFwQPbiBAZgz5ow5Y44eTC2gAwNwQfTgBgYkIAMFqADm6MHUA8I8PxxqdNwGCchAASrQgA5cPS5YO24FzA1zw9wwN8wNc8PcMDfMHXPH3DF3zGujeUADOjAAF6yNtoIBCchAATAPzAPzwDwwO2bH7Jgds2N2zI7ZZW4xn/MS0IAOzEGzBbgg5vMGBiQgAwWoAOUxRXMK4DkxM3MOaEAHYvQS4IKYmRvE6C0AYczMDcKc3t/vDuxxv7xejsfY4v6y6Z1b4ZeHy/H8erg/v51Od4e/H05v65N+vDyc13x9uMxH52U4nr/NnMLvT6dj0PvdR/Xy59IU3w5r8dwbXsvr/6jv1/p6W/28IDvqS6O+7jr/dh2/+W3j92VP/bjWu+2qL9f6dGP9ntefYzuw1s9d1J76zPhz+3Pb+Lnvqa/X+jp21du13m+rb7te/6D551ZjR/3cK6h+7hFuGn9uLfaMHyvzrT6l2+rznv6bC3Xqy67r15g/c9V82/i73v/ycf3Hnus/15eqn8vJm8afq9A941de/1ww7anvzN+55NlR35aq+rbs+vy3awPNm7V7rsC8x8wlmLeZf3kP//MpLNf3cN6H9j2Cj0XAktoeQV4+zmDcegZ/egm5/tnQr9+j3X+r/zwPHh6fLr/9mvAeosvTw9fTUYff386Pvzz6+s8Lj/BrxMvl+fH47e1yDNPHTxLzz6dW+l1r4/O8GTOPrNU763UexZbtU3W/a0uJQ4vnzgnXlv75PU7tXw==", "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_u64, 1), 0);\n assert_eq(min(0_u64, 0), 0);\n assert_eq(min(1_u64, 1), 1);\n assert_eq(min(255_u8, 0), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0_u64, 1), 1);\n assert_eq(max(0_u64, 0), 0);\n assert_eq(max(1_u64, 1), 1);\n assert_eq(max(255_u8, 0), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_true_inliner_0.snap index ca85221a540..fdf6b844ae1 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_true_inliner_0.snap @@ -94,9 +94,9 @@ expression: artifact "return value indices : []", "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 }]), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(28))], q_c: 0 })], outputs: []", "unconstrained func 0", - "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32867 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 29 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32838), size_address: Relative(3), offset_address: Relative(4) }, Cast { destination: Direct(32866), source: Direct(32866), bit_size: Integer(U32) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32838 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 13 }, 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) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 7 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 11 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 14 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 15 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 18 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 8 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 21 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 22 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 25 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 11 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Mov { destination: Relative(1), source: Relative(3) }, Mov { destination: Relative(2), source: Direct(32866) }, Call { location: 176 }, Call { location: 180 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32867 }, 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: 175 }, 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: 168 }, Return, Const { destination: Direct(32835), bit_size: Integer(U1), value: 1 }, Const { destination: Direct(32836), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(32837), bit_size: Integer(U32), value: 3 }, Return, Call { location: 1781 }, 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) }, BinaryIntOp { destination: Relative(4), op: Sub, bit_size: U32, lhs: Relative(2), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U32, lhs: Direct(32837), rhs: Relative(2) }, JumpIf { condition: Relative(5), location: 188 }, Call { location: 1787 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(5) }, JumpIf { condition: Relative(6), location: 192 }, Call { location: 1790 }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, 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(32836) }, 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) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(10) }, 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(6), source_pointer: Relative(13) }, Load { destination: Relative(12), 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(12) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 211 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(12) }, Load { destination: Relative(12), source_pointer: Relative(6) }, 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: 219 }, Call { location: 1793 }, 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(12), bit_size: Field, value: 1 }, BinaryFieldOp { destination: Relative(15), op: Equals, lhs: Relative(7), rhs: Relative(12) }, JumpIf { condition: Relative(15), location: 226 }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(16) } }, Load { destination: Relative(7), 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(7) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 232 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(7) }, Load { destination: Relative(7), source_pointer: Relative(6) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(17), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(7) }, Not { destination: Relative(17), source: Relative(17), bit_size: U1 }, JumpIf { condition: Relative(17), location: 240 }, Call { location: 1793 }, 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: Field, value: 2 }, Const { destination: Relative(7), bit_size: Field, value: 3 }, Const { destination: Relative(17), bit_size: Field, value: 20 }, Mov { destination: Relative(18), 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(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(6) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Relative(7) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Relative(17) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 21 }, Mov { destination: Relative(21), source: Direct(0) }, Mov { destination: Relative(22), source: Relative(9) }, Mov { destination: Relative(23), source: Relative(18) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(20) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(19), source: Relative(22) }, JumpIf { condition: Relative(19), location: 267 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(9) } }, BinaryIntOp { destination: Relative(9), op: Sub, bit_size: U32, lhs: Relative(2), rhs: Relative(10) }, BinaryIntOp { destination: Relative(19), op: LessThanEquals, bit_size: U32, lhs: Relative(10), rhs: Relative(2) }, JumpIf { condition: Relative(19), location: 271 }, Call { location: 1787 }, BinaryIntOp { destination: Relative(19), op: LessThan, bit_size: U32, lhs: Relative(9), rhs: Relative(5) }, JumpIf { condition: Relative(19), location: 274 }, Call { location: 1790 }, BinaryIntOp { destination: Relative(19), op: Mul, bit_size: U32, lhs: Relative(9), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(1), 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(32836) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(1), 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: Relative(10) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(23) }, Load { destination: Relative(19), source_pointer: Relative(25) }, Load { destination: Relative(24), source_pointer: Relative(22) }, Const { destination: Relative(25), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(26), op: Equals, bit_size: U32, lhs: Relative(25), rhs: Relative(24) }, Not { destination: Relative(26), source: Relative(26), bit_size: U1 }, JumpIf { condition: Relative(26), location: 292 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(24), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(24) }, Load { destination: Relative(24), source_pointer: Relative(19) }, Const { destination: Relative(26), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(27), op: Equals, bit_size: U32, lhs: Relative(26), rhs: Relative(24) }, Not { destination: Relative(27), source: Relative(27), bit_size: U1 }, JumpIf { condition: Relative(27), location: 300 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(24), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(24) }, Const { destination: Relative(24), bit_size: Field, value: 4 }, BinaryFieldOp { destination: Relative(27), op: Equals, lhs: Relative(20), rhs: Relative(24) }, JumpIf { condition: Relative(27), location: 307 }, Const { destination: Relative(28), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(28) } }, Load { destination: Relative(20), source_pointer: Relative(22) }, Const { destination: Relative(27), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(28), op: Equals, bit_size: U32, lhs: Relative(27), rhs: Relative(20) }, Not { destination: Relative(28), source: Relative(28), bit_size: U1 }, JumpIf { condition: Relative(28), location: 313 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(20) }, Load { destination: Relative(20), source_pointer: Relative(19) }, Const { destination: Relative(28), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(29), op: Equals, bit_size: U32, lhs: Relative(28), rhs: Relative(20) }, Not { destination: Relative(29), source: Relative(29), bit_size: U1 }, JumpIf { condition: Relative(29), location: 321 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(20) }, Const { destination: Relative(19), bit_size: Field, value: 5 }, Const { destination: Relative(20), bit_size: Field, value: 6 }, Const { destination: Relative(29), bit_size: Field, value: 21 }, Mov { destination: Relative(30), source: Direct(1) }, Const { destination: Relative(31), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(31) }, IndirectConst { destination_pointer: Relative(30), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(30), rhs: Direct(2) }, Mov { destination: Relative(32), source: Relative(31) }, Store { destination_pointer: Relative(32), source: Relative(19) }, BinaryIntOp { destination: Relative(32), op: Add, bit_size: U32, lhs: Relative(32), rhs: Direct(2) }, Store { destination_pointer: Relative(32), source: Relative(20) }, BinaryIntOp { destination: Relative(32), op: Add, bit_size: U32, lhs: Relative(32), rhs: Direct(2) }, Store { destination_pointer: Relative(32), source: Relative(29) }, Const { destination: Relative(29), bit_size: Integer(U32), value: 31 }, Mov { destination: Relative(31), source: Direct(0) }, Mov { destination: Relative(32), source: Relative(22) }, Mov { destination: Relative(33), source: Relative(30) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(29) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(20), source: Relative(32) }, JumpIf { condition: Relative(20), location: 348 }, Const { destination: Relative(22), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(22) } }, BinaryIntOp { destination: Relative(20), op: Sub, bit_size: U32, lhs: Relative(2), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(22), op: LessThanEquals, bit_size: U32, lhs: Direct(32836), rhs: Relative(2) }, JumpIf { condition: Relative(22), location: 352 }, Call { location: 1787 }, BinaryIntOp { destination: Relative(22), op: LessThan, bit_size: U32, lhs: Relative(20), rhs: Relative(5) }, JumpIf { condition: Relative(22), location: 355 }, Call { location: 1790 }, BinaryIntOp { destination: Relative(22), op: Mul, bit_size: U32, lhs: Relative(20), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(32), op: Add, bit_size: U32, lhs: Relative(31), rhs: Relative(22) }, Load { destination: Relative(29), source_pointer: Relative(32) }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(33), op: Add, bit_size: U32, lhs: Relative(1), 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) }, BinaryIntOp { destination: Relative(33), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(10) }, BinaryIntOp { destination: Relative(34), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(35), op: Add, bit_size: U32, lhs: Relative(34), rhs: Relative(33) }, Load { destination: Relative(22), source_pointer: Relative(35) }, Load { destination: Relative(34), source_pointer: Relative(32) }, Const { destination: Relative(35), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(36), op: Equals, bit_size: U32, lhs: Relative(35), rhs: Relative(34) }, Not { destination: Relative(36), source: Relative(36), bit_size: U1 }, JumpIf { condition: Relative(36), location: 373 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(34), op: Add, bit_size: U32, lhs: Relative(34), rhs: Direct(2) }, Store { destination_pointer: Relative(32), source: Relative(34) }, Load { destination: Relative(34), source_pointer: Relative(22) }, Const { destination: Relative(36), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(37), op: Equals, bit_size: U32, lhs: Relative(36), rhs: Relative(34) }, Not { destination: Relative(37), source: Relative(37), bit_size: U1 }, JumpIf { condition: Relative(37), location: 381 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(34), op: Add, bit_size: U32, lhs: Relative(34), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(34) }, Const { destination: Relative(34), bit_size: Field, value: 7 }, BinaryFieldOp { destination: Relative(37), op: Equals, lhs: Relative(29), rhs: Relative(34) }, JumpIf { condition: Relative(37), location: 388 }, Const { destination: Relative(38), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(38) } }, Load { destination: Relative(29), source_pointer: Relative(32) }, Const { destination: Relative(34), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(37), op: Equals, bit_size: U32, lhs: Relative(34), rhs: Relative(29) }, Not { destination: Relative(37), source: Relative(37), bit_size: U1 }, JumpIf { condition: Relative(37), location: 394 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(29), rhs: Direct(2) }, Store { destination_pointer: Relative(32), source: Relative(29) }, Load { destination: Relative(29), source_pointer: Relative(22) }, Const { destination: Relative(37), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(38), op: Equals, bit_size: U32, lhs: Relative(37), rhs: Relative(29) }, Not { destination: Relative(38), source: Relative(38), bit_size: U1 }, JumpIf { condition: Relative(38), location: 402 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(29), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(29) }, Const { destination: Relative(22), bit_size: Field, value: 8 }, Const { destination: Relative(29), bit_size: Field, value: 9 }, Const { destination: Relative(38), bit_size: Field, value: 22 }, Mov { destination: Relative(39), source: Direct(1) }, Const { destination: Relative(40), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(40) }, IndirectConst { destination_pointer: Relative(39), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(40), op: Add, bit_size: U32, lhs: Relative(39), rhs: Direct(2) }, Mov { destination: Relative(41), source: Relative(40) }, Store { destination_pointer: Relative(41), source: Relative(22) }, BinaryIntOp { destination: Relative(41), op: Add, bit_size: U32, lhs: Relative(41), rhs: Direct(2) }, Store { destination_pointer: Relative(41), source: Relative(29) }, BinaryIntOp { destination: Relative(41), op: Add, bit_size: U32, lhs: Relative(41), rhs: Direct(2) }, Store { destination_pointer: Relative(41), source: Relative(38) }, Const { destination: Relative(40), bit_size: Integer(U32), value: 41 }, Mov { destination: Relative(41), source: Direct(0) }, Mov { destination: Relative(42), source: Relative(32) }, Mov { destination: Relative(43), source: Relative(39) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(40) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(38), source: Relative(42) }, JumpIf { condition: Relative(38), location: 429 }, Const { destination: Relative(32), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(32) } }, BinaryIntOp { destination: Relative(32), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, JumpIf { condition: Relative(32), location: 432 }, Call { location: 1790 }, BinaryIntOp { destination: Relative(32), op: Mul, bit_size: U32, lhs: Relative(2), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(39), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(40), op: Add, bit_size: U32, lhs: Relative(39), rhs: Relative(32) }, Load { destination: Relative(38), source_pointer: Relative(40) }, BinaryIntOp { destination: Relative(39), op: Add, bit_size: U32, lhs: Relative(32), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(41), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(42), op: Add, bit_size: U32, lhs: Relative(41), rhs: Relative(39) }, Load { destination: Relative(40), source_pointer: Relative(42) }, BinaryIntOp { destination: Relative(41), op: Add, bit_size: U32, lhs: Relative(32), rhs: Relative(10) }, BinaryIntOp { destination: Relative(43), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(44), op: Add, bit_size: U32, lhs: Relative(43), rhs: Relative(41) }, Load { destination: Relative(42), source_pointer: Relative(44) }, Load { destination: Relative(43), source_pointer: Relative(40) }, Const { destination: Relative(44), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(45), op: Equals, bit_size: U32, lhs: Relative(44), rhs: Relative(43) }, Not { destination: Relative(45), source: Relative(45), bit_size: U1 }, JumpIf { condition: Relative(45), location: 450 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(43), op: Add, bit_size: U32, lhs: Relative(43), rhs: Direct(2) }, Store { destination_pointer: Relative(40), source: Relative(43) }, Load { destination: Relative(43), source_pointer: Relative(42) }, Const { destination: Relative(45), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(46), op: Equals, bit_size: U32, lhs: Relative(45), rhs: Relative(43) }, Not { destination: Relative(46), source: Relative(46), bit_size: U1 }, JumpIf { condition: Relative(46), location: 458 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(43), op: Add, bit_size: U32, lhs: Relative(43), rhs: Direct(2) }, Store { destination_pointer: Relative(42), source: Relative(43) }, Const { destination: Relative(43), bit_size: Field, value: 10 }, BinaryFieldOp { destination: Relative(46), op: Equals, lhs: Relative(38), rhs: Relative(43) }, JumpIf { condition: Relative(46), location: 465 }, Const { destination: Relative(47), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(47) } }, Load { destination: Relative(38), source_pointer: Relative(40) }, Const { destination: Relative(46), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(47), op: Equals, bit_size: U32, lhs: Relative(46), rhs: Relative(38) }, Not { destination: Relative(47), source: Relative(47), bit_size: U1 }, JumpIf { condition: Relative(47), location: 471 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(38), op: Add, bit_size: U32, lhs: Relative(38), rhs: Direct(2) }, Store { destination_pointer: Relative(40), source: Relative(38) }, Load { destination: Relative(38), source_pointer: Relative(42) }, Const { destination: Relative(47), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(48), op: Equals, bit_size: U32, lhs: Relative(47), rhs: Relative(38) }, Not { destination: Relative(48), source: Relative(48), bit_size: U1 }, JumpIf { condition: Relative(48), location: 479 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(38), op: Add, bit_size: U32, lhs: Relative(38), rhs: Direct(2) }, Store { destination_pointer: Relative(42), source: Relative(38) }, Const { destination: Relative(38), bit_size: Field, value: 11 }, Const { destination: Relative(48), bit_size: Field, value: 12 }, Const { destination: Relative(49), bit_size: Field, value: 23 }, Mov { destination: Relative(50), source: Direct(1) }, Const { destination: Relative(51), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(51) }, IndirectConst { destination_pointer: Relative(50), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(51), op: Add, bit_size: U32, lhs: Relative(50), rhs: Direct(2) }, Mov { destination: Relative(52), source: Relative(51) }, Store { destination_pointer: Relative(52), source: Relative(38) }, BinaryIntOp { destination: Relative(52), op: Add, bit_size: U32, lhs: Relative(52), rhs: Direct(2) }, Store { destination_pointer: Relative(52), source: Relative(48) }, BinaryIntOp { destination: Relative(52), op: Add, bit_size: U32, lhs: Relative(52), rhs: Direct(2) }, Store { destination_pointer: Relative(52), source: Relative(49) }, Const { destination: Relative(48), bit_size: Integer(U32), value: 51 }, Mov { destination: Relative(51), source: Direct(0) }, Mov { destination: Relative(52), source: Relative(40) }, Mov { destination: Relative(53), source: Relative(50) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(48) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(38), source: Relative(52) }, JumpIf { condition: Relative(38), location: 506 }, Const { destination: Relative(48), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(48) } }, Load { destination: Relative(38), source_pointer: Relative(40) }, Const { destination: Relative(48), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(49), op: Equals, bit_size: U32, lhs: Relative(48), rhs: Relative(38) }, Not { destination: Relative(49), source: Relative(49), bit_size: U1 }, JumpIf { condition: Relative(49), location: 512 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(38), op: Add, bit_size: U32, lhs: Relative(38), rhs: Direct(2) }, Store { destination_pointer: Relative(40), source: Relative(38) }, Load { destination: Relative(38), source_pointer: Relative(42) }, Const { destination: Relative(49), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(51), op: Equals, bit_size: U32, lhs: Relative(49), rhs: Relative(38) }, Not { destination: Relative(51), source: Relative(51), bit_size: U1 }, JumpIf { condition: Relative(51), location: 520 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(38), op: Add, bit_size: U32, lhs: Relative(38), rhs: Direct(2) }, Store { destination_pointer: Relative(42), source: Relative(38) }, Const { destination: Relative(38), bit_size: Field, value: 109 }, Const { destination: Relative(51), bit_size: Field, value: 110 }, Const { destination: Relative(52), bit_size: Field, value: 111 }, Mov { destination: Relative(53), source: Direct(1) }, Const { destination: Relative(54), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(54) }, IndirectConst { destination_pointer: Relative(53), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(54), op: Add, bit_size: U32, lhs: Relative(53), rhs: Direct(2) }, Mov { destination: Relative(55), source: Relative(54) }, Store { destination_pointer: Relative(55), source: Relative(38) }, BinaryIntOp { destination: Relative(55), op: Add, bit_size: U32, lhs: Relative(55), rhs: Direct(2) }, Store { destination_pointer: Relative(55), source: Relative(51) }, BinaryIntOp { destination: Relative(55), op: Add, bit_size: U32, lhs: Relative(55), rhs: Direct(2) }, Store { destination_pointer: Relative(55), source: Relative(52) }, Const { destination: Relative(51), bit_size: Integer(U32), value: 54 }, Mov { destination: Relative(54), source: Direct(0) }, Mov { destination: Relative(55), source: Relative(42) }, Mov { destination: Relative(56), source: Relative(53) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(51) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(38), source: Relative(55) }, JumpIf { condition: Relative(38), location: 547 }, Const { destination: Relative(51), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(51) } }, BinaryIntOp { destination: Relative(38), op: Equals, bit_size: U32, lhs: Relative(2), rhs: Relative(10) }, BinaryIntOp { destination: Relative(51), op: Add, bit_size: U32, lhs: Relative(39), rhs: Direct(32836) }, Const { destination: Relative(52), bit_size: Field, value: 100 }, Const { destination: Relative(54), bit_size: Field, value: 50 }, JumpIf { condition: Relative(38), location: 576 }, Jump { location: 553 }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, 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(32) }, Store { destination_pointer: Relative(15), source: Relative(54) }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, Mov { destination: Relative(1), source: Direct(32773) }, 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(39) }, Store { destination_pointer: Relative(15), source: Relative(40) }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, 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(51) }, Store { destination_pointer: Relative(15), source: Relative(42) }, Store { destination_pointer: Relative(3), source: Relative(13) }, Jump { location: 599 }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, 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(32) }, Store { destination_pointer: Relative(15), source: Relative(52) }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, Mov { destination: Relative(1), source: Direct(32773) }, 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(39) }, Store { destination_pointer: Relative(15), source: Relative(40) }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, 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(51) }, Store { destination_pointer: Relative(15), source: Relative(42) }, Store { destination_pointer: Relative(3), source: Relative(13) }, Jump { location: 599 }, Load { destination: Relative(1), source_pointer: Relative(3) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(13) }, Load { destination: Relative(14), source_pointer: Relative(15) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 11 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(16) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 12 }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(13) }, Load { destination: Relative(16), source_pointer: Relative(25) }, Load { destination: Relative(1), source_pointer: Relative(15) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(25), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(1) }, Not { destination: Relative(25), source: Relative(25), bit_size: U1 }, JumpIf { condition: Relative(25), location: 615 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(1) }, Load { destination: Relative(1), source_pointer: Relative(16) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(25), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(1) }, Not { destination: Relative(25), source: Relative(25), bit_size: U1 }, JumpIf { condition: Relative(25), location: 623 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(1) }, BinaryFieldOp { destination: Relative(1), op: Equals, lhs: Relative(14), rhs: Relative(54) }, JumpIf { condition: Relative(1), location: 629 }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(16) } }, Const { destination: Relative(1), bit_size: Field, value: 101 }, Const { destination: Relative(14), bit_size: Field, value: 102 }, Mov { destination: Relative(16), source: Direct(1) }, Const { destination: Relative(25), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(25) }, IndirectConst { destination_pointer: Relative(16), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Mov { destination: Relative(26), source: Relative(25) }, Store { destination_pointer: Relative(26), source: Relative(52) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(26), rhs: Direct(2) }, Store { destination_pointer: Relative(26), source: Relative(1) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(26), rhs: Direct(2) }, Store { destination_pointer: Relative(26), source: Relative(14) }, Load { destination: Relative(1), source_pointer: Relative(16) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(25), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(1) }, Not { destination: Relative(25), source: Relative(25), bit_size: U1 }, JumpIf { condition: Relative(25), location: 648 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(1) }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(31), rhs: Direct(32836) }, JumpIf { condition: Relative(38), location: 681 }, Jump { location: 653 }, Load { destination: Relative(13), source_pointer: Relative(16) }, 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: 659 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(13) }, Load { destination: Relative(13), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Relative(33) }, Load { destination: Relative(15), source_pointer: Relative(26) }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, 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(31) }, Store { destination_pointer: Relative(27), source: Relative(16) }, Mov { destination: Direct(32771), source: Relative(25) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, Mov { destination: Relative(13), source: Direct(32773) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(26), rhs: Relative(1) }, Store { destination_pointer: Relative(27), source: Relative(15) }, Store { destination_pointer: Relative(3), source: Relative(13) }, Jump { location: 715 }, Const { destination: Relative(1), bit_size: Field, value: 51 }, Const { destination: Relative(13), bit_size: Field, value: 52 }, 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(25), source: Relative(15) }, Store { destination_pointer: Relative(25), source: Relative(54) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, Store { destination_pointer: Relative(25), source: Relative(1) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, Store { destination_pointer: Relative(25), source: Relative(13) }, Load { destination: Relative(1), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(33) }, Load { destination: Relative(13), source_pointer: Relative(25) }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Relative(31) }, Store { destination_pointer: Relative(26), source: Relative(14) }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(31), rhs: Direct(32836) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, Mov { destination: Relative(14), source: Direct(32773) }, 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(1) }, Store { destination_pointer: Relative(26), source: Relative(13) }, Store { destination_pointer: Relative(3), source: Relative(14) }, Jump { location: 715 }, Load { destination: Relative(1), source_pointer: Relative(3) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 8 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Load { destination: Relative(13), source_pointer: Relative(14) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Load { destination: Relative(14), source_pointer: Relative(15) }, Load { destination: Relative(3), source_pointer: Relative(13) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(25), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(3) }, Not { destination: Relative(25), source: Relative(25), bit_size: U1 }, JumpIf { condition: Relative(25), location: 728 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(3) }, Load { destination: Relative(3), source_pointer: Relative(14) }, Const { destination: Relative(25), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(26), op: Equals, bit_size: U32, lhs: Relative(25), rhs: Relative(3) }, Not { destination: Relative(26), source: Relative(26), bit_size: U1 }, JumpIf { condition: Relative(26), location: 736 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(3) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 55 }, Mov { destination: Relative(55), source: Direct(0) }, Mov { destination: Relative(56), source: Relative(13) }, Mov { destination: Relative(57), source: Relative(16) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(14) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(3), source: Relative(56) }, JumpIf { condition: Relative(3), location: 749 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(13) } }, 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(8) }, Load { destination: Relative(3), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(11) }, Load { destination: Relative(13), source_pointer: Relative(26) }, Load { destination: Relative(14), source_pointer: Relative(3) }, Const { destination: Relative(26), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(27), op: Equals, bit_size: U32, lhs: Relative(26), rhs: Relative(14) }, Not { destination: Relative(27), source: Relative(27), bit_size: U1 }, JumpIf { condition: Relative(27), location: 761 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(14) }, Load { destination: Relative(3), source_pointer: Relative(13) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(27), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(3) }, Not { destination: Relative(27), source: Relative(27), bit_size: U1 }, JumpIf { condition: Relative(27), location: 769 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(3) }, Const { destination: Relative(27), bit_size: Integer(U32), value: 55 }, Mov { destination: Relative(55), source: Direct(0) }, Mov { destination: Relative(56), source: Relative(13) }, Mov { destination: Relative(57), source: Relative(16) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(27) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(3), source: Relative(56) }, JumpIf { condition: Relative(3), location: 782 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(13) } }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(21) }, Load { destination: Relative(3), source_pointer: Relative(27) }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(28), op: Add, bit_size: U32, lhs: Relative(27), rhs: Relative(23) }, Load { destination: Relative(13), source_pointer: Relative(28) }, Load { destination: Relative(27), source_pointer: Relative(3) }, Const { destination: Relative(28), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(34), op: Equals, bit_size: U32, lhs: Relative(28), rhs: Relative(27) }, Not { destination: Relative(34), source: Relative(34), bit_size: U1 }, JumpIf { condition: Relative(34), location: 794 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(27), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(27) }, Load { destination: Relative(3), source_pointer: Relative(13) }, Const { destination: Relative(27), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(34), op: Equals, bit_size: U32, lhs: Relative(27), rhs: Relative(3) }, Not { destination: Relative(34), source: Relative(34), bit_size: U1 }, JumpIf { condition: Relative(34), location: 802 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(3) }, Const { destination: Relative(3), bit_size: Field, value: 103 }, Const { destination: Relative(34), bit_size: Field, value: 104 }, Const { destination: Relative(35), bit_size: Field, value: 105 }, Mov { destination: Relative(36), source: Direct(1) }, Const { destination: Relative(37), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(37) }, IndirectConst { destination_pointer: Relative(36), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(37), op: Add, bit_size: U32, lhs: Relative(36), rhs: Direct(2) }, Mov { destination: Relative(40), source: Relative(37) }, Store { destination_pointer: Relative(40), source: Relative(3) }, BinaryIntOp { destination: Relative(40), op: Add, bit_size: U32, lhs: Relative(40), rhs: Direct(2) }, Store { destination_pointer: Relative(40), source: Relative(34) }, BinaryIntOp { destination: Relative(40), op: Add, bit_size: U32, lhs: Relative(40), rhs: Direct(2) }, Store { destination_pointer: Relative(40), source: Relative(35) }, Const { destination: Relative(34), bit_size: Integer(U32), value: 55 }, Mov { destination: Relative(55), source: Direct(0) }, Mov { destination: Relative(56), source: Relative(13) }, Mov { destination: Relative(57), source: Relative(36) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(34) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(3), source: Relative(56) }, JumpIf { condition: Relative(3), location: 829 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(13) } }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(34), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(31) }, Load { destination: Relative(3), source_pointer: Relative(34) }, BinaryIntOp { destination: Relative(34), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(35), op: Add, bit_size: U32, lhs: Relative(34), rhs: Relative(33) }, Load { destination: Relative(13), source_pointer: Relative(35) }, Load { destination: Relative(34), source_pointer: Relative(3) }, Const { destination: Relative(35), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(36), op: Equals, bit_size: U32, lhs: Relative(35), rhs: Relative(34) }, Not { destination: Relative(36), source: Relative(36), bit_size: U1 }, JumpIf { condition: Relative(36), location: 841 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(34), op: Add, bit_size: U32, lhs: Relative(34), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(34) }, Load { destination: Relative(3), source_pointer: Relative(13) }, Const { destination: Relative(34), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(36), op: Equals, bit_size: U32, lhs: Relative(34), rhs: Relative(3) }, Not { destination: Relative(36), source: Relative(36), bit_size: U1 }, JumpIf { condition: Relative(36), location: 849 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(3) }, Const { destination: Relative(3), bit_size: Field, value: 106 }, Const { destination: Relative(36), bit_size: Field, value: 107 }, Const { destination: Relative(37), bit_size: Field, value: 108 }, Mov { destination: Relative(40), source: Direct(1) }, Const { destination: Relative(42), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(42) }, IndirectConst { destination_pointer: Relative(40), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(42), op: Add, bit_size: U32, lhs: Relative(40), rhs: Direct(2) }, Mov { destination: Relative(44), source: Relative(42) }, Store { destination_pointer: Relative(44), source: Relative(3) }, BinaryIntOp { destination: Relative(44), op: Add, bit_size: U32, lhs: Relative(44), rhs: Direct(2) }, Store { destination_pointer: Relative(44), source: Relative(36) }, BinaryIntOp { destination: Relative(44), op: Add, bit_size: U32, lhs: Relative(44), rhs: Direct(2) }, Store { destination_pointer: Relative(44), source: Relative(37) }, Const { destination: Relative(36), bit_size: Integer(U32), value: 55 }, Mov { destination: Relative(55), source: Direct(0) }, Mov { destination: Relative(56), source: Relative(13) }, Mov { destination: Relative(57), source: Relative(40) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(36) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(3), source: Relative(56) }, JumpIf { condition: Relative(3), location: 876 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(13) } }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(36), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(39) }, Load { destination: Relative(3), source_pointer: Relative(36) }, BinaryIntOp { destination: Relative(36), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(37), op: Add, bit_size: U32, lhs: Relative(36), rhs: Relative(41) }, Load { destination: Relative(13), source_pointer: Relative(37) }, Load { destination: Relative(36), source_pointer: Relative(3) }, Const { destination: Relative(37), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(40), op: Equals, bit_size: U32, lhs: Relative(37), rhs: Relative(36) }, Not { destination: Relative(40), source: Relative(40), bit_size: U1 }, JumpIf { condition: Relative(40), location: 888 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(36), op: Add, bit_size: U32, lhs: Relative(36), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(36) }, Load { destination: Relative(3), source_pointer: Relative(13) }, Const { destination: Relative(36), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(40), op: Equals, bit_size: U32, lhs: Relative(36), rhs: Relative(3) }, Not { destination: Relative(40), source: Relative(40), bit_size: U1 }, JumpIf { condition: Relative(40), location: 896 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(3) }, Load { destination: Relative(3), source_pointer: Relative(53) }, Const { destination: Relative(40), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(42), op: Equals, bit_size: U32, lhs: Relative(40), rhs: Relative(3) }, Not { destination: Relative(42), source: Relative(42), bit_size: U1 }, JumpIf { condition: Relative(42), location: 904 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(53), source: Relative(3) }, Const { destination: Relative(42), bit_size: Integer(U32), value: 55 }, Mov { destination: Relative(55), source: Direct(0) }, Mov { destination: Relative(56), source: Relative(13) }, Mov { destination: Relative(57), source: Relative(53) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(42) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(3), source: Relative(56) }, JumpIf { condition: Relative(3), location: 917 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(13) } }, Const { destination: Relative(3), bit_size: Field, value: 0 }, Mov { destination: Relative(13), source: Direct(1) }, Const { destination: Relative(42), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(42) }, IndirectConst { destination_pointer: Relative(13), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(42), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Mov { destination: Relative(44), source: Relative(42) }, Store { destination_pointer: Relative(44), source: Relative(3) }, BinaryIntOp { destination: Relative(44), op: Add, bit_size: U32, lhs: Relative(44), rhs: Direct(2) }, Store { destination_pointer: Relative(44), source: Relative(12) }, BinaryIntOp { destination: Relative(44), op: Add, bit_size: U32, lhs: Relative(44), rhs: Direct(2) }, Store { destination_pointer: Relative(44), source: Relative(6) }, Load { destination: Relative(3), source_pointer: Relative(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(3) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 935 }, Call { location: 1793 }, 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(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(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Mov { destination: Relative(42), source: Relative(12) }, Store { destination_pointer: Relative(42), source: Relative(7) }, BinaryIntOp { destination: Relative(42), op: Add, bit_size: U32, lhs: Relative(42), rhs: Direct(2) }, Store { destination_pointer: Relative(42), source: Relative(24) }, BinaryIntOp { destination: Relative(42), op: Add, bit_size: U32, lhs: Relative(42), rhs: Direct(2) }, Store { destination_pointer: Relative(42), source: Relative(19) }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 5 }, 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(19), source: Relative(12) }, 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(1) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(3) }, 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(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(7) }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(10) }, JumpIf { condition: Relative(13), location: 967 }, Call { location: 1790 }, BinaryIntOp { destination: Relative(13), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Relative(10) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(13) }, Load { destination: Relative(4), source_pointer: Relative(24) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(42), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(19) }, Load { destination: Relative(13), source_pointer: Relative(42) }, Load { destination: Relative(19), source_pointer: Relative(4) }, Const { destination: Relative(24), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(42), op: Equals, bit_size: U32, lhs: Relative(24), rhs: Relative(19) }, Not { destination: Relative(42), source: Relative(42), bit_size: U1 }, JumpIf { condition: Relative(42), location: 981 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(19) }, Load { destination: Relative(19), source_pointer: Relative(13) }, Const { destination: Relative(42), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(44), op: Equals, bit_size: U32, lhs: Relative(42), rhs: Relative(19) }, Not { destination: Relative(44), source: Relative(44), bit_size: U1 }, JumpIf { condition: Relative(44), location: 989 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(19) }, BinaryIntOp { destination: Relative(44), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(45), op: Add, bit_size: U32, lhs: Relative(44), rhs: Relative(8) }, Load { destination: Relative(19), source_pointer: Relative(45) }, BinaryIntOp { destination: Relative(45), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(46), op: Add, bit_size: U32, lhs: Relative(45), rhs: Relative(11) }, Load { destination: Relative(44), source_pointer: Relative(46) }, Load { destination: Relative(45), source_pointer: Relative(19) }, Const { destination: Relative(46), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(47), op: Equals, bit_size: U32, lhs: Relative(46), rhs: Relative(45) }, Not { destination: Relative(47), source: Relative(47), bit_size: U1 }, JumpIf { condition: Relative(47), location: 1003 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(45), op: Add, bit_size: U32, lhs: Relative(45), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(45) }, Load { destination: Relative(45), source_pointer: Relative(44) }, Const { destination: Relative(47), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(48), op: Equals, bit_size: U32, lhs: Relative(47), rhs: Relative(45) }, Not { destination: Relative(48), source: Relative(48), bit_size: U1 }, JumpIf { condition: Relative(48), location: 1011 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(45), op: Add, bit_size: U32, lhs: Relative(45), rhs: Direct(2) }, Store { destination_pointer: Relative(44), source: Relative(45) }, Load { destination: Relative(44), source_pointer: Relative(18) }, Const { destination: Relative(45), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(48), op: Equals, bit_size: U32, lhs: Relative(45), rhs: Relative(44) }, Not { destination: Relative(48), source: Relative(48), bit_size: U1 }, JumpIf { condition: Relative(48), location: 1019 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(44), op: Add, bit_size: U32, lhs: Relative(44), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(44) }, Const { destination: Relative(48), bit_size: Integer(U32), value: 55 }, Mov { destination: Relative(55), source: Direct(0) }, Mov { destination: Relative(56), source: Relative(19) }, Mov { destination: Relative(57), source: Relative(18) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(48) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(44), source: Relative(56) }, JumpIf { condition: Relative(44), location: 1032 }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(18) } }, Load { destination: Relative(18), source_pointer: Relative(4) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(44), op: Equals, bit_size: U32, lhs: Relative(19), rhs: Relative(18) }, Not { destination: Relative(44), source: Relative(44), bit_size: U1 }, JumpIf { condition: Relative(44), location: 1038 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(18) }, Load { destination: Relative(18), source_pointer: Relative(13) }, Const { destination: Relative(44), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(48), op: Equals, bit_size: U32, lhs: Relative(44), rhs: Relative(18) }, Not { destination: Relative(48), source: Relative(48), bit_size: U1 }, JumpIf { condition: Relative(48), location: 1046 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(18) }, BinaryIntOp { destination: Relative(48), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(49), op: Add, bit_size: U32, lhs: Relative(48), rhs: Relative(21) }, Load { destination: Relative(18), source_pointer: Relative(49) }, BinaryIntOp { destination: Relative(49), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(51), op: Add, bit_size: U32, lhs: Relative(49), rhs: Relative(23) }, Load { destination: Relative(48), source_pointer: Relative(51) }, Load { destination: Relative(49), source_pointer: Relative(18) }, Const { destination: Relative(51), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(52), op: Equals, bit_size: U32, lhs: Relative(51), rhs: Relative(49) }, Not { destination: Relative(52), source: Relative(52), bit_size: U1 }, JumpIf { condition: Relative(52), location: 1060 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(49), op: Add, bit_size: U32, lhs: Relative(49), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(49) }, Load { destination: Relative(49), source_pointer: Relative(48) }, Const { destination: Relative(52), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(53), op: Equals, bit_size: U32, lhs: Relative(52), rhs: Relative(49) }, Not { destination: Relative(53), source: Relative(53), bit_size: U1 }, JumpIf { condition: Relative(53), location: 1068 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(49), op: Add, bit_size: U32, lhs: Relative(49), rhs: Direct(2) }, Store { destination_pointer: Relative(48), source: Relative(49) }, Load { destination: Relative(48), source_pointer: Relative(30) }, Const { destination: Relative(49), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(53), op: Equals, bit_size: U32, lhs: Relative(49), rhs: Relative(48) }, Not { destination: Relative(53), source: Relative(53), bit_size: U1 }, JumpIf { condition: Relative(53), location: 1076 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(48), op: Add, bit_size: U32, lhs: Relative(48), rhs: Direct(2) }, Store { destination_pointer: Relative(30), source: Relative(48) }, Const { destination: Relative(53), bit_size: Integer(U32), value: 55 }, Mov { destination: Relative(55), source: Direct(0) }, Mov { destination: Relative(56), source: Relative(18) }, Mov { destination: Relative(57), source: Relative(30) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(53) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(48), source: Relative(56) }, JumpIf { condition: Relative(48), location: 1089 }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(18) } }, Load { destination: Relative(18), source_pointer: Relative(4) }, Const { destination: Relative(48), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(53), op: Equals, bit_size: U32, lhs: Relative(48), rhs: Relative(18) }, Not { destination: Relative(53), source: Relative(53), bit_size: U1 }, JumpIf { condition: Relative(53), location: 1095 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(18) }, Load { destination: Relative(18), source_pointer: Relative(13) }, Const { destination: Relative(53), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(55), op: Equals, bit_size: U32, lhs: Relative(53), rhs: Relative(18) }, Not { destination: Relative(55), source: Relative(55), bit_size: U1 }, JumpIf { condition: Relative(55), location: 1103 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(18) }, BinaryIntOp { destination: Relative(55), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(56), op: Add, bit_size: U32, lhs: Relative(55), rhs: Relative(31) }, Load { destination: Relative(18), source_pointer: Relative(56) }, BinaryIntOp { destination: Relative(55), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(56), op: Add, bit_size: U32, lhs: Relative(55), rhs: Relative(33) }, Load { destination: Relative(31), source_pointer: Relative(56) }, Load { destination: Relative(33), source_pointer: Relative(18) }, Const { destination: Relative(55), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(56), op: Equals, bit_size: U32, lhs: Relative(55), rhs: Relative(33) }, Not { destination: Relative(56), source: Relative(56), bit_size: U1 }, JumpIf { condition: Relative(56), location: 1117 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(33), op: Add, bit_size: U32, lhs: Relative(33), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(33) }, Load { destination: Relative(33), source_pointer: Relative(31) }, Const { destination: Relative(56), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(57), op: Equals, bit_size: U32, lhs: Relative(56), rhs: Relative(33) }, Not { destination: Relative(57), source: Relative(57), bit_size: U1 }, JumpIf { condition: Relative(57), location: 1125 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(33), op: Add, bit_size: U32, lhs: Relative(33), rhs: Direct(2) }, Store { destination_pointer: Relative(31), source: Relative(33) }, Const { destination: Relative(33), bit_size: Integer(U32), value: 57 }, Mov { destination: Relative(57), source: Direct(0) }, Mov { destination: Relative(58), source: Relative(18) }, Mov { destination: Relative(59), source: Relative(16) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(33) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(31), source: Relative(58) }, JumpIf { condition: Relative(31), location: 1138 }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(16) } }, Load { destination: Relative(16), source_pointer: Relative(4) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(31), op: Equals, bit_size: U32, lhs: Relative(18), rhs: Relative(16) }, Not { destination: Relative(31), source: Relative(31), bit_size: U1 }, JumpIf { condition: Relative(31), location: 1144 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(16) }, Load { destination: Relative(16), source_pointer: Relative(13) }, Const { destination: Relative(31), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(33), op: Equals, bit_size: U32, lhs: Relative(31), rhs: Relative(16) }, Not { destination: Relative(33), source: Relative(33), bit_size: U1 }, JumpIf { condition: Relative(33), location: 1152 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(16) }, BinaryIntOp { destination: Relative(33), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(57), op: Add, bit_size: U32, lhs: Relative(33), rhs: Relative(39) }, Load { destination: Relative(16), source_pointer: Relative(57) }, BinaryIntOp { destination: Relative(39), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(57), op: Add, bit_size: U32, lhs: Relative(39), rhs: Relative(41) }, Load { destination: Relative(33), source_pointer: Relative(57) }, Load { destination: Relative(39), source_pointer: Relative(16) }, Const { destination: Relative(41), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(57), op: Equals, bit_size: U32, lhs: Relative(41), rhs: Relative(39) }, Not { destination: Relative(57), source: Relative(57), bit_size: U1 }, JumpIf { condition: Relative(57), location: 1166 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(39), op: Add, bit_size: U32, lhs: Relative(39), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(39) }, Load { destination: Relative(39), source_pointer: Relative(33) }, Const { destination: Relative(57), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(58), op: Equals, bit_size: U32, lhs: Relative(57), rhs: Relative(39) }, Not { destination: Relative(58), source: Relative(58), bit_size: U1 }, JumpIf { condition: Relative(58), location: 1174 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(39), op: Add, bit_size: U32, lhs: Relative(39), rhs: Direct(2) }, Store { destination_pointer: Relative(33), source: Relative(39) }, Load { destination: Relative(39), source_pointer: Relative(50) }, Const { destination: Relative(58), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(59), op: Equals, bit_size: U32, lhs: Relative(58), rhs: Relative(39) }, Not { destination: Relative(59), source: Relative(59), bit_size: U1 }, JumpIf { condition: Relative(59), location: 1182 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(39), op: Add, bit_size: U32, lhs: Relative(39), rhs: Direct(2) }, Store { destination_pointer: Relative(50), source: Relative(39) }, Const { destination: Relative(59), bit_size: Integer(U32), value: 60 }, Mov { destination: Relative(60), source: Direct(0) }, Mov { destination: Relative(61), source: Relative(16) }, Mov { destination: Relative(62), source: Relative(50) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(59) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(39), source: Relative(61) }, JumpIf { condition: Relative(39), location: 1195 }, Const { destination: Relative(50), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(50) } }, Load { destination: Relative(39), source_pointer: Relative(4) }, Const { destination: Relative(50), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(59), op: Equals, bit_size: U32, lhs: Relative(50), rhs: Relative(39) }, Not { destination: Relative(59), source: Relative(59), bit_size: U1 }, JumpIf { condition: Relative(59), location: 1201 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(39), op: Add, bit_size: U32, lhs: Relative(39), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(39) }, Load { destination: Relative(4), source_pointer: Relative(13) }, Const { destination: Relative(39), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(59), op: Equals, bit_size: U32, lhs: Relative(39), rhs: Relative(4) }, Not { destination: Relative(59), source: Relative(59), bit_size: U1 }, JumpIf { condition: Relative(59), location: 1209 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(4) }, BinaryIntOp { destination: Relative(59), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(60), op: Add, bit_size: U32, lhs: Relative(59), rhs: Relative(32) }, Load { destination: Relative(4), source_pointer: Relative(60) }, Load { destination: Relative(13), source_pointer: Relative(16) }, Const { destination: Relative(32), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(59), op: Equals, bit_size: U32, lhs: Relative(32), rhs: Relative(13) }, Not { destination: Relative(59), source: Relative(59), bit_size: U1 }, JumpIf { condition: Relative(59), location: 1220 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(13) }, Load { destination: Relative(13), source_pointer: Relative(33) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(59), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(13) }, Not { destination: Relative(59), source: Relative(59), bit_size: U1 }, JumpIf { condition: Relative(59), location: 1228 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(33), source: Relative(13) }, BinaryFieldOp { destination: Relative(13), op: Equals, lhs: Relative(4), rhs: Relative(54) }, JumpIf { condition: Relative(13), location: 1234 }, Const { destination: Relative(33), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(33) } }, Load { destination: Relative(4), source_pointer: Relative(3) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(33), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(4) }, Not { destination: Relative(33), source: Relative(33), bit_size: U1 }, JumpIf { condition: Relative(33), location: 1240 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(4) }, Load { destination: Relative(3), source_pointer: Relative(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(33), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, Not { destination: Relative(33), source: Relative(33), bit_size: U1 }, JumpIf { condition: Relative(33), location: 1248 }, Call { location: 1793 }, 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(3), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Relative(54), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Load { destination: Relative(33), source_pointer: Relative(54) }, Const { destination: Relative(54), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(60), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(54) }, Load { destination: Relative(59), source_pointer: Relative(60) }, Load { destination: Relative(1), source_pointer: Relative(33) }, Const { destination: Relative(60), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(61), op: Equals, bit_size: U32, lhs: Relative(60), rhs: Relative(1) }, Not { destination: Relative(61), source: Relative(61), bit_size: U1 }, JumpIf { condition: Relative(61), location: 1262 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(33), source: Relative(1) }, Load { destination: Relative(1), source_pointer: Relative(59) }, Const { destination: Relative(61), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(62), op: Equals, bit_size: U32, lhs: Relative(61), rhs: Relative(1) }, Not { destination: Relative(62), source: Relative(62), bit_size: U1 }, JumpIf { condition: Relative(62), location: 1270 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(59), source: Relative(1) }, Load { destination: Relative(1), source_pointer: Relative(30) }, Const { destination: Relative(59), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(62), op: Equals, bit_size: U32, lhs: Relative(59), rhs: Relative(1) }, Not { destination: Relative(62), source: Relative(62), bit_size: U1 }, JumpIf { condition: Relative(62), location: 1278 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(30), source: Relative(1) }, Const { destination: Relative(62), bit_size: Integer(U32), value: 63 }, Mov { destination: Relative(63), source: Direct(0) }, Mov { destination: Relative(64), source: Relative(33) }, Mov { destination: Relative(65), source: Relative(30) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(62) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(64) }, JumpIf { condition: Relative(1), location: 1291 }, Const { destination: Relative(30), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(30) } }, Const { destination: Relative(1), bit_size: Field, value: 19 }, Const { destination: Relative(30), bit_size: Field, value: 18 }, Mov { destination: Relative(33), source: Direct(1) }, Const { destination: Relative(62), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(62) }, IndirectConst { destination_pointer: Relative(33), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(62), op: Add, bit_size: U32, lhs: Relative(33), rhs: Direct(2) }, Mov { destination: Relative(63), source: Relative(62) }, Store { destination_pointer: Relative(63), source: Relative(17) }, BinaryIntOp { destination: Relative(63), op: Add, bit_size: U32, lhs: Relative(63), rhs: Direct(2) }, Store { destination_pointer: Relative(63), source: Relative(1) }, BinaryIntOp { destination: Relative(63), op: Add, bit_size: U32, lhs: Relative(63), rhs: Direct(2) }, Store { destination_pointer: Relative(63), source: Relative(30) }, BinaryIntOp { destination: Relative(62), op: LessThan, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(63), op: Mul, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(64), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(65), op: LessThan, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(66), op: Mul, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(67), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(68), op: LessThan, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(69), op: Mul, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(70), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(71), op: LessThan, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(72), op: Mul, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(73), op: LessThan, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(74), op: Mul, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, JumpIf { condition: Relative(38), location: 1359 }, Jump { location: 1319 }, Load { destination: Relative(4), source_pointer: Relative(33) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(4) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 1325 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(33), source: Relative(4) }, JumpIf { condition: Relative(62), location: 1329 }, Call { location: 1790 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(63), rhs: Direct(32836) }, 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(4) }, Load { destination: Relative(9), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(23) }, Load { destination: Relative(13), source_pointer: Relative(15) }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, 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(21) }, Store { destination_pointer: Relative(16), source: Relative(33) }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, Mov { destination: Relative(9), source: Direct(32773) }, 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(64) }, Store { destination_pointer: Relative(16), source: Relative(13) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 1829 }, 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(4) }, Store { destination_pointer: Relative(15), source: Relative(9) }, Store { destination_pointer: Relative(12), source: Relative(13) }, Jump { location: 1405 }, 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(13), source: Relative(6) }, Store { destination_pointer: Relative(13), source: Relative(43) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(29) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(22) }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, JumpIf { condition: Relative(6), location: 1373 }, Call { location: 1790 }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32836) }, 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(9) }, Load { destination: Relative(6), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(23) }, Load { destination: Relative(13), source_pointer: Relative(15) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, 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(21) }, Store { destination_pointer: Relative(16), source: Relative(4) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(32836) }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, Mov { destination: Relative(6), source: Direct(32773) }, 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(4) }, Store { destination_pointer: Relative(16), source: Relative(13) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 1829 }, 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(9) }, Store { destination_pointer: Relative(14), source: Relative(6) }, Store { destination_pointer: Relative(12), source: Relative(4) }, Jump { location: 1405 }, Load { destination: Relative(4), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, Load { destination: Relative(6), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(9) }, Load { destination: Relative(4), source_pointer: Relative(6) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(4) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 1416 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(4) }, Load { destination: Relative(4), 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(4) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 1424 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(4) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(3) }, Load { destination: Relative(4), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(54) }, Load { destination: Relative(14), source_pointer: Relative(15) }, Load { destination: Relative(15), source_pointer: Relative(4) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(18), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(15) }, Not { destination: Relative(18), source: Relative(18), bit_size: U1 }, JumpIf { condition: Relative(18), location: 1436 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(15) }, Load { destination: Relative(15), source_pointer: Relative(14) }, 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: 1444 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(15) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 75 }, Mov { destination: Relative(75), source: Direct(0) }, Mov { destination: Relative(76), source: Relative(4) }, Mov { destination: Relative(77), source: Relative(33) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(19) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(15), source: Relative(76) }, JumpIf { condition: Relative(15), location: 1457 }, Const { destination: Relative(19), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(19) } }, Load { destination: Relative(15), source_pointer: Relative(6) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(22), op: Equals, bit_size: U32, lhs: Relative(19), rhs: Relative(15) }, Not { destination: Relative(22), source: Relative(22), bit_size: U1 }, JumpIf { condition: Relative(22), location: 1463 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(15) }, Load { destination: Relative(6), source_pointer: Relative(7) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(22), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(6) }, Not { destination: Relative(22), source: Relative(22), bit_size: U1 }, JumpIf { condition: Relative(22), location: 1471 }, Call { location: 1793 }, 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(4) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(22), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(22), source: Relative(22), bit_size: U1 }, JumpIf { condition: Relative(22), location: 1479 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, Load { destination: Relative(6), source_pointer: Relative(14) }, Const { destination: Relative(22), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(24), op: Equals, bit_size: U32, lhs: Relative(22), rhs: Relative(6) }, Not { destination: Relative(24), source: Relative(24), bit_size: U1 }, JumpIf { condition: Relative(24), location: 1487 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(6) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, Load { destination: Relative(6), source_pointer: Relative(14) }, BinaryFieldOp { destination: Relative(4), op: Equals, lhs: Relative(6), rhs: Relative(30) }, JumpIf { condition: Relative(4), location: 1495 }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(14) } }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(2), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(2), op: LessThan, bit_size: U32, lhs: Relative(20), rhs: Direct(32837) }, Const { destination: Relative(6), bit_size: Field, value: 5000 }, JumpIf { condition: Relative(4), location: 1546 }, Jump { location: 1500 }, Load { destination: Relative(4), source_pointer: Relative(12) }, JumpIf { condition: Relative(68), location: 1503 }, Call { location: 1790 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(69), rhs: Direct(32836) }, 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(7) }, Load { destination: Relative(9), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(21) }, Load { destination: Relative(13), source_pointer: Relative(15) }, 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(23) }, Load { destination: Relative(14), source_pointer: Relative(16) }, JumpIf { condition: Relative(2), location: 1515 }, Call { location: 1790 }, Const { destination: Relative(2), bit_size: Field, value: 1000 }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 1829 }, 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(18), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(20) }, Store { destination_pointer: Relative(18), source: Relative(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, 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(16), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(21) }, Store { destination_pointer: Relative(16), source: Relative(15) }, Mov { destination: Direct(32771), source: Relative(2) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(70) }, Store { destination_pointer: Relative(15), source: Relative(14) }, Mov { destination: Direct(32771), source: Relative(4) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 1829 }, 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(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(7) }, Store { destination_pointer: Relative(14), source: Relative(9) }, Store { destination_pointer: Relative(12), source: Relative(2) }, Jump { location: 1592 }, Load { destination: Relative(2), source_pointer: Relative(12) }, JumpIf { condition: Relative(65), location: 1549 }, Call { location: 1790 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(66), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(4) }, Load { destination: Relative(7), source_pointer: Relative(13) }, 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(21) }, Load { destination: Relative(9), source_pointer: Relative(14) }, 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(23) }, Load { destination: Relative(13), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(20), rhs: Direct(32837) }, JumpIf { condition: Relative(14), location: 1562 }, Call { location: 1790 }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 1829 }, 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(20) }, Store { destination_pointer: Relative(16), source: Relative(6) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, Mov { destination: Relative(9), source: Direct(32773) }, 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(21) }, Store { destination_pointer: Relative(16), source: Relative(14) }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, 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(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(67) }, Store { destination_pointer: Relative(15), source: Relative(13) }, Mov { destination: Direct(32771), source: Relative(2) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 1829 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(9), 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) }, Store { destination_pointer: Relative(12), source: Relative(9) }, Jump { location: 1592 }, Load { destination: Relative(2), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32837) }, Load { destination: Relative(4), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(9) }, Load { destination: Relative(9), 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(9) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 1603 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(9) }, Load { destination: Relative(4), source_pointer: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(4) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 1611 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(4) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(3) }, Load { destination: Relative(4), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(54) }, Load { destination: Relative(3), source_pointer: Relative(14) }, Load { destination: Relative(7), 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(7) }, Not { destination: Relative(15), source: Relative(15), bit_size: U1 }, JumpIf { condition: Relative(15), location: 1623 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(7) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(7) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 1631 }, Call { location: 1793 }, 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(7), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, Load { destination: Relative(3), source_pointer: Relative(7) }, BinaryFieldOp { destination: Relative(4), op: Equals, lhs: Relative(3), rhs: Relative(6) }, JumpIf { condition: Relative(4), location: 1639 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(7) } }, JumpIf { condition: Relative(71), location: 1641 }, Call { location: 1790 }, 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(72) }, Load { destination: Relative(3), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(72), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(4) }, Load { destination: Relative(7), source_pointer: Relative(18) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(18), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(4) }, Not { destination: Relative(18), source: Relative(18), bit_size: U1 }, JumpIf { condition: Relative(18), location: 1654 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(4) }, Load { destination: Relative(3), source_pointer: Relative(7) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(18), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, Not { destination: Relative(18), source: Relative(18), bit_size: U1 }, JumpIf { condition: Relative(18), location: 1662 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(3) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(21) }, Load { destination: Relative(3), source_pointer: Relative(19) }, 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(23) }, Load { destination: Relative(18), source_pointer: Relative(20) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(20), op: Equals, bit_size: U32, lhs: Relative(19), rhs: Relative(7) }, Not { destination: Relative(20), source: Relative(20), bit_size: U1 }, JumpIf { condition: Relative(20), location: 1676 }, Call { location: 1793 }, 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(18) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(21), op: Equals, bit_size: U32, lhs: Relative(20), rhs: Relative(7) }, Not { destination: Relative(21), source: Relative(21), bit_size: U1 }, JumpIf { condition: Relative(21), location: 1684 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(7) }, JumpIf { condition: Relative(73), location: 1688 }, Call { location: 1790 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(74), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(7) }, Load { destination: Relative(18), source_pointer: Relative(22) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(11) }, Load { destination: Relative(21), source_pointer: Relative(23) }, Mov { destination: Direct(32771), source: Relative(18) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, Mov { destination: Relative(11), source: Direct(32773) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(8) }, Store { destination_pointer: Relative(23), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32836) }, Mov { destination: Direct(32771), source: Relative(11) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, Mov { destination: Relative(8), source: Direct(32773) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(3) }, Store { destination_pointer: Relative(22), source: Relative(21) }, Mov { destination: Direct(32771), source: Relative(2) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 1829 }, Mov { destination: Relative(3), source: Direct(32773) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(7) }, Store { destination_pointer: Relative(18), source: Relative(8) }, Store { destination_pointer: Relative(12), source: Relative(3) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32837) }, Load { destination: Relative(2), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(8) }, Load { destination: Relative(3), source_pointer: Relative(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(3) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 1728 }, Call { location: 1793 }, 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(2), source_pointer: Relative(7) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 1736 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(10) }, Load { destination: Relative(2), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32837) }, Load { destination: Relative(8), source_pointer: Relative(10) }, Load { destination: Relative(7), 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(7) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 1748 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(7) }, Load { destination: Relative(7), 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(7) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 1756 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, 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(12), source: Relative(8) }, Store { destination_pointer: Relative(12), source: Relative(17) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, 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(6) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 21 }, Mov { destination: Relative(21), source: Direct(0) }, Mov { destination: Relative(22), source: Relative(2) }, Mov { destination: Relative(23), source: Relative(7) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(22) }, JumpIf { condition: Relative(1), location: 1780 }, 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: 1786 }, 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: 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, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 1781 }, 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: 1806 }, Call { location: 1793 }, 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 }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 1811 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32837) }, JumpIf { condition: Relative(5), location: 1816 }, Jump { location: 1814 }, 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(32836) }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 1811 }, 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: 1833 }, Jump { location: 1835 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 1850 }, 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: 1847 }, 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: 1840 }, 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: 1850 }, Return]" + "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32867 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 29 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32838), size_address: Relative(3), offset_address: Relative(4) }, Cast { destination: Direct(32866), source: Direct(32866), bit_size: Integer(U32) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32838 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 13 }, 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) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 7 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 11 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 14 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 15 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 18 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 8 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 21 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 22 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 25 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 11 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Mov { destination: Relative(1), source: Relative(3) }, Mov { destination: Relative(2), source: Direct(32866) }, Call { location: 176 }, Call { location: 180 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32867 }, 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: 175 }, 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: 168 }, Return, Const { destination: Direct(32835), bit_size: Integer(U1), value: 1 }, Const { destination: Direct(32836), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(32837), bit_size: Integer(U32), value: 3 }, Return, Call { location: 599 }, 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) }, BinaryIntOp { destination: Relative(4), op: Sub, bit_size: U32, lhs: Relative(2), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U32, lhs: Direct(32837), rhs: Relative(2) }, JumpIf { condition: Relative(5), location: 188 }, Call { location: 605 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(5) }, JumpIf { condition: Relative(6), location: 192 }, Call { location: 608 }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, 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(6) }, Load { destination: Relative(4), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32836) }, 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) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(7) }, 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(6), source_pointer: Relative(11) }, 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: 211 }, Call { location: 611 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(9) }, Load { destination: Relative(9), 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(9) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 219 }, Call { location: 611 }, 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: Field, value: 1 }, BinaryFieldOp { destination: Relative(12), op: Equals, lhs: Relative(4), rhs: Relative(9) }, JumpIf { condition: Relative(12), location: 226 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(13) } }, Load { destination: Relative(4), source_pointer: Relative(8) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(4) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 232 }, Call { location: 611 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(4) }, Load { destination: Relative(4), 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(4) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 240 }, Call { location: 611 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(4) }, Const { destination: Relative(4), bit_size: Field, value: 2 }, Const { destination: Relative(6), bit_size: Field, value: 3 }, Const { destination: Relative(13), bit_size: Field, value: 20 }, 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(6) }, 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(6), 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(14) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 614 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(16) }, JumpIf { condition: Relative(4), location: 267 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(6) } }, BinaryIntOp { destination: Relative(4), op: Sub, bit_size: U32, lhs: Relative(2), rhs: Relative(7) }, BinaryIntOp { destination: Relative(6), op: LessThanEquals, bit_size: U32, lhs: Relative(7), rhs: Relative(2) }, JumpIf { condition: Relative(6), location: 271 }, Call { location: 605 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(5) }, JumpIf { condition: Relative(6), location: 274 }, Call { location: 608 }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(6) }, Load { destination: Relative(4), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32836) }, 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(13), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(7) }, 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(6), source_pointer: Relative(15) }, Load { destination: Relative(8), source_pointer: Relative(13) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(15), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(8) }, Not { destination: Relative(15), source: Relative(15), bit_size: U1 }, JumpIf { condition: Relative(15), location: 292 }, Call { location: 611 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(8) }, Load { destination: Relative(8), 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(8) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 300 }, Call { location: 611 }, 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(8), bit_size: Field, value: 4 }, BinaryFieldOp { destination: Relative(16), op: Equals, lhs: Relative(4), rhs: Relative(8) }, JumpIf { condition: Relative(16), location: 307 }, Const { destination: Relative(17), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(17) } }, Load { destination: Relative(4), source_pointer: Relative(13) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(4) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 313 }, Call { location: 611 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(6) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(17), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(4) }, Not { destination: Relative(17), source: Relative(17), bit_size: U1 }, JumpIf { condition: Relative(17), location: 321 }, Call { location: 611 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(4) }, Const { destination: Relative(4), bit_size: Field, value: 5 }, Const { destination: Relative(6), bit_size: Field, value: 6 }, Const { destination: Relative(17), bit_size: Field, value: 21 }, Mov { destination: Relative(18), 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(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(4) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Relative(6) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Relative(17) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 19 }, Mov { destination: Relative(19), source: Direct(0) }, Mov { destination: Relative(20), source: Relative(13) }, Mov { destination: Relative(21), source: Relative(18) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 614 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(20) }, JumpIf { condition: Relative(4), location: 348 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(6) } }, BinaryIntOp { destination: Relative(4), op: Sub, bit_size: U32, lhs: Relative(2), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(6), op: LessThanEquals, bit_size: U32, lhs: Direct(32836), rhs: Relative(2) }, JumpIf { condition: Relative(6), location: 352 }, Call { location: 605 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(5) }, JumpIf { condition: Relative(6), location: 355 }, Call { location: 608 }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(6) }, Load { destination: Relative(4), source_pointer: Relative(17) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(13) }, Load { destination: Relative(17), source_pointer: Relative(19) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(7) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(13) }, Load { destination: Relative(6), source_pointer: Relative(19) }, Load { destination: Relative(13), source_pointer: Relative(17) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(19), op: Equals, bit_size: U32, lhs: Relative(18), rhs: Relative(13) }, Not { destination: Relative(19), source: Relative(19), bit_size: U1 }, JumpIf { condition: Relative(19), location: 373 }, Call { location: 611 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(13) }, Load { destination: Relative(13), source_pointer: Relative(6) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(20), op: Equals, bit_size: U32, lhs: Relative(19), rhs: Relative(13) }, Not { destination: Relative(20), source: Relative(20), bit_size: U1 }, JumpIf { condition: Relative(20), location: 381 }, Call { location: 611 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(13) }, Const { destination: Relative(13), bit_size: Field, value: 7 }, BinaryFieldOp { destination: Relative(20), op: Equals, lhs: Relative(4), rhs: Relative(13) }, JumpIf { condition: Relative(20), location: 388 }, Const { destination: Relative(21), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(21) } }, Load { destination: Relative(4), source_pointer: Relative(17) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(20), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(4) }, Not { destination: Relative(20), source: Relative(20), bit_size: U1 }, JumpIf { condition: Relative(20), location: 394 }, Call { location: 611 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(6) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(21), op: Equals, bit_size: U32, lhs: Relative(20), rhs: Relative(4) }, Not { destination: Relative(21), source: Relative(21), bit_size: U1 }, JumpIf { condition: Relative(21), location: 402 }, Call { location: 611 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(4) }, Const { destination: Relative(4), bit_size: Field, value: 8 }, Const { destination: Relative(6), bit_size: Field, value: 9 }, Const { destination: Relative(21), bit_size: Field, value: 22 }, Mov { destination: Relative(22), source: Direct(1) }, Const { destination: Relative(23), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(23) }, IndirectConst { destination_pointer: Relative(22), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Mov { destination: Relative(24), source: Relative(23) }, Store { destination_pointer: Relative(24), source: Relative(4) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(24), rhs: Direct(2) }, Store { destination_pointer: Relative(24), source: Relative(6) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(24), rhs: Direct(2) }, Store { destination_pointer: Relative(24), source: Relative(21) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 23 }, Mov { destination: Relative(23), source: Direct(0) }, Mov { destination: Relative(24), source: Relative(17) }, Mov { destination: Relative(25), source: Relative(22) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 614 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(24) }, JumpIf { condition: Relative(4), location: 429 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(6) } }, BinaryIntOp { destination: Relative(4), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, JumpIf { condition: Relative(4), location: 432 }, Call { location: 608 }, BinaryIntOp { destination: Relative(4), op: Mul, bit_size: U32, lhs: Relative(2), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(4) }, Load { destination: Relative(5), source_pointer: Relative(17) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(6) }, Load { destination: Relative(17), source_pointer: Relative(22) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(7) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(1), 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) }, Load { destination: Relative(21), source_pointer: Relative(17) }, Const { destination: Relative(23), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(24), op: Equals, bit_size: U32, lhs: Relative(23), rhs: Relative(21) }, Not { destination: Relative(24), source: Relative(24), bit_size: U1 }, JumpIf { condition: Relative(24), location: 450 }, Call { location: 611 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(21) }, Load { destination: Relative(21), source_pointer: Relative(22) }, Const { destination: Relative(24), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(25), op: Equals, bit_size: U32, lhs: Relative(24), rhs: Relative(21) }, Not { destination: Relative(25), source: Relative(25), bit_size: U1 }, JumpIf { condition: Relative(25), location: 458 }, Call { location: 611 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(21) }, Const { destination: Relative(21), bit_size: Field, value: 10 }, BinaryFieldOp { destination: Relative(25), op: Equals, lhs: Relative(5), rhs: Relative(21) }, JumpIf { condition: Relative(25), location: 465 }, Const { destination: Relative(26), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(26) } }, Load { destination: Relative(5), source_pointer: Relative(17) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(25), op: Equals, bit_size: U32, lhs: Relative(21), rhs: Relative(5) }, Not { destination: Relative(25), source: Relative(25), bit_size: U1 }, JumpIf { condition: Relative(25), location: 471 }, Call { location: 611 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(5) }, Load { destination: Relative(5), source_pointer: Relative(22) }, Const { destination: Relative(25), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(26), op: Equals, bit_size: U32, lhs: Relative(25), rhs: Relative(5) }, Not { destination: Relative(26), source: Relative(26), bit_size: U1 }, JumpIf { condition: Relative(26), location: 479 }, Call { location: 611 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(5) }, Const { destination: Relative(5), bit_size: Field, value: 11 }, Const { destination: Relative(26), bit_size: Field, value: 12 }, Const { destination: Relative(27), bit_size: Field, value: 23 }, Mov { destination: Relative(28), 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(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(5) }, BinaryIntOp { destination: Relative(30), op: Add, bit_size: U32, lhs: Relative(30), rhs: Direct(2) }, Store { destination_pointer: Relative(30), source: Relative(26) }, BinaryIntOp { destination: Relative(30), op: Add, bit_size: U32, lhs: Relative(30), rhs: Direct(2) }, Store { destination_pointer: Relative(30), source: Relative(27) }, Const { destination: Relative(26), bit_size: Integer(U32), value: 29 }, Mov { destination: Relative(29), source: Direct(0) }, Mov { destination: Relative(30), source: Relative(17) }, Mov { destination: Relative(31), source: Relative(28) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(26) }, Call { location: 614 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(5), source: Relative(30) }, JumpIf { condition: Relative(5), location: 506 }, Const { destination: Relative(26), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(26) } }, Load { destination: Relative(5), source_pointer: Relative(17) }, Const { destination: Relative(26), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(27), op: Equals, bit_size: U32, lhs: Relative(26), rhs: Relative(5) }, Not { destination: Relative(27), source: Relative(27), bit_size: U1 }, JumpIf { condition: Relative(27), location: 512 }, Call { location: 611 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(5) }, Load { destination: Relative(5), source_pointer: Relative(22) }, Const { destination: Relative(27), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(28), op: Equals, bit_size: U32, lhs: Relative(27), rhs: Relative(5) }, Not { destination: Relative(28), source: Relative(28), bit_size: U1 }, JumpIf { condition: Relative(28), location: 520 }, Call { location: 611 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(5) }, Const { destination: Relative(5), bit_size: Field, value: 109 }, Const { destination: Relative(28), bit_size: Field, value: 110 }, Const { destination: Relative(29), bit_size: Field, value: 111 }, Mov { destination: Relative(30), source: Direct(1) }, Const { destination: Relative(31), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(31) }, IndirectConst { destination_pointer: Relative(30), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(30), rhs: Direct(2) }, Mov { destination: Relative(32), source: Relative(31) }, Store { destination_pointer: Relative(32), source: Relative(5) }, BinaryIntOp { destination: Relative(32), op: Add, bit_size: U32, lhs: Relative(32), rhs: Direct(2) }, Store { destination_pointer: Relative(32), source: Relative(28) }, BinaryIntOp { destination: Relative(32), op: Add, bit_size: U32, lhs: Relative(32), rhs: Direct(2) }, Store { destination_pointer: Relative(32), source: Relative(29) }, Const { destination: Relative(28), bit_size: Integer(U32), value: 31 }, Mov { destination: Relative(31), source: Direct(0) }, Mov { destination: Relative(32), source: Relative(22) }, Mov { destination: Relative(33), source: Relative(30) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(28) }, Call { location: 614 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(5), source: Relative(32) }, JumpIf { condition: Relative(5), location: 547 }, Const { destination: Relative(28), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(28) } }, BinaryIntOp { destination: Relative(5), op: Equals, bit_size: U32, lhs: Relative(2), rhs: Relative(7) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32836) }, JumpIf { condition: Relative(5), location: 575 }, Jump { location: 551 }, Const { destination: Relative(5), bit_size: Field, value: 50 }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 647 }, 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(5) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 647 }, Mov { destination: Relative(1), source: Direct(32773) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(6) }, Store { destination_pointer: Relative(5), source: Relative(17) }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 647 }, Mov { destination: Relative(4), source: Direct(32773) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(2) }, Store { destination_pointer: Relative(6), source: Relative(22) }, Store { destination_pointer: Relative(3), source: Relative(4) }, Jump { location: 599 }, Const { destination: Relative(5), bit_size: Field, value: 100 }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 647 }, 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(5) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 647 }, Mov { destination: Relative(1), source: Direct(32773) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(6) }, Store { destination_pointer: Relative(5), source: Relative(17) }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 647 }, Mov { destination: Relative(4), source: Direct(32773) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(2) }, Store { destination_pointer: Relative(6), source: Relative(22) }, Store { destination_pointer: Relative(3), source: Relative(4) }, Jump { location: 599 }, 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: 604 }, 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: 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, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 599 }, 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: 624 }, Call { location: 611 }, 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 }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 629 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32837) }, JumpIf { condition: Relative(5), location: 634 }, Jump { location: 632 }, 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(32836) }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 629 }, 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: 651 }, Jump { location: 653 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 668 }, 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: 665 }, 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: 658 }, 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: 668 }, Return]" ], - "debug_symbols": "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", + "debug_symbols": "pZnLbttIEEX/RWsvWP0u/0oQBI6jDAwIsqHYAwwC//t0kffIySLADLXxPbRUpymqS+qmfh6+Hb++/fXl6fz9+cfh/tPPw9fL0+n09NeX0/Pjw+vT83n+9+dhiT82yuHe7mZWZVN25VD6lr4oTZkO9ykyK4uyKpuyK4fS10zLojRlUmZlUVZlU3blUMpn8pl8Jp/JZ/KZfCafyWfymXxJvjR9OTIps7Ioq3L6SmRXDqVvmRelKZMyK4uyKuXL8mX5snxFviJfmb4amZVFWZVN2ZVD6VvWRWlK+ap8Vb4qX52+FtmVQ+lbtkVpyqTMyqKsSvna9PXIofQt+6I0ZVJm5fSNyKpsyq4cSt9yLEpTJmVWyjfkG/IN+YZ8Qz6Xz+Vz+Vw+l8/lc/lcPpfPN19eFqUpp88js7Ioq7Ipo3+XgAG4IFpkAwMSkIECVKABmA2zYU6YE+aEOfrFLKAAFWhABwbggmibDQxIAOaMOWPOmKN7LAUMwAXRQBsYkIAMFKACDcAcjWQ5wAXRShsYkIAMFCDMJaABHRiAC6KpNjAgARkoAOaGuWFumBvmjrlj7pg75o65Y+6YO+aOuWMemAfmgTl6zWpAASrQgA6EuQW4YP1KWsGABGSgABVoQAcwu8xlWQADEpCBMPeACjSgAwNwwdqDKxiQgAxgNsyG2TCvPTgCXLD24AoGJCADBahAAzqAOWHOmDPmtQc9IAMFqEADOjAAF6w9uIIBmAvmgrlgLpgL5oK5YK6YK+aKuWKumCvmirlirpgr5ujBtAQYkIAMFCBWGxbQgA4MwAXRgxsYkIAMFABzx9wxd8wd88AcPZhSQAIyUIAKNKADA3BB9OAGmB2zY3bM69owBzSgAwPwDeq6QFzBgARkoAAVCHMJ6MAAXLAuFVcwIAEZKEAFMBtmw2yYE+aEOXow1YAMFKACDejAAFwQPbiBAZgz5ow5Y44eTC2gAwNwQfTgBgYkIAMFqADm6MHUA8I8PxxqdNwGCchAASrQgA5cPS5YO24FzA1zw9wwN8wNc8PcMDfMHXPH3DF3zGujeUADOjAAF6yNtoIBCchAATAPzAPzwDwwO2bH7Jgds2N2zI7ZZW4xn/MS0IAOzEGzBbgg5vMGBiQgAwWoAOUxRXMK4DkxM3MOaEAHYvQS4IKYmRvE6C0AYczMDcKc3t/vDuxxv7xejsfY4v6y6Z1b4ZeHy/H8erg/v51Od4e/H05v65N+vDyc13x9uMxH52U4nr/NnMLvT6dj0PvdR/Xy59IU3w5r8dwbXsvr/6jv1/p6W/28IDvqS6O+7jr/dh2/+W3j92VP/bjWu+2qL9f6dGP9ntefYzuw1s9d1J76zPhz+3Pb+Lnvqa/X+jp21du13m+rb7te/6D551ZjR/3cK6h+7hFuGn9uLfaMHyvzrT6l2+rznv6bC3Xqy67r15g/c9V82/i73v/ycf3Hnus/15eqn8vJm8afq9A941de/1ww7anvzN+55NlR35aq+rbs+vy3awPNm7V7rsC8x8wlmLeZf3kP//MpLNf3cN6H9j2Cj0XAktoeQV4+zmDcegZ/egm5/tnQr9+j3X+r/zwPHh6fLr/9mvAeosvTw9fTUYff386Pvzz6+s8Lj/BrxMvl+fH47e1yDNPHTxLzz6dW+l1r4/O8GTOPrNU763UexZbtU3W/a0uJQ4vnzgnXlv75PU7tXw==", "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_u64, 1), 0);\n assert_eq(min(0_u64, 0), 0);\n assert_eq(min(1_u64, 1), 1);\n assert_eq(min(255_u8, 0), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0_u64, 1), 1);\n assert_eq(max(0_u64, 0), 0);\n assert_eq(max(1_u64, 1), 1);\n assert_eq(max(255_u8, 0), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/nested_arrays_from_brillig/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/nested_arrays_from_brillig/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index 39b565c3b05..12203b94efc 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/nested_arrays_from_brillig/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/nested_arrays_from_brillig/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -38,11 +38,10 @@ expression: artifact "public parameters indices : []", "return value indices : []", "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 }])], outputs: [Array([Witness(6), Witness(7), Witness(8), Witness(9), Witness(10), Witness(11), Witness(12), Witness(13), Witness(14), Witness(15), Witness(16), Witness(17)])]", - "EXPR [ (1, _6) (1, _8) (1, _13) (1, _15) -10 ]", "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32854 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 6 }, 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: 6 }, Mov { destination: Relative(2), 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(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: 81 }, Mov { destination: Relative(1), source: Relative(2) }, Call { location: 92 }, Call { location: 93 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 32842 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Load { destination: Relative(4), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(6) }, Store { destination_pointer: Relative(7), source: Relative(4) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(8) }, 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(3), rhs: Relative(6) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 2 }, Mov { destination: Direct(32771), source: Relative(8) }, Mov { destination: Direct(32772), source: Relative(9) }, Mov { destination: Direct(32773), source: Relative(10) }, Call { location: 81 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(8) }, 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(3), rhs: Relative(6) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, Mov { destination: Direct(32771), source: Relative(8) }, Mov { destination: Direct(32772), source: Relative(9) }, Mov { destination: Direct(32773), source: Relative(10) }, Call { location: 81 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Load { destination: Relative(4), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(6) }, Store { destination_pointer: Relative(7), source: Relative(4) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(8) }, 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(3), rhs: Relative(6) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 2 }, Mov { destination: Direct(32771), source: Relative(8) }, Mov { destination: Direct(32772), source: Relative(9) }, Mov { destination: Direct(32773), source: Relative(10) }, Call { location: 81 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 5 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(8) }, 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(3), rhs: Relative(6) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, Mov { destination: Direct(32771), source: Relative(8) }, Mov { destination: Direct(32772), source: Relative(9) }, Mov { destination: Direct(32773), source: Relative(10) }, Call { location: 81 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 32842 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 12 }, 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: 91 }, 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: 84 }, Return, Return, Call { location: 167 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, 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(3) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(4) }, 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(6), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, 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(3) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(4) }, Load { destination: Relative(3), source_pointer: Relative(2) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 129 }, Call { location: 173 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(3) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Load { destination: Relative(7), source_pointer: Relative(8) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Load { destination: Relative(8), source_pointer: Relative(9) }, Mov { destination: Relative(3), 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(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: Relative(7) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(8) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(8), source_pointer: Relative(9) }, Mov { destination: Relative(1), 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(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(9), source: Relative(7) }, 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) }, 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(8) }, 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(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: 172 }, 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": "pZbdbuIwEIXfxde58Nge//AqFUIB0ipSFFBKVlqhvPt6yDHd1Yqqcm74GJzzxbaGOHd17o7zx6Ef3y+favd2V8epH4b+4zBcTu2tv4z517vS8pGc2lGjEq/wK4LamYy4Ij1AOgeskEADWtCBDHowgBFMKwk+go/gI/go+5yQQQ8GMIJppdEggQbMPhY6kEEPBjCCaaXVYPZ5oQEtmH1ByKAHAxjBtNJpkEADWhA+B5/LvigMYATTStYggQa0oAMZhI/hY/gYPg+fh8/D5+Hz8HnxLUujSjcdblPXSTP91V656a7t1I03tRvnYWjUr3aYHxd9XtvxwVs75VHdqG48Z2bhez908m1pvtL6ddQGg7CN9Izzz/PRlnwyNfnkkHfaVuQdl/k7XzN/F6jko67Is2Hk2bqavPUl77gmz8/7+5r7+1j2P1DN/gcTS97FV3n6RkChLICi3Sh43YHfClIRGG03CshsW0KlwNBTYDZuojGpaga2/A+N0xsFHDYu4bXgZ53s/83vc9We+um/oz/lJ7ls/iLWqW+PQydDEp7HU7kyl7ff1zJSXiOu0+XUneepE+vXu0Q+J94iNYn2csrngnxoKBgpScpgc8n7Rab1Bw==", + "debug_symbols": "ndTfaoMwFAbwd8m1FzlJTv70VUYpts2GILY4HYziuy+nfmk3xmB401+P+n2KxNzUOR/nt0M3vF7e1e7lpo5j1/fd26G/nNqpuwzl6E1p+UlO7ahRiVf8SlA7U4gr6Q7pErAiQQMtdJChhwFGmFYJfYQ+Qh+hj0qfExl6GGCEadVoSNDA0seigww9DDDCtGo1LH1eNNDC0hdEhh4GGGFadRoSNNBC9Dn0udIXxQAjTKusIUEDLXSQIfoYfYw+Rp9Hn0efR59Hn0efl75laVRdTYdpzFkW07flVRbdtR3zMKndMPd9oz7afr5f9H5th7tTO5azulF5OBdL4WvXZ/m3NM+0/jtqg0HYRnrE+f/5aGs+mS355JB32m7IO67P7/yW53eBaj7qDXk2jDxbtyVvfc073pLnx/39lvv7WN9/oJ/vf1+m9tSNvza8tEjd2LXHPssxSc3DqV5SxunzWs/UXfM6Xk75PI9Z6p5bZ/ksXiI1ifayqZWBfGgoGBlJxmDLyPtFnucL", "file_map": { "50": { "source": "struct Header {\n params: [Field; 3],\n}\n\nstruct MyNote {\n plain: Field,\n array: [Field; 2],\n header: Header,\n}\n\nfn access_nested(notes: [MyNote; 2]) -> Field {\n notes[0].array[1] + notes[1].array[0] + notes[0].plain + notes[1].header.params[0]\n}\n\nunconstrained fn create_inside_brillig(values: [Field; 6]) -> [MyNote; 2] {\n let header = Header { params: [values[0], values[1], values[2]] };\n let note0 = MyNote { array: [values[0], values[1]], plain: values[2], header };\n let note1 = MyNote { array: [values[3], values[4]], plain: values[5], header };\n [note0, note1]\n}\n\nfn main(values: [Field; 6]) {\n // Safety: testing context\n let notes = unsafe { create_inside_brillig(values) };\n assert(access_nested(notes) == (2 + 4 + 3 + 1));\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/nested_arrays_from_brillig/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/nested_arrays_from_brillig/execute__tests__force_brillig_false_inliner_0.snap index 39b565c3b05..12203b94efc 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/nested_arrays_from_brillig/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/nested_arrays_from_brillig/execute__tests__force_brillig_false_inliner_0.snap @@ -38,11 +38,10 @@ expression: artifact "public parameters indices : []", "return value indices : []", "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 }])], outputs: [Array([Witness(6), Witness(7), Witness(8), Witness(9), Witness(10), Witness(11), Witness(12), Witness(13), Witness(14), Witness(15), Witness(16), Witness(17)])]", - "EXPR [ (1, _6) (1, _8) (1, _13) (1, _15) -10 ]", "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32854 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 6 }, 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: 6 }, Mov { destination: Relative(2), 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(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: 81 }, Mov { destination: Relative(1), source: Relative(2) }, Call { location: 92 }, Call { location: 93 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 32842 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Load { destination: Relative(4), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(6) }, Store { destination_pointer: Relative(7), source: Relative(4) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(8) }, 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(3), rhs: Relative(6) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 2 }, Mov { destination: Direct(32771), source: Relative(8) }, Mov { destination: Direct(32772), source: Relative(9) }, Mov { destination: Direct(32773), source: Relative(10) }, Call { location: 81 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(8) }, 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(3), rhs: Relative(6) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, Mov { destination: Direct(32771), source: Relative(8) }, Mov { destination: Direct(32772), source: Relative(9) }, Mov { destination: Direct(32773), source: Relative(10) }, Call { location: 81 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Load { destination: Relative(4), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(6) }, Store { destination_pointer: Relative(7), source: Relative(4) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(8) }, 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(3), rhs: Relative(6) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 2 }, Mov { destination: Direct(32771), source: Relative(8) }, Mov { destination: Direct(32772), source: Relative(9) }, Mov { destination: Direct(32773), source: Relative(10) }, Call { location: 81 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 5 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(8) }, 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(3), rhs: Relative(6) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, Mov { destination: Direct(32771), source: Relative(8) }, Mov { destination: Direct(32772), source: Relative(9) }, Mov { destination: Direct(32773), source: Relative(10) }, Call { location: 81 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 32842 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 12 }, 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: 91 }, 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: 84 }, Return, Return, Call { location: 167 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, 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(3) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(4) }, 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(6), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, 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(3) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(4) }, Load { destination: Relative(3), source_pointer: Relative(2) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 129 }, Call { location: 173 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(3) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Load { destination: Relative(7), source_pointer: Relative(8) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Load { destination: Relative(8), source_pointer: Relative(9) }, Mov { destination: Relative(3), 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(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: Relative(7) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(8) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(8), source_pointer: Relative(9) }, Mov { destination: Relative(1), 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(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(9), source: Relative(7) }, 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) }, 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(8) }, 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(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: 172 }, 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": "pZbdbuIwEIXfxde58Nge//AqFUIB0ipSFFBKVlqhvPt6yDHd1Yqqcm74GJzzxbaGOHd17o7zx6Ef3y+favd2V8epH4b+4zBcTu2tv4z517vS8pGc2lGjEq/wK4LamYy4Ij1AOgeskEADWtCBDHowgBFMKwk+go/gI/go+5yQQQ8GMIJppdEggQbMPhY6kEEPBjCCaaXVYPZ5oQEtmH1ByKAHAxjBtNJpkEADWhA+B5/LvigMYATTStYggQa0oAMZhI/hY/gYPg+fh8/D5+Hz8HnxLUujSjcdblPXSTP91V656a7t1I03tRvnYWjUr3aYHxd9XtvxwVs75VHdqG48Z2bhez908m1pvtL6ddQGg7CN9Izzz/PRlnwyNfnkkHfaVuQdl/k7XzN/F6jko67Is2Hk2bqavPUl77gmz8/7+5r7+1j2P1DN/gcTS97FV3n6RkChLICi3Sh43YHfClIRGG03CshsW0KlwNBTYDZuojGpaga2/A+N0xsFHDYu4bXgZ53s/83vc9We+um/oz/lJ7ls/iLWqW+PQydDEp7HU7kyl7ff1zJSXiOu0+XUneepE+vXu0Q+J94iNYn2csrngnxoKBgpScpgc8n7Rab1Bw==", + "debug_symbols": "ndTfaoMwFAbwd8m1FzlJTv70VUYpts2GILY4HYziuy+nfmk3xmB401+P+n2KxNzUOR/nt0M3vF7e1e7lpo5j1/fd26G/nNqpuwzl6E1p+UlO7ahRiVf8SlA7U4gr6Q7pErAiQQMtdJChhwFGmFYJfYQ+Qh+hj0qfExl6GGCEadVoSNDA0seigww9DDDCtGo1LH1eNNDC0hdEhh4GGGFadRoSNNBC9Dn0udIXxQAjTKusIUEDLXSQIfoYfYw+Rp9Hn0efR59Hn0efl75laVRdTYdpzFkW07flVRbdtR3zMKndMPd9oz7afr5f9H5th7tTO5azulF5OBdL4WvXZ/m3NM+0/jtqg0HYRnrE+f/5aGs+mS355JB32m7IO67P7/yW53eBaj7qDXk2jDxbtyVvfc073pLnx/39lvv7WN9/oJ/vf1+m9tSNvza8tEjd2LXHPssxSc3DqV5SxunzWs/UXfM6Xk75PI9Z6p5bZ/ksXiI1ifayqZWBfGgoGBlJxmDLyPtFnucL", "file_map": { "50": { "source": "struct Header {\n params: [Field; 3],\n}\n\nstruct MyNote {\n plain: Field,\n array: [Field; 2],\n header: Header,\n}\n\nfn access_nested(notes: [MyNote; 2]) -> Field {\n notes[0].array[1] + notes[1].array[0] + notes[0].plain + notes[1].header.params[0]\n}\n\nunconstrained fn create_inside_brillig(values: [Field; 6]) -> [MyNote; 2] {\n let header = Header { params: [values[0], values[1], values[2]] };\n let note0 = MyNote { array: [values[0], values[1]], plain: values[2], header };\n let note1 = MyNote { array: [values[3], values[4]], plain: values[5], header };\n [note0, note1]\n}\n\nfn main(values: [Field; 6]) {\n // Safety: testing context\n let notes = unsafe { create_inside_brillig(values) };\n assert(access_nested(notes) == (2 + 4 + 3 + 1));\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/nested_arrays_from_brillig/execute__tests__force_brillig_false_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/nested_arrays_from_brillig/execute__tests__force_brillig_false_inliner_9223372036854775807.snap index 39b565c3b05..12203b94efc 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/nested_arrays_from_brillig/execute__tests__force_brillig_false_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/nested_arrays_from_brillig/execute__tests__force_brillig_false_inliner_9223372036854775807.snap @@ -38,11 +38,10 @@ expression: artifact "public parameters indices : []", "return value indices : []", "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 }])], outputs: [Array([Witness(6), Witness(7), Witness(8), Witness(9), Witness(10), Witness(11), Witness(12), Witness(13), Witness(14), Witness(15), Witness(16), Witness(17)])]", - "EXPR [ (1, _6) (1, _8) (1, _13) (1, _15) -10 ]", "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32854 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 6 }, 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: 6 }, Mov { destination: Relative(2), 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(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: 81 }, Mov { destination: Relative(1), source: Relative(2) }, Call { location: 92 }, Call { location: 93 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 32842 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Load { destination: Relative(4), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(6) }, Store { destination_pointer: Relative(7), source: Relative(4) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(8) }, 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(3), rhs: Relative(6) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 2 }, Mov { destination: Direct(32771), source: Relative(8) }, Mov { destination: Direct(32772), source: Relative(9) }, Mov { destination: Direct(32773), source: Relative(10) }, Call { location: 81 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(8) }, 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(3), rhs: Relative(6) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, Mov { destination: Direct(32771), source: Relative(8) }, Mov { destination: Direct(32772), source: Relative(9) }, Mov { destination: Direct(32773), source: Relative(10) }, Call { location: 81 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Load { destination: Relative(4), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(6) }, Store { destination_pointer: Relative(7), source: Relative(4) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(8) }, 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(3), rhs: Relative(6) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 2 }, Mov { destination: Direct(32771), source: Relative(8) }, Mov { destination: Direct(32772), source: Relative(9) }, Mov { destination: Direct(32773), source: Relative(10) }, Call { location: 81 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 5 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(8) }, 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(3), rhs: Relative(6) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, Mov { destination: Direct(32771), source: Relative(8) }, Mov { destination: Direct(32772), source: Relative(9) }, Mov { destination: Direct(32773), source: Relative(10) }, Call { location: 81 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 32842 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 12 }, 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: 91 }, 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: 84 }, Return, Return, Call { location: 167 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, 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(3) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(4) }, 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(6), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, 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(3) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(4) }, Load { destination: Relative(3), source_pointer: Relative(2) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 129 }, Call { location: 173 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(3) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Load { destination: Relative(7), source_pointer: Relative(8) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Load { destination: Relative(8), source_pointer: Relative(9) }, Mov { destination: Relative(3), 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(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: Relative(7) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(8) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(8), source_pointer: Relative(9) }, Mov { destination: Relative(1), 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(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(9), source: Relative(7) }, 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) }, 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(8) }, 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(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: 172 }, 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": "pZbdbuIwEIXfxde58Nge//AqFUIB0ipSFFBKVlqhvPt6yDHd1Yqqcm74GJzzxbaGOHd17o7zx6Ef3y+favd2V8epH4b+4zBcTu2tv4z517vS8pGc2lGjEq/wK4LamYy4Ij1AOgeskEADWtCBDHowgBFMKwk+go/gI/go+5yQQQ8GMIJppdEggQbMPhY6kEEPBjCCaaXVYPZ5oQEtmH1ByKAHAxjBtNJpkEADWhA+B5/LvigMYATTStYggQa0oAMZhI/hY/gYPg+fh8/D5+Hz8HnxLUujSjcdblPXSTP91V656a7t1I03tRvnYWjUr3aYHxd9XtvxwVs75VHdqG48Z2bhez908m1pvtL6ddQGg7CN9Izzz/PRlnwyNfnkkHfaVuQdl/k7XzN/F6jko67Is2Hk2bqavPUl77gmz8/7+5r7+1j2P1DN/gcTS97FV3n6RkChLICi3Sh43YHfClIRGG03CshsW0KlwNBTYDZuojGpaga2/A+N0xsFHDYu4bXgZ53s/83vc9We+um/oz/lJ7ls/iLWqW+PQydDEp7HU7kyl7ff1zJSXiOu0+XUneepE+vXu0Q+J94iNYn2csrngnxoKBgpScpgc8n7Rab1Bw==", + "debug_symbols": "ndTfaoMwFAbwd8m1FzlJTv70VUYpts2GILY4HYziuy+nfmk3xmB401+P+n2KxNzUOR/nt0M3vF7e1e7lpo5j1/fd26G/nNqpuwzl6E1p+UlO7ahRiVf8SlA7U4gr6Q7pErAiQQMtdJChhwFGmFYJfYQ+Qh+hj0qfExl6GGCEadVoSNDA0seigww9DDDCtGo1LH1eNNDC0hdEhh4GGGFadRoSNNBC9Dn0udIXxQAjTKusIUEDLXSQIfoYfYw+Rp9Hn0efR59Hn0efl75laVRdTYdpzFkW07flVRbdtR3zMKndMPd9oz7afr5f9H5th7tTO5azulF5OBdL4WvXZ/m3NM+0/jtqg0HYRnrE+f/5aGs+mS355JB32m7IO67P7/yW53eBaj7qDXk2jDxbtyVvfc073pLnx/39lvv7WN9/oJ/vf1+m9tSNvza8tEjd2LXHPssxSc3DqV5SxunzWs/UXfM6Xk75PI9Z6p5bZ/ksXiI1ifayqZWBfGgoGBlJxmDLyPtFnucL", "file_map": { "50": { "source": "struct Header {\n params: [Field; 3],\n}\n\nstruct MyNote {\n plain: Field,\n array: [Field; 2],\n header: Header,\n}\n\nfn access_nested(notes: [MyNote; 2]) -> Field {\n notes[0].array[1] + notes[1].array[0] + notes[0].plain + notes[1].header.params[0]\n}\n\nunconstrained fn create_inside_brillig(values: [Field; 6]) -> [MyNote; 2] {\n let header = Header { params: [values[0], values[1], values[2]] };\n let note0 = MyNote { array: [values[0], values[1]], plain: values[2], header };\n let note1 = MyNote { array: [values[3], values[4]], plain: values[5], header };\n [note0, note1]\n}\n\nfn main(values: [Field; 6]) {\n // Safety: testing context\n let notes = unsafe { create_inside_brillig(values) };\n assert(access_nested(notes) == (2 + 4 + 3 + 1));\n}\n", 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 2070d66afdb..e223de5c083 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 @@ -60,7 +60,7 @@ expression: artifact }, "bytecode": [ "func 0", - "current witness index : _21", + "current witness index : _9", "private parameters indices : [_0, _1, _2, _3, _4, _5]", "public parameters indices : []", "return value indices : []", @@ -68,28 +68,11 @@ expression: artifact "EXPR [ (1, _0) (-1, _6) (-340282366920938463463374607431768211456, _7) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1))], q_c: 0 })], outputs: [Simple(Witness(8)), Simple(Witness(9))]", "EXPR [ (1, _1) (-1, _8) (-340282366920938463463374607431768211456, _9) 0 ]", - "BLACKBOX::MULTI_SCALAR_MUL [(3728882899078719075161482178784387565366481897740339799480980287259621149274, 254), (-9903063709032878667290627648209915537972247634463802596148419711785767431332, 254), (0, 1), (2393473289045184898987089634332637236754766663897650125720167164137088869378, 254), (-7135402912423807765050323395026152633898511180575289670895350565966806597339, 254), (0, 1), (_6, 254), (_7, 254), (_8, 254), (_9, 254)] [_10, _11, _12]", - "EXPR [ (-1, _3) (1, _10) 0 ]", - "EXPR [ (-1, _4) (1, _11) 0 ]", - "BLACKBOX::MULTI_SCALAR_MUL [(3728882899078719075161482178784387565366481897740339799480980287259621149274, 254), (-9903063709032878667290627648209915537972247634463802596148419711785767431332, 254), (0, 1), (2393473289045184898987089634332637236754766663897650125720167164137088869378, 254), (-7135402912423807765050323395026152633898511180575289670895350565966806597339, 254), (0, 1), (-1094708040843609169356775910874053498301840173462935739639689208799068762676, 254), (-718703907181967287621274717949248537252263842169639534402461291799004475262, 254), (0, 1), (_6, 254), (_7, 254), (_8, 254), (_9, 254), (2, 254), (0, 254)] [_13, _14, _15]", - "EXPR [ (-1, _5) (1, _13) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(3)), (1, Witness(5))], q_c: 0 })], outputs: [Simple(Witness(16))]", - "EXPR [ (-1, _3, _16) (1, _5, _16) -1 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(8, Witness(0)), (1, Witness(1)), (1, Witness(2))], q_c: 0 })], outputs: [Simple(Witness(17)), Simple(Witness(18))]", - "EXPR [ (8, _0) (1, _1) (1, _2) (-1, _17) (-340282366920938463463374607431768211456, _18) 0 ]", - "BLACKBOX::MULTI_SCALAR_MUL [(3728882899078719075161482178784387565366481897740339799480980287259621149274, 254), (-9903063709032878667290627648209915537972247634463802596148419711785767431332, 254), (0, 1), (_17, 254), (_18, 254)] [_19, _20, _21]", - "EXPR [ (-1, _19) 849707701676507062560416368841861616551813265068666159965855698002224802634 ]", "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]", - "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) } }]" + "[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": "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==", + "debug_symbols": "pZPBjoMgEED/hTMHGAHBX2mahlrakBA0VDfZNP77Dl1pazZ6cC+MI/MeDMk8yMWdx9vJx2t3J83hQc7Jh+Bvp9C1dvBdxL8PwvLCFWmAEl7/Bk2aCoMhjaAEsEJMEyUFOw3JuUx9eNDe2+TiQJo4hkDJlw3js+je2/iMg024yyhx8YIRhVcfXP6a6Jtm66hmMMMa1Avn9YLn67wSYuaVrPbwmhde6118ab5mq+dv9M9f/XPxfj65fD+5wSteGuBKyvcNzMKgNgzG6NkADFYN9bpBcGZmg+AS9higKl0IUGaXAeR/DbxeMxwxs61Pf6YMX45jCV4enkmVkykfkrw9B5frsmmMbcEwHb77slPGt09d6y5jcvmIjxnG9QCCgjlO+Ro/", "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", - "path": "std/embedded_curve_ops.nr" - }, "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" @@ -107,7 +90,6 @@ expression: artifact "main" ], "brillig_names": [ - "decompose_hint", - "directive_invert" + "decompose_hint" ] } 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 2070d66afdb..e223de5c083 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 @@ -60,7 +60,7 @@ expression: artifact }, "bytecode": [ "func 0", - "current witness index : _21", + "current witness index : _9", "private parameters indices : [_0, _1, _2, _3, _4, _5]", "public parameters indices : []", "return value indices : []", @@ -68,28 +68,11 @@ expression: artifact "EXPR [ (1, _0) (-1, _6) (-340282366920938463463374607431768211456, _7) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1))], q_c: 0 })], outputs: [Simple(Witness(8)), Simple(Witness(9))]", "EXPR [ (1, _1) (-1, _8) (-340282366920938463463374607431768211456, _9) 0 ]", - "BLACKBOX::MULTI_SCALAR_MUL [(3728882899078719075161482178784387565366481897740339799480980287259621149274, 254), (-9903063709032878667290627648209915537972247634463802596148419711785767431332, 254), (0, 1), (2393473289045184898987089634332637236754766663897650125720167164137088869378, 254), (-7135402912423807765050323395026152633898511180575289670895350565966806597339, 254), (0, 1), (_6, 254), (_7, 254), (_8, 254), (_9, 254)] [_10, _11, _12]", - "EXPR [ (-1, _3) (1, _10) 0 ]", - "EXPR [ (-1, _4) (1, _11) 0 ]", - "BLACKBOX::MULTI_SCALAR_MUL [(3728882899078719075161482178784387565366481897740339799480980287259621149274, 254), (-9903063709032878667290627648209915537972247634463802596148419711785767431332, 254), (0, 1), (2393473289045184898987089634332637236754766663897650125720167164137088869378, 254), (-7135402912423807765050323395026152633898511180575289670895350565966806597339, 254), (0, 1), (-1094708040843609169356775910874053498301840173462935739639689208799068762676, 254), (-718703907181967287621274717949248537252263842169639534402461291799004475262, 254), (0, 1), (_6, 254), (_7, 254), (_8, 254), (_9, 254), (2, 254), (0, 254)] [_13, _14, _15]", - "EXPR [ (-1, _5) (1, _13) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(3)), (1, Witness(5))], q_c: 0 })], outputs: [Simple(Witness(16))]", - "EXPR [ (-1, _3, _16) (1, _5, _16) -1 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(8, Witness(0)), (1, Witness(1)), (1, Witness(2))], q_c: 0 })], outputs: [Simple(Witness(17)), Simple(Witness(18))]", - "EXPR [ (8, _0) (1, _1) (1, _2) (-1, _17) (-340282366920938463463374607431768211456, _18) 0 ]", - "BLACKBOX::MULTI_SCALAR_MUL [(3728882899078719075161482178784387565366481897740339799480980287259621149274, 254), (-9903063709032878667290627648209915537972247634463802596148419711785767431332, 254), (0, 1), (_17, 254), (_18, 254)] [_19, _20, _21]", - "EXPR [ (-1, _19) 849707701676507062560416368841861616551813265068666159965855698002224802634 ]", "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]", - "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) } }]" + "[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": "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==", + "debug_symbols": "pZPBjoMgEED/hTMHGAHBX2mahlrakBA0VDfZNP77Dl1pazZ6cC+MI/MeDMk8yMWdx9vJx2t3J83hQc7Jh+Bvp9C1dvBdxL8PwvLCFWmAEl7/Bk2aCoMhjaAEsEJMEyUFOw3JuUx9eNDe2+TiQJo4hkDJlw3js+je2/iMg024yyhx8YIRhVcfXP6a6Jtm66hmMMMa1Avn9YLn67wSYuaVrPbwmhde6118ab5mq+dv9M9f/XPxfj65fD+5wSteGuBKyvcNzMKgNgzG6NkADFYN9bpBcGZmg+AS9higKl0IUGaXAeR/DbxeMxwxs61Pf6YMX45jCV4enkmVkykfkrw9B5frsmmMbcEwHb77slPGt09d6y5jcvmIjxnG9QCCgjlO+Ro/", "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", - "path": "std/embedded_curve_ops.nr" - }, "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" @@ -107,7 +90,6 @@ expression: artifact "main" ], "brillig_names": [ - "decompose_hint", - "directive_invert" + "decompose_hint" ] } 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 2070d66afdb..e223de5c083 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 @@ -60,7 +60,7 @@ expression: artifact }, "bytecode": [ "func 0", - "current witness index : _21", + "current witness index : _9", "private parameters indices : [_0, _1, _2, _3, _4, _5]", "public parameters indices : []", "return value indices : []", @@ -68,28 +68,11 @@ expression: artifact "EXPR [ (1, _0) (-1, _6) (-340282366920938463463374607431768211456, _7) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1))], q_c: 0 })], outputs: [Simple(Witness(8)), Simple(Witness(9))]", "EXPR [ (1, _1) (-1, _8) (-340282366920938463463374607431768211456, _9) 0 ]", - "BLACKBOX::MULTI_SCALAR_MUL [(3728882899078719075161482178784387565366481897740339799480980287259621149274, 254), (-9903063709032878667290627648209915537972247634463802596148419711785767431332, 254), (0, 1), (2393473289045184898987089634332637236754766663897650125720167164137088869378, 254), (-7135402912423807765050323395026152633898511180575289670895350565966806597339, 254), (0, 1), (_6, 254), (_7, 254), (_8, 254), (_9, 254)] [_10, _11, _12]", - "EXPR [ (-1, _3) (1, _10) 0 ]", - "EXPR [ (-1, _4) (1, _11) 0 ]", - "BLACKBOX::MULTI_SCALAR_MUL [(3728882899078719075161482178784387565366481897740339799480980287259621149274, 254), (-9903063709032878667290627648209915537972247634463802596148419711785767431332, 254), (0, 1), (2393473289045184898987089634332637236754766663897650125720167164137088869378, 254), (-7135402912423807765050323395026152633898511180575289670895350565966806597339, 254), (0, 1), (-1094708040843609169356775910874053498301840173462935739639689208799068762676, 254), (-718703907181967287621274717949248537252263842169639534402461291799004475262, 254), (0, 1), (_6, 254), (_7, 254), (_8, 254), (_9, 254), (2, 254), (0, 254)] [_13, _14, _15]", - "EXPR [ (-1, _5) (1, _13) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(3)), (1, Witness(5))], q_c: 0 })], outputs: [Simple(Witness(16))]", - "EXPR [ (-1, _3, _16) (1, _5, _16) -1 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(8, Witness(0)), (1, Witness(1)), (1, Witness(2))], q_c: 0 })], outputs: [Simple(Witness(17)), Simple(Witness(18))]", - "EXPR [ (8, _0) (1, _1) (1, _2) (-1, _17) (-340282366920938463463374607431768211456, _18) 0 ]", - "BLACKBOX::MULTI_SCALAR_MUL [(3728882899078719075161482178784387565366481897740339799480980287259621149274, 254), (-9903063709032878667290627648209915537972247634463802596148419711785767431332, 254), (0, 1), (_17, 254), (_18, 254)] [_19, _20, _21]", - "EXPR [ (-1, _19) 849707701676507062560416368841861616551813265068666159965855698002224802634 ]", "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]", - "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) } }]" + "[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": "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==", + "debug_symbols": "pZPBjoMgEED/hTMHGAHBX2mahlrakBA0VDfZNP77Dl1pazZ6cC+MI/MeDMk8yMWdx9vJx2t3J83hQc7Jh+Bvp9C1dvBdxL8PwvLCFWmAEl7/Bk2aCoMhjaAEsEJMEyUFOw3JuUx9eNDe2+TiQJo4hkDJlw3js+je2/iMg024yyhx8YIRhVcfXP6a6Jtm66hmMMMa1Avn9YLn67wSYuaVrPbwmhde6118ab5mq+dv9M9f/XPxfj65fD+5wSteGuBKyvcNzMKgNgzG6NkADFYN9bpBcGZmg+AS9higKl0IUGaXAeR/DbxeMxwxs61Pf6YMX45jCV4enkmVkykfkrw9B5frsmmMbcEwHb77slPGt09d6y5jcvmIjxnG9QCCgjlO+Ro/", "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", - "path": "std/embedded_curve_ops.nr" - }, "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" @@ -107,7 +90,6 @@ expression: artifact "main" ], "brillig_names": [ - "decompose_hint", - "directive_invert" + "decompose_hint" ] } 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 724903a01e8..c7e92af3e0c 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 @@ -60,7 +60,7 @@ expression: artifact }, "bytecode": [ "func 0", - "current witness index : _11", + "current witness index : _8", "private parameters indices : [_0, _1, _2, _3, _4]", "public parameters indices : []", "return value indices : []", @@ -69,18 +69,11 @@ expression: artifact "EXPR [ (1, _0) (-1, _5) (-340282366920938463463374607431768211456, _6) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1))], q_c: 0 })], outputs: [Simple(Witness(7)), Simple(Witness(8))]", "EXPR [ (1, _1) (-1, _7) (-340282366920938463463374607431768211456, _8) 0 ]", - "BLACKBOX::MULTI_SCALAR_MUL [(3728882899078719075161482178784387565366481897740339799480980287259621149274, 254), (-9903063709032878667290627648209915537972247634463802596148419711785767431332, 254), (0, 1), (2393473289045184898987089634332637236754766663897650125720167164137088869378, 254), (-7135402912423807765050323395026152633898511180575289670895350565966806597339, 254), (0, 1), (_5, 254), (_6, 254), (_7, 254), (_8, 254)] [_9, _10, _11]", - "EXPR [ (-1, _2) (1, _9) 0 ]", - "EXPR [ (-1, _3) (1, _10) 0 ]", "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": "pZTLroMgEIbfhTULZrgIvkrTNLaljQlRQ/UkJ43vfsCKrQtM49k4jvB/cwHnSa72PNxPdXNrH6Q8PMnZ187V95NrL1Vft034+iQsPkCREimB4mU0KXkwhpSCEgw7xDhSkmSn3lsbVR+cQO8qb5uelM3gHCU/lRumTY+uaibbVz6sMkpscw02AG+1s/FtpG81y0s1w1msUS1yKFZ6yOuVELNeSb5HryHptd6lT8UXLBt/o36QKT5os+jlun9yQ69gASgp3xmYFUFtEIzRMwEZZglFniCAmZkgQOIeAvJUhUBldhFQ/pcAxReEzU5qlc7CmD1ngUym64yAkCMAzyO45KkRXBqxJwnAYklC8WwSG7dShMipl0q8xwKonQieQ7DNZqYyPlKQX48mlEsbDK70x+BVl9qvhy6EGRYma0gx3GU+OeLlyJg2JSr+5JQUUytjXF9XZ2ejOOKH5pJYwe1/u7SSRnzn24u9Dt7GuB9zPjwPKCia4xhz+wM=", + "debug_symbols": "pZPBjoMgEED/Zc4cAAHBX2mahlrakBA0VDfZNP77Dl1p60EP9sI4Mu8NGOcBF3cebycfr90dmsMDzsmH4G+n0LV28F3Etw+geWEKGk6A1f9BQ1NhMNAIAhwrxDQRKNhpSM5l6sOD9t4mFwdo4hgCgR8bxmfRvbfxGQebcJcScPGCEYVXH1x+msibpuuopnyGNVcvnNULnq3zSoiZV7Law2tWeK138eXyNV3tv3F/Jkt/ps2Ll8vvJzd4xV4CJeX7BGZhUBsGY/Rs4JSvGup1g2DUzAbBJN9j4FW5heDK7DJw+a2B1WuGI2a29Wk5ZQx/WhwlLMHDV89E5GTKTZK35+ByXTaNsS0YpsNvX3bK+Papa91lTC63+JhhXA9cEG6OUz7GHw==", "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", - "path": "std/embedded_curve_ops.nr" - }, "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" 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 724903a01e8..c7e92af3e0c 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 @@ -60,7 +60,7 @@ expression: artifact }, "bytecode": [ "func 0", - "current witness index : _11", + "current witness index : _8", "private parameters indices : [_0, _1, _2, _3, _4]", "public parameters indices : []", "return value indices : []", @@ -69,18 +69,11 @@ expression: artifact "EXPR [ (1, _0) (-1, _5) (-340282366920938463463374607431768211456, _6) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1))], q_c: 0 })], outputs: [Simple(Witness(7)), Simple(Witness(8))]", "EXPR [ (1, _1) (-1, _7) (-340282366920938463463374607431768211456, _8) 0 ]", - "BLACKBOX::MULTI_SCALAR_MUL [(3728882899078719075161482178784387565366481897740339799480980287259621149274, 254), (-9903063709032878667290627648209915537972247634463802596148419711785767431332, 254), (0, 1), (2393473289045184898987089634332637236754766663897650125720167164137088869378, 254), (-7135402912423807765050323395026152633898511180575289670895350565966806597339, 254), (0, 1), (_5, 254), (_6, 254), (_7, 254), (_8, 254)] [_9, _10, _11]", - "EXPR [ (-1, _2) (1, _9) 0 ]", - "EXPR [ (-1, _3) (1, _10) 0 ]", "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": "pZTLroMgEIbfhTULZrgIvkrTNLaljQlRQ/UkJ43vfsCKrQtM49k4jvB/cwHnSa72PNxPdXNrH6Q8PMnZ187V95NrL1Vft034+iQsPkCREimB4mU0KXkwhpSCEgw7xDhSkmSn3lsbVR+cQO8qb5uelM3gHCU/lRumTY+uaibbVz6sMkpscw02AG+1s/FtpG81y0s1w1msUS1yKFZ6yOuVELNeSb5HryHptd6lT8UXLBt/o36QKT5os+jlun9yQ69gASgp3xmYFUFtEIzRMwEZZglFniCAmZkgQOIeAvJUhUBldhFQ/pcAxReEzU5qlc7CmD1ngUym64yAkCMAzyO45KkRXBqxJwnAYklC8WwSG7dShMipl0q8xwKonQieQ7DNZqYyPlKQX48mlEsbDK70x+BVl9qvhy6EGRYma0gx3GU+OeLlyJg2JSr+5JQUUytjXF9XZ2ejOOKH5pJYwe1/u7SSRnzn24u9Dt7GuB9zPjwPKCia4xhz+wM=", + "debug_symbols": "pZPBjoMgEED/Zc4cAAHBX2mahlrakBA0VDfZNP77Dl1p60EP9sI4Mu8NGOcBF3cebycfr90dmsMDzsmH4G+n0LV28F3Etw+geWEKGk6A1f9BQ1NhMNAIAhwrxDQRKNhpSM5l6sOD9t4mFwdo4hgCgR8bxmfRvbfxGQebcJcScPGCEYVXH1x+msibpuuopnyGNVcvnNULnq3zSoiZV7Law2tWeK138eXyNV3tv3F/Jkt/ps2Ll8vvJzd4xV4CJeX7BGZhUBsGY/Rs4JSvGup1g2DUzAbBJN9j4FW5heDK7DJw+a2B1WuGI2a29Wk5ZQx/WhwlLMHDV89E5GTKTZK35+ByXTaNsS0YpsNvX3bK+Papa91lTC63+JhhXA9cEG6OUz7GHw==", "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", - "path": "std/embedded_curve_ops.nr" - }, "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" 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 724903a01e8..c7e92af3e0c 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 @@ -60,7 +60,7 @@ expression: artifact }, "bytecode": [ "func 0", - "current witness index : _11", + "current witness index : _8", "private parameters indices : [_0, _1, _2, _3, _4]", "public parameters indices : []", "return value indices : []", @@ -69,18 +69,11 @@ expression: artifact "EXPR [ (1, _0) (-1, _5) (-340282366920938463463374607431768211456, _6) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1))], q_c: 0 })], outputs: [Simple(Witness(7)), Simple(Witness(8))]", "EXPR [ (1, _1) (-1, _7) (-340282366920938463463374607431768211456, _8) 0 ]", - "BLACKBOX::MULTI_SCALAR_MUL [(3728882899078719075161482178784387565366481897740339799480980287259621149274, 254), (-9903063709032878667290627648209915537972247634463802596148419711785767431332, 254), (0, 1), (2393473289045184898987089634332637236754766663897650125720167164137088869378, 254), (-7135402912423807765050323395026152633898511180575289670895350565966806597339, 254), (0, 1), (_5, 254), (_6, 254), (_7, 254), (_8, 254)] [_9, _10, _11]", - "EXPR [ (-1, _2) (1, _9) 0 ]", - "EXPR [ (-1, _3) (1, _10) 0 ]", "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": "pZTLroMgEIbfhTULZrgIvkrTNLaljQlRQ/UkJ43vfsCKrQtM49k4jvB/cwHnSa72PNxPdXNrH6Q8PMnZ187V95NrL1Vft034+iQsPkCREimB4mU0KXkwhpSCEgw7xDhSkmSn3lsbVR+cQO8qb5uelM3gHCU/lRumTY+uaibbVz6sMkpscw02AG+1s/FtpG81y0s1w1msUS1yKFZ6yOuVELNeSb5HryHptd6lT8UXLBt/o36QKT5os+jlun9yQ69gASgp3xmYFUFtEIzRMwEZZglFniCAmZkgQOIeAvJUhUBldhFQ/pcAxReEzU5qlc7CmD1ngUym64yAkCMAzyO45KkRXBqxJwnAYklC8WwSG7dShMipl0q8xwKonQieQ7DNZqYyPlKQX48mlEsbDK70x+BVl9qvhy6EGRYma0gx3GU+OeLlyJg2JSr+5JQUUytjXF9XZ2ejOOKH5pJYwe1/u7SSRnzn24u9Dt7GuB9zPjwPKCia4xhz+wM=", + "debug_symbols": "pZPBjoMgEED/Zc4cAAHBX2mahlrakBA0VDfZNP77Dl1p60EP9sI4Mu8NGOcBF3cebycfr90dmsMDzsmH4G+n0LV28F3Etw+geWEKGk6A1f9BQ1NhMNAIAhwrxDQRKNhpSM5l6sOD9t4mFwdo4hgCgR8bxmfRvbfxGQebcJcScPGCEYVXH1x+msibpuuopnyGNVcvnNULnq3zSoiZV7Law2tWeK138eXyNV3tv3F/Jkt/ps2Ll8vvJzd4xV4CJeX7BGZhUBsGY/Rs4JSvGup1g2DUzAbBJN9j4FW5heDK7DJw+a2B1WuGI2a29Wk5ZQx/WhwlLMHDV89E5GTKTZK35+ByXTaNsS0YpsNvX3bK+Papa91lTC63+JhhXA9cEG6OUz7GHw==", "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", - "path": "std/embedded_curve_ops.nr" - }, "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" diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_5045/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_5045/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index 3ab64605154..899a3f7b19f 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_5045/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_5045/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -20,39 +20,16 @@ expression: artifact }, "bytecode": [ "func 0", - "current witness index : _12", + "current witness index : _0", "private parameters indices : [_0]", "public parameters indices : []", "return value indices : []", - "BLACKBOX::RANGE [(_0, 1)] []", - "EXPR [ (-1, _0) (-1, _1) 1 ]", - "EXPR [ (-17631683881184975370165255887551781615748388533673675138855, _0) (-1, _2) 17631683881184975370165255887551781615748388533673675138860 ]", - "EXPR [ (-1, _3) 0 ]", - "BLACKBOX::EMBEDDED_CURVE_ADD [(_1, 254), (_2, 254), (_3, 1), (_1, 254), (_2, 254), (_3, 1)] [_4, _5, _6]", - "BLACKBOX::MULTI_SCALAR_MUL [(-8519034168028805793603472410045416908800114122389094750979358290384607299995, 254), (2726875754519434671146873023426441956600113087238248464305840046775215989920, 254), (_1, 1), (0, 254), (5, 254), (_1, 1), (1, 254), (0, 254), (1, 254), (0, 254)] [_7, _8, _9]", - "EXPR [ (-1, _4) (1, _7) (-1, _10) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(10))], q_c: 0 })], outputs: [Simple(Witness(11))]", - "EXPR [ (1, _10, _11) (1, _12) -1 ]", - "EXPR [ (1, _10, _12) 0 ]", - "EXPR [ (1, _0, _12) 0 ]", - "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) } }]" + "BLACKBOX::RANGE [(_0, 1)] []" ], - "debug_symbols": "rVTLboQgFP0X1i54q/MrTWNQcUJC0DDapDH+e68odlxg2slsOMDlHO6Dy4xaXU/3yriuf6Dbx4xqb6w198r2jRpN72B3XjIUl9XotYYt9GQH1qC8diO6ucnaDH0pO4VDj0G5gKPyYMUZ0q4FBMHOWL3OluyXjdNULulO5jk96OLMJ2m+pGTnS0EOPpEnPk3zCyyiAwUu85QCSysQQnG+S8Bc8Fe8YDiGUTBOUwriDV78QyOZjYt6Sn7UgyfrefUeSnrUU6b45QVflDw+KMlxKoI/K7BXcpCzGEPBTjF8wko1xp+6EBE4mCEaRhZGHkYBl8I1EgCSkm9QbFBuQPCKy+qLN6q2em/rbnLNU5eP30O0xH9g8H2j28nr1ZdgA+9+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", - "path": "std/embedded_curve_ops.nr" - }, - "50": { - "source": "use std::embedded_curve_ops::EmbeddedCurvePoint;\nuse std::embedded_curve_ops::EmbeddedCurveScalar;\n\nfn main(is_active: bool) {\n let a = EmbeddedCurvePoint {\n x: 0x1d8eb4378a3bde41e0b6a9a8dcbd21b7ff9c51bdd6ca13ce989abbbf90df3666,\n y: 0x06075b63354f2504f9cddba0b94ed0cef35fc88615e69ec1f853b51eb79a24a0,\n is_infinite: false,\n };\n\n if is_active {\n let bad = EmbeddedCurvePoint { x: 0, y: 5, is_infinite: false };\n let d = bad.double();\n let e = std::embedded_curve_ops::multi_scalar_mul(\n [a, bad],\n [EmbeddedCurveScalar { lo: 1, hi: 0 }, EmbeddedCurveScalar { lo: 1, hi: 0 }],\n );\n assert(e.x != d.x);\n }\n}\n", - "path": "" - } - }, + "debug_symbols": "XY5BCsQwCEXv4rqLWfcqw1BsaosgJtikMITefWyYQOlK/3/6tcJCc9km1jXuML4rzMYivE0SA2aO6m49B+hyykbkFty4byU00gyjFpEBDpTShvaE2mpGc/oagHTx6oErC13d+XGBge158UBjnIX+ci0abjR/Uyf942Qx0FKMrqTGPPsH", + "file_map": {}, "names": [ "main" ], - "brillig_names": [ - "directive_invert" - ] + "brillig_names": [] } diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_5045/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_5045/execute__tests__force_brillig_false_inliner_0.snap index 3ab64605154..899a3f7b19f 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_5045/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_5045/execute__tests__force_brillig_false_inliner_0.snap @@ -20,39 +20,16 @@ expression: artifact }, "bytecode": [ "func 0", - "current witness index : _12", + "current witness index : _0", "private parameters indices : [_0]", "public parameters indices : []", "return value indices : []", - "BLACKBOX::RANGE [(_0, 1)] []", - "EXPR [ (-1, _0) (-1, _1) 1 ]", - "EXPR [ (-17631683881184975370165255887551781615748388533673675138855, _0) (-1, _2) 17631683881184975370165255887551781615748388533673675138860 ]", - "EXPR [ (-1, _3) 0 ]", - "BLACKBOX::EMBEDDED_CURVE_ADD [(_1, 254), (_2, 254), (_3, 1), (_1, 254), (_2, 254), (_3, 1)] [_4, _5, _6]", - "BLACKBOX::MULTI_SCALAR_MUL [(-8519034168028805793603472410045416908800114122389094750979358290384607299995, 254), (2726875754519434671146873023426441956600113087238248464305840046775215989920, 254), (_1, 1), (0, 254), (5, 254), (_1, 1), (1, 254), (0, 254), (1, 254), (0, 254)] [_7, _8, _9]", - "EXPR [ (-1, _4) (1, _7) (-1, _10) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(10))], q_c: 0 })], outputs: [Simple(Witness(11))]", - "EXPR [ (1, _10, _11) (1, _12) -1 ]", - "EXPR [ (1, _10, _12) 0 ]", - "EXPR [ (1, _0, _12) 0 ]", - "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) } }]" + "BLACKBOX::RANGE [(_0, 1)] []" ], - "debug_symbols": "rVTLboQgFP0X1i54q/MrTWNQcUJC0DDapDH+e68odlxg2slsOMDlHO6Dy4xaXU/3yriuf6Dbx4xqb6w198r2jRpN72B3XjIUl9XotYYt9GQH1qC8diO6ucnaDH0pO4VDj0G5gKPyYMUZ0q4FBMHOWL3OluyXjdNULulO5jk96OLMJ2m+pGTnS0EOPpEnPk3zCyyiAwUu85QCSysQQnG+S8Bc8Fe8YDiGUTBOUwriDV78QyOZjYt6Sn7UgyfrefUeSnrUU6b45QVflDw+KMlxKoI/K7BXcpCzGEPBTjF8wko1xp+6EBE4mCEaRhZGHkYBl8I1EgCSkm9QbFBuQPCKy+qLN6q2em/rbnLNU5eP30O0xH9g8H2j28nr1ZdgA+9+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", - "path": "std/embedded_curve_ops.nr" - }, - "50": { - "source": "use std::embedded_curve_ops::EmbeddedCurvePoint;\nuse std::embedded_curve_ops::EmbeddedCurveScalar;\n\nfn main(is_active: bool) {\n let a = EmbeddedCurvePoint {\n x: 0x1d8eb4378a3bde41e0b6a9a8dcbd21b7ff9c51bdd6ca13ce989abbbf90df3666,\n y: 0x06075b63354f2504f9cddba0b94ed0cef35fc88615e69ec1f853b51eb79a24a0,\n is_infinite: false,\n };\n\n if is_active {\n let bad = EmbeddedCurvePoint { x: 0, y: 5, is_infinite: false };\n let d = bad.double();\n let e = std::embedded_curve_ops::multi_scalar_mul(\n [a, bad],\n [EmbeddedCurveScalar { lo: 1, hi: 0 }, EmbeddedCurveScalar { lo: 1, hi: 0 }],\n );\n assert(e.x != d.x);\n }\n}\n", - "path": "" - } - }, + "debug_symbols": "XY5BCsQwCEXv4rqLWfcqw1BsaosgJtikMITefWyYQOlK/3/6tcJCc9km1jXuML4rzMYivE0SA2aO6m49B+hyykbkFty4byU00gyjFpEBDpTShvaE2mpGc/oagHTx6oErC13d+XGBge158UBjnIX+ci0abjR/Uyf942Qx0FKMrqTGPPsH", + "file_map": {}, "names": [ "main" ], - "brillig_names": [ - "directive_invert" - ] + "brillig_names": [] } diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_5045/execute__tests__force_brillig_false_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_5045/execute__tests__force_brillig_false_inliner_9223372036854775807.snap index 3ab64605154..899a3f7b19f 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_5045/execute__tests__force_brillig_false_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_5045/execute__tests__force_brillig_false_inliner_9223372036854775807.snap @@ -20,39 +20,16 @@ expression: artifact }, "bytecode": [ "func 0", - "current witness index : _12", + "current witness index : _0", "private parameters indices : [_0]", "public parameters indices : []", "return value indices : []", - "BLACKBOX::RANGE [(_0, 1)] []", - "EXPR [ (-1, _0) (-1, _1) 1 ]", - "EXPR [ (-17631683881184975370165255887551781615748388533673675138855, _0) (-1, _2) 17631683881184975370165255887551781615748388533673675138860 ]", - "EXPR [ (-1, _3) 0 ]", - "BLACKBOX::EMBEDDED_CURVE_ADD [(_1, 254), (_2, 254), (_3, 1), (_1, 254), (_2, 254), (_3, 1)] [_4, _5, _6]", - "BLACKBOX::MULTI_SCALAR_MUL [(-8519034168028805793603472410045416908800114122389094750979358290384607299995, 254), (2726875754519434671146873023426441956600113087238248464305840046775215989920, 254), (_1, 1), (0, 254), (5, 254), (_1, 1), (1, 254), (0, 254), (1, 254), (0, 254)] [_7, _8, _9]", - "EXPR [ (-1, _4) (1, _7) (-1, _10) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(10))], q_c: 0 })], outputs: [Simple(Witness(11))]", - "EXPR [ (1, _10, _11) (1, _12) -1 ]", - "EXPR [ (1, _10, _12) 0 ]", - "EXPR [ (1, _0, _12) 0 ]", - "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) } }]" + "BLACKBOX::RANGE [(_0, 1)] []" ], - "debug_symbols": "rVTLboQgFP0X1i54q/MrTWNQcUJC0DDapDH+e68odlxg2slsOMDlHO6Dy4xaXU/3yriuf6Dbx4xqb6w198r2jRpN72B3XjIUl9XotYYt9GQH1qC8diO6ucnaDH0pO4VDj0G5gKPyYMUZ0q4FBMHOWL3OluyXjdNULulO5jk96OLMJ2m+pGTnS0EOPpEnPk3zCyyiAwUu85QCSysQQnG+S8Bc8Fe8YDiGUTBOUwriDV78QyOZjYt6Sn7UgyfrefUeSnrUU6b45QVflDw+KMlxKoI/K7BXcpCzGEPBTjF8wko1xp+6EBE4mCEaRhZGHkYBl8I1EgCSkm9QbFBuQPCKy+qLN6q2em/rbnLNU5eP30O0xH9g8H2j28nr1ZdgA+9+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", - "path": "std/embedded_curve_ops.nr" - }, - "50": { - "source": "use std::embedded_curve_ops::EmbeddedCurvePoint;\nuse std::embedded_curve_ops::EmbeddedCurveScalar;\n\nfn main(is_active: bool) {\n let a = EmbeddedCurvePoint {\n x: 0x1d8eb4378a3bde41e0b6a9a8dcbd21b7ff9c51bdd6ca13ce989abbbf90df3666,\n y: 0x06075b63354f2504f9cddba0b94ed0cef35fc88615e69ec1f853b51eb79a24a0,\n is_infinite: false,\n };\n\n if is_active {\n let bad = EmbeddedCurvePoint { x: 0, y: 5, is_infinite: false };\n let d = bad.double();\n let e = std::embedded_curve_ops::multi_scalar_mul(\n [a, bad],\n [EmbeddedCurveScalar { lo: 1, hi: 0 }, EmbeddedCurveScalar { lo: 1, hi: 0 }],\n );\n assert(e.x != d.x);\n }\n}\n", - "path": "" - } - }, + "debug_symbols": "XY5BCsQwCEXv4rqLWfcqw1BsaosgJtikMITefWyYQOlK/3/6tcJCc9km1jXuML4rzMYivE0SA2aO6m49B+hyykbkFty4byU00gyjFpEBDpTShvaE2mpGc/oagHTx6oErC13d+XGBge158UBjnIX+ci0abjR/Uyf942Qx0FKMrqTGPPsH", + "file_map": {}, "names": [ "main" ], - "brillig_names": [ - "directive_invert" - ] + "brillig_names": [] } diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_5045/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_5045/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 79fbb2d5646..b1d36b3f818 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_5045/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_5045/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -31,9 +31,9 @@ expression: artifact "return value indices : []", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 })], outputs: []", "unconstrained func 0", - "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32837 }, 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) }, Cast { destination: Direct(32836), source: Direct(32836), bit_size: Integer(U1) }, Mov { destination: Relative(1), source: Direct(32836) }, Call { location: 13 }, Call { location: 15 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32837 }, 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: Integer(U32), value: 1 }, Return, Call { location: 87 }, JumpIf { condition: Relative(1), location: 18 }, Jump { location: 86 }, Const { destination: Relative(1), bit_size: Field, value: 0 }, Const { destination: Relative(2), bit_size: Field, value: 5 }, Const { destination: Relative(3), bit_size: Integer(U1), value: 0 }, 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) }, Mov { destination: Relative(12), source: Relative(1) }, Mov { destination: Relative(13), source: Relative(2) }, Mov { destination: Relative(14), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 93 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(9) }, Mov { destination: Relative(5), source: Relative(10) }, Mov { destination: Relative(6), source: Relative(11) }, Const { destination: Relative(7), bit_size: Field, value: -8519034168028805793603472410045416908800114122389094750979358290384607299995 }, Const { destination: Relative(8), bit_size: Field, value: 2726875754519434671146873023426441956600113087238248464305840046775215989920 }, Mov { destination: Relative(9), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(9), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Mov { destination: Relative(11), source: Relative(10) }, Store { destination_pointer: Relative(11), source: Relative(7) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(8) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(3) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, 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: Relative(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(3) }, Const { destination: Relative(2), bit_size: Field, value: 1 }, 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: Relative(2) }, 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(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(1) }, 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(9), rhs: Direct(2) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Const { destination: Relative(11), 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(2), size: Relative(8) }, scalars: HeapVector { pointer: Relative(10), size: Relative(11) }, outputs: HeapArray { pointer: Relative(12), size: 3 } }), BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32835) }, Load { destination: Relative(2), source_pointer: Relative(7) }, BinaryFieldOp { destination: Relative(1), op: Equals, lhs: Relative(2), rhs: Relative(4) }, BinaryIntOp { destination: Relative(2), op: Equals, bit_size: U1, lhs: Relative(1), rhs: Relative(3) }, JumpIf { condition: Relative(2), location: 85 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(4) } }, Jump { location: 86 }, 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: 92 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 87 }, JumpIf { condition: Relative(3), location: 124 }, Jump { location: 96 }, JumpIf { condition: Relative(6), location: 116 }, Jump { location: 98 }, Mov { destination: Relative(13), source: Direct(1) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 4 }, 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) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(1), input1_y: Relative(2), input1_infinite: Relative(3), input2_x: Relative(4), input2_y: Relative(5), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(14), size: 3 } }), BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(32835) }, Load { destination: Relative(1), source_pointer: Relative(2) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(2) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(2) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Mov { destination: Relative(10), source: Relative(1) }, Mov { destination: Relative(11), source: Relative(3) }, Mov { destination: Relative(12), source: Relative(4) }, Jump { location: 120 }, Mov { destination: Relative(10), source: Relative(1) }, Mov { destination: Relative(11), source: Relative(2) }, Mov { destination: Relative(12), source: Relative(3) }, Jump { location: 120 }, Mov { destination: Relative(7), source: Relative(10) }, Mov { destination: Relative(8), source: Relative(11) }, Mov { destination: Relative(9), source: Relative(12) }, Jump { location: 128 }, Mov { destination: Relative(7), source: Relative(4) }, Mov { destination: Relative(8), source: Relative(5) }, Mov { destination: Relative(9), source: Relative(6) }, Jump { location: 128 }, Mov { destination: Relative(1), source: Relative(7) }, Mov { destination: Relative(2), source: Relative(8) }, Mov { destination: Relative(3), source: Relative(9) }, Return]" + "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32837 }, 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) }, Cast { destination: Direct(32836), source: Direct(32836), bit_size: Integer(U1) }, Mov { destination: Relative(1), source: Direct(32836) }, Call { location: 13 }, Call { location: 14 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32837 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, Return, Call { location: 87 }, JumpIf { condition: Relative(1), location: 17 }, Jump { location: 86 }, Const { destination: Relative(1), bit_size: Field, value: 0 }, Const { destination: Relative(2), bit_size: Field, value: 5 }, Const { destination: Relative(3), bit_size: Integer(U1), value: 0 }, 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) }, Mov { destination: Relative(12), source: Relative(1) }, Mov { destination: Relative(13), source: Relative(2) }, Mov { destination: Relative(14), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 93 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(9) }, Mov { destination: Relative(5), source: Relative(10) }, Mov { destination: Relative(6), source: Relative(11) }, Const { destination: Relative(7), bit_size: Field, value: -8519034168028805793603472410045416908800114122389094750979358290384607299995 }, Const { destination: Relative(8), bit_size: Field, value: 2726875754519434671146873023426441956600113087238248464305840046775215989920 }, Mov { destination: Relative(9), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(9), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Mov { destination: Relative(11), source: Relative(10) }, Store { destination_pointer: Relative(11), source: Relative(7) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(8) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(3) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, 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: Relative(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(3) }, Const { destination: Relative(2), bit_size: Field, value: 1 }, 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: Relative(2) }, 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(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(1) }, 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(9), rhs: Direct(2) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Const { destination: Relative(11), 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(2), size: Relative(8) }, scalars: HeapVector { pointer: Relative(10), size: Relative(11) }, outputs: HeapArray { pointer: Relative(12), size: 3 } }), Const { destination: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(8) }, BinaryFieldOp { destination: Relative(1), op: Equals, lhs: Relative(7), rhs: Relative(4) }, BinaryIntOp { destination: Relative(2), op: Equals, bit_size: U1, lhs: Relative(1), rhs: Relative(3) }, JumpIf { condition: Relative(2), location: 85 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(4) } }, Jump { location: 86 }, 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: 92 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 87 }, JumpIf { condition: Relative(3), location: 106 }, Jump { location: 96 }, JumpIf { condition: Relative(6), location: 98 }, Jump { location: 98 }, Mov { destination: Relative(4), source: Relative(1) }, Mov { destination: Relative(5), source: Relative(2) }, Mov { destination: Relative(6), source: Relative(3) }, Jump { location: 102 }, Mov { destination: Relative(7), source: Relative(4) }, Mov { destination: Relative(8), source: Relative(5) }, Mov { destination: Relative(9), source: Relative(6) }, Jump { location: 110 }, Mov { destination: Relative(7), source: Relative(4) }, Mov { destination: Relative(8), source: Relative(5) }, Mov { destination: Relative(9), source: Relative(6) }, Jump { location: 110 }, Mov { destination: Relative(1), source: Relative(7) }, Mov { destination: Relative(2), source: Relative(8) }, Mov { destination: Relative(3), source: Relative(9) }, Return]" ], - "debug_symbols": "rdTfaoMwFMfxd8m1F/l7YvoqYxTbpkMQW5wORvHdd5Jf0rUXjjF200+sPV9rEG/iFA/L274fz5d3sXu5icPUD0P/th8ux27uLyN/exMyfahW7HQjVMhoCRTQwAALHCDgASoaFYOKQcWgYlAxqBiuKIaABy0IGSuBAhoYYAEqFhWLikXFouJQcag4VBwqjiuGcYCABy0IGZJAAQ0MQIVQIVQIFeKKY0LGS6CABgZY4AABD7hCTMi0XPGMAhoYYDOBBwITMkrKoirqoimm3ZRp4eqC6sLXRVsXoSyUrIu0t3JdG1Efr/08xZierofnjZ/CazfFcRa7cRmGRnx0w5J/9H7txuzcTXyWk3E8sRw890NMq7X5npbbo5Z0GbZe38fd87zanietyjw5dZ9X9Nvrk73P283r//T/g75fn7bm7Q/zLti6AWTl1h38umD+sgfe1HtozR/2gKQNNSDD5j202wWltPQlwWtn/6HhnxqvfNQd++npfbqm2tR3hyGWw/MyHh/Ozp/Xeqa+j6/T5RhPyxRT6eGlzJ8vrW+Cfl3T1b4A", + "debug_symbols": "ndTNjoIwFIbhe+maBf07bb2ViTGo1ZA0QCpMMjHc+xz4hNEFxsyGR8TzVn7CXZzjcbge6ubS3sTu6y6OuU6pvh5Se6r6um3427sop410YqcKIT0IM6oEEiiggQEWEEBFoaJQ0ahoVDQqGhXNFclYQMABD8KMKYEECmiAikHFoGJQMagYVCwqFhWLiuWKZgywgIADHoQZKoEECqBCqBAqhApxxTIehBlXAgkU0MAACwhwhRgPwoznimMkUEADrrhxLMRyvw99jnG63U8PAD8WXZVj04tdM6RUiO8qDfOPbl3VzPZV5qNlIWJzZjl4qVOcPo3F33S5PWpIPYaNU+u4fZ2X2/Ok5GOerFznJX26Ppl13myu/+7/B7WuT1vz5s28DWa5AGTKrTP4uKD/cw2cXs7B65dz2PNedarzy2thnEq5ro4pPnYvQ3N6Otr/dMuR5bXS5fYUz0OOU+np3cLbL++KoPbjtNov", "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", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_5045/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_5045/execute__tests__force_brillig_true_inliner_0.snap index a90e724aafd..ac92837fa72 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_5045/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_5045/execute__tests__force_brillig_true_inliner_0.snap @@ -31,19 +31,10 @@ expression: artifact "return value indices : []", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 })], outputs: []", "unconstrained func 0", - "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32837 }, 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) }, Cast { destination: Direct(32836), source: Direct(32836), bit_size: Integer(U1) }, Mov { destination: Relative(1), source: Direct(32836) }, Call { location: 13 }, Call { location: 14 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32837 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, Return, Call { location: 81 }, JumpIf { condition: Relative(1), location: 17 }, Jump { location: 80 }, Const { destination: Relative(1), bit_size: Field, value: 0 }, Const { destination: Relative(2), bit_size: Field, value: 5 }, Const { destination: Relative(3), bit_size: Integer(U1), value: 0 }, 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) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(1), input1_y: Relative(2), input1_infinite: Relative(3), input2_x: Relative(1), input2_y: Relative(2), input2_infinite: Relative(3), result: HeapArray { pointer: Relative(5), size: 3 } }), Const { destination: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(5) }, Load { destination: Relative(6), source_pointer: Relative(7) }, Const { destination: Relative(4), bit_size: Field, value: -8519034168028805793603472410045416908800114122389094750979358290384607299995 }, Const { destination: Relative(7), bit_size: Field, value: 2726875754519434671146873023426441956600113087238248464305840046775215989920 }, 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: Relative(4) }, 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(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) }, 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) }, Const { destination: Relative(2), bit_size: Field, value: 1 }, Mov { destination: Relative(4), 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(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(9), source: Relative(7) }, 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(2) }, 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) }, 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(8), rhs: Direct(2) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(2), size: Relative(7) }, scalars: HeapVector { pointer: Relative(9), size: Relative(10) }, outputs: HeapArray { pointer: Relative(11), size: 3 } }), BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(5) }, Load { destination: Relative(2), source_pointer: Relative(4) }, BinaryFieldOp { destination: Relative(1), op: Equals, lhs: Relative(2), rhs: Relative(6) }, BinaryIntOp { destination: Relative(2), op: Equals, bit_size: U1, lhs: Relative(1), rhs: Relative(3) }, JumpIf { condition: Relative(2), location: 79 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(4) } }, Jump { location: 80 }, 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: 86 }, 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(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32837 }, 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) }, Cast { destination: Direct(32836), source: Direct(32836), bit_size: Integer(U1) }, Mov { destination: Relative(1), source: Direct(32836) }, Call { location: 13 }, Call { location: 14 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32837 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, Return, Call { location: 18 }, JumpIf { condition: Relative(1), location: 18 }, Jump { location: 17 }, 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: 23 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "rdTNaoNAFIbhe5m1i/k5c0ZzKyUEk0yCIEaMFkrw3nv0UxsXSind+GjMecUZ8KWu8dzdT0V1ezzV4eOlzk1RlsX9VD4ueVs8Kvn1pfRwMEEdKFEmBdmI1cAACxwg4AGrgxcCSIFUTKKcBgZY4AABDxgEkAJUCBVChVAhVAgVQoVQIVRIKixkI14DAyxwgIAHDAJAxaPCqDAqLJVUcICABwwCSEE2EjQwQCqZ4MDwRlr0kzwZJoe10X2fqHkrT20T47CTb3srO17nTaxadai6skzUZ15245+edV6Ntnkjd6UYq6sowVtRxuGsT36m9fYosZ2GKdhl3K/nzfY8WzPNszfLvOHVvN2Z15TNAZ3prYLbLhhjdZgScu7pHxphq7GzkkzLStDmSu7tRGaXleSt+bAz7zOat5JpcyV/XXB/WYPg5ndI3eodjnKVX4pm9e3qh1JT5OcyTpe3rrq83W2/6vnO/O2rm8clXrsmDqW3D6AcP1KTpHzsh6d9Aw==", - "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", - "path": "std/embedded_curve_ops.nr" - }, - "50": { - "source": "use std::embedded_curve_ops::EmbeddedCurvePoint;\nuse std::embedded_curve_ops::EmbeddedCurveScalar;\n\nfn main(is_active: bool) {\n let a = EmbeddedCurvePoint {\n x: 0x1d8eb4378a3bde41e0b6a9a8dcbd21b7ff9c51bdd6ca13ce989abbbf90df3666,\n y: 0x06075b63354f2504f9cddba0b94ed0cef35fc88615e69ec1f853b51eb79a24a0,\n is_infinite: false,\n };\n\n if is_active {\n let bad = EmbeddedCurvePoint { x: 0, y: 5, is_infinite: false };\n let d = bad.double();\n let e = std::embedded_curve_ops::multi_scalar_mul(\n [a, bad],\n [EmbeddedCurveScalar { lo: 1, hi: 0 }, EmbeddedCurveScalar { lo: 1, hi: 0 }],\n );\n assert(e.x != d.x);\n }\n}\n", - "path": "" - } - }, + "debug_symbols": "XY7BCoMwDIbfJece5nYZvoqIxBqlENISW2GI775UJsguSf58Sf7sMNFYliHIHFdoux1GDcxhGTh6zCGKdffDwSWHrETWghu3rYRKkqGVwuxgQy7n0JpQzpxRjT4ckEyW7eAcmGp19CbQB/133FADjkw/ORfxN5o/6SLXx0mjp6ko1UuVwaOGxmLXvN3z1R/V7Qs=", + "file_map": {}, "names": [ "main" ], diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_5045/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_5045/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index a90e724aafd..ac92837fa72 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_5045/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_5045/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -31,19 +31,10 @@ expression: artifact "return value indices : []", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 })], outputs: []", "unconstrained func 0", - "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32837 }, 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) }, Cast { destination: Direct(32836), source: Direct(32836), bit_size: Integer(U1) }, Mov { destination: Relative(1), source: Direct(32836) }, Call { location: 13 }, Call { location: 14 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32837 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, Return, Call { location: 81 }, JumpIf { condition: Relative(1), location: 17 }, Jump { location: 80 }, Const { destination: Relative(1), bit_size: Field, value: 0 }, Const { destination: Relative(2), bit_size: Field, value: 5 }, Const { destination: Relative(3), bit_size: Integer(U1), value: 0 }, 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) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(1), input1_y: Relative(2), input1_infinite: Relative(3), input2_x: Relative(1), input2_y: Relative(2), input2_infinite: Relative(3), result: HeapArray { pointer: Relative(5), size: 3 } }), Const { destination: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(5) }, Load { destination: Relative(6), source_pointer: Relative(7) }, Const { destination: Relative(4), bit_size: Field, value: -8519034168028805793603472410045416908800114122389094750979358290384607299995 }, Const { destination: Relative(7), bit_size: Field, value: 2726875754519434671146873023426441956600113087238248464305840046775215989920 }, 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: Relative(4) }, 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(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) }, 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) }, Const { destination: Relative(2), bit_size: Field, value: 1 }, Mov { destination: Relative(4), 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(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(9), source: Relative(7) }, 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(2) }, 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) }, 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(8), rhs: Direct(2) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(2), size: Relative(7) }, scalars: HeapVector { pointer: Relative(9), size: Relative(10) }, outputs: HeapArray { pointer: Relative(11), size: 3 } }), BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(5) }, Load { destination: Relative(2), source_pointer: Relative(4) }, BinaryFieldOp { destination: Relative(1), op: Equals, lhs: Relative(2), rhs: Relative(6) }, BinaryIntOp { destination: Relative(2), op: Equals, bit_size: U1, lhs: Relative(1), rhs: Relative(3) }, JumpIf { condition: Relative(2), location: 79 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(4) } }, Jump { location: 80 }, 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: 86 }, 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(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32837 }, 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) }, Cast { destination: Direct(32836), source: Direct(32836), bit_size: Integer(U1) }, Mov { destination: Relative(1), source: Direct(32836) }, Call { location: 13 }, Call { location: 14 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32837 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, Return, Call { location: 18 }, JumpIf { condition: Relative(1), location: 18 }, Jump { location: 17 }, 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: 23 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "rdTNaoNAFIbhe5m1i/k5c0ZzKyUEk0yCIEaMFkrw3nv0UxsXSind+GjMecUZ8KWu8dzdT0V1ezzV4eOlzk1RlsX9VD4ueVs8Kvn1pfRwMEEdKFEmBdmI1cAACxwg4AGrgxcCSIFUTKKcBgZY4AABDxgEkAJUCBVChVAhVAgVQoVQIVRIKixkI14DAyxwgIAHDAJAxaPCqDAqLJVUcICABwwCSEE2EjQwQCqZ4MDwRlr0kzwZJoe10X2fqHkrT20T47CTb3srO17nTaxadai6skzUZ15245+edV6Ntnkjd6UYq6sowVtRxuGsT36m9fYosZ2GKdhl3K/nzfY8WzPNszfLvOHVvN2Z15TNAZ3prYLbLhhjdZgScu7pHxphq7GzkkzLStDmSu7tRGaXleSt+bAz7zOat5JpcyV/XXB/WYPg5ndI3eodjnKVX4pm9e3qh1JT5OcyTpe3rrq83W2/6vnO/O2rm8clXrsmDqW3D6AcP1KTpHzsh6d9Aw==", - "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", - "path": "std/embedded_curve_ops.nr" - }, - "50": { - "source": "use std::embedded_curve_ops::EmbeddedCurvePoint;\nuse std::embedded_curve_ops::EmbeddedCurveScalar;\n\nfn main(is_active: bool) {\n let a = EmbeddedCurvePoint {\n x: 0x1d8eb4378a3bde41e0b6a9a8dcbd21b7ff9c51bdd6ca13ce989abbbf90df3666,\n y: 0x06075b63354f2504f9cddba0b94ed0cef35fc88615e69ec1f853b51eb79a24a0,\n is_infinite: false,\n };\n\n if is_active {\n let bad = EmbeddedCurvePoint { x: 0, y: 5, is_infinite: false };\n let d = bad.double();\n let e = std::embedded_curve_ops::multi_scalar_mul(\n [a, bad],\n [EmbeddedCurveScalar { lo: 1, hi: 0 }, EmbeddedCurveScalar { lo: 1, hi: 0 }],\n );\n assert(e.x != d.x);\n }\n}\n", - "path": "" - } - }, + "debug_symbols": "XY7BCoMwDIbfJece5nYZvoqIxBqlENISW2GI775UJsguSf58Sf7sMNFYliHIHFdoux1GDcxhGTh6zCGKdffDwSWHrETWghu3rYRKkqGVwuxgQy7n0JpQzpxRjT4ckEyW7eAcmGp19CbQB/133FADjkw/ORfxN5o/6SLXx0mjp6ko1UuVwaOGxmLXvN3z1R/V7Qs=", + "file_map": {}, "names": [ "main" ], diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_3/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_3/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index 683a321de87..a0a1c8fba3f 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_3/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_3/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -9,10 +9,6 @@ expression: artifact "parameters": [], "return_type": null, "error_types": { - "2920182694213909827": { - "error_kind": "string", - "string": "attempt to subtract with overflow" - }, "5019202896831570965": { "error_kind": "string", "string": "attempt to add with overflow" @@ -25,10 +21,6 @@ expression: artifact "error_kind": "string", "string": "array ref-count underflow detected" }, - "14225679739041873922": { - "error_kind": "string", - "string": "Index out of bounds" - }, "17843811134343075018": { "error_kind": "string", "string": "Stack too deep" @@ -43,9 +35,9 @@ expression: artifact "return value indices : []", "BRILLIG CALL func 0: inputs: [], outputs: []", "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(1), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32842), size_address: Relative(1), offset_address: Relative(2) }, Call { location: 11 }, 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: Integer(U1), value: 0 }, Const { destination: Direct(32836), bit_size: Integer(U32), value: 0 }, Const { destination: Direct(32837), bit_size: Field, value: 0 }, Const { destination: Direct(32838), bit_size: Integer(U1), value: 1 }, 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: 4 }, Return, Call { location: 107 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 113 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(9) }, Mov { destination: Relative(2), source: Relative(10) }, Mov { destination: Relative(3), source: Relative(11) }, Mov { destination: Relative(4), source: Relative(12) }, Mov { destination: Relative(5), source: Relative(13) }, Mov { destination: Relative(6), source: Relative(14) }, 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) }, 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) }, 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) }, 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) }, 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: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Relative(7) }, Mov { destination: Relative(10), source: Relative(1) }, Mov { destination: Relative(11), source: Relative(2) }, Mov { destination: Relative(12), source: Relative(3) }, Mov { destination: Relative(13), source: Relative(4) }, Mov { destination: Relative(14), source: Relative(5) }, Mov { destination: Relative(15), source: Direct(32841) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 155 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(6), source_pointer: Relative(3) }, 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: 68 }, Call { location: 186 }, 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(8), bit_size: Integer(U32), value: 8 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Load { destination: Relative(10), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Direct(32841) }, JumpIf { condition: Relative(6), location: 77 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(11) } }, 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(1) }, Mov { destination: Relative(13), source: Relative(2) }, Mov { destination: Relative(14), source: Relative(3) }, 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(6) }, Call { location: 189 }, 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(1) }, Mov { destination: Relative(13), source: Relative(2) }, Mov { destination: Relative(14), source: Relative(3) }, 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(6) }, Call { location: 239 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(1), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, Load { destination: Relative(2), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(1), op: Equals, bit_size: U32, lhs: Relative(2), rhs: Direct(32841) }, JumpIf { condition: Relative(1), location: 106 }, 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: 112 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 107 }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 5 }, 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(32837) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(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(32837) }, 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) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 9 }, 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(32837) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32836) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32837) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32836) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32837) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32836) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32837) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32836) }, Mov { destination: Relative(4), source: Relative(2) }, Mov { destination: Relative(2), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(32837) }, Mov { destination: Relative(6), source: Direct(32839) }, Mov { destination: Relative(3), source: Direct(32836) }, Mov { destination: Relative(5), source: Direct(32836) }, Return, Call { location: 107 }, Mov { destination: Relative(8), source: Direct(32836) }, Jump { location: 158 }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, JumpIf { condition: Relative(9), location: 162 }, Jump { location: 161 }, Return, 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) }, 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: 310 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(9), 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(4) }, Mov { destination: Relative(13), source: Relative(5) }, Mov { destination: Relative(14), source: Direct(32837) }, Mov { destination: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 329 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32839) }, Mov { destination: Relative(8), source: Relative(9) }, Jump { location: 158 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 107 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 6 }, 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(32837) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, 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(32837) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, 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(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: Relative(8) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(7), source: Direct(32836) }, Jump { location: 211 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Relative(8) }, JumpIf { condition: Relative(10), location: 226 }, Jump { location: 214 }, Load { destination: Relative(7), source_pointer: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(3) }, Load { destination: Relative(9), source_pointer: Relative(4) }, Load { destination: Relative(10), source_pointer: Relative(5) }, Load { destination: Relative(11), source_pointer: Relative(6) }, Store { destination_pointer: Relative(1), source: Direct(32837) }, Store { destination_pointer: Relative(2), source: Relative(7) }, Store { destination_pointer: Relative(3), source: Relative(8) }, Store { destination_pointer: Relative(4), source: Relative(9) }, Store { destination_pointer: Relative(5), source: Relative(10) }, Store { destination_pointer: Relative(6), source: Relative(11) }, Return, Cast { destination: Relative(10), source: Relative(7), bit_size: Field }, Load { destination: Relative(11), source_pointer: Relative(9) }, Mov { destination: Direct(32771), source: Relative(11) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 6 }, Call { location: 358 }, 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(7) }, Store { destination_pointer: Relative(14), source: Relative(10) }, Store { destination_pointer: Relative(9), source: Relative(12) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32839) }, Mov { destination: Relative(7), source: Relative(10) }, Jump { location: 211 }, Call { location: 107 }, Load { destination: Relative(7), source_pointer: Relative(2) }, Load { destination: Relative(2), source_pointer: Relative(3) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(7) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(4) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 249 }, Call { location: 186 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(4) }, Load { destination: Relative(4), 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(4) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 257 }, Call { location: 186 }, 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(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(2) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 380 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(13) }, Mov { destination: Relative(10), source: Relative(14) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 16 }, Mov { destination: Relative(16), source: Direct(0) }, Mov { destination: Relative(17), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(15) }, Call { location: 453 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(2), source: Relative(17) }, Mov { destination: Relative(7), source: Relative(18) }, Mov { destination: Relative(11), source: Relative(19) }, Mov { destination: Relative(12), source: Relative(20) }, Mov { destination: Relative(13), source: Relative(21) }, Mov { destination: Relative(14), source: Relative(22) }, 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: 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(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(12) }, 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(13) }, 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(14) }, Const { destination: Relative(14), 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(2) }, Mov { destination: Relative(18), source: Relative(7) }, Mov { destination: Relative(19), source: Relative(11) }, Mov { destination: Relative(20), source: Relative(12) }, Mov { destination: Relative(21), source: Relative(13) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(14) }, Call { location: 498 }, Mov { destination: Direct(0), source: Relative(0) }, Return, Call { location: 107 }, Load { destination: Relative(7), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32839) }, BinaryIntOp { destination: Relative(9), op: LessThanEquals, bit_size: U32, lhs: Relative(7), rhs: Relative(8) }, JumpIf { condition: Relative(9), location: 316 }, Call { location: 576 }, Load { destination: Relative(9), source_pointer: Relative(1) }, Load { destination: Relative(10), source_pointer: Relative(2) }, Load { destination: Relative(11), source_pointer: Relative(3) }, Load { destination: Relative(12), source_pointer: Relative(4) }, Load { destination: Relative(13), source_pointer: Relative(5) }, Store { destination_pointer: Relative(1), source: Relative(9) }, Store { destination_pointer: Relative(2), source: Relative(10) }, Store { destination_pointer: Relative(3), source: Relative(11) }, Store { destination_pointer: Relative(4), source: Relative(12) }, Store { destination_pointer: Relative(5), source: Relative(13) }, Store { destination_pointer: Relative(6), source: Relative(8) }, Mov { destination: Relative(1), source: Relative(7) }, Return, Call { location: 107 }, Load { destination: Relative(5), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32841) }, JumpIf { condition: Relative(6), location: 334 }, Call { location: 579 }, Load { destination: Relative(6), source_pointer: Relative(1) }, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Direct(32840) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 9 }, Call { location: 358 }, 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(32839) }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 9 }, Call { location: 358 }, 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(32839) }, BinaryIntOp { destination: Relative(4), op: LessThanEquals, bit_size: U32, lhs: Relative(5), rhs: Relative(3) }, JumpIf { condition: Relative(4), location: 355 }, Call { location: 576 }, Store { destination_pointer: Relative(1), source: Relative(6) }, Store { destination_pointer: Relative(2), source: Relative(3) }, 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: 362 }, Jump { location: 364 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 379 }, 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: 376 }, 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: 369 }, 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: 379 }, Return, Call { location: 107 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 5 }, 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(32837) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, 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(32837) }, 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: 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) }, 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: 406 }, Call { location: 186 }, 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(32836) }, Jump { location: 410 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32841) }, JumpIf { condition: Relative(6), location: 416 }, Jump { location: 413 }, Load { destination: Relative(1), source_pointer: Relative(5) }, Load { destination: Relative(2), source_pointer: Relative(4) }, Return, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(6), location: 419 }, Jump { location: 450 }, 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: 425 }, Call { location: 186 }, 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: Sub, bit_size: U32, lhs: Relative(2), rhs: Relative(3) }, BinaryIntOp { destination: Relative(8), op: LessThanEquals, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(8), location: 431 }, Call { location: 582 }, BinaryIntOp { destination: Relative(8), op: Sub, bit_size: U32, lhs: Relative(6), rhs: Direct(32839) }, BinaryIntOp { destination: Relative(9), op: LessThanEquals, bit_size: U32, lhs: Direct(32839), rhs: Relative(6) }, JumpIf { condition: Relative(9), location: 435 }, Call { location: 582 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Direct(32841) }, JumpIf { condition: Relative(6), location: 438 }, Call { location: 585 }, 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(6), 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(6) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(8) }, Call { location: 588 }, Mov { destination: Direct(0), source: Relative(0) }, Jump { location: 450 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, Mov { destination: Relative(3), source: Relative(6) }, Jump { location: 410 }, Call { location: 107 }, Mov { destination: Relative(2), 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(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(32837) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32837) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32837) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32837) }, 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: 473 }, Call { location: 186 }, 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(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(3) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 481 }, Call { location: 186 }, 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(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: Direct(32841) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 608 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(3), source: Relative(9) }, Mov { destination: Relative(6), source: Relative(10) }, Mov { destination: Relative(5), source: Relative(2) }, Mov { destination: Relative(1), source: Relative(2) }, Mov { destination: Relative(4), source: Relative(6) }, Mov { destination: Relative(2), source: Direct(32836) }, Mov { destination: Relative(6), source: Direct(32836) }, Return, Call { location: 107 }, Load { destination: Relative(7), source_pointer: Relative(1) }, 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: 506 }, Call { location: 186 }, 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(8), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(7) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(8) }, Call { location: 647 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(8), source_pointer: Relative(2) }, 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: 521 }, Call { location: 186 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(10) }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Direct(32841), rhs: Relative(8) }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U1, lhs: Relative(10), rhs: Direct(32835) }, JumpIf { condition: Relative(12), location: 528 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(13) } }, Load { destination: Relative(10), source_pointer: Relative(3) }, Load { destination: Relative(12), source_pointer: Relative(4) }, Load { destination: Relative(13), source_pointer: Relative(5) }, Load { destination: Relative(14), source_pointer: Relative(6) }, Store { destination_pointer: Relative(1), source: Relative(7) }, Store { destination_pointer: Relative(2), source: Relative(8) }, Store { destination_pointer: Relative(4), source: Relative(12) }, Store { destination_pointer: Relative(5), source: Relative(13) }, Store { destination_pointer: Relative(6), source: Relative(14) }, Load { destination: Relative(7), source_pointer: Relative(10) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 543 }, Call { location: 186 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(7) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(10) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 683 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(7), source_pointer: Relative(4) }, 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: 558 }, Call { location: 186 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(12) }, BinaryIntOp { destination: Relative(12), op: LessThan, bit_size: U32, lhs: Direct(32841), rhs: Relative(7) }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U1, lhs: Relative(12), rhs: Direct(32835) }, JumpIf { condition: Relative(14), location: 565 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(15) } }, Load { destination: Relative(12), source_pointer: Relative(1) }, Load { destination: Relative(14), source_pointer: Relative(2) }, Load { destination: Relative(15), source_pointer: Relative(5) }, Load { destination: Relative(16), source_pointer: Relative(6) }, Store { destination_pointer: Relative(1), source: Relative(12) }, Store { destination_pointer: Relative(2), source: Relative(14) }, Store { destination_pointer: Relative(3), source: Relative(10) }, Store { destination_pointer: Relative(4), source: Relative(7) }, Store { destination_pointer: Relative(5), source: Relative(15) }, Store { destination_pointer: Relative(6), source: Relative(16) }, 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: 5727012404371710682 }, 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, Call { location: 107 }, Load { destination: Relative(4), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32841) }, JumpIf { condition: Relative(5), location: 593 }, Call { location: 579 }, Load { destination: Relative(5), source_pointer: Relative(1) }, Mov { destination: Direct(32771), source: Relative(5) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 358 }, 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(32839) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, JumpIf { condition: Relative(5), location: 605 }, Call { location: 576 }, Store { destination_pointer: Relative(1), source: Relative(6) }, Store { destination_pointer: Relative(2), source: Relative(3) }, Return, Call { location: 107 }, 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) }, BinaryIntOp { destination: Relative(1), op: LessThan, bit_size: U32, lhs: Direct(32841), rhs: Relative(2) }, BinaryIntOp { destination: Relative(5), op: Equals, bit_size: U1, lhs: Relative(1), rhs: Direct(32835) }, JumpIf { condition: Relative(5), location: 617 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(6) } }, Mov { destination: Relative(3), source: Relative(2) }, Jump { location: 619 }, BinaryIntOp { destination: Relative(1), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32841) }, JumpIf { condition: Relative(1), location: 624 }, Jump { location: 622 }, Load { destination: Relative(1), source_pointer: Relative(4) }, Return, Load { destination: Relative(5), source_pointer: Relative(4) }, JumpIf { condition: Relative(1), location: 627 }, Call { location: 585 }, BinaryIntOp { destination: Relative(1), op: Mul, bit_size: U32, lhs: Relative(3), rhs: Direct(32840) }, Mov { destination: Direct(32771), source: Relative(5) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 9 }, Call { location: 358 }, 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(1) }, Store { destination_pointer: Relative(8), source: Direct(32837) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32839) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 9 }, Call { location: 358 }, Mov { destination: Relative(1), source: Direct(32773) }, 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(5) }, Store { destination_pointer: Relative(8), source: Direct(32836) }, Store { destination_pointer: Relative(4), source: Relative(1) }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, Mov { destination: Relative(3), source: Relative(1) }, Jump { location: 619 }, Call { location: 107 }, 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(32839) }, Jump { location: 653 }, BinaryIntOp { destination: Relative(1), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32841) }, JumpIf { condition: Relative(1), location: 657 }, Jump { location: 656 }, Return, Mov { destination: Relative(1), source: Direct(32836) }, Jump { location: 659 }, BinaryIntOp { destination: Relative(4), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, JumpIf { condition: Relative(4), location: 665 }, Jump { location: 662 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32839) }, Mov { destination: Relative(2), source: Relative(1) }, Jump { location: 653 }, Load { destination: Relative(4), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32841) }, JumpIf { condition: Relative(5), location: 669 }, Call { location: 585 }, 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) }, Mov { destination: Direct(32771), source: Relative(4) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 358 }, 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(3), source: Relative(6) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32839) }, Mov { destination: Relative(1), source: Relative(4) }, Jump { location: 659 }, Call { location: 107 }, 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(32839) }, Jump { location: 689 }, BinaryIntOp { destination: Relative(1), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32841) }, JumpIf { condition: Relative(1), location: 693 }, Jump { location: 692 }, Return, BinaryIntOp { destination: Relative(4), op: Mul, bit_size: U32, lhs: Relative(2), rhs: Direct(32840) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32839) }, Mov { destination: Relative(1), source: Direct(32836) }, Jump { location: 697 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, JumpIf { condition: Relative(6), location: 703 }, Jump { location: 700 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32839) }, Mov { destination: Relative(2), source: Relative(1) }, Jump { location: 689 }, Load { destination: Relative(6), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32841) }, JumpIf { condition: Relative(7), location: 707 }, Call { location: 585 }, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(6), 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(32839) }, 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(9) }, Load { destination: Relative(7), source_pointer: Relative(11) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 9 }, Call { location: 358 }, 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(4) }, Store { destination_pointer: Relative(11), source: Relative(8) }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 9 }, Call { location: 358 }, 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(5) }, Store { destination_pointer: Relative(10), source: Relative(7) }, Store { destination_pointer: Relative(3), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32839) }, Mov { destination: Relative(1), source: Relative(6) }, Jump { location: 697 }]" + "[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(1), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32839), size_address: Relative(1), offset_address: Relative(2) }, Call { location: 11 }, 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: Integer(U32), value: 0 }, Const { destination: Direct(32836), bit_size: Field, value: 0 }, Const { destination: Direct(32837), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(32838), bit_size: Integer(U32), value: 4 }, Return, Call { location: 67 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 73 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(9) }, Mov { destination: Relative(2), source: Relative(10) }, Mov { destination: Relative(3), source: Relative(11) }, Mov { destination: Relative(4), source: Relative(12) }, Mov { destination: Relative(5), source: Relative(13) }, Mov { destination: Relative(6), source: Relative(14) }, 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) }, 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) }, 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) }, 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) }, 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: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Relative(7) }, Mov { destination: Relative(10), source: Relative(1) }, Mov { destination: Relative(11), source: Relative(2) }, Mov { destination: Relative(12), source: Relative(3) }, Mov { destination: Relative(13), source: Relative(4) }, Mov { destination: Relative(14), source: Relative(5) }, Mov { destination: Relative(15), source: Direct(32838) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 115 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(1), source_pointer: Relative(3) }, 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: 65 }, Call { location: 146 }, 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: 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: 72 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 67 }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 5 }, 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(32836) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32836) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32836) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32836) }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 9 }, 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(32836) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32835) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32836) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32835) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32836) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32835) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32836) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32835) }, Mov { destination: Relative(6), source: Direct(32837) }, Mov { destination: Relative(4), source: Relative(2) }, Mov { destination: Relative(2), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(32836) }, Mov { destination: Relative(3), source: Direct(32835) }, Mov { destination: Relative(5), source: Direct(32835) }, Return, Call { location: 67 }, Mov { destination: Relative(8), source: Direct(32835) }, Jump { location: 118 }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, JumpIf { condition: Relative(9), location: 122 }, Jump { location: 121 }, Return, 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) }, 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: 149 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(9), 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(4) }, Mov { destination: Relative(13), source: Relative(5) }, Mov { destination: Relative(14), source: Direct(32836) }, Mov { destination: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 168 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32837) }, Mov { destination: Relative(8), source: Relative(9) }, Jump { location: 118 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 67 }, Load { destination: Relative(7), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(9), op: LessThanEquals, bit_size: U32, lhs: Relative(7), rhs: Relative(8) }, JumpIf { condition: Relative(9), location: 155 }, Call { location: 199 }, Load { destination: Relative(9), source_pointer: Relative(1) }, Load { destination: Relative(10), source_pointer: Relative(2) }, Load { destination: Relative(11), source_pointer: Relative(3) }, Load { destination: Relative(12), source_pointer: Relative(4) }, Load { destination: Relative(13), source_pointer: Relative(5) }, Store { destination_pointer: Relative(1), source: Relative(9) }, Store { destination_pointer: Relative(2), source: Relative(10) }, Store { destination_pointer: Relative(3), source: Relative(11) }, Store { destination_pointer: Relative(4), source: Relative(12) }, Store { destination_pointer: Relative(5), source: Relative(13) }, Store { destination_pointer: Relative(6), source: Relative(8) }, Mov { destination: Relative(1), source: Relative(7) }, Return, Call { location: 67 }, Load { destination: Relative(5), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32838) }, Const { destination: Relative(7), bit_size: Integer(U1), value: 1 }, JumpIf { condition: Relative(6), location: 174 }, Call { location: 202 }, Load { destination: Relative(6), source_pointer: Relative(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 9 }, Call { location: 205 }, 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(8) }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32837) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 9 }, Call { location: 205 }, 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(3) }, Store { destination_pointer: Relative(9), source: Relative(4) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(4), op: LessThanEquals, bit_size: U32, lhs: Relative(5), rhs: Relative(3) }, JumpIf { condition: Relative(4), location: 196 }, Call { location: 199 }, 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: 5019202896831570965 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 5727012404371710682 }, 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]" ], - "debug_symbols": "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", + "debug_symbols": "ndbBbuIwEMbxd8mZQzy2x56+SlVVAUIVKQoohZVWiHdfO98MdA+gKhf+E0J+LYmb5trs++3l63OYDsfv5u392mznYRyHr8/xuOvOw3Eq716btr641Ly5TeMyIkuoRRxCiEcCEhFGoBAUguKheCgeiofioXgoHoqH4qF4KAFKgBKgBCgBSoASikIlCcmILIkt4hBCPBKQiECJUCKUCIWhMBSGwlAYCkNhKKm86UsiwkhCMiJLcos4hBCPQMlQMpQMJUPJUASKQBEoAkWgCBSBIlAEikBxbat1WtJ6bdBGLWuhubqaQmldOVzrtUEbtaxN2qwVtK6gpU6rnlevrqJUG7WsTdqsFbSupaVOS9rixdK6ShzVoXwg15LWa4M2almbtFkraF0wS9Vj9Vg9Vo/VYz0uleOk1mlJ67VBW1d+Wwe2IdmQbRAd6hLD4GwgG7wNwQaTs8nZ5GxyNllMFpPr0nPLDcXbEGyINrANVXa326ax+9Pnee77env6ccMqt7FTN/fTuXmbLuO4af5042X50Pepm5aeu7nsLT+/n/alBTwMY1+n2+ZxdPv80Mit6NGRvbsD8fdCcnchpXaF4BwnFVy5wCsE8sQqlFFWCSHchUTPhPhCIHcX6PmZfCWUvx4Tygpb8y1Y7FpQcrxC4BztW3BOj2/BvwakjQYIpTXA/UqwxBXAq9P4Uba63TD/91xwq9Y8dNux183DZdr92Hv+e7I99lxxmo+7fn+Z+yo9Hi7KyzuVE0DEH/XfQ9ksaztR3XDLPtpQGz5u9Vf5Bw==", "file_map": { "6": { "source": "use crate::{cmp::Eq, convert::From, runtime::is_unconstrained, static_assert};\n\n/// A `BoundedVec` is a growable storage similar to a `Vec` except that it\n/// is bounded with a maximum possible length. Unlike `Vec`, `BoundedVec` is not implemented\n/// via slices and thus is not subject to the same restrictions slices are (notably, nested\n/// slices - and thus nested vectors as well - are disallowed).\n///\n/// Since a BoundedVec is backed by a normal array under the hood, growing the BoundedVec by\n/// pushing an additional element is also more efficient - the length only needs to be increased\n/// by one.\n///\n/// For these reasons `BoundedVec` should generally be preferred over `Vec` when there\n/// is a reasonable maximum bound that can be placed on the vector.\n///\n/// Example:\n///\n/// ```noir\n/// let mut vector: BoundedVec = BoundedVec::new();\n/// for i in 0..5 {\n/// vector.push(i);\n/// }\n/// assert(vector.len() == 5);\n/// assert(vector.max_len() == 10);\n/// ```\npub struct BoundedVec {\n storage: [T; MaxLen],\n len: u32,\n}\n\nimpl BoundedVec {\n /// Creates a new, empty vector of length zero.\n ///\n /// Since this container is backed by an array internally, it still needs an initial value\n /// to give each element. To resolve this, each element is zeroed internally. This value\n /// is guaranteed to be inaccessible unless `get_unchecked` is used.\n ///\n /// Example:\n ///\n /// ```noir\n /// let empty_vector: BoundedVec = BoundedVec::new();\n /// assert(empty_vector.len() == 0);\n /// ```\n ///\n /// Note that whenever calling `new` the maximum length of the vector should always be specified\n /// via a type signature:\n ///\n /// ```noir\n /// fn good() -> BoundedVec {\n /// // Ok! MaxLen is specified with a type annotation\n /// let v1: BoundedVec = BoundedVec::new();\n /// let v2 = BoundedVec::new();\n ///\n /// // Ok! MaxLen is known from the type of `good`'s return value\n /// v2\n /// }\n ///\n /// fn bad() {\n /// // Error: Type annotation needed\n /// // The compiler can't infer `MaxLen` from the following code:\n /// let mut v3 = BoundedVec::new();\n /// v3.push(5);\n /// }\n /// ```\n ///\n /// This defaulting of `MaxLen` (and numeric generics in general) to zero may change in future noir versions\n /// but for now make sure to use type annotations when using bounded vectors. Otherwise, you will receive a\n /// constraint failure at runtime when the vec is pushed to.\n pub fn new() -> Self {\n let zeroed = crate::mem::zeroed();\n BoundedVec { storage: [zeroed; MaxLen], len: 0 }\n }\n\n /// Retrieves an element from the vector at the given index, starting from zero.\n ///\n /// If the given index is equal to or greater than the length of the vector, this\n /// will issue a constraint failure.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn foo(v: BoundedVec) {\n /// let first = v.get(0);\n /// let last = v.get(v.len() - 1);\n /// assert(first != last);\n /// }\n /// ```\n pub fn get(self, index: u32) -> T {\n assert(index < self.len, \"Attempted to read past end of BoundedVec\");\n self.get_unchecked(index)\n }\n\n /// Retrieves an element from the vector at the given index, starting from zero, without\n /// performing a bounds check.\n ///\n /// Since this function does not perform a bounds check on length before accessing the element,\n /// it is unsafe! Use at your own risk!\n ///\n /// Example:\n ///\n /// ```noir\n /// fn sum_of_first_three(v: BoundedVec) -> u32 {\n /// // Always ensure the length is larger than the largest\n /// // index passed to get_unchecked\n /// assert(v.len() > 2);\n /// let first = v.get_unchecked(0);\n /// let second = v.get_unchecked(1);\n /// let third = v.get_unchecked(2);\n /// first + second + third\n /// }\n /// ```\n pub fn get_unchecked(self, index: u32) -> T {\n self.storage[index]\n }\n\n /// Writes an element to the vector at the given index, starting from zero.\n ///\n /// If the given index is equal to or greater than the length of the vector, this will issue a constraint failure.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn foo(v: BoundedVec) {\n /// let first = v.get(0);\n /// assert(first != 42);\n /// v.set(0, 42);\n /// let new_first = v.get(0);\n /// assert(new_first == 42);\n /// }\n /// ```\n pub fn set(&mut self, index: u32, value: T) {\n assert(index < self.len, \"Attempted to write past end of BoundedVec\");\n self.set_unchecked(index, value)\n }\n\n /// Writes an element to the vector at the given index, starting from zero, without performing a bounds check.\n ///\n /// Since this function does not perform a bounds check on length before accessing the element, it is unsafe! Use at your own risk!\n ///\n /// Example:\n ///\n /// ```noir\n /// fn set_unchecked_example() {\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_array([1, 2]);\n ///\n /// // Here we're safely writing within the valid range of `vec`\n /// // `vec` now has the value [42, 2]\n /// vec.set_unchecked(0, 42);\n ///\n /// // We can then safely read this value back out of `vec`.\n /// // Notice that we use the checked version of `get` which would prevent reading unsafe values.\n /// assert_eq(vec.get(0), 42);\n ///\n /// // We've now written past the end of `vec`.\n /// // As this index is still within the maximum potential length of `v`,\n /// // it won't cause a constraint failure.\n /// vec.set_unchecked(2, 42);\n /// println(vec);\n ///\n /// // This will write past the end of the maximum potential length of `vec`,\n /// // it will then trigger a constraint failure.\n /// vec.set_unchecked(5, 42);\n /// println(vec);\n /// }\n /// ```\n pub fn set_unchecked(&mut self, index: u32, value: T) {\n self.storage[index] = value;\n }\n\n /// Pushes an element to the end of the vector. This increases the length\n /// of the vector by one.\n ///\n /// Panics if the new length of the vector will be greater than the max length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// v.push(1);\n /// v.push(2);\n ///\n /// // Panics with failed assertion \"push out of bounds\"\n /// v.push(3);\n /// ```\n pub fn push(&mut self, elem: T) {\n assert(self.len < MaxLen, \"push out of bounds\");\n\n self.storage[self.len] = elem;\n self.len += 1;\n }\n\n /// Returns the current length of this vector\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// assert(v.len() == 0);\n ///\n /// v.push(100);\n /// assert(v.len() == 1);\n ///\n /// v.push(200);\n /// v.push(300);\n /// v.push(400);\n /// assert(v.len() == 4);\n ///\n /// let _ = v.pop();\n /// let _ = v.pop();\n /// assert(v.len() == 2);\n /// ```\n pub fn len(self) -> u32 {\n self.len\n }\n\n /// Returns the maximum length of this vector. This is always\n /// equal to the `MaxLen` parameter this vector was initialized with.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// assert(v.max_len() == 5);\n /// v.push(10);\n /// assert(v.max_len() == 5);\n /// ```\n pub fn max_len(_self: BoundedVec) -> u32 {\n MaxLen\n }\n\n /// Returns the internal array within this vector.\n ///\n /// Since arrays in Noir are immutable, mutating the returned storage array will not mutate\n /// the storage held internally by this vector.\n ///\n /// Note that uninitialized elements may be zeroed out!\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// assert(v.storage() == [0, 0, 0, 0, 0]);\n ///\n /// v.push(57);\n /// assert(v.storage() == [57, 0, 0, 0, 0]);\n /// ```\n pub fn storage(self) -> [T; MaxLen] {\n self.storage\n }\n\n /// Pushes each element from the given array to this vector.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_array([2, 4]);\n ///\n /// assert(vec.len == 2);\n /// assert(vec.get(0) == 2);\n /// assert(vec.get(1) == 4);\n /// ```\n pub fn extend_from_array(&mut self, array: [T; Len]) {\n let new_len = self.len + array.len();\n assert(new_len <= MaxLen, \"extend_from_array out of bounds\");\n for i in 0..array.len() {\n self.storage[self.len + i] = array[i];\n }\n self.len = new_len;\n }\n\n /// Pushes each element from the given slice to this vector.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_slice(&[2, 4]);\n ///\n /// assert(vec.len == 2);\n /// assert(vec.get(0) == 2);\n /// assert(vec.get(1) == 4);\n /// ```\n pub fn extend_from_slice(&mut self, slice: [T]) {\n let new_len = self.len + slice.len();\n assert(new_len <= MaxLen, \"extend_from_slice out of bounds\");\n for i in 0..slice.len() {\n self.storage[self.len + i] = slice[i];\n }\n self.len = new_len;\n }\n\n /// Pushes each element from the other vector to this vector. The length of\n /// the other vector is left unchanged.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// ```noir\n /// let mut v1: BoundedVec = BoundedVec::new();\n /// let mut v2: BoundedVec = BoundedVec::new();\n ///\n /// v2.extend_from_array([1, 2, 3]);\n /// v1.extend_from_bounded_vec(v2);\n ///\n /// assert(v1.storage() == [1, 2, 3, 0, 0]);\n /// assert(v2.storage() == [1, 2, 3, 0, 0, 0, 0]);\n /// ```\n pub fn extend_from_bounded_vec(&mut self, vec: BoundedVec) {\n let append_len = vec.len();\n let new_len = self.len + append_len;\n assert(new_len <= MaxLen, \"extend_from_bounded_vec out of bounds\");\n\n if is_unconstrained() {\n for i in 0..append_len {\n self.storage[self.len + i] = vec.get_unchecked(i);\n }\n } else {\n let mut exceeded_len = false;\n for i in 0..Len {\n exceeded_len |= i == append_len;\n if !exceeded_len {\n self.storage[self.len + i] = vec.get_unchecked(i);\n }\n }\n }\n self.len = new_len;\n }\n\n /// Creates a new vector, populating it with values derived from an array input.\n /// The maximum length of the vector is determined based on the type signature.\n ///\n /// Example:\n ///\n /// ```noir\n /// let bounded_vec: BoundedVec = BoundedVec::from_array([1, 2, 3])\n /// ```\n pub fn from_array(array: [T; Len]) -> Self {\n static_assert(Len <= MaxLen, \"from array out of bounds\");\n let mut vec: BoundedVec = BoundedVec::new();\n vec.extend_from_array(array);\n vec\n }\n\n /// Pops the element at the end of the vector. This will decrease the length\n /// of the vector by one.\n ///\n /// Panics if the vector is empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// v.push(1);\n /// v.push(2);\n ///\n /// let two = v.pop();\n /// let one = v.pop();\n ///\n /// assert(two == 2);\n /// assert(one == 1);\n ///\n /// // error: cannot pop from an empty vector\n /// let _ = v.pop();\n /// ```\n pub fn pop(&mut self) -> T {\n assert(self.len > 0);\n self.len -= 1;\n\n let elem = self.storage[self.len];\n self.storage[self.len] = crate::mem::zeroed();\n elem\n }\n\n /// Returns true if the given predicate returns true for any element\n /// in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// v.extend_from_array([2, 4, 6]);\n ///\n /// let all_even = !v.any(|elem: u32| elem % 2 != 0);\n /// assert(all_even);\n /// ```\n pub fn any(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n if is_unconstrained() {\n for i in 0..self.len {\n ret |= predicate(self.storage[i]);\n }\n } else {\n let mut ret = false;\n let mut exceeded_len = false;\n for i in 0..MaxLen {\n exceeded_len |= i == self.len;\n if !exceeded_len {\n ret |= predicate(self.storage[i]);\n }\n }\n }\n ret\n }\n\n /// Creates a new vector of equal size by calling a closure on each element in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let result = vec.map(|value| value * 2);\n ///\n /// let expected = BoundedVec::from_array([2, 4, 6, 8]);\n /// assert_eq(result, expected);\n /// ```\n pub fn map(self, f: fn[Env](T) -> U) -> BoundedVec {\n let mut ret = BoundedVec::new();\n ret.len = self.len();\n\n if is_unconstrained() {\n for i in 0..self.len() {\n ret.storage[i] = f(self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n ret.storage[i] = f(self.get_unchecked(i));\n }\n }\n }\n\n ret\n }\n\n /// Creates a new vector of equal size by calling a closure on each element\n /// in this vector, along with its index.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let result = vec.mapi(|i, value| i + value * 2);\n ///\n /// let expected = BoundedVec::from_array([2, 5, 8, 11]);\n /// assert_eq(result, expected);\n /// ```\n pub fn mapi(self, f: fn[Env](u32, T) -> U) -> BoundedVec {\n let mut ret = BoundedVec::new();\n ret.len = self.len();\n\n if is_unconstrained() {\n for i in 0..self.len() {\n ret.storage[i] = f(i, self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n ret.storage[i] = f(i, self.get_unchecked(i));\n }\n }\n }\n\n ret\n }\n\n /// Calls a closure on each element in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let mut result = BoundedVec::::new();\n /// vec.for_each(|value| result.push(value * 2));\n ///\n /// let expected = BoundedVec::from_array([2, 4, 6, 8]);\n /// assert_eq(result, expected);\n /// ```\n pub fn for_each(self, f: fn[Env](T) -> ()) {\n if is_unconstrained() {\n for i in 0..self.len() {\n f(self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n f(self.get_unchecked(i));\n }\n }\n }\n }\n\n /// Calls a closure on each element in this vector, along with its index.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let mut result = BoundedVec::::new();\n /// vec.for_eachi(|i, value| result.push(i + value * 2));\n ///\n /// let expected = BoundedVec::from_array([2, 5, 8, 11]);\n /// assert_eq(result, expected);\n /// ```\n pub fn for_eachi(self, f: fn[Env](u32, T) -> ()) {\n if is_unconstrained() {\n for i in 0..self.len() {\n f(i, self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n f(i, self.get_unchecked(i));\n }\n }\n }\n }\n\n /// Creates a new BoundedVec from the given array and length.\n /// The given length must be less than or equal to the length of the array.\n ///\n /// This function will zero out any elements at or past index `len` of `array`.\n /// This incurs an extra runtime cost of O(MaxLen). If you are sure your array is\n /// zeroed after that index, you can use `from_parts_unchecked` to remove the extra loop.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_parts([1, 2, 3, 0], 3);\n /// assert_eq(vec.len(), 3);\n /// ```\n pub fn from_parts(mut array: [T; MaxLen], len: u32) -> Self {\n assert(len <= MaxLen);\n let zeroed = crate::mem::zeroed();\n\n if is_unconstrained() {\n for i in len..MaxLen {\n array[i] = zeroed;\n }\n } else {\n for i in 0..MaxLen {\n if i >= len {\n array[i] = zeroed;\n }\n }\n }\n\n BoundedVec { storage: array, len }\n }\n\n /// Creates a new BoundedVec from the given array and length.\n /// The given length must be less than or equal to the length of the array.\n ///\n /// This function is unsafe because it expects all elements past the `len` index\n /// of `array` to be zeroed, but does not check for this internally. Use `from_parts`\n /// for a safe version of this function which does zero out any indices past the\n /// given length. Invalidating this assumption can notably cause `BoundedVec::eq`\n /// to give incorrect results since it will check even elements past `len`.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 0], 3);\n /// assert_eq(vec.len(), 3);\n ///\n /// // invalid use!\n /// let vec1: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 1], 3);\n /// let vec2: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 2], 3);\n ///\n /// // both vecs have length 3 so we'd expect them to be equal, but this\n /// // fails because elements past the length are still checked in eq\n /// assert_eq(vec1, vec2); // fails\n /// ```\n pub fn from_parts_unchecked(array: [T; MaxLen], len: u32) -> Self {\n assert(len <= MaxLen);\n BoundedVec { storage: array, len }\n }\n}\n\nimpl Eq for BoundedVec\nwhere\n T: Eq,\n{\n fn eq(self, other: BoundedVec) -> bool {\n // TODO: https://github.com/noir-lang/noir/issues/4837\n //\n // We make the assumption that the user has used the proper interface for working with `BoundedVec`s\n // rather than directly manipulating the internal fields as this can result in an inconsistent internal state.\n if self.len == other.len {\n self.storage == other.storage\n } else {\n false\n }\n }\n}\n\nimpl From<[T; Len]> for BoundedVec {\n fn from(array: [T; Len]) -> BoundedVec {\n BoundedVec::from_array(array)\n }\n}\n\nmod bounded_vec_tests {\n\n mod get {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test(should_fail_with = \"Attempted to read past end of BoundedVec\")]\n fn panics_when_reading_elements_past_end_of_vec() {\n let vec: BoundedVec = BoundedVec::new();\n\n crate::println(vec.get(0));\n }\n }\n\n mod set {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn set_updates_values_properly() {\n let mut vec = BoundedVec::from_array([0, 0, 0, 0, 0]);\n\n vec.set(0, 42);\n assert_eq(vec.storage, [42, 0, 0, 0, 0]);\n\n vec.set(1, 43);\n assert_eq(vec.storage, [42, 43, 0, 0, 0]);\n\n vec.set(2, 44);\n assert_eq(vec.storage, [42, 43, 44, 0, 0]);\n\n vec.set(1, 10);\n assert_eq(vec.storage, [42, 10, 44, 0, 0]);\n\n vec.set(0, 0);\n assert_eq(vec.storage, [0, 10, 44, 0, 0]);\n }\n\n #[test(should_fail_with = \"Attempted to write past end of BoundedVec\")]\n fn panics_when_writing_elements_past_end_of_vec() {\n let mut vec: BoundedVec = BoundedVec::new();\n vec.set(0, 42);\n\n // Need to use println to avoid DIE removing the write operation.\n crate::println(vec.get(0));\n }\n }\n\n mod map {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn applies_function_correctly() {\n // docs:start:bounded-vec-map-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.map(|value| value * 2);\n // docs:end:bounded-vec-map-example\n let expected = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.map(|value| (value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = vec.map(|value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod mapi {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn applies_function_correctly() {\n // docs:start:bounded-vec-mapi-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.mapi(|i, value| i + value * 2);\n // docs:end:bounded-vec-mapi-example\n let expected = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.mapi(|i, value| (i + value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = vec.mapi(|_, value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod for_each {\n use crate::collections::bounded_vec::BoundedVec;\n\n // map in terms of for_each\n fn for_each_map(\n input: BoundedVec,\n f: fn[Env](T) -> U,\n ) -> BoundedVec {\n let mut output = BoundedVec::::new();\n let output_ref = &mut output;\n input.for_each(|x| output_ref.push(f(x)));\n output\n }\n\n #[test]\n fn smoke_test() {\n let mut acc = 0;\n let acc_ref = &mut acc;\n // docs:start:bounded-vec-for-each-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3]);\n vec.for_each(|value| { *acc_ref += value; });\n // docs:end:bounded-vec-for-each-example\n assert_eq(acc, 6);\n }\n\n #[test]\n fn applies_function_correctly() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_each_map(vec, |value| value * 2);\n let expected = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_each_map(vec, |value| (value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = for_each_map(vec, |value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod for_eachi {\n use crate::collections::bounded_vec::BoundedVec;\n\n // mapi in terms of for_eachi\n fn for_eachi_mapi(\n input: BoundedVec,\n f: fn[Env](u32, T) -> U,\n ) -> BoundedVec {\n let mut output = BoundedVec::::new();\n let output_ref = &mut output;\n input.for_eachi(|i, x| output_ref.push(f(i, x)));\n output\n }\n\n #[test]\n fn smoke_test() {\n let mut acc = 0;\n let acc_ref = &mut acc;\n // docs:start:bounded-vec-for-eachi-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3]);\n vec.for_eachi(|i, value| { *acc_ref += i * value; });\n // docs:end:bounded-vec-for-eachi-example\n\n // 0 * 1 + 1 * 2 + 2 * 3\n assert_eq(acc, 8);\n }\n\n #[test]\n fn applies_function_correctly() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_eachi_mapi(vec, |i, value| i + value * 2);\n let expected = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_eachi_mapi(vec, |i, value| (i + value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = for_eachi_mapi(vec, |_, value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod from_array {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn empty() {\n let empty_array: [Field; 0] = [];\n let bounded_vec = BoundedVec::from_array([]);\n\n assert_eq(bounded_vec.max_len(), 0);\n assert_eq(bounded_vec.len(), 0);\n assert_eq(bounded_vec.storage(), empty_array);\n }\n\n #[test]\n fn equal_len() {\n let array = [1, 2, 3];\n let bounded_vec = BoundedVec::from_array(array);\n\n assert_eq(bounded_vec.max_len(), 3);\n assert_eq(bounded_vec.len(), 3);\n assert_eq(bounded_vec.storage(), array);\n }\n\n #[test]\n fn max_len_greater_then_array_len() {\n let array = [1, 2, 3];\n let bounded_vec: BoundedVec = BoundedVec::from_array(array);\n\n assert_eq(bounded_vec.max_len(), 10);\n assert_eq(bounded_vec.len(), 3);\n assert_eq(bounded_vec.get(0), 1);\n assert_eq(bounded_vec.get(1), 2);\n assert_eq(bounded_vec.get(2), 3);\n }\n\n #[test(should_fail_with = \"from array out of bounds\")]\n fn max_len_lower_then_array_len() {\n let _: BoundedVec = BoundedVec::from_array([0; 3]);\n }\n }\n\n mod trait_from {\n use crate::collections::bounded_vec::BoundedVec;\n use crate::convert::From;\n\n #[test]\n fn simple() {\n let array = [1, 2];\n let bounded_vec: BoundedVec = BoundedVec::from(array);\n\n assert_eq(bounded_vec.max_len(), 10);\n assert_eq(bounded_vec.len(), 2);\n assert_eq(bounded_vec.get(0), 1);\n assert_eq(bounded_vec.get(1), 2);\n }\n }\n\n mod trait_eq {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn empty_equality() {\n let mut bounded_vec1: BoundedVec = BoundedVec::new();\n let mut bounded_vec2: BoundedVec = BoundedVec::new();\n\n assert_eq(bounded_vec1, bounded_vec2);\n }\n\n #[test]\n fn inequality() {\n let mut bounded_vec1: BoundedVec = BoundedVec::new();\n let mut bounded_vec2: BoundedVec = BoundedVec::new();\n bounded_vec1.push(1);\n bounded_vec2.push(2);\n\n assert(bounded_vec1 != bounded_vec2);\n }\n }\n\n mod from_parts {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn from_parts() {\n // docs:start:from-parts\n let vec: BoundedVec = BoundedVec::from_parts([1, 2, 3, 0], 3);\n assert_eq(vec.len(), 3);\n\n // Any elements past the given length are zeroed out, so these\n // two BoundedVecs will be completely equal\n let vec1: BoundedVec = BoundedVec::from_parts([1, 2, 3, 1], 3);\n let vec2: BoundedVec = BoundedVec::from_parts([1, 2, 3, 2], 3);\n assert_eq(vec1, vec2);\n // docs:end:from-parts\n }\n\n #[test]\n fn from_parts_unchecked() {\n // docs:start:from-parts-unchecked\n let vec: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 0], 3);\n assert_eq(vec.len(), 3);\n\n // invalid use!\n let vec1: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 1], 3);\n let vec2: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 2], 3);\n\n // both vecs have length 3 so we'd expect them to be equal, but this\n // fails because elements past the length are still checked in eq\n assert(vec1 != vec2);\n // docs:end:from-parts-unchecked\n }\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_3/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_3/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 683a321de87..a0a1c8fba3f 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_3/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_3/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -9,10 +9,6 @@ expression: artifact "parameters": [], "return_type": null, "error_types": { - "2920182694213909827": { - "error_kind": "string", - "string": "attempt to subtract with overflow" - }, "5019202896831570965": { "error_kind": "string", "string": "attempt to add with overflow" @@ -25,10 +21,6 @@ expression: artifact "error_kind": "string", "string": "array ref-count underflow detected" }, - "14225679739041873922": { - "error_kind": "string", - "string": "Index out of bounds" - }, "17843811134343075018": { "error_kind": "string", "string": "Stack too deep" @@ -43,9 +35,9 @@ expression: artifact "return value indices : []", "BRILLIG CALL func 0: inputs: [], outputs: []", "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(1), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32842), size_address: Relative(1), offset_address: Relative(2) }, Call { location: 11 }, 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: Integer(U1), value: 0 }, Const { destination: Direct(32836), bit_size: Integer(U32), value: 0 }, Const { destination: Direct(32837), bit_size: Field, value: 0 }, Const { destination: Direct(32838), bit_size: Integer(U1), value: 1 }, 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: 4 }, Return, Call { location: 107 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 113 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(9) }, Mov { destination: Relative(2), source: Relative(10) }, Mov { destination: Relative(3), source: Relative(11) }, Mov { destination: Relative(4), source: Relative(12) }, Mov { destination: Relative(5), source: Relative(13) }, Mov { destination: Relative(6), source: Relative(14) }, 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) }, 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) }, 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) }, 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) }, 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: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Relative(7) }, Mov { destination: Relative(10), source: Relative(1) }, Mov { destination: Relative(11), source: Relative(2) }, Mov { destination: Relative(12), source: Relative(3) }, Mov { destination: Relative(13), source: Relative(4) }, Mov { destination: Relative(14), source: Relative(5) }, Mov { destination: Relative(15), source: Direct(32841) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 155 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(6), source_pointer: Relative(3) }, 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: 68 }, Call { location: 186 }, 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(8), bit_size: Integer(U32), value: 8 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Load { destination: Relative(10), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Direct(32841) }, JumpIf { condition: Relative(6), location: 77 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(11) } }, 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(1) }, Mov { destination: Relative(13), source: Relative(2) }, Mov { destination: Relative(14), source: Relative(3) }, 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(6) }, Call { location: 189 }, 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(1) }, Mov { destination: Relative(13), source: Relative(2) }, Mov { destination: Relative(14), source: Relative(3) }, 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(6) }, Call { location: 239 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(1), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, Load { destination: Relative(2), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(1), op: Equals, bit_size: U32, lhs: Relative(2), rhs: Direct(32841) }, JumpIf { condition: Relative(1), location: 106 }, 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: 112 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 107 }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 5 }, 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(32837) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(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(32837) }, 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) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 9 }, 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(32837) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32836) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32837) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32836) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32837) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32836) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32837) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32836) }, Mov { destination: Relative(4), source: Relative(2) }, Mov { destination: Relative(2), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(32837) }, Mov { destination: Relative(6), source: Direct(32839) }, Mov { destination: Relative(3), source: Direct(32836) }, Mov { destination: Relative(5), source: Direct(32836) }, Return, Call { location: 107 }, Mov { destination: Relative(8), source: Direct(32836) }, Jump { location: 158 }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, JumpIf { condition: Relative(9), location: 162 }, Jump { location: 161 }, Return, 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) }, 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: 310 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(9), 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(4) }, Mov { destination: Relative(13), source: Relative(5) }, Mov { destination: Relative(14), source: Direct(32837) }, Mov { destination: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 329 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32839) }, Mov { destination: Relative(8), source: Relative(9) }, Jump { location: 158 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 107 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 6 }, 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(32837) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, 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(32837) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, 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(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: Relative(8) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(7), source: Direct(32836) }, Jump { location: 211 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Relative(8) }, JumpIf { condition: Relative(10), location: 226 }, Jump { location: 214 }, Load { destination: Relative(7), source_pointer: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(3) }, Load { destination: Relative(9), source_pointer: Relative(4) }, Load { destination: Relative(10), source_pointer: Relative(5) }, Load { destination: Relative(11), source_pointer: Relative(6) }, Store { destination_pointer: Relative(1), source: Direct(32837) }, Store { destination_pointer: Relative(2), source: Relative(7) }, Store { destination_pointer: Relative(3), source: Relative(8) }, Store { destination_pointer: Relative(4), source: Relative(9) }, Store { destination_pointer: Relative(5), source: Relative(10) }, Store { destination_pointer: Relative(6), source: Relative(11) }, Return, Cast { destination: Relative(10), source: Relative(7), bit_size: Field }, Load { destination: Relative(11), source_pointer: Relative(9) }, Mov { destination: Direct(32771), source: Relative(11) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 6 }, Call { location: 358 }, 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(7) }, Store { destination_pointer: Relative(14), source: Relative(10) }, Store { destination_pointer: Relative(9), source: Relative(12) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32839) }, Mov { destination: Relative(7), source: Relative(10) }, Jump { location: 211 }, Call { location: 107 }, Load { destination: Relative(7), source_pointer: Relative(2) }, Load { destination: Relative(2), source_pointer: Relative(3) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(7) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(4) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 249 }, Call { location: 186 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(4) }, Load { destination: Relative(4), 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(4) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 257 }, Call { location: 186 }, 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(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(2) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 380 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(13) }, Mov { destination: Relative(10), source: Relative(14) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 16 }, Mov { destination: Relative(16), source: Direct(0) }, Mov { destination: Relative(17), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(15) }, Call { location: 453 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(2), source: Relative(17) }, Mov { destination: Relative(7), source: Relative(18) }, Mov { destination: Relative(11), source: Relative(19) }, Mov { destination: Relative(12), source: Relative(20) }, Mov { destination: Relative(13), source: Relative(21) }, Mov { destination: Relative(14), source: Relative(22) }, 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: 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(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(12) }, 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(13) }, 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(14) }, Const { destination: Relative(14), 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(2) }, Mov { destination: Relative(18), source: Relative(7) }, Mov { destination: Relative(19), source: Relative(11) }, Mov { destination: Relative(20), source: Relative(12) }, Mov { destination: Relative(21), source: Relative(13) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(14) }, Call { location: 498 }, Mov { destination: Direct(0), source: Relative(0) }, Return, Call { location: 107 }, Load { destination: Relative(7), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32839) }, BinaryIntOp { destination: Relative(9), op: LessThanEquals, bit_size: U32, lhs: Relative(7), rhs: Relative(8) }, JumpIf { condition: Relative(9), location: 316 }, Call { location: 576 }, Load { destination: Relative(9), source_pointer: Relative(1) }, Load { destination: Relative(10), source_pointer: Relative(2) }, Load { destination: Relative(11), source_pointer: Relative(3) }, Load { destination: Relative(12), source_pointer: Relative(4) }, Load { destination: Relative(13), source_pointer: Relative(5) }, Store { destination_pointer: Relative(1), source: Relative(9) }, Store { destination_pointer: Relative(2), source: Relative(10) }, Store { destination_pointer: Relative(3), source: Relative(11) }, Store { destination_pointer: Relative(4), source: Relative(12) }, Store { destination_pointer: Relative(5), source: Relative(13) }, Store { destination_pointer: Relative(6), source: Relative(8) }, Mov { destination: Relative(1), source: Relative(7) }, Return, Call { location: 107 }, Load { destination: Relative(5), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32841) }, JumpIf { condition: Relative(6), location: 334 }, Call { location: 579 }, Load { destination: Relative(6), source_pointer: Relative(1) }, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Direct(32840) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 9 }, Call { location: 358 }, 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(32839) }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 9 }, Call { location: 358 }, 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(32839) }, BinaryIntOp { destination: Relative(4), op: LessThanEquals, bit_size: U32, lhs: Relative(5), rhs: Relative(3) }, JumpIf { condition: Relative(4), location: 355 }, Call { location: 576 }, Store { destination_pointer: Relative(1), source: Relative(6) }, Store { destination_pointer: Relative(2), source: Relative(3) }, 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: 362 }, Jump { location: 364 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 379 }, 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: 376 }, 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: 369 }, 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: 379 }, Return, Call { location: 107 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 5 }, 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(32837) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, 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(32837) }, 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: 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) }, 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: 406 }, Call { location: 186 }, 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(32836) }, Jump { location: 410 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32841) }, JumpIf { condition: Relative(6), location: 416 }, Jump { location: 413 }, Load { destination: Relative(1), source_pointer: Relative(5) }, Load { destination: Relative(2), source_pointer: Relative(4) }, Return, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(6), location: 419 }, Jump { location: 450 }, 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: 425 }, Call { location: 186 }, 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: Sub, bit_size: U32, lhs: Relative(2), rhs: Relative(3) }, BinaryIntOp { destination: Relative(8), op: LessThanEquals, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(8), location: 431 }, Call { location: 582 }, BinaryIntOp { destination: Relative(8), op: Sub, bit_size: U32, lhs: Relative(6), rhs: Direct(32839) }, BinaryIntOp { destination: Relative(9), op: LessThanEquals, bit_size: U32, lhs: Direct(32839), rhs: Relative(6) }, JumpIf { condition: Relative(9), location: 435 }, Call { location: 582 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Direct(32841) }, JumpIf { condition: Relative(6), location: 438 }, Call { location: 585 }, 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(6), 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(6) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(8) }, Call { location: 588 }, Mov { destination: Direct(0), source: Relative(0) }, Jump { location: 450 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, Mov { destination: Relative(3), source: Relative(6) }, Jump { location: 410 }, Call { location: 107 }, Mov { destination: Relative(2), 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(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(32837) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32837) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32837) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32837) }, 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: 473 }, Call { location: 186 }, 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(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(3) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 481 }, Call { location: 186 }, 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(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: Direct(32841) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 608 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(3), source: Relative(9) }, Mov { destination: Relative(6), source: Relative(10) }, Mov { destination: Relative(5), source: Relative(2) }, Mov { destination: Relative(1), source: Relative(2) }, Mov { destination: Relative(4), source: Relative(6) }, Mov { destination: Relative(2), source: Direct(32836) }, Mov { destination: Relative(6), source: Direct(32836) }, Return, Call { location: 107 }, Load { destination: Relative(7), source_pointer: Relative(1) }, 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: 506 }, Call { location: 186 }, 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(8), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(7) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(8) }, Call { location: 647 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(8), source_pointer: Relative(2) }, 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: 521 }, Call { location: 186 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(10) }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Direct(32841), rhs: Relative(8) }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U1, lhs: Relative(10), rhs: Direct(32835) }, JumpIf { condition: Relative(12), location: 528 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(13) } }, Load { destination: Relative(10), source_pointer: Relative(3) }, Load { destination: Relative(12), source_pointer: Relative(4) }, Load { destination: Relative(13), source_pointer: Relative(5) }, Load { destination: Relative(14), source_pointer: Relative(6) }, Store { destination_pointer: Relative(1), source: Relative(7) }, Store { destination_pointer: Relative(2), source: Relative(8) }, Store { destination_pointer: Relative(4), source: Relative(12) }, Store { destination_pointer: Relative(5), source: Relative(13) }, Store { destination_pointer: Relative(6), source: Relative(14) }, Load { destination: Relative(7), source_pointer: Relative(10) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 543 }, Call { location: 186 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(7) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(10) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 683 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(7), source_pointer: Relative(4) }, 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: 558 }, Call { location: 186 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(12) }, BinaryIntOp { destination: Relative(12), op: LessThan, bit_size: U32, lhs: Direct(32841), rhs: Relative(7) }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U1, lhs: Relative(12), rhs: Direct(32835) }, JumpIf { condition: Relative(14), location: 565 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(15) } }, Load { destination: Relative(12), source_pointer: Relative(1) }, Load { destination: Relative(14), source_pointer: Relative(2) }, Load { destination: Relative(15), source_pointer: Relative(5) }, Load { destination: Relative(16), source_pointer: Relative(6) }, Store { destination_pointer: Relative(1), source: Relative(12) }, Store { destination_pointer: Relative(2), source: Relative(14) }, Store { destination_pointer: Relative(3), source: Relative(10) }, Store { destination_pointer: Relative(4), source: Relative(7) }, Store { destination_pointer: Relative(5), source: Relative(15) }, Store { destination_pointer: Relative(6), source: Relative(16) }, 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: 5727012404371710682 }, 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, Call { location: 107 }, Load { destination: Relative(4), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32841) }, JumpIf { condition: Relative(5), location: 593 }, Call { location: 579 }, Load { destination: Relative(5), source_pointer: Relative(1) }, Mov { destination: Direct(32771), source: Relative(5) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 358 }, 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(32839) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, JumpIf { condition: Relative(5), location: 605 }, Call { location: 576 }, Store { destination_pointer: Relative(1), source: Relative(6) }, Store { destination_pointer: Relative(2), source: Relative(3) }, Return, Call { location: 107 }, 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) }, BinaryIntOp { destination: Relative(1), op: LessThan, bit_size: U32, lhs: Direct(32841), rhs: Relative(2) }, BinaryIntOp { destination: Relative(5), op: Equals, bit_size: U1, lhs: Relative(1), rhs: Direct(32835) }, JumpIf { condition: Relative(5), location: 617 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(6) } }, Mov { destination: Relative(3), source: Relative(2) }, Jump { location: 619 }, BinaryIntOp { destination: Relative(1), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32841) }, JumpIf { condition: Relative(1), location: 624 }, Jump { location: 622 }, Load { destination: Relative(1), source_pointer: Relative(4) }, Return, Load { destination: Relative(5), source_pointer: Relative(4) }, JumpIf { condition: Relative(1), location: 627 }, Call { location: 585 }, BinaryIntOp { destination: Relative(1), op: Mul, bit_size: U32, lhs: Relative(3), rhs: Direct(32840) }, Mov { destination: Direct(32771), source: Relative(5) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 9 }, Call { location: 358 }, 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(1) }, Store { destination_pointer: Relative(8), source: Direct(32837) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32839) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 9 }, Call { location: 358 }, Mov { destination: Relative(1), source: Direct(32773) }, 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(5) }, Store { destination_pointer: Relative(8), source: Direct(32836) }, Store { destination_pointer: Relative(4), source: Relative(1) }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, Mov { destination: Relative(3), source: Relative(1) }, Jump { location: 619 }, Call { location: 107 }, 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(32839) }, Jump { location: 653 }, BinaryIntOp { destination: Relative(1), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32841) }, JumpIf { condition: Relative(1), location: 657 }, Jump { location: 656 }, Return, Mov { destination: Relative(1), source: Direct(32836) }, Jump { location: 659 }, BinaryIntOp { destination: Relative(4), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, JumpIf { condition: Relative(4), location: 665 }, Jump { location: 662 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32839) }, Mov { destination: Relative(2), source: Relative(1) }, Jump { location: 653 }, Load { destination: Relative(4), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32841) }, JumpIf { condition: Relative(5), location: 669 }, Call { location: 585 }, 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) }, Mov { destination: Direct(32771), source: Relative(4) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 358 }, 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(3), source: Relative(6) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32839) }, Mov { destination: Relative(1), source: Relative(4) }, Jump { location: 659 }, Call { location: 107 }, 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(32839) }, Jump { location: 689 }, BinaryIntOp { destination: Relative(1), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32841) }, JumpIf { condition: Relative(1), location: 693 }, Jump { location: 692 }, Return, BinaryIntOp { destination: Relative(4), op: Mul, bit_size: U32, lhs: Relative(2), rhs: Direct(32840) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32839) }, Mov { destination: Relative(1), source: Direct(32836) }, Jump { location: 697 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, JumpIf { condition: Relative(6), location: 703 }, Jump { location: 700 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32839) }, Mov { destination: Relative(2), source: Relative(1) }, Jump { location: 689 }, Load { destination: Relative(6), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32841) }, JumpIf { condition: Relative(7), location: 707 }, Call { location: 585 }, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(6), 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(32839) }, 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(9) }, Load { destination: Relative(7), source_pointer: Relative(11) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 9 }, Call { location: 358 }, 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(4) }, Store { destination_pointer: Relative(11), source: Relative(8) }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 9 }, Call { location: 358 }, 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(5) }, Store { destination_pointer: Relative(10), source: Relative(7) }, Store { destination_pointer: Relative(3), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32839) }, Mov { destination: Relative(1), source: Relative(6) }, Jump { location: 697 }]" + "[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(1), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32839), size_address: Relative(1), offset_address: Relative(2) }, Call { location: 11 }, 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: Integer(U32), value: 0 }, Const { destination: Direct(32836), bit_size: Field, value: 0 }, Const { destination: Direct(32837), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(32838), bit_size: Integer(U32), value: 4 }, Return, Call { location: 67 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 73 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(9) }, Mov { destination: Relative(2), source: Relative(10) }, Mov { destination: Relative(3), source: Relative(11) }, Mov { destination: Relative(4), source: Relative(12) }, Mov { destination: Relative(5), source: Relative(13) }, Mov { destination: Relative(6), source: Relative(14) }, 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) }, 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) }, 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) }, 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) }, 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: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Relative(7) }, Mov { destination: Relative(10), source: Relative(1) }, Mov { destination: Relative(11), source: Relative(2) }, Mov { destination: Relative(12), source: Relative(3) }, Mov { destination: Relative(13), source: Relative(4) }, Mov { destination: Relative(14), source: Relative(5) }, Mov { destination: Relative(15), source: Direct(32838) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 115 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(1), source_pointer: Relative(3) }, 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: 65 }, Call { location: 146 }, 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: 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: 72 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 67 }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 5 }, 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(32836) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32836) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32836) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32836) }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 9 }, 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(32836) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32835) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32836) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32835) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32836) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32835) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32836) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32835) }, Mov { destination: Relative(6), source: Direct(32837) }, Mov { destination: Relative(4), source: Relative(2) }, Mov { destination: Relative(2), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(32836) }, Mov { destination: Relative(3), source: Direct(32835) }, Mov { destination: Relative(5), source: Direct(32835) }, Return, Call { location: 67 }, Mov { destination: Relative(8), source: Direct(32835) }, Jump { location: 118 }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, JumpIf { condition: Relative(9), location: 122 }, Jump { location: 121 }, Return, 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) }, 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: 149 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(9), 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(4) }, Mov { destination: Relative(13), source: Relative(5) }, Mov { destination: Relative(14), source: Direct(32836) }, Mov { destination: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 168 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32837) }, Mov { destination: Relative(8), source: Relative(9) }, Jump { location: 118 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 67 }, Load { destination: Relative(7), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(9), op: LessThanEquals, bit_size: U32, lhs: Relative(7), rhs: Relative(8) }, JumpIf { condition: Relative(9), location: 155 }, Call { location: 199 }, Load { destination: Relative(9), source_pointer: Relative(1) }, Load { destination: Relative(10), source_pointer: Relative(2) }, Load { destination: Relative(11), source_pointer: Relative(3) }, Load { destination: Relative(12), source_pointer: Relative(4) }, Load { destination: Relative(13), source_pointer: Relative(5) }, Store { destination_pointer: Relative(1), source: Relative(9) }, Store { destination_pointer: Relative(2), source: Relative(10) }, Store { destination_pointer: Relative(3), source: Relative(11) }, Store { destination_pointer: Relative(4), source: Relative(12) }, Store { destination_pointer: Relative(5), source: Relative(13) }, Store { destination_pointer: Relative(6), source: Relative(8) }, Mov { destination: Relative(1), source: Relative(7) }, Return, Call { location: 67 }, Load { destination: Relative(5), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32838) }, Const { destination: Relative(7), bit_size: Integer(U1), value: 1 }, JumpIf { condition: Relative(6), location: 174 }, Call { location: 202 }, Load { destination: Relative(6), source_pointer: Relative(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 9 }, Call { location: 205 }, 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(8) }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32837) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 9 }, Call { location: 205 }, 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(3) }, Store { destination_pointer: Relative(9), source: Relative(4) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(4), op: LessThanEquals, bit_size: U32, lhs: Relative(5), rhs: Relative(3) }, JumpIf { condition: Relative(4), location: 196 }, Call { location: 199 }, 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: 5019202896831570965 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 5727012404371710682 }, 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]" ], - "debug_symbols": "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", + "debug_symbols": "ndbBbuIwEMbxd8mZQzy2x56+SlVVAUIVKQoohZVWiHdfO98MdA+gKhf+E0J+LYmb5trs++3l63OYDsfv5u392mznYRyHr8/xuOvOw3Eq716btr641Ly5TeMyIkuoRRxCiEcCEhFGoBAUguKheCgeiofioXgoHoqH4qF4KAFKgBKgBCgBSoASikIlCcmILIkt4hBCPBKQiECJUCKUCIWhMBSGwlAYCkNhKKm86UsiwkhCMiJLcos4hBCPQMlQMpQMJUPJUASKQBEoAkWgCBSBIlAEikBxbat1WtJ6bdBGLWuhubqaQmldOVzrtUEbtaxN2qwVtK6gpU6rnlevrqJUG7WsTdqsFbSupaVOS9rixdK6ShzVoXwg15LWa4M2almbtFkraF0wS9Vj9Vg9Vo/VYz0uleOk1mlJ67VBW1d+Wwe2IdmQbRAd6hLD4GwgG7wNwQaTs8nZ5GxyNllMFpPr0nPLDcXbEGyINrANVXa326ax+9Pnee77env6ccMqt7FTN/fTuXmbLuO4af5042X50Pepm5aeu7nsLT+/n/alBTwMY1+n2+ZxdPv80Mit6NGRvbsD8fdCcnchpXaF4BwnFVy5wCsE8sQqlFFWCSHchUTPhPhCIHcX6PmZfCWUvx4Tygpb8y1Y7FpQcrxC4BztW3BOj2/BvwakjQYIpTXA/UqwxBXAq9P4Uba63TD/91xwq9Y8dNux183DZdr92Hv+e7I99lxxmo+7fn+Z+yo9Hi7KyzuVE0DEH/XfQ9ksaztR3XDLPtpQGz5u9Vf5Bw==", "file_map": { "6": { "source": "use crate::{cmp::Eq, convert::From, runtime::is_unconstrained, static_assert};\n\n/// A `BoundedVec` is a growable storage similar to a `Vec` except that it\n/// is bounded with a maximum possible length. Unlike `Vec`, `BoundedVec` is not implemented\n/// via slices and thus is not subject to the same restrictions slices are (notably, nested\n/// slices - and thus nested vectors as well - are disallowed).\n///\n/// Since a BoundedVec is backed by a normal array under the hood, growing the BoundedVec by\n/// pushing an additional element is also more efficient - the length only needs to be increased\n/// by one.\n///\n/// For these reasons `BoundedVec` should generally be preferred over `Vec` when there\n/// is a reasonable maximum bound that can be placed on the vector.\n///\n/// Example:\n///\n/// ```noir\n/// let mut vector: BoundedVec = BoundedVec::new();\n/// for i in 0..5 {\n/// vector.push(i);\n/// }\n/// assert(vector.len() == 5);\n/// assert(vector.max_len() == 10);\n/// ```\npub struct BoundedVec {\n storage: [T; MaxLen],\n len: u32,\n}\n\nimpl BoundedVec {\n /// Creates a new, empty vector of length zero.\n ///\n /// Since this container is backed by an array internally, it still needs an initial value\n /// to give each element. To resolve this, each element is zeroed internally. This value\n /// is guaranteed to be inaccessible unless `get_unchecked` is used.\n ///\n /// Example:\n ///\n /// ```noir\n /// let empty_vector: BoundedVec = BoundedVec::new();\n /// assert(empty_vector.len() == 0);\n /// ```\n ///\n /// Note that whenever calling `new` the maximum length of the vector should always be specified\n /// via a type signature:\n ///\n /// ```noir\n /// fn good() -> BoundedVec {\n /// // Ok! MaxLen is specified with a type annotation\n /// let v1: BoundedVec = BoundedVec::new();\n /// let v2 = BoundedVec::new();\n ///\n /// // Ok! MaxLen is known from the type of `good`'s return value\n /// v2\n /// }\n ///\n /// fn bad() {\n /// // Error: Type annotation needed\n /// // The compiler can't infer `MaxLen` from the following code:\n /// let mut v3 = BoundedVec::new();\n /// v3.push(5);\n /// }\n /// ```\n ///\n /// This defaulting of `MaxLen` (and numeric generics in general) to zero may change in future noir versions\n /// but for now make sure to use type annotations when using bounded vectors. Otherwise, you will receive a\n /// constraint failure at runtime when the vec is pushed to.\n pub fn new() -> Self {\n let zeroed = crate::mem::zeroed();\n BoundedVec { storage: [zeroed; MaxLen], len: 0 }\n }\n\n /// Retrieves an element from the vector at the given index, starting from zero.\n ///\n /// If the given index is equal to or greater than the length of the vector, this\n /// will issue a constraint failure.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn foo(v: BoundedVec) {\n /// let first = v.get(0);\n /// let last = v.get(v.len() - 1);\n /// assert(first != last);\n /// }\n /// ```\n pub fn get(self, index: u32) -> T {\n assert(index < self.len, \"Attempted to read past end of BoundedVec\");\n self.get_unchecked(index)\n }\n\n /// Retrieves an element from the vector at the given index, starting from zero, without\n /// performing a bounds check.\n ///\n /// Since this function does not perform a bounds check on length before accessing the element,\n /// it is unsafe! Use at your own risk!\n ///\n /// Example:\n ///\n /// ```noir\n /// fn sum_of_first_three(v: BoundedVec) -> u32 {\n /// // Always ensure the length is larger than the largest\n /// // index passed to get_unchecked\n /// assert(v.len() > 2);\n /// let first = v.get_unchecked(0);\n /// let second = v.get_unchecked(1);\n /// let third = v.get_unchecked(2);\n /// first + second + third\n /// }\n /// ```\n pub fn get_unchecked(self, index: u32) -> T {\n self.storage[index]\n }\n\n /// Writes an element to the vector at the given index, starting from zero.\n ///\n /// If the given index is equal to or greater than the length of the vector, this will issue a constraint failure.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn foo(v: BoundedVec) {\n /// let first = v.get(0);\n /// assert(first != 42);\n /// v.set(0, 42);\n /// let new_first = v.get(0);\n /// assert(new_first == 42);\n /// }\n /// ```\n pub fn set(&mut self, index: u32, value: T) {\n assert(index < self.len, \"Attempted to write past end of BoundedVec\");\n self.set_unchecked(index, value)\n }\n\n /// Writes an element to the vector at the given index, starting from zero, without performing a bounds check.\n ///\n /// Since this function does not perform a bounds check on length before accessing the element, it is unsafe! Use at your own risk!\n ///\n /// Example:\n ///\n /// ```noir\n /// fn set_unchecked_example() {\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_array([1, 2]);\n ///\n /// // Here we're safely writing within the valid range of `vec`\n /// // `vec` now has the value [42, 2]\n /// vec.set_unchecked(0, 42);\n ///\n /// // We can then safely read this value back out of `vec`.\n /// // Notice that we use the checked version of `get` which would prevent reading unsafe values.\n /// assert_eq(vec.get(0), 42);\n ///\n /// // We've now written past the end of `vec`.\n /// // As this index is still within the maximum potential length of `v`,\n /// // it won't cause a constraint failure.\n /// vec.set_unchecked(2, 42);\n /// println(vec);\n ///\n /// // This will write past the end of the maximum potential length of `vec`,\n /// // it will then trigger a constraint failure.\n /// vec.set_unchecked(5, 42);\n /// println(vec);\n /// }\n /// ```\n pub fn set_unchecked(&mut self, index: u32, value: T) {\n self.storage[index] = value;\n }\n\n /// Pushes an element to the end of the vector. This increases the length\n /// of the vector by one.\n ///\n /// Panics if the new length of the vector will be greater than the max length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// v.push(1);\n /// v.push(2);\n ///\n /// // Panics with failed assertion \"push out of bounds\"\n /// v.push(3);\n /// ```\n pub fn push(&mut self, elem: T) {\n assert(self.len < MaxLen, \"push out of bounds\");\n\n self.storage[self.len] = elem;\n self.len += 1;\n }\n\n /// Returns the current length of this vector\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// assert(v.len() == 0);\n ///\n /// v.push(100);\n /// assert(v.len() == 1);\n ///\n /// v.push(200);\n /// v.push(300);\n /// v.push(400);\n /// assert(v.len() == 4);\n ///\n /// let _ = v.pop();\n /// let _ = v.pop();\n /// assert(v.len() == 2);\n /// ```\n pub fn len(self) -> u32 {\n self.len\n }\n\n /// Returns the maximum length of this vector. This is always\n /// equal to the `MaxLen` parameter this vector was initialized with.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// assert(v.max_len() == 5);\n /// v.push(10);\n /// assert(v.max_len() == 5);\n /// ```\n pub fn max_len(_self: BoundedVec) -> u32 {\n MaxLen\n }\n\n /// Returns the internal array within this vector.\n ///\n /// Since arrays in Noir are immutable, mutating the returned storage array will not mutate\n /// the storage held internally by this vector.\n ///\n /// Note that uninitialized elements may be zeroed out!\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// assert(v.storage() == [0, 0, 0, 0, 0]);\n ///\n /// v.push(57);\n /// assert(v.storage() == [57, 0, 0, 0, 0]);\n /// ```\n pub fn storage(self) -> [T; MaxLen] {\n self.storage\n }\n\n /// Pushes each element from the given array to this vector.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_array([2, 4]);\n ///\n /// assert(vec.len == 2);\n /// assert(vec.get(0) == 2);\n /// assert(vec.get(1) == 4);\n /// ```\n pub fn extend_from_array(&mut self, array: [T; Len]) {\n let new_len = self.len + array.len();\n assert(new_len <= MaxLen, \"extend_from_array out of bounds\");\n for i in 0..array.len() {\n self.storage[self.len + i] = array[i];\n }\n self.len = new_len;\n }\n\n /// Pushes each element from the given slice to this vector.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_slice(&[2, 4]);\n ///\n /// assert(vec.len == 2);\n /// assert(vec.get(0) == 2);\n /// assert(vec.get(1) == 4);\n /// ```\n pub fn extend_from_slice(&mut self, slice: [T]) {\n let new_len = self.len + slice.len();\n assert(new_len <= MaxLen, \"extend_from_slice out of bounds\");\n for i in 0..slice.len() {\n self.storage[self.len + i] = slice[i];\n }\n self.len = new_len;\n }\n\n /// Pushes each element from the other vector to this vector. The length of\n /// the other vector is left unchanged.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// ```noir\n /// let mut v1: BoundedVec = BoundedVec::new();\n /// let mut v2: BoundedVec = BoundedVec::new();\n ///\n /// v2.extend_from_array([1, 2, 3]);\n /// v1.extend_from_bounded_vec(v2);\n ///\n /// assert(v1.storage() == [1, 2, 3, 0, 0]);\n /// assert(v2.storage() == [1, 2, 3, 0, 0, 0, 0]);\n /// ```\n pub fn extend_from_bounded_vec(&mut self, vec: BoundedVec) {\n let append_len = vec.len();\n let new_len = self.len + append_len;\n assert(new_len <= MaxLen, \"extend_from_bounded_vec out of bounds\");\n\n if is_unconstrained() {\n for i in 0..append_len {\n self.storage[self.len + i] = vec.get_unchecked(i);\n }\n } else {\n let mut exceeded_len = false;\n for i in 0..Len {\n exceeded_len |= i == append_len;\n if !exceeded_len {\n self.storage[self.len + i] = vec.get_unchecked(i);\n }\n }\n }\n self.len = new_len;\n }\n\n /// Creates a new vector, populating it with values derived from an array input.\n /// The maximum length of the vector is determined based on the type signature.\n ///\n /// Example:\n ///\n /// ```noir\n /// let bounded_vec: BoundedVec = BoundedVec::from_array([1, 2, 3])\n /// ```\n pub fn from_array(array: [T; Len]) -> Self {\n static_assert(Len <= MaxLen, \"from array out of bounds\");\n let mut vec: BoundedVec = BoundedVec::new();\n vec.extend_from_array(array);\n vec\n }\n\n /// Pops the element at the end of the vector. This will decrease the length\n /// of the vector by one.\n ///\n /// Panics if the vector is empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// v.push(1);\n /// v.push(2);\n ///\n /// let two = v.pop();\n /// let one = v.pop();\n ///\n /// assert(two == 2);\n /// assert(one == 1);\n ///\n /// // error: cannot pop from an empty vector\n /// let _ = v.pop();\n /// ```\n pub fn pop(&mut self) -> T {\n assert(self.len > 0);\n self.len -= 1;\n\n let elem = self.storage[self.len];\n self.storage[self.len] = crate::mem::zeroed();\n elem\n }\n\n /// Returns true if the given predicate returns true for any element\n /// in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// v.extend_from_array([2, 4, 6]);\n ///\n /// let all_even = !v.any(|elem: u32| elem % 2 != 0);\n /// assert(all_even);\n /// ```\n pub fn any(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n if is_unconstrained() {\n for i in 0..self.len {\n ret |= predicate(self.storage[i]);\n }\n } else {\n let mut ret = false;\n let mut exceeded_len = false;\n for i in 0..MaxLen {\n exceeded_len |= i == self.len;\n if !exceeded_len {\n ret |= predicate(self.storage[i]);\n }\n }\n }\n ret\n }\n\n /// Creates a new vector of equal size by calling a closure on each element in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let result = vec.map(|value| value * 2);\n ///\n /// let expected = BoundedVec::from_array([2, 4, 6, 8]);\n /// assert_eq(result, expected);\n /// ```\n pub fn map(self, f: fn[Env](T) -> U) -> BoundedVec {\n let mut ret = BoundedVec::new();\n ret.len = self.len();\n\n if is_unconstrained() {\n for i in 0..self.len() {\n ret.storage[i] = f(self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n ret.storage[i] = f(self.get_unchecked(i));\n }\n }\n }\n\n ret\n }\n\n /// Creates a new vector of equal size by calling a closure on each element\n /// in this vector, along with its index.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let result = vec.mapi(|i, value| i + value * 2);\n ///\n /// let expected = BoundedVec::from_array([2, 5, 8, 11]);\n /// assert_eq(result, expected);\n /// ```\n pub fn mapi(self, f: fn[Env](u32, T) -> U) -> BoundedVec {\n let mut ret = BoundedVec::new();\n ret.len = self.len();\n\n if is_unconstrained() {\n for i in 0..self.len() {\n ret.storage[i] = f(i, self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n ret.storage[i] = f(i, self.get_unchecked(i));\n }\n }\n }\n\n ret\n }\n\n /// Calls a closure on each element in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let mut result = BoundedVec::::new();\n /// vec.for_each(|value| result.push(value * 2));\n ///\n /// let expected = BoundedVec::from_array([2, 4, 6, 8]);\n /// assert_eq(result, expected);\n /// ```\n pub fn for_each(self, f: fn[Env](T) -> ()) {\n if is_unconstrained() {\n for i in 0..self.len() {\n f(self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n f(self.get_unchecked(i));\n }\n }\n }\n }\n\n /// Calls a closure on each element in this vector, along with its index.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let mut result = BoundedVec::::new();\n /// vec.for_eachi(|i, value| result.push(i + value * 2));\n ///\n /// let expected = BoundedVec::from_array([2, 5, 8, 11]);\n /// assert_eq(result, expected);\n /// ```\n pub fn for_eachi(self, f: fn[Env](u32, T) -> ()) {\n if is_unconstrained() {\n for i in 0..self.len() {\n f(i, self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n f(i, self.get_unchecked(i));\n }\n }\n }\n }\n\n /// Creates a new BoundedVec from the given array and length.\n /// The given length must be less than or equal to the length of the array.\n ///\n /// This function will zero out any elements at or past index `len` of `array`.\n /// This incurs an extra runtime cost of O(MaxLen). If you are sure your array is\n /// zeroed after that index, you can use `from_parts_unchecked` to remove the extra loop.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_parts([1, 2, 3, 0], 3);\n /// assert_eq(vec.len(), 3);\n /// ```\n pub fn from_parts(mut array: [T; MaxLen], len: u32) -> Self {\n assert(len <= MaxLen);\n let zeroed = crate::mem::zeroed();\n\n if is_unconstrained() {\n for i in len..MaxLen {\n array[i] = zeroed;\n }\n } else {\n for i in 0..MaxLen {\n if i >= len {\n array[i] = zeroed;\n }\n }\n }\n\n BoundedVec { storage: array, len }\n }\n\n /// Creates a new BoundedVec from the given array and length.\n /// The given length must be less than or equal to the length of the array.\n ///\n /// This function is unsafe because it expects all elements past the `len` index\n /// of `array` to be zeroed, but does not check for this internally. Use `from_parts`\n /// for a safe version of this function which does zero out any indices past the\n /// given length. Invalidating this assumption can notably cause `BoundedVec::eq`\n /// to give incorrect results since it will check even elements past `len`.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 0], 3);\n /// assert_eq(vec.len(), 3);\n ///\n /// // invalid use!\n /// let vec1: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 1], 3);\n /// let vec2: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 2], 3);\n ///\n /// // both vecs have length 3 so we'd expect them to be equal, but this\n /// // fails because elements past the length are still checked in eq\n /// assert_eq(vec1, vec2); // fails\n /// ```\n pub fn from_parts_unchecked(array: [T; MaxLen], len: u32) -> Self {\n assert(len <= MaxLen);\n BoundedVec { storage: array, len }\n }\n}\n\nimpl Eq for BoundedVec\nwhere\n T: Eq,\n{\n fn eq(self, other: BoundedVec) -> bool {\n // TODO: https://github.com/noir-lang/noir/issues/4837\n //\n // We make the assumption that the user has used the proper interface for working with `BoundedVec`s\n // rather than directly manipulating the internal fields as this can result in an inconsistent internal state.\n if self.len == other.len {\n self.storage == other.storage\n } else {\n false\n }\n }\n}\n\nimpl From<[T; Len]> for BoundedVec {\n fn from(array: [T; Len]) -> BoundedVec {\n BoundedVec::from_array(array)\n }\n}\n\nmod bounded_vec_tests {\n\n mod get {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test(should_fail_with = \"Attempted to read past end of BoundedVec\")]\n fn panics_when_reading_elements_past_end_of_vec() {\n let vec: BoundedVec = BoundedVec::new();\n\n crate::println(vec.get(0));\n }\n }\n\n mod set {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn set_updates_values_properly() {\n let mut vec = BoundedVec::from_array([0, 0, 0, 0, 0]);\n\n vec.set(0, 42);\n assert_eq(vec.storage, [42, 0, 0, 0, 0]);\n\n vec.set(1, 43);\n assert_eq(vec.storage, [42, 43, 0, 0, 0]);\n\n vec.set(2, 44);\n assert_eq(vec.storage, [42, 43, 44, 0, 0]);\n\n vec.set(1, 10);\n assert_eq(vec.storage, [42, 10, 44, 0, 0]);\n\n vec.set(0, 0);\n assert_eq(vec.storage, [0, 10, 44, 0, 0]);\n }\n\n #[test(should_fail_with = \"Attempted to write past end of BoundedVec\")]\n fn panics_when_writing_elements_past_end_of_vec() {\n let mut vec: BoundedVec = BoundedVec::new();\n vec.set(0, 42);\n\n // Need to use println to avoid DIE removing the write operation.\n crate::println(vec.get(0));\n }\n }\n\n mod map {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn applies_function_correctly() {\n // docs:start:bounded-vec-map-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.map(|value| value * 2);\n // docs:end:bounded-vec-map-example\n let expected = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.map(|value| (value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = vec.map(|value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod mapi {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn applies_function_correctly() {\n // docs:start:bounded-vec-mapi-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.mapi(|i, value| i + value * 2);\n // docs:end:bounded-vec-mapi-example\n let expected = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.mapi(|i, value| (i + value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = vec.mapi(|_, value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod for_each {\n use crate::collections::bounded_vec::BoundedVec;\n\n // map in terms of for_each\n fn for_each_map(\n input: BoundedVec,\n f: fn[Env](T) -> U,\n ) -> BoundedVec {\n let mut output = BoundedVec::::new();\n let output_ref = &mut output;\n input.for_each(|x| output_ref.push(f(x)));\n output\n }\n\n #[test]\n fn smoke_test() {\n let mut acc = 0;\n let acc_ref = &mut acc;\n // docs:start:bounded-vec-for-each-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3]);\n vec.for_each(|value| { *acc_ref += value; });\n // docs:end:bounded-vec-for-each-example\n assert_eq(acc, 6);\n }\n\n #[test]\n fn applies_function_correctly() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_each_map(vec, |value| value * 2);\n let expected = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_each_map(vec, |value| (value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = for_each_map(vec, |value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod for_eachi {\n use crate::collections::bounded_vec::BoundedVec;\n\n // mapi in terms of for_eachi\n fn for_eachi_mapi(\n input: BoundedVec,\n f: fn[Env](u32, T) -> U,\n ) -> BoundedVec {\n let mut output = BoundedVec::::new();\n let output_ref = &mut output;\n input.for_eachi(|i, x| output_ref.push(f(i, x)));\n output\n }\n\n #[test]\n fn smoke_test() {\n let mut acc = 0;\n let acc_ref = &mut acc;\n // docs:start:bounded-vec-for-eachi-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3]);\n vec.for_eachi(|i, value| { *acc_ref += i * value; });\n // docs:end:bounded-vec-for-eachi-example\n\n // 0 * 1 + 1 * 2 + 2 * 3\n assert_eq(acc, 8);\n }\n\n #[test]\n fn applies_function_correctly() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_eachi_mapi(vec, |i, value| i + value * 2);\n let expected = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_eachi_mapi(vec, |i, value| (i + value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = for_eachi_mapi(vec, |_, value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod from_array {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn empty() {\n let empty_array: [Field; 0] = [];\n let bounded_vec = BoundedVec::from_array([]);\n\n assert_eq(bounded_vec.max_len(), 0);\n assert_eq(bounded_vec.len(), 0);\n assert_eq(bounded_vec.storage(), empty_array);\n }\n\n #[test]\n fn equal_len() {\n let array = [1, 2, 3];\n let bounded_vec = BoundedVec::from_array(array);\n\n assert_eq(bounded_vec.max_len(), 3);\n assert_eq(bounded_vec.len(), 3);\n assert_eq(bounded_vec.storage(), array);\n }\n\n #[test]\n fn max_len_greater_then_array_len() {\n let array = [1, 2, 3];\n let bounded_vec: BoundedVec = BoundedVec::from_array(array);\n\n assert_eq(bounded_vec.max_len(), 10);\n assert_eq(bounded_vec.len(), 3);\n assert_eq(bounded_vec.get(0), 1);\n assert_eq(bounded_vec.get(1), 2);\n assert_eq(bounded_vec.get(2), 3);\n }\n\n #[test(should_fail_with = \"from array out of bounds\")]\n fn max_len_lower_then_array_len() {\n let _: BoundedVec = BoundedVec::from_array([0; 3]);\n }\n }\n\n mod trait_from {\n use crate::collections::bounded_vec::BoundedVec;\n use crate::convert::From;\n\n #[test]\n fn simple() {\n let array = [1, 2];\n let bounded_vec: BoundedVec = BoundedVec::from(array);\n\n assert_eq(bounded_vec.max_len(), 10);\n assert_eq(bounded_vec.len(), 2);\n assert_eq(bounded_vec.get(0), 1);\n assert_eq(bounded_vec.get(1), 2);\n }\n }\n\n mod trait_eq {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn empty_equality() {\n let mut bounded_vec1: BoundedVec = BoundedVec::new();\n let mut bounded_vec2: BoundedVec = BoundedVec::new();\n\n assert_eq(bounded_vec1, bounded_vec2);\n }\n\n #[test]\n fn inequality() {\n let mut bounded_vec1: BoundedVec = BoundedVec::new();\n let mut bounded_vec2: BoundedVec = BoundedVec::new();\n bounded_vec1.push(1);\n bounded_vec2.push(2);\n\n assert(bounded_vec1 != bounded_vec2);\n }\n }\n\n mod from_parts {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn from_parts() {\n // docs:start:from-parts\n let vec: BoundedVec = BoundedVec::from_parts([1, 2, 3, 0], 3);\n assert_eq(vec.len(), 3);\n\n // Any elements past the given length are zeroed out, so these\n // two BoundedVecs will be completely equal\n let vec1: BoundedVec = BoundedVec::from_parts([1, 2, 3, 1], 3);\n let vec2: BoundedVec = BoundedVec::from_parts([1, 2, 3, 2], 3);\n assert_eq(vec1, vec2);\n // docs:end:from-parts\n }\n\n #[test]\n fn from_parts_unchecked() {\n // docs:start:from-parts-unchecked\n let vec: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 0], 3);\n assert_eq(vec.len(), 3);\n\n // invalid use!\n let vec1: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 1], 3);\n let vec2: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 2], 3);\n\n // both vecs have length 3 so we'd expect them to be equal, but this\n // fails because elements past the length are still checked in eq\n assert(vec1 != vec2);\n // docs:end:from-parts-unchecked\n }\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_7612/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_7612/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 8a754765ba1..a2c9b87598b 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_7612/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_7612/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -71,9 +71,9 @@ expression: artifact "return value indices : []", "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 }]), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(2))], q_c: 0 })], outputs: []", "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(3), bit_size: Integer(U32), value: 3 }, 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(32837), source: Direct(32837), bit_size: Integer(U32) }, Cast { destination: Direct(32838), source: Direct(32838), bit_size: Integer(U1) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32836 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, 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) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 1 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(12) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 43 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Mov { destination: Relative(1), source: Relative(3) }, Mov { destination: Relative(2), source: Direct(32838) }, Call { location: 54 }, Call { location: 55 }, 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) } }, 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: 53 }, 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: 46 }, Return, Return, Call { location: 81 }, Not { destination: Relative(3), source: Relative(2), bit_size: U1 }, Cast { destination: Relative(2), source: Relative(3), bit_size: Integer(U32) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(2), rhs: Relative(3) }, JumpIf { condition: Relative(4), location: 80 }, Jump { location: 62 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Sub, bit_size: U32, lhs: Relative(2), rhs: Relative(4) }, BinaryIntOp { destination: Relative(6), op: LessThanEquals, bit_size: U32, lhs: Relative(4), rhs: Relative(2) }, JumpIf { condition: Relative(6), location: 67 }, Call { location: 87 }, BinaryIntOp { destination: Relative(2), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(3) }, JumpIf { condition: Relative(2), location: 70 }, Call { location: 90 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(2), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Relative(1) }, Const { destination: Relative(1), bit_size: Integer(U1), value: 1 }, JumpIf { condition: Relative(2), location: 79 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(3) } }, Jump { location: 80 }, 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: 86 }, 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: 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]" + "[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(3), bit_size: Integer(U32), value: 3 }, 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(32837), source: Direct(32837), bit_size: Integer(U32) }, Cast { destination: Direct(32838), source: Direct(32838), bit_size: Integer(U1) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32836 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, 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) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 1 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(12) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 43 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Mov { destination: Relative(1), source: Relative(3) }, Mov { destination: Relative(2), source: Direct(32838) }, Call { location: 54 }, Call { location: 55 }, 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) } }, 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: 53 }, 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: 46 }, Return, Return, Call { location: 71 }, Not { destination: Relative(3), source: Relative(2), bit_size: U1 }, Cast { destination: Relative(2), source: Relative(3), bit_size: Integer(U32) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(2), rhs: Relative(3) }, JumpIf { condition: Relative(4), location: 70 }, Jump { location: 62 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Sub, bit_size: U32, lhs: Relative(2), rhs: Relative(1) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, JumpIf { condition: Relative(5), location: 67 }, Call { location: 77 }, BinaryIntOp { destination: Relative(1), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, JumpIf { condition: Relative(1), location: 70 }, Call { location: 80 }, 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: 76 }, 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: 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": "pZLfioUgEIffZa69yMrSXiUirOwgiIWnFpbo3Xds6vy5WFj23Pg5jt+PAd1gMN16a60fpztU9QZdsM7ZW+umXi928ni6QRIXIaHiDIQ6UKRQpYiMkBMEoSCUBElQB0rMyhCckBIwJUfkBEEoCCUBU/J9Z3AN1i7BmDjXy6Q4/6yD8QtUfnWOwZd263HpPmt/cNEBuwkD4wckBo7Wmbjb2dNOfle5UKfMC/XQxd99lZ1+mqT/8WX58LPPfC7e/AYr3dvw9vZ7TApWd86c5bj6/qW7fM9X5/o7c5h6M6zBxKTnB8JHrvOMiaxhwPGklpzJIhY8FiWTqtnjGD8=", + "debug_symbols": "jZFBjoQgEEXvUmsWgo00XsUYg4odEoKGhkkmhrtPITrdvZhkNjw+xf9Uih1mPcbHYNyyPqHtdhi9sdY8BrtOKpjV4ekOVV74HVpKgMsDDYOWIeqCWwEvaApEwb0AfSwlAlfyELzWOfjtKWxgU167AK2L1hL4UjYel56bcgeD8litCGg3IzFwMVbnXSIvd/W3lXJ5mmkjf+38/35Zn35WsQ9/j0pNxn8ML+Ukb9Ro9SmX6Ka3avjerso1/M2vk56j1znp9QM46+5WE173BCiedIIS0WRBsxBEyD7lNn4A", "file_map": { "50": { "source": "pub struct Data {\n fields: [Field; 1],\n counter: u32,\n}\n\nfn main(array: call_data(0) [Data; 1], x: bool) {\n let index = if x { 0 } else { 1 };\n if index != 0 {\n assert(array[index - 1].counter < 3);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_7612/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_7612/execute__tests__force_brillig_true_inliner_0.snap index 8a754765ba1..a2c9b87598b 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_7612/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_7612/execute__tests__force_brillig_true_inliner_0.snap @@ -71,9 +71,9 @@ expression: artifact "return value indices : []", "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 }]), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(2))], q_c: 0 })], outputs: []", "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(3), bit_size: Integer(U32), value: 3 }, 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(32837), source: Direct(32837), bit_size: Integer(U32) }, Cast { destination: Direct(32838), source: Direct(32838), bit_size: Integer(U1) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32836 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, 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) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 1 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(12) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 43 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Mov { destination: Relative(1), source: Relative(3) }, Mov { destination: Relative(2), source: Direct(32838) }, Call { location: 54 }, Call { location: 55 }, 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) } }, 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: 53 }, 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: 46 }, Return, Return, Call { location: 81 }, Not { destination: Relative(3), source: Relative(2), bit_size: U1 }, Cast { destination: Relative(2), source: Relative(3), bit_size: Integer(U32) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(2), rhs: Relative(3) }, JumpIf { condition: Relative(4), location: 80 }, Jump { location: 62 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Sub, bit_size: U32, lhs: Relative(2), rhs: Relative(4) }, BinaryIntOp { destination: Relative(6), op: LessThanEquals, bit_size: U32, lhs: Relative(4), rhs: Relative(2) }, JumpIf { condition: Relative(6), location: 67 }, Call { location: 87 }, BinaryIntOp { destination: Relative(2), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(3) }, JumpIf { condition: Relative(2), location: 70 }, Call { location: 90 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(2), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Relative(1) }, Const { destination: Relative(1), bit_size: Integer(U1), value: 1 }, JumpIf { condition: Relative(2), location: 79 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(3) } }, Jump { location: 80 }, 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: 86 }, 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: 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]" + "[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(3), bit_size: Integer(U32), value: 3 }, 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(32837), source: Direct(32837), bit_size: Integer(U32) }, Cast { destination: Direct(32838), source: Direct(32838), bit_size: Integer(U1) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32836 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, 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) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 1 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(12) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 43 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Mov { destination: Relative(1), source: Relative(3) }, Mov { destination: Relative(2), source: Direct(32838) }, Call { location: 54 }, Call { location: 55 }, 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) } }, 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: 53 }, 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: 46 }, Return, Return, Call { location: 71 }, Not { destination: Relative(3), source: Relative(2), bit_size: U1 }, Cast { destination: Relative(2), source: Relative(3), bit_size: Integer(U32) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(2), rhs: Relative(3) }, JumpIf { condition: Relative(4), location: 70 }, Jump { location: 62 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Sub, bit_size: U32, lhs: Relative(2), rhs: Relative(1) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, JumpIf { condition: Relative(5), location: 67 }, Call { location: 77 }, BinaryIntOp { destination: Relative(1), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, JumpIf { condition: Relative(1), location: 70 }, Call { location: 80 }, 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: 76 }, 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: 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": "pZLfioUgEIffZa69yMrSXiUirOwgiIWnFpbo3Xds6vy5WFj23Pg5jt+PAd1gMN16a60fpztU9QZdsM7ZW+umXi928ni6QRIXIaHiDIQ6UKRQpYiMkBMEoSCUBElQB0rMyhCckBIwJUfkBEEoCCUBU/J9Z3AN1i7BmDjXy6Q4/6yD8QtUfnWOwZd263HpPmt/cNEBuwkD4wckBo7Wmbjb2dNOfle5UKfMC/XQxd99lZ1+mqT/8WX58LPPfC7e/AYr3dvw9vZ7TApWd86c5bj6/qW7fM9X5/o7c5h6M6zBxKTnB8JHrvOMiaxhwPGklpzJIhY8FiWTqtnjGD8=", + "debug_symbols": "jZFBjoQgEEXvUmsWgo00XsUYg4odEoKGhkkmhrtPITrdvZhkNjw+xf9Uih1mPcbHYNyyPqHtdhi9sdY8BrtOKpjV4ekOVV74HVpKgMsDDYOWIeqCWwEvaApEwb0AfSwlAlfyELzWOfjtKWxgU167AK2L1hL4UjYel56bcgeD8litCGg3IzFwMVbnXSIvd/W3lXJ5mmkjf+38/35Zn35WsQ9/j0pNxn8ML+Ukb9Ro9SmX6Ka3avjerso1/M2vk56j1znp9QM46+5WE173BCiedIIS0WRBsxBEyD7lNn4A", "file_map": { "50": { "source": "pub struct Data {\n fields: [Field; 1],\n counter: u32,\n}\n\nfn main(array: call_data(0) [Data; 1], x: bool) {\n let index = if x { 0 } else { 1 };\n if index != 0 {\n assert(array[index - 1].counter < 3);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_7612/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_7612/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 8a754765ba1..a2c9b87598b 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_7612/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_7612/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -71,9 +71,9 @@ expression: artifact "return value indices : []", "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 }]), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(2))], q_c: 0 })], outputs: []", "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(3), bit_size: Integer(U32), value: 3 }, 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(32837), source: Direct(32837), bit_size: Integer(U32) }, Cast { destination: Direct(32838), source: Direct(32838), bit_size: Integer(U1) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32836 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, 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) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 1 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(12) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 43 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Mov { destination: Relative(1), source: Relative(3) }, Mov { destination: Relative(2), source: Direct(32838) }, Call { location: 54 }, Call { location: 55 }, 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) } }, 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: 53 }, 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: 46 }, Return, Return, Call { location: 81 }, Not { destination: Relative(3), source: Relative(2), bit_size: U1 }, Cast { destination: Relative(2), source: Relative(3), bit_size: Integer(U32) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(2), rhs: Relative(3) }, JumpIf { condition: Relative(4), location: 80 }, Jump { location: 62 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Sub, bit_size: U32, lhs: Relative(2), rhs: Relative(4) }, BinaryIntOp { destination: Relative(6), op: LessThanEquals, bit_size: U32, lhs: Relative(4), rhs: Relative(2) }, JumpIf { condition: Relative(6), location: 67 }, Call { location: 87 }, BinaryIntOp { destination: Relative(2), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(3) }, JumpIf { condition: Relative(2), location: 70 }, Call { location: 90 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(2), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Relative(1) }, Const { destination: Relative(1), bit_size: Integer(U1), value: 1 }, JumpIf { condition: Relative(2), location: 79 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(3) } }, Jump { location: 80 }, 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: 86 }, 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: 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]" + "[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(3), bit_size: Integer(U32), value: 3 }, 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(32837), source: Direct(32837), bit_size: Integer(U32) }, Cast { destination: Direct(32838), source: Direct(32838), bit_size: Integer(U1) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32836 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, 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) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 1 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(12) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 43 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Mov { destination: Relative(1), source: Relative(3) }, Mov { destination: Relative(2), source: Direct(32838) }, Call { location: 54 }, Call { location: 55 }, 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) } }, 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: 53 }, 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: 46 }, Return, Return, Call { location: 71 }, Not { destination: Relative(3), source: Relative(2), bit_size: U1 }, Cast { destination: Relative(2), source: Relative(3), bit_size: Integer(U32) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(2), rhs: Relative(3) }, JumpIf { condition: Relative(4), location: 70 }, Jump { location: 62 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Sub, bit_size: U32, lhs: Relative(2), rhs: Relative(1) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, JumpIf { condition: Relative(5), location: 67 }, Call { location: 77 }, BinaryIntOp { destination: Relative(1), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, JumpIf { condition: Relative(1), location: 70 }, Call { location: 80 }, 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: 76 }, 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: 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": "pZLfioUgEIffZa69yMrSXiUirOwgiIWnFpbo3Xds6vy5WFj23Pg5jt+PAd1gMN16a60fpztU9QZdsM7ZW+umXi928ni6QRIXIaHiDIQ6UKRQpYiMkBMEoSCUBElQB0rMyhCckBIwJUfkBEEoCCUBU/J9Z3AN1i7BmDjXy6Q4/6yD8QtUfnWOwZd263HpPmt/cNEBuwkD4wckBo7Wmbjb2dNOfle5UKfMC/XQxd99lZ1+mqT/8WX58LPPfC7e/AYr3dvw9vZ7TApWd86c5bj6/qW7fM9X5/o7c5h6M6zBxKTnB8JHrvOMiaxhwPGklpzJIhY8FiWTqtnjGD8=", + "debug_symbols": "jZFBjoQgEEXvUmsWgo00XsUYg4odEoKGhkkmhrtPITrdvZhkNjw+xf9Uih1mPcbHYNyyPqHtdhi9sdY8BrtOKpjV4ekOVV74HVpKgMsDDYOWIeqCWwEvaApEwb0AfSwlAlfyELzWOfjtKWxgU167AK2L1hL4UjYel56bcgeD8litCGg3IzFwMVbnXSIvd/W3lXJ5mmkjf+38/35Zn35WsQ9/j0pNxn8ML+Ukb9Ro9SmX6Ka3avjerso1/M2vk56j1znp9QM46+5WE173BCiedIIS0WRBsxBEyD7lNn4A", "file_map": { "50": { "source": "pub struct Data {\n fields: [Field; 1],\n counter: u32,\n}\n\nfn main(array: call_data(0) [Data; 1], x: bool) {\n let index = if x { 0 } else { 1 };\n if index != 0 {\n assert(array[index - 1].counter < 3);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_7744/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_7744/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 879e8fb5882..1d0bdb31a52 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_7744/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_7744/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -57,19 +57,10 @@ expression: artifact "return value indices : [_1, _2, _3]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 })], outputs: [Simple(Witness(1)), Simple(Witness(2)), Simple(Witness(3))]", "unconstrained func 0", - "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32840 }, 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) }, Cast { destination: Direct(32836), source: Direct(32836), bit_size: Integer(U1) }, Mov { destination: Relative(1), source: Direct(32836) }, Call { location: 16 }, Call { location: 17 }, Mov { destination: Direct(32837), source: Relative(1) }, Mov { destination: Direct(32838), source: Relative(2) }, Mov { destination: Direct(32839), source: Relative(3) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 32837 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, Stop { return_data: HeapVector { pointer: Relative(4), size: Relative(5) } }, Return, Call { location: 50 }, Const { destination: Relative(5), bit_size: Field, value: 0 }, Const { destination: Relative(6), bit_size: Field, value: 5 }, Const { destination: Relative(7), bit_size: Integer(U1), value: 0 }, JumpIf { condition: Relative(1), location: 27 }, Jump { location: 23 }, Mov { destination: Relative(2), source: Relative(5) }, Mov { destination: Relative(3), source: Relative(6) }, Mov { destination: Relative(4), source: Relative(7) }, Jump { location: 46 }, Mov { destination: Relative(1), 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(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(5), input1_y: Relative(6), input1_infinite: Relative(7), input2_x: Relative(5), input2_y: Relative(6), input2_infinite: Relative(7), result: HeapArray { pointer: Relative(8), size: 3 } }), Const { destination: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(5) }, Load { destination: Relative(6), source_pointer: Relative(7) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(8) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(5) }, Load { destination: Relative(8), source_pointer: Relative(9) }, Mov { destination: Relative(2), source: Relative(6) }, Mov { destination: Relative(3), source: Relative(7) }, Mov { destination: Relative(4), source: Relative(8) }, Jump { location: 46 }, Mov { destination: Relative(1), source: Relative(2) }, Mov { destination: Relative(2), source: Relative(3) }, Mov { destination: Relative(3), 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: 55 }, 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(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32840 }, 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) }, Cast { destination: Direct(32836), source: Direct(32836), bit_size: Integer(U1) }, Mov { destination: Relative(1), source: Direct(32836) }, Call { location: 16 }, Call { location: 17 }, Mov { destination: Direct(32837), source: Relative(1) }, Mov { destination: Direct(32838), source: Relative(2) }, Mov { destination: Direct(32839), source: Relative(3) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 32837 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, Stop { return_data: HeapVector { pointer: Relative(4), size: Relative(5) } }, Return, Call { location: 28 }, JumpIf { condition: Relative(1), location: 28 }, Jump { location: 20 }, Const { destination: Relative(4), bit_size: Field, value: 0 }, Const { destination: Relative(5), bit_size: Field, value: 5 }, Const { destination: Relative(6), bit_size: Integer(U1), value: 0 }, Mov { destination: Relative(1), source: Relative(4) }, Mov { destination: Relative(2), source: Relative(5) }, Mov { destination: Relative(3), source: Relative(6) }, Jump { location: 27 }, 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: 33 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "nZHNroMgEIXfZdYs+JFafZWmMajYkBA0VG5yY3j3gqO1LrrpZr4ZhnNmklmg1214NMYN4xPq2wKtN9aaR2PHTs1mdOl1AZoDL6HmBPgVUa0QFMEQHCGgFgkFQiIuiBJxRVQrCopILiJGAvvwZvZa59kf26QdJ+W1m6F2wVoCf8qG9dNzUm7lrHzqUgLa9YnJcDBW5yySQ02/S3lVbWIhirdcnvXsu54xTsvNIeXy8GCXXz3Kk8c9Vaoz/nSnmN28Ua3VWzkE13105/9p7+x3nvzY6T54nZ2OY7MUb5ISKe8xT3sB", - "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", - "path": "std/embedded_curve_ops.nr" - }, - "50": { - "source": "// https://github.com/noir-lang/noir/issues/7744\n\nuse std::embedded_curve_ops::{embedded_curve_add_unsafe, EmbeddedCurvePoint};\n\n// is_active = false\nfn main(is_active: bool) -> pub EmbeddedCurvePoint {\n let bad = EmbeddedCurvePoint { x: 0, y: 5, is_infinite: false };\n if is_active {\n embedded_curve_add_unsafe(bad, bad)\n } else {\n bad\n }\n}\n", - "path": "" - } - }, + "debug_symbols": "XY7BCoMwDIbfJecetnkZvoqIxBqlENISW2GI775UJsguSf58Sf7sMNFYliHIHFdoux1GDcxhGTh6zCGKdffDwSWHrETWghu3rYRKkqGVwuxgQy7n0JpQzpxRjT4ckEyW7eAcmGp19CbQB/133FADjkw/ORfxN5o/6SLXx0mjp6ko1UuVwaOGp8Xu9XZN0x/V7Qs=", + "file_map": {}, "names": [ "main" ], diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_7744/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_7744/execute__tests__force_brillig_true_inliner_0.snap index 879e8fb5882..1d0bdb31a52 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_7744/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_7744/execute__tests__force_brillig_true_inliner_0.snap @@ -57,19 +57,10 @@ expression: artifact "return value indices : [_1, _2, _3]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 })], outputs: [Simple(Witness(1)), Simple(Witness(2)), Simple(Witness(3))]", "unconstrained func 0", - "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32840 }, 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) }, Cast { destination: Direct(32836), source: Direct(32836), bit_size: Integer(U1) }, Mov { destination: Relative(1), source: Direct(32836) }, Call { location: 16 }, Call { location: 17 }, Mov { destination: Direct(32837), source: Relative(1) }, Mov { destination: Direct(32838), source: Relative(2) }, Mov { destination: Direct(32839), source: Relative(3) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 32837 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, Stop { return_data: HeapVector { pointer: Relative(4), size: Relative(5) } }, Return, Call { location: 50 }, Const { destination: Relative(5), bit_size: Field, value: 0 }, Const { destination: Relative(6), bit_size: Field, value: 5 }, Const { destination: Relative(7), bit_size: Integer(U1), value: 0 }, JumpIf { condition: Relative(1), location: 27 }, Jump { location: 23 }, Mov { destination: Relative(2), source: Relative(5) }, Mov { destination: Relative(3), source: Relative(6) }, Mov { destination: Relative(4), source: Relative(7) }, Jump { location: 46 }, Mov { destination: Relative(1), 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(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(5), input1_y: Relative(6), input1_infinite: Relative(7), input2_x: Relative(5), input2_y: Relative(6), input2_infinite: Relative(7), result: HeapArray { pointer: Relative(8), size: 3 } }), Const { destination: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(5) }, Load { destination: Relative(6), source_pointer: Relative(7) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(8) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(5) }, Load { destination: Relative(8), source_pointer: Relative(9) }, Mov { destination: Relative(2), source: Relative(6) }, Mov { destination: Relative(3), source: Relative(7) }, Mov { destination: Relative(4), source: Relative(8) }, Jump { location: 46 }, Mov { destination: Relative(1), source: Relative(2) }, Mov { destination: Relative(2), source: Relative(3) }, Mov { destination: Relative(3), 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: 55 }, 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(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32840 }, 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) }, Cast { destination: Direct(32836), source: Direct(32836), bit_size: Integer(U1) }, Mov { destination: Relative(1), source: Direct(32836) }, Call { location: 16 }, Call { location: 17 }, Mov { destination: Direct(32837), source: Relative(1) }, Mov { destination: Direct(32838), source: Relative(2) }, Mov { destination: Direct(32839), source: Relative(3) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 32837 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, Stop { return_data: HeapVector { pointer: Relative(4), size: Relative(5) } }, Return, Call { location: 28 }, JumpIf { condition: Relative(1), location: 28 }, Jump { location: 20 }, Const { destination: Relative(4), bit_size: Field, value: 0 }, Const { destination: Relative(5), bit_size: Field, value: 5 }, Const { destination: Relative(6), bit_size: Integer(U1), value: 0 }, Mov { destination: Relative(1), source: Relative(4) }, Mov { destination: Relative(2), source: Relative(5) }, Mov { destination: Relative(3), source: Relative(6) }, Jump { location: 27 }, 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: 33 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "nZHNroMgEIXfZdYs+JFafZWmMajYkBA0VG5yY3j3gqO1LrrpZr4ZhnNmklmg1214NMYN4xPq2wKtN9aaR2PHTs1mdOl1AZoDL6HmBPgVUa0QFMEQHCGgFgkFQiIuiBJxRVQrCopILiJGAvvwZvZa59kf26QdJ+W1m6F2wVoCf8qG9dNzUm7lrHzqUgLa9YnJcDBW5yySQ02/S3lVbWIhirdcnvXsu54xTsvNIeXy8GCXXz3Kk8c9Vaoz/nSnmN28Ua3VWzkE13105/9p7+x3nvzY6T54nZ2OY7MUb5ISKe8xT3sB", - "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", - "path": "std/embedded_curve_ops.nr" - }, - "50": { - "source": "// https://github.com/noir-lang/noir/issues/7744\n\nuse std::embedded_curve_ops::{embedded_curve_add_unsafe, EmbeddedCurvePoint};\n\n// is_active = false\nfn main(is_active: bool) -> pub EmbeddedCurvePoint {\n let bad = EmbeddedCurvePoint { x: 0, y: 5, is_infinite: false };\n if is_active {\n embedded_curve_add_unsafe(bad, bad)\n } else {\n bad\n }\n}\n", - "path": "" - } - }, + "debug_symbols": "XY7BCoMwDIbfJecetnkZvoqIxBqlENISW2GI775UJsguSf58Sf7sMNFYliHIHFdoux1GDcxhGTh6zCGKdffDwSWHrETWghu3rYRKkqGVwuxgQy7n0JpQzpxRjT4ckEyW7eAcmGp19CbQB/133FADjkw/ORfxN5o/6SLXx0mjp6ko1UuVwaOGp8Xu9XZN0x/V7Qs=", + "file_map": {}, "names": [ "main" ], diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_7744/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_7744/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 879e8fb5882..1d0bdb31a52 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_7744/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_7744/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -57,19 +57,10 @@ expression: artifact "return value indices : [_1, _2, _3]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 })], outputs: [Simple(Witness(1)), Simple(Witness(2)), Simple(Witness(3))]", "unconstrained func 0", - "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32840 }, 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) }, Cast { destination: Direct(32836), source: Direct(32836), bit_size: Integer(U1) }, Mov { destination: Relative(1), source: Direct(32836) }, Call { location: 16 }, Call { location: 17 }, Mov { destination: Direct(32837), source: Relative(1) }, Mov { destination: Direct(32838), source: Relative(2) }, Mov { destination: Direct(32839), source: Relative(3) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 32837 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, Stop { return_data: HeapVector { pointer: Relative(4), size: Relative(5) } }, Return, Call { location: 50 }, Const { destination: Relative(5), bit_size: Field, value: 0 }, Const { destination: Relative(6), bit_size: Field, value: 5 }, Const { destination: Relative(7), bit_size: Integer(U1), value: 0 }, JumpIf { condition: Relative(1), location: 27 }, Jump { location: 23 }, Mov { destination: Relative(2), source: Relative(5) }, Mov { destination: Relative(3), source: Relative(6) }, Mov { destination: Relative(4), source: Relative(7) }, Jump { location: 46 }, Mov { destination: Relative(1), 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(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(5), input1_y: Relative(6), input1_infinite: Relative(7), input2_x: Relative(5), input2_y: Relative(6), input2_infinite: Relative(7), result: HeapArray { pointer: Relative(8), size: 3 } }), Const { destination: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(5) }, Load { destination: Relative(6), source_pointer: Relative(7) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(8) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(5) }, Load { destination: Relative(8), source_pointer: Relative(9) }, Mov { destination: Relative(2), source: Relative(6) }, Mov { destination: Relative(3), source: Relative(7) }, Mov { destination: Relative(4), source: Relative(8) }, Jump { location: 46 }, Mov { destination: Relative(1), source: Relative(2) }, Mov { destination: Relative(2), source: Relative(3) }, Mov { destination: Relative(3), 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: 55 }, 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(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32840 }, 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) }, Cast { destination: Direct(32836), source: Direct(32836), bit_size: Integer(U1) }, Mov { destination: Relative(1), source: Direct(32836) }, Call { location: 16 }, Call { location: 17 }, Mov { destination: Direct(32837), source: Relative(1) }, Mov { destination: Direct(32838), source: Relative(2) }, Mov { destination: Direct(32839), source: Relative(3) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 32837 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, Stop { return_data: HeapVector { pointer: Relative(4), size: Relative(5) } }, Return, Call { location: 28 }, JumpIf { condition: Relative(1), location: 28 }, Jump { location: 20 }, Const { destination: Relative(4), bit_size: Field, value: 0 }, Const { destination: Relative(5), bit_size: Field, value: 5 }, Const { destination: Relative(6), bit_size: Integer(U1), value: 0 }, Mov { destination: Relative(1), source: Relative(4) }, Mov { destination: Relative(2), source: Relative(5) }, Mov { destination: Relative(3), source: Relative(6) }, Jump { location: 27 }, 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: 33 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "nZHNroMgEIXfZdYs+JFafZWmMajYkBA0VG5yY3j3gqO1LrrpZr4ZhnNmklmg1214NMYN4xPq2wKtN9aaR2PHTs1mdOl1AZoDL6HmBPgVUa0QFMEQHCGgFgkFQiIuiBJxRVQrCopILiJGAvvwZvZa59kf26QdJ+W1m6F2wVoCf8qG9dNzUm7lrHzqUgLa9YnJcDBW5yySQ02/S3lVbWIhirdcnvXsu54xTsvNIeXy8GCXXz3Kk8c9Vaoz/nSnmN28Ua3VWzkE13105/9p7+x3nvzY6T54nZ2OY7MUb5ISKe8xT3sB", - "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", - "path": "std/embedded_curve_ops.nr" - }, - "50": { - "source": "// https://github.com/noir-lang/noir/issues/7744\n\nuse std::embedded_curve_ops::{embedded_curve_add_unsafe, EmbeddedCurvePoint};\n\n// is_active = false\nfn main(is_active: bool) -> pub EmbeddedCurvePoint {\n let bad = EmbeddedCurvePoint { x: 0, y: 5, is_infinite: false };\n if is_active {\n embedded_curve_add_unsafe(bad, bad)\n } else {\n bad\n }\n}\n", - "path": "" - } - }, + "debug_symbols": "XY7BCoMwDIbfJecetnkZvoqIxBqlENISW2GI775UJsguSf58Sf7sMNFYliHIHFdoux1GDcxhGTh6zCGKdffDwSWHrETWghu3rYRKkqGVwuxgQy7n0JpQzpxRjT4ckEyW7eAcmGp19CbQB/133FADjkw/ORfxN5o/6SLXx0mjp6ko1UuVwaOGp8Xu9XZN0x/V7Qs=", + "file_map": {}, "names": [ "main" ], diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/signed_div/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/signed_div/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index 4f078bf6487..919616adc2c 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/signed_div/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/signed_div/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -51,7 +51,7 @@ expression: artifact }, "bytecode": [ "func 0", - "current witness index : _329", + "current witness index : _139", "private parameters indices : [_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44]", "public parameters indices : []", "return value indices : []", @@ -250,312 +250,12 @@ expression: artifact "EXPR [ (-2, _123, _128) (256, _123) (1, _128) (-1, _138) 0 ]", "EXPR [ (-1, _137) (-1, _139) 1 ]", "EXPR [ (1, _134, _135) (-1, _14) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(16))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(140)), Simple(Witness(141))]", - "BLACKBOX::RANGE [(_140, 1)] []", - "BLACKBOX::RANGE [(_141, 7)] []", - "EXPR [ (1, _16) (-128, _140) (-1, _141) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(15))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(142)), Simple(Witness(143))]", - "BLACKBOX::RANGE [(_142, 1)] []", - "BLACKBOX::RANGE [(_143, 7)] []", - "EXPR [ (1, _15) (-128, _142) (-1, _143) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(16), Witness(140))], linear_combinations: [(1, Witness(16)), (256, Witness(140))], q_c: 0 })], outputs: [Simple(Witness(144))]", - "EXPR [ (-2, _16, _140) (1, _16) (256, _140) (-1, _145) 0 ]", - "EXPR [ (1, _144, _145) -1 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(15), Witness(142))], linear_combinations: [(1, Witness(15)), (256, Witness(142))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(145))], q_c: 0 })], outputs: [Simple(Witness(146)), Simple(Witness(147))]", - "BLACKBOX::RANGE [(_146, 8)] []", - "BLACKBOX::RANGE [(_147, 8)] []", - "EXPR [ (1, _145) (-1, _147) (-1, _148) -1 ]", - "BLACKBOX::RANGE [(_148, 8)] []", - "EXPR [ (-2, _15, _142) (-1, _145, _146) (1, _15) (256, _142) (-1, _147) 0 ]", - "EXPR [ (-1, _146) (-1, _149) 128 ]", - "EXPR [ (-2, _140, _142) (1, _140) (1, _142) (-1, _150) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(146))], q_c: 0 })], outputs: [Simple(Witness(151))]", - "EXPR [ (1, _146, _151) (1, _152) -1 ]", - "EXPR [ (1, _146, _152) 0 ]", - "EXPR [ (2, _149, _150) (1, _146) (-1, _153) 0 ]", - "EXPR [ (-1, _152) (-1, _154) 1 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(147))], q_c: 0 })], outputs: [Simple(Witness(155))]", - "EXPR [ (1, _147, _155) (1, _156) -1 ]", - "EXPR [ (1, _147, _156) 0 ]", - "EXPR [ (-2, _142, _147) (256, _142) (1, _147) (-1, _157) 0 ]", - "EXPR [ (-1, _156) (-1, _158) 1 ]", - "EXPR [ (1, _153, _154) (-1, _17) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(19))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(159)), Simple(Witness(160))]", - "BLACKBOX::RANGE [(_159, 1)] []", - "BLACKBOX::RANGE [(_160, 7)] []", - "EXPR [ (1, _19) (-128, _159) (-1, _160) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(18))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(161)), Simple(Witness(162))]", - "BLACKBOX::RANGE [(_161, 1)] []", - "BLACKBOX::RANGE [(_162, 7)] []", - "EXPR [ (1, _18) (-128, _161) (-1, _162) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(19), Witness(159))], linear_combinations: [(1, Witness(19)), (256, Witness(159))], q_c: 0 })], outputs: [Simple(Witness(163))]", - "EXPR [ (-2, _19, _159) (1, _19) (256, _159) (-1, _164) 0 ]", - "EXPR [ (1, _163, _164) -1 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(18), Witness(161))], linear_combinations: [(1, Witness(18)), (256, Witness(161))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(164))], q_c: 0 })], outputs: [Simple(Witness(165)), Simple(Witness(166))]", - "BLACKBOX::RANGE [(_165, 8)] []", - "BLACKBOX::RANGE [(_166, 8)] []", - "EXPR [ (1, _164) (-1, _166) (-1, _167) -1 ]", - "BLACKBOX::RANGE [(_167, 8)] []", - "EXPR [ (-2, _18, _161) (-1, _164, _165) (1, _18) (256, _161) (-1, _166) 0 ]", - "EXPR [ (-1, _165) (-1, _168) 128 ]", - "EXPR [ (-2, _159, _161) (1, _159) (1, _161) (-1, _169) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(165))], q_c: 0 })], outputs: [Simple(Witness(170))]", - "EXPR [ (1, _165, _170) (1, _171) -1 ]", - "EXPR [ (1, _165, _171) 0 ]", - "EXPR [ (2, _168, _169) (1, _165) (-1, _172) 0 ]", - "EXPR [ (-1, _171) (-1, _173) 1 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(166))], q_c: 0 })], outputs: [Simple(Witness(174))]", - "EXPR [ (1, _166, _174) (1, _175) -1 ]", - "EXPR [ (1, _166, _175) 0 ]", - "EXPR [ (-2, _161, _166) (256, _161) (1, _166) (-1, _176) 0 ]", - "EXPR [ (-1, _175) (-1, _177) 1 ]", - "EXPR [ (1, _172, _173) (-1, _20) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(22))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(178)), Simple(Witness(179))]", - "BLACKBOX::RANGE [(_178, 1)] []", - "BLACKBOX::RANGE [(_179, 7)] []", - "EXPR [ (1, _22) (-128, _178) (-1, _179) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(21))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(180)), Simple(Witness(181))]", - "BLACKBOX::RANGE [(_180, 1)] []", - "BLACKBOX::RANGE [(_181, 7)] []", - "EXPR [ (1, _21) (-128, _180) (-1, _181) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(22), Witness(178))], linear_combinations: [(1, Witness(22)), (256, Witness(178))], q_c: 0 })], outputs: [Simple(Witness(182))]", - "EXPR [ (-2, _22, _178) (1, _22) (256, _178) (-1, _183) 0 ]", - "EXPR [ (1, _182, _183) -1 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(21), Witness(180))], linear_combinations: [(1, Witness(21)), (256, Witness(180))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(183))], q_c: 0 })], outputs: [Simple(Witness(184)), Simple(Witness(185))]", - "BLACKBOX::RANGE [(_184, 8)] []", - "BLACKBOX::RANGE [(_185, 8)] []", - "EXPR [ (1, _183) (-1, _185) (-1, _186) -1 ]", - "BLACKBOX::RANGE [(_186, 8)] []", - "EXPR [ (-2, _21, _180) (-1, _183, _184) (1, _21) (256, _180) (-1, _185) 0 ]", - "EXPR [ (-1, _184) (-1, _187) 128 ]", - "EXPR [ (-2, _178, _180) (1, _178) (1, _180) (-1, _188) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(184))], q_c: 0 })], outputs: [Simple(Witness(189))]", - "EXPR [ (1, _184, _189) (1, _190) -1 ]", - "EXPR [ (1, _184, _190) 0 ]", - "EXPR [ (2, _187, _188) (1, _184) (-1, _191) 0 ]", - "EXPR [ (-1, _190) (-1, _192) 1 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(185))], q_c: 0 })], outputs: [Simple(Witness(193))]", - "EXPR [ (1, _185, _193) (1, _194) -1 ]", - "EXPR [ (1, _185, _194) 0 ]", - "EXPR [ (-2, _180, _185) (256, _180) (1, _185) (-1, _195) 0 ]", - "EXPR [ (-1, _194) (-1, _196) 1 ]", - "EXPR [ (1, _191, _192) (-1, _23) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(25))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(197)), Simple(Witness(198))]", - "BLACKBOX::RANGE [(_197, 1)] []", - "BLACKBOX::RANGE [(_198, 7)] []", - "EXPR [ (1, _25) (-128, _197) (-1, _198) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(24))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(199)), Simple(Witness(200))]", - "BLACKBOX::RANGE [(_199, 1)] []", - "BLACKBOX::RANGE [(_200, 7)] []", - "EXPR [ (1, _24) (-128, _199) (-1, _200) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(25), Witness(197))], linear_combinations: [(1, Witness(25)), (256, Witness(197))], q_c: 0 })], outputs: [Simple(Witness(201))]", - "EXPR [ (-2, _25, _197) (1, _25) (256, _197) (-1, _202) 0 ]", - "EXPR [ (1, _201, _202) -1 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(24), Witness(199))], linear_combinations: [(1, Witness(24)), (256, Witness(199))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(202))], q_c: 0 })], outputs: [Simple(Witness(203)), Simple(Witness(204))]", - "BLACKBOX::RANGE [(_203, 8)] []", - "BLACKBOX::RANGE [(_204, 8)] []", - "EXPR [ (1, _202) (-1, _204) (-1, _205) -1 ]", - "BLACKBOX::RANGE [(_205, 8)] []", - "EXPR [ (-2, _24, _199) (-1, _202, _203) (1, _24) (256, _199) (-1, _204) 0 ]", - "EXPR [ (-1, _203) (-1, _206) 128 ]", - "EXPR [ (-2, _197, _199) (1, _197) (1, _199) (-1, _207) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(203))], q_c: 0 })], outputs: [Simple(Witness(208))]", - "EXPR [ (1, _203, _208) (1, _209) -1 ]", - "EXPR [ (1, _203, _209) 0 ]", - "EXPR [ (2, _206, _207) (1, _203) (-1, _210) 0 ]", - "EXPR [ (-1, _209) (-1, _211) 1 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(204))], q_c: 0 })], outputs: [Simple(Witness(212))]", - "EXPR [ (1, _204, _212) (1, _213) -1 ]", - "EXPR [ (1, _204, _213) 0 ]", - "EXPR [ (-2, _199, _204) (256, _199) (1, _204) (-1, _214) 0 ]", - "EXPR [ (-1, _213) (-1, _215) 1 ]", - "EXPR [ (1, _210, _211) (-1, _26) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(28))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(216)), Simple(Witness(217))]", - "BLACKBOX::RANGE [(_216, 1)] []", - "BLACKBOX::RANGE [(_217, 7)] []", - "EXPR [ (1, _28) (-128, _216) (-1, _217) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(27))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(218)), Simple(Witness(219))]", - "BLACKBOX::RANGE [(_218, 1)] []", - "BLACKBOX::RANGE [(_219, 7)] []", - "EXPR [ (1, _27) (-128, _218) (-1, _219) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(28), Witness(216))], linear_combinations: [(1, Witness(28)), (256, Witness(216))], q_c: 0 })], outputs: [Simple(Witness(220))]", - "EXPR [ (-2, _28, _216) (1, _28) (256, _216) (-1, _221) 0 ]", - "EXPR [ (1, _220, _221) -1 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(27), Witness(218))], linear_combinations: [(1, Witness(27)), (256, Witness(218))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(221))], q_c: 0 })], outputs: [Simple(Witness(222)), Simple(Witness(223))]", - "BLACKBOX::RANGE [(_222, 8)] []", - "BLACKBOX::RANGE [(_223, 8)] []", - "EXPR [ (1, _221) (-1, _223) (-1, _224) -1 ]", - "BLACKBOX::RANGE [(_224, 8)] []", - "EXPR [ (-2, _27, _218) (-1, _221, _222) (1, _27) (256, _218) (-1, _223) 0 ]", - "EXPR [ (-1, _222) (-1, _225) 128 ]", - "EXPR [ (-2, _216, _218) (1, _216) (1, _218) (-1, _226) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(222))], q_c: 0 })], outputs: [Simple(Witness(227))]", - "EXPR [ (1, _222, _227) (1, _228) -1 ]", - "EXPR [ (1, _222, _228) 0 ]", - "EXPR [ (2, _225, _226) (1, _222) (-1, _229) 0 ]", - "EXPR [ (-1, _228) (-1, _230) 1 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(223))], q_c: 0 })], outputs: [Simple(Witness(231))]", - "EXPR [ (1, _223, _231) (1, _232) -1 ]", - "EXPR [ (1, _223, _232) 0 ]", - "EXPR [ (-2, _218, _223) (256, _218) (1, _223) (-1, _233) 0 ]", - "EXPR [ (-1, _232) (-1, _234) 1 ]", - "EXPR [ (1, _229, _230) (-1, _29) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(31))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(235)), Simple(Witness(236))]", - "BLACKBOX::RANGE [(_235, 1)] []", - "BLACKBOX::RANGE [(_236, 7)] []", - "EXPR [ (1, _31) (-128, _235) (-1, _236) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(30))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(237)), Simple(Witness(238))]", - "BLACKBOX::RANGE [(_237, 1)] []", - "BLACKBOX::RANGE [(_238, 7)] []", - "EXPR [ (1, _30) (-128, _237) (-1, _238) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(31), Witness(235))], linear_combinations: [(1, Witness(31)), (256, Witness(235))], q_c: 0 })], outputs: [Simple(Witness(239))]", - "EXPR [ (-2, _31, _235) (1, _31) (256, _235) (-1, _240) 0 ]", - "EXPR [ (1, _239, _240) -1 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(30), Witness(237))], linear_combinations: [(1, Witness(30)), (256, Witness(237))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(240))], q_c: 0 })], outputs: [Simple(Witness(241)), Simple(Witness(242))]", - "BLACKBOX::RANGE [(_241, 8)] []", - "BLACKBOX::RANGE [(_242, 8)] []", - "EXPR [ (1, _240) (-1, _242) (-1, _243) -1 ]", - "BLACKBOX::RANGE [(_243, 8)] []", - "EXPR [ (-2, _30, _237) (-1, _240, _241) (1, _30) (256, _237) (-1, _242) 0 ]", - "EXPR [ (-1, _241) (-1, _244) 128 ]", - "EXPR [ (-2, _235, _237) (1, _235) (1, _237) (-1, _245) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(241))], q_c: 0 })], outputs: [Simple(Witness(246))]", - "EXPR [ (1, _241, _246) (1, _247) -1 ]", - "EXPR [ (1, _241, _247) 0 ]", - "EXPR [ (2, _244, _245) (1, _241) (-1, _248) 0 ]", - "EXPR [ (-1, _247) (-1, _249) 1 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(242))], q_c: 0 })], outputs: [Simple(Witness(250))]", - "EXPR [ (1, _242, _250) (1, _251) -1 ]", - "EXPR [ (1, _242, _251) 0 ]", - "EXPR [ (-2, _237, _242) (256, _237) (1, _242) (-1, _252) 0 ]", - "EXPR [ (-1, _251) (-1, _253) 1 ]", - "EXPR [ (1, _248, _249) (-1, _32) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(34))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(254)), Simple(Witness(255))]", - "BLACKBOX::RANGE [(_254, 1)] []", - "BLACKBOX::RANGE [(_255, 7)] []", - "EXPR [ (1, _34) (-128, _254) (-1, _255) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(33))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(256)), Simple(Witness(257))]", - "BLACKBOX::RANGE [(_256, 1)] []", - "BLACKBOX::RANGE [(_257, 7)] []", - "EXPR [ (1, _33) (-128, _256) (-1, _257) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(34), Witness(254))], linear_combinations: [(1, Witness(34)), (256, Witness(254))], q_c: 0 })], outputs: [Simple(Witness(258))]", - "EXPR [ (-2, _34, _254) (1, _34) (256, _254) (-1, _259) 0 ]", - "EXPR [ (1, _258, _259) -1 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(33), Witness(256))], linear_combinations: [(1, Witness(33)), (256, Witness(256))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(259))], q_c: 0 })], outputs: [Simple(Witness(260)), Simple(Witness(261))]", - "BLACKBOX::RANGE [(_260, 8)] []", - "BLACKBOX::RANGE [(_261, 8)] []", - "EXPR [ (1, _259) (-1, _261) (-1, _262) -1 ]", - "BLACKBOX::RANGE [(_262, 8)] []", - "EXPR [ (-2, _33, _256) (-1, _259, _260) (1, _33) (256, _256) (-1, _261) 0 ]", - "EXPR [ (-1, _260) (-1, _263) 128 ]", - "EXPR [ (-2, _254, _256) (1, _254) (1, _256) (-1, _264) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(260))], q_c: 0 })], outputs: [Simple(Witness(265))]", - "EXPR [ (1, _260, _265) (1, _266) -1 ]", - "EXPR [ (1, _260, _266) 0 ]", - "EXPR [ (2, _263, _264) (1, _260) (-1, _267) 0 ]", - "EXPR [ (-1, _266) (-1, _268) 1 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(261))], q_c: 0 })], outputs: [Simple(Witness(269))]", - "EXPR [ (1, _261, _269) (1, _270) -1 ]", - "EXPR [ (1, _261, _270) 0 ]", - "EXPR [ (-2, _256, _261) (256, _256) (1, _261) (-1, _271) 0 ]", - "EXPR [ (-1, _270) (-1, _272) 1 ]", - "EXPR [ (1, _267, _268) (-1, _35) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(37))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(273)), Simple(Witness(274))]", - "BLACKBOX::RANGE [(_273, 1)] []", - "BLACKBOX::RANGE [(_274, 7)] []", - "EXPR [ (1, _37) (-128, _273) (-1, _274) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(36))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(275)), Simple(Witness(276))]", - "BLACKBOX::RANGE [(_275, 1)] []", - "BLACKBOX::RANGE [(_276, 7)] []", - "EXPR [ (1, _36) (-128, _275) (-1, _276) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(37), Witness(273))], linear_combinations: [(1, Witness(37)), (256, Witness(273))], q_c: 0 })], outputs: [Simple(Witness(277))]", - "EXPR [ (-2, _37, _273) (1, _37) (256, _273) (-1, _278) 0 ]", - "EXPR [ (1, _277, _278) -1 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(36), Witness(275))], linear_combinations: [(1, Witness(36)), (256, Witness(275))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(278))], q_c: 0 })], outputs: [Simple(Witness(279)), Simple(Witness(280))]", - "BLACKBOX::RANGE [(_279, 8)] []", - "BLACKBOX::RANGE [(_280, 8)] []", - "EXPR [ (1, _278) (-1, _280) (-1, _281) -1 ]", - "BLACKBOX::RANGE [(_281, 8)] []", - "EXPR [ (-2, _36, _275) (-1, _278, _279) (1, _36) (256, _275) (-1, _280) 0 ]", - "EXPR [ (-1, _279) (-1, _282) 128 ]", - "EXPR [ (-2, _273, _275) (1, _273) (1, _275) (-1, _283) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(279))], q_c: 0 })], outputs: [Simple(Witness(284))]", - "EXPR [ (1, _279, _284) (1, _285) -1 ]", - "EXPR [ (1, _279, _285) 0 ]", - "EXPR [ (2, _282, _283) (1, _279) (-1, _286) 0 ]", - "EXPR [ (-1, _285) (-1, _287) 1 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(280))], q_c: 0 })], outputs: [Simple(Witness(288))]", - "EXPR [ (1, _280, _288) (1, _289) -1 ]", - "EXPR [ (1, _280, _289) 0 ]", - "EXPR [ (-2, _275, _280) (256, _275) (1, _280) (-1, _290) 0 ]", - "EXPR [ (-1, _289) (-1, _291) 1 ]", - "EXPR [ (1, _286, _287) (-1, _38) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(40))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(292)), Simple(Witness(293))]", - "BLACKBOX::RANGE [(_292, 1)] []", - "BLACKBOX::RANGE [(_293, 7)] []", - "EXPR [ (1, _40) (-128, _292) (-1, _293) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(39))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(294)), Simple(Witness(295))]", - "BLACKBOX::RANGE [(_294, 1)] []", - "BLACKBOX::RANGE [(_295, 7)] []", - "EXPR [ (1, _39) (-128, _294) (-1, _295) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(40), Witness(292))], linear_combinations: [(1, Witness(40)), (256, Witness(292))], q_c: 0 })], outputs: [Simple(Witness(296))]", - "EXPR [ (-2, _40, _292) (1, _40) (256, _292) (-1, _297) 0 ]", - "EXPR [ (1, _296, _297) -1 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(39), Witness(294))], linear_combinations: [(1, Witness(39)), (256, Witness(294))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(297))], q_c: 0 })], outputs: [Simple(Witness(298)), Simple(Witness(299))]", - "BLACKBOX::RANGE [(_298, 8)] []", - "BLACKBOX::RANGE [(_299, 8)] []", - "EXPR [ (1, _297) (-1, _299) (-1, _300) -1 ]", - "BLACKBOX::RANGE [(_300, 8)] []", - "EXPR [ (-2, _39, _294) (-1, _297, _298) (1, _39) (256, _294) (-1, _299) 0 ]", - "EXPR [ (-1, _298) (-1, _301) 128 ]", - "EXPR [ (-2, _292, _294) (1, _292) (1, _294) (-1, _302) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(298))], q_c: 0 })], outputs: [Simple(Witness(303))]", - "EXPR [ (1, _298, _303) (1, _304) -1 ]", - "EXPR [ (1, _298, _304) 0 ]", - "EXPR [ (2, _301, _302) (1, _298) (-1, _305) 0 ]", - "EXPR [ (-1, _304) (-1, _306) 1 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(299))], q_c: 0 })], outputs: [Simple(Witness(307))]", - "EXPR [ (1, _299, _307) (1, _308) -1 ]", - "EXPR [ (1, _299, _308) 0 ]", - "EXPR [ (-2, _294, _299) (256, _294) (1, _299) (-1, _309) 0 ]", - "EXPR [ (-1, _308) (-1, _310) 1 ]", - "EXPR [ (1, _305, _306) (-1, _41) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(43))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(311)), Simple(Witness(312))]", - "BLACKBOX::RANGE [(_311, 1)] []", - "BLACKBOX::RANGE [(_312, 7)] []", - "EXPR [ (1, _43) (-128, _311) (-1, _312) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(42))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(313)), Simple(Witness(314))]", - "BLACKBOX::RANGE [(_313, 1)] []", - "BLACKBOX::RANGE [(_314, 7)] []", - "EXPR [ (1, _42) (-128, _313) (-1, _314) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(43), Witness(311))], linear_combinations: [(1, Witness(43)), (256, Witness(311))], q_c: 0 })], outputs: [Simple(Witness(315))]", - "EXPR [ (-2, _43, _311) (1, _43) (256, _311) (-1, _316) 0 ]", - "EXPR [ (1, _315, _316) -1 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(42), Witness(313))], linear_combinations: [(1, Witness(42)), (256, Witness(313))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(316))], q_c: 0 })], outputs: [Simple(Witness(317)), Simple(Witness(318))]", - "BLACKBOX::RANGE [(_317, 8)] []", - "BLACKBOX::RANGE [(_318, 8)] []", - "EXPR [ (1, _316) (-1, _318) (-1, _319) -1 ]", - "BLACKBOX::RANGE [(_319, 8)] []", - "EXPR [ (-2, _42, _313) (-1, _316, _317) (1, _42) (256, _313) (-1, _318) 0 ]", - "EXPR [ (-1, _317) (-1, _320) 128 ]", - "EXPR [ (-2, _311, _313) (1, _311) (1, _313) (-1, _321) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(317))], q_c: 0 })], outputs: [Simple(Witness(322))]", - "EXPR [ (1, _317, _322) (1, _323) -1 ]", - "EXPR [ (1, _317, _323) 0 ]", - "EXPR [ (2, _320, _321) (1, _317) (-1, _324) 0 ]", - "EXPR [ (-1, _323) (-1, _325) 1 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(318))], q_c: 0 })], outputs: [Simple(Witness(326))]", - "EXPR [ (1, _318, _326) (1, _327) -1 ]", - "EXPR [ (1, _318, _327) 0 ]", - "EXPR [ (-2, _313, _318) (256, _313) (1, _318) (-1, _328) 0 ]", - "EXPR [ (-1, _327) (-1, _329) 1 ]", - "EXPR [ (1, _324, _325) (-1, _44) 0 ]", "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) } }]", "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": "pdfdSiNpFIXhe8mxB9lrrfrzVoZBosYmEKJEHRjEe5+Y/dZ098HA0H20O6brNYX7ofJ9bB739+/f7g6np+fXze0fH5v78+F4PHy7Oz4/7N4Oz6fLTz8+bzbry7u3835/+dHmh/cvV73szvvT2+b29H483mz+2h3fr//p9WV3us633fny7vZmsz89XuYl+HQ47r/+9Xnz/ertf19aXri4Mvx7+fD/rx+0Xj/Mv3L9998/6leuH7NeP21/7/dP00/X/3l5tXs4nH/6i20ybG59s8nYY+ox91iuY9j2qB7q4R7p0ZWhK0NXhq4MXRm7MnZl7MrYlbErY1fGroxdGbsydmXqytSVqStTV6ZLZbiMrkxdmboydWXqytyVuStzV+auzP1Z5q7MXZm7Mndl7srSlaUrS1eWrixdWbqydGXpytKVpSu13TKLKaaZfVu1HXg9MifmzKRX9Ipe0St6FSa9olf0il7REz3REz3REz3REz3REz3RMz3TMz3TM/dreqZneqZneqEXeqEXeuHzsenFqhe7Xix7se3Fuhf7Xix8sfHFyhc7Xyx9sfXF2hd7Xyx+sfnF6he7XyP3y/YX61/sfwGgEFAQKAwUCAoFNfH5cFBAKCQUFAoLBYZCQ8Gh8FCAKEQUJAoTBYpCRcGicFHAKGTUwv1io8BR6Ch4FD6ED+FD+BA+tA1zYI7MiTkz6eFD+BA+hA/hQ/gQPoQP4UP4ED6ED+FD+JD6foUP4UP4ED6ED+FD+BA+hA+Zz4cP4UP4ED6ED+FD+BA+hA/hQ/gQPoQP4UP4ED6ED+FD+NDA/eJD+BA+hA/hQ/gQPoQP4UM8HIQP4UP4ED6ED+FD+BA+hA/hQ/gQPoQP4UP4ED6ED+FD+NDM/eJD+BA+hA/hQ/gQPoQP4UM8OoQP4UP4ED6ED+PD+DA+jA/jw/gwPowP48P4MD6MD+PD+HD1/RofxofxYXwYH8aH8WF8GB/m+WF8GB/Gh/FhfBgfxofxYXwYH8aH8WF8GB/Gh/FhfBgfxofD/eLD+DA+jA/jw/gwPowP48M8P4wP48P4MD6MD+PD+DA+jA/jw/gwPowP48P4MD6MD+PD+DBfo4wP48P4MD6MD+PD+DA+jA/z/DA+jA/jw/gwPowP48P4MD6MD+PD+DA+jA/jI/gIPoKP4CN8vwo+go/gI/gIPoKP4CP4CD7C8yP4CD6Cj+Aj+Ag+go/gI/gIPoKP4CP4CD6Cj+Aj+Ag+go/w/Sr4CD6Cj+Aj+Ag+go/gI/gIz4+sJ4n1KLGeJdbDBD6Cj+Aj+Ag+go/gI/gIPoKP4CP4CD6Cj+AjfL/KuJ506OEj+Ag+go/gI/gIPsLzI/jItB6d6OEj+Ag+go/gI/gIPoKP4CPzehajh4/gI/gIPoKPXL9ffX6dEM+H3f1x/9oH86f308MP5/S3v1/Wd9aT/Mv5+WH/+H7ef50Qr+9dzoz/AA==", + "debug_symbols": "pdXBbptAFIXhd2HtBWcGZoa8SlVF2MYREsIWsSNVVt692Od3kywqVenqBpP7GeRz4Frth+3l5XmcD8fX6unHtdou4zSNL8/Tcdefx+O8fnp931SPw+fzMgzrR9Wn8+vWqV+G+Vw9zZdp2lRv/XS5/9PrqZ/v89wv69l6Uw3zfp0reBin4fbX++Zju/77qmLHspr2z3r77/tteOy35Tv7H9+fwnf2U/PYz/X/fX/OX/Z/rkf9bly+/GJV01ZPcVM1ySN7FI/uPtraQx7BI3o0HlZaK62V1kprJVlJVpKVZCVZSVaSlWQlWUlWspVsJVvJVvKqtOuwkq1kK9lKtlKsFCvFSrFSfC3FSrFSrBQrxUpnpbPSWemsdFY6K52VzkpnpbOiumaKGZiR6dtS3XKcmJlZmHjCE57whKeGiSc84QlPeAEv4AW8gBfwAl7AC3gBL+BFvIgX8SJe5H4jXsSLeBEv4jV4DV6D1+A1XB9JF1EXWRdhF2kXcRd5F4EXiReRF5kXoRepF7EXuRfBF8kX0RfZV+J+Sb+Iv8i/KIBogKiA6IAogWiBMtdHD0QRRBNEFUQXRBlEG0QdRB9EIUQjRCVEJ0QpRCtELUQvRDFEM3Srxu3J/NYvY7+dBl4ch8u8+/QeOf86Pc483jSn5bgb9pdluD3B7ufWZ9pv", "file_map": { "50": { "source": "struct SignedDivOp {\n lhs: i8,\n rhs: i8,\n result: i8,\n}\n\nfn main(ops: [SignedDivOp; 15]) {\n for i in 0..15 {\n assert_eq(ops[i].lhs / ops[i].rhs, ops[i].result);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/signed_div/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/signed_div/execute__tests__force_brillig_false_inliner_0.snap index 4f078bf6487..919616adc2c 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/signed_div/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/signed_div/execute__tests__force_brillig_false_inliner_0.snap @@ -51,7 +51,7 @@ expression: artifact }, "bytecode": [ "func 0", - "current witness index : _329", + "current witness index : _139", "private parameters indices : [_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44]", "public parameters indices : []", "return value indices : []", @@ -250,312 +250,12 @@ expression: artifact "EXPR [ (-2, _123, _128) (256, _123) (1, _128) (-1, _138) 0 ]", "EXPR [ (-1, _137) (-1, _139) 1 ]", "EXPR [ (1, _134, _135) (-1, _14) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(16))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(140)), Simple(Witness(141))]", - "BLACKBOX::RANGE [(_140, 1)] []", - "BLACKBOX::RANGE [(_141, 7)] []", - "EXPR [ (1, _16) (-128, _140) (-1, _141) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(15))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(142)), Simple(Witness(143))]", - "BLACKBOX::RANGE [(_142, 1)] []", - "BLACKBOX::RANGE [(_143, 7)] []", - "EXPR [ (1, _15) (-128, _142) (-1, _143) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(16), Witness(140))], linear_combinations: [(1, Witness(16)), (256, Witness(140))], q_c: 0 })], outputs: [Simple(Witness(144))]", - "EXPR [ (-2, _16, _140) (1, _16) (256, _140) (-1, _145) 0 ]", - "EXPR [ (1, _144, _145) -1 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(15), Witness(142))], linear_combinations: [(1, Witness(15)), (256, Witness(142))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(145))], q_c: 0 })], outputs: [Simple(Witness(146)), Simple(Witness(147))]", - "BLACKBOX::RANGE [(_146, 8)] []", - "BLACKBOX::RANGE [(_147, 8)] []", - "EXPR [ (1, _145) (-1, _147) (-1, _148) -1 ]", - "BLACKBOX::RANGE [(_148, 8)] []", - "EXPR [ (-2, _15, _142) (-1, _145, _146) (1, _15) (256, _142) (-1, _147) 0 ]", - "EXPR [ (-1, _146) (-1, _149) 128 ]", - "EXPR [ (-2, _140, _142) (1, _140) (1, _142) (-1, _150) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(146))], q_c: 0 })], outputs: [Simple(Witness(151))]", - "EXPR [ (1, _146, _151) (1, _152) -1 ]", - "EXPR [ (1, _146, _152) 0 ]", - "EXPR [ (2, _149, _150) (1, _146) (-1, _153) 0 ]", - "EXPR [ (-1, _152) (-1, _154) 1 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(147))], q_c: 0 })], outputs: [Simple(Witness(155))]", - "EXPR [ (1, _147, _155) (1, _156) -1 ]", - "EXPR [ (1, _147, _156) 0 ]", - "EXPR [ (-2, _142, _147) (256, _142) (1, _147) (-1, _157) 0 ]", - "EXPR [ (-1, _156) (-1, _158) 1 ]", - "EXPR [ (1, _153, _154) (-1, _17) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(19))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(159)), Simple(Witness(160))]", - "BLACKBOX::RANGE [(_159, 1)] []", - "BLACKBOX::RANGE [(_160, 7)] []", - "EXPR [ (1, _19) (-128, _159) (-1, _160) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(18))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(161)), Simple(Witness(162))]", - "BLACKBOX::RANGE [(_161, 1)] []", - "BLACKBOX::RANGE [(_162, 7)] []", - "EXPR [ (1, _18) (-128, _161) (-1, _162) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(19), Witness(159))], linear_combinations: [(1, Witness(19)), (256, Witness(159))], q_c: 0 })], outputs: [Simple(Witness(163))]", - "EXPR [ (-2, _19, _159) (1, _19) (256, _159) (-1, _164) 0 ]", - "EXPR [ (1, _163, _164) -1 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(18), Witness(161))], linear_combinations: [(1, Witness(18)), (256, Witness(161))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(164))], q_c: 0 })], outputs: [Simple(Witness(165)), Simple(Witness(166))]", - "BLACKBOX::RANGE [(_165, 8)] []", - "BLACKBOX::RANGE [(_166, 8)] []", - "EXPR [ (1, _164) (-1, _166) (-1, _167) -1 ]", - "BLACKBOX::RANGE [(_167, 8)] []", - "EXPR [ (-2, _18, _161) (-1, _164, _165) (1, _18) (256, _161) (-1, _166) 0 ]", - "EXPR [ (-1, _165) (-1, _168) 128 ]", - "EXPR [ (-2, _159, _161) (1, _159) (1, _161) (-1, _169) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(165))], q_c: 0 })], outputs: [Simple(Witness(170))]", - "EXPR [ (1, _165, _170) (1, _171) -1 ]", - "EXPR [ (1, _165, _171) 0 ]", - "EXPR [ (2, _168, _169) (1, _165) (-1, _172) 0 ]", - "EXPR [ (-1, _171) (-1, _173) 1 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(166))], q_c: 0 })], outputs: [Simple(Witness(174))]", - "EXPR [ (1, _166, _174) (1, _175) -1 ]", - "EXPR [ (1, _166, _175) 0 ]", - "EXPR [ (-2, _161, _166) (256, _161) (1, _166) (-1, _176) 0 ]", - "EXPR [ (-1, _175) (-1, _177) 1 ]", - "EXPR [ (1, _172, _173) (-1, _20) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(22))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(178)), Simple(Witness(179))]", - "BLACKBOX::RANGE [(_178, 1)] []", - "BLACKBOX::RANGE [(_179, 7)] []", - "EXPR [ (1, _22) (-128, _178) (-1, _179) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(21))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(180)), Simple(Witness(181))]", - "BLACKBOX::RANGE [(_180, 1)] []", - "BLACKBOX::RANGE [(_181, 7)] []", - "EXPR [ (1, _21) (-128, _180) (-1, _181) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(22), Witness(178))], linear_combinations: [(1, Witness(22)), (256, Witness(178))], q_c: 0 })], outputs: [Simple(Witness(182))]", - "EXPR [ (-2, _22, _178) (1, _22) (256, _178) (-1, _183) 0 ]", - "EXPR [ (1, _182, _183) -1 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(21), Witness(180))], linear_combinations: [(1, Witness(21)), (256, Witness(180))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(183))], q_c: 0 })], outputs: [Simple(Witness(184)), Simple(Witness(185))]", - "BLACKBOX::RANGE [(_184, 8)] []", - "BLACKBOX::RANGE [(_185, 8)] []", - "EXPR [ (1, _183) (-1, _185) (-1, _186) -1 ]", - "BLACKBOX::RANGE [(_186, 8)] []", - "EXPR [ (-2, _21, _180) (-1, _183, _184) (1, _21) (256, _180) (-1, _185) 0 ]", - "EXPR [ (-1, _184) (-1, _187) 128 ]", - "EXPR [ (-2, _178, _180) (1, _178) (1, _180) (-1, _188) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(184))], q_c: 0 })], outputs: [Simple(Witness(189))]", - "EXPR [ (1, _184, _189) (1, _190) -1 ]", - "EXPR [ (1, _184, _190) 0 ]", - "EXPR [ (2, _187, _188) (1, _184) (-1, _191) 0 ]", - "EXPR [ (-1, _190) (-1, _192) 1 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(185))], q_c: 0 })], outputs: [Simple(Witness(193))]", - "EXPR [ (1, _185, _193) (1, _194) -1 ]", - "EXPR [ (1, _185, _194) 0 ]", - "EXPR [ (-2, _180, _185) (256, _180) (1, _185) (-1, _195) 0 ]", - "EXPR [ (-1, _194) (-1, _196) 1 ]", - "EXPR [ (1, _191, _192) (-1, _23) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(25))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(197)), Simple(Witness(198))]", - "BLACKBOX::RANGE [(_197, 1)] []", - "BLACKBOX::RANGE [(_198, 7)] []", - "EXPR [ (1, _25) (-128, _197) (-1, _198) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(24))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(199)), Simple(Witness(200))]", - "BLACKBOX::RANGE [(_199, 1)] []", - "BLACKBOX::RANGE [(_200, 7)] []", - "EXPR [ (1, _24) (-128, _199) (-1, _200) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(25), Witness(197))], linear_combinations: [(1, Witness(25)), (256, Witness(197))], q_c: 0 })], outputs: [Simple(Witness(201))]", - "EXPR [ (-2, _25, _197) (1, _25) (256, _197) (-1, _202) 0 ]", - "EXPR [ (1, _201, _202) -1 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(24), Witness(199))], linear_combinations: [(1, Witness(24)), (256, Witness(199))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(202))], q_c: 0 })], outputs: [Simple(Witness(203)), Simple(Witness(204))]", - "BLACKBOX::RANGE [(_203, 8)] []", - "BLACKBOX::RANGE [(_204, 8)] []", - "EXPR [ (1, _202) (-1, _204) (-1, _205) -1 ]", - "BLACKBOX::RANGE [(_205, 8)] []", - "EXPR [ (-2, _24, _199) (-1, _202, _203) (1, _24) (256, _199) (-1, _204) 0 ]", - "EXPR [ (-1, _203) (-1, _206) 128 ]", - "EXPR [ (-2, _197, _199) (1, _197) (1, _199) (-1, _207) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(203))], q_c: 0 })], outputs: [Simple(Witness(208))]", - "EXPR [ (1, _203, _208) (1, _209) -1 ]", - "EXPR [ (1, _203, _209) 0 ]", - "EXPR [ (2, _206, _207) (1, _203) (-1, _210) 0 ]", - "EXPR [ (-1, _209) (-1, _211) 1 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(204))], q_c: 0 })], outputs: [Simple(Witness(212))]", - "EXPR [ (1, _204, _212) (1, _213) -1 ]", - "EXPR [ (1, _204, _213) 0 ]", - "EXPR [ (-2, _199, _204) (256, _199) (1, _204) (-1, _214) 0 ]", - "EXPR [ (-1, _213) (-1, _215) 1 ]", - "EXPR [ (1, _210, _211) (-1, _26) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(28))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(216)), Simple(Witness(217))]", - "BLACKBOX::RANGE [(_216, 1)] []", - "BLACKBOX::RANGE [(_217, 7)] []", - "EXPR [ (1, _28) (-128, _216) (-1, _217) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(27))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(218)), Simple(Witness(219))]", - "BLACKBOX::RANGE [(_218, 1)] []", - "BLACKBOX::RANGE [(_219, 7)] []", - "EXPR [ (1, _27) (-128, _218) (-1, _219) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(28), Witness(216))], linear_combinations: [(1, Witness(28)), (256, Witness(216))], q_c: 0 })], outputs: [Simple(Witness(220))]", - "EXPR [ (-2, _28, _216) (1, _28) (256, _216) (-1, _221) 0 ]", - "EXPR [ (1, _220, _221) -1 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(27), Witness(218))], linear_combinations: [(1, Witness(27)), (256, Witness(218))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(221))], q_c: 0 })], outputs: [Simple(Witness(222)), Simple(Witness(223))]", - "BLACKBOX::RANGE [(_222, 8)] []", - "BLACKBOX::RANGE [(_223, 8)] []", - "EXPR [ (1, _221) (-1, _223) (-1, _224) -1 ]", - "BLACKBOX::RANGE [(_224, 8)] []", - "EXPR [ (-2, _27, _218) (-1, _221, _222) (1, _27) (256, _218) (-1, _223) 0 ]", - "EXPR [ (-1, _222) (-1, _225) 128 ]", - "EXPR [ (-2, _216, _218) (1, _216) (1, _218) (-1, _226) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(222))], q_c: 0 })], outputs: [Simple(Witness(227))]", - "EXPR [ (1, _222, _227) (1, _228) -1 ]", - "EXPR [ (1, _222, _228) 0 ]", - "EXPR [ (2, _225, _226) (1, _222) (-1, _229) 0 ]", - "EXPR [ (-1, _228) (-1, _230) 1 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(223))], q_c: 0 })], outputs: [Simple(Witness(231))]", - "EXPR [ (1, _223, _231) (1, _232) -1 ]", - "EXPR [ (1, _223, _232) 0 ]", - "EXPR [ (-2, _218, _223) (256, _218) (1, _223) (-1, _233) 0 ]", - "EXPR [ (-1, _232) (-1, _234) 1 ]", - "EXPR [ (1, _229, _230) (-1, _29) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(31))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(235)), Simple(Witness(236))]", - "BLACKBOX::RANGE [(_235, 1)] []", - "BLACKBOX::RANGE [(_236, 7)] []", - "EXPR [ (1, _31) (-128, _235) (-1, _236) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(30))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(237)), Simple(Witness(238))]", - "BLACKBOX::RANGE [(_237, 1)] []", - "BLACKBOX::RANGE [(_238, 7)] []", - "EXPR [ (1, _30) (-128, _237) (-1, _238) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(31), Witness(235))], linear_combinations: [(1, Witness(31)), (256, Witness(235))], q_c: 0 })], outputs: [Simple(Witness(239))]", - "EXPR [ (-2, _31, _235) (1, _31) (256, _235) (-1, _240) 0 ]", - "EXPR [ (1, _239, _240) -1 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(30), Witness(237))], linear_combinations: [(1, Witness(30)), (256, Witness(237))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(240))], q_c: 0 })], outputs: [Simple(Witness(241)), Simple(Witness(242))]", - "BLACKBOX::RANGE [(_241, 8)] []", - "BLACKBOX::RANGE [(_242, 8)] []", - "EXPR [ (1, _240) (-1, _242) (-1, _243) -1 ]", - "BLACKBOX::RANGE [(_243, 8)] []", - "EXPR [ (-2, _30, _237) (-1, _240, _241) (1, _30) (256, _237) (-1, _242) 0 ]", - "EXPR [ (-1, _241) (-1, _244) 128 ]", - "EXPR [ (-2, _235, _237) (1, _235) (1, _237) (-1, _245) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(241))], q_c: 0 })], outputs: [Simple(Witness(246))]", - "EXPR [ (1, _241, _246) (1, _247) -1 ]", - "EXPR [ (1, _241, _247) 0 ]", - "EXPR [ (2, _244, _245) (1, _241) (-1, _248) 0 ]", - "EXPR [ (-1, _247) (-1, _249) 1 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(242))], q_c: 0 })], outputs: [Simple(Witness(250))]", - "EXPR [ (1, _242, _250) (1, _251) -1 ]", - "EXPR [ (1, _242, _251) 0 ]", - "EXPR [ (-2, _237, _242) (256, _237) (1, _242) (-1, _252) 0 ]", - "EXPR [ (-1, _251) (-1, _253) 1 ]", - "EXPR [ (1, _248, _249) (-1, _32) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(34))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(254)), Simple(Witness(255))]", - "BLACKBOX::RANGE [(_254, 1)] []", - "BLACKBOX::RANGE [(_255, 7)] []", - "EXPR [ (1, _34) (-128, _254) (-1, _255) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(33))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(256)), Simple(Witness(257))]", - "BLACKBOX::RANGE [(_256, 1)] []", - "BLACKBOX::RANGE [(_257, 7)] []", - "EXPR [ (1, _33) (-128, _256) (-1, _257) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(34), Witness(254))], linear_combinations: [(1, Witness(34)), (256, Witness(254))], q_c: 0 })], outputs: [Simple(Witness(258))]", - "EXPR [ (-2, _34, _254) (1, _34) (256, _254) (-1, _259) 0 ]", - "EXPR [ (1, _258, _259) -1 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(33), Witness(256))], linear_combinations: [(1, Witness(33)), (256, Witness(256))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(259))], q_c: 0 })], outputs: [Simple(Witness(260)), Simple(Witness(261))]", - "BLACKBOX::RANGE [(_260, 8)] []", - "BLACKBOX::RANGE [(_261, 8)] []", - "EXPR [ (1, _259) (-1, _261) (-1, _262) -1 ]", - "BLACKBOX::RANGE [(_262, 8)] []", - "EXPR [ (-2, _33, _256) (-1, _259, _260) (1, _33) (256, _256) (-1, _261) 0 ]", - "EXPR [ (-1, _260) (-1, _263) 128 ]", - "EXPR [ (-2, _254, _256) (1, _254) (1, _256) (-1, _264) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(260))], q_c: 0 })], outputs: [Simple(Witness(265))]", - "EXPR [ (1, _260, _265) (1, _266) -1 ]", - "EXPR [ (1, _260, _266) 0 ]", - "EXPR [ (2, _263, _264) (1, _260) (-1, _267) 0 ]", - "EXPR [ (-1, _266) (-1, _268) 1 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(261))], q_c: 0 })], outputs: [Simple(Witness(269))]", - "EXPR [ (1, _261, _269) (1, _270) -1 ]", - "EXPR [ (1, _261, _270) 0 ]", - "EXPR [ (-2, _256, _261) (256, _256) (1, _261) (-1, _271) 0 ]", - "EXPR [ (-1, _270) (-1, _272) 1 ]", - "EXPR [ (1, _267, _268) (-1, _35) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(37))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(273)), Simple(Witness(274))]", - "BLACKBOX::RANGE [(_273, 1)] []", - "BLACKBOX::RANGE [(_274, 7)] []", - "EXPR [ (1, _37) (-128, _273) (-1, _274) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(36))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(275)), Simple(Witness(276))]", - "BLACKBOX::RANGE [(_275, 1)] []", - "BLACKBOX::RANGE [(_276, 7)] []", - "EXPR [ (1, _36) (-128, _275) (-1, _276) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(37), Witness(273))], linear_combinations: [(1, Witness(37)), (256, Witness(273))], q_c: 0 })], outputs: [Simple(Witness(277))]", - "EXPR [ (-2, _37, _273) (1, _37) (256, _273) (-1, _278) 0 ]", - "EXPR [ (1, _277, _278) -1 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(36), Witness(275))], linear_combinations: [(1, Witness(36)), (256, Witness(275))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(278))], q_c: 0 })], outputs: [Simple(Witness(279)), Simple(Witness(280))]", - "BLACKBOX::RANGE [(_279, 8)] []", - "BLACKBOX::RANGE [(_280, 8)] []", - "EXPR [ (1, _278) (-1, _280) (-1, _281) -1 ]", - "BLACKBOX::RANGE [(_281, 8)] []", - "EXPR [ (-2, _36, _275) (-1, _278, _279) (1, _36) (256, _275) (-1, _280) 0 ]", - "EXPR [ (-1, _279) (-1, _282) 128 ]", - "EXPR [ (-2, _273, _275) (1, _273) (1, _275) (-1, _283) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(279))], q_c: 0 })], outputs: [Simple(Witness(284))]", - "EXPR [ (1, _279, _284) (1, _285) -1 ]", - "EXPR [ (1, _279, _285) 0 ]", - "EXPR [ (2, _282, _283) (1, _279) (-1, _286) 0 ]", - "EXPR [ (-1, _285) (-1, _287) 1 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(280))], q_c: 0 })], outputs: [Simple(Witness(288))]", - "EXPR [ (1, _280, _288) (1, _289) -1 ]", - "EXPR [ (1, _280, _289) 0 ]", - "EXPR [ (-2, _275, _280) (256, _275) (1, _280) (-1, _290) 0 ]", - "EXPR [ (-1, _289) (-1, _291) 1 ]", - "EXPR [ (1, _286, _287) (-1, _38) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(40))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(292)), Simple(Witness(293))]", - "BLACKBOX::RANGE [(_292, 1)] []", - "BLACKBOX::RANGE [(_293, 7)] []", - "EXPR [ (1, _40) (-128, _292) (-1, _293) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(39))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(294)), Simple(Witness(295))]", - "BLACKBOX::RANGE [(_294, 1)] []", - "BLACKBOX::RANGE [(_295, 7)] []", - "EXPR [ (1, _39) (-128, _294) (-1, _295) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(40), Witness(292))], linear_combinations: [(1, Witness(40)), (256, Witness(292))], q_c: 0 })], outputs: [Simple(Witness(296))]", - "EXPR [ (-2, _40, _292) (1, _40) (256, _292) (-1, _297) 0 ]", - "EXPR [ (1, _296, _297) -1 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(39), Witness(294))], linear_combinations: [(1, Witness(39)), (256, Witness(294))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(297))], q_c: 0 })], outputs: [Simple(Witness(298)), Simple(Witness(299))]", - "BLACKBOX::RANGE [(_298, 8)] []", - "BLACKBOX::RANGE [(_299, 8)] []", - "EXPR [ (1, _297) (-1, _299) (-1, _300) -1 ]", - "BLACKBOX::RANGE [(_300, 8)] []", - "EXPR [ (-2, _39, _294) (-1, _297, _298) (1, _39) (256, _294) (-1, _299) 0 ]", - "EXPR [ (-1, _298) (-1, _301) 128 ]", - "EXPR [ (-2, _292, _294) (1, _292) (1, _294) (-1, _302) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(298))], q_c: 0 })], outputs: [Simple(Witness(303))]", - "EXPR [ (1, _298, _303) (1, _304) -1 ]", - "EXPR [ (1, _298, _304) 0 ]", - "EXPR [ (2, _301, _302) (1, _298) (-1, _305) 0 ]", - "EXPR [ (-1, _304) (-1, _306) 1 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(299))], q_c: 0 })], outputs: [Simple(Witness(307))]", - "EXPR [ (1, _299, _307) (1, _308) -1 ]", - "EXPR [ (1, _299, _308) 0 ]", - "EXPR [ (-2, _294, _299) (256, _294) (1, _299) (-1, _309) 0 ]", - "EXPR [ (-1, _308) (-1, _310) 1 ]", - "EXPR [ (1, _305, _306) (-1, _41) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(43))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(311)), Simple(Witness(312))]", - "BLACKBOX::RANGE [(_311, 1)] []", - "BLACKBOX::RANGE [(_312, 7)] []", - "EXPR [ (1, _43) (-128, _311) (-1, _312) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(42))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(313)), Simple(Witness(314))]", - "BLACKBOX::RANGE [(_313, 1)] []", - "BLACKBOX::RANGE [(_314, 7)] []", - "EXPR [ (1, _42) (-128, _313) (-1, _314) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(43), Witness(311))], linear_combinations: [(1, Witness(43)), (256, Witness(311))], q_c: 0 })], outputs: [Simple(Witness(315))]", - "EXPR [ (-2, _43, _311) (1, _43) (256, _311) (-1, _316) 0 ]", - "EXPR [ (1, _315, _316) -1 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(42), Witness(313))], linear_combinations: [(1, Witness(42)), (256, Witness(313))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(316))], q_c: 0 })], outputs: [Simple(Witness(317)), Simple(Witness(318))]", - "BLACKBOX::RANGE [(_317, 8)] []", - "BLACKBOX::RANGE [(_318, 8)] []", - "EXPR [ (1, _316) (-1, _318) (-1, _319) -1 ]", - "BLACKBOX::RANGE [(_319, 8)] []", - "EXPR [ (-2, _42, _313) (-1, _316, _317) (1, _42) (256, _313) (-1, _318) 0 ]", - "EXPR [ (-1, _317) (-1, _320) 128 ]", - "EXPR [ (-2, _311, _313) (1, _311) (1, _313) (-1, _321) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(317))], q_c: 0 })], outputs: [Simple(Witness(322))]", - "EXPR [ (1, _317, _322) (1, _323) -1 ]", - "EXPR [ (1, _317, _323) 0 ]", - "EXPR [ (2, _320, _321) (1, _317) (-1, _324) 0 ]", - "EXPR [ (-1, _323) (-1, _325) 1 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(318))], q_c: 0 })], outputs: [Simple(Witness(326))]", - "EXPR [ (1, _318, _326) (1, _327) -1 ]", - "EXPR [ (1, _318, _327) 0 ]", - "EXPR [ (-2, _313, _318) (256, _313) (1, _318) (-1, _328) 0 ]", - "EXPR [ (-1, _327) (-1, _329) 1 ]", - "EXPR [ (1, _324, _325) (-1, _44) 0 ]", "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) } }]", "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": "pdfdSiNpFIXhe8mxB9lrrfrzVoZBosYmEKJEHRjEe5+Y/dZ098HA0H20O6brNYX7ofJ9bB739+/f7g6np+fXze0fH5v78+F4PHy7Oz4/7N4Oz6fLTz8+bzbry7u3835/+dHmh/cvV73szvvT2+b29H483mz+2h3fr//p9WV3us633fny7vZmsz89XuYl+HQ47r/+9Xnz/ertf19aXri4Mvx7+fD/rx+0Xj/Mv3L9998/6leuH7NeP21/7/dP00/X/3l5tXs4nH/6i20ybG59s8nYY+ox91iuY9j2qB7q4R7p0ZWhK0NXhq4MXRm7MnZl7MrYlbErY1fGroxdGbsydmXqytSVqStTV6ZLZbiMrkxdmboydWXqytyVuStzV+auzP1Z5q7MXZm7Mndl7srSlaUrS1eWrixdWbqydGXpytKVpSu13TKLKaaZfVu1HXg9MifmzKRX9Ipe0St6FSa9olf0il7REz3REz3REz3REz3REz3RMz3TMz3TM/dreqZneqZneqEXeqEXeuHzsenFqhe7Xix7se3Fuhf7Xix8sfHFyhc7Xyx9sfXF2hd7Xyx+sfnF6he7XyP3y/YX61/sfwGgEFAQKAwUCAoFNfH5cFBAKCQUFAoLBYZCQ8Gh8FCAKEQUJAoTBYpCRcGicFHAKGTUwv1io8BR6Ch4FD6ED+FD+BA+tA1zYI7MiTkz6eFD+BA+hA/hQ/gQPoQP4UP4ED6ED+FD+JD6foUP4UP4ED6ED+FD+BA+hA+Zz4cP4UP4ED6ED+FD+BA+hA/hQ/gQPoQP4UP4ED6ED+FD+NDA/eJD+BA+hA/hQ/gQPoQP4UM8HIQP4UP4ED6ED+FD+BA+hA/hQ/gQPoQP4UP4ED6ED+FD+NDM/eJD+BA+hA/hQ/gQPoQP4UM8OoQP4UP4ED6ED+PD+DA+jA/jw/gwPowP48P4MD6MD+PD+HD1/RofxofxYXwYH8aH8WF8GB/m+WF8GB/Gh/FhfBgfxofxYXwYH8aH8WF8GB/Gh/FhfBgfxofD/eLD+DA+jA/jw/gwPowP48M8P4wP48P4MD6MD+PD+DA+jA/jw/gwPowP48P4MD6MD+PD+DBfo4wP48P4MD6MD+PD+DA+jA/z/DA+jA/jw/gwPowP48P4MD6MD+PD+DA+jA/jI/gIPoKP4CN8vwo+go/gI/gIPoKP4CP4CD7C8yP4CD6Cj+Aj+Ag+go/gI/gIPoKP4CP4CD6Cj+Aj+Ag+go/w/Sr4CD6Cj+Aj+Ag+go/gI/gIz4+sJ4n1KLGeJdbDBD6Cj+Aj+Ag+go/gI/gIPoKP4CP4CD6Cj+AjfL/KuJ506OEj+Ag+go/gI/gIPsLzI/jItB6d6OEj+Ag+go/gI/gIPoKP4CPzehajh4/gI/gIPoKPXL9ffX6dEM+H3f1x/9oH86f308MP5/S3v1/Wd9aT/Mv5+WH/+H7ef50Qr+9dzoz/AA==", + "debug_symbols": "pdXBbptAFIXhd2HtBWcGZoa8SlVF2MYREsIWsSNVVt692Od3kywqVenqBpP7GeRz4Frth+3l5XmcD8fX6unHtdou4zSNL8/Tcdefx+O8fnp931SPw+fzMgzrR9Wn8+vWqV+G+Vw9zZdp2lRv/XS5/9PrqZ/v89wv69l6Uw3zfp0reBin4fbX++Zju/77qmLHspr2z3r77/tteOy35Tv7H9+fwnf2U/PYz/X/fX/OX/Z/rkf9bly+/GJV01ZPcVM1ySN7FI/uPtraQx7BI3o0HlZaK62V1kprJVlJVpKVZCVZSVaSlWQlWUlWspVsJVvJVvKqtOuwkq1kK9lKtlKsFCvFSrFSfC3FSrFSrBQrxUpnpbPSWemsdFY6K52VzkpnpbOiumaKGZiR6dtS3XKcmJlZmHjCE57whKeGiSc84QlPeAEv4AW8gBfwAl7AC3gBL+BFvIgX8SJe5H4jXsSLeBEv4jV4DV6D1+A1XB9JF1EXWRdhF2kXcRd5F4EXiReRF5kXoRepF7EXuRfBF8kX0RfZV+J+Sb+Iv8i/KIBogKiA6IAogWiBMtdHD0QRRBNEFUQXRBlEG0QdRB9EIUQjRCVEJ0QpRCtELUQvRDFEM3Srxu3J/NYvY7+dBl4ch8u8+/QeOf86Pc483jSn5bgb9pdluD3B7ufWZ9pv", "file_map": { "50": { "source": "struct SignedDivOp {\n lhs: i8,\n rhs: i8,\n result: i8,\n}\n\nfn main(ops: [SignedDivOp; 15]) {\n for i in 0..15 {\n assert_eq(ops[i].lhs / ops[i].rhs, ops[i].result);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/signed_div/execute__tests__force_brillig_false_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/signed_div/execute__tests__force_brillig_false_inliner_9223372036854775807.snap index 4f078bf6487..919616adc2c 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/signed_div/execute__tests__force_brillig_false_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/signed_div/execute__tests__force_brillig_false_inliner_9223372036854775807.snap @@ -51,7 +51,7 @@ expression: artifact }, "bytecode": [ "func 0", - "current witness index : _329", + "current witness index : _139", "private parameters indices : [_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44]", "public parameters indices : []", "return value indices : []", @@ -250,312 +250,12 @@ expression: artifact "EXPR [ (-2, _123, _128) (256, _123) (1, _128) (-1, _138) 0 ]", "EXPR [ (-1, _137) (-1, _139) 1 ]", "EXPR [ (1, _134, _135) (-1, _14) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(16))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(140)), Simple(Witness(141))]", - "BLACKBOX::RANGE [(_140, 1)] []", - "BLACKBOX::RANGE [(_141, 7)] []", - "EXPR [ (1, _16) (-128, _140) (-1, _141) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(15))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(142)), Simple(Witness(143))]", - "BLACKBOX::RANGE [(_142, 1)] []", - "BLACKBOX::RANGE [(_143, 7)] []", - "EXPR [ (1, _15) (-128, _142) (-1, _143) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(16), Witness(140))], linear_combinations: [(1, Witness(16)), (256, Witness(140))], q_c: 0 })], outputs: [Simple(Witness(144))]", - "EXPR [ (-2, _16, _140) (1, _16) (256, _140) (-1, _145) 0 ]", - "EXPR [ (1, _144, _145) -1 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(15), Witness(142))], linear_combinations: [(1, Witness(15)), (256, Witness(142))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(145))], q_c: 0 })], outputs: [Simple(Witness(146)), Simple(Witness(147))]", - "BLACKBOX::RANGE [(_146, 8)] []", - "BLACKBOX::RANGE [(_147, 8)] []", - "EXPR [ (1, _145) (-1, _147) (-1, _148) -1 ]", - "BLACKBOX::RANGE [(_148, 8)] []", - "EXPR [ (-2, _15, _142) (-1, _145, _146) (1, _15) (256, _142) (-1, _147) 0 ]", - "EXPR [ (-1, _146) (-1, _149) 128 ]", - "EXPR [ (-2, _140, _142) (1, _140) (1, _142) (-1, _150) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(146))], q_c: 0 })], outputs: [Simple(Witness(151))]", - "EXPR [ (1, _146, _151) (1, _152) -1 ]", - "EXPR [ (1, _146, _152) 0 ]", - "EXPR [ (2, _149, _150) (1, _146) (-1, _153) 0 ]", - "EXPR [ (-1, _152) (-1, _154) 1 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(147))], q_c: 0 })], outputs: [Simple(Witness(155))]", - "EXPR [ (1, _147, _155) (1, _156) -1 ]", - "EXPR [ (1, _147, _156) 0 ]", - "EXPR [ (-2, _142, _147) (256, _142) (1, _147) (-1, _157) 0 ]", - "EXPR [ (-1, _156) (-1, _158) 1 ]", - "EXPR [ (1, _153, _154) (-1, _17) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(19))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(159)), Simple(Witness(160))]", - "BLACKBOX::RANGE [(_159, 1)] []", - "BLACKBOX::RANGE [(_160, 7)] []", - "EXPR [ (1, _19) (-128, _159) (-1, _160) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(18))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(161)), Simple(Witness(162))]", - "BLACKBOX::RANGE [(_161, 1)] []", - "BLACKBOX::RANGE [(_162, 7)] []", - "EXPR [ (1, _18) (-128, _161) (-1, _162) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(19), Witness(159))], linear_combinations: [(1, Witness(19)), (256, Witness(159))], q_c: 0 })], outputs: [Simple(Witness(163))]", - "EXPR [ (-2, _19, _159) (1, _19) (256, _159) (-1, _164) 0 ]", - "EXPR [ (1, _163, _164) -1 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(18), Witness(161))], linear_combinations: [(1, Witness(18)), (256, Witness(161))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(164))], q_c: 0 })], outputs: [Simple(Witness(165)), Simple(Witness(166))]", - "BLACKBOX::RANGE [(_165, 8)] []", - "BLACKBOX::RANGE [(_166, 8)] []", - "EXPR [ (1, _164) (-1, _166) (-1, _167) -1 ]", - "BLACKBOX::RANGE [(_167, 8)] []", - "EXPR [ (-2, _18, _161) (-1, _164, _165) (1, _18) (256, _161) (-1, _166) 0 ]", - "EXPR [ (-1, _165) (-1, _168) 128 ]", - "EXPR [ (-2, _159, _161) (1, _159) (1, _161) (-1, _169) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(165))], q_c: 0 })], outputs: [Simple(Witness(170))]", - "EXPR [ (1, _165, _170) (1, _171) -1 ]", - "EXPR [ (1, _165, _171) 0 ]", - "EXPR [ (2, _168, _169) (1, _165) (-1, _172) 0 ]", - "EXPR [ (-1, _171) (-1, _173) 1 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(166))], q_c: 0 })], outputs: [Simple(Witness(174))]", - "EXPR [ (1, _166, _174) (1, _175) -1 ]", - "EXPR [ (1, _166, _175) 0 ]", - "EXPR [ (-2, _161, _166) (256, _161) (1, _166) (-1, _176) 0 ]", - "EXPR [ (-1, _175) (-1, _177) 1 ]", - "EXPR [ (1, _172, _173) (-1, _20) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(22))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(178)), Simple(Witness(179))]", - "BLACKBOX::RANGE [(_178, 1)] []", - "BLACKBOX::RANGE [(_179, 7)] []", - "EXPR [ (1, _22) (-128, _178) (-1, _179) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(21))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(180)), Simple(Witness(181))]", - "BLACKBOX::RANGE [(_180, 1)] []", - "BLACKBOX::RANGE [(_181, 7)] []", - "EXPR [ (1, _21) (-128, _180) (-1, _181) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(22), Witness(178))], linear_combinations: [(1, Witness(22)), (256, Witness(178))], q_c: 0 })], outputs: [Simple(Witness(182))]", - "EXPR [ (-2, _22, _178) (1, _22) (256, _178) (-1, _183) 0 ]", - "EXPR [ (1, _182, _183) -1 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(21), Witness(180))], linear_combinations: [(1, Witness(21)), (256, Witness(180))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(183))], q_c: 0 })], outputs: [Simple(Witness(184)), Simple(Witness(185))]", - "BLACKBOX::RANGE [(_184, 8)] []", - "BLACKBOX::RANGE [(_185, 8)] []", - "EXPR [ (1, _183) (-1, _185) (-1, _186) -1 ]", - "BLACKBOX::RANGE [(_186, 8)] []", - "EXPR [ (-2, _21, _180) (-1, _183, _184) (1, _21) (256, _180) (-1, _185) 0 ]", - "EXPR [ (-1, _184) (-1, _187) 128 ]", - "EXPR [ (-2, _178, _180) (1, _178) (1, _180) (-1, _188) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(184))], q_c: 0 })], outputs: [Simple(Witness(189))]", - "EXPR [ (1, _184, _189) (1, _190) -1 ]", - "EXPR [ (1, _184, _190) 0 ]", - "EXPR [ (2, _187, _188) (1, _184) (-1, _191) 0 ]", - "EXPR [ (-1, _190) (-1, _192) 1 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(185))], q_c: 0 })], outputs: [Simple(Witness(193))]", - "EXPR [ (1, _185, _193) (1, _194) -1 ]", - "EXPR [ (1, _185, _194) 0 ]", - "EXPR [ (-2, _180, _185) (256, _180) (1, _185) (-1, _195) 0 ]", - "EXPR [ (-1, _194) (-1, _196) 1 ]", - "EXPR [ (1, _191, _192) (-1, _23) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(25))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(197)), Simple(Witness(198))]", - "BLACKBOX::RANGE [(_197, 1)] []", - "BLACKBOX::RANGE [(_198, 7)] []", - "EXPR [ (1, _25) (-128, _197) (-1, _198) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(24))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(199)), Simple(Witness(200))]", - "BLACKBOX::RANGE [(_199, 1)] []", - "BLACKBOX::RANGE [(_200, 7)] []", - "EXPR [ (1, _24) (-128, _199) (-1, _200) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(25), Witness(197))], linear_combinations: [(1, Witness(25)), (256, Witness(197))], q_c: 0 })], outputs: [Simple(Witness(201))]", - "EXPR [ (-2, _25, _197) (1, _25) (256, _197) (-1, _202) 0 ]", - "EXPR [ (1, _201, _202) -1 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(24), Witness(199))], linear_combinations: [(1, Witness(24)), (256, Witness(199))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(202))], q_c: 0 })], outputs: [Simple(Witness(203)), Simple(Witness(204))]", - "BLACKBOX::RANGE [(_203, 8)] []", - "BLACKBOX::RANGE [(_204, 8)] []", - "EXPR [ (1, _202) (-1, _204) (-1, _205) -1 ]", - "BLACKBOX::RANGE [(_205, 8)] []", - "EXPR [ (-2, _24, _199) (-1, _202, _203) (1, _24) (256, _199) (-1, _204) 0 ]", - "EXPR [ (-1, _203) (-1, _206) 128 ]", - "EXPR [ (-2, _197, _199) (1, _197) (1, _199) (-1, _207) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(203))], q_c: 0 })], outputs: [Simple(Witness(208))]", - "EXPR [ (1, _203, _208) (1, _209) -1 ]", - "EXPR [ (1, _203, _209) 0 ]", - "EXPR [ (2, _206, _207) (1, _203) (-1, _210) 0 ]", - "EXPR [ (-1, _209) (-1, _211) 1 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(204))], q_c: 0 })], outputs: [Simple(Witness(212))]", - "EXPR [ (1, _204, _212) (1, _213) -1 ]", - "EXPR [ (1, _204, _213) 0 ]", - "EXPR [ (-2, _199, _204) (256, _199) (1, _204) (-1, _214) 0 ]", - "EXPR [ (-1, _213) (-1, _215) 1 ]", - "EXPR [ (1, _210, _211) (-1, _26) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(28))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(216)), Simple(Witness(217))]", - "BLACKBOX::RANGE [(_216, 1)] []", - "BLACKBOX::RANGE [(_217, 7)] []", - "EXPR [ (1, _28) (-128, _216) (-1, _217) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(27))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(218)), Simple(Witness(219))]", - "BLACKBOX::RANGE [(_218, 1)] []", - "BLACKBOX::RANGE [(_219, 7)] []", - "EXPR [ (1, _27) (-128, _218) (-1, _219) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(28), Witness(216))], linear_combinations: [(1, Witness(28)), (256, Witness(216))], q_c: 0 })], outputs: [Simple(Witness(220))]", - "EXPR [ (-2, _28, _216) (1, _28) (256, _216) (-1, _221) 0 ]", - "EXPR [ (1, _220, _221) -1 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(27), Witness(218))], linear_combinations: [(1, Witness(27)), (256, Witness(218))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(221))], q_c: 0 })], outputs: [Simple(Witness(222)), Simple(Witness(223))]", - "BLACKBOX::RANGE [(_222, 8)] []", - "BLACKBOX::RANGE [(_223, 8)] []", - "EXPR [ (1, _221) (-1, _223) (-1, _224) -1 ]", - "BLACKBOX::RANGE [(_224, 8)] []", - "EXPR [ (-2, _27, _218) (-1, _221, _222) (1, _27) (256, _218) (-1, _223) 0 ]", - "EXPR [ (-1, _222) (-1, _225) 128 ]", - "EXPR [ (-2, _216, _218) (1, _216) (1, _218) (-1, _226) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(222))], q_c: 0 })], outputs: [Simple(Witness(227))]", - "EXPR [ (1, _222, _227) (1, _228) -1 ]", - "EXPR [ (1, _222, _228) 0 ]", - "EXPR [ (2, _225, _226) (1, _222) (-1, _229) 0 ]", - "EXPR [ (-1, _228) (-1, _230) 1 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(223))], q_c: 0 })], outputs: [Simple(Witness(231))]", - "EXPR [ (1, _223, _231) (1, _232) -1 ]", - "EXPR [ (1, _223, _232) 0 ]", - "EXPR [ (-2, _218, _223) (256, _218) (1, _223) (-1, _233) 0 ]", - "EXPR [ (-1, _232) (-1, _234) 1 ]", - "EXPR [ (1, _229, _230) (-1, _29) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(31))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(235)), Simple(Witness(236))]", - "BLACKBOX::RANGE [(_235, 1)] []", - "BLACKBOX::RANGE [(_236, 7)] []", - "EXPR [ (1, _31) (-128, _235) (-1, _236) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(30))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(237)), Simple(Witness(238))]", - "BLACKBOX::RANGE [(_237, 1)] []", - "BLACKBOX::RANGE [(_238, 7)] []", - "EXPR [ (1, _30) (-128, _237) (-1, _238) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(31), Witness(235))], linear_combinations: [(1, Witness(31)), (256, Witness(235))], q_c: 0 })], outputs: [Simple(Witness(239))]", - "EXPR [ (-2, _31, _235) (1, _31) (256, _235) (-1, _240) 0 ]", - "EXPR [ (1, _239, _240) -1 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(30), Witness(237))], linear_combinations: [(1, Witness(30)), (256, Witness(237))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(240))], q_c: 0 })], outputs: [Simple(Witness(241)), Simple(Witness(242))]", - "BLACKBOX::RANGE [(_241, 8)] []", - "BLACKBOX::RANGE [(_242, 8)] []", - "EXPR [ (1, _240) (-1, _242) (-1, _243) -1 ]", - "BLACKBOX::RANGE [(_243, 8)] []", - "EXPR [ (-2, _30, _237) (-1, _240, _241) (1, _30) (256, _237) (-1, _242) 0 ]", - "EXPR [ (-1, _241) (-1, _244) 128 ]", - "EXPR [ (-2, _235, _237) (1, _235) (1, _237) (-1, _245) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(241))], q_c: 0 })], outputs: [Simple(Witness(246))]", - "EXPR [ (1, _241, _246) (1, _247) -1 ]", - "EXPR [ (1, _241, _247) 0 ]", - "EXPR [ (2, _244, _245) (1, _241) (-1, _248) 0 ]", - "EXPR [ (-1, _247) (-1, _249) 1 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(242))], q_c: 0 })], outputs: [Simple(Witness(250))]", - "EXPR [ (1, _242, _250) (1, _251) -1 ]", - "EXPR [ (1, _242, _251) 0 ]", - "EXPR [ (-2, _237, _242) (256, _237) (1, _242) (-1, _252) 0 ]", - "EXPR [ (-1, _251) (-1, _253) 1 ]", - "EXPR [ (1, _248, _249) (-1, _32) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(34))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(254)), Simple(Witness(255))]", - "BLACKBOX::RANGE [(_254, 1)] []", - "BLACKBOX::RANGE [(_255, 7)] []", - "EXPR [ (1, _34) (-128, _254) (-1, _255) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(33))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(256)), Simple(Witness(257))]", - "BLACKBOX::RANGE [(_256, 1)] []", - "BLACKBOX::RANGE [(_257, 7)] []", - "EXPR [ (1, _33) (-128, _256) (-1, _257) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(34), Witness(254))], linear_combinations: [(1, Witness(34)), (256, Witness(254))], q_c: 0 })], outputs: [Simple(Witness(258))]", - "EXPR [ (-2, _34, _254) (1, _34) (256, _254) (-1, _259) 0 ]", - "EXPR [ (1, _258, _259) -1 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(33), Witness(256))], linear_combinations: [(1, Witness(33)), (256, Witness(256))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(259))], q_c: 0 })], outputs: [Simple(Witness(260)), Simple(Witness(261))]", - "BLACKBOX::RANGE [(_260, 8)] []", - "BLACKBOX::RANGE [(_261, 8)] []", - "EXPR [ (1, _259) (-1, _261) (-1, _262) -1 ]", - "BLACKBOX::RANGE [(_262, 8)] []", - "EXPR [ (-2, _33, _256) (-1, _259, _260) (1, _33) (256, _256) (-1, _261) 0 ]", - "EXPR [ (-1, _260) (-1, _263) 128 ]", - "EXPR [ (-2, _254, _256) (1, _254) (1, _256) (-1, _264) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(260))], q_c: 0 })], outputs: [Simple(Witness(265))]", - "EXPR [ (1, _260, _265) (1, _266) -1 ]", - "EXPR [ (1, _260, _266) 0 ]", - "EXPR [ (2, _263, _264) (1, _260) (-1, _267) 0 ]", - "EXPR [ (-1, _266) (-1, _268) 1 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(261))], q_c: 0 })], outputs: [Simple(Witness(269))]", - "EXPR [ (1, _261, _269) (1, _270) -1 ]", - "EXPR [ (1, _261, _270) 0 ]", - "EXPR [ (-2, _256, _261) (256, _256) (1, _261) (-1, _271) 0 ]", - "EXPR [ (-1, _270) (-1, _272) 1 ]", - "EXPR [ (1, _267, _268) (-1, _35) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(37))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(273)), Simple(Witness(274))]", - "BLACKBOX::RANGE [(_273, 1)] []", - "BLACKBOX::RANGE [(_274, 7)] []", - "EXPR [ (1, _37) (-128, _273) (-1, _274) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(36))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(275)), Simple(Witness(276))]", - "BLACKBOX::RANGE [(_275, 1)] []", - "BLACKBOX::RANGE [(_276, 7)] []", - "EXPR [ (1, _36) (-128, _275) (-1, _276) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(37), Witness(273))], linear_combinations: [(1, Witness(37)), (256, Witness(273))], q_c: 0 })], outputs: [Simple(Witness(277))]", - "EXPR [ (-2, _37, _273) (1, _37) (256, _273) (-1, _278) 0 ]", - "EXPR [ (1, _277, _278) -1 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(36), Witness(275))], linear_combinations: [(1, Witness(36)), (256, Witness(275))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(278))], q_c: 0 })], outputs: [Simple(Witness(279)), Simple(Witness(280))]", - "BLACKBOX::RANGE [(_279, 8)] []", - "BLACKBOX::RANGE [(_280, 8)] []", - "EXPR [ (1, _278) (-1, _280) (-1, _281) -1 ]", - "BLACKBOX::RANGE [(_281, 8)] []", - "EXPR [ (-2, _36, _275) (-1, _278, _279) (1, _36) (256, _275) (-1, _280) 0 ]", - "EXPR [ (-1, _279) (-1, _282) 128 ]", - "EXPR [ (-2, _273, _275) (1, _273) (1, _275) (-1, _283) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(279))], q_c: 0 })], outputs: [Simple(Witness(284))]", - "EXPR [ (1, _279, _284) (1, _285) -1 ]", - "EXPR [ (1, _279, _285) 0 ]", - "EXPR [ (2, _282, _283) (1, _279) (-1, _286) 0 ]", - "EXPR [ (-1, _285) (-1, _287) 1 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(280))], q_c: 0 })], outputs: [Simple(Witness(288))]", - "EXPR [ (1, _280, _288) (1, _289) -1 ]", - "EXPR [ (1, _280, _289) 0 ]", - "EXPR [ (-2, _275, _280) (256, _275) (1, _280) (-1, _290) 0 ]", - "EXPR [ (-1, _289) (-1, _291) 1 ]", - "EXPR [ (1, _286, _287) (-1, _38) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(40))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(292)), Simple(Witness(293))]", - "BLACKBOX::RANGE [(_292, 1)] []", - "BLACKBOX::RANGE [(_293, 7)] []", - "EXPR [ (1, _40) (-128, _292) (-1, _293) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(39))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(294)), Simple(Witness(295))]", - "BLACKBOX::RANGE [(_294, 1)] []", - "BLACKBOX::RANGE [(_295, 7)] []", - "EXPR [ (1, _39) (-128, _294) (-1, _295) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(40), Witness(292))], linear_combinations: [(1, Witness(40)), (256, Witness(292))], q_c: 0 })], outputs: [Simple(Witness(296))]", - "EXPR [ (-2, _40, _292) (1, _40) (256, _292) (-1, _297) 0 ]", - "EXPR [ (1, _296, _297) -1 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(39), Witness(294))], linear_combinations: [(1, Witness(39)), (256, Witness(294))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(297))], q_c: 0 })], outputs: [Simple(Witness(298)), Simple(Witness(299))]", - "BLACKBOX::RANGE [(_298, 8)] []", - "BLACKBOX::RANGE [(_299, 8)] []", - "EXPR [ (1, _297) (-1, _299) (-1, _300) -1 ]", - "BLACKBOX::RANGE [(_300, 8)] []", - "EXPR [ (-2, _39, _294) (-1, _297, _298) (1, _39) (256, _294) (-1, _299) 0 ]", - "EXPR [ (-1, _298) (-1, _301) 128 ]", - "EXPR [ (-2, _292, _294) (1, _292) (1, _294) (-1, _302) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(298))], q_c: 0 })], outputs: [Simple(Witness(303))]", - "EXPR [ (1, _298, _303) (1, _304) -1 ]", - "EXPR [ (1, _298, _304) 0 ]", - "EXPR [ (2, _301, _302) (1, _298) (-1, _305) 0 ]", - "EXPR [ (-1, _304) (-1, _306) 1 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(299))], q_c: 0 })], outputs: [Simple(Witness(307))]", - "EXPR [ (1, _299, _307) (1, _308) -1 ]", - "EXPR [ (1, _299, _308) 0 ]", - "EXPR [ (-2, _294, _299) (256, _294) (1, _299) (-1, _309) 0 ]", - "EXPR [ (-1, _308) (-1, _310) 1 ]", - "EXPR [ (1, _305, _306) (-1, _41) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(43))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(311)), Simple(Witness(312))]", - "BLACKBOX::RANGE [(_311, 1)] []", - "BLACKBOX::RANGE [(_312, 7)] []", - "EXPR [ (1, _43) (-128, _311) (-1, _312) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(42))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(313)), Simple(Witness(314))]", - "BLACKBOX::RANGE [(_313, 1)] []", - "BLACKBOX::RANGE [(_314, 7)] []", - "EXPR [ (1, _42) (-128, _313) (-1, _314) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(43), Witness(311))], linear_combinations: [(1, Witness(43)), (256, Witness(311))], q_c: 0 })], outputs: [Simple(Witness(315))]", - "EXPR [ (-2, _43, _311) (1, _43) (256, _311) (-1, _316) 0 ]", - "EXPR [ (1, _315, _316) -1 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(42), Witness(313))], linear_combinations: [(1, Witness(42)), (256, Witness(313))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(316))], q_c: 0 })], outputs: [Simple(Witness(317)), Simple(Witness(318))]", - "BLACKBOX::RANGE [(_317, 8)] []", - "BLACKBOX::RANGE [(_318, 8)] []", - "EXPR [ (1, _316) (-1, _318) (-1, _319) -1 ]", - "BLACKBOX::RANGE [(_319, 8)] []", - "EXPR [ (-2, _42, _313) (-1, _316, _317) (1, _42) (256, _313) (-1, _318) 0 ]", - "EXPR [ (-1, _317) (-1, _320) 128 ]", - "EXPR [ (-2, _311, _313) (1, _311) (1, _313) (-1, _321) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(317))], q_c: 0 })], outputs: [Simple(Witness(322))]", - "EXPR [ (1, _317, _322) (1, _323) -1 ]", - "EXPR [ (1, _317, _323) 0 ]", - "EXPR [ (2, _320, _321) (1, _317) (-1, _324) 0 ]", - "EXPR [ (-1, _323) (-1, _325) 1 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(318))], q_c: 0 })], outputs: [Simple(Witness(326))]", - "EXPR [ (1, _318, _326) (1, _327) -1 ]", - "EXPR [ (1, _318, _327) 0 ]", - "EXPR [ (-2, _313, _318) (256, _313) (1, _318) (-1, _328) 0 ]", - "EXPR [ (-1, _327) (-1, _329) 1 ]", - "EXPR [ (1, _324, _325) (-1, _44) 0 ]", "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) } }]", "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": "pdfdSiNpFIXhe8mxB9lrrfrzVoZBosYmEKJEHRjEe5+Y/dZ098HA0H20O6brNYX7ofJ9bB739+/f7g6np+fXze0fH5v78+F4PHy7Oz4/7N4Oz6fLTz8+bzbry7u3835/+dHmh/cvV73szvvT2+b29H483mz+2h3fr//p9WV3us633fny7vZmsz89XuYl+HQ47r/+9Xnz/ertf19aXri4Mvx7+fD/rx+0Xj/Mv3L9998/6leuH7NeP21/7/dP00/X/3l5tXs4nH/6i20ybG59s8nYY+ox91iuY9j2qB7q4R7p0ZWhK0NXhq4MXRm7MnZl7MrYlbErY1fGroxdGbsydmXqytSVqStTV6ZLZbiMrkxdmboydWXqytyVuStzV+auzP1Z5q7MXZm7Mndl7srSlaUrS1eWrixdWbqydGXpytKVpSu13TKLKaaZfVu1HXg9MifmzKRX9Ipe0St6FSa9olf0il7REz3REz3REz3REz3REz3RMz3TMz3TM/dreqZneqZneqEXeqEXeuHzsenFqhe7Xix7se3Fuhf7Xix8sfHFyhc7Xyx9sfXF2hd7Xyx+sfnF6he7XyP3y/YX61/sfwGgEFAQKAwUCAoFNfH5cFBAKCQUFAoLBYZCQ8Gh8FCAKEQUJAoTBYpCRcGicFHAKGTUwv1io8BR6Ch4FD6ED+FD+BA+tA1zYI7MiTkz6eFD+BA+hA/hQ/gQPoQP4UP4ED6ED+FD+JD6foUP4UP4ED6ED+FD+BA+hA+Zz4cP4UP4ED6ED+FD+BA+hA/hQ/gQPoQP4UP4ED6ED+FD+NDA/eJD+BA+hA/hQ/gQPoQP4UM8HIQP4UP4ED6ED+FD+BA+hA/hQ/gQPoQP4UP4ED6ED+FD+NDM/eJD+BA+hA/hQ/gQPoQP4UM8OoQP4UP4ED6ED+PD+DA+jA/jw/gwPowP48P4MD6MD+PD+HD1/RofxofxYXwYH8aH8WF8GB/m+WF8GB/Gh/FhfBgfxofxYXwYH8aH8WF8GB/Gh/FhfBgfxofD/eLD+DA+jA/jw/gwPowP48M8P4wP48P4MD6MD+PD+DA+jA/jw/gwPowP48P4MD6MD+PD+DBfo4wP48P4MD6MD+PD+DA+jA/z/DA+jA/jw/gwPowP48P4MD6MD+PD+DA+jA/jI/gIPoKP4CN8vwo+go/gI/gIPoKP4CP4CD7C8yP4CD6Cj+Aj+Ag+go/gI/gIPoKP4CP4CD6Cj+Aj+Ag+go/w/Sr4CD6Cj+Aj+Ag+go/gI/gIz4+sJ4n1KLGeJdbDBD6Cj+Aj+Ag+go/gI/gIPoKP4CP4CD6Cj+AjfL/KuJ506OEj+Ag+go/gI/gIPsLzI/jItB6d6OEj+Ag+go/gI/gIPoKP4CPzehajh4/gI/gIPoKPXL9ffX6dEM+H3f1x/9oH86f308MP5/S3v1/Wd9aT/Mv5+WH/+H7ef50Qr+9dzoz/AA==", + "debug_symbols": "pdXBbptAFIXhd2HtBWcGZoa8SlVF2MYREsIWsSNVVt692Od3kywqVenqBpP7GeRz4Frth+3l5XmcD8fX6unHtdou4zSNL8/Tcdefx+O8fnp931SPw+fzMgzrR9Wn8+vWqV+G+Vw9zZdp2lRv/XS5/9PrqZ/v89wv69l6Uw3zfp0reBin4fbX++Zju/77qmLHspr2z3r77/tteOy35Tv7H9+fwnf2U/PYz/X/fX/OX/Z/rkf9bly+/GJV01ZPcVM1ySN7FI/uPtraQx7BI3o0HlZaK62V1kprJVlJVpKVZCVZSVaSlWQlWUlWspVsJVvJVvKqtOuwkq1kK9lKtlKsFCvFSrFSfC3FSrFSrBQrxUpnpbPSWemsdFY6K52VzkpnpbOiumaKGZiR6dtS3XKcmJlZmHjCE57whKeGiSc84QlPeAEv4AW8gBfwAl7AC3gBL+BFvIgX8SJe5H4jXsSLeBEv4jV4DV6D1+A1XB9JF1EXWRdhF2kXcRd5F4EXiReRF5kXoRepF7EXuRfBF8kX0RfZV+J+Sb+Iv8i/KIBogKiA6IAogWiBMtdHD0QRRBNEFUQXRBlEG0QdRB9EIUQjRCVEJ0QpRCtELUQvRDFEM3Srxu3J/NYvY7+dBl4ch8u8+/QeOf86Pc483jSn5bgb9pdluD3B7ufWZ9pv", "file_map": { "50": { "source": "struct SignedDivOp {\n lhs: i8,\n rhs: i8,\n result: i8,\n}\n\nfn main(ops: [SignedDivOp; 15]) {\n for i in 0..15 {\n assert_eq(ops[i].lhs / ops[i].rhs, ops[i].result);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/slice_loop/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/slice_loop/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index f9a4bc8b091..214bb7edaf0 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/slice_loop/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/slice_loop/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -42,16 +42,10 @@ expression: artifact "current witness index : _5", "private parameters indices : [_0, _1, _2, _3, _4, _5]", "public parameters indices : []", - "return value indices : []", - "EXPR [ (1, _0) (1, _1) (1, _2) (1, _3) (1, _4) (1, _5) -21 ]" + "return value indices : []" ], - "debug_symbols": "pZFBCoMwEEXvMmsXaaI09SqlSIyjBEISYlIo4t0bJba6EApdTWZ+3h+YP0GHbRwaZXo7Qn2foPVKazU02koRlDVpOs0FbG0TPGIawU5PlBMeTYDaRK0LeAod10+jE2atQfikkgLQdKkmw15pXF5z8aXJOcpKmmFW8g9e/cxzUmWe0+sZT895SnnmKbv9t59dDvwjdUIqf7g4EKjLebHzSrQacwp9NHIXSni5Tdlic95K7KLHxW7V0oI3", - "file_map": { - "50": { - "source": "struct Point {\n x: Field,\n y: Field,\n}\n\nimpl Point {\n fn serialize(self) -> [Field; 2] {\n [self.x, self.y]\n }\n}\n\nfn sum(values: [Field]) -> Field {\n let mut sum = 0;\n for value in values {\n sum = sum + value;\n }\n sum\n}\n\nfn main(points: [Point; 3]) {\n let mut serialized_points = &[];\n for point in points {\n serialized_points = serialized_points.append(point.serialize().as_slice());\n }\n // Do a compile-time check that needs the previous loop to be unrolled\n if serialized_points.len() > 5 {\n let empty_point = Point { x: 0, y: 0 };\n serialized_points = serialized_points.append(empty_point.serialize().as_slice());\n }\n // Do a sum that needs both the previous loop and the previous if to have been simplified\n assert_eq(sum(serialized_points), 21);\n}\n", - "path": "" - } - }, + "debug_symbols": "XY5BCsQwCEXv4rqLWfcqw1BsaosgJtikMITefWyYQOlK/3/6tcJCc9km1jXuML4rzMYivE0SA2aO6m49B+hyykbkFty4byU00gyjFpEBDpTShvaE2mpGc/oagHTx6oErC13d+XGBge158UBjnIX+ci0abjR/Uyf942Qx0FKMrqTGPPsH", + "file_map": {}, "names": [ "main" ], diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/slice_loop/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/slice_loop/execute__tests__force_brillig_false_inliner_0.snap index f9a4bc8b091..214bb7edaf0 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/slice_loop/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/slice_loop/execute__tests__force_brillig_false_inliner_0.snap @@ -42,16 +42,10 @@ expression: artifact "current witness index : _5", "private parameters indices : [_0, _1, _2, _3, _4, _5]", "public parameters indices : []", - "return value indices : []", - "EXPR [ (1, _0) (1, _1) (1, _2) (1, _3) (1, _4) (1, _5) -21 ]" + "return value indices : []" ], - "debug_symbols": "pZFBCoMwEEXvMmsXaaI09SqlSIyjBEISYlIo4t0bJba6EApdTWZ+3h+YP0GHbRwaZXo7Qn2foPVKazU02koRlDVpOs0FbG0TPGIawU5PlBMeTYDaRK0LeAod10+jE2atQfikkgLQdKkmw15pXF5z8aXJOcpKmmFW8g9e/cxzUmWe0+sZT895SnnmKbv9t59dDvwjdUIqf7g4EKjLebHzSrQacwp9NHIXSni5Tdlic95K7KLHxW7V0oI3", - "file_map": { - "50": { - "source": "struct Point {\n x: Field,\n y: Field,\n}\n\nimpl Point {\n fn serialize(self) -> [Field; 2] {\n [self.x, self.y]\n }\n}\n\nfn sum(values: [Field]) -> Field {\n let mut sum = 0;\n for value in values {\n sum = sum + value;\n }\n sum\n}\n\nfn main(points: [Point; 3]) {\n let mut serialized_points = &[];\n for point in points {\n serialized_points = serialized_points.append(point.serialize().as_slice());\n }\n // Do a compile-time check that needs the previous loop to be unrolled\n if serialized_points.len() > 5 {\n let empty_point = Point { x: 0, y: 0 };\n serialized_points = serialized_points.append(empty_point.serialize().as_slice());\n }\n // Do a sum that needs both the previous loop and the previous if to have been simplified\n assert_eq(sum(serialized_points), 21);\n}\n", - "path": "" - } - }, + "debug_symbols": "XY5BCsQwCEXv4rqLWfcqw1BsaosgJtikMITefWyYQOlK/3/6tcJCc9km1jXuML4rzMYivE0SA2aO6m49B+hyykbkFty4byU00gyjFpEBDpTShvaE2mpGc/oagHTx6oErC13d+XGBge158UBjnIX+ci0abjR/Uyf942Qx0FKMrqTGPPsH", + "file_map": {}, "names": [ "main" ], diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/slice_loop/execute__tests__force_brillig_false_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/slice_loop/execute__tests__force_brillig_false_inliner_9223372036854775807.snap index f9a4bc8b091..214bb7edaf0 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/slice_loop/execute__tests__force_brillig_false_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/slice_loop/execute__tests__force_brillig_false_inliner_9223372036854775807.snap @@ -42,16 +42,10 @@ expression: artifact "current witness index : _5", "private parameters indices : [_0, _1, _2, _3, _4, _5]", "public parameters indices : []", - "return value indices : []", - "EXPR [ (1, _0) (1, _1) (1, _2) (1, _3) (1, _4) (1, _5) -21 ]" + "return value indices : []" ], - "debug_symbols": "pZFBCoMwEEXvMmsXaaI09SqlSIyjBEISYlIo4t0bJba6EApdTWZ+3h+YP0GHbRwaZXo7Qn2foPVKazU02koRlDVpOs0FbG0TPGIawU5PlBMeTYDaRK0LeAod10+jE2atQfikkgLQdKkmw15pXF5z8aXJOcpKmmFW8g9e/cxzUmWe0+sZT895SnnmKbv9t59dDvwjdUIqf7g4EKjLebHzSrQacwp9NHIXSni5Tdlic95K7KLHxW7V0oI3", - "file_map": { - "50": { - "source": "struct Point {\n x: Field,\n y: Field,\n}\n\nimpl Point {\n fn serialize(self) -> [Field; 2] {\n [self.x, self.y]\n }\n}\n\nfn sum(values: [Field]) -> Field {\n let mut sum = 0;\n for value in values {\n sum = sum + value;\n }\n sum\n}\n\nfn main(points: [Point; 3]) {\n let mut serialized_points = &[];\n for point in points {\n serialized_points = serialized_points.append(point.serialize().as_slice());\n }\n // Do a compile-time check that needs the previous loop to be unrolled\n if serialized_points.len() > 5 {\n let empty_point = Point { x: 0, y: 0 };\n serialized_points = serialized_points.append(empty_point.serialize().as_slice());\n }\n // Do a sum that needs both the previous loop and the previous if to have been simplified\n assert_eq(sum(serialized_points), 21);\n}\n", - "path": "" - } - }, + "debug_symbols": "XY5BCsQwCEXv4rqLWfcqw1BsaosgJtikMITefWyYQOlK/3/6tcJCc9km1jXuML4rzMYivE0SA2aO6m49B+hyykbkFty4byU00gyjFpEBDpTShvaE2mpGc/oagHTx6oErC13d+XGBge158UBjnIX+ci0abjR/Uyf942Qx0FKMrqTGPPsH", + "file_map": {}, "names": [ "main" ], From c01d273da6f34dce02f232b2ffdc697c004116b6 Mon Sep 17 00:00:00 2001 From: Tom French <15848336+TomAFrench@users.noreply.github.com> Date: Tue, 15 Jul 2025 18:03:18 +0000 Subject: [PATCH 2/5] . --- .../opt/remove_unreachable_instructions.rs | 5 +- ...ig_false_inliner_-9223372036854775808.snap | 74 ++- ..._tests__force_brillig_false_inliner_0.snap | 74 ++- ...lig_false_inliner_9223372036854775807.snap | 74 ++- ...lig_true_inliner_-9223372036854775808.snap | 15 +- ...__tests__force_brillig_true_inliner_0.snap | 15 +- ...llig_true_inliner_9223372036854775807.snap | 15 +- ...ig_false_inliner_-9223372036854775808.snap | 13 +- ..._tests__force_brillig_false_inliner_0.snap | 13 +- ...lig_false_inliner_9223372036854775807.snap | 13 +- ...lig_true_inliner_-9223372036854775808.snap | 4 +- ...__tests__force_brillig_true_inliner_0.snap | 4 +- ...llig_true_inliner_9223372036854775807.snap | 4 +- ...ig_false_inliner_-9223372036854775808.snap | 535 +++++++++++++++--- ..._tests__force_brillig_false_inliner_0.snap | 535 +++++++++++++++--- ...lig_false_inliner_9223372036854775807.snap | 535 +++++++++++++++--- ...lig_true_inliner_-9223372036854775808.snap | 4 +- ...__tests__force_brillig_true_inliner_0.snap | 4 +- ...ig_false_inliner_-9223372036854775808.snap | 3 +- ..._tests__force_brillig_false_inliner_0.snap | 3 +- ...lig_false_inliner_9223372036854775807.snap | 3 +- ...ig_false_inliner_-9223372036854775808.snap | 26 +- ..._tests__force_brillig_false_inliner_0.snap | 26 +- ...lig_false_inliner_9223372036854775807.snap | 26 +- ...ig_false_inliner_-9223372036854775808.snap | 11 +- ..._tests__force_brillig_false_inliner_0.snap | 11 +- ...lig_false_inliner_9223372036854775807.snap | 11 +- ...ig_false_inliner_-9223372036854775808.snap | 33 +- ..._tests__force_brillig_false_inliner_0.snap | 33 +- ...lig_false_inliner_9223372036854775807.snap | 33 +- ...lig_true_inliner_-9223372036854775808.snap | 4 +- ...__tests__force_brillig_true_inliner_0.snap | 15 +- ...llig_true_inliner_9223372036854775807.snap | 15 +- ...ig_false_inliner_-9223372036854775808.snap | 12 +- ...lig_true_inliner_-9223372036854775808.snap | 12 +- ...lig_true_inliner_-9223372036854775808.snap | 4 +- ...__tests__force_brillig_true_inliner_0.snap | 4 +- ...llig_true_inliner_9223372036854775807.snap | 4 +- ...lig_true_inliner_-9223372036854775808.snap | 15 +- ...__tests__force_brillig_true_inliner_0.snap | 15 +- ...llig_true_inliner_9223372036854775807.snap | 15 +- ...ig_false_inliner_-9223372036854775808.snap | 304 +++++++++- ..._tests__force_brillig_false_inliner_0.snap | 304 +++++++++- ...lig_false_inliner_9223372036854775807.snap | 304 +++++++++- ...ig_false_inliner_-9223372036854775808.snap | 12 +- ..._tests__force_brillig_false_inliner_0.snap | 12 +- ...lig_false_inliner_9223372036854775807.snap | 12 +- 47 files changed, 2861 insertions(+), 357 deletions(-) diff --git a/compiler/noirc_evaluator/src/ssa/opt/remove_unreachable_instructions.rs b/compiler/noirc_evaluator/src/ssa/opt/remove_unreachable_instructions.rs index 8a85845d052..9dcb7f32c1c 100644 --- a/compiler/noirc_evaluator/src/ssa/opt/remove_unreachable_instructions.rs +++ b/compiler/noirc_evaluator/src/ssa/opt/remove_unreachable_instructions.rs @@ -146,10 +146,11 @@ impl Function { let array_or_slice_type = context.dfg.type_of_value(*array); match array_or_slice_type { Type::Slice(_) => false, - Type::Array(_, len) => { + array_type @ Type::Array(_, len) => { len == 0 || context.dfg.get_numeric_constant(*index).is_some_and(|index| { - (index.try_to_u32().unwrap() - offset.to_u32()) >= len + (index.try_to_u32().unwrap() - offset.to_u32()) + >= array_type.flattened_size() }) } _ => unreachable!( diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index e6c38a50a96..a134c1bd4f7 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -34,15 +34,79 @@ expression: artifact }, "bytecode": [ "func 0", - "current witness index : _2", + "current witness index : _63", "private parameters indices : [_0]", "public parameters indices : [_1, _2]", - "return value indices : []" + "return value indices : []", + "BLACKBOX::MULTI_SCALAR_MUL [(1, 254), (17631683881184975370165255887551781615748388533673675138860, 254), (0, 1), (_0, 254), (0, 254)] [_3, _4, _5]", + "EXPR [ (-1, _1) (1, _3) 0 ]", + "EXPR [ (-1, _2) (1, _4) 0 ]", + "EXPR [ (-1, _6) 0 ]", + "BLACKBOX::EMBEDDED_CURVE_ADD [(_1, 254), (_2, 254), (_6, 1), (_1, 254), (_2, 254), (_6, 1)] [_7, _8, _9]", + "EXPR [ (-1, _7) 3078034153852398078128400807926804309327113743808504829582559963737223069694 ]", + "BLACKBOX::MULTI_SCALAR_MUL [(1, 254), (17631683881184975370165255887551781615748388533673675138860, 254), (0, 1), (1, 254), (17631683881184975370165255887551781615748388533673675138860, 254), (0, 1), (_0, 254), (0, 254), (_0, 254), (0, 254)] [_10, _11, _12]", + "EXPR [ (-1, _10) 3078034153852398078128400807926804309327113743808504829582559963737223069694 ]", + "BLACKBOX::MULTI_SCALAR_MUL [(1, 254), (17631683881184975370165255887551781615748388533673675138860, 254), (0, 1), (_1, 254), (_2, 254), (0, 1), (11179562631109628533987091031692370366552561688588090155835439555627259799605, 254), (3443719903172018228650470536370404288991794296383447657609081676265727805364, 254), (0, 1), (_0, 254), (0, 254), (_0, 254), (0, 254), (1, 254), (0, 254)] [_13, _14, _15]", + "EXPR [ (1, _13) 7349266043899242844836273743257843180744506495159104166319746739537754653274 ]", + "BLACKBOX::MULTI_SCALAR_MUL [(1, 254), (17631683881184975370165255887551781615748388533673675138860, 254), (0, 1), (_0, 254), (0, 254)] [_16, _17, _18]", + "EXPR [ (1, _18) 0 ]", + "EXPR [ (1, _16) -1 ]", + "EXPR [ (1, _17) -17631683881184975370165255887551781615748388533673675138860 ]", + "EXPR [ (1, _1) (-1, _2) (-1, _19) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(19))], q_c: 0 })], outputs: [Simple(Witness(20))]", + "EXPR [ (1, _19, _20) (1, _21) -1 ]", + "EXPR [ (1, _19, _21) 0 ]", + "EXPR [ (-17631683881184975370165255887551781615748388533673675138858, _21) (-1, _22) 17631683881184975370165255887551781615748388533673675138860 ]", + "EXPR [ (-1, _23) 1 ]", + "BLACKBOX::EMBEDDED_CURVE_ADD [(_23, 254), (_22, 254), (_6, 1), (_23, 254), (_22, 254), (_6, 1)] [_24, _25, _26]", + "EXPR [ (1, _21, _24) (-1, _21) 0 ]", + "EXPR [ (-3078034153852398078128400807926804309327113743808504829582559963737223069693, _21) (-1, _27) 3078034153852398078128400807926804309327113743808504829582559963737223069694 ]", + "EXPR [ (9191351987198133172789796342745422989482268917117950487758512501574271532888, _21) (-1, _28) -9191351987198133172789796342745422989482268917117950487758512501574271532885 ]", + "BLACKBOX::EMBEDDED_CURVE_ADD [(_23, 254), (_22, 254), (_6, 1), (_27, 254), (_28, 254), (_6, 1)] [_29, _30, _31]", + "EXPR [ (1, _21, _29) (-1, _21) 0 ]", + "EXPR [ (1, _1, _21) (-1, _32) 1 ]", + "EXPR [ (1, _2, _21) (-17631683881184975370165255887551781615748388533673675138860, _21) (-1, _33) 17631683881184975370165255887551781615748388533673675138860 ]", + "BLACKBOX::EMBEDDED_CURVE_ADD [(_32, 254), (_33, 254), (_6, 1), (_32, 254), (_33, 254), (_6, 1)] [_34, _35, _36]", + "EXPR [ (1, _21, _34) (-1, _21) 0 ]", + "EXPR [ (1, _1, _21) (-3078034153852398078128400807926804309327113743808504829582559963737223069693, _21) (-1, _37) 3078034153852398078128400807926804309327113743808504829582559963737223069694 ]", + "EXPR [ (1, _2, _21) (9191351987198133172789796342745422989482268917117950487758512501574271532886, _21) (-1, _38) -9191351987198133172789796342745422989482268917117950487758512501574271532885 ]", + "BLACKBOX::EMBEDDED_CURVE_ADD [(_32, 254), (_33, 254), (_6, 1), (_37, 254), (_38, 254), (_6, 1)] [_39, _40, _41]", + "EXPR [ (1, _21, _39) (-1, _21) 0 ]", + "EXPR [ (1, _21) (-1, _42) 1 ]", + "EXPR [ (-17631683881184975370165255887551781615748388533673675138857, _21) (-1, _43) 17631683881184975370165255887551781615748388533673675138860 ]", + "EXPR [ (1, _1, _21) (-3078034153852398078128400807926804309327113743808504829582559963737223069694, _21) (-1, _44) 3078034153852398078128400807926804309327113743808504829582559963737223069694 ]", + "BLACKBOX::EMBEDDED_CURVE_ADD [(_42, 254), (_43, 254), (_6, 1), (_44, 254), (_38, 254), (_6, 1)] [_45, _46, _47]", + "EXPR [ (1, _21, _45) (-1, _21) 0 ]", + "EXPR [ (-3078034153852398078128400807926804309327113743808504829582559963737223069692, _21) (-1, _48) 3078034153852398078128400807926804309327113743808504829582559963737223069694 ]", + "EXPR [ (9191351987198133172789796342745422989482268917117950487758512501574271532889, _21) (-1, _49) -9191351987198133172789796342745422989482268917117950487758512501574271532885 ]", + "BLACKBOX::EMBEDDED_CURVE_ADD [(_42, 254), (_43, 254), (_6, 1), (_48, 254), (_49, 254), (_6, 1)] [_50, _51, _52]", + "EXPR [ (1, _21, _50) (-1, _21) 0 ]", + "BLACKBOX::EMBEDDED_CURVE_ADD [(_42, 254), (_43, 254), (_6, 1), (_42, 254), (_43, 254), (_6, 1)] [_53, _54, _55]", + "EXPR [ (1, _21, _53) (-1, _21) 0 ]", + "BLACKBOX::EMBEDDED_CURVE_ADD [(_23, 254), (_43, 254), (_6, 1), (_23, 254), (_43, 254), (_6, 1)] [_56, _57, _58]", + "EXPR [ (1, _21, _56) (-1, _21) 0 ]", + "EXPR [ (1, _1, _21) (-1, _21) (-1, _59) 1 ]", + "EXPR [ (9191351987198133172789796342745422989482268917117950487758512501574271532887, _21) (-1, _60) -9191351987198133172789796342745422989482268917117950487758512501574271532885 ]", + "BLACKBOX::EMBEDDED_CURVE_ADD [(_59, 254), (_43, 254), (_6, 1), (_44, 254), (_60, 254), (_6, 1)] [_61, _62, _63]", + "EXPR [ (1, _21, _61) (-1, _21) 0 ]", + "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": "XY5BCsQwCEXv4rqLWfcqw1BsaosgJtikMITefWyYQOlK/3/6tcJCc9km1jXuML4rzMYivE0SA2aO6m49B+hyykbkFty4byU00gyjFpEBDpTShvaE2mpGc/oagHTx6oErC13d+XGBge158UBjnIX+ci0abjR/Uyf942Qx0FKMrqTGPPsH", - "file_map": {}, + "debug_symbols": "tVjLbuowEP0Xr7PwvPzor1xdVZSmFVIEKIUrXVX9946LndCFUWuS1QGSOcwce04yfjfP/dP59XG3fzm8mYc/7+Zp3A3D7vVxOGw3p91hr7++f3SmfH08jX2vP5mr6xp13Iz9/mQe9udh6My/zXD+uuntuNl/4Wkz6lXbmX7/rKiEL7uhT58+ujna1kMxSA7G4KZw+XE8ecjxjKEWj/V4lsiFwPFcALg2Bqox3KiBeapBpEEDdrHEB2qId7GsgQeoxfsb8VjydwK1+kM93qNgSQAjNTAEsiWFQIw1BrghAgBanzn0s/ASJL5hN3hxRQzfsprBFSki2Vo88N0t8XOKlp4Ay1SEtM426ADkJwahqpIQ7lcirKqEcNkQ4DC2KBF8yQFi5KpLLmCTq/ok2qm50CI3KIHan4UBqImBpFSB5Kq7Cu+1S7zldnbyy2Bj1WMwLuB2eL/rEiyQx29IWlwXKeC0rlea/mJncPKBCwNL9TlKsoQasrIa7OZafGhRw/PUaZ5bXAsDTN0esPpuyPbOTmO4u9MYF1jTm3n8rNOYl8iDV95bga9e+W3TzghFDYxQdXEOS6gRVlYj0lwLQ8sEhFjecwil2ieyxB79DUmLGoR+rqVpliGOZRgiIayq4ZZQw62shvBci7R4KHlfeo2Crfq4W2IucivPRfqAnmuhpjnZSnkmsa3vLreEi7qVXZTBTrUAtLgoE5VeY3JV33BLuKhb2UVZd8RUS/y+sn/122a7G7+dfBmru6gzoLd0BjXBzlD6+87wBSQNkJ1xaf7qjFfQHEMaoDoT0/SgwTa9KyoqS9qagBkpo1KhEoNkdBl9xpBcTjFeEG1GSDamqHyk9yFl5IySOkDRpaFK0WcMGZWPNVtSvmQgBBkxo/KJ5k/KJ5o/SUaX0WdUPlE+Uj5RPrYZIaPyifKx8qUzB1Y+p3Es6X1LUflcus+nIybFkDFeUGw6cPpIqzruNk9Dn48kX8777dUJ5en/sVwpZ5jH8bDtn89jn9b065qu8ic=", + "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", + "path": "std/embedded_curve_ops.nr" + }, + "50": { + "source": "use std::{embedded_curve_ops::embedded_curve_add_unsafe, ops::Add};\n\nfn main(priv_key: Field, pub_x: pub Field, pub_y: pub Field) {\n let g1 = std::embedded_curve_ops::EmbeddedCurvePoint::generator();\n let scalar = std::embedded_curve_ops::EmbeddedCurveScalar { lo: priv_key, hi: 0 };\n // Test that multi_scalar_mul correctly derives the public key\n let res = std::embedded_curve_ops::multi_scalar_mul([g1], [scalar]);\n assert(res.x == pub_x);\n assert(res.y == pub_y);\n\n // Test that double function calling embedded_curve_add works as expected\n let pub_point =\n std::embedded_curve_ops::EmbeddedCurvePoint { x: pub_x, y: pub_y, is_infinite: false };\n let res = pub_point.double();\n let double = g1.add(g1);\n\n assert(double.x == res.x);\n\n // Test calling multi_scalar_mul with multiple points and scalars\n let res = std::embedded_curve_ops::multi_scalar_mul([g1, g1], [scalar, scalar]);\n\n // The results should be double the g1 point because the scalars are 1 and we pass in g1 twice\n assert(double.x == res.x);\n\n // Tests for #6549\n let const_scalar1 = std::embedded_curve_ops::EmbeddedCurveScalar { lo: 23, hi: 0 };\n let const_scalar2 = std::embedded_curve_ops::EmbeddedCurveScalar { lo: 0, hi: 23 };\n let const_scalar3 = std::embedded_curve_ops::EmbeddedCurveScalar { lo: 13, hi: 4 };\n let partial_mul = std::embedded_curve_ops::multi_scalar_mul(\n [g1, double, pub_point, g1, g1],\n [scalar, const_scalar1, scalar, const_scalar2, const_scalar3],\n );\n assert(partial_mul.x == 0x2024c4eebfbc8a20018f8c95c7aab77c6f34f10cf785a6f04e97452d8708fda7);\n // Check simplification by zero\n let zero_point = std::embedded_curve_ops::EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true };\n let const_zero = std::embedded_curve_ops::EmbeddedCurveScalar { lo: 0, hi: 0 };\n let partial_mul = std::embedded_curve_ops::multi_scalar_mul(\n [zero_point, double, g1],\n [scalar, const_zero, scalar],\n );\n assert(partial_mul == g1);\n\n // Additional tests for validating embedded_curve_add_unsafe under a conditional\n if pub_x == pub_y {\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 1, y: 2, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 1, y: 3, is_infinite: false };\n let doubling = a1.double();\n assert(doubling.x == 1);\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint {\n x: pub_x + 1,\n y: pub_y,\n is_infinite: false,\n };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint {\n x: pub_x + 1,\n y: pub_y + 1,\n is_infinite: false,\n };\n let doubling = a1.double();\n assert(doubling.x == 1);\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint {\n x: pub_x,\n y: pub_y + 1 as Field,\n is_infinite: false,\n };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 4, is_infinite: false };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 3, is_infinite: false };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 1, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 1, y: 3, is_infinite: false };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: pub_x, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: pub_x, y: 2, is_infinite: false };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n }\n}\n", + "path": "" + } + }, "names": [ "main" ], - "brillig_names": [] + "brillig_names": [ + "directive_invert" + ] } diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__force_brillig_false_inliner_0.snap index e6c38a50a96..a134c1bd4f7 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__force_brillig_false_inliner_0.snap @@ -34,15 +34,79 @@ expression: artifact }, "bytecode": [ "func 0", - "current witness index : _2", + "current witness index : _63", "private parameters indices : [_0]", "public parameters indices : [_1, _2]", - "return value indices : []" + "return value indices : []", + "BLACKBOX::MULTI_SCALAR_MUL [(1, 254), (17631683881184975370165255887551781615748388533673675138860, 254), (0, 1), (_0, 254), (0, 254)] [_3, _4, _5]", + "EXPR [ (-1, _1) (1, _3) 0 ]", + "EXPR [ (-1, _2) (1, _4) 0 ]", + "EXPR [ (-1, _6) 0 ]", + "BLACKBOX::EMBEDDED_CURVE_ADD [(_1, 254), (_2, 254), (_6, 1), (_1, 254), (_2, 254), (_6, 1)] [_7, _8, _9]", + "EXPR [ (-1, _7) 3078034153852398078128400807926804309327113743808504829582559963737223069694 ]", + "BLACKBOX::MULTI_SCALAR_MUL [(1, 254), (17631683881184975370165255887551781615748388533673675138860, 254), (0, 1), (1, 254), (17631683881184975370165255887551781615748388533673675138860, 254), (0, 1), (_0, 254), (0, 254), (_0, 254), (0, 254)] [_10, _11, _12]", + "EXPR [ (-1, _10) 3078034153852398078128400807926804309327113743808504829582559963737223069694 ]", + "BLACKBOX::MULTI_SCALAR_MUL [(1, 254), (17631683881184975370165255887551781615748388533673675138860, 254), (0, 1), (_1, 254), (_2, 254), (0, 1), (11179562631109628533987091031692370366552561688588090155835439555627259799605, 254), (3443719903172018228650470536370404288991794296383447657609081676265727805364, 254), (0, 1), (_0, 254), (0, 254), (_0, 254), (0, 254), (1, 254), (0, 254)] [_13, _14, _15]", + "EXPR [ (1, _13) 7349266043899242844836273743257843180744506495159104166319746739537754653274 ]", + "BLACKBOX::MULTI_SCALAR_MUL [(1, 254), (17631683881184975370165255887551781615748388533673675138860, 254), (0, 1), (_0, 254), (0, 254)] [_16, _17, _18]", + "EXPR [ (1, _18) 0 ]", + "EXPR [ (1, _16) -1 ]", + "EXPR [ (1, _17) -17631683881184975370165255887551781615748388533673675138860 ]", + "EXPR [ (1, _1) (-1, _2) (-1, _19) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(19))], q_c: 0 })], outputs: [Simple(Witness(20))]", + "EXPR [ (1, _19, _20) (1, _21) -1 ]", + "EXPR [ (1, _19, _21) 0 ]", + "EXPR [ (-17631683881184975370165255887551781615748388533673675138858, _21) (-1, _22) 17631683881184975370165255887551781615748388533673675138860 ]", + "EXPR [ (-1, _23) 1 ]", + "BLACKBOX::EMBEDDED_CURVE_ADD [(_23, 254), (_22, 254), (_6, 1), (_23, 254), (_22, 254), (_6, 1)] [_24, _25, _26]", + "EXPR [ (1, _21, _24) (-1, _21) 0 ]", + "EXPR [ (-3078034153852398078128400807926804309327113743808504829582559963737223069693, _21) (-1, _27) 3078034153852398078128400807926804309327113743808504829582559963737223069694 ]", + "EXPR [ (9191351987198133172789796342745422989482268917117950487758512501574271532888, _21) (-1, _28) -9191351987198133172789796342745422989482268917117950487758512501574271532885 ]", + "BLACKBOX::EMBEDDED_CURVE_ADD [(_23, 254), (_22, 254), (_6, 1), (_27, 254), (_28, 254), (_6, 1)] [_29, _30, _31]", + "EXPR [ (1, _21, _29) (-1, _21) 0 ]", + "EXPR [ (1, _1, _21) (-1, _32) 1 ]", + "EXPR [ (1, _2, _21) (-17631683881184975370165255887551781615748388533673675138860, _21) (-1, _33) 17631683881184975370165255887551781615748388533673675138860 ]", + "BLACKBOX::EMBEDDED_CURVE_ADD [(_32, 254), (_33, 254), (_6, 1), (_32, 254), (_33, 254), (_6, 1)] [_34, _35, _36]", + "EXPR [ (1, _21, _34) (-1, _21) 0 ]", + "EXPR [ (1, _1, _21) (-3078034153852398078128400807926804309327113743808504829582559963737223069693, _21) (-1, _37) 3078034153852398078128400807926804309327113743808504829582559963737223069694 ]", + "EXPR [ (1, _2, _21) (9191351987198133172789796342745422989482268917117950487758512501574271532886, _21) (-1, _38) -9191351987198133172789796342745422989482268917117950487758512501574271532885 ]", + "BLACKBOX::EMBEDDED_CURVE_ADD [(_32, 254), (_33, 254), (_6, 1), (_37, 254), (_38, 254), (_6, 1)] [_39, _40, _41]", + "EXPR [ (1, _21, _39) (-1, _21) 0 ]", + "EXPR [ (1, _21) (-1, _42) 1 ]", + "EXPR [ (-17631683881184975370165255887551781615748388533673675138857, _21) (-1, _43) 17631683881184975370165255887551781615748388533673675138860 ]", + "EXPR [ (1, _1, _21) (-3078034153852398078128400807926804309327113743808504829582559963737223069694, _21) (-1, _44) 3078034153852398078128400807926804309327113743808504829582559963737223069694 ]", + "BLACKBOX::EMBEDDED_CURVE_ADD [(_42, 254), (_43, 254), (_6, 1), (_44, 254), (_38, 254), (_6, 1)] [_45, _46, _47]", + "EXPR [ (1, _21, _45) (-1, _21) 0 ]", + "EXPR [ (-3078034153852398078128400807926804309327113743808504829582559963737223069692, _21) (-1, _48) 3078034153852398078128400807926804309327113743808504829582559963737223069694 ]", + "EXPR [ (9191351987198133172789796342745422989482268917117950487758512501574271532889, _21) (-1, _49) -9191351987198133172789796342745422989482268917117950487758512501574271532885 ]", + "BLACKBOX::EMBEDDED_CURVE_ADD [(_42, 254), (_43, 254), (_6, 1), (_48, 254), (_49, 254), (_6, 1)] [_50, _51, _52]", + "EXPR [ (1, _21, _50) (-1, _21) 0 ]", + "BLACKBOX::EMBEDDED_CURVE_ADD [(_42, 254), (_43, 254), (_6, 1), (_42, 254), (_43, 254), (_6, 1)] [_53, _54, _55]", + "EXPR [ (1, _21, _53) (-1, _21) 0 ]", + "BLACKBOX::EMBEDDED_CURVE_ADD [(_23, 254), (_43, 254), (_6, 1), (_23, 254), (_43, 254), (_6, 1)] [_56, _57, _58]", + "EXPR [ (1, _21, _56) (-1, _21) 0 ]", + "EXPR [ (1, _1, _21) (-1, _21) (-1, _59) 1 ]", + "EXPR [ (9191351987198133172789796342745422989482268917117950487758512501574271532887, _21) (-1, _60) -9191351987198133172789796342745422989482268917117950487758512501574271532885 ]", + "BLACKBOX::EMBEDDED_CURVE_ADD [(_59, 254), (_43, 254), (_6, 1), (_44, 254), (_60, 254), (_6, 1)] [_61, _62, _63]", + "EXPR [ (1, _21, _61) (-1, _21) 0 ]", + "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": "XY5BCsQwCEXv4rqLWfcqw1BsaosgJtikMITefWyYQOlK/3/6tcJCc9km1jXuML4rzMYivE0SA2aO6m49B+hyykbkFty4byU00gyjFpEBDpTShvaE2mpGc/oagHTx6oErC13d+XGBge158UBjnIX+ci0abjR/Uyf942Qx0FKMrqTGPPsH", - "file_map": {}, + "debug_symbols": "tVjLbuowEP0Xr7PwvPzor1xdVZSmFVIEKIUrXVX9946LndCFUWuS1QGSOcwce04yfjfP/dP59XG3fzm8mYc/7+Zp3A3D7vVxOGw3p91hr7++f3SmfH08jX2vP5mr6xp13Iz9/mQe9udh6My/zXD+uuntuNl/4Wkz6lXbmX7/rKiEL7uhT58+ujna1kMxSA7G4KZw+XE8ecjxjKEWj/V4lsiFwPFcALg2Bqox3KiBeapBpEEDdrHEB2qId7GsgQeoxfsb8VjydwK1+kM93qNgSQAjNTAEsiWFQIw1BrghAgBanzn0s/ASJL5hN3hxRQzfsprBFSki2Vo88N0t8XOKlp4Ay1SEtM426ADkJwahqpIQ7lcirKqEcNkQ4DC2KBF8yQFi5KpLLmCTq/ok2qm50CI3KIHan4UBqImBpFSB5Kq7Cu+1S7zldnbyy2Bj1WMwLuB2eL/rEiyQx29IWlwXKeC0rlea/mJncPKBCwNL9TlKsoQasrIa7OZafGhRw/PUaZ5bXAsDTN0esPpuyPbOTmO4u9MYF1jTm3n8rNOYl8iDV95bga9e+W3TzghFDYxQdXEOS6gRVlYj0lwLQ8sEhFjecwil2ieyxB79DUmLGoR+rqVpliGOZRgiIayq4ZZQw62shvBci7R4KHlfeo2Crfq4W2IucivPRfqAnmuhpjnZSnkmsa3vLreEi7qVXZTBTrUAtLgoE5VeY3JV33BLuKhb2UVZd8RUS/y+sn/122a7G7+dfBmru6gzoLd0BjXBzlD6+87wBSQNkJ1xaf7qjFfQHEMaoDoT0/SgwTa9KyoqS9qagBkpo1KhEoNkdBl9xpBcTjFeEG1GSDamqHyk9yFl5IySOkDRpaFK0WcMGZWPNVtSvmQgBBkxo/KJ5k/KJ5o/SUaX0WdUPlE+Uj5RPrYZIaPyifKx8qUzB1Y+p3Es6X1LUflcus+nIybFkDFeUGw6cPpIqzruNk9Dn48kX8777dUJ5en/sVwpZ5jH8bDtn89jn9b065qu8ic=", + "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", + "path": "std/embedded_curve_ops.nr" + }, + "50": { + "source": "use std::{embedded_curve_ops::embedded_curve_add_unsafe, ops::Add};\n\nfn main(priv_key: Field, pub_x: pub Field, pub_y: pub Field) {\n let g1 = std::embedded_curve_ops::EmbeddedCurvePoint::generator();\n let scalar = std::embedded_curve_ops::EmbeddedCurveScalar { lo: priv_key, hi: 0 };\n // Test that multi_scalar_mul correctly derives the public key\n let res = std::embedded_curve_ops::multi_scalar_mul([g1], [scalar]);\n assert(res.x == pub_x);\n assert(res.y == pub_y);\n\n // Test that double function calling embedded_curve_add works as expected\n let pub_point =\n std::embedded_curve_ops::EmbeddedCurvePoint { x: pub_x, y: pub_y, is_infinite: false };\n let res = pub_point.double();\n let double = g1.add(g1);\n\n assert(double.x == res.x);\n\n // Test calling multi_scalar_mul with multiple points and scalars\n let res = std::embedded_curve_ops::multi_scalar_mul([g1, g1], [scalar, scalar]);\n\n // The results should be double the g1 point because the scalars are 1 and we pass in g1 twice\n assert(double.x == res.x);\n\n // Tests for #6549\n let const_scalar1 = std::embedded_curve_ops::EmbeddedCurveScalar { lo: 23, hi: 0 };\n let const_scalar2 = std::embedded_curve_ops::EmbeddedCurveScalar { lo: 0, hi: 23 };\n let const_scalar3 = std::embedded_curve_ops::EmbeddedCurveScalar { lo: 13, hi: 4 };\n let partial_mul = std::embedded_curve_ops::multi_scalar_mul(\n [g1, double, pub_point, g1, g1],\n [scalar, const_scalar1, scalar, const_scalar2, const_scalar3],\n );\n assert(partial_mul.x == 0x2024c4eebfbc8a20018f8c95c7aab77c6f34f10cf785a6f04e97452d8708fda7);\n // Check simplification by zero\n let zero_point = std::embedded_curve_ops::EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true };\n let const_zero = std::embedded_curve_ops::EmbeddedCurveScalar { lo: 0, hi: 0 };\n let partial_mul = std::embedded_curve_ops::multi_scalar_mul(\n [zero_point, double, g1],\n [scalar, const_zero, scalar],\n );\n assert(partial_mul == g1);\n\n // Additional tests for validating embedded_curve_add_unsafe under a conditional\n if pub_x == pub_y {\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 1, y: 2, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 1, y: 3, is_infinite: false };\n let doubling = a1.double();\n assert(doubling.x == 1);\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint {\n x: pub_x + 1,\n y: pub_y,\n is_infinite: false,\n };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint {\n x: pub_x + 1,\n y: pub_y + 1,\n is_infinite: false,\n };\n let doubling = a1.double();\n assert(doubling.x == 1);\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint {\n x: pub_x,\n y: pub_y + 1 as Field,\n is_infinite: false,\n };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 4, is_infinite: false };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 3, is_infinite: false };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 1, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 1, y: 3, is_infinite: false };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: pub_x, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: pub_x, y: 2, is_infinite: false };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n }\n}\n", + "path": "" + } + }, "names": [ "main" ], - "brillig_names": [] + "brillig_names": [ + "directive_invert" + ] } diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__force_brillig_false_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__force_brillig_false_inliner_9223372036854775807.snap index e6c38a50a96..a134c1bd4f7 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__force_brillig_false_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__force_brillig_false_inliner_9223372036854775807.snap @@ -34,15 +34,79 @@ expression: artifact }, "bytecode": [ "func 0", - "current witness index : _2", + "current witness index : _63", "private parameters indices : [_0]", "public parameters indices : [_1, _2]", - "return value indices : []" + "return value indices : []", + "BLACKBOX::MULTI_SCALAR_MUL [(1, 254), (17631683881184975370165255887551781615748388533673675138860, 254), (0, 1), (_0, 254), (0, 254)] [_3, _4, _5]", + "EXPR [ (-1, _1) (1, _3) 0 ]", + "EXPR [ (-1, _2) (1, _4) 0 ]", + "EXPR [ (-1, _6) 0 ]", + "BLACKBOX::EMBEDDED_CURVE_ADD [(_1, 254), (_2, 254), (_6, 1), (_1, 254), (_2, 254), (_6, 1)] [_7, _8, _9]", + "EXPR [ (-1, _7) 3078034153852398078128400807926804309327113743808504829582559963737223069694 ]", + "BLACKBOX::MULTI_SCALAR_MUL [(1, 254), (17631683881184975370165255887551781615748388533673675138860, 254), (0, 1), (1, 254), (17631683881184975370165255887551781615748388533673675138860, 254), (0, 1), (_0, 254), (0, 254), (_0, 254), (0, 254)] [_10, _11, _12]", + "EXPR [ (-1, _10) 3078034153852398078128400807926804309327113743808504829582559963737223069694 ]", + "BLACKBOX::MULTI_SCALAR_MUL [(1, 254), (17631683881184975370165255887551781615748388533673675138860, 254), (0, 1), (_1, 254), (_2, 254), (0, 1), (11179562631109628533987091031692370366552561688588090155835439555627259799605, 254), (3443719903172018228650470536370404288991794296383447657609081676265727805364, 254), (0, 1), (_0, 254), (0, 254), (_0, 254), (0, 254), (1, 254), (0, 254)] [_13, _14, _15]", + "EXPR [ (1, _13) 7349266043899242844836273743257843180744506495159104166319746739537754653274 ]", + "BLACKBOX::MULTI_SCALAR_MUL [(1, 254), (17631683881184975370165255887551781615748388533673675138860, 254), (0, 1), (_0, 254), (0, 254)] [_16, _17, _18]", + "EXPR [ (1, _18) 0 ]", + "EXPR [ (1, _16) -1 ]", + "EXPR [ (1, _17) -17631683881184975370165255887551781615748388533673675138860 ]", + "EXPR [ (1, _1) (-1, _2) (-1, _19) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(19))], q_c: 0 })], outputs: [Simple(Witness(20))]", + "EXPR [ (1, _19, _20) (1, _21) -1 ]", + "EXPR [ (1, _19, _21) 0 ]", + "EXPR [ (-17631683881184975370165255887551781615748388533673675138858, _21) (-1, _22) 17631683881184975370165255887551781615748388533673675138860 ]", + "EXPR [ (-1, _23) 1 ]", + "BLACKBOX::EMBEDDED_CURVE_ADD [(_23, 254), (_22, 254), (_6, 1), (_23, 254), (_22, 254), (_6, 1)] [_24, _25, _26]", + "EXPR [ (1, _21, _24) (-1, _21) 0 ]", + "EXPR [ (-3078034153852398078128400807926804309327113743808504829582559963737223069693, _21) (-1, _27) 3078034153852398078128400807926804309327113743808504829582559963737223069694 ]", + "EXPR [ (9191351987198133172789796342745422989482268917117950487758512501574271532888, _21) (-1, _28) -9191351987198133172789796342745422989482268917117950487758512501574271532885 ]", + "BLACKBOX::EMBEDDED_CURVE_ADD [(_23, 254), (_22, 254), (_6, 1), (_27, 254), (_28, 254), (_6, 1)] [_29, _30, _31]", + "EXPR [ (1, _21, _29) (-1, _21) 0 ]", + "EXPR [ (1, _1, _21) (-1, _32) 1 ]", + "EXPR [ (1, _2, _21) (-17631683881184975370165255887551781615748388533673675138860, _21) (-1, _33) 17631683881184975370165255887551781615748388533673675138860 ]", + "BLACKBOX::EMBEDDED_CURVE_ADD [(_32, 254), (_33, 254), (_6, 1), (_32, 254), (_33, 254), (_6, 1)] [_34, _35, _36]", + "EXPR [ (1, _21, _34) (-1, _21) 0 ]", + "EXPR [ (1, _1, _21) (-3078034153852398078128400807926804309327113743808504829582559963737223069693, _21) (-1, _37) 3078034153852398078128400807926804309327113743808504829582559963737223069694 ]", + "EXPR [ (1, _2, _21) (9191351987198133172789796342745422989482268917117950487758512501574271532886, _21) (-1, _38) -9191351987198133172789796342745422989482268917117950487758512501574271532885 ]", + "BLACKBOX::EMBEDDED_CURVE_ADD [(_32, 254), (_33, 254), (_6, 1), (_37, 254), (_38, 254), (_6, 1)] [_39, _40, _41]", + "EXPR [ (1, _21, _39) (-1, _21) 0 ]", + "EXPR [ (1, _21) (-1, _42) 1 ]", + "EXPR [ (-17631683881184975370165255887551781615748388533673675138857, _21) (-1, _43) 17631683881184975370165255887551781615748388533673675138860 ]", + "EXPR [ (1, _1, _21) (-3078034153852398078128400807926804309327113743808504829582559963737223069694, _21) (-1, _44) 3078034153852398078128400807926804309327113743808504829582559963737223069694 ]", + "BLACKBOX::EMBEDDED_CURVE_ADD [(_42, 254), (_43, 254), (_6, 1), (_44, 254), (_38, 254), (_6, 1)] [_45, _46, _47]", + "EXPR [ (1, _21, _45) (-1, _21) 0 ]", + "EXPR [ (-3078034153852398078128400807926804309327113743808504829582559963737223069692, _21) (-1, _48) 3078034153852398078128400807926804309327113743808504829582559963737223069694 ]", + "EXPR [ (9191351987198133172789796342745422989482268917117950487758512501574271532889, _21) (-1, _49) -9191351987198133172789796342745422989482268917117950487758512501574271532885 ]", + "BLACKBOX::EMBEDDED_CURVE_ADD [(_42, 254), (_43, 254), (_6, 1), (_48, 254), (_49, 254), (_6, 1)] [_50, _51, _52]", + "EXPR [ (1, _21, _50) (-1, _21) 0 ]", + "BLACKBOX::EMBEDDED_CURVE_ADD [(_42, 254), (_43, 254), (_6, 1), (_42, 254), (_43, 254), (_6, 1)] [_53, _54, _55]", + "EXPR [ (1, _21, _53) (-1, _21) 0 ]", + "BLACKBOX::EMBEDDED_CURVE_ADD [(_23, 254), (_43, 254), (_6, 1), (_23, 254), (_43, 254), (_6, 1)] [_56, _57, _58]", + "EXPR [ (1, _21, _56) (-1, _21) 0 ]", + "EXPR [ (1, _1, _21) (-1, _21) (-1, _59) 1 ]", + "EXPR [ (9191351987198133172789796342745422989482268917117950487758512501574271532887, _21) (-1, _60) -9191351987198133172789796342745422989482268917117950487758512501574271532885 ]", + "BLACKBOX::EMBEDDED_CURVE_ADD [(_59, 254), (_43, 254), (_6, 1), (_44, 254), (_60, 254), (_6, 1)] [_61, _62, _63]", + "EXPR [ (1, _21, _61) (-1, _21) 0 ]", + "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": "XY5BCsQwCEXv4rqLWfcqw1BsaosgJtikMITefWyYQOlK/3/6tcJCc9km1jXuML4rzMYivE0SA2aO6m49B+hyykbkFty4byU00gyjFpEBDpTShvaE2mpGc/oagHTx6oErC13d+XGBge158UBjnIX+ci0abjR/Uyf942Qx0FKMrqTGPPsH", - "file_map": {}, + "debug_symbols": "tVjLbuowEP0Xr7PwvPzor1xdVZSmFVIEKIUrXVX9946LndCFUWuS1QGSOcwce04yfjfP/dP59XG3fzm8mYc/7+Zp3A3D7vVxOGw3p91hr7++f3SmfH08jX2vP5mr6xp13Iz9/mQe9udh6My/zXD+uuntuNl/4Wkz6lXbmX7/rKiEL7uhT58+ujna1kMxSA7G4KZw+XE8ecjxjKEWj/V4lsiFwPFcALg2Bqox3KiBeapBpEEDdrHEB2qId7GsgQeoxfsb8VjydwK1+kM93qNgSQAjNTAEsiWFQIw1BrghAgBanzn0s/ASJL5hN3hxRQzfsprBFSki2Vo88N0t8XOKlp4Ay1SEtM426ADkJwahqpIQ7lcirKqEcNkQ4DC2KBF8yQFi5KpLLmCTq/ok2qm50CI3KIHan4UBqImBpFSB5Kq7Cu+1S7zldnbyy2Bj1WMwLuB2eL/rEiyQx29IWlwXKeC0rlea/mJncPKBCwNL9TlKsoQasrIa7OZafGhRw/PUaZ5bXAsDTN0esPpuyPbOTmO4u9MYF1jTm3n8rNOYl8iDV95bga9e+W3TzghFDYxQdXEOS6gRVlYj0lwLQ8sEhFjecwil2ieyxB79DUmLGoR+rqVpliGOZRgiIayq4ZZQw62shvBci7R4KHlfeo2Crfq4W2IucivPRfqAnmuhpjnZSnkmsa3vLreEi7qVXZTBTrUAtLgoE5VeY3JV33BLuKhb2UVZd8RUS/y+sn/122a7G7+dfBmru6gzoLd0BjXBzlD6+87wBSQNkJ1xaf7qjFfQHEMaoDoT0/SgwTa9KyoqS9qagBkpo1KhEoNkdBl9xpBcTjFeEG1GSDamqHyk9yFl5IySOkDRpaFK0WcMGZWPNVtSvmQgBBkxo/KJ5k/KJ5o/SUaX0WdUPlE+Uj5RPrYZIaPyifKx8qUzB1Y+p3Es6X1LUflcus+nIybFkDFeUGw6cPpIqzruNk9Dn48kX8777dUJ5en/sVwpZ5jH8bDtn89jn9b065qu8ic=", + "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", + "path": "std/embedded_curve_ops.nr" + }, + "50": { + "source": "use std::{embedded_curve_ops::embedded_curve_add_unsafe, ops::Add};\n\nfn main(priv_key: Field, pub_x: pub Field, pub_y: pub Field) {\n let g1 = std::embedded_curve_ops::EmbeddedCurvePoint::generator();\n let scalar = std::embedded_curve_ops::EmbeddedCurveScalar { lo: priv_key, hi: 0 };\n // Test that multi_scalar_mul correctly derives the public key\n let res = std::embedded_curve_ops::multi_scalar_mul([g1], [scalar]);\n assert(res.x == pub_x);\n assert(res.y == pub_y);\n\n // Test that double function calling embedded_curve_add works as expected\n let pub_point =\n std::embedded_curve_ops::EmbeddedCurvePoint { x: pub_x, y: pub_y, is_infinite: false };\n let res = pub_point.double();\n let double = g1.add(g1);\n\n assert(double.x == res.x);\n\n // Test calling multi_scalar_mul with multiple points and scalars\n let res = std::embedded_curve_ops::multi_scalar_mul([g1, g1], [scalar, scalar]);\n\n // The results should be double the g1 point because the scalars are 1 and we pass in g1 twice\n assert(double.x == res.x);\n\n // Tests for #6549\n let const_scalar1 = std::embedded_curve_ops::EmbeddedCurveScalar { lo: 23, hi: 0 };\n let const_scalar2 = std::embedded_curve_ops::EmbeddedCurveScalar { lo: 0, hi: 23 };\n let const_scalar3 = std::embedded_curve_ops::EmbeddedCurveScalar { lo: 13, hi: 4 };\n let partial_mul = std::embedded_curve_ops::multi_scalar_mul(\n [g1, double, pub_point, g1, g1],\n [scalar, const_scalar1, scalar, const_scalar2, const_scalar3],\n );\n assert(partial_mul.x == 0x2024c4eebfbc8a20018f8c95c7aab77c6f34f10cf785a6f04e97452d8708fda7);\n // Check simplification by zero\n let zero_point = std::embedded_curve_ops::EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true };\n let const_zero = std::embedded_curve_ops::EmbeddedCurveScalar { lo: 0, hi: 0 };\n let partial_mul = std::embedded_curve_ops::multi_scalar_mul(\n [zero_point, double, g1],\n [scalar, const_zero, scalar],\n );\n assert(partial_mul == g1);\n\n // Additional tests for validating embedded_curve_add_unsafe under a conditional\n if pub_x == pub_y {\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 1, y: 2, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 1, y: 3, is_infinite: false };\n let doubling = a1.double();\n assert(doubling.x == 1);\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint {\n x: pub_x + 1,\n y: pub_y,\n is_infinite: false,\n };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint {\n x: pub_x + 1,\n y: pub_y + 1,\n is_infinite: false,\n };\n let doubling = a1.double();\n assert(doubling.x == 1);\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint {\n x: pub_x,\n y: pub_y + 1 as Field,\n is_infinite: false,\n };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 4, is_infinite: false };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 3, is_infinite: false };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 1, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 1, y: 3, is_infinite: false };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: pub_x, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: pub_x, y: 2, is_infinite: false };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n }\n}\n", + "path": "" + } + }, "names": [ "main" ], - "brillig_names": [] + "brillig_names": [ + "directive_invert" + ] } diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index c1154ee25c4..4e4ecc82ff4 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -45,10 +45,19 @@ expression: artifact "return value indices : []", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(2))], q_c: 0 })], outputs: []", "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: 15 }, 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) } }, Return, Call { location: 16 }, 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: 21 }, 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(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(4), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32838), size_address: Relative(4), offset_address: Relative(5) }, Mov { destination: Relative(1), source: Direct(32838) }, Mov { destination: Relative(2), source: Direct(32839) }, Mov { destination: Relative(3), source: Direct(32840) }, Call { location: 14 }, Call { location: 18 }, 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: Integer(U32), value: 1 }, Const { destination: Direct(32836), bit_size: Integer(U32), value: 2 }, Const { destination: Direct(32837), bit_size: Integer(U32), value: 3 }, Return, Call { location: 391 }, Const { destination: Relative(4), bit_size: Field, value: 1 }, Const { destination: Relative(5), bit_size: Field, value: 17631683881184975370165255887551781615748388533673675138860 }, Const { destination: Relative(6), bit_size: Integer(U1), value: 0 }, 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(4) }, 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(8), bit_size: Field, value: 0 }, Mov { destination: Relative(9), 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(9), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Mov { destination: Relative(11), source: Relative(10) }, 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: Relative(8) }, 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(7), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 2 }, 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(9), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32835) }, Load { destination: Relative(7), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(32836) }, Load { destination: Relative(9), source_pointer: Relative(11) }, BinaryFieldOp { destination: Relative(10), op: Equals, lhs: Relative(7), rhs: Relative(2) }, JumpIf { condition: Relative(10), location: 61 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(11) } }, BinaryFieldOp { destination: Relative(7), op: Equals, lhs: Relative(9), rhs: Relative(3) }, JumpIf { condition: Relative(7), location: 65 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(10) } }, 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(6) }, 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(11) }, Call { location: 397 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(7), source: Relative(13) }, Mov { destination: Relative(9), source: Relative(14) }, Mov { destination: Relative(10), source: Relative(15) }, 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) }, Mov { destination: Relative(19), source: Relative(4) }, Mov { destination: Relative(20), source: Relative(5) }, Mov { destination: Relative(21), source: Relative(6) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(14) }, Call { location: 397 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(11), source: Relative(16) }, Mov { destination: Relative(12), source: Relative(17) }, Mov { destination: Relative(13), source: Relative(18) }, BinaryFieldOp { destination: Relative(14), op: Equals, lhs: Relative(11), rhs: Relative(7) }, JumpIf { condition: Relative(14), location: 97 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(15) } }, Mov { destination: Relative(7), 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(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(7), 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(6) }, 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(5) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(6) }, Mov { destination: Relative(14), source: Direct(1) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 5 }, 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(1) }, 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(1) }, 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(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(7), rhs: Direct(2) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(16), size: Relative(17) }, scalars: HeapVector { pointer: Relative(18), size: Relative(19) }, outputs: HeapArray { pointer: Relative(20), size: 3 } }), BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(32835) }, Load { destination: Relative(7), source_pointer: Relative(14) }, BinaryFieldOp { destination: Relative(14), op: Equals, lhs: Relative(11), rhs: Relative(7) }, JumpIf { condition: Relative(14), location: 143 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(15) } }, Const { destination: Relative(7), bit_size: Field, value: 23 }, Mov { destination: Relative(14), source: Direct(1) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 9 }, 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(1) }, 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(7) }, 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(1) }, 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(4) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(8) }, Const { destination: Relative(7), bit_size: Field, value: 10456889356757736161582760391335869408742580538510966583040563008531594628700 }, Const { destination: Relative(15), bit_size: Field, value: 4714263418031017792755226781102360879566029698463912436805212494059649164343 }, Mov { destination: Relative(16), source: Direct(1) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 13 }, 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(4) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(5) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(6) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, 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(12) }, 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: Relative(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(3) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(6) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(7) }, 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: Relative(6) }, Mov { destination: Relative(7), 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(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 12 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 8 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(11), size: Relative(12) }, scalars: HeapVector { pointer: Relative(13), size: Relative(15) }, outputs: HeapArray { pointer: Relative(17), size: 3 } }), BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32835) }, Load { destination: Relative(11), source_pointer: Relative(12) }, Const { destination: Relative(7), bit_size: Field, value: -7349266043899242844836273743257843180744506495159104166319746739537754653274 }, BinaryFieldOp { destination: Relative(12), op: Equals, lhs: Relative(11), rhs: Relative(7) }, JumpIf { condition: Relative(12), location: 213 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(13) } }, Mov { destination: Relative(7), 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(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(7), 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(8) }, Mov { destination: Relative(1), 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(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(11), source: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(4) }, 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(6) }, Mov { destination: Relative(8), 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(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(8), 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(7), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32835) }, Load { destination: Relative(1), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32836) }, Load { destination: Relative(7), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32837) }, Load { destination: Relative(11), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U1, lhs: Relative(11), rhs: Relative(6) }, JumpIf { condition: Relative(8), location: 253 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(12) } }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(1), rhs: Relative(4) }, JumpIf { condition: Relative(8), location: 257 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(11) } }, BinaryFieldOp { destination: Relative(1), op: Equals, lhs: Relative(7), rhs: Relative(5) }, JumpIf { condition: Relative(1), location: 261 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(8) } }, BinaryFieldOp { destination: Relative(1), op: Equals, lhs: Relative(2), rhs: Relative(3) }, JumpIf { condition: Relative(1), location: 264 }, Jump { location: 390 }, Const { destination: Relative(1), bit_size: Field, 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(4) }, Mov { destination: Relative(12), source: Relative(1) }, Mov { destination: Relative(13), source: Relative(6) }, Mov { destination: Relative(14), source: Relative(4) }, Mov { destination: Relative(15), source: Relative(1) }, Mov { destination: Relative(16), source: Relative(6) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(9) }, Call { location: 397 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(5), source: Relative(11) }, Mov { destination: Relative(7), source: Relative(12) }, Mov { destination: Relative(8), source: Relative(13) }, BinaryFieldOp { destination: Relative(9), op: Equals, lhs: Relative(5), rhs: Relative(4) }, JumpIf { condition: Relative(9), location: 283 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(10) } }, Const { destination: Relative(5), bit_size: Field, value: 3 }, Mov { destination: Relative(9), 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(9), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(4), input1_y: Relative(1), input1_infinite: Relative(6), input2_x: Relative(4), input2_y: Relative(5), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(10), size: 3 } }), BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32835) }, Load { destination: Relative(10), source_pointer: Relative(11) }, BinaryFieldOp { destination: Relative(9), op: Equals, lhs: Relative(10), rhs: Relative(4) }, JumpIf { condition: Relative(9), location: 296 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(11) } }, BinaryFieldOp { destination: Relative(9), op: Add, lhs: Relative(2), rhs: Relative(4) }, BinaryFieldOp { destination: Relative(10), op: Add, lhs: Relative(3), rhs: Relative(4) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 15 }, Mov { destination: Relative(15), source: Direct(0) }, Mov { destination: Relative(16), source: Relative(9) }, Mov { destination: Relative(17), source: Relative(3) }, Mov { destination: Relative(18), source: Relative(6) }, Mov { destination: Relative(19), source: Relative(9) }, Mov { destination: Relative(20), source: Relative(3) }, Mov { destination: Relative(21), source: Relative(6) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(14) }, Call { location: 397 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(11), source: Relative(16) }, Mov { destination: Relative(12), source: Relative(17) }, Mov { destination: Relative(13), source: Relative(18) }, BinaryFieldOp { destination: Relative(14), op: Equals, lhs: Relative(11), rhs: Relative(4) }, JumpIf { condition: Relative(14), location: 316 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(15) } }, Mov { destination: Relative(11), source: Direct(1) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 4 }, 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) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(9), input1_y: Relative(3), input1_infinite: Relative(6), input2_x: Relative(9), input2_y: Relative(10), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(14), size: 3 } }), BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(32835) }, Load { destination: Relative(3), source_pointer: Relative(9) }, BinaryFieldOp { destination: Relative(9), op: Equals, lhs: Relative(3), rhs: Relative(4) }, JumpIf { condition: Relative(9), location: 328 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(11) } }, Mov { destination: Relative(3), 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(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(1), input1_y: Relative(5), input1_infinite: Relative(6), input2_x: Relative(2), input2_y: Relative(10), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(9), size: 3 } }), BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32835) }, Load { destination: Relative(9), source_pointer: Relative(10) }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(9), rhs: Relative(4) }, JumpIf { condition: Relative(3), location: 340 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(10) } }, Const { destination: Relative(3), bit_size: Field, value: 4 }, Mov { destination: Relative(9), 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(9), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(1), input1_y: Relative(5), input1_infinite: Relative(6), input2_x: Relative(1), input2_y: Relative(3), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(10), size: 3 } }), BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(32835) }, Load { destination: Relative(3), source_pointer: Relative(10) }, BinaryFieldOp { destination: Relative(9), op: Equals, lhs: Relative(3), rhs: Relative(4) }, JumpIf { condition: Relative(9), location: 353 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(10) } }, Mov { destination: Relative(3), 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(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(1), input1_y: Relative(5), input1_infinite: Relative(6), input2_x: Relative(1), input2_y: Relative(5), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(9), size: 3 } }), BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32835) }, Load { destination: Relative(9), source_pointer: Relative(10) }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(9), rhs: Relative(4) }, JumpIf { condition: Relative(3), location: 365 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(10) } }, Mov { destination: Relative(3), 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(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(4), input1_y: Relative(5), input1_infinite: Relative(6), input2_x: Relative(4), input2_y: Relative(5), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(9), size: 3 } }), BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32835) }, Load { destination: Relative(9), source_pointer: Relative(10) }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(9), rhs: Relative(4) }, JumpIf { condition: Relative(3), location: 377 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(10) } }, Mov { destination: Relative(3), 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(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(2), input1_y: Relative(5), input1_infinite: Relative(6), input2_x: Relative(2), input2_y: Relative(1), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(9), size: 3 } }), BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32835) }, Load { destination: Relative(1), source_pointer: Relative(2) }, BinaryFieldOp { destination: Relative(2), op: Equals, lhs: Relative(1), rhs: Relative(4) }, JumpIf { condition: Relative(2), location: 389 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(3) } }, Jump { location: 390 }, 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: 396 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 391 }, JumpIf { condition: Relative(3), location: 426 }, Jump { location: 400 }, JumpIf { condition: Relative(6), location: 418 }, Jump { location: 402 }, Mov { destination: Relative(13), source: Direct(1) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 4 }, 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) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(1), input1_y: Relative(2), input1_infinite: Relative(3), input2_x: Relative(4), input2_y: Relative(5), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(14), size: 3 } }), BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(32835) }, Load { destination: Relative(1), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(32836) }, Load { destination: Relative(2), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(32837) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Mov { destination: Relative(10), source: Relative(1) }, Mov { destination: Relative(11), source: Relative(2) }, Mov { destination: Relative(12), source: Relative(3) }, Jump { location: 422 }, Mov { destination: Relative(10), source: Relative(1) }, Mov { destination: Relative(11), source: Relative(2) }, Mov { destination: Relative(12), source: Relative(3) }, Jump { location: 422 }, Mov { destination: Relative(7), source: Relative(10) }, Mov { destination: Relative(8), source: Relative(11) }, Mov { destination: Relative(9), source: Relative(12) }, Jump { location: 430 }, Mov { destination: Relative(7), source: Relative(4) }, Mov { destination: Relative(8), source: Relative(5) }, Mov { destination: Relative(9), source: Relative(6) }, Jump { location: 430 }, Mov { destination: Relative(1), source: Relative(7) }, Mov { destination: Relative(2), source: Relative(8) }, Mov { destination: Relative(3), source: Relative(9) }, Return]" ], - "debug_symbols": "XY7BCoRACIbfxfMcag976FUiwiaLAXEGmwmW6N3XiQ1iL+rvp/4eMNNU1jHIEjfo+gMmDcxhHTl6zCGKdY/TwS3HrETWgge3rYRKkqGTwuxgRy7X0JZQrpxRjTYOSGbLdnAJTLU6BxPog/477qgBJ6afXIr4B82fdJP746TR01yU6qXKoKmhtdi3b/dqh7O6fQE=", - "file_map": {}, + "debug_symbols": "tZndTls7EEbfJddcbHv821epqiqFUEWKAkrhSEeIdz8ze7wSzsVGZUNu+BalXmw7HsdDXjZ3u1/Pv3/uj/cPfzbfvr9sfp32h8P+98/Dw+32af9w1H992Uz2JfTNt3CziZNH8Ige4pE8skfxqB7Nwy3iFnGLuEXcIm4Rt4hbxC3iFnFLcktyS3JLUotoJI/sUTyqR/Poc+TJI3hED7UkjeSRPYqHWrJG8+hzlMlDLUUjeohH8lBL0yge1aN59Dnq5BE8ood4JA+3VLdUt1S3VFuX6WbTppFhZBwpI9PIPLKMrCPbyOHrw9eHrw9fN5+ueU8j88gyso5sI7tnmCYgABEQIAEZKEAFGoA5YA6YA+aAOWAOmAPmgDlgDpgj5og5Yo6YI+aIOWKe60AMGtAHzNUwQwAiIEACMlAAMyeDBphZd2OYK2SGAETAzNUgARkoQAUa0AdY1TgEIAKYM+aMOWPOmDPmjLlgLpgL5oK5YC6YC+aCuWAumCvmirlirpgr5oq5Yq6YK+aKuWFumBvmhrlhbpgb5oa5YW6YO+aOuWPumDvmjrlj7pg75j7McZqAAERAgARkwMzNoAJm7gZ9wFyDMwQgAmqO8/tHAjJQgAo0oA+wGnQIQAQwR8wRc8QcMUfMEbNgFsyCWTALZsEsmAWzYBbMCXPCnDBbDcZokIAMFKACDTCz2PvsBAQgAgIkIAMFqEADMBfMVoMxGZinGGSgABVoQB9gFecQgAgIgLlirpgr5orZKi7aPrSKcwhABMxsm80qziEDBahAA/oAqziZDAJgd4L58iJAAjJgNwx7dazixJbOKk6yQXcQqziHAERAgARkoAAVaADmgDlgtoqTYiBAAjJg5mZQgQb0AVZxDgEwczcQwG5Jk0EGClABNado0AdYxTkEIAICmFkMMmDmZFCBBvQBVnHJJmgV5xABARKQgQKYuRo0wMw2d6s4hwBEQM3ZZmoV55CBAlSgAXZ7nK+5E6DmbHO3dz0HARJgZpup1aBDBRrQB1gNOpjZ9obVoIOZbcpWgw4ZKICZbYJWgw59gNWgQwAiYGbbG1aDDmouNmWrQYcKNIdk5VCigQAJyEABKmDD7T5v5TCDlYNDACJgZnl9vdnQ4vx8Ou121uG86Xm0E3rcnnbHp8234/PhcLP5Z3t4nv/Tn8ftcc6n7Ul/qk+9O95pqvB+f9gZvd5cRk/LQ/VUGoP1WDoPz389Xl/PMT7FtjQ+Lo9PuScEJV0mEMo6gywZ3plDSuc55LxiDVLpjG+yYnzpvAY1hKXx9Z3xkecvOayYf7W3DP/9svga9uXxesGvQ6AX+rbmCazI/QnqmhVshRXoMi2ND5/fhuGq+1CbTWEdpzKtWAftws6GLIsrGcrnV6JcdSVyYkNo39XXrESrPIM2G2nxZJo+fzRN11wJbZCoLe2M0oqV0LaH9wdtfFYZJDML7TUWd1XM1zuitKOJ50fodc0kkvWJbkh58ZiN7Z09pSt5Puj0jytpcUt8QFLXrEYql7nUtmY1cjlvilzWFJh2TGdDTasMLZy3douLlw9JV9xWLb25/kyrJtF4BG3VFqtL6hdsq49IVm2rLpe5pLDmNhgj7z/ahi2+pHbf+vRqfESyZjW0a7zMZdW9Tjs2LobamMXF1chfsRr5yquR02UueU25aw9HrWnPtnhopf4Vq9GvvBotXuYiq3qGKXN8auu4uLuyfMFqfESyZjW00z3PRT/6WLMaItRa0j8nLK7GV5yi+cqnqHZAl7n0Vf3gdK61MvXFi2f5ilO0rD5Ff+h329v96X+f0r6a7bTf/jrsxrf3z8fbNz99+veRn/Ap7+Pp4XZ393zamenNR7369bv0cCO9/Hi13/cf", + "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", + "path": "std/embedded_curve_ops.nr" + }, + "50": { + "source": "use std::{embedded_curve_ops::embedded_curve_add_unsafe, ops::Add};\n\nfn main(priv_key: Field, pub_x: pub Field, pub_y: pub Field) {\n let g1 = std::embedded_curve_ops::EmbeddedCurvePoint::generator();\n let scalar = std::embedded_curve_ops::EmbeddedCurveScalar { lo: priv_key, hi: 0 };\n // Test that multi_scalar_mul correctly derives the public key\n let res = std::embedded_curve_ops::multi_scalar_mul([g1], [scalar]);\n assert(res.x == pub_x);\n assert(res.y == pub_y);\n\n // Test that double function calling embedded_curve_add works as expected\n let pub_point =\n std::embedded_curve_ops::EmbeddedCurvePoint { x: pub_x, y: pub_y, is_infinite: false };\n let res = pub_point.double();\n let double = g1.add(g1);\n\n assert(double.x == res.x);\n\n // Test calling multi_scalar_mul with multiple points and scalars\n let res = std::embedded_curve_ops::multi_scalar_mul([g1, g1], [scalar, scalar]);\n\n // The results should be double the g1 point because the scalars are 1 and we pass in g1 twice\n assert(double.x == res.x);\n\n // Tests for #6549\n let const_scalar1 = std::embedded_curve_ops::EmbeddedCurveScalar { lo: 23, hi: 0 };\n let const_scalar2 = std::embedded_curve_ops::EmbeddedCurveScalar { lo: 0, hi: 23 };\n let const_scalar3 = std::embedded_curve_ops::EmbeddedCurveScalar { lo: 13, hi: 4 };\n let partial_mul = std::embedded_curve_ops::multi_scalar_mul(\n [g1, double, pub_point, g1, g1],\n [scalar, const_scalar1, scalar, const_scalar2, const_scalar3],\n );\n assert(partial_mul.x == 0x2024c4eebfbc8a20018f8c95c7aab77c6f34f10cf785a6f04e97452d8708fda7);\n // Check simplification by zero\n let zero_point = std::embedded_curve_ops::EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true };\n let const_zero = std::embedded_curve_ops::EmbeddedCurveScalar { lo: 0, hi: 0 };\n let partial_mul = std::embedded_curve_ops::multi_scalar_mul(\n [zero_point, double, g1],\n [scalar, const_zero, scalar],\n );\n assert(partial_mul == g1);\n\n // Additional tests for validating embedded_curve_add_unsafe under a conditional\n if pub_x == pub_y {\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 1, y: 2, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 1, y: 3, is_infinite: false };\n let doubling = a1.double();\n assert(doubling.x == 1);\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint {\n x: pub_x + 1,\n y: pub_y,\n is_infinite: false,\n };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint {\n x: pub_x + 1,\n y: pub_y + 1,\n is_infinite: false,\n };\n let doubling = a1.double();\n assert(doubling.x == 1);\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint {\n x: pub_x,\n y: pub_y + 1 as Field,\n is_infinite: false,\n };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 4, is_infinite: false };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 3, is_infinite: false };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 1, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 1, y: 3, is_infinite: false };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: pub_x, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: pub_x, y: 2, is_infinite: false };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n }\n}\n", + "path": "" + } + }, "names": [ "main" ], diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__force_brillig_true_inliner_0.snap index c1154ee25c4..3ebd817e856 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__force_brillig_true_inliner_0.snap @@ -45,10 +45,19 @@ expression: artifact "return value indices : []", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(2))], q_c: 0 })], outputs: []", "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: 15 }, 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) } }, Return, Call { location: 16 }, 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: 21 }, 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(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: 15 }, 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) } }, Return, Call { location: 349 }, Const { destination: Relative(4), bit_size: Field, value: 1 }, Const { destination: Relative(5), bit_size: Field, value: 17631683881184975370165255887551781615748388533673675138860 }, Const { destination: Relative(6), bit_size: Integer(U1), value: 0 }, 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(4) }, 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(8), bit_size: Field, value: 0 }, Mov { destination: Relative(9), 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(9), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Mov { destination: Relative(11), source: Relative(10) }, 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: Relative(8) }, 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(7), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 2 }, 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 } }), Const { destination: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(7) }, Load { destination: Relative(9), source_pointer: Relative(11) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(11) }, Load { destination: Relative(12), source_pointer: Relative(13) }, BinaryFieldOp { destination: Relative(10), op: Equals, lhs: Relative(9), rhs: Relative(2) }, JumpIf { condition: Relative(10), location: 60 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(13) } }, BinaryFieldOp { destination: Relative(9), op: Equals, lhs: Relative(12), rhs: Relative(3) }, JumpIf { condition: Relative(9), location: 64 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(10) } }, Mov { destination: Relative(9), 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(9), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(2), input1_y: Relative(3), input1_infinite: Relative(6), input2_x: Relative(2), input2_y: Relative(3), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(10), size: 3 } }), BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(7) }, Load { destination: Relative(10), source_pointer: Relative(12) }, Const { destination: Relative(9), bit_size: Field, value: 3078034153852398078128400807926804309327113743808504829582559963737223069694 }, BinaryFieldOp { destination: Relative(12), op: Equals, lhs: Relative(9), rhs: Relative(10) }, JumpIf { condition: Relative(12), location: 77 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(13) } }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Relative(13), source: Relative(12) }, 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(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(4) }, 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) }, Mov { destination: Relative(12), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 5 }, 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(1) }, 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(1) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(8) }, Mov { destination: Relative(13), source: Direct(1) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 4 }, 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(10), rhs: Direct(2) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(14), size: Relative(15) }, scalars: HeapVector { pointer: Relative(16), size: Relative(17) }, outputs: HeapArray { pointer: Relative(18), size: 3 } }), BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(7) }, Load { destination: Relative(10), source_pointer: Relative(12) }, BinaryFieldOp { destination: Relative(12), op: Equals, lhs: Relative(9), rhs: Relative(10) }, JumpIf { condition: Relative(12), location: 123 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(13) } }, Mov { destination: Relative(9), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(9), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Mov { destination: Relative(12), source: Relative(10) }, 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(8) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, 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(8) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(4) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(8) }, Const { destination: Relative(10), bit_size: Field, value: 11179562631109628533987091031692370366552561688588090155835439555627259799605 }, Const { destination: Relative(12), bit_size: Field, value: 3443719903172018228650470536370404288991794296383447657609081676265727805364 }, Mov { destination: Relative(13), 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(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(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(6) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(3) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(6) }, 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(12) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(6) }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(12), size: Relative(14) }, scalars: HeapVector { pointer: Relative(15), size: Relative(16) }, outputs: HeapArray { pointer: Relative(17), size: 3 } }), BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(7) }, Load { destination: Relative(9), source_pointer: Relative(12) }, Const { destination: Relative(10), bit_size: Field, value: -7349266043899242844836273743257843180744506495159104166319746739537754653274 }, BinaryFieldOp { destination: Relative(12), op: Equals, lhs: Relative(9), rhs: Relative(10) }, JumpIf { condition: Relative(12), location: 182 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(13) } }, Mov { destination: Relative(9), 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(9), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Mov { destination: Relative(12), source: Relative(10) }, 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(8) }, Mov { destination: Relative(1), 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(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(10), source: Relative(8) }, 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(5) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(6) }, Mov { destination: Relative(8), 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(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(10), size: Relative(12) }, scalars: HeapVector { pointer: Relative(13), size: Relative(14) }, outputs: HeapArray { pointer: Relative(15), size: 3 } }), BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Load { destination: Relative(1), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(11) }, Load { destination: Relative(9), source_pointer: Relative(10) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(10) }, Load { destination: Relative(11), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U1, lhs: Relative(11), rhs: Relative(6) }, JumpIf { condition: Relative(8), location: 223 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(10) } }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(1), rhs: Relative(4) }, JumpIf { condition: Relative(8), location: 227 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(10) } }, BinaryFieldOp { destination: Relative(1), op: Equals, lhs: Relative(9), rhs: Relative(5) }, JumpIf { condition: Relative(1), location: 231 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(8) } }, BinaryFieldOp { destination: Relative(1), op: Equals, lhs: Relative(2), rhs: Relative(3) }, JumpIf { condition: Relative(1), location: 234 }, Jump { location: 348 }, Const { destination: Relative(1), bit_size: Field, value: 2 }, 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) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(4), input1_y: Relative(1), input1_infinite: Relative(6), input2_x: Relative(4), input2_y: Relative(1), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(8), size: 3 } }), BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Load { destination: Relative(8), source_pointer: Relative(9) }, BinaryFieldOp { destination: Relative(5), op: Equals, lhs: Relative(8), rhs: Relative(4) }, JumpIf { condition: Relative(5), location: 247 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(9) } }, Const { destination: Relative(5), bit_size: Field, value: 3 }, 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) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(4), input1_y: Relative(1), input1_infinite: Relative(6), input2_x: Relative(4), input2_y: Relative(5), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(9), size: 3 } }), BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Load { destination: Relative(9), source_pointer: Relative(10) }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(9), rhs: Relative(4) }, JumpIf { condition: Relative(8), location: 260 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(10) } }, BinaryFieldOp { destination: Relative(8), op: Add, lhs: Relative(2), rhs: Relative(4) }, BinaryFieldOp { destination: Relative(9), op: Add, lhs: Relative(3), rhs: Relative(4) }, 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) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(8), input1_y: Relative(3), input1_infinite: Relative(6), input2_x: Relative(8), input2_y: Relative(3), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(11), size: 3 } }), BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(7) }, Load { destination: Relative(11), source_pointer: Relative(12) }, BinaryFieldOp { destination: Relative(10), op: Equals, lhs: Relative(11), rhs: Relative(4) }, JumpIf { condition: Relative(10), location: 274 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(12) } }, 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) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(8), input1_y: Relative(3), input1_infinite: Relative(6), input2_x: Relative(8), input2_y: Relative(9), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(11), size: 3 } }), BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(7) }, Load { destination: Relative(3), source_pointer: Relative(8) }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(3), rhs: Relative(4) }, JumpIf { condition: Relative(8), location: 286 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(10) } }, Mov { destination: Relative(3), 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(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(1), input1_y: Relative(5), input1_infinite: Relative(6), input2_x: Relative(2), input2_y: Relative(9), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(8), size: 3 } }), BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(7) }, Load { destination: Relative(8), source_pointer: Relative(9) }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(8), rhs: Relative(4) }, JumpIf { condition: Relative(3), location: 298 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(9) } }, Const { destination: Relative(3), bit_size: Field, value: 4 }, 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) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(1), input1_y: Relative(5), input1_infinite: Relative(6), input2_x: Relative(1), input2_y: Relative(3), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(9), size: 3 } }), BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Load { destination: Relative(3), source_pointer: Relative(9) }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(3), rhs: Relative(4) }, JumpIf { condition: Relative(8), location: 311 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(9) } }, Mov { destination: Relative(3), 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(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(1), input1_y: Relative(5), input1_infinite: Relative(6), input2_x: Relative(1), input2_y: Relative(5), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(8), size: 3 } }), BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(7) }, Load { destination: Relative(8), source_pointer: Relative(9) }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(8), rhs: Relative(4) }, JumpIf { condition: Relative(3), location: 323 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(9) } }, Mov { destination: Relative(3), 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(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(4), input1_y: Relative(5), input1_infinite: Relative(6), input2_x: Relative(4), input2_y: Relative(5), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(8), size: 3 } }), BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(7) }, Load { destination: Relative(8), source_pointer: Relative(9) }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(8), rhs: Relative(4) }, JumpIf { condition: Relative(3), location: 335 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(9) } }, Mov { destination: Relative(3), 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(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(2), input1_y: Relative(5), input1_infinite: Relative(6), input2_x: Relative(2), input2_y: Relative(1), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(8), size: 3 } }), BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(7) }, Load { destination: Relative(1), source_pointer: Relative(2) }, BinaryFieldOp { destination: Relative(2), op: Equals, lhs: Relative(1), rhs: Relative(4) }, JumpIf { condition: Relative(2), location: 347 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(3) } }, Jump { location: 348 }, 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: 354 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "XY7BCoRACIbfxfMcag976FUiwiaLAXEGmwmW6N3XiQ1iL+rvp/4eMNNU1jHIEjfo+gMmDcxhHTl6zCGKdY/TwS3HrETWgge3rYRKkqGTwuxgRy7X0JZQrpxRjTYOSGbLdnAJTLU6BxPog/477qgBJ6afXIr4B82fdJP746TR01yU6qXKoKmhtdi3b/dqh7O6fQE=", - "file_map": {}, + "debug_symbols": "tZndThs9EIbvJccc2J4f29xKVaEAoYoUBZTCJ31C3Htndvwm9GBR2SQnfR9K/TT2euxZ5X31uLl/+3W33T89/17d/nhf3R+2u932193u+WH9un3e29++r5L/kXV1m29WuUa0iD5FSRE5okRQBEdIRFhKWEpYSlgoLBQWCguFhcJCYaGwUFgoLBQWNgtZ5IgSQREcIREaUSNaRJ9CzMIWOaJEUARHSIRZxKJGtIg+hZpFLXJEiaAIn1GylJE6so5sI3tk9dWx+dU80tenWNJIHikjdWQd2Ub2yJZG5pHD14avDV8bvjZ8bfja8LXh68PXh68PXx++Pnx9+Prw9eHrw9eHL6cEyIACIAADBKAA97JDA/QBOQEyoAAIwAABKMDN4tAAbrZnmqdCmCADCsDNzYEBAlBABTRAHzAVxwQZUAAwE8wEM8FMMBPMBDPDzDAzzAwzw8wwM8wMM8PMMAvMArPALDALzAKzwCwwC8wCs8KsMCvMCrPCrDArzAqzwqwwV5grzBXmCnOFeaq17qAAM5fk0AB9gBdcQAaYufhe9ZoLYIAAFFABDdAHeOkFZADMHeYOc4e5w9xh7jD3YS4pATKgAAjAAAEooAIaAOYMc4bZa7CQAwEYIAAFVEADuJn99kmADCgAAjBAAAqogAaAmWD2Gizi4J7uIAAFVEAD9AFecQF+SSWHAvCLaro1GSAABfiF5VOerqwJ+gCvuIAMKAACuNln4RUX4GafjldcQAP0AV5xpA5urg5+KU5XOgEYIAAFVICZ2R+3V9wEXnHsH8wrLqAACOBm/xhecQEKqIAG6AO84tg/s1dcgJv9w3vFBTBAAG72p+MVF9AAfYBXXEAGmFn8CXrFBZhZpu5GAAqoAG8XfIJecQ7kFReQAQVAAAa4mR0U4GZxaIA+wCsuwM3VoQAIwAABKMDNzaEB3Ny9U0uADCgAb3ambo4BAlBABTSAmbV485cA3kL5lP3WCyAAA9zsE/QaDKiABugDvAYD3KwOBeBmn7LXYIAA3Fw/Pm5WaJDvXg+bjffHnzpm66Nf1ofN/nV1u3/b7W5W/613b9M/+v2y3k/5uj7Yb22bbPaPliZ82u42Th83p9Fpfqjt1zHYNuxxuPzzeKp5jOfS5saX+fEsnSFQPk0g6zIDzRm+mAPzcQ4iC9aAtWN8owXjteMZ1Jznxtcvxhd8fpU8N//2xfjEmICmPvsM+rzBGt9Uh8JY+AKOuuBJVlGsZF3yJJpiJTulufGZzt7O/65Ysp/tdYawkEnTgnWwPv9oEJpdyVzPX4l61ZUQxoawzr4vWYlW8RmsneXZEy6ff8Tla66EteAoLuu9ecFKWGONe8Za60UGEszC+tvZXVX0zKOu1LPPutIucNh9R7LktLNXgnJcz16XPBH2988wsMzePVQusBrfkSxaDdbTXGpbshqixx0uuuS0sBeMo6HyIkPLxzptZbYjo3ZmjVA/u0Y4XWBXfEeyaFc0/tTgpkVPpGE97TVt9txjvsRq8JVXo9NpLpyX9PuloDOwV7DZ/cmXOD/5yuenvTGe5rKocyfuqBQSKnMGucT5KVc+P+1yPs1FlpxdVCtqjVqaPYFFL7EaeuXVaOU0F1r0VpgEdwGn+d2llzhF9cqnKNu3KJiLfe2xZDWIUGtMOntu6CVOUb3yKcq2I45z6X8/2Z/20/phe/jrm88Pdx226/vdZvz49LZ/+PTb1/9f8Bt8c/pyeH7YPL4dNm769PWp/fnDjp0bK9efH/7//QE=", + "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", + "path": "std/embedded_curve_ops.nr" + }, + "50": { + "source": "use std::{embedded_curve_ops::embedded_curve_add_unsafe, ops::Add};\n\nfn main(priv_key: Field, pub_x: pub Field, pub_y: pub Field) {\n let g1 = std::embedded_curve_ops::EmbeddedCurvePoint::generator();\n let scalar = std::embedded_curve_ops::EmbeddedCurveScalar { lo: priv_key, hi: 0 };\n // Test that multi_scalar_mul correctly derives the public key\n let res = std::embedded_curve_ops::multi_scalar_mul([g1], [scalar]);\n assert(res.x == pub_x);\n assert(res.y == pub_y);\n\n // Test that double function calling embedded_curve_add works as expected\n let pub_point =\n std::embedded_curve_ops::EmbeddedCurvePoint { x: pub_x, y: pub_y, is_infinite: false };\n let res = pub_point.double();\n let double = g1.add(g1);\n\n assert(double.x == res.x);\n\n // Test calling multi_scalar_mul with multiple points and scalars\n let res = std::embedded_curve_ops::multi_scalar_mul([g1, g1], [scalar, scalar]);\n\n // The results should be double the g1 point because the scalars are 1 and we pass in g1 twice\n assert(double.x == res.x);\n\n // Tests for #6549\n let const_scalar1 = std::embedded_curve_ops::EmbeddedCurveScalar { lo: 23, hi: 0 };\n let const_scalar2 = std::embedded_curve_ops::EmbeddedCurveScalar { lo: 0, hi: 23 };\n let const_scalar3 = std::embedded_curve_ops::EmbeddedCurveScalar { lo: 13, hi: 4 };\n let partial_mul = std::embedded_curve_ops::multi_scalar_mul(\n [g1, double, pub_point, g1, g1],\n [scalar, const_scalar1, scalar, const_scalar2, const_scalar3],\n );\n assert(partial_mul.x == 0x2024c4eebfbc8a20018f8c95c7aab77c6f34f10cf785a6f04e97452d8708fda7);\n // Check simplification by zero\n let zero_point = std::embedded_curve_ops::EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true };\n let const_zero = std::embedded_curve_ops::EmbeddedCurveScalar { lo: 0, hi: 0 };\n let partial_mul = std::embedded_curve_ops::multi_scalar_mul(\n [zero_point, double, g1],\n [scalar, const_zero, scalar],\n );\n assert(partial_mul == g1);\n\n // Additional tests for validating embedded_curve_add_unsafe under a conditional\n if pub_x == pub_y {\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 1, y: 2, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 1, y: 3, is_infinite: false };\n let doubling = a1.double();\n assert(doubling.x == 1);\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint {\n x: pub_x + 1,\n y: pub_y,\n is_infinite: false,\n };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint {\n x: pub_x + 1,\n y: pub_y + 1,\n is_infinite: false,\n };\n let doubling = a1.double();\n assert(doubling.x == 1);\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint {\n x: pub_x,\n y: pub_y + 1 as Field,\n is_infinite: false,\n };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 4, is_infinite: false };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 3, is_infinite: false };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 1, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 1, y: 3, is_infinite: false };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: pub_x, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: pub_x, y: 2, is_infinite: false };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n }\n}\n", + "path": "" + } + }, "names": [ "main" ], diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index c1154ee25c4..3ebd817e856 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -45,10 +45,19 @@ expression: artifact "return value indices : []", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(2))], q_c: 0 })], outputs: []", "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: 15 }, 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) } }, Return, Call { location: 16 }, 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: 21 }, 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(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: 15 }, 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) } }, Return, Call { location: 349 }, Const { destination: Relative(4), bit_size: Field, value: 1 }, Const { destination: Relative(5), bit_size: Field, value: 17631683881184975370165255887551781615748388533673675138860 }, Const { destination: Relative(6), bit_size: Integer(U1), value: 0 }, 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(4) }, 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(8), bit_size: Field, value: 0 }, Mov { destination: Relative(9), 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(9), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Mov { destination: Relative(11), source: Relative(10) }, 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: Relative(8) }, 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(7), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 2 }, 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 } }), Const { destination: Relative(7), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(7) }, Load { destination: Relative(9), source_pointer: Relative(11) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(11) }, Load { destination: Relative(12), source_pointer: Relative(13) }, BinaryFieldOp { destination: Relative(10), op: Equals, lhs: Relative(9), rhs: Relative(2) }, JumpIf { condition: Relative(10), location: 60 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(13) } }, BinaryFieldOp { destination: Relative(9), op: Equals, lhs: Relative(12), rhs: Relative(3) }, JumpIf { condition: Relative(9), location: 64 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(10) } }, Mov { destination: Relative(9), 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(9), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(2), input1_y: Relative(3), input1_infinite: Relative(6), input2_x: Relative(2), input2_y: Relative(3), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(10), size: 3 } }), BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(7) }, Load { destination: Relative(10), source_pointer: Relative(12) }, Const { destination: Relative(9), bit_size: Field, value: 3078034153852398078128400807926804309327113743808504829582559963737223069694 }, BinaryFieldOp { destination: Relative(12), op: Equals, lhs: Relative(9), rhs: Relative(10) }, JumpIf { condition: Relative(12), location: 77 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(13) } }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Relative(13), source: Relative(12) }, 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(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(4) }, 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) }, Mov { destination: Relative(12), source: Direct(1) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 5 }, 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(1) }, 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(1) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(8) }, Mov { destination: Relative(13), source: Direct(1) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 4 }, 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(10), rhs: Direct(2) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Const { destination: Relative(17), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(14), size: Relative(15) }, scalars: HeapVector { pointer: Relative(16), size: Relative(17) }, outputs: HeapArray { pointer: Relative(18), size: 3 } }), BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(7) }, Load { destination: Relative(10), source_pointer: Relative(12) }, BinaryFieldOp { destination: Relative(12), op: Equals, lhs: Relative(9), rhs: Relative(10) }, JumpIf { condition: Relative(12), location: 123 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(13) } }, Mov { destination: Relative(9), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(9), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Mov { destination: Relative(12), source: Relative(10) }, 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(8) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, 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(8) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(4) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(12), source: Relative(8) }, Const { destination: Relative(10), bit_size: Field, value: 11179562631109628533987091031692370366552561688588090155835439555627259799605 }, Const { destination: Relative(12), bit_size: Field, value: 3443719903172018228650470536370404288991794296383447657609081676265727805364 }, Mov { destination: Relative(13), 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(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(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(6) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(3) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(6) }, 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(12) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(6) }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(12), size: Relative(14) }, scalars: HeapVector { pointer: Relative(15), size: Relative(16) }, outputs: HeapArray { pointer: Relative(17), size: 3 } }), BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(7) }, Load { destination: Relative(9), source_pointer: Relative(12) }, Const { destination: Relative(10), bit_size: Field, value: -7349266043899242844836273743257843180744506495159104166319746739537754653274 }, BinaryFieldOp { destination: Relative(12), op: Equals, lhs: Relative(9), rhs: Relative(10) }, JumpIf { condition: Relative(12), location: 182 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(13) } }, Mov { destination: Relative(9), 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(9), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Mov { destination: Relative(12), source: Relative(10) }, 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(8) }, Mov { destination: Relative(1), 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(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(10), source: Relative(8) }, 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(5) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(6) }, Mov { destination: Relative(8), 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(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(10), size: Relative(12) }, scalars: HeapVector { pointer: Relative(13), size: Relative(14) }, outputs: HeapArray { pointer: Relative(15), size: 3 } }), BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Load { destination: Relative(1), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(11) }, Load { destination: Relative(9), source_pointer: Relative(10) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(10) }, Load { destination: Relative(11), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U1, lhs: Relative(11), rhs: Relative(6) }, JumpIf { condition: Relative(8), location: 223 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(10) } }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(1), rhs: Relative(4) }, JumpIf { condition: Relative(8), location: 227 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(10) } }, BinaryFieldOp { destination: Relative(1), op: Equals, lhs: Relative(9), rhs: Relative(5) }, JumpIf { condition: Relative(1), location: 231 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(8) } }, BinaryFieldOp { destination: Relative(1), op: Equals, lhs: Relative(2), rhs: Relative(3) }, JumpIf { condition: Relative(1), location: 234 }, Jump { location: 348 }, Const { destination: Relative(1), bit_size: Field, value: 2 }, 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) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(4), input1_y: Relative(1), input1_infinite: Relative(6), input2_x: Relative(4), input2_y: Relative(1), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(8), size: 3 } }), BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Load { destination: Relative(8), source_pointer: Relative(9) }, BinaryFieldOp { destination: Relative(5), op: Equals, lhs: Relative(8), rhs: Relative(4) }, JumpIf { condition: Relative(5), location: 247 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(9) } }, Const { destination: Relative(5), bit_size: Field, value: 3 }, 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) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(4), input1_y: Relative(1), input1_infinite: Relative(6), input2_x: Relative(4), input2_y: Relative(5), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(9), size: 3 } }), BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Load { destination: Relative(9), source_pointer: Relative(10) }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(9), rhs: Relative(4) }, JumpIf { condition: Relative(8), location: 260 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(10) } }, BinaryFieldOp { destination: Relative(8), op: Add, lhs: Relative(2), rhs: Relative(4) }, BinaryFieldOp { destination: Relative(9), op: Add, lhs: Relative(3), rhs: Relative(4) }, 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) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(8), input1_y: Relative(3), input1_infinite: Relative(6), input2_x: Relative(8), input2_y: Relative(3), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(11), size: 3 } }), BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(7) }, Load { destination: Relative(11), source_pointer: Relative(12) }, BinaryFieldOp { destination: Relative(10), op: Equals, lhs: Relative(11), rhs: Relative(4) }, JumpIf { condition: Relative(10), location: 274 }, Const { destination: Relative(12), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(12) } }, 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) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(8), input1_y: Relative(3), input1_infinite: Relative(6), input2_x: Relative(8), input2_y: Relative(9), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(11), size: 3 } }), BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(10), rhs: Relative(7) }, Load { destination: Relative(3), source_pointer: Relative(8) }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(3), rhs: Relative(4) }, JumpIf { condition: Relative(8), location: 286 }, Const { destination: Relative(10), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(10) } }, Mov { destination: Relative(3), 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(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(1), input1_y: Relative(5), input1_infinite: Relative(6), input2_x: Relative(2), input2_y: Relative(9), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(8), size: 3 } }), BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(7) }, Load { destination: Relative(8), source_pointer: Relative(9) }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(8), rhs: Relative(4) }, JumpIf { condition: Relative(3), location: 298 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(9) } }, Const { destination: Relative(3), bit_size: Field, value: 4 }, 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) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(1), input1_y: Relative(5), input1_infinite: Relative(6), input2_x: Relative(1), input2_y: Relative(3), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(9), size: 3 } }), BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Load { destination: Relative(3), source_pointer: Relative(9) }, BinaryFieldOp { destination: Relative(8), op: Equals, lhs: Relative(3), rhs: Relative(4) }, JumpIf { condition: Relative(8), location: 311 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(9) } }, Mov { destination: Relative(3), 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(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(1), input1_y: Relative(5), input1_infinite: Relative(6), input2_x: Relative(1), input2_y: Relative(5), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(8), size: 3 } }), BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(7) }, Load { destination: Relative(8), source_pointer: Relative(9) }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(8), rhs: Relative(4) }, JumpIf { condition: Relative(3), location: 323 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(9) } }, Mov { destination: Relative(3), 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(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(4), input1_y: Relative(5), input1_infinite: Relative(6), input2_x: Relative(4), input2_y: Relative(5), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(8), size: 3 } }), BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(7) }, Load { destination: Relative(8), source_pointer: Relative(9) }, BinaryFieldOp { destination: Relative(3), op: Equals, lhs: Relative(8), rhs: Relative(4) }, JumpIf { condition: Relative(3), location: 335 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(9) } }, Mov { destination: Relative(3), 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(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(2), input1_y: Relative(5), input1_infinite: Relative(6), input2_x: Relative(2), input2_y: Relative(1), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(8), size: 3 } }), BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(7) }, Load { destination: Relative(1), source_pointer: Relative(2) }, BinaryFieldOp { destination: Relative(2), op: Equals, lhs: Relative(1), rhs: Relative(4) }, JumpIf { condition: Relative(2), location: 347 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(3) } }, Jump { location: 348 }, 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: 354 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "XY7BCoRACIbfxfMcag976FUiwiaLAXEGmwmW6N3XiQ1iL+rvp/4eMNNU1jHIEjfo+gMmDcxhHTl6zCGKdY/TwS3HrETWgge3rYRKkqGTwuxgRy7X0JZQrpxRjTYOSGbLdnAJTLU6BxPog/477qgBJ6afXIr4B82fdJP746TR01yU6qXKoKmhtdi3b/dqh7O6fQE=", - "file_map": {}, + "debug_symbols": "tZndThs9EIbvJccc2J4f29xKVaEAoYoUBZTCJ31C3Htndvwm9GBR2SQnfR9K/TT2euxZ5X31uLl/+3W33T89/17d/nhf3R+2u932193u+WH9un3e29++r5L/kXV1m29WuUa0iD5FSRE5okRQBEdIRFhKWEpYSlgoLBQWCguFhcJCYaGwUFgoLBQWNgtZ5IgSQREcIREaUSNaRJ9CzMIWOaJEUARHSIRZxKJGtIg+hZpFLXJEiaAIn1GylJE6so5sI3tk9dWx+dU80tenWNJIHikjdWQd2Ub2yJZG5pHD14avDV8bvjZ8bfja8LXh68PXh68PXx++Pnx9+Prw9eHrw9eHL6cEyIACIAADBKAA97JDA/QBOQEyoAAIwAABKMDN4tAAbrZnmqdCmCADCsDNzYEBAlBABTRAHzAVxwQZUAAwE8wEM8FMMBPMBDPDzDAzzAwzw8wwM8wMM8PMMAvMArPALDALzAKzwCwwC8wCs8KsMCvMCrPCrDArzAqzwqwwV5grzBXmCnOFeaq17qAAM5fk0AB9gBdcQAaYufhe9ZoLYIAAFFABDdAHeOkFZADMHeYOc4e5w9xh7jD3YS4pATKgAAjAAAEooAIaAOYMc4bZa7CQAwEYIAAFVEADuJn99kmADCgAAjBAAAqogAaAmWD2Gizi4J7uIAAFVEAD9AFecQF+SSWHAvCLaro1GSAABfiF5VOerqwJ+gCvuIAMKAACuNln4RUX4GafjldcQAP0AV5xpA5urg5+KU5XOgEYIAAFVICZ2R+3V9wEXnHsH8wrLqAACOBm/xhecQEKqIAG6AO84tg/s1dcgJv9w3vFBTBAAG72p+MVF9AAfYBXXEAGmFn8CXrFBZhZpu5GAAqoAG8XfIJecQ7kFReQAQVAAAa4mR0U4GZxaIA+wCsuwM3VoQAIwAABKMDNzaEB3Ny9U0uADCgAb3ambo4BAlBABTSAmbV485cA3kL5lP3WCyAAA9zsE/QaDKiABugDvAYD3KwOBeBmn7LXYIAA3Fw/Pm5WaJDvXg+bjffHnzpm66Nf1ofN/nV1u3/b7W5W/613b9M/+v2y3k/5uj7Yb22bbPaPliZ82u42Th83p9Fpfqjt1zHYNuxxuPzzeKp5jOfS5saX+fEsnSFQPk0g6zIDzRm+mAPzcQ4iC9aAtWN8owXjteMZ1Jznxtcvxhd8fpU8N//2xfjEmICmPvsM+rzBGt9Uh8JY+AKOuuBJVlGsZF3yJJpiJTulufGZzt7O/65Ysp/tdYawkEnTgnWwPv9oEJpdyVzPX4l61ZUQxoawzr4vWYlW8RmsneXZEy6ff8Tla66EteAoLuu9ecFKWGONe8Za60UGEszC+tvZXVX0zKOu1LPPutIucNh9R7LktLNXgnJcz16XPBH2988wsMzePVQusBrfkSxaDdbTXGpbshqixx0uuuS0sBeMo6HyIkPLxzptZbYjo3ZmjVA/u0Y4XWBXfEeyaFc0/tTgpkVPpGE97TVt9txjvsRq8JVXo9NpLpyX9PuloDOwV7DZ/cmXOD/5yuenvTGe5rKocyfuqBQSKnMGucT5KVc+P+1yPs1FlpxdVCtqjVqaPYFFL7EaeuXVaOU0F1r0VpgEdwGn+d2llzhF9cqnKNu3KJiLfe2xZDWIUGtMOntu6CVOUb3yKcq2I45z6X8/2Z/20/phe/jrm88Pdx226/vdZvz49LZ/+PTb1/9f8Bt8c/pyeH7YPL4dNm769PWp/fnDjp0bK9efH/7//QE=", + "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", + "path": "std/embedded_curve_ops.nr" + }, + "50": { + "source": "use std::{embedded_curve_ops::embedded_curve_add_unsafe, ops::Add};\n\nfn main(priv_key: Field, pub_x: pub Field, pub_y: pub Field) {\n let g1 = std::embedded_curve_ops::EmbeddedCurvePoint::generator();\n let scalar = std::embedded_curve_ops::EmbeddedCurveScalar { lo: priv_key, hi: 0 };\n // Test that multi_scalar_mul correctly derives the public key\n let res = std::embedded_curve_ops::multi_scalar_mul([g1], [scalar]);\n assert(res.x == pub_x);\n assert(res.y == pub_y);\n\n // Test that double function calling embedded_curve_add works as expected\n let pub_point =\n std::embedded_curve_ops::EmbeddedCurvePoint { x: pub_x, y: pub_y, is_infinite: false };\n let res = pub_point.double();\n let double = g1.add(g1);\n\n assert(double.x == res.x);\n\n // Test calling multi_scalar_mul with multiple points and scalars\n let res = std::embedded_curve_ops::multi_scalar_mul([g1, g1], [scalar, scalar]);\n\n // The results should be double the g1 point because the scalars are 1 and we pass in g1 twice\n assert(double.x == res.x);\n\n // Tests for #6549\n let const_scalar1 = std::embedded_curve_ops::EmbeddedCurveScalar { lo: 23, hi: 0 };\n let const_scalar2 = std::embedded_curve_ops::EmbeddedCurveScalar { lo: 0, hi: 23 };\n let const_scalar3 = std::embedded_curve_ops::EmbeddedCurveScalar { lo: 13, hi: 4 };\n let partial_mul = std::embedded_curve_ops::multi_scalar_mul(\n [g1, double, pub_point, g1, g1],\n [scalar, const_scalar1, scalar, const_scalar2, const_scalar3],\n );\n assert(partial_mul.x == 0x2024c4eebfbc8a20018f8c95c7aab77c6f34f10cf785a6f04e97452d8708fda7);\n // Check simplification by zero\n let zero_point = std::embedded_curve_ops::EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true };\n let const_zero = std::embedded_curve_ops::EmbeddedCurveScalar { lo: 0, hi: 0 };\n let partial_mul = std::embedded_curve_ops::multi_scalar_mul(\n [zero_point, double, g1],\n [scalar, const_zero, scalar],\n );\n assert(partial_mul == g1);\n\n // Additional tests for validating embedded_curve_add_unsafe under a conditional\n if pub_x == pub_y {\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 1, y: 2, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 1, y: 3, is_infinite: false };\n let doubling = a1.double();\n assert(doubling.x == 1);\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint {\n x: pub_x + 1,\n y: pub_y,\n is_infinite: false,\n };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint {\n x: pub_x + 1,\n y: pub_y + 1,\n is_infinite: false,\n };\n let doubling = a1.double();\n assert(doubling.x == 1);\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint {\n x: pub_x,\n y: pub_y + 1 as Field,\n is_infinite: false,\n };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 4, is_infinite: false };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 2, y: 3, is_infinite: false };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 1, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: 1, y: 3, is_infinite: false };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n let a1 = std::embedded_curve_ops::EmbeddedCurvePoint { x: pub_x, y: 3, is_infinite: false };\n let a2 = std::embedded_curve_ops::EmbeddedCurvePoint { x: pub_x, y: 2, is_infinite: false };\n let res = embedded_curve_add_unsafe(a1, a2);\n assert(res.x == 1);\n }\n}\n", + "path": "" + } + }, "names": [ "main" ], 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 7c13743c247..4462c186f46 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 @@ -32,16 +32,20 @@ expression: artifact }, "bytecode": [ "func 0", - "current witness index : _3", + "current witness index : _4", "private parameters indices : [_0, _1]", "public parameters indices : []", "return value indices : []", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 })], outputs: [Simple(Witness(2)), Simple(Witness(3))]", "EXPR [ (1, _0) (-1, _2) (-340282366920938463463374607431768211456, _3) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(0)), (-1, Witness(1))], q_c: 0 })], outputs: [Simple(Witness(4))]", + "EXPR [ (1, _0, _4) (-1, _1, _4) -1 ]", "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]" + "[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]", + "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": "pZPBjsIgEED/Zc4cGAQK/RVjDFY0JIQ22G6yMf33BbesNhs81AtTOvMeTJu5w9mepuvRhUt/g3Z/h1N03rvr0fedGV0f0ts70LyghJYRwOY3KGh3KWhoOQGWKvg8EyjYcYzWZurFk+yDiTaM0IbJewJfxk+PottgwiOOJqYsJWDDOcUkvDhv89NMnjSto4qyBVZM/uHYrHis85LzhZdit4VXWHilNvGl+YZWz3/Xf2kfE1NwgStc1HGUWO6PUojnBfTKIN8YtFaLgVFWNTR1A0eqFwNHwbYY2K50wZnUmwxMfGrApmY4pJ3pXPw3ZOnLYf51c/ZGZ07e5lSGp9CVyrQdv4eSKQM7xL6z5ynabH2Z2rTuGSdMH+Z88g8=", + "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", @@ -60,6 +64,7 @@ expression: artifact "main" ], "brillig_names": [ - "decompose_hint" + "decompose_hint", + "directive_invert" ] } 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 7c13743c247..4462c186f46 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 @@ -32,16 +32,20 @@ expression: artifact }, "bytecode": [ "func 0", - "current witness index : _3", + "current witness index : _4", "private parameters indices : [_0, _1]", "public parameters indices : []", "return value indices : []", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 })], outputs: [Simple(Witness(2)), Simple(Witness(3))]", "EXPR [ (1, _0) (-1, _2) (-340282366920938463463374607431768211456, _3) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(0)), (-1, Witness(1))], q_c: 0 })], outputs: [Simple(Witness(4))]", + "EXPR [ (1, _0, _4) (-1, _1, _4) -1 ]", "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]" + "[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]", + "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": "pZPBjsIgEED/Zc4cGAQK/RVjDFY0JIQ22G6yMf33BbesNhs81AtTOvMeTJu5w9mepuvRhUt/g3Z/h1N03rvr0fedGV0f0ts70LyghJYRwOY3KGh3KWhoOQGWKvg8EyjYcYzWZurFk+yDiTaM0IbJewJfxk+PottgwiOOJqYsJWDDOcUkvDhv89NMnjSto4qyBVZM/uHYrHis85LzhZdit4VXWHilNvGl+YZWz3/Xf2kfE1NwgStc1HGUWO6PUojnBfTKIN8YtFaLgVFWNTR1A0eqFwNHwbYY2K50wZnUmwxMfGrApmY4pJ3pXPw3ZOnLYf51c/ZGZ07e5lSGp9CVyrQdv4eSKQM7xL6z5ynabH2Z2rTuGSdMH+Z88g8=", + "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", @@ -60,6 +64,7 @@ expression: artifact "main" ], "brillig_names": [ - "decompose_hint" + "decompose_hint", + "directive_invert" ] } 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 7c13743c247..4462c186f46 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 @@ -32,16 +32,20 @@ expression: artifact }, "bytecode": [ "func 0", - "current witness index : _3", + "current witness index : _4", "private parameters indices : [_0, _1]", "public parameters indices : []", "return value indices : []", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 })], outputs: [Simple(Witness(2)), Simple(Witness(3))]", "EXPR [ (1, _0) (-1, _2) (-340282366920938463463374607431768211456, _3) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(0)), (-1, Witness(1))], q_c: 0 })], outputs: [Simple(Witness(4))]", + "EXPR [ (1, _0, _4) (-1, _1, _4) -1 ]", "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]" + "[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]", + "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": "pZPBjsIgEED/Zc4cGAQK/RVjDFY0JIQ22G6yMf33BbesNhs81AtTOvMeTJu5w9mepuvRhUt/g3Z/h1N03rvr0fedGV0f0ts70LyghJYRwOY3KGh3KWhoOQGWKvg8EyjYcYzWZurFk+yDiTaM0IbJewJfxk+PottgwiOOJqYsJWDDOcUkvDhv89NMnjSto4qyBVZM/uHYrHis85LzhZdit4VXWHilNvGl+YZWz3/Xf2kfE1NwgStc1HGUWO6PUojnBfTKIN8YtFaLgVFWNTR1A0eqFwNHwbYY2K50wZnUmwxMfGrApmY4pJ3pXPw3ZOnLYf51c/ZGZ07e5lSGp9CVyrQdv4eSKQM7xL6z5ynabH2Z2rTuGSdMH+Z88g8=", + "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", @@ -60,6 +64,7 @@ expression: artifact "main" ], "brillig_names": [ - "decompose_hint" + "decompose_hint", + "directive_invert" ] } 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 7877bab58a4..85aec2c99b5 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 @@ -38,9 +38,9 @@ expression: artifact "return value indices : []", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1))], q_c: 0 })], outputs: []", "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: 27 }, 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) } }, 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: 32 }, 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(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": "pZPNjsIgFIXfhXUXcMv/qxhjsKIhIbTBdpKJ6bsPKKhd4MLZcEpvz3fobe8NnexxuRxcOI9XpHc3dIzOe3c5+HEwsxtDuntDOC+EI807RMRDJNIiiUJadgjwQwjSKgkgTXDSPilJSouyojzrunaophzmaG0OeYtNh5lMtGFGOized+jH+OX+0HUy4a6ziamakmw4JU3As/M2X63dy43bVgnFS4h4uhnZ2EnbTnh+nQeAM/YkELUhwAeCUrIQAEOT0LcJlGBVCJQwaBHohybg2gUJ/OUXGz9r+zmlxc9Z/41f1iZyKb/y1z9A4Gb+pw5CXw9AgatvvgEA+y+BiBZhn3ZmcHEzk2tmRWeO3pbteQnDW3X+nWqlzvQUx8Gelmgz6W2w07oD0fWwX3PaHw==", + "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", 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 7877bab58a4..85aec2c99b5 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 @@ -38,9 +38,9 @@ expression: artifact "return value indices : []", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1))], q_c: 0 })], outputs: []", "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: 27 }, 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) } }, 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: 32 }, 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(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": "pZPNjsIgFIXfhXUXcMv/qxhjsKIhIbTBdpKJ6bsPKKhd4MLZcEpvz3fobe8NnexxuRxcOI9XpHc3dIzOe3c5+HEwsxtDuntDOC+EI807RMRDJNIiiUJadgjwQwjSKgkgTXDSPilJSouyojzrunaophzmaG0OeYtNh5lMtGFGOized+jH+OX+0HUy4a6ziamakmw4JU3As/M2X63dy43bVgnFS4h4uhnZ2EnbTnh+nQeAM/YkELUhwAeCUrIQAEOT0LcJlGBVCJQwaBHohybg2gUJ/OUXGz9r+zmlxc9Z/41f1iZyKb/y1z9A4Gb+pw5CXw9AgatvvgEA+y+BiBZhn3ZmcHEzk2tmRWeO3pbteQnDW3X+nWqlzvQUx8Gelmgz6W2w07oD0fWwX3PaHw==", + "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", 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 7877bab58a4..85aec2c99b5 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 @@ -38,9 +38,9 @@ expression: artifact "return value indices : []", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1))], q_c: 0 })], outputs: []", "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: 27 }, 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) } }, 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: 32 }, 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(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": "pZPNjsIgFIXfhXUXcMv/qxhjsKIhIbTBdpKJ6bsPKKhd4MLZcEpvz3fobe8NnexxuRxcOI9XpHc3dIzOe3c5+HEwsxtDuntDOC+EI807RMRDJNIiiUJadgjwQwjSKgkgTXDSPilJSouyojzrunaophzmaG0OeYtNh5lMtGFGOized+jH+OX+0HUy4a6ziamakmw4JU3As/M2X63dy43bVgnFS4h4uhnZ2EnbTnh+nQeAM/YkELUhwAeCUrIQAEOT0LcJlGBVCJQwaBHohybg2gUJ/OUXGz9r+zmlxc9Z/41f1iZyKb/y1z9A4Gb+pw5CXw9AgatvvgEA+y+BiBZhn3ZmcHEzk2tmRWeO3pbteQnDW3X+nWqlzvQUx8Gelmgz6W2w07oD0fWwX3PaHw==", + "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", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index 19a8103bb78..50b77b14496 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -80,7 +80,7 @@ expression: artifact }, "bytecode": [ "func 0", - "current witness index : _2988", + "current witness index : _3326", "private parameters indices : [_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27]", "public parameters indices : [_28]", "return value indices : []", @@ -1840,56 +1840,56 @@ expression: artifact "MEM (id: 19, read at: EXPR [ (1, _1590) 0 ], value: EXPR [ (1, _1591) 0 ]) ", "EXPR [ (1, _1590) (-1, _1592) 1 ]", "MEM (id: 19, read at: EXPR [ (1, _1592) 0 ], value: EXPR [ (1, _1593) 0 ]) ", - "EXPR [ (1, _190, _748) (-1, _2946) 0 ]", - "EXPR [ (1, _93, _1158) (-1, _1594) (1, _2946) 0 ]", - "EXPR [ (1, _190, _749) (-1, _2948) 0 ]", - "EXPR [ (1, _93, _1160) (-1, _1595) (1, _2948) 0 ]", - "EXPR [ (1, _190, _750) (-1, _2950) 0 ]", - "EXPR [ (1, _93, _1162) (-1, _1596) (1, _2950) 0 ]", - "EXPR [ (1, _190, _751) (-1, _2952) 0 ]", - "EXPR [ (1, _93, _1164) (-1, _1597) (1, _2952) 0 ]", - "EXPR [ (1, _190, _752) (-1, _2954) 0 ]", - "EXPR [ (1, _93, _1166) (-1, _1598) (1, _2954) 0 ]", - "EXPR [ (1, _190, _753) (-1, _2956) 0 ]", - "EXPR [ (1, _93, _1168) (-1, _1599) (1, _2956) 0 ]", - "EXPR [ (1, _190, _754) (-1, _2958) 0 ]", - "EXPR [ (1, _93, _1170) (-1, _1600) (1, _2958) 0 ]", - "EXPR [ (1, _190, _755) (-1, _2960) 0 ]", - "EXPR [ (1, _93, _1172) (-1, _1601) (1, _2960) 0 ]", + "EXPR [ (1, _190, _748) (-1, _3284) 0 ]", + "EXPR [ (1, _93, _1158) (-1, _1594) (1, _3284) 0 ]", + "EXPR [ (1, _190, _749) (-1, _3286) 0 ]", + "EXPR [ (1, _93, _1160) (-1, _1595) (1, _3286) 0 ]", + "EXPR [ (1, _190, _750) (-1, _3288) 0 ]", + "EXPR [ (1, _93, _1162) (-1, _1596) (1, _3288) 0 ]", + "EXPR [ (1, _190, _751) (-1, _3290) 0 ]", + "EXPR [ (1, _93, _1164) (-1, _1597) (1, _3290) 0 ]", + "EXPR [ (1, _190, _752) (-1, _3292) 0 ]", + "EXPR [ (1, _93, _1166) (-1, _1598) (1, _3292) 0 ]", + "EXPR [ (1, _190, _753) (-1, _3294) 0 ]", + "EXPR [ (1, _93, _1168) (-1, _1599) (1, _3294) 0 ]", + "EXPR [ (1, _190, _754) (-1, _3296) 0 ]", + "EXPR [ (1, _93, _1170) (-1, _1600) (1, _3296) 0 ]", + "EXPR [ (1, _190, _755) (-1, _3298) 0 ]", + "EXPR [ (1, _93, _1172) (-1, _1601) (1, _3298) 0 ]", "EXPR [ (1, _93, _1174) (5, _190) (-1, _1602) 0 ]", "EXPR [ (1, _93, _1176) (6, _190) (-1, _1603) 0 ]", "EXPR [ (1, _93, _1178) (21, _190) (-1, _1604) 0 ]", - "EXPR [ (1, _190, _759) (-1, _2962) 0 ]", - "EXPR [ (1, _93, _1180) (-1, _1605) (1, _2962) 0 ]", - "EXPR [ (1, _190, _760) (-1, _2964) 0 ]", - "EXPR [ (1, _93, _1182) (-1, _1606) (1, _2964) 0 ]", - "EXPR [ (1, _190, _761) (-1, _2966) 0 ]", - "EXPR [ (1, _93, _1184) (-1, _1607) (1, _2966) 0 ]", - "EXPR [ (1, _190, _762) (-1, _2968) 0 ]", - "EXPR [ (1, _93, _1186) (-1, _1608) (1, _2968) 0 ]", + "EXPR [ (1, _190, _759) (-1, _3300) 0 ]", + "EXPR [ (1, _93, _1180) (-1, _1605) (1, _3300) 0 ]", + "EXPR [ (1, _190, _760) (-1, _3302) 0 ]", + "EXPR [ (1, _93, _1182) (-1, _1606) (1, _3302) 0 ]", + "EXPR [ (1, _190, _761) (-1, _3304) 0 ]", + "EXPR [ (1, _93, _1184) (-1, _1607) (1, _3304) 0 ]", + "EXPR [ (1, _190, _762) (-1, _3306) 0 ]", + "EXPR [ (1, _93, _1186) (-1, _1608) (1, _3306) 0 ]", "EXPR [ (1, _93, _1188) (100, _190) (-1, _1609) 0 ]", "EXPR [ (1, _93, _1190) (101, _190) (-1, _1610) 0 ]", "EXPR [ (1, _93, _1192) (102, _190) (-1, _1611) 0 ]", - "EXPR [ (1, _190, _766) (-1, _2970) 0 ]", - "EXPR [ (1, _93, _1194) (-1, _1612) (1, _2970) 0 ]", - "EXPR [ (1, _190, _767) (-1, _2972) 0 ]", - "EXPR [ (1, _93, _1196) (-1, _1613) (1, _2972) 0 ]", - "EXPR [ (1, _190, _768) (-1, _2974) 0 ]", - "EXPR [ (1, _93, _1198) (-1, _1614) (1, _2974) 0 ]", - "EXPR [ (1, _190, _769) (-1, _2976) 0 ]", - "EXPR [ (1, _93, _1200) (-1, _1615) (1, _2976) 0 ]", - "EXPR [ (1, _190, _770) (-1, _2978) 0 ]", - "EXPR [ (1, _93, _1202) (-1, _1616) (1, _2978) 0 ]", - "EXPR [ (1, _190, _771) (-1, _2980) 0 ]", - "EXPR [ (1, _93, _1204) (-1, _1617) (1, _2980) 0 ]", - "EXPR [ (1, _190, _772) (-1, _2982) 0 ]", - "EXPR [ (1, _93, _1206) (-1, _1618) (1, _2982) 0 ]", - "EXPR [ (1, _190, _773) (-1, _2984) 0 ]", - "EXPR [ (1, _93, _1208) (-1, _1619) (1, _2984) 0 ]", - "EXPR [ (1, _190, _774) (-1, _2986) 0 ]", - "EXPR [ (1, _93, _1210) (-1, _1620) (1, _2986) 0 ]", - "EXPR [ (1, _190, _775) (-1, _2988) 0 ]", - "EXPR [ (1, _93, _1212) (-1, _1621) (1, _2988) 0 ]", + "EXPR [ (1, _190, _766) (-1, _3308) 0 ]", + "EXPR [ (1, _93, _1194) (-1, _1612) (1, _3308) 0 ]", + "EXPR [ (1, _190, _767) (-1, _3310) 0 ]", + "EXPR [ (1, _93, _1196) (-1, _1613) (1, _3310) 0 ]", + "EXPR [ (1, _190, _768) (-1, _3312) 0 ]", + "EXPR [ (1, _93, _1198) (-1, _1614) (1, _3312) 0 ]", + "EXPR [ (1, _190, _769) (-1, _3314) 0 ]", + "EXPR [ (1, _93, _1200) (-1, _1615) (1, _3314) 0 ]", + "EXPR [ (1, _190, _770) (-1, _3316) 0 ]", + "EXPR [ (1, _93, _1202) (-1, _1616) (1, _3316) 0 ]", + "EXPR [ (1, _190, _771) (-1, _3318) 0 ]", + "EXPR [ (1, _93, _1204) (-1, _1617) (1, _3318) 0 ]", + "EXPR [ (1, _190, _772) (-1, _3320) 0 ]", + "EXPR [ (1, _93, _1206) (-1, _1618) (1, _3320) 0 ]", + "EXPR [ (1, _190, _773) (-1, _3322) 0 ]", + "EXPR [ (1, _93, _1208) (-1, _1619) (1, _3322) 0 ]", + "EXPR [ (1, _190, _774) (-1, _3324) 0 ]", + "EXPR [ (1, _93, _1210) (-1, _1620) (1, _3324) 0 ]", + "EXPR [ (1, _190, _775) (-1, _3326) 0 ]", + "EXPR [ (1, _93, _1212) (-1, _1621) (1, _3326) 0 ]", "EXPR [ (2, _190) (-1, _1622) 0 ]", "MEM (id: 31, read at: EXPR [ (1, _1622) 0 ], value: EXPR [ (1, _1623) 0 ]) ", "MEM (id: 19, read at: EXPR [ (1, _1623) 0 ], value: EXPR [ (1, _1624) 0 ]) ", @@ -1957,34 +1957,34 @@ expression: artifact "MEM (id: 19, read at: EXPR [ (1, _1685) 0 ], value: EXPR [ (1, _1686) 0 ]) ", "EXPR [ (1, _1685) (-1, _1687) 1 ]", "MEM (id: 19, read at: EXPR [ (1, _1687) 0 ], value: EXPR [ (1, _1688) 0 ]) ", - "EXPR [ (1, _93, _1222) (-1, _1689) (1, _2946) 0 ]", - "EXPR [ (1, _93, _1224) (-1, _1690) (1, _2948) 0 ]", - "EXPR [ (1, _93, _1226) (-1, _1691) (1, _2950) 0 ]", - "EXPR [ (1, _93, _1228) (-1, _1692) (1, _2952) 0 ]", - "EXPR [ (1, _93, _1230) (-1, _1693) (1, _2954) 0 ]", - "EXPR [ (1, _93, _1232) (-1, _1694) (1, _2956) 0 ]", - "EXPR [ (1, _93, _1234) (-1, _1695) (1, _2958) 0 ]", - "EXPR [ (1, _93, _1236) (-1, _1696) (1, _2960) 0 ]", + "EXPR [ (1, _93, _1222) (-1, _1689) (1, _3284) 0 ]", + "EXPR [ (1, _93, _1224) (-1, _1690) (1, _3286) 0 ]", + "EXPR [ (1, _93, _1226) (-1, _1691) (1, _3288) 0 ]", + "EXPR [ (1, _93, _1228) (-1, _1692) (1, _3290) 0 ]", + "EXPR [ (1, _93, _1230) (-1, _1693) (1, _3292) 0 ]", + "EXPR [ (1, _93, _1232) (-1, _1694) (1, _3294) 0 ]", + "EXPR [ (1, _93, _1234) (-1, _1695) (1, _3296) 0 ]", + "EXPR [ (1, _93, _1236) (-1, _1696) (1, _3298) 0 ]", "EXPR [ (1, _93, _1238) (5, _190) (-1, _1697) 0 ]", "EXPR [ (1, _93, _1240) (6, _190) (-1, _1698) 0 ]", "EXPR [ (1, _93, _1242) (21, _190) (-1, _1699) 0 ]", - "EXPR [ (1, _93, _1244) (-1, _1700) (1, _2962) 0 ]", - "EXPR [ (1, _93, _1246) (-1, _1701) (1, _2964) 0 ]", - "EXPR [ (1, _93, _1248) (-1, _1702) (1, _2966) 0 ]", - "EXPR [ (1, _93, _1250) (-1, _1703) (1, _2968) 0 ]", + "EXPR [ (1, _93, _1244) (-1, _1700) (1, _3300) 0 ]", + "EXPR [ (1, _93, _1246) (-1, _1701) (1, _3302) 0 ]", + "EXPR [ (1, _93, _1248) (-1, _1702) (1, _3304) 0 ]", + "EXPR [ (1, _93, _1250) (-1, _1703) (1, _3306) 0 ]", "EXPR [ (1, _93, _1252) (100, _190) (-1, _1704) 0 ]", "EXPR [ (1, _93, _1254) (101, _190) (-1, _1705) 0 ]", "EXPR [ (1, _93, _1256) (102, _190) (-1, _1706) 0 ]", - "EXPR [ (1, _93, _1258) (-1, _1707) (1, _2970) 0 ]", - "EXPR [ (1, _93, _1260) (-1, _1708) (1, _2972) 0 ]", - "EXPR [ (1, _93, _1262) (-1, _1709) (1, _2974) 0 ]", - "EXPR [ (1, _93, _1264) (-1, _1710) (1, _2976) 0 ]", - "EXPR [ (1, _93, _1266) (-1, _1711) (1, _2978) 0 ]", - "EXPR [ (1, _93, _1268) (-1, _1712) (1, _2980) 0 ]", - "EXPR [ (1, _93, _1270) (-1, _1713) (1, _2982) 0 ]", - "EXPR [ (1, _93, _1272) (-1, _1714) (1, _2984) 0 ]", - "EXPR [ (1, _93, _1274) (-1, _1715) (1, _2986) 0 ]", - "EXPR [ (1, _93, _1276) (-1, _1716) (1, _2988) 0 ]", + "EXPR [ (1, _93, _1258) (-1, _1707) (1, _3308) 0 ]", + "EXPR [ (1, _93, _1260) (-1, _1708) (1, _3310) 0 ]", + "EXPR [ (1, _93, _1262) (-1, _1709) (1, _3312) 0 ]", + "EXPR [ (1, _93, _1264) (-1, _1710) (1, _3314) 0 ]", + "EXPR [ (1, _93, _1266) (-1, _1711) (1, _3316) 0 ]", + "EXPR [ (1, _93, _1268) (-1, _1712) (1, _3318) 0 ]", + "EXPR [ (1, _93, _1270) (-1, _1713) (1, _3320) 0 ]", + "EXPR [ (1, _93, _1272) (-1, _1714) (1, _3322) 0 ]", + "EXPR [ (1, _93, _1274) (-1, _1715) (1, _3324) 0 ]", + "EXPR [ (1, _93, _1276) (-1, _1716) (1, _3326) 0 ]", "EXPR [ (1, _93, _1697) (1, _190, _1650) -20 ]", "EXPR [ (1, _93, _1698) (1, _190, _1652) -19 ]", "EXPR [ (1, _93, _1699) (1, _190, _1654) -18 ]", @@ -2874,14 +2874,14 @@ expression: artifact "MEM (id: 40, read at: EXPR [ (1, _120) 0 ], value: EXPR [ (1, _2504) 0 ]) ", "MEM (id: 40, read at: EXPR [ (1, _32) 0 ], value: EXPR [ (1, _2505) 0 ]) ", "INIT (id: 45, len: 5, witnesses: [_2501, _2502, _2503, _2504, _2505])", - "EXPR [ (-3, _1718) (-1, _2506) 3 ]", - "MEM (id: 45, read at: EXPR [ (1, _2506) 0 ], value: EXPR [ (1, _2507) 0 ]) ", - "MEM (id: 39, read at: EXPR [ (1, _2507) 0 ], value: EXPR [ (1, _2508) 0 ]) ", - "EXPR [ (1, _2507) (-1, _2509) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2509) 0 ], value: EXPR [ (1, _2510) 0 ]) ", - "EXPR [ (1, _2509) (-1, _2511) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2511) 0 ], value: EXPR [ (1, _2512) 0 ]) ", - "EXPR [ (1, _2511) (-1, _2513) 1 ]", + "MEM (id: 45, read at: EXPR [ (1, _30) 0 ], value: EXPR [ (1, _2506) 0 ]) ", + "MEM (id: 39, read at: EXPR [ (1, _2506) 0 ], value: EXPR [ (1, _2507) 0 ]) ", + "EXPR [ (1, _2506) (-1, _2508) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2508) 0 ], value: EXPR [ (1, _2509) 0 ]) ", + "EXPR [ (1, _2508) (-1, _2510) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2510) 0 ], value: EXPR [ (1, _2511) 0 ]) ", + "EXPR [ (-1, _1718) (-1, _2512) 1 ]", + "MEM (id: 45, read at: EXPR [ (1, _2512) 0 ], value: EXPR [ (1, _2513) 0 ]) ", "MEM (id: 39, read at: EXPR [ (1, _2513) 0 ], value: EXPR [ (1, _2514) 0 ]) ", "EXPR [ (1, _2513) (-1, _2515) 1 ]", "MEM (id: 39, read at: EXPR [ (1, _2515) 0 ], value: EXPR [ (1, _2516) 0 ]) ", @@ -2931,14 +2931,395 @@ expression: artifact "MEM (id: 39, read at: EXPR [ (1, _2559) 0 ], value: EXPR [ (1, _2560) 0 ]) ", "EXPR [ (1, _2559) (-1, _2561) 1 ]", "MEM (id: 39, read at: EXPR [ (1, _2561) 0 ], value: EXPR [ (1, _2562) 0 ]) ", - "EXPR [ (1, _1718, _2221) (-1, _1718, _2528) (1, _2528) -5000 ]", + "EXPR [ (1, _2561) (-1, _2563) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2563) 0 ], value: EXPR [ (1, _2564) 0 ]) ", + "EXPR [ (1, _2563) (-1, _2565) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2565) 0 ], value: EXPR [ (1, _2566) 0 ]) ", + "EXPR [ (1, _2565) (-1, _2567) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2567) 0 ], value: EXPR [ (1, _2568) 0 ]) ", + "EXPR [ (2, _2512) (-1, _2569) 0 ]", + "MEM (id: 45, read at: EXPR [ (1, _2569) 0 ], value: EXPR [ (1, _2570) 0 ]) ", + "MEM (id: 39, read at: EXPR [ (1, _2570) 0 ], value: EXPR [ (1, _2571) 0 ]) ", + "EXPR [ (1, _2570) (-1, _2572) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2572) 0 ], value: EXPR [ (1, _2573) 0 ]) ", + "EXPR [ (1, _2572) (-1, _2574) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2574) 0 ], value: EXPR [ (1, _2575) 0 ]) ", + "EXPR [ (3, _2512) (-1, _2576) 0 ]", + "MEM (id: 45, read at: EXPR [ (1, _2576) 0 ], value: EXPR [ (1, _2577) 0 ]) ", + "MEM (id: 39, read at: EXPR [ (1, _2577) 0 ], value: EXPR [ (1, _2578) 0 ]) ", + "EXPR [ (1, _2577) (-1, _2579) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2579) 0 ], value: EXPR [ (1, _2580) 0 ]) ", + "EXPR [ (1, _2579) (-1, _2581) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2581) 0 ], value: EXPR [ (1, _2582) 0 ]) ", + "EXPR [ (1, _2581) (-1, _2583) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2583) 0 ], value: EXPR [ (1, _2584) 0 ]) ", + "EXPR [ (1, _2583) (-1, _2585) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2585) 0 ], value: EXPR [ (1, _2586) 0 ]) ", + "EXPR [ (1, _2585) (-1, _2587) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2587) 0 ], value: EXPR [ (1, _2588) 0 ]) ", + "EXPR [ (1, _2587) (-1, _2589) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2589) 0 ], value: EXPR [ (1, _2590) 0 ]) ", + "EXPR [ (1, _2589) (-1, _2591) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2591) 0 ], value: EXPR [ (1, _2592) 0 ]) ", + "EXPR [ (1, _2591) (-1, _2593) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2593) 0 ], value: EXPR [ (1, _2594) 0 ]) ", + "EXPR [ (1, _2593) (-1, _2595) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2595) 0 ], value: EXPR [ (1, _2596) 0 ]) ", + "EXPR [ (1, _2595) (-1, _2597) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2597) 0 ], value: EXPR [ (1, _2598) 0 ]) ", + "EXPR [ (1, _2597) (-1, _2599) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2599) 0 ], value: EXPR [ (1, _2600) 0 ]) ", + "EXPR [ (1, _2599) (-1, _2601) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2601) 0 ], value: EXPR [ (1, _2602) 0 ]) ", + "EXPR [ (1, _2601) (-1, _2603) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2603) 0 ], value: EXPR [ (1, _2604) 0 ]) ", + "EXPR [ (1, _2603) (-1, _2605) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2605) 0 ], value: EXPR [ (1, _2606) 0 ]) ", + "EXPR [ (1, _2605) (-1, _2607) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2607) 0 ], value: EXPR [ (1, _2608) 0 ]) ", + "EXPR [ (1, _2607) (-1, _2609) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2609) 0 ], value: EXPR [ (1, _2610) 0 ]) ", + "EXPR [ (1, _2609) (-1, _2611) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2611) 0 ], value: EXPR [ (1, _2612) 0 ]) ", + "EXPR [ (1, _2611) (-1, _2613) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2613) 0 ], value: EXPR [ (1, _2614) 0 ]) ", + "EXPR [ (1, _2613) (-1, _2615) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2615) 0 ], value: EXPR [ (1, _2616) 0 ]) ", + "EXPR [ (1, _2615) (-1, _2617) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2617) 0 ], value: EXPR [ (1, _2618) 0 ]) ", + "EXPR [ (1, _2617) (-1, _2619) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2619) 0 ], value: EXPR [ (1, _2620) 0 ]) ", + "EXPR [ (1, _2619) (-1, _2621) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2621) 0 ], value: EXPR [ (1, _2622) 0 ]) ", + "EXPR [ (1, _2621) (-1, _2623) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2623) 0 ], value: EXPR [ (1, _2624) 0 ]) ", + "EXPR [ (1, _2623) (-1, _2625) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2625) 0 ], value: EXPR [ (1, _2626) 0 ]) ", + "EXPR [ (1, _2625) (-1, _2627) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2627) 0 ], value: EXPR [ (1, _2628) 0 ]) ", + "EXPR [ (1, _2627) (-1, _2629) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2629) 0 ], value: EXPR [ (1, _2630) 0 ]) ", + "EXPR [ (1, _2629) (-1, _2631) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2631) 0 ], value: EXPR [ (1, _2632) 0 ]) ", + "EXPR [ (1, _1718, _2221) (1, _2512, _2598) -5000 ]", "BLACKBOX::RANGE [(_53, 1)] []", + "EXPR [ (1, _1718, _2177) (-1, _1718, _2507) (1, _2507) (-1, _2633) 0 ]", + "EXPR [ (1, _1718, _2178) (-1, _1718, _2509) (1, _2509) (-1, _2634) 0 ]", + "EXPR [ (1, _1718, _2179) (-1, _1718, _2511) (1, _2511) (-1, _2635) 0 ]", + "EXPR [ (1, _1718, _2180) (1, _2512, _2514) (-1, _2636) 0 ]", + "EXPR [ (1, _1718, _2181) (1, _2512, _2516) (-1, _2637) 0 ]", + "EXPR [ (1, _1718, _2182) (1, _2512, _2518) (-1, _2638) 0 ]", + "EXPR [ (1, _1718, _2183) (1, _2512, _2520) (-1, _2639) 0 ]", + "EXPR [ (1, _1718, _2184) (1, _2512, _2522) (-1, _2640) 0 ]", + "EXPR [ (1, _1718, _2185) (1, _2512, _2524) (-1, _2641) 0 ]", + "EXPR [ (1, _1718, _2186) (1, _2512, _2526) (-1, _2642) 0 ]", + "EXPR [ (1, _1718, _2187) (1, _2512, _2528) (-1, _2643) 0 ]", + "EXPR [ (1, _1718, _2188) (1, _2512, _2530) (-1, _2644) 0 ]", + "EXPR [ (1, _1718, _2189) (1, _2512, _2532) (-1, _2645) 0 ]", + "EXPR [ (1, _1718, _2190) (1, _2512, _2534) (-1, _2646) 0 ]", + "EXPR [ (1, _1718, _2191) (1, _2512, _2536) (-1, _2647) 0 ]", + "EXPR [ (1, _1718, _2192) (1, _2512, _2538) (-1, _2648) 0 ]", + "EXPR [ (1, _1718, _2193) (1, _2512, _2540) (-1, _2649) 0 ]", + "EXPR [ (1, _1718, _2194) (1, _2512, _2542) (-1, _2650) 0 ]", + "EXPR [ (1, _1718, _2195) (1, _2512, _2544) (-1, _2651) 0 ]", + "EXPR [ (1, _1718, _2196) (1, _2512, _2546) (-1, _2652) 0 ]", + "EXPR [ (1, _1718, _2197) (1, _2512, _2548) (-1, _2653) 0 ]", + "EXPR [ (1, _1718, _2198) (1, _2512, _2550) (-1, _2654) 0 ]", + "EXPR [ (1, _1718, _2199) (1, _2512, _2552) (-1, _2655) 0 ]", + "EXPR [ (1, _1718, _2200) (1, _2512, _2554) (-1, _2656) 0 ]", + "EXPR [ (1, _1718, _2201) (1, _2512, _2556) (-1, _2657) 0 ]", + "EXPR [ (1, _1718, _2202) (1, _2512, _2558) (-1, _2658) 0 ]", + "EXPR [ (1, _1718, _2203) (1, _2512, _2560) (-1, _2659) 0 ]", + "EXPR [ (1, _1718, _2204) (1, _2512, _2562) (-1, _2660) 0 ]", + "EXPR [ (1, _1718, _2205) (1, _2512, _2564) (-1, _2661) 0 ]", + "EXPR [ (1, _1718, _2206) (1, _2512, _2566) (-1, _2662) 0 ]", + "EXPR [ (1, _1718, _2207) (1, _2512, _2568) (-1, _2663) 0 ]", + "EXPR [ (1, _1718, _2208) (1, _2512, _2571) (-1, _2664) 0 ]", + "EXPR [ (1, _1718, _2209) (1, _2512, _2573) (-1, _2665) 0 ]", + "EXPR [ (1, _1718, _2210) (1, _2512, _2575) (-1, _2666) 0 ]", + "EXPR [ (1, _1718, _2211) (1, _2512, _2578) (-1, _2667) 0 ]", + "EXPR [ (1, _1718, _2212) (1, _2512, _2580) (-1, _2668) 0 ]", + "EXPR [ (1, _1718, _2213) (1, _2512, _2582) (-1, _2669) 0 ]", + "EXPR [ (1, _1718, _2214) (1, _2512, _2584) (-1, _2670) 0 ]", + "EXPR [ (1, _1718, _2215) (1, _2512, _2586) (-1, _2671) 0 ]", + "EXPR [ (1, _1718, _2216) (1, _2512, _2588) (-1, _2672) 0 ]", + "EXPR [ (1, _1718, _2217) (1, _2512, _2590) (-1, _2673) 0 ]", + "EXPR [ (1, _1718, _2218) (1, _2512, _2592) (-1, _2674) 0 ]", + "EXPR [ (1, _1718, _2219) (1, _2512, _2594) (-1, _2675) 0 ]", + "EXPR [ (1, _1718, _2220) (1, _2512, _2596) (-1, _2676) 0 ]", + "EXPR [ (-1, _2677) 5000 ]", + "EXPR [ (1, _1718, _2222) (1, _2512, _2600) (-1, _2678) 0 ]", + "EXPR [ (1, _1718, _2223) (1, _2512, _2602) (-1, _2679) 0 ]", + "EXPR [ (1, _1718, _2224) (1, _2512, _2604) (-1, _2680) 0 ]", + "EXPR [ (1, _1718, _2225) (1, _2512, _2606) (-1, _2681) 0 ]", + "EXPR [ (1, _1718, _2226) (1, _2512, _2608) (-1, _2682) 0 ]", + "EXPR [ (1, _1718, _2227) (1, _2512, _2610) (-1, _2683) 0 ]", + "EXPR [ (1, _1718, _2228) (1, _2512, _2612) (-1, _2684) 0 ]", + "EXPR [ (1, _1718, _2229) (1, _2512, _2614) (-1, _2685) 0 ]", + "EXPR [ (1, _1718, _2230) (1, _2512, _2616) (-1, _2686) 0 ]", + "EXPR [ (1, _1718, _2231) (1, _2512, _2618) (-1, _2687) 0 ]", + "EXPR [ (1, _1718, _2232) (1, _2512, _2620) (-1, _2688) 0 ]", + "EXPR [ (1, _1718, _2233) (1, _2512, _2622) (-1, _2689) 0 ]", + "EXPR [ (1, _1718, _2234) (1, _2512, _2624) (-1, _2690) 0 ]", + "EXPR [ (1, _1718, _2235) (1, _2512, _2626) (-1, _2691) 0 ]", + "EXPR [ (1, _1718, _2236) (1, _2512, _2628) (-1, _2692) 0 ]", + "EXPR [ (1, _1718, _2237) (1, _2512, _2630) (-1, _2693) 0 ]", + "EXPR [ (1, _1718, _2238) (1, _2512, _2632) (-1, _2694) 0 ]", + "INIT (id: 46, len: 62, witnesses: [_2633, _2634, _2635, _2636, _2637, _2638, _2639, _2640, _2641, _2642, _2643, _2644, _2645, _2646, _2647, _2648, _2649, _2650, _2651, _2652, _2653, _2654, _2655, _2656, _2657, _2658, _2659, _2660, _2661, _2662, _2663, _2664, _2665, _2666, _2667, _2668, _2669, _2670, _2671, _2672, _2673, _2674, _2675, _2676, _2677, _2678, _2679, _2680, _2681, _2682, _2683, _2684, _2685, _2686, _2687, _2688, _2689, _2690, _2691, _2692, _2693, _2694])", + "INIT (id: 47, len: 5, witnesses: [_30, _120, _803, _804, _805])", + "EXPR [ (2, _53) (-1, _2695) 1 ]", + "MEM (id: 47, read at: EXPR [ (1, _2695) 0 ], value: EXPR [ (1, _2696) 0 ]) ", + "MEM (id: 46, read at: EXPR [ (1, _2696) 0 ], value: EXPR [ (1, _2697) 0 ]) ", + "EXPR [ (1, _2696) (-1, _2698) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2698) 0 ], value: EXPR [ (1, _2699) 0 ]) ", + "EXPR [ (1, _2698) (-1, _2700) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2700) 0 ], value: EXPR [ (1, _2701) 0 ]) ", + "EXPR [ (1, _2700) (-1, _2702) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2702) 0 ], value: EXPR [ (1, _2703) 0 ]) ", + "EXPR [ (1, _2702) (-1, _2704) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2704) 0 ], value: EXPR [ (1, _2705) 0 ]) ", + "EXPR [ (1, _2704) (-1, _2706) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2706) 0 ], value: EXPR [ (1, _2707) 0 ]) ", + "EXPR [ (1, _2706) (-1, _2708) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2708) 0 ], value: EXPR [ (1, _2709) 0 ]) ", + "EXPR [ (1, _2708) (-1, _2710) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2710) 0 ], value: EXPR [ (1, _2711) 0 ]) ", + "EXPR [ (1, _2710) (-1, _2712) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2712) 0 ], value: EXPR [ (1, _2713) 0 ]) ", + "EXPR [ (1, _2712) (-1, _2714) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2714) 0 ], value: EXPR [ (1, _2715) 0 ]) ", + "EXPR [ (1, _2714) (-1, _2716) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2716) 0 ], value: EXPR [ (1, _2717) 0 ]) ", + "EXPR [ (1, _2716) (-1, _2718) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2718) 0 ], value: EXPR [ (1, _2719) 0 ]) ", + "EXPR [ (1, _2718) (-1, _2720) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2720) 0 ], value: EXPR [ (1, _2721) 0 ]) ", + "EXPR [ (1, _2720) (-1, _2722) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2722) 0 ], value: EXPR [ (1, _2723) 0 ]) ", + "EXPR [ (1, _2722) (-1, _2724) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2724) 0 ], value: EXPR [ (1, _2725) 0 ]) ", + "EXPR [ (1, _2724) (-1, _2726) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2726) 0 ], value: EXPR [ (1, _2727) 0 ]) ", + "EXPR [ (1, _2726) (-1, _2728) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2728) 0 ], value: EXPR [ (1, _2729) 0 ]) ", + "EXPR [ (1, _2728) (-1, _2730) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2730) 0 ], value: EXPR [ (1, _2731) 0 ]) ", + "EXPR [ (1, _2730) (-1, _2732) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2732) 0 ], value: EXPR [ (1, _2733) 0 ]) ", + "EXPR [ (1, _2732) (-1, _2734) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2734) 0 ], value: EXPR [ (1, _2735) 0 ]) ", + "EXPR [ (1, _2734) (-1, _2736) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2736) 0 ], value: EXPR [ (1, _2737) 0 ]) ", + "EXPR [ (1, _2736) (-1, _2738) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2738) 0 ], value: EXPR [ (1, _2739) 0 ]) ", + "EXPR [ (1, _2738) (-1, _2740) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2740) 0 ], value: EXPR [ (1, _2741) 0 ]) ", + "EXPR [ (1, _2740) (-1, _2742) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2742) 0 ], value: EXPR [ (1, _2743) 0 ]) ", + "EXPR [ (1, _2742) (-1, _2744) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2744) 0 ], value: EXPR [ (1, _2745) 0 ]) ", + "EXPR [ (1, _2744) (-1, _2746) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2746) 0 ], value: EXPR [ (1, _2747) 0 ]) ", + "EXPR [ (1, _2746) (-1, _2748) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2748) 0 ], value: EXPR [ (1, _2749) 0 ]) ", + "EXPR [ (1, _2748) (-1, _2750) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2750) 0 ], value: EXPR [ (1, _2751) 0 ]) ", + "INIT (id: 48, len: 28, witnesses: [_2697, _2699, _2701, _2703, _2705, _2707, _2709, _2711, _2713, _2715, _2717, _2719, _2721, _2723, _2725, _2727, _2729, _2731, _2733, _2735, _2737, _2739, _2741, _2743, _2745, _2747, _2749, _2751])", + "INIT (id: 49, len: 13, witnesses: [_30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42])", + "MEM (id: 49, read at: EXPR [ (1, _57) 0 ], value: EXPR [ (1, _2752) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _2752) 0 ], value: EXPR [ (1, _2753) 0 ]) ", + "EXPR [ (1, _2752) (-1, _2754) 1 ]", + "MEM (id: 48, read at: EXPR [ (1, _2754) 0 ], value: EXPR [ (1, _2755) 0 ]) ", + "EXPR [ (1, _2754) (-1, _2756) 1 ]", + "MEM (id: 48, read at: EXPR [ (1, _2756) 0 ], value: EXPR [ (1, _2757) 0 ]) ", + "MEM (id: 49, read at: EXPR [ (1, _776) 0 ], value: EXPR [ (1, _2758) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _2758) 0 ], value: EXPR [ (1, _2759) 0 ]) ", + "EXPR [ (1, _2758) (-1, _2760) 1 ]", + "MEM (id: 48, read at: EXPR [ (1, _2760) 0 ], value: EXPR [ (1, _2761) 0 ]) ", + "EXPR [ (1, _2760) (-1, _2762) 1 ]", + "MEM (id: 48, read at: EXPR [ (1, _2762) 0 ], value: EXPR [ (1, _2763) 0 ]) ", + "MEM (id: 49, read at: EXPR [ (1, _46) 0 ], value: EXPR [ (1, _2764) 0 ]) ", + "MEM (id: 48, write EXPR [ (1, _2753) 0 ] at: EXPR [ (1, _2764) 0 ]) ", + "EXPR [ (1, _2764) (-1, _2765) 1 ]", + "MEM (id: 48, write EXPR [ (1, _2755) 0 ] at: EXPR [ (1, _2765) 0 ]) ", + "EXPR [ (1, _2765) (-1, _2766) 1 ]", + "MEM (id: 48, write EXPR [ (1, _2757) 0 ] at: EXPR [ (1, _2766) 0 ]) ", + "MEM (id: 49, read at: EXPR [ (1, _30) 0 ], value: EXPR [ (1, _2767) 0 ]) ", + "MEM (id: 49, read at: EXPR [ (1, _31) 0 ], value: EXPR [ (1, _2768) 0 ]) ", + "MEM (id: 49, read at: EXPR [ (1, _118) 0 ], value: EXPR [ (1, _2769) 0 ]) ", + "MEM (id: 49, read at: EXPR [ (1, _120) 0 ], value: EXPR [ (1, _2770) 0 ]) ", + "MEM (id: 49, read at: EXPR [ (1, _32) 0 ], value: EXPR [ (1, _2771) 0 ]) ", + "MEM (id: 49, read at: EXPR [ (1, _123) 0 ], value: EXPR [ (1, _2772) 0 ]) ", + "MEM (id: 49, read at: EXPR [ (1, _125) 0 ], value: EXPR [ (1, _2773) 0 ]) ", + "MEM (id: 49, read at: EXPR [ (1, _33) 0 ], value: EXPR [ (1, _2774) 0 ]) ", + "MEM (id: 49, read at: EXPR [ (1, _34) 0 ], value: EXPR [ (1, _2775) 0 ]) ", + "MEM (id: 49, read at: EXPR [ (1, _129) 0 ], value: EXPR [ (1, _2776) 0 ]) ", + "MEM (id: 49, read at: EXPR [ (1, _131) 0 ], value: EXPR [ (1, _2777) 0 ]) ", + "MEM (id: 49, read at: EXPR [ (1, _35) 0 ], value: EXPR [ (1, _2778) 0 ]) ", + "MEM (id: 49, read at: EXPR [ (1, _134) 0 ], value: EXPR [ (1, _2779) 0 ]) ", + "INIT (id: 50, len: 13, witnesses: [_2767, _2768, _2769, _2770, _2771, _2772, _2773, _2774, _2775, _2776, _2777, _2778, _2779])", + "EXPR [ (1, _46) (-1, _2780) 1 ]", + "MEM (id: 50, read at: EXPR [ (1, _2780) 0 ], value: EXPR [ (1, _2781) 0 ]) ", + "MEM (id: 48, write EXPR [ (1, _2759) 0 ] at: EXPR [ (1, _2781) 0 ]) ", + "EXPR [ (1, _2781) (-1, _2782) 1 ]", + "MEM (id: 48, write EXPR [ (1, _2761) 0 ] at: EXPR [ (1, _2782) 0 ]) ", + "EXPR [ (1, _2782) (-1, _2783) 1 ]", + "MEM (id: 48, write EXPR [ (1, _2763) 0 ] at: EXPR [ (1, _2783) 0 ]) ", + "MEM (id: 47, read at: EXPR [ (1, _2695) 0 ], value: EXPR [ (1, _2784) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _30) 0 ], value: EXPR [ (1, _2785) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _31) 0 ], value: EXPR [ (1, _2786) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _118) 0 ], value: EXPR [ (1, _2787) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _120) 0 ], value: EXPR [ (1, _2788) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _32) 0 ], value: EXPR [ (1, _2789) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _123) 0 ], value: EXPR [ (1, _2790) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _125) 0 ], value: EXPR [ (1, _2791) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _33) 0 ], value: EXPR [ (1, _2792) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _34) 0 ], value: EXPR [ (1, _2793) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _129) 0 ], value: EXPR [ (1, _2794) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _131) 0 ], value: EXPR [ (1, _2795) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _35) 0 ], value: EXPR [ (1, _2796) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _134) 0 ], value: EXPR [ (1, _2797) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _1067) 0 ], value: EXPR [ (1, _2798) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _36) 0 ], value: EXPR [ (1, _2799) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _37) 0 ], value: EXPR [ (1, _2800) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _1071) 0 ], value: EXPR [ (1, _2801) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _1073) 0 ], value: EXPR [ (1, _2802) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _38) 0 ], value: EXPR [ (1, _2803) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _1076) 0 ], value: EXPR [ (1, _2804) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _1078) 0 ], value: EXPR [ (1, _2805) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _39) 0 ], value: EXPR [ (1, _2806) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _40) 0 ], value: EXPR [ (1, _2807) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _1082) 0 ], value: EXPR [ (1, _2808) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _1084) 0 ], value: EXPR [ (1, _2809) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _41) 0 ], value: EXPR [ (1, _2810) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _1087) 0 ], value: EXPR [ (1, _2811) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _1089) 0 ], value: EXPR [ (1, _2812) 0 ]) ", + "MEM (id: 46, write EXPR [ (1, _2785) 0 ] at: EXPR [ (1, _2784) 0 ]) ", + "EXPR [ (1, _2784) (-1, _2813) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2786) 0 ] at: EXPR [ (1, _2813) 0 ]) ", + "EXPR [ (1, _2813) (-1, _2814) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2787) 0 ] at: EXPR [ (1, _2814) 0 ]) ", + "EXPR [ (1, _2814) (-1, _2815) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2788) 0 ] at: EXPR [ (1, _2815) 0 ]) ", + "EXPR [ (1, _2815) (-1, _2816) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2789) 0 ] at: EXPR [ (1, _2816) 0 ]) ", + "EXPR [ (1, _2816) (-1, _2817) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2790) 0 ] at: EXPR [ (1, _2817) 0 ]) ", + "EXPR [ (1, _2817) (-1, _2818) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2791) 0 ] at: EXPR [ (1, _2818) 0 ]) ", + "EXPR [ (1, _2818) (-1, _2819) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2792) 0 ] at: EXPR [ (1, _2819) 0 ]) ", + "EXPR [ (1, _2819) (-1, _2820) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2793) 0 ] at: EXPR [ (1, _2820) 0 ]) ", + "EXPR [ (1, _2820) (-1, _2821) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2794) 0 ] at: EXPR [ (1, _2821) 0 ]) ", + "EXPR [ (1, _2821) (-1, _2822) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2795) 0 ] at: EXPR [ (1, _2822) 0 ]) ", + "EXPR [ (1, _2822) (-1, _2823) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2796) 0 ] at: EXPR [ (1, _2823) 0 ]) ", + "EXPR [ (1, _2823) (-1, _2824) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2797) 0 ] at: EXPR [ (1, _2824) 0 ]) ", + "EXPR [ (1, _2824) (-1, _2825) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2798) 0 ] at: EXPR [ (1, _2825) 0 ]) ", + "EXPR [ (1, _2825) (-1, _2826) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2799) 0 ] at: EXPR [ (1, _2826) 0 ]) ", + "EXPR [ (1, _2826) (-1, _2827) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2800) 0 ] at: EXPR [ (1, _2827) 0 ]) ", + "EXPR [ (1, _2827) (-1, _2828) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2801) 0 ] at: EXPR [ (1, _2828) 0 ]) ", + "EXPR [ (1, _2828) (-1, _2829) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2802) 0 ] at: EXPR [ (1, _2829) 0 ]) ", + "EXPR [ (1, _2829) (-1, _2830) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2803) 0 ] at: EXPR [ (1, _2830) 0 ]) ", + "EXPR [ (1, _2830) (-1, _2831) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2804) 0 ] at: EXPR [ (1, _2831) 0 ]) ", + "EXPR [ (1, _2831) (-1, _2832) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2805) 0 ] at: EXPR [ (1, _2832) 0 ]) ", + "EXPR [ (1, _2832) (-1, _2833) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2806) 0 ] at: EXPR [ (1, _2833) 0 ]) ", + "EXPR [ (1, _2833) (-1, _2834) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2807) 0 ] at: EXPR [ (1, _2834) 0 ]) ", + "EXPR [ (1, _2834) (-1, _2835) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2808) 0 ] at: EXPR [ (1, _2835) 0 ]) ", + "EXPR [ (1, _2835) (-1, _2836) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2809) 0 ] at: EXPR [ (1, _2836) 0 ]) ", + "EXPR [ (1, _2836) (-1, _2837) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2810) 0 ] at: EXPR [ (1, _2837) 0 ]) ", + "EXPR [ (1, _2837) (-1, _2838) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2811) 0 ] at: EXPR [ (1, _2838) 0 ]) ", + "EXPR [ (1, _2838) (-1, _2839) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2812) 0 ] at: EXPR [ (1, _2839) 0 ]) ", + "MEM (id: 47, read at: EXPR [ (1, _30) 0 ], value: EXPR [ (1, _2840) 0 ]) ", + "MEM (id: 47, read at: EXPR [ (1, _31) 0 ], value: EXPR [ (1, _2841) 0 ]) ", + "MEM (id: 47, read at: EXPR [ (1, _118) 0 ], value: EXPR [ (1, _2842) 0 ]) ", + "MEM (id: 47, read at: EXPR [ (1, _120) 0 ], value: EXPR [ (1, _2843) 0 ]) ", + "MEM (id: 47, read at: EXPR [ (1, _32) 0 ], value: EXPR [ (1, _2844) 0 ]) ", + "INIT (id: 51, len: 5, witnesses: [_2840, _2841, _2842, _2843, _2844])", + "MEM (id: 51, read at: EXPR [ (1, _120) 0 ], value: EXPR [ (1, _2845) 0 ]) ", + "MEM (id: 46, read at: EXPR [ (1, _2845) 0 ], value: EXPR [ (1, _2846) 0 ]) ", + "EXPR [ (1, _2845) (-1, _2847) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2847) 0 ], value: EXPR [ (1, _2848) 0 ]) ", + "EXPR [ (1, _2847) (-1, _2849) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2849) 0 ], value: EXPR [ (1, _2850) 0 ]) ", + "EXPR [ (1, _2849) (-1, _2851) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2851) 0 ], value: EXPR [ (1, _2852) 0 ]) ", + "EXPR [ (1, _2851) (-1, _2853) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2853) 0 ], value: EXPR [ (1, _2854) 0 ]) ", + "EXPR [ (1, _2853) (-1, _2855) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2855) 0 ], value: EXPR [ (1, _2856) 0 ]) ", + "EXPR [ (1, _2855) (-1, _2857) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2857) 0 ], value: EXPR [ (1, _2858) 0 ]) ", + "EXPR [ (1, _2857) (-1, _2859) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2859) 0 ], value: EXPR [ (1, _2860) 0 ]) ", + "EXPR [ (1, _2859) (-1, _2861) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2861) 0 ], value: EXPR [ (1, _2862) 0 ]) ", + "EXPR [ (1, _2861) (-1, _2863) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2863) 0 ], value: EXPR [ (1, _2864) 0 ]) ", + "EXPR [ (1, _2863) (-1, _2865) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2865) 0 ], value: EXPR [ (1, _2866) 0 ]) ", + "EXPR [ (1, _2865) (-1, _2867) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2867) 0 ], value: EXPR [ (1, _2868) 0 ]) ", + "EXPR [ (1, _2867) (-1, _2869) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2869) 0 ], value: EXPR [ (1, _2870) 0 ]) ", + "EXPR [ (1, _2869) (-1, _2871) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2871) 0 ], value: EXPR [ (1, _2872) 0 ]) ", + "EXPR [ (1, _2871) (-1, _2873) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2873) 0 ], value: EXPR [ (1, _2874) 0 ]) ", + "EXPR [ (1, _2873) (-1, _2875) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2875) 0 ], value: EXPR [ (1, _2876) 0 ]) ", + "EXPR [ (1, _2875) (-1, _2877) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2877) 0 ], value: EXPR [ (1, _2878) 0 ]) ", + "EXPR [ (1, _2877) (-1, _2879) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2879) 0 ], value: EXPR [ (1, _2880) 0 ]) ", + "EXPR [ (1, _2879) (-1, _2881) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2881) 0 ], value: EXPR [ (1, _2882) 0 ]) ", + "EXPR [ (1, _2881) (-1, _2883) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2883) 0 ], value: EXPR [ (1, _2884) 0 ]) ", + "EXPR [ (1, _2883) (-1, _2885) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2885) 0 ], value: EXPR [ (1, _2886) 0 ]) ", + "EXPR [ (1, _2885) (-1, _2887) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2887) 0 ], value: EXPR [ (1, _2888) 0 ]) ", + "EXPR [ (1, _2887) (-1, _2889) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2889) 0 ], value: EXPR [ (1, _2890) 0 ]) ", + "EXPR [ (1, _2889) (-1, _2891) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2891) 0 ], value: EXPR [ (1, _2892) 0 ]) ", + "EXPR [ (1, _2891) (-1, _2893) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2893) 0 ], value: EXPR [ (1, _2894) 0 ]) ", + "EXPR [ (1, _2893) (-1, _2895) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2895) 0 ], value: EXPR [ (1, _2896) 0 ]) ", + "EXPR [ (1, _2895) (-1, _2897) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2897) 0 ], value: EXPR [ (1, _2898) 0 ]) ", + "EXPR [ (1, _2897) (-1, _2899) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2899) 0 ], value: EXPR [ (1, _2900) 0 ]) ", + "EXPR [ (1, _2848) -20 ]", + "EXPR [ (1, _2850) -19 ]", + "EXPR [ (1, _2852) -5000 ]", "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) } }]", "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": "td3LjlzXkYXhd+FYg4yIHZftV2kYhiTTBgFCEmjJQEPQu3eey/pLHrDRnQVOeJYsn7Uyi/nVriKT4u8f/v7xh9/++bdPP/3j5399+Mt//f7hhy+fPn/+9M+/ff75x+9//fTzT8//9fc/vvugf/zbr18+fnz+Tx/+9O+fd/3y/ZePP/364S8//fb583cf/v3959/O/9O/fvn+p/P66/dfnv/28d2Hjz/9/Xl9Fv7j0+ePR/rju7e7H1+/1W3fN7svbs//x/3N/fm++8NfuX+V7s/1vvv78bX783+5//H2AXx4vTX8nx/A8AC2vfIEZnG/v/P+/cL9YXHfH27vuz/6a/ebfcOfgUgeQc4rzyCN+/f77q965f6R/5h51/3r8VVCB9Nv9jOwbPQI/JXX8J/uj8cr9y8ZWGved//Xfwbdv+VH8O3ncF75NPh2f1p89Rl8y8+DmfoYZr3yc5hvz2BeeQ1lS2H2KwdZmR5/Wb9y/yN1/+OVzyIVOkfqpddwpX7+ql56/i2DNfHK/Vv39+Px0j7P/yUB7bq/45VzrBePP1+63xf7r7x+m9dv71dOkTHdP7bfd//XX3/rW34OnHI9gn7lFfSn+7/+ldD6lp8DN18L7Ze+lvrT/fnVj8DxOv12z6D0Kt71ymehP92/v/pZNL/lV4P2SL0MnvGVz2RmfDnyjK9Ysrfvisxf+orInOPk2RDvbYh8b8PXPyfmt3w9mtfbY9ivPYu3hrCvPov6pq/J8LfHkC89iz839FfPh0PfN3wWW1+i2bJ66Vn8qSG+esrXt/xexdbaPIaXvlL8j4aXvlayxRdLlvHSRzL5dQ/LfOkzzPPLZBrmlfPW6sFjqEe/9Bgq3h6Dvbdhv/RzUYuG177ytnr7SFa/9HGosLfHsN/bUC99JGtzZnW89Cx683GYx0uPYfgi+hlf+jjMensM+dKrevLtMbz060k2xlcgE4/3Nix/b0O+9nOxcTH7pY/D5lvqZ3zpZ3M7j2H7S6/JGXt7FvudDdvsvQ3+0uthv3223y99nvRHDcdm/+fnyb8+/+n7Hz99+Y/f2vhgz63vPvjz///dhzh/XOePef5Y5499/jjnj/v80R7Xxa7Ldbtd99tVYFeDXRV2ddhVYs+W58+4P1ueLx236+LXJa7Lui55Xeq69PmL/D7XZZ+XeLY8P6XFs+X53MOvS1yXZ8vzEI88vkt4Xuu+9n2d+7qv63rcV7uvfv2a9or7uu7r0fd8Aqvu69H3fHxr7uu+rnn0PR9iHn3Pn9r0+xr3dd3XvK91X/u+zvUrurmvaz3uq93Xo+/5/Cru67qvx8f++fjr+OA/H2/1fZ37uq9rP+6r3Ve/r3H9Omiv+5r39eh7Pq/u+zr3dV/XedxXu69+X+P6VclZ9zXv69H3fB7T93Xu69H3/Onbj/t69D2f1/b7Gvd13de8r3Vf+77Ofd3X1R4PBVNwhVBYCqlQCq0wCmo2NZuaTc2mZlOzqdnUbGo2NZuaXc2uZlezq9nV7Gp2NbuaXc2u5lBzqDnUHGoONYeaQ82h5lBzqHmpeal5qXmpeal5qXmpeal5qXmpOdWcak41p5pTzanmVHOqOdWcai41l5pLzaXmUnOpudRcai41l5pbza3mVnOrudXcam41t5pbza3mUfOoedQ8ah41j5pHzaPmUfOoeatZ9kz4TPpM/Ez+TABNAk0ETQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0G/TAYjyOEwjp+N/oIqVAKrTAK+w6HwSuYgiuEgppbza3mVnOrudU8ah41j5pHzaPmUfOoedQ8ah41bzVvNW81bzVvNW81bzVvNW8177s5Hg8FU3CFUFgKqVAKrTAKajY1m5pNzaZmU7Op2dRsajY1m5pdza5mV7Or2dXsanY1u5pdza7mUHOoOdQcag41h5pDzaHmUHOoeal5qXmpeal5qXmpeal5qXmpeak51ZxqTjWnmlPNqeZUc6o51ZxqLjWXmkvNpWYZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGVwyuGRwyeCSwSWDSwaXDC4ZXDK4ZHDJ4JLBJYNLBpcMLhlcMrhkcMngksElg0sGlwwuGVwyuGRwyeCSwSWDSwaXDC4ZXDK4ZHDJ4JLBJYNLBpcMLhlcMrhkcMngksElg0sGlwwuGVwyuGRwyeCSwSWDSwbXafD4rvo0eHxveBo8w9GcRxiFo7mO7ysfCqbgCqGwFFKhFFphFNTcam41t5pbza3mVnOrudXcam41j5pHzaPmUfOoedQ8ah41j5pHzVvNW81bzVvNW81bzVvNW81bzftuzsdDwRRcIRSWQiqUQiuMgppNzaZmU7Op2dRsajY1m5pNzaZmV7Or2dXsanY1u5pdza5mV7OrOdQcag41h5pDzaHmUHOoOdQcal5qXmpeal5qXmpeal5qXmpeal5qTjWnmlPNqeZUc6o51ZxqTjXLYMpgymDKYMpgymDKYMpgymDKYMpgymDKYMpgymDKYMpgymDKYMpgymDKYMpgymDKYMpgymDKYMpgymDKYMpgymDKYMpgymDKYMpgymDKYMpgyWDJYMlgyWDJYMlgyWDJYMlgyWDJYMlgyWDJYMlgyWDJYMlgyWDJYMlgyWDJYJ0Gz1+bWwpH8xyhFI7mfYRR2Hc4DZ7BFFwhFJZCKpSCmkPNoeal5qXmpeal5qXmpeal5qXmpeal5lRzqjnVnGpONaeaU82p5lRzqrnUXGouNZeaS82l5lJzqbnUXGpuNbeaW82t5lZzq7nV3GpuNbeaR82j5lHzqHnUPGoeNY+aR82j5q3mreat5q3mreat5q3mreat5n039+OhYAquEApLIRVKoRVGQc2mZlOzqdnUbGo2NZuaTc2mZlOzq9nV7Gp2NbuaXc2uZhlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBnsw+B6HMEVQuH4vSs7QiqUQiuMwr7CHAavYAquEApLIRVKoRVGQc2mZlOzqdnUbGo2NZuaTc2mZlOzq9nV7Gp2NbuaXc2uZlezq9nVHGo+DB7vR53D4BVC4Wg+f3spFUqhFUZh3+EweAW73ic6h8ErhMLRfPxG1GHwCqXQCqOw73AYvIJd79+cw+AVQmEdvxt7hFQohVYYhX2Hw+Dxdso5DF7BFeJ4U/4RjuY6QiqUQiuMwr7DYfAKpuAKoaDmVnOrudXcam41j5pHzaPmUfOoedQ8ah41j5pHzVvNW81bzVvNW81bzVvNW81bzftu3o+Hgim4QigshVQohVYYBTWbmk3NpmZTs6nZ1GxqNjWbmk3NrmZXs6vZ1exqdjUfBrOP0AqjsO9wGLyCKbhCKKzrraH7MHiFUujjD0kcYRT2HQ6DVzAFV4jrXZr7MHiFVKjjz08coRVGYd/hMHgFU/DrDZP7MHiFpXA0Hx+Nw+AVWmEU9h0Og1ew672L+zB4hVA4mvcRUqGOPylxhGfz8d7/fRi8wr7DYbCPh3oYvIIff1LhCKGwjj+xcIRUKIVWGIV9h8PgFUzBFUJBzaPmUfOoedQ8at5q3mreat5q3mreat5q3mreat538/P36B8kIzkpSIuUpCI1aUhsGBvGhrFhbBgbxoaxYWwYG8aGs+FsOBvOhrPhbDgbzoaz4WwEG8HGgfT4UzbPFKRFSlKRmjSkrXRgvZOR2FhsLDYWG4uNxcZiY7GRbCQbyUaykWwkG8lGspFsJBvFRrFRbBQbxUaxUWwUG8VGsdFsNBvNRrPRbDQbzUaz0Ww0G8PGsDFsDBvDxrAxbAwbw+tqeF1tXleb19Xmtbt57W5eu5vX7ua1u3ntbjZwbjg3nBvODeeGc8O54dxwbjg3nBvODeeGc8O54dxwbjg3nBvODeeGc8O54dxwbjg3nBvODeeGc8O54dxwfr5Z505sBBvBRrARbAQbwcZiY7Gx2FhsLDYWG4uNxcZiY7GRbCQbyUaykWwkG8lGspFsJBvFRrFRbBQbxUaxUWwUG8VGsdFsNBvNRrPRbDQbzUaz0Ww0G8PGsDFsDBvDxrAxbAwbODecG84N54Zzw7nh3HBuODecG84N545zx7nj3HHuOHecO84d545zx7nj3HHuOHecO84d545zx7nj3HHuOHecO84d545zx7nj3HHuOHecO84d545zx7nj3HHuOHecO84d545zx7nj3HHuOHecO84d545zx7nj3HHuOHecO84d545zx7nj3HHuOHecO84d545zx7nj3HHuOHecO84d545zx7nj3HHuOHecO84d545zx7nj3HHuOHecO84d545zx7nj3HHuOHecO84d545zx7nj3HEeOA+cB84D54HzwHngPHAeOA+cB84D54HzwHngPHAeOA+cB84D54HzwHngPHAeOA+cB84D54HzwHngPHAeOA+cB84D54HzwHngPHAeOA+cB84D54HzwHngPHAeOA+cB84D54HzwHngPHAeOA+cB84D54HzwHngPHAeOA+cB84D54HzwHngPHAeOA+cB84D54HzwHngPHAeOA+cB84D54HzwHngPHAeOA+cB84D54HzwHngPHAeOA+cB87P9y3189c47Hzj0p2OjTmTk46NfaZFSlKRmjSkrXQ6v5KRnMSGsWFsGBvGhrFhbDgbzoaz4Ww4G86Gs+FsOBvORrARbAQbwUawEWwEG8FGsBFsLDYWG4uNxcZiY7Gx2FhsLDYWG8lGspFsJBvJRrKRbCQbyUayUWwczo//Toydb3u6U5AWKUlFatKQttLh/E5sNBvNRrPRbDQbzUaz0WwMG8PGsDFsDBvDxrAxbAwbw8ZmY7Ox2dhsbDY2G5uNzcZmY2vjfHPUnYzkpCAtUpKK1KQhsWFsGBvGhrFhbBgbxgbOE+eJ88R54jxxnjhPnCfOE+eJ88R54jxxnjhPnCfOE+eJ88R54jxxnjhPnCfOE+eJ88R54jxxnjhPnCfOE+eJ88R54jxxnjhPnCfOE+eJ88T5+c6qO7FRbBQbxUaxUWwUG8VGs9FsNBvNRrPRbDQbzUaz0WwMG8PGsDFsDBvDxrAxbAwbw8ZmY7Ox2dhsbDY2G5uNzcZmY2vjfAPWnYzkpCAtUpKK1KQhscF5XpznxXlenOfFeV6c58V5XjgvnBfOC+eF88J54bxwXjgvnBfOC+eF88J54bxwXjgvnBfOC+eF88J54bxwXjgvnBfOC+eF88J54bxwXjgvnBfOC+eF88J54bxwXjgvnBfOC+eF88J54bxwXjgvnBfOC+eF88J54bxwXjgvnBfOC+eF88J54bxwXjgvnBfOC+eF88J54bxwXjgvnBfOC+eF88J54bxwXjgvnBfOG+eN88Z547xx3jhvnDfOG+eN88Z547xx3jhvnDfOG+eN88Z547xx3jhvnDfOG+eN88Z547xx3jhvnDfOG+eN88Z547xx3jhvnDfOG+eN88Z547xx3jhvnDfOG+eN88Z547xx3jhvnDfOG+eN88Z547xx3jhvnDfOG+eN88Z547xx3jhvnDfOG+eN88Z547xx3jhvnDfOG+eN88Z547xx3jhvnDfOG+eN88Z547xx3jhvnDfOG+eN88Z543xwPjgfnA/OB+eD88H54HxwPjgfnA/OB+eD88H54HxwPjgfnA/OB+eD88H54HxwPjgfnA/OB+eD88H54HxwPjgfnA/OB+eD88H54HxwPjgfnA/OB+eD88H54HxwPjgfnA/OB+eD88H54HxwPjgfnA/OB+eD88H54HxwPjgfnA/OB+eD88H54HxwPjgfnA/OB+eD88H54HxwPjgfnA/OB+eD88H54HxwPjgfnA/OB+eD88H54HxwPjgfnA/ON87Pd6sd//EZO9+udqcgHd87n//VlfP78ysV6fj+PM40pOP783Wk8/vzKx0beSYnHRt1pkVKUpGaNKStdDi/k5GcxIaz4Ww4G86Gs+FsBBvBRrARbAQbwUawEWwEG8HGYmOxsdhYbCw2FhuLjcXGYmOxkWwkG8lGspFsJBvJRrKRbCQbxUaxUWwUG8VGsVFsFBvFRrHRbDQbzUaz0Ww0G81Gs9FsNBvDxrAxbAwbw8awMWwMG8PGsLHZ2GxsNjYbm43NxmZjs7HZ2PeGn++Hu5ORnBSkRUpSkZo0JDaMDWPD2DA2jA1jw9gwNowNY8PZcDacDWfD2XA2nA1nw9lwNoKNYON03mcK0iIlqUhNGtJWOp1fyUhsLDYWG4uNxcZiY7Gx2Eg2ko1kI9lINk7nc6YiNWlIW6nYKDaKjWKj2CieR/E8iudRPI/ieTQbzUaz0Ww0G81Gs9FsNBvNxrAxbAwbw8awMWwMG8PGsDFsbDY2G5uNzcZmY7Ox2dhsbDa2Ns73w93JSE4K0iIlqUhNGpJ8GM4N54Zzw7nh3HBuODecG84N54Zzw7nh3HBuODecG84N54Zzw7nh3HBuwUawEWwEG8FGsBFsBBuLjcXGYmOxsdhYbCw2FhuLjcVGspFsJBvJRrKRbCQbyUaykWwUG8VGsVFsFBvFRrFRbBQbxUaz0Ww0G81Gs9FsNBvNRrPRbAwbw8awMWwMG8PGsDFsDBvDxmZjs7HZ2GxsNjYbm43NxmaD89w5z53z3DnPnfPcOc+d89w5z53z3DnPHeeOc8e549xx7jh3nDvOHeeOc8e549xx7jh3nDvOHeeOc8e549xx7jh3nDvOHeeOc8e549xx7jh3nDvOHeeOc8e549xx7jh3nDvOHeeOc8e549xx7jh3nDvOHeeOc8e549xx7jh3nDvOHeeOc8e549xx7jh3nDvOHeeOc8e549xx7jh3nDvOHeeOc8e549xx7jh3nDvOHeeOc8e549xx7jh3nDvOHeeOc8d54DxwHjgPnAfOA+eB88B54DxwHjgPnAfOA+eB88B54DxwHjgPnAfOA+eB88B54DxwHjgPnAfOA+eB88B54DxwHjgPnAfOA+eB88B54DxwHjgPnAfOA+eB88B54DxwHjgPnAfOA+eB88B54DxwHjgPnAfOA+eB88B54DxwHjgPnAfOA+eB88B54DxwHjgPnAfOA+eB88B54DxwHjgPnAfOA+eB88B54DxwHjgPnAfOA+eB88B54DxwHjgPnC+cL5wvnC+cL5wvnC+cL5wvnC+cn++Hm30mIz03jr9owc/3w91pHX+9zJmSVMdfVHOmJg1pKx3O72QkJwVpkZLEhrPhbDgbwUawEWwEG8FGsBFsBBvBRrCx2FhsLDYWG4uNxcZiY7Gx2FhsJBvJRrKRbCQbyUaykWwkG8lGsVFsFBvFRrFRbBQbxUaxUWw0G81Gs9FsNBvNRrPRbDQbzcawMWwMG8PGsDFsDBvDxrAxbGw2Nhubjc3GZmOzsdnYbGw2tjbO98PdyUhOCtIiJalITRoSG8aGsWFsGBvGhrGB88R54jxxnjhPnCfOE+eJ88R54jxxnjhPnCfOE+eJ88R54jxxnjhPnJ/vhzv+ogI/3w93pdP5lYzkpCAtUpKK1CQ2FhvJRrKRbCQbyUaykWwkG8lGslFsnM7P/+r96fxKQVqkJLFRbBQbxUaz0TyP5nk0z6N5Hs3zaDaajWaj2Rg2ho1hY9gYNoaNYWPYGDaGjc3GZmOzsdnYbGw2Nhubjc3G1sb5frg7GclJQVqkJBWpSUNiw9gwNowNY8PYwHnhvHBeOC+cF84L54XzwnnhvHBeOC+cF84L54XzwnnhvHBeOC+cF84L58V5XpznxXlenOfFeV6c58V5XpznxXlenOfFeV6c58V5XpznxXlenOfFeV6c58V5XpznxXlenOfFeV6c58V5XpznxXlenOfFeV6c58V5XpznxXlenOfFeV6c58V5XpznxXlenOfFeV6c58V5XpznxXlenOfFeV6c58V5XpznxXlenOfFeV6c58V5XpznxXlenOfFeV6c58V5XpznzXnenOfNed6c58153pznzXnenOfNed6c58153pznzXnenOfNed44b5w3zhvnjfPGeeO8cd44b5w3zhvnjfPGeeO8cd44b5w3zhvnjfPGeeO8cd44b5w3zhvnjfPGeeO8cd44b5w3zhvnjfPGeeO8cd44b5w3zhvnjfPGeeO8cd44b5w3zhvnjfPGeeO8cd44b5w3zhvnjfPGeeO8cd44b5w3zhvnjfPGeeO8cd44b5w3zhvnjfPGeeO8cd44b5w3zhvnjfPB+eB8cD44H5wPzgfng/PB+eB8cD44H5wPzgfng/PB+eB8cD44H5wPzgfng/PB+eB8cD44H5wPzgfng/PB+eB8cD44H5wPzgfng/PB+eB8cD44H5wPzgfn5/vhjr+Izs/3w51/l/K/v//y6fsfPn/814e//H781Ve//fSj/p6r5z/++t+/6N/88OXT58+f/vm3X778/OPHv//25ePxd2Kd/+6Pv/7xPw==", + "debug_symbols": "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", "file_map": { "50": { "source": "struct Bar {\n inner: [Field; 3],\n}\n\nstruct Foo {\n a: Field,\n b: [Field; 3],\n bar: Bar,\n}\n\nstruct FooParent {\n array: [Field; 3],\n foos: [Foo; 4],\n}\n\nfn main(mut x: [Foo; 4], y: pub u32) {\n assert(x[y - 3].a == 1);\n assert(x[y - 3].b == [2, 3, 20]);\n assert(x[y - 2].a == 4);\n assert(x[y - 2].b == [5, 6, 21]);\n assert(x[y - 1].a == 7);\n assert(x[y - 1].b == [8, 9, 22]);\n assert(x[y].a == 10);\n assert(x[y].b == [11, 12, 23]);\n assert(x[y].bar.inner == [109, 110, 111]);\n // Check dynamic array set\n if y != 2 {\n x[y].a = 50;\n } else {\n x[y].a = 100;\n }\n assert(x[3].a == 50);\n\n if y == 2 {\n x[y - 1].b = [50, 51, 52];\n } else {\n x[y - 1].b = [100, 101, 102];\n }\n assert(x[2].b == [100, 101, 102]);\n\n assert(x[y - 3].bar.inner == [100, 101, 102]);\n assert(x[y - 2].bar.inner == [103, 104, 105]);\n assert(x[y - 1].bar.inner == [106, 107, 108]);\n assert(x[y].bar.inner == [109, 110, 111]);\n\n let foo_parent_one = FooParent { array: [0, 1, 2], foos: x };\n let foo_parent_two = FooParent { array: [3, 4, 5], foos: x };\n let mut foo_parents = [foo_parent_one, foo_parent_two];\n\n assert(foo_parents[y - 3].foos[y - 3].b == [2, 3, 20]);\n assert(foo_parents[y - 3].foos[y - 2].b == [5, 6, 21]);\n assert(foo_parents[y - 3].foos[y - 1].b == [100, 101, 102]);\n assert(foo_parents[y - 3].foos[y].b == [11, 12, 23]);\n\n assert(foo_parents[y - 3].foos[y].a == 50);\n\n assert(foo_parents[1].foos[1].b == [5, 6, 21]);\n if y == 2 {\n foo_parents[y - 2].foos[y - 2].b = [10, 9, 8];\n } else {\n foo_parents[y - 2].foos[y - 2].b = [20, 19, 18];\n }\n assert(foo_parents[1].foos[1].b == [20, 19, 18]);\n\n assert(foo_parents[1].foos[1].b[2] == 18);\n if y == 3 {\n foo_parents[y - 2].foos[y - 2].b[y - 1] = 5000;\n } else {\n foo_parents[y - 2].foos[y - 2].b[y - 1] = 1000;\n }\n assert(foo_parents[1].foos[1].b[2] == 5000);\n // Set a dynamic array value\n foo_parents[y - 2].foos[y - 3].b = foo_parents[y - 2].foos[y - 2].b;\n assert(foo_parents[1].foos[0].b == [20, 19, 5000]);\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_false_inliner_0.snap index 19a8103bb78..50b77b14496 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_false_inliner_0.snap @@ -80,7 +80,7 @@ expression: artifact }, "bytecode": [ "func 0", - "current witness index : _2988", + "current witness index : _3326", "private parameters indices : [_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27]", "public parameters indices : [_28]", "return value indices : []", @@ -1840,56 +1840,56 @@ expression: artifact "MEM (id: 19, read at: EXPR [ (1, _1590) 0 ], value: EXPR [ (1, _1591) 0 ]) ", "EXPR [ (1, _1590) (-1, _1592) 1 ]", "MEM (id: 19, read at: EXPR [ (1, _1592) 0 ], value: EXPR [ (1, _1593) 0 ]) ", - "EXPR [ (1, _190, _748) (-1, _2946) 0 ]", - "EXPR [ (1, _93, _1158) (-1, _1594) (1, _2946) 0 ]", - "EXPR [ (1, _190, _749) (-1, _2948) 0 ]", - "EXPR [ (1, _93, _1160) (-1, _1595) (1, _2948) 0 ]", - "EXPR [ (1, _190, _750) (-1, _2950) 0 ]", - "EXPR [ (1, _93, _1162) (-1, _1596) (1, _2950) 0 ]", - "EXPR [ (1, _190, _751) (-1, _2952) 0 ]", - "EXPR [ (1, _93, _1164) (-1, _1597) (1, _2952) 0 ]", - "EXPR [ (1, _190, _752) (-1, _2954) 0 ]", - "EXPR [ (1, _93, _1166) (-1, _1598) (1, _2954) 0 ]", - "EXPR [ (1, _190, _753) (-1, _2956) 0 ]", - "EXPR [ (1, _93, _1168) (-1, _1599) (1, _2956) 0 ]", - "EXPR [ (1, _190, _754) (-1, _2958) 0 ]", - "EXPR [ (1, _93, _1170) (-1, _1600) (1, _2958) 0 ]", - "EXPR [ (1, _190, _755) (-1, _2960) 0 ]", - "EXPR [ (1, _93, _1172) (-1, _1601) (1, _2960) 0 ]", + "EXPR [ (1, _190, _748) (-1, _3284) 0 ]", + "EXPR [ (1, _93, _1158) (-1, _1594) (1, _3284) 0 ]", + "EXPR [ (1, _190, _749) (-1, _3286) 0 ]", + "EXPR [ (1, _93, _1160) (-1, _1595) (1, _3286) 0 ]", + "EXPR [ (1, _190, _750) (-1, _3288) 0 ]", + "EXPR [ (1, _93, _1162) (-1, _1596) (1, _3288) 0 ]", + "EXPR [ (1, _190, _751) (-1, _3290) 0 ]", + "EXPR [ (1, _93, _1164) (-1, _1597) (1, _3290) 0 ]", + "EXPR [ (1, _190, _752) (-1, _3292) 0 ]", + "EXPR [ (1, _93, _1166) (-1, _1598) (1, _3292) 0 ]", + "EXPR [ (1, _190, _753) (-1, _3294) 0 ]", + "EXPR [ (1, _93, _1168) (-1, _1599) (1, _3294) 0 ]", + "EXPR [ (1, _190, _754) (-1, _3296) 0 ]", + "EXPR [ (1, _93, _1170) (-1, _1600) (1, _3296) 0 ]", + "EXPR [ (1, _190, _755) (-1, _3298) 0 ]", + "EXPR [ (1, _93, _1172) (-1, _1601) (1, _3298) 0 ]", "EXPR [ (1, _93, _1174) (5, _190) (-1, _1602) 0 ]", "EXPR [ (1, _93, _1176) (6, _190) (-1, _1603) 0 ]", "EXPR [ (1, _93, _1178) (21, _190) (-1, _1604) 0 ]", - "EXPR [ (1, _190, _759) (-1, _2962) 0 ]", - "EXPR [ (1, _93, _1180) (-1, _1605) (1, _2962) 0 ]", - "EXPR [ (1, _190, _760) (-1, _2964) 0 ]", - "EXPR [ (1, _93, _1182) (-1, _1606) (1, _2964) 0 ]", - "EXPR [ (1, _190, _761) (-1, _2966) 0 ]", - "EXPR [ (1, _93, _1184) (-1, _1607) (1, _2966) 0 ]", - "EXPR [ (1, _190, _762) (-1, _2968) 0 ]", - "EXPR [ (1, _93, _1186) (-1, _1608) (1, _2968) 0 ]", + "EXPR [ (1, _190, _759) (-1, _3300) 0 ]", + "EXPR [ (1, _93, _1180) (-1, _1605) (1, _3300) 0 ]", + "EXPR [ (1, _190, _760) (-1, _3302) 0 ]", + "EXPR [ (1, _93, _1182) (-1, _1606) (1, _3302) 0 ]", + "EXPR [ (1, _190, _761) (-1, _3304) 0 ]", + "EXPR [ (1, _93, _1184) (-1, _1607) (1, _3304) 0 ]", + "EXPR [ (1, _190, _762) (-1, _3306) 0 ]", + "EXPR [ (1, _93, _1186) (-1, _1608) (1, _3306) 0 ]", "EXPR [ (1, _93, _1188) (100, _190) (-1, _1609) 0 ]", "EXPR [ (1, _93, _1190) (101, _190) (-1, _1610) 0 ]", "EXPR [ (1, _93, _1192) (102, _190) (-1, _1611) 0 ]", - "EXPR [ (1, _190, _766) (-1, _2970) 0 ]", - "EXPR [ (1, _93, _1194) (-1, _1612) (1, _2970) 0 ]", - "EXPR [ (1, _190, _767) (-1, _2972) 0 ]", - "EXPR [ (1, _93, _1196) (-1, _1613) (1, _2972) 0 ]", - "EXPR [ (1, _190, _768) (-1, _2974) 0 ]", - "EXPR [ (1, _93, _1198) (-1, _1614) (1, _2974) 0 ]", - "EXPR [ (1, _190, _769) (-1, _2976) 0 ]", - "EXPR [ (1, _93, _1200) (-1, _1615) (1, _2976) 0 ]", - "EXPR [ (1, _190, _770) (-1, _2978) 0 ]", - "EXPR [ (1, _93, _1202) (-1, _1616) (1, _2978) 0 ]", - "EXPR [ (1, _190, _771) (-1, _2980) 0 ]", - "EXPR [ (1, _93, _1204) (-1, _1617) (1, _2980) 0 ]", - "EXPR [ (1, _190, _772) (-1, _2982) 0 ]", - "EXPR [ (1, _93, _1206) (-1, _1618) (1, _2982) 0 ]", - "EXPR [ (1, _190, _773) (-1, _2984) 0 ]", - "EXPR [ (1, _93, _1208) (-1, _1619) (1, _2984) 0 ]", - "EXPR [ (1, _190, _774) (-1, _2986) 0 ]", - "EXPR [ (1, _93, _1210) (-1, _1620) (1, _2986) 0 ]", - "EXPR [ (1, _190, _775) (-1, _2988) 0 ]", - "EXPR [ (1, _93, _1212) (-1, _1621) (1, _2988) 0 ]", + "EXPR [ (1, _190, _766) (-1, _3308) 0 ]", + "EXPR [ (1, _93, _1194) (-1, _1612) (1, _3308) 0 ]", + "EXPR [ (1, _190, _767) (-1, _3310) 0 ]", + "EXPR [ (1, _93, _1196) (-1, _1613) (1, _3310) 0 ]", + "EXPR [ (1, _190, _768) (-1, _3312) 0 ]", + "EXPR [ (1, _93, _1198) (-1, _1614) (1, _3312) 0 ]", + "EXPR [ (1, _190, _769) (-1, _3314) 0 ]", + "EXPR [ (1, _93, _1200) (-1, _1615) (1, _3314) 0 ]", + "EXPR [ (1, _190, _770) (-1, _3316) 0 ]", + "EXPR [ (1, _93, _1202) (-1, _1616) (1, _3316) 0 ]", + "EXPR [ (1, _190, _771) (-1, _3318) 0 ]", + "EXPR [ (1, _93, _1204) (-1, _1617) (1, _3318) 0 ]", + "EXPR [ (1, _190, _772) (-1, _3320) 0 ]", + "EXPR [ (1, _93, _1206) (-1, _1618) (1, _3320) 0 ]", + "EXPR [ (1, _190, _773) (-1, _3322) 0 ]", + "EXPR [ (1, _93, _1208) (-1, _1619) (1, _3322) 0 ]", + "EXPR [ (1, _190, _774) (-1, _3324) 0 ]", + "EXPR [ (1, _93, _1210) (-1, _1620) (1, _3324) 0 ]", + "EXPR [ (1, _190, _775) (-1, _3326) 0 ]", + "EXPR [ (1, _93, _1212) (-1, _1621) (1, _3326) 0 ]", "EXPR [ (2, _190) (-1, _1622) 0 ]", "MEM (id: 31, read at: EXPR [ (1, _1622) 0 ], value: EXPR [ (1, _1623) 0 ]) ", "MEM (id: 19, read at: EXPR [ (1, _1623) 0 ], value: EXPR [ (1, _1624) 0 ]) ", @@ -1957,34 +1957,34 @@ expression: artifact "MEM (id: 19, read at: EXPR [ (1, _1685) 0 ], value: EXPR [ (1, _1686) 0 ]) ", "EXPR [ (1, _1685) (-1, _1687) 1 ]", "MEM (id: 19, read at: EXPR [ (1, _1687) 0 ], value: EXPR [ (1, _1688) 0 ]) ", - "EXPR [ (1, _93, _1222) (-1, _1689) (1, _2946) 0 ]", - "EXPR [ (1, _93, _1224) (-1, _1690) (1, _2948) 0 ]", - "EXPR [ (1, _93, _1226) (-1, _1691) (1, _2950) 0 ]", - "EXPR [ (1, _93, _1228) (-1, _1692) (1, _2952) 0 ]", - "EXPR [ (1, _93, _1230) (-1, _1693) (1, _2954) 0 ]", - "EXPR [ (1, _93, _1232) (-1, _1694) (1, _2956) 0 ]", - "EXPR [ (1, _93, _1234) (-1, _1695) (1, _2958) 0 ]", - "EXPR [ (1, _93, _1236) (-1, _1696) (1, _2960) 0 ]", + "EXPR [ (1, _93, _1222) (-1, _1689) (1, _3284) 0 ]", + "EXPR [ (1, _93, _1224) (-1, _1690) (1, _3286) 0 ]", + "EXPR [ (1, _93, _1226) (-1, _1691) (1, _3288) 0 ]", + "EXPR [ (1, _93, _1228) (-1, _1692) (1, _3290) 0 ]", + "EXPR [ (1, _93, _1230) (-1, _1693) (1, _3292) 0 ]", + "EXPR [ (1, _93, _1232) (-1, _1694) (1, _3294) 0 ]", + "EXPR [ (1, _93, _1234) (-1, _1695) (1, _3296) 0 ]", + "EXPR [ (1, _93, _1236) (-1, _1696) (1, _3298) 0 ]", "EXPR [ (1, _93, _1238) (5, _190) (-1, _1697) 0 ]", "EXPR [ (1, _93, _1240) (6, _190) (-1, _1698) 0 ]", "EXPR [ (1, _93, _1242) (21, _190) (-1, _1699) 0 ]", - "EXPR [ (1, _93, _1244) (-1, _1700) (1, _2962) 0 ]", - "EXPR [ (1, _93, _1246) (-1, _1701) (1, _2964) 0 ]", - "EXPR [ (1, _93, _1248) (-1, _1702) (1, _2966) 0 ]", - "EXPR [ (1, _93, _1250) (-1, _1703) (1, _2968) 0 ]", + "EXPR [ (1, _93, _1244) (-1, _1700) (1, _3300) 0 ]", + "EXPR [ (1, _93, _1246) (-1, _1701) (1, _3302) 0 ]", + "EXPR [ (1, _93, _1248) (-1, _1702) (1, _3304) 0 ]", + "EXPR [ (1, _93, _1250) (-1, _1703) (1, _3306) 0 ]", "EXPR [ (1, _93, _1252) (100, _190) (-1, _1704) 0 ]", "EXPR [ (1, _93, _1254) (101, _190) (-1, _1705) 0 ]", "EXPR [ (1, _93, _1256) (102, _190) (-1, _1706) 0 ]", - "EXPR [ (1, _93, _1258) (-1, _1707) (1, _2970) 0 ]", - "EXPR [ (1, _93, _1260) (-1, _1708) (1, _2972) 0 ]", - "EXPR [ (1, _93, _1262) (-1, _1709) (1, _2974) 0 ]", - "EXPR [ (1, _93, _1264) (-1, _1710) (1, _2976) 0 ]", - "EXPR [ (1, _93, _1266) (-1, _1711) (1, _2978) 0 ]", - "EXPR [ (1, _93, _1268) (-1, _1712) (1, _2980) 0 ]", - "EXPR [ (1, _93, _1270) (-1, _1713) (1, _2982) 0 ]", - "EXPR [ (1, _93, _1272) (-1, _1714) (1, _2984) 0 ]", - "EXPR [ (1, _93, _1274) (-1, _1715) (1, _2986) 0 ]", - "EXPR [ (1, _93, _1276) (-1, _1716) (1, _2988) 0 ]", + "EXPR [ (1, _93, _1258) (-1, _1707) (1, _3308) 0 ]", + "EXPR [ (1, _93, _1260) (-1, _1708) (1, _3310) 0 ]", + "EXPR [ (1, _93, _1262) (-1, _1709) (1, _3312) 0 ]", + "EXPR [ (1, _93, _1264) (-1, _1710) (1, _3314) 0 ]", + "EXPR [ (1, _93, _1266) (-1, _1711) (1, _3316) 0 ]", + "EXPR [ (1, _93, _1268) (-1, _1712) (1, _3318) 0 ]", + "EXPR [ (1, _93, _1270) (-1, _1713) (1, _3320) 0 ]", + "EXPR [ (1, _93, _1272) (-1, _1714) (1, _3322) 0 ]", + "EXPR [ (1, _93, _1274) (-1, _1715) (1, _3324) 0 ]", + "EXPR [ (1, _93, _1276) (-1, _1716) (1, _3326) 0 ]", "EXPR [ (1, _93, _1697) (1, _190, _1650) -20 ]", "EXPR [ (1, _93, _1698) (1, _190, _1652) -19 ]", "EXPR [ (1, _93, _1699) (1, _190, _1654) -18 ]", @@ -2874,14 +2874,14 @@ expression: artifact "MEM (id: 40, read at: EXPR [ (1, _120) 0 ], value: EXPR [ (1, _2504) 0 ]) ", "MEM (id: 40, read at: EXPR [ (1, _32) 0 ], value: EXPR [ (1, _2505) 0 ]) ", "INIT (id: 45, len: 5, witnesses: [_2501, _2502, _2503, _2504, _2505])", - "EXPR [ (-3, _1718) (-1, _2506) 3 ]", - "MEM (id: 45, read at: EXPR [ (1, _2506) 0 ], value: EXPR [ (1, _2507) 0 ]) ", - "MEM (id: 39, read at: EXPR [ (1, _2507) 0 ], value: EXPR [ (1, _2508) 0 ]) ", - "EXPR [ (1, _2507) (-1, _2509) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2509) 0 ], value: EXPR [ (1, _2510) 0 ]) ", - "EXPR [ (1, _2509) (-1, _2511) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2511) 0 ], value: EXPR [ (1, _2512) 0 ]) ", - "EXPR [ (1, _2511) (-1, _2513) 1 ]", + "MEM (id: 45, read at: EXPR [ (1, _30) 0 ], value: EXPR [ (1, _2506) 0 ]) ", + "MEM (id: 39, read at: EXPR [ (1, _2506) 0 ], value: EXPR [ (1, _2507) 0 ]) ", + "EXPR [ (1, _2506) (-1, _2508) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2508) 0 ], value: EXPR [ (1, _2509) 0 ]) ", + "EXPR [ (1, _2508) (-1, _2510) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2510) 0 ], value: EXPR [ (1, _2511) 0 ]) ", + "EXPR [ (-1, _1718) (-1, _2512) 1 ]", + "MEM (id: 45, read at: EXPR [ (1, _2512) 0 ], value: EXPR [ (1, _2513) 0 ]) ", "MEM (id: 39, read at: EXPR [ (1, _2513) 0 ], value: EXPR [ (1, _2514) 0 ]) ", "EXPR [ (1, _2513) (-1, _2515) 1 ]", "MEM (id: 39, read at: EXPR [ (1, _2515) 0 ], value: EXPR [ (1, _2516) 0 ]) ", @@ -2931,14 +2931,395 @@ expression: artifact "MEM (id: 39, read at: EXPR [ (1, _2559) 0 ], value: EXPR [ (1, _2560) 0 ]) ", "EXPR [ (1, _2559) (-1, _2561) 1 ]", "MEM (id: 39, read at: EXPR [ (1, _2561) 0 ], value: EXPR [ (1, _2562) 0 ]) ", - "EXPR [ (1, _1718, _2221) (-1, _1718, _2528) (1, _2528) -5000 ]", + "EXPR [ (1, _2561) (-1, _2563) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2563) 0 ], value: EXPR [ (1, _2564) 0 ]) ", + "EXPR [ (1, _2563) (-1, _2565) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2565) 0 ], value: EXPR [ (1, _2566) 0 ]) ", + "EXPR [ (1, _2565) (-1, _2567) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2567) 0 ], value: EXPR [ (1, _2568) 0 ]) ", + "EXPR [ (2, _2512) (-1, _2569) 0 ]", + "MEM (id: 45, read at: EXPR [ (1, _2569) 0 ], value: EXPR [ (1, _2570) 0 ]) ", + "MEM (id: 39, read at: EXPR [ (1, _2570) 0 ], value: EXPR [ (1, _2571) 0 ]) ", + "EXPR [ (1, _2570) (-1, _2572) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2572) 0 ], value: EXPR [ (1, _2573) 0 ]) ", + "EXPR [ (1, _2572) (-1, _2574) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2574) 0 ], value: EXPR [ (1, _2575) 0 ]) ", + "EXPR [ (3, _2512) (-1, _2576) 0 ]", + "MEM (id: 45, read at: EXPR [ (1, _2576) 0 ], value: EXPR [ (1, _2577) 0 ]) ", + "MEM (id: 39, read at: EXPR [ (1, _2577) 0 ], value: EXPR [ (1, _2578) 0 ]) ", + "EXPR [ (1, _2577) (-1, _2579) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2579) 0 ], value: EXPR [ (1, _2580) 0 ]) ", + "EXPR [ (1, _2579) (-1, _2581) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2581) 0 ], value: EXPR [ (1, _2582) 0 ]) ", + "EXPR [ (1, _2581) (-1, _2583) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2583) 0 ], value: EXPR [ (1, _2584) 0 ]) ", + "EXPR [ (1, _2583) (-1, _2585) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2585) 0 ], value: EXPR [ (1, _2586) 0 ]) ", + "EXPR [ (1, _2585) (-1, _2587) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2587) 0 ], value: EXPR [ (1, _2588) 0 ]) ", + "EXPR [ (1, _2587) (-1, _2589) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2589) 0 ], value: EXPR [ (1, _2590) 0 ]) ", + "EXPR [ (1, _2589) (-1, _2591) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2591) 0 ], value: EXPR [ (1, _2592) 0 ]) ", + "EXPR [ (1, _2591) (-1, _2593) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2593) 0 ], value: EXPR [ (1, _2594) 0 ]) ", + "EXPR [ (1, _2593) (-1, _2595) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2595) 0 ], value: EXPR [ (1, _2596) 0 ]) ", + "EXPR [ (1, _2595) (-1, _2597) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2597) 0 ], value: EXPR [ (1, _2598) 0 ]) ", + "EXPR [ (1, _2597) (-1, _2599) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2599) 0 ], value: EXPR [ (1, _2600) 0 ]) ", + "EXPR [ (1, _2599) (-1, _2601) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2601) 0 ], value: EXPR [ (1, _2602) 0 ]) ", + "EXPR [ (1, _2601) (-1, _2603) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2603) 0 ], value: EXPR [ (1, _2604) 0 ]) ", + "EXPR [ (1, _2603) (-1, _2605) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2605) 0 ], value: EXPR [ (1, _2606) 0 ]) ", + "EXPR [ (1, _2605) (-1, _2607) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2607) 0 ], value: EXPR [ (1, _2608) 0 ]) ", + "EXPR [ (1, _2607) (-1, _2609) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2609) 0 ], value: EXPR [ (1, _2610) 0 ]) ", + "EXPR [ (1, _2609) (-1, _2611) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2611) 0 ], value: EXPR [ (1, _2612) 0 ]) ", + "EXPR [ (1, _2611) (-1, _2613) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2613) 0 ], value: EXPR [ (1, _2614) 0 ]) ", + "EXPR [ (1, _2613) (-1, _2615) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2615) 0 ], value: EXPR [ (1, _2616) 0 ]) ", + "EXPR [ (1, _2615) (-1, _2617) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2617) 0 ], value: EXPR [ (1, _2618) 0 ]) ", + "EXPR [ (1, _2617) (-1, _2619) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2619) 0 ], value: EXPR [ (1, _2620) 0 ]) ", + "EXPR [ (1, _2619) (-1, _2621) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2621) 0 ], value: EXPR [ (1, _2622) 0 ]) ", + "EXPR [ (1, _2621) (-1, _2623) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2623) 0 ], value: EXPR [ (1, _2624) 0 ]) ", + "EXPR [ (1, _2623) (-1, _2625) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2625) 0 ], value: EXPR [ (1, _2626) 0 ]) ", + "EXPR [ (1, _2625) (-1, _2627) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2627) 0 ], value: EXPR [ (1, _2628) 0 ]) ", + "EXPR [ (1, _2627) (-1, _2629) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2629) 0 ], value: EXPR [ (1, _2630) 0 ]) ", + "EXPR [ (1, _2629) (-1, _2631) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2631) 0 ], value: EXPR [ (1, _2632) 0 ]) ", + "EXPR [ (1, _1718, _2221) (1, _2512, _2598) -5000 ]", "BLACKBOX::RANGE [(_53, 1)] []", + "EXPR [ (1, _1718, _2177) (-1, _1718, _2507) (1, _2507) (-1, _2633) 0 ]", + "EXPR [ (1, _1718, _2178) (-1, _1718, _2509) (1, _2509) (-1, _2634) 0 ]", + "EXPR [ (1, _1718, _2179) (-1, _1718, _2511) (1, _2511) (-1, _2635) 0 ]", + "EXPR [ (1, _1718, _2180) (1, _2512, _2514) (-1, _2636) 0 ]", + "EXPR [ (1, _1718, _2181) (1, _2512, _2516) (-1, _2637) 0 ]", + "EXPR [ (1, _1718, _2182) (1, _2512, _2518) (-1, _2638) 0 ]", + "EXPR [ (1, _1718, _2183) (1, _2512, _2520) (-1, _2639) 0 ]", + "EXPR [ (1, _1718, _2184) (1, _2512, _2522) (-1, _2640) 0 ]", + "EXPR [ (1, _1718, _2185) (1, _2512, _2524) (-1, _2641) 0 ]", + "EXPR [ (1, _1718, _2186) (1, _2512, _2526) (-1, _2642) 0 ]", + "EXPR [ (1, _1718, _2187) (1, _2512, _2528) (-1, _2643) 0 ]", + "EXPR [ (1, _1718, _2188) (1, _2512, _2530) (-1, _2644) 0 ]", + "EXPR [ (1, _1718, _2189) (1, _2512, _2532) (-1, _2645) 0 ]", + "EXPR [ (1, _1718, _2190) (1, _2512, _2534) (-1, _2646) 0 ]", + "EXPR [ (1, _1718, _2191) (1, _2512, _2536) (-1, _2647) 0 ]", + "EXPR [ (1, _1718, _2192) (1, _2512, _2538) (-1, _2648) 0 ]", + "EXPR [ (1, _1718, _2193) (1, _2512, _2540) (-1, _2649) 0 ]", + "EXPR [ (1, _1718, _2194) (1, _2512, _2542) (-1, _2650) 0 ]", + "EXPR [ (1, _1718, _2195) (1, _2512, _2544) (-1, _2651) 0 ]", + "EXPR [ (1, _1718, _2196) (1, _2512, _2546) (-1, _2652) 0 ]", + "EXPR [ (1, _1718, _2197) (1, _2512, _2548) (-1, _2653) 0 ]", + "EXPR [ (1, _1718, _2198) (1, _2512, _2550) (-1, _2654) 0 ]", + "EXPR [ (1, _1718, _2199) (1, _2512, _2552) (-1, _2655) 0 ]", + "EXPR [ (1, _1718, _2200) (1, _2512, _2554) (-1, _2656) 0 ]", + "EXPR [ (1, _1718, _2201) (1, _2512, _2556) (-1, _2657) 0 ]", + "EXPR [ (1, _1718, _2202) (1, _2512, _2558) (-1, _2658) 0 ]", + "EXPR [ (1, _1718, _2203) (1, _2512, _2560) (-1, _2659) 0 ]", + "EXPR [ (1, _1718, _2204) (1, _2512, _2562) (-1, _2660) 0 ]", + "EXPR [ (1, _1718, _2205) (1, _2512, _2564) (-1, _2661) 0 ]", + "EXPR [ (1, _1718, _2206) (1, _2512, _2566) (-1, _2662) 0 ]", + "EXPR [ (1, _1718, _2207) (1, _2512, _2568) (-1, _2663) 0 ]", + "EXPR [ (1, _1718, _2208) (1, _2512, _2571) (-1, _2664) 0 ]", + "EXPR [ (1, _1718, _2209) (1, _2512, _2573) (-1, _2665) 0 ]", + "EXPR [ (1, _1718, _2210) (1, _2512, _2575) (-1, _2666) 0 ]", + "EXPR [ (1, _1718, _2211) (1, _2512, _2578) (-1, _2667) 0 ]", + "EXPR [ (1, _1718, _2212) (1, _2512, _2580) (-1, _2668) 0 ]", + "EXPR [ (1, _1718, _2213) (1, _2512, _2582) (-1, _2669) 0 ]", + "EXPR [ (1, _1718, _2214) (1, _2512, _2584) (-1, _2670) 0 ]", + "EXPR [ (1, _1718, _2215) (1, _2512, _2586) (-1, _2671) 0 ]", + "EXPR [ (1, _1718, _2216) (1, _2512, _2588) (-1, _2672) 0 ]", + "EXPR [ (1, _1718, _2217) (1, _2512, _2590) (-1, _2673) 0 ]", + "EXPR [ (1, _1718, _2218) (1, _2512, _2592) (-1, _2674) 0 ]", + "EXPR [ (1, _1718, _2219) (1, _2512, _2594) (-1, _2675) 0 ]", + "EXPR [ (1, _1718, _2220) (1, _2512, _2596) (-1, _2676) 0 ]", + "EXPR [ (-1, _2677) 5000 ]", + "EXPR [ (1, _1718, _2222) (1, _2512, _2600) (-1, _2678) 0 ]", + "EXPR [ (1, _1718, _2223) (1, _2512, _2602) (-1, _2679) 0 ]", + "EXPR [ (1, _1718, _2224) (1, _2512, _2604) (-1, _2680) 0 ]", + "EXPR [ (1, _1718, _2225) (1, _2512, _2606) (-1, _2681) 0 ]", + "EXPR [ (1, _1718, _2226) (1, _2512, _2608) (-1, _2682) 0 ]", + "EXPR [ (1, _1718, _2227) (1, _2512, _2610) (-1, _2683) 0 ]", + "EXPR [ (1, _1718, _2228) (1, _2512, _2612) (-1, _2684) 0 ]", + "EXPR [ (1, _1718, _2229) (1, _2512, _2614) (-1, _2685) 0 ]", + "EXPR [ (1, _1718, _2230) (1, _2512, _2616) (-1, _2686) 0 ]", + "EXPR [ (1, _1718, _2231) (1, _2512, _2618) (-1, _2687) 0 ]", + "EXPR [ (1, _1718, _2232) (1, _2512, _2620) (-1, _2688) 0 ]", + "EXPR [ (1, _1718, _2233) (1, _2512, _2622) (-1, _2689) 0 ]", + "EXPR [ (1, _1718, _2234) (1, _2512, _2624) (-1, _2690) 0 ]", + "EXPR [ (1, _1718, _2235) (1, _2512, _2626) (-1, _2691) 0 ]", + "EXPR [ (1, _1718, _2236) (1, _2512, _2628) (-1, _2692) 0 ]", + "EXPR [ (1, _1718, _2237) (1, _2512, _2630) (-1, _2693) 0 ]", + "EXPR [ (1, _1718, _2238) (1, _2512, _2632) (-1, _2694) 0 ]", + "INIT (id: 46, len: 62, witnesses: [_2633, _2634, _2635, _2636, _2637, _2638, _2639, _2640, _2641, _2642, _2643, _2644, _2645, _2646, _2647, _2648, _2649, _2650, _2651, _2652, _2653, _2654, _2655, _2656, _2657, _2658, _2659, _2660, _2661, _2662, _2663, _2664, _2665, _2666, _2667, _2668, _2669, _2670, _2671, _2672, _2673, _2674, _2675, _2676, _2677, _2678, _2679, _2680, _2681, _2682, _2683, _2684, _2685, _2686, _2687, _2688, _2689, _2690, _2691, _2692, _2693, _2694])", + "INIT (id: 47, len: 5, witnesses: [_30, _120, _803, _804, _805])", + "EXPR [ (2, _53) (-1, _2695) 1 ]", + "MEM (id: 47, read at: EXPR [ (1, _2695) 0 ], value: EXPR [ (1, _2696) 0 ]) ", + "MEM (id: 46, read at: EXPR [ (1, _2696) 0 ], value: EXPR [ (1, _2697) 0 ]) ", + "EXPR [ (1, _2696) (-1, _2698) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2698) 0 ], value: EXPR [ (1, _2699) 0 ]) ", + "EXPR [ (1, _2698) (-1, _2700) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2700) 0 ], value: EXPR [ (1, _2701) 0 ]) ", + "EXPR [ (1, _2700) (-1, _2702) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2702) 0 ], value: EXPR [ (1, _2703) 0 ]) ", + "EXPR [ (1, _2702) (-1, _2704) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2704) 0 ], value: EXPR [ (1, _2705) 0 ]) ", + "EXPR [ (1, _2704) (-1, _2706) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2706) 0 ], value: EXPR [ (1, _2707) 0 ]) ", + "EXPR [ (1, _2706) (-1, _2708) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2708) 0 ], value: EXPR [ (1, _2709) 0 ]) ", + "EXPR [ (1, _2708) (-1, _2710) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2710) 0 ], value: EXPR [ (1, _2711) 0 ]) ", + "EXPR [ (1, _2710) (-1, _2712) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2712) 0 ], value: EXPR [ (1, _2713) 0 ]) ", + "EXPR [ (1, _2712) (-1, _2714) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2714) 0 ], value: EXPR [ (1, _2715) 0 ]) ", + "EXPR [ (1, _2714) (-1, _2716) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2716) 0 ], value: EXPR [ (1, _2717) 0 ]) ", + "EXPR [ (1, _2716) (-1, _2718) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2718) 0 ], value: EXPR [ (1, _2719) 0 ]) ", + "EXPR [ (1, _2718) (-1, _2720) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2720) 0 ], value: EXPR [ (1, _2721) 0 ]) ", + "EXPR [ (1, _2720) (-1, _2722) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2722) 0 ], value: EXPR [ (1, _2723) 0 ]) ", + "EXPR [ (1, _2722) (-1, _2724) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2724) 0 ], value: EXPR [ (1, _2725) 0 ]) ", + "EXPR [ (1, _2724) (-1, _2726) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2726) 0 ], value: EXPR [ (1, _2727) 0 ]) ", + "EXPR [ (1, _2726) (-1, _2728) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2728) 0 ], value: EXPR [ (1, _2729) 0 ]) ", + "EXPR [ (1, _2728) (-1, _2730) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2730) 0 ], value: EXPR [ (1, _2731) 0 ]) ", + "EXPR [ (1, _2730) (-1, _2732) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2732) 0 ], value: EXPR [ (1, _2733) 0 ]) ", + "EXPR [ (1, _2732) (-1, _2734) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2734) 0 ], value: EXPR [ (1, _2735) 0 ]) ", + "EXPR [ (1, _2734) (-1, _2736) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2736) 0 ], value: EXPR [ (1, _2737) 0 ]) ", + "EXPR [ (1, _2736) (-1, _2738) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2738) 0 ], value: EXPR [ (1, _2739) 0 ]) ", + "EXPR [ (1, _2738) (-1, _2740) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2740) 0 ], value: EXPR [ (1, _2741) 0 ]) ", + "EXPR [ (1, _2740) (-1, _2742) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2742) 0 ], value: EXPR [ (1, _2743) 0 ]) ", + "EXPR [ (1, _2742) (-1, _2744) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2744) 0 ], value: EXPR [ (1, _2745) 0 ]) ", + "EXPR [ (1, _2744) (-1, _2746) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2746) 0 ], value: EXPR [ (1, _2747) 0 ]) ", + "EXPR [ (1, _2746) (-1, _2748) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2748) 0 ], value: EXPR [ (1, _2749) 0 ]) ", + "EXPR [ (1, _2748) (-1, _2750) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2750) 0 ], value: EXPR [ (1, _2751) 0 ]) ", + "INIT (id: 48, len: 28, witnesses: [_2697, _2699, _2701, _2703, _2705, _2707, _2709, _2711, _2713, _2715, _2717, _2719, _2721, _2723, _2725, _2727, _2729, _2731, _2733, _2735, _2737, _2739, _2741, _2743, _2745, _2747, _2749, _2751])", + "INIT (id: 49, len: 13, witnesses: [_30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42])", + "MEM (id: 49, read at: EXPR [ (1, _57) 0 ], value: EXPR [ (1, _2752) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _2752) 0 ], value: EXPR [ (1, _2753) 0 ]) ", + "EXPR [ (1, _2752) (-1, _2754) 1 ]", + "MEM (id: 48, read at: EXPR [ (1, _2754) 0 ], value: EXPR [ (1, _2755) 0 ]) ", + "EXPR [ (1, _2754) (-1, _2756) 1 ]", + "MEM (id: 48, read at: EXPR [ (1, _2756) 0 ], value: EXPR [ (1, _2757) 0 ]) ", + "MEM (id: 49, read at: EXPR [ (1, _776) 0 ], value: EXPR [ (1, _2758) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _2758) 0 ], value: EXPR [ (1, _2759) 0 ]) ", + "EXPR [ (1, _2758) (-1, _2760) 1 ]", + "MEM (id: 48, read at: EXPR [ (1, _2760) 0 ], value: EXPR [ (1, _2761) 0 ]) ", + "EXPR [ (1, _2760) (-1, _2762) 1 ]", + "MEM (id: 48, read at: EXPR [ (1, _2762) 0 ], value: EXPR [ (1, _2763) 0 ]) ", + "MEM (id: 49, read at: EXPR [ (1, _46) 0 ], value: EXPR [ (1, _2764) 0 ]) ", + "MEM (id: 48, write EXPR [ (1, _2753) 0 ] at: EXPR [ (1, _2764) 0 ]) ", + "EXPR [ (1, _2764) (-1, _2765) 1 ]", + "MEM (id: 48, write EXPR [ (1, _2755) 0 ] at: EXPR [ (1, _2765) 0 ]) ", + "EXPR [ (1, _2765) (-1, _2766) 1 ]", + "MEM (id: 48, write EXPR [ (1, _2757) 0 ] at: EXPR [ (1, _2766) 0 ]) ", + "MEM (id: 49, read at: EXPR [ (1, _30) 0 ], value: EXPR [ (1, _2767) 0 ]) ", + "MEM (id: 49, read at: EXPR [ (1, _31) 0 ], value: EXPR [ (1, _2768) 0 ]) ", + "MEM (id: 49, read at: EXPR [ (1, _118) 0 ], value: EXPR [ (1, _2769) 0 ]) ", + "MEM (id: 49, read at: EXPR [ (1, _120) 0 ], value: EXPR [ (1, _2770) 0 ]) ", + "MEM (id: 49, read at: EXPR [ (1, _32) 0 ], value: EXPR [ (1, _2771) 0 ]) ", + "MEM (id: 49, read at: EXPR [ (1, _123) 0 ], value: EXPR [ (1, _2772) 0 ]) ", + "MEM (id: 49, read at: EXPR [ (1, _125) 0 ], value: EXPR [ (1, _2773) 0 ]) ", + "MEM (id: 49, read at: EXPR [ (1, _33) 0 ], value: EXPR [ (1, _2774) 0 ]) ", + "MEM (id: 49, read at: EXPR [ (1, _34) 0 ], value: EXPR [ (1, _2775) 0 ]) ", + "MEM (id: 49, read at: EXPR [ (1, _129) 0 ], value: EXPR [ (1, _2776) 0 ]) ", + "MEM (id: 49, read at: EXPR [ (1, _131) 0 ], value: EXPR [ (1, _2777) 0 ]) ", + "MEM (id: 49, read at: EXPR [ (1, _35) 0 ], value: EXPR [ (1, _2778) 0 ]) ", + "MEM (id: 49, read at: EXPR [ (1, _134) 0 ], value: EXPR [ (1, _2779) 0 ]) ", + "INIT (id: 50, len: 13, witnesses: [_2767, _2768, _2769, _2770, _2771, _2772, _2773, _2774, _2775, _2776, _2777, _2778, _2779])", + "EXPR [ (1, _46) (-1, _2780) 1 ]", + "MEM (id: 50, read at: EXPR [ (1, _2780) 0 ], value: EXPR [ (1, _2781) 0 ]) ", + "MEM (id: 48, write EXPR [ (1, _2759) 0 ] at: EXPR [ (1, _2781) 0 ]) ", + "EXPR [ (1, _2781) (-1, _2782) 1 ]", + "MEM (id: 48, write EXPR [ (1, _2761) 0 ] at: EXPR [ (1, _2782) 0 ]) ", + "EXPR [ (1, _2782) (-1, _2783) 1 ]", + "MEM (id: 48, write EXPR [ (1, _2763) 0 ] at: EXPR [ (1, _2783) 0 ]) ", + "MEM (id: 47, read at: EXPR [ (1, _2695) 0 ], value: EXPR [ (1, _2784) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _30) 0 ], value: EXPR [ (1, _2785) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _31) 0 ], value: EXPR [ (1, _2786) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _118) 0 ], value: EXPR [ (1, _2787) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _120) 0 ], value: EXPR [ (1, _2788) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _32) 0 ], value: EXPR [ (1, _2789) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _123) 0 ], value: EXPR [ (1, _2790) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _125) 0 ], value: EXPR [ (1, _2791) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _33) 0 ], value: EXPR [ (1, _2792) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _34) 0 ], value: EXPR [ (1, _2793) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _129) 0 ], value: EXPR [ (1, _2794) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _131) 0 ], value: EXPR [ (1, _2795) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _35) 0 ], value: EXPR [ (1, _2796) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _134) 0 ], value: EXPR [ (1, _2797) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _1067) 0 ], value: EXPR [ (1, _2798) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _36) 0 ], value: EXPR [ (1, _2799) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _37) 0 ], value: EXPR [ (1, _2800) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _1071) 0 ], value: EXPR [ (1, _2801) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _1073) 0 ], value: EXPR [ (1, _2802) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _38) 0 ], value: EXPR [ (1, _2803) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _1076) 0 ], value: EXPR [ (1, _2804) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _1078) 0 ], value: EXPR [ (1, _2805) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _39) 0 ], value: EXPR [ (1, _2806) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _40) 0 ], value: EXPR [ (1, _2807) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _1082) 0 ], value: EXPR [ (1, _2808) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _1084) 0 ], value: EXPR [ (1, _2809) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _41) 0 ], value: EXPR [ (1, _2810) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _1087) 0 ], value: EXPR [ (1, _2811) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _1089) 0 ], value: EXPR [ (1, _2812) 0 ]) ", + "MEM (id: 46, write EXPR [ (1, _2785) 0 ] at: EXPR [ (1, _2784) 0 ]) ", + "EXPR [ (1, _2784) (-1, _2813) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2786) 0 ] at: EXPR [ (1, _2813) 0 ]) ", + "EXPR [ (1, _2813) (-1, _2814) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2787) 0 ] at: EXPR [ (1, _2814) 0 ]) ", + "EXPR [ (1, _2814) (-1, _2815) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2788) 0 ] at: EXPR [ (1, _2815) 0 ]) ", + "EXPR [ (1, _2815) (-1, _2816) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2789) 0 ] at: EXPR [ (1, _2816) 0 ]) ", + "EXPR [ (1, _2816) (-1, _2817) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2790) 0 ] at: EXPR [ (1, _2817) 0 ]) ", + "EXPR [ (1, _2817) (-1, _2818) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2791) 0 ] at: EXPR [ (1, _2818) 0 ]) ", + "EXPR [ (1, _2818) (-1, _2819) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2792) 0 ] at: EXPR [ (1, _2819) 0 ]) ", + "EXPR [ (1, _2819) (-1, _2820) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2793) 0 ] at: EXPR [ (1, _2820) 0 ]) ", + "EXPR [ (1, _2820) (-1, _2821) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2794) 0 ] at: EXPR [ (1, _2821) 0 ]) ", + "EXPR [ (1, _2821) (-1, _2822) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2795) 0 ] at: EXPR [ (1, _2822) 0 ]) ", + "EXPR [ (1, _2822) (-1, _2823) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2796) 0 ] at: EXPR [ (1, _2823) 0 ]) ", + "EXPR [ (1, _2823) (-1, _2824) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2797) 0 ] at: EXPR [ (1, _2824) 0 ]) ", + "EXPR [ (1, _2824) (-1, _2825) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2798) 0 ] at: EXPR [ (1, _2825) 0 ]) ", + "EXPR [ (1, _2825) (-1, _2826) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2799) 0 ] at: EXPR [ (1, _2826) 0 ]) ", + "EXPR [ (1, _2826) (-1, _2827) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2800) 0 ] at: EXPR [ (1, _2827) 0 ]) ", + "EXPR [ (1, _2827) (-1, _2828) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2801) 0 ] at: EXPR [ (1, _2828) 0 ]) ", + "EXPR [ (1, _2828) (-1, _2829) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2802) 0 ] at: EXPR [ (1, _2829) 0 ]) ", + "EXPR [ (1, _2829) (-1, _2830) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2803) 0 ] at: EXPR [ (1, _2830) 0 ]) ", + "EXPR [ (1, _2830) (-1, _2831) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2804) 0 ] at: EXPR [ (1, _2831) 0 ]) ", + "EXPR [ (1, _2831) (-1, _2832) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2805) 0 ] at: EXPR [ (1, _2832) 0 ]) ", + "EXPR [ (1, _2832) (-1, _2833) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2806) 0 ] at: EXPR [ (1, _2833) 0 ]) ", + "EXPR [ (1, _2833) (-1, _2834) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2807) 0 ] at: EXPR [ (1, _2834) 0 ]) ", + "EXPR [ (1, _2834) (-1, _2835) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2808) 0 ] at: EXPR [ (1, _2835) 0 ]) ", + "EXPR [ (1, _2835) (-1, _2836) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2809) 0 ] at: EXPR [ (1, _2836) 0 ]) ", + "EXPR [ (1, _2836) (-1, _2837) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2810) 0 ] at: EXPR [ (1, _2837) 0 ]) ", + "EXPR [ (1, _2837) (-1, _2838) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2811) 0 ] at: EXPR [ (1, _2838) 0 ]) ", + "EXPR [ (1, _2838) (-1, _2839) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2812) 0 ] at: EXPR [ (1, _2839) 0 ]) ", + "MEM (id: 47, read at: EXPR [ (1, _30) 0 ], value: EXPR [ (1, _2840) 0 ]) ", + "MEM (id: 47, read at: EXPR [ (1, _31) 0 ], value: EXPR [ (1, _2841) 0 ]) ", + "MEM (id: 47, read at: EXPR [ (1, _118) 0 ], value: EXPR [ (1, _2842) 0 ]) ", + "MEM (id: 47, read at: EXPR [ (1, _120) 0 ], value: EXPR [ (1, _2843) 0 ]) ", + "MEM (id: 47, read at: EXPR [ (1, _32) 0 ], value: EXPR [ (1, _2844) 0 ]) ", + "INIT (id: 51, len: 5, witnesses: [_2840, _2841, _2842, _2843, _2844])", + "MEM (id: 51, read at: EXPR [ (1, _120) 0 ], value: EXPR [ (1, _2845) 0 ]) ", + "MEM (id: 46, read at: EXPR [ (1, _2845) 0 ], value: EXPR [ (1, _2846) 0 ]) ", + "EXPR [ (1, _2845) (-1, _2847) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2847) 0 ], value: EXPR [ (1, _2848) 0 ]) ", + "EXPR [ (1, _2847) (-1, _2849) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2849) 0 ], value: EXPR [ (1, _2850) 0 ]) ", + "EXPR [ (1, _2849) (-1, _2851) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2851) 0 ], value: EXPR [ (1, _2852) 0 ]) ", + "EXPR [ (1, _2851) (-1, _2853) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2853) 0 ], value: EXPR [ (1, _2854) 0 ]) ", + "EXPR [ (1, _2853) (-1, _2855) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2855) 0 ], value: EXPR [ (1, _2856) 0 ]) ", + "EXPR [ (1, _2855) (-1, _2857) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2857) 0 ], value: EXPR [ (1, _2858) 0 ]) ", + "EXPR [ (1, _2857) (-1, _2859) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2859) 0 ], value: EXPR [ (1, _2860) 0 ]) ", + "EXPR [ (1, _2859) (-1, _2861) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2861) 0 ], value: EXPR [ (1, _2862) 0 ]) ", + "EXPR [ (1, _2861) (-1, _2863) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2863) 0 ], value: EXPR [ (1, _2864) 0 ]) ", + "EXPR [ (1, _2863) (-1, _2865) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2865) 0 ], value: EXPR [ (1, _2866) 0 ]) ", + "EXPR [ (1, _2865) (-1, _2867) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2867) 0 ], value: EXPR [ (1, _2868) 0 ]) ", + "EXPR [ (1, _2867) (-1, _2869) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2869) 0 ], value: EXPR [ (1, _2870) 0 ]) ", + "EXPR [ (1, _2869) (-1, _2871) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2871) 0 ], value: EXPR [ (1, _2872) 0 ]) ", + "EXPR [ (1, _2871) (-1, _2873) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2873) 0 ], value: EXPR [ (1, _2874) 0 ]) ", + "EXPR [ (1, _2873) (-1, _2875) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2875) 0 ], value: EXPR [ (1, _2876) 0 ]) ", + "EXPR [ (1, _2875) (-1, _2877) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2877) 0 ], value: EXPR [ (1, _2878) 0 ]) ", + "EXPR [ (1, _2877) (-1, _2879) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2879) 0 ], value: EXPR [ (1, _2880) 0 ]) ", + "EXPR [ (1, _2879) (-1, _2881) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2881) 0 ], value: EXPR [ (1, _2882) 0 ]) ", + "EXPR [ (1, _2881) (-1, _2883) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2883) 0 ], value: EXPR [ (1, _2884) 0 ]) ", + "EXPR [ (1, _2883) (-1, _2885) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2885) 0 ], value: EXPR [ (1, _2886) 0 ]) ", + "EXPR [ (1, _2885) (-1, _2887) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2887) 0 ], value: EXPR [ (1, _2888) 0 ]) ", + "EXPR [ (1, _2887) (-1, _2889) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2889) 0 ], value: EXPR [ (1, _2890) 0 ]) ", + "EXPR [ (1, _2889) (-1, _2891) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2891) 0 ], value: EXPR [ (1, _2892) 0 ]) ", + "EXPR [ (1, _2891) (-1, _2893) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2893) 0 ], value: EXPR [ (1, _2894) 0 ]) ", + "EXPR [ (1, _2893) (-1, _2895) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2895) 0 ], value: EXPR [ (1, _2896) 0 ]) ", + "EXPR [ (1, _2895) (-1, _2897) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2897) 0 ], value: EXPR [ (1, _2898) 0 ]) ", + "EXPR [ (1, _2897) (-1, _2899) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2899) 0 ], value: EXPR [ (1, _2900) 0 ]) ", + "EXPR [ (1, _2848) -20 ]", + "EXPR [ (1, _2850) -19 ]", + "EXPR [ (1, _2852) -5000 ]", "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) } }]", "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": "td3LjlzXkYXhd+FYg4yIHZftV2kYhiTTBgFCEmjJQEPQu3eey/pLHrDRnQVOeJYsn7Uyi/nVriKT4u8f/v7xh9/++bdPP/3j5399+Mt//f7hhy+fPn/+9M+/ff75x+9//fTzT8//9fc/vvugf/zbr18+fnz+Tx/+9O+fd/3y/ZePP/364S8//fb583cf/v3959/O/9O/fvn+p/P66/dfnv/28d2Hjz/9/Xl9Fv7j0+ePR/rju7e7H1+/1W3fN7svbs//x/3N/fm++8NfuX+V7s/1vvv78bX783+5//H2AXx4vTX8nx/A8AC2vfIEZnG/v/P+/cL9YXHfH27vuz/6a/ebfcOfgUgeQc4rzyCN+/f77q965f6R/5h51/3r8VVCB9Nv9jOwbPQI/JXX8J/uj8cr9y8ZWGved//Xfwbdv+VH8O3ncF75NPh2f1p89Rl8y8+DmfoYZr3yc5hvz2BeeQ1lS2H2KwdZmR5/Wb9y/yN1/+OVzyIVOkfqpddwpX7+ql56/i2DNfHK/Vv39+Px0j7P/yUB7bq/45VzrBePP1+63xf7r7x+m9dv71dOkTHdP7bfd//XX3/rW34OnHI9gn7lFfSn+7/+ldD6lp8DN18L7Ze+lvrT/fnVj8DxOv12z6D0Kt71ymehP92/v/pZNL/lV4P2SL0MnvGVz2RmfDnyjK9Ysrfvisxf+orInOPk2RDvbYh8b8PXPyfmt3w9mtfbY9ivPYu3hrCvPov6pq/J8LfHkC89iz839FfPh0PfN3wWW1+i2bJ66Vn8qSG+esrXt/xexdbaPIaXvlL8j4aXvlayxRdLlvHSRzL5dQ/LfOkzzPPLZBrmlfPW6sFjqEe/9Bgq3h6Dvbdhv/RzUYuG177ytnr7SFa/9HGosLfHsN/bUC99JGtzZnW89Cx683GYx0uPYfgi+hlf+jjMensM+dKrevLtMbz060k2xlcgE4/3Nix/b0O+9nOxcTH7pY/D5lvqZ3zpZ3M7j2H7S6/JGXt7FvudDdvsvQ3+0uthv3223y99nvRHDcdm/+fnyb8+/+n7Hz99+Y/f2vhgz63vPvjz///dhzh/XOePef5Y5499/jjnj/v80R7Xxa7Ldbtd99tVYFeDXRV2ddhVYs+W58+4P1ueLx236+LXJa7Lui55Xeq69PmL/D7XZZ+XeLY8P6XFs+X53MOvS1yXZ8vzEI88vkt4Xuu+9n2d+7qv63rcV7uvfv2a9or7uu7r0fd8Aqvu69H3fHxr7uu+rnn0PR9iHn3Pn9r0+xr3dd3XvK91X/u+zvUrurmvaz3uq93Xo+/5/Cru67qvx8f++fjr+OA/H2/1fZ37uq9rP+6r3Ve/r3H9Omiv+5r39eh7Pq/u+zr3dV/XedxXu69+X+P6VclZ9zXv69H3fB7T93Xu69H3/Onbj/t69D2f1/b7Gvd13de8r3Vf+77Ofd3X1R4PBVNwhVBYCqlQCq0wCmo2NZuaTc2mZlOzqdnUbGo2NZuaXc2uZlezq9nV7Gp2NbuaXc2u5lBzqDnUHGoONYeaQ82h5lBzqHmpeal5qXmpeal5qXmpeal5qXmpOdWcak41p5pTzanmVHOqOdWcai41l5pLzaXmUnOpudRcai41l5pbza3mVnOrudXcam41t5pbza3mUfOoedQ8ah41j5pHzaPmUfOoeatZ9kz4TPpM/Ez+TABNAk0ETQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0G/TAYjyOEwjp+N/oIqVAKrTAK+w6HwSuYgiuEgppbza3mVnOrudU8ah41j5pHzaPmUfOoedQ8ah41bzVvNW81bzVvNW81bzVvNW8177s5Hg8FU3CFUFgKqVAKrTAKajY1m5pNzaZmU7Op2dRsajY1m5pdza5mV7Or2dXsanY1u5pdza7mUHOoOdQcag41h5pDzaHmUHOoeal5qXmpeal5qXmpeal5qXmpeak51ZxqTjWnmlPNqeZUc6o51ZxqLjWXmkvNpWYZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGVwyuGRwyeCSwSWDSwaXDC4ZXDK4ZHDJ4JLBJYNLBpcMLhlcMrhkcMngksElg0sGlwwuGVwyuGRwyeCSwSWDSwaXDC4ZXDK4ZHDJ4JLBJYNLBpcMLhlcMrhkcMngksElg0sGlwwuGVwyuGRwyeCSwSWDSwbXafD4rvo0eHxveBo8w9GcRxiFo7mO7ysfCqbgCqGwFFKhFFphFNTcam41t5pbza3mVnOrudXcam41j5pHzaPmUfOoedQ8ah41j5pHzVvNW81bzVvNW81bzVvNW81bzftuzsdDwRRcIRSWQiqUQiuMgppNzaZmU7Op2dRsajY1m5pNzaZmV7Or2dXsanY1u5pdza5mV7OrOdQcag41h5pDzaHmUHOoOdQcal5qXmpeal5qXmpeal5qXmpeal5qTjWnmlPNqeZUc6o51ZxqTjXLYMpgymDKYMpgymDKYMpgymDKYMpgymDKYMpgymDKYMpgymDKYMpgymDKYMpgymDKYMpgymDKYMpgymDKYMpgymDKYMpgymDKYMpgymDKYMpgyWDJYMlgyWDJYMlgyWDJYMlgyWDJYMlgyWDJYMlgyWDJYMlgyWDJYMlgyWDJYJ0Gz1+bWwpH8xyhFI7mfYRR2Hc4DZ7BFFwhFJZCKpSCmkPNoeal5qXmpeal5qXmpeal5qXmpeal5lRzqjnVnGpONaeaU82p5lRzqrnUXGouNZeaS82l5lJzqbnUXGpuNbeaW82t5lZzq7nV3GpuNbeaR82j5lHzqHnUPGoeNY+aR82j5q3mreat5q3mreat5q3mreat5n039+OhYAquEApLIRVKoRVGQc2mZlOzqdnUbGo2NZuaTc2mZlOzq9nV7Gp2NbuaXc2uZhlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBnsw+B6HMEVQuH4vSs7QiqUQiuMwr7CHAavYAquEApLIRVKoRVGQc2mZlOzqdnUbGo2NZuaTc2mZlOzq9nV7Gp2NbuaXc2uZlezq9nVHGo+DB7vR53D4BVC4Wg+f3spFUqhFUZh3+EweAW73ic6h8ErhMLRfPxG1GHwCqXQCqOw73AYvIJd79+cw+AVQmEdvxt7hFQohVYYhX2Hw+Dxdso5DF7BFeJ4U/4RjuY6QiqUQiuMwr7DYfAKpuAKoaDmVnOrudXcam41j5pHzaPmUfOoedQ8ah41j5pHzVvNW81bzVvNW81bzVvNW81bzftu3o+Hgim4QigshVQohVYYBTWbmk3NpmZTs6nZ1GxqNjWbmk3NrmZXs6vZ1exqdjUfBrOP0AqjsO9wGLyCKbhCKKzrraH7MHiFUujjD0kcYRT2HQ6DVzAFV4jrXZr7MHiFVKjjz08coRVGYd/hMHgFU/DrDZP7MHiFpXA0Hx+Nw+AVWmEU9h0Og1ew672L+zB4hVA4mvcRUqGOPylxhGfz8d7/fRi8wr7DYbCPh3oYvIIff1LhCKGwjj+xcIRUKIVWGIV9h8PgFUzBFUJBzaPmUfOoedQ8at5q3mreat5q3mreat5q3mreat538/P36B8kIzkpSIuUpCI1aUhsGBvGhrFhbBgbxoaxYWwYG8aGs+FsOBvOhrPhbDgbzoaz4WwEG8HGgfT4UzbPFKRFSlKRmjSkrXRgvZOR2FhsLDYWG4uNxcZiY7GRbCQbyUaykWwkG8lGspFsJBvFRrFRbBQbxUaxUWwUG8VGsdFsNBvNRrPRbDQbzUaz0Ww0G8PGsDFsDBvDxrAxbAwbw+tqeF1tXleb19Xmtbt57W5eu5vX7ua1u3ntbjZwbjg3nBvODeeGc8O54dxwbjg3nBvODeeGc8O54dxwbjg3nBvODeeGc8O54dxwbjg3nBvODeeGc8O54dxwfr5Z505sBBvBRrARbAQbwcZiY7Gx2FhsLDYWG4uNxcZiY7GRbCQbyUaykWwkG8lGspFsJBvFRrFRbBQbxUaxUWwUG8VGsdFsNBvNRrPRbDQbzUaz0Ww0G8PGsDFsDBvDxrAxbAwbODecG84N54Zzw7nh3HBuODecG84N545zx7nj3HHuOHecO84d545zx7nj3HHuOHecO84d545zx7nj3HHuOHecO84d545zx7nj3HHuOHecO84d545zx7nj3HHuOHecO84d545zx7nj3HHuOHecO84d545zx7nj3HHuOHecO84d545zx7nj3HHuOHecO84d545zx7nj3HHuOHecO84d545zx7nj3HHuOHecO84d545zx7nj3HHuOHecO84d545zx7nj3HHuOHecO84d545zx7nj3HEeOA+cB84D54HzwHngPHAeOA+cB84D54HzwHngPHAeOA+cB84D54HzwHngPHAeOA+cB84D54HzwHngPHAeOA+cB84D54HzwHngPHAeOA+cB84D54HzwHngPHAeOA+cB84D54HzwHngPHAeOA+cB84D54HzwHngPHAeOA+cB84D54HzwHngPHAeOA+cB84D54HzwHngPHAeOA+cB84D54HzwHngPHAeOA+cB84D54HzwHngPHAeOA+cB87P9y3189c47Hzj0p2OjTmTk46NfaZFSlKRmjSkrXQ6v5KRnMSGsWFsGBvGhrFhbDgbzoaz4Ww4G86Gs+FsOBvORrARbAQbwUawEWwEG8FGsBFsLDYWG4uNxcZiY7Gx2FhsLDYWG8lGspFsJBvJRrKRbCQbyUayUWwczo//Toydb3u6U5AWKUlFatKQttLh/E5sNBvNRrPRbDQbzUaz0WwMG8PGsDFsDBvDxrAxbAwbw8ZmY7Ox2dhsbDY2G5uNzcZmY2vjfHPUnYzkpCAtUpKK1KQhsWFsGBvGhrFhbBgbxgbOE+eJ88R54jxxnjhPnCfOE+eJ88R54jxxnjhPnCfOE+eJ88R54jxxnjhPnCfOE+eJ88R54jxxnjhPnCfOE+eJ88R54jxxnjhPnCfOE+eJ88T5+c6qO7FRbBQbxUaxUWwUG8VGs9FsNBvNRrPRbDQbzUaz0WwMG8PGsDFsDBvDxrAxbAwbw8ZmY7Ox2dhsbDY2G5uNzcZmY2vjfAPWnYzkpCAtUpKK1KQhscF5XpznxXlenOfFeV6c58V5XjgvnBfOC+eF88J54bxwXjgvnBfOC+eF88J54bxwXjgvnBfOC+eF88J54bxwXjgvnBfOC+eF88J54bxwXjgvnBfOC+eF88J54bxwXjgvnBfOC+eF88J54bxwXjgvnBfOC+eF88J54bxwXjgvnBfOC+eF88J54bxwXjgvnBfOC+eF88J54bxwXjgvnBfOC+eF88J54bxwXjgvnBfOG+eN88Z547xx3jhvnDfOG+eN88Z547xx3jhvnDfOG+eN88Z547xx3jhvnDfOG+eN88Z547xx3jhvnDfOG+eN88Z547xx3jhvnDfOG+eN88Z547xx3jhvnDfOG+eN88Z547xx3jhvnDfOG+eN88Z547xx3jhvnDfOG+eN88Z547xx3jhvnDfOG+eN88Z547xx3jhvnDfOG+eN88Z547xx3jhvnDfOG+eN88Z547xx3jhvnDfOG+eN88Z543xwPjgfnA/OB+eD88H54HxwPjgfnA/OB+eD88H54HxwPjgfnA/OB+eD88H54HxwPjgfnA/OB+eD88H54HxwPjgfnA/OB+eD88H54HxwPjgfnA/OB+eD88H54HxwPjgfnA/OB+eD88H54HxwPjgfnA/OB+eD88H54HxwPjgfnA/OB+eD88H54HxwPjgfnA/OB+eD88H54HxwPjgfnA/OB+eD88H54HxwPjgfnA/OB+eD88H54HxwPjgfnA/ON87Pd6sd//EZO9+udqcgHd87n//VlfP78ysV6fj+PM40pOP783Wk8/vzKx0beSYnHRt1pkVKUpGaNKStdDi/k5GcxIaz4Ww4G86Gs+FsBBvBRrARbAQbwUawEWwEG8HGYmOxsdhYbCw2FhuLjcXGYmOxkWwkG8lGspFsJBvJRrKRbCQbxUaxUWwUG8VGsVFsFBvFRrHRbDQbzUaz0Ww0G81Gs9FsNBvDxrAxbAwbw8awMWwMG8PGsLHZ2GxsNjYbm43NxmZjs7HZ2PeGn++Hu5ORnBSkRUpSkZo0JDaMDWPD2DA2jA1jw9gwNowNY8PZcDacDWfD2XA2nA1nw9lwNoKNYON03mcK0iIlqUhNGtJWOp1fyUhsLDYWG4uNxcZiY7Gx2Eg2ko1kI9lINk7nc6YiNWlIW6nYKDaKjWKj2CieR/E8iudRPI/ieTQbzUaz0Ww0G81Gs9FsNBvNxrAxbAwbw8awMWwMG8PGsDFsbDY2G5uNzcZmY7Ox2dhsbDa2Ns73w93JSE4K0iIlqUhNGpJ8GM4N54Zzw7nh3HBuODecG84N54Zzw7nh3HBuODecG84N54Zzw7nh3HBuwUawEWwEG8FGsBFsBBuLjcXGYmOxsdhYbCw2FhuLjcVGspFsJBvJRrKRbCQbyUaykWwUG8VGsVFsFBvFRrFRbBQbxUaz0Ww0G81Gs9FsNBvNRrPRbAwbw8awMWwMG8PGsDFsDBvDxmZjs7HZ2GxsNjYbm43NxmaD89w5z53z3DnPnfPcOc+d89w5z53z3DnPHeeOc8e549xx7jh3nDvOHeeOc8e549xx7jh3nDvOHeeOc8e549xx7jh3nDvOHeeOc8e549xx7jh3nDvOHeeOc8e549xx7jh3nDvOHeeOc8e549xx7jh3nDvOHeeOc8e549xx7jh3nDvOHeeOc8e549xx7jh3nDvOHeeOc8e549xx7jh3nDvOHeeOc8e549xx7jh3nDvOHeeOc8e549xx7jh3nDvOHeeOc8d54DxwHjgPnAfOA+eB88B54DxwHjgPnAfOA+eB88B54DxwHjgPnAfOA+eB88B54DxwHjgPnAfOA+eB88B54DxwHjgPnAfOA+eB88B54DxwHjgPnAfOA+eB88B54DxwHjgPnAfOA+eB88B54DxwHjgPnAfOA+eB88B54DxwHjgPnAfOA+eB88B54DxwHjgPnAfOA+eB88B54DxwHjgPnAfOA+eB88B54DxwHjgPnAfOA+eB88B54DxwHjgPnC+cL5wvnC+cL5wvnC+cL5wvnC+cn++Hm30mIz03jr9owc/3w91pHX+9zJmSVMdfVHOmJg1pKx3O72QkJwVpkZLEhrPhbDgbwUawEWwEG8FGsBFsBBvBRrCx2FhsLDYWG4uNxcZiY7Gx2FhsJBvJRrKRbCQbyUaykWwkG8lGsVFsFBvFRrFRbBQbxUaxUWw0G81Gs9FsNBvNRrPRbDQbzcawMWwMG8PGsDFsDBvDxrAxbGw2Nhubjc3GZmOzsdnYbGw2tjbO98PdyUhOCtIiJalITRoSG8aGsWFsGBvGhrGB88R54jxxnjhPnCfOE+eJ88R54jxxnjhPnCfOE+eJ88R54jxxnjhPnJ/vhzv+ogI/3w93pdP5lYzkpCAtUpKK1CQ2FhvJRrKRbCQbyUaykWwkG8lGslFsnM7P/+r96fxKQVqkJLFRbBQbxUaz0TyP5nk0z6N5Hs3zaDaajWaj2Rg2ho1hY9gYNoaNYWPYGDaGjc3GZmOzsdnYbGw2Nhubjc3G1sb5frg7GclJQVqkJBWpSUNiw9gwNowNY8PYwHnhvHBeOC+cF84L54XzwnnhvHBeOC+cF84L54XzwnnhvHBeOC+cF84L58V5XpznxXlenOfFeV6c58V5XpznxXlenOfFeV6c58V5XpznxXlenOfFeV6c58V5XpznxXlenOfFeV6c58V5XpznxXlenOfFeV6c58V5XpznxXlenOfFeV6c58V5XpznxXlenOfFeV6c58V5XpznxXlenOfFeV6c58V5XpznxXlenOfFeV6c58V5XpznxXlenOfFeV6c58V5XpznzXnenOfNed6c58153pznzXnenOfNed6c58153pznzXnenOfNed44b5w3zhvnjfPGeeO8cd44b5w3zhvnjfPGeeO8cd44b5w3zhvnjfPGeeO8cd44b5w3zhvnjfPGeeO8cd44b5w3zhvnjfPGeeO8cd44b5w3zhvnjfPGeeO8cd44b5w3zhvnjfPGeeO8cd44b5w3zhvnjfPGeeO8cd44b5w3zhvnjfPGeeO8cd44b5w3zhvnjfPGeeO8cd44b5w3zhvnjfPB+eB8cD44H5wPzgfng/PB+eB8cD44H5wPzgfng/PB+eB8cD44H5wPzgfng/PB+eB8cD44H5wPzgfng/PB+eB8cD44H5wPzgfng/PB+eB8cD44H5wPzgfn5/vhjr+Izs/3w51/l/K/v//y6fsfPn/814e//H781Ve//fSj/p6r5z/++t+/6N/88OXT58+f/vm3X778/OPHv//25ePxd2Kd/+6Pv/7xPw==", + "debug_symbols": "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", "file_map": { "50": { "source": "struct Bar {\n inner: [Field; 3],\n}\n\nstruct Foo {\n a: Field,\n b: [Field; 3],\n bar: Bar,\n}\n\nstruct FooParent {\n array: [Field; 3],\n foos: [Foo; 4],\n}\n\nfn main(mut x: [Foo; 4], y: pub u32) {\n assert(x[y - 3].a == 1);\n assert(x[y - 3].b == [2, 3, 20]);\n assert(x[y - 2].a == 4);\n assert(x[y - 2].b == [5, 6, 21]);\n assert(x[y - 1].a == 7);\n assert(x[y - 1].b == [8, 9, 22]);\n assert(x[y].a == 10);\n assert(x[y].b == [11, 12, 23]);\n assert(x[y].bar.inner == [109, 110, 111]);\n // Check dynamic array set\n if y != 2 {\n x[y].a = 50;\n } else {\n x[y].a = 100;\n }\n assert(x[3].a == 50);\n\n if y == 2 {\n x[y - 1].b = [50, 51, 52];\n } else {\n x[y - 1].b = [100, 101, 102];\n }\n assert(x[2].b == [100, 101, 102]);\n\n assert(x[y - 3].bar.inner == [100, 101, 102]);\n assert(x[y - 2].bar.inner == [103, 104, 105]);\n assert(x[y - 1].bar.inner == [106, 107, 108]);\n assert(x[y].bar.inner == [109, 110, 111]);\n\n let foo_parent_one = FooParent { array: [0, 1, 2], foos: x };\n let foo_parent_two = FooParent { array: [3, 4, 5], foos: x };\n let mut foo_parents = [foo_parent_one, foo_parent_two];\n\n assert(foo_parents[y - 3].foos[y - 3].b == [2, 3, 20]);\n assert(foo_parents[y - 3].foos[y - 2].b == [5, 6, 21]);\n assert(foo_parents[y - 3].foos[y - 1].b == [100, 101, 102]);\n assert(foo_parents[y - 3].foos[y].b == [11, 12, 23]);\n\n assert(foo_parents[y - 3].foos[y].a == 50);\n\n assert(foo_parents[1].foos[1].b == [5, 6, 21]);\n if y == 2 {\n foo_parents[y - 2].foos[y - 2].b = [10, 9, 8];\n } else {\n foo_parents[y - 2].foos[y - 2].b = [20, 19, 18];\n }\n assert(foo_parents[1].foos[1].b == [20, 19, 18]);\n\n assert(foo_parents[1].foos[1].b[2] == 18);\n if y == 3 {\n foo_parents[y - 2].foos[y - 2].b[y - 1] = 5000;\n } else {\n foo_parents[y - 2].foos[y - 2].b[y - 1] = 1000;\n }\n assert(foo_parents[1].foos[1].b[2] == 5000);\n // Set a dynamic array value\n foo_parents[y - 2].foos[y - 3].b = foo_parents[y - 2].foos[y - 2].b;\n assert(foo_parents[1].foos[0].b == [20, 19, 5000]);\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_false_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_false_inliner_9223372036854775807.snap index 19a8103bb78..50b77b14496 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_false_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_false_inliner_9223372036854775807.snap @@ -80,7 +80,7 @@ expression: artifact }, "bytecode": [ "func 0", - "current witness index : _2988", + "current witness index : _3326", "private parameters indices : [_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27]", "public parameters indices : [_28]", "return value indices : []", @@ -1840,56 +1840,56 @@ expression: artifact "MEM (id: 19, read at: EXPR [ (1, _1590) 0 ], value: EXPR [ (1, _1591) 0 ]) ", "EXPR [ (1, _1590) (-1, _1592) 1 ]", "MEM (id: 19, read at: EXPR [ (1, _1592) 0 ], value: EXPR [ (1, _1593) 0 ]) ", - "EXPR [ (1, _190, _748) (-1, _2946) 0 ]", - "EXPR [ (1, _93, _1158) (-1, _1594) (1, _2946) 0 ]", - "EXPR [ (1, _190, _749) (-1, _2948) 0 ]", - "EXPR [ (1, _93, _1160) (-1, _1595) (1, _2948) 0 ]", - "EXPR [ (1, _190, _750) (-1, _2950) 0 ]", - "EXPR [ (1, _93, _1162) (-1, _1596) (1, _2950) 0 ]", - "EXPR [ (1, _190, _751) (-1, _2952) 0 ]", - "EXPR [ (1, _93, _1164) (-1, _1597) (1, _2952) 0 ]", - "EXPR [ (1, _190, _752) (-1, _2954) 0 ]", - "EXPR [ (1, _93, _1166) (-1, _1598) (1, _2954) 0 ]", - "EXPR [ (1, _190, _753) (-1, _2956) 0 ]", - "EXPR [ (1, _93, _1168) (-1, _1599) (1, _2956) 0 ]", - "EXPR [ (1, _190, _754) (-1, _2958) 0 ]", - "EXPR [ (1, _93, _1170) (-1, _1600) (1, _2958) 0 ]", - "EXPR [ (1, _190, _755) (-1, _2960) 0 ]", - "EXPR [ (1, _93, _1172) (-1, _1601) (1, _2960) 0 ]", + "EXPR [ (1, _190, _748) (-1, _3284) 0 ]", + "EXPR [ (1, _93, _1158) (-1, _1594) (1, _3284) 0 ]", + "EXPR [ (1, _190, _749) (-1, _3286) 0 ]", + "EXPR [ (1, _93, _1160) (-1, _1595) (1, _3286) 0 ]", + "EXPR [ (1, _190, _750) (-1, _3288) 0 ]", + "EXPR [ (1, _93, _1162) (-1, _1596) (1, _3288) 0 ]", + "EXPR [ (1, _190, _751) (-1, _3290) 0 ]", + "EXPR [ (1, _93, _1164) (-1, _1597) (1, _3290) 0 ]", + "EXPR [ (1, _190, _752) (-1, _3292) 0 ]", + "EXPR [ (1, _93, _1166) (-1, _1598) (1, _3292) 0 ]", + "EXPR [ (1, _190, _753) (-1, _3294) 0 ]", + "EXPR [ (1, _93, _1168) (-1, _1599) (1, _3294) 0 ]", + "EXPR [ (1, _190, _754) (-1, _3296) 0 ]", + "EXPR [ (1, _93, _1170) (-1, _1600) (1, _3296) 0 ]", + "EXPR [ (1, _190, _755) (-1, _3298) 0 ]", + "EXPR [ (1, _93, _1172) (-1, _1601) (1, _3298) 0 ]", "EXPR [ (1, _93, _1174) (5, _190) (-1, _1602) 0 ]", "EXPR [ (1, _93, _1176) (6, _190) (-1, _1603) 0 ]", "EXPR [ (1, _93, _1178) (21, _190) (-1, _1604) 0 ]", - "EXPR [ (1, _190, _759) (-1, _2962) 0 ]", - "EXPR [ (1, _93, _1180) (-1, _1605) (1, _2962) 0 ]", - "EXPR [ (1, _190, _760) (-1, _2964) 0 ]", - "EXPR [ (1, _93, _1182) (-1, _1606) (1, _2964) 0 ]", - "EXPR [ (1, _190, _761) (-1, _2966) 0 ]", - "EXPR [ (1, _93, _1184) (-1, _1607) (1, _2966) 0 ]", - "EXPR [ (1, _190, _762) (-1, _2968) 0 ]", - "EXPR [ (1, _93, _1186) (-1, _1608) (1, _2968) 0 ]", + "EXPR [ (1, _190, _759) (-1, _3300) 0 ]", + "EXPR [ (1, _93, _1180) (-1, _1605) (1, _3300) 0 ]", + "EXPR [ (1, _190, _760) (-1, _3302) 0 ]", + "EXPR [ (1, _93, _1182) (-1, _1606) (1, _3302) 0 ]", + "EXPR [ (1, _190, _761) (-1, _3304) 0 ]", + "EXPR [ (1, _93, _1184) (-1, _1607) (1, _3304) 0 ]", + "EXPR [ (1, _190, _762) (-1, _3306) 0 ]", + "EXPR [ (1, _93, _1186) (-1, _1608) (1, _3306) 0 ]", "EXPR [ (1, _93, _1188) (100, _190) (-1, _1609) 0 ]", "EXPR [ (1, _93, _1190) (101, _190) (-1, _1610) 0 ]", "EXPR [ (1, _93, _1192) (102, _190) (-1, _1611) 0 ]", - "EXPR [ (1, _190, _766) (-1, _2970) 0 ]", - "EXPR [ (1, _93, _1194) (-1, _1612) (1, _2970) 0 ]", - "EXPR [ (1, _190, _767) (-1, _2972) 0 ]", - "EXPR [ (1, _93, _1196) (-1, _1613) (1, _2972) 0 ]", - "EXPR [ (1, _190, _768) (-1, _2974) 0 ]", - "EXPR [ (1, _93, _1198) (-1, _1614) (1, _2974) 0 ]", - "EXPR [ (1, _190, _769) (-1, _2976) 0 ]", - "EXPR [ (1, _93, _1200) (-1, _1615) (1, _2976) 0 ]", - "EXPR [ (1, _190, _770) (-1, _2978) 0 ]", - "EXPR [ (1, _93, _1202) (-1, _1616) (1, _2978) 0 ]", - "EXPR [ (1, _190, _771) (-1, _2980) 0 ]", - "EXPR [ (1, _93, _1204) (-1, _1617) (1, _2980) 0 ]", - "EXPR [ (1, _190, _772) (-1, _2982) 0 ]", - "EXPR [ (1, _93, _1206) (-1, _1618) (1, _2982) 0 ]", - "EXPR [ (1, _190, _773) (-1, _2984) 0 ]", - "EXPR [ (1, _93, _1208) (-1, _1619) (1, _2984) 0 ]", - "EXPR [ (1, _190, _774) (-1, _2986) 0 ]", - "EXPR [ (1, _93, _1210) (-1, _1620) (1, _2986) 0 ]", - "EXPR [ (1, _190, _775) (-1, _2988) 0 ]", - "EXPR [ (1, _93, _1212) (-1, _1621) (1, _2988) 0 ]", + "EXPR [ (1, _190, _766) (-1, _3308) 0 ]", + "EXPR [ (1, _93, _1194) (-1, _1612) (1, _3308) 0 ]", + "EXPR [ (1, _190, _767) (-1, _3310) 0 ]", + "EXPR [ (1, _93, _1196) (-1, _1613) (1, _3310) 0 ]", + "EXPR [ (1, _190, _768) (-1, _3312) 0 ]", + "EXPR [ (1, _93, _1198) (-1, _1614) (1, _3312) 0 ]", + "EXPR [ (1, _190, _769) (-1, _3314) 0 ]", + "EXPR [ (1, _93, _1200) (-1, _1615) (1, _3314) 0 ]", + "EXPR [ (1, _190, _770) (-1, _3316) 0 ]", + "EXPR [ (1, _93, _1202) (-1, _1616) (1, _3316) 0 ]", + "EXPR [ (1, _190, _771) (-1, _3318) 0 ]", + "EXPR [ (1, _93, _1204) (-1, _1617) (1, _3318) 0 ]", + "EXPR [ (1, _190, _772) (-1, _3320) 0 ]", + "EXPR [ (1, _93, _1206) (-1, _1618) (1, _3320) 0 ]", + "EXPR [ (1, _190, _773) (-1, _3322) 0 ]", + "EXPR [ (1, _93, _1208) (-1, _1619) (1, _3322) 0 ]", + "EXPR [ (1, _190, _774) (-1, _3324) 0 ]", + "EXPR [ (1, _93, _1210) (-1, _1620) (1, _3324) 0 ]", + "EXPR [ (1, _190, _775) (-1, _3326) 0 ]", + "EXPR [ (1, _93, _1212) (-1, _1621) (1, _3326) 0 ]", "EXPR [ (2, _190) (-1, _1622) 0 ]", "MEM (id: 31, read at: EXPR [ (1, _1622) 0 ], value: EXPR [ (1, _1623) 0 ]) ", "MEM (id: 19, read at: EXPR [ (1, _1623) 0 ], value: EXPR [ (1, _1624) 0 ]) ", @@ -1957,34 +1957,34 @@ expression: artifact "MEM (id: 19, read at: EXPR [ (1, _1685) 0 ], value: EXPR [ (1, _1686) 0 ]) ", "EXPR [ (1, _1685) (-1, _1687) 1 ]", "MEM (id: 19, read at: EXPR [ (1, _1687) 0 ], value: EXPR [ (1, _1688) 0 ]) ", - "EXPR [ (1, _93, _1222) (-1, _1689) (1, _2946) 0 ]", - "EXPR [ (1, _93, _1224) (-1, _1690) (1, _2948) 0 ]", - "EXPR [ (1, _93, _1226) (-1, _1691) (1, _2950) 0 ]", - "EXPR [ (1, _93, _1228) (-1, _1692) (1, _2952) 0 ]", - "EXPR [ (1, _93, _1230) (-1, _1693) (1, _2954) 0 ]", - "EXPR [ (1, _93, _1232) (-1, _1694) (1, _2956) 0 ]", - "EXPR [ (1, _93, _1234) (-1, _1695) (1, _2958) 0 ]", - "EXPR [ (1, _93, _1236) (-1, _1696) (1, _2960) 0 ]", + "EXPR [ (1, _93, _1222) (-1, _1689) (1, _3284) 0 ]", + "EXPR [ (1, _93, _1224) (-1, _1690) (1, _3286) 0 ]", + "EXPR [ (1, _93, _1226) (-1, _1691) (1, _3288) 0 ]", + "EXPR [ (1, _93, _1228) (-1, _1692) (1, _3290) 0 ]", + "EXPR [ (1, _93, _1230) (-1, _1693) (1, _3292) 0 ]", + "EXPR [ (1, _93, _1232) (-1, _1694) (1, _3294) 0 ]", + "EXPR [ (1, _93, _1234) (-1, _1695) (1, _3296) 0 ]", + "EXPR [ (1, _93, _1236) (-1, _1696) (1, _3298) 0 ]", "EXPR [ (1, _93, _1238) (5, _190) (-1, _1697) 0 ]", "EXPR [ (1, _93, _1240) (6, _190) (-1, _1698) 0 ]", "EXPR [ (1, _93, _1242) (21, _190) (-1, _1699) 0 ]", - "EXPR [ (1, _93, _1244) (-1, _1700) (1, _2962) 0 ]", - "EXPR [ (1, _93, _1246) (-1, _1701) (1, _2964) 0 ]", - "EXPR [ (1, _93, _1248) (-1, _1702) (1, _2966) 0 ]", - "EXPR [ (1, _93, _1250) (-1, _1703) (1, _2968) 0 ]", + "EXPR [ (1, _93, _1244) (-1, _1700) (1, _3300) 0 ]", + "EXPR [ (1, _93, _1246) (-1, _1701) (1, _3302) 0 ]", + "EXPR [ (1, _93, _1248) (-1, _1702) (1, _3304) 0 ]", + "EXPR [ (1, _93, _1250) (-1, _1703) (1, _3306) 0 ]", "EXPR [ (1, _93, _1252) (100, _190) (-1, _1704) 0 ]", "EXPR [ (1, _93, _1254) (101, _190) (-1, _1705) 0 ]", "EXPR [ (1, _93, _1256) (102, _190) (-1, _1706) 0 ]", - "EXPR [ (1, _93, _1258) (-1, _1707) (1, _2970) 0 ]", - "EXPR [ (1, _93, _1260) (-1, _1708) (1, _2972) 0 ]", - "EXPR [ (1, _93, _1262) (-1, _1709) (1, _2974) 0 ]", - "EXPR [ (1, _93, _1264) (-1, _1710) (1, _2976) 0 ]", - "EXPR [ (1, _93, _1266) (-1, _1711) (1, _2978) 0 ]", - "EXPR [ (1, _93, _1268) (-1, _1712) (1, _2980) 0 ]", - "EXPR [ (1, _93, _1270) (-1, _1713) (1, _2982) 0 ]", - "EXPR [ (1, _93, _1272) (-1, _1714) (1, _2984) 0 ]", - "EXPR [ (1, _93, _1274) (-1, _1715) (1, _2986) 0 ]", - "EXPR [ (1, _93, _1276) (-1, _1716) (1, _2988) 0 ]", + "EXPR [ (1, _93, _1258) (-1, _1707) (1, _3308) 0 ]", + "EXPR [ (1, _93, _1260) (-1, _1708) (1, _3310) 0 ]", + "EXPR [ (1, _93, _1262) (-1, _1709) (1, _3312) 0 ]", + "EXPR [ (1, _93, _1264) (-1, _1710) (1, _3314) 0 ]", + "EXPR [ (1, _93, _1266) (-1, _1711) (1, _3316) 0 ]", + "EXPR [ (1, _93, _1268) (-1, _1712) (1, _3318) 0 ]", + "EXPR [ (1, _93, _1270) (-1, _1713) (1, _3320) 0 ]", + "EXPR [ (1, _93, _1272) (-1, _1714) (1, _3322) 0 ]", + "EXPR [ (1, _93, _1274) (-1, _1715) (1, _3324) 0 ]", + "EXPR [ (1, _93, _1276) (-1, _1716) (1, _3326) 0 ]", "EXPR [ (1, _93, _1697) (1, _190, _1650) -20 ]", "EXPR [ (1, _93, _1698) (1, _190, _1652) -19 ]", "EXPR [ (1, _93, _1699) (1, _190, _1654) -18 ]", @@ -2874,14 +2874,14 @@ expression: artifact "MEM (id: 40, read at: EXPR [ (1, _120) 0 ], value: EXPR [ (1, _2504) 0 ]) ", "MEM (id: 40, read at: EXPR [ (1, _32) 0 ], value: EXPR [ (1, _2505) 0 ]) ", "INIT (id: 45, len: 5, witnesses: [_2501, _2502, _2503, _2504, _2505])", - "EXPR [ (-3, _1718) (-1, _2506) 3 ]", - "MEM (id: 45, read at: EXPR [ (1, _2506) 0 ], value: EXPR [ (1, _2507) 0 ]) ", - "MEM (id: 39, read at: EXPR [ (1, _2507) 0 ], value: EXPR [ (1, _2508) 0 ]) ", - "EXPR [ (1, _2507) (-1, _2509) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2509) 0 ], value: EXPR [ (1, _2510) 0 ]) ", - "EXPR [ (1, _2509) (-1, _2511) 1 ]", - "MEM (id: 39, read at: EXPR [ (1, _2511) 0 ], value: EXPR [ (1, _2512) 0 ]) ", - "EXPR [ (1, _2511) (-1, _2513) 1 ]", + "MEM (id: 45, read at: EXPR [ (1, _30) 0 ], value: EXPR [ (1, _2506) 0 ]) ", + "MEM (id: 39, read at: EXPR [ (1, _2506) 0 ], value: EXPR [ (1, _2507) 0 ]) ", + "EXPR [ (1, _2506) (-1, _2508) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2508) 0 ], value: EXPR [ (1, _2509) 0 ]) ", + "EXPR [ (1, _2508) (-1, _2510) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2510) 0 ], value: EXPR [ (1, _2511) 0 ]) ", + "EXPR [ (-1, _1718) (-1, _2512) 1 ]", + "MEM (id: 45, read at: EXPR [ (1, _2512) 0 ], value: EXPR [ (1, _2513) 0 ]) ", "MEM (id: 39, read at: EXPR [ (1, _2513) 0 ], value: EXPR [ (1, _2514) 0 ]) ", "EXPR [ (1, _2513) (-1, _2515) 1 ]", "MEM (id: 39, read at: EXPR [ (1, _2515) 0 ], value: EXPR [ (1, _2516) 0 ]) ", @@ -2931,14 +2931,395 @@ expression: artifact "MEM (id: 39, read at: EXPR [ (1, _2559) 0 ], value: EXPR [ (1, _2560) 0 ]) ", "EXPR [ (1, _2559) (-1, _2561) 1 ]", "MEM (id: 39, read at: EXPR [ (1, _2561) 0 ], value: EXPR [ (1, _2562) 0 ]) ", - "EXPR [ (1, _1718, _2221) (-1, _1718, _2528) (1, _2528) -5000 ]", + "EXPR [ (1, _2561) (-1, _2563) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2563) 0 ], value: EXPR [ (1, _2564) 0 ]) ", + "EXPR [ (1, _2563) (-1, _2565) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2565) 0 ], value: EXPR [ (1, _2566) 0 ]) ", + "EXPR [ (1, _2565) (-1, _2567) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2567) 0 ], value: EXPR [ (1, _2568) 0 ]) ", + "EXPR [ (2, _2512) (-1, _2569) 0 ]", + "MEM (id: 45, read at: EXPR [ (1, _2569) 0 ], value: EXPR [ (1, _2570) 0 ]) ", + "MEM (id: 39, read at: EXPR [ (1, _2570) 0 ], value: EXPR [ (1, _2571) 0 ]) ", + "EXPR [ (1, _2570) (-1, _2572) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2572) 0 ], value: EXPR [ (1, _2573) 0 ]) ", + "EXPR [ (1, _2572) (-1, _2574) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2574) 0 ], value: EXPR [ (1, _2575) 0 ]) ", + "EXPR [ (3, _2512) (-1, _2576) 0 ]", + "MEM (id: 45, read at: EXPR [ (1, _2576) 0 ], value: EXPR [ (1, _2577) 0 ]) ", + "MEM (id: 39, read at: EXPR [ (1, _2577) 0 ], value: EXPR [ (1, _2578) 0 ]) ", + "EXPR [ (1, _2577) (-1, _2579) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2579) 0 ], value: EXPR [ (1, _2580) 0 ]) ", + "EXPR [ (1, _2579) (-1, _2581) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2581) 0 ], value: EXPR [ (1, _2582) 0 ]) ", + "EXPR [ (1, _2581) (-1, _2583) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2583) 0 ], value: EXPR [ (1, _2584) 0 ]) ", + "EXPR [ (1, _2583) (-1, _2585) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2585) 0 ], value: EXPR [ (1, _2586) 0 ]) ", + "EXPR [ (1, _2585) (-1, _2587) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2587) 0 ], value: EXPR [ (1, _2588) 0 ]) ", + "EXPR [ (1, _2587) (-1, _2589) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2589) 0 ], value: EXPR [ (1, _2590) 0 ]) ", + "EXPR [ (1, _2589) (-1, _2591) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2591) 0 ], value: EXPR [ (1, _2592) 0 ]) ", + "EXPR [ (1, _2591) (-1, _2593) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2593) 0 ], value: EXPR [ (1, _2594) 0 ]) ", + "EXPR [ (1, _2593) (-1, _2595) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2595) 0 ], value: EXPR [ (1, _2596) 0 ]) ", + "EXPR [ (1, _2595) (-1, _2597) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2597) 0 ], value: EXPR [ (1, _2598) 0 ]) ", + "EXPR [ (1, _2597) (-1, _2599) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2599) 0 ], value: EXPR [ (1, _2600) 0 ]) ", + "EXPR [ (1, _2599) (-1, _2601) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2601) 0 ], value: EXPR [ (1, _2602) 0 ]) ", + "EXPR [ (1, _2601) (-1, _2603) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2603) 0 ], value: EXPR [ (1, _2604) 0 ]) ", + "EXPR [ (1, _2603) (-1, _2605) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2605) 0 ], value: EXPR [ (1, _2606) 0 ]) ", + "EXPR [ (1, _2605) (-1, _2607) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2607) 0 ], value: EXPR [ (1, _2608) 0 ]) ", + "EXPR [ (1, _2607) (-1, _2609) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2609) 0 ], value: EXPR [ (1, _2610) 0 ]) ", + "EXPR [ (1, _2609) (-1, _2611) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2611) 0 ], value: EXPR [ (1, _2612) 0 ]) ", + "EXPR [ (1, _2611) (-1, _2613) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2613) 0 ], value: EXPR [ (1, _2614) 0 ]) ", + "EXPR [ (1, _2613) (-1, _2615) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2615) 0 ], value: EXPR [ (1, _2616) 0 ]) ", + "EXPR [ (1, _2615) (-1, _2617) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2617) 0 ], value: EXPR [ (1, _2618) 0 ]) ", + "EXPR [ (1, _2617) (-1, _2619) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2619) 0 ], value: EXPR [ (1, _2620) 0 ]) ", + "EXPR [ (1, _2619) (-1, _2621) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2621) 0 ], value: EXPR [ (1, _2622) 0 ]) ", + "EXPR [ (1, _2621) (-1, _2623) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2623) 0 ], value: EXPR [ (1, _2624) 0 ]) ", + "EXPR [ (1, _2623) (-1, _2625) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2625) 0 ], value: EXPR [ (1, _2626) 0 ]) ", + "EXPR [ (1, _2625) (-1, _2627) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2627) 0 ], value: EXPR [ (1, _2628) 0 ]) ", + "EXPR [ (1, _2627) (-1, _2629) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2629) 0 ], value: EXPR [ (1, _2630) 0 ]) ", + "EXPR [ (1, _2629) (-1, _2631) 1 ]", + "MEM (id: 39, read at: EXPR [ (1, _2631) 0 ], value: EXPR [ (1, _2632) 0 ]) ", + "EXPR [ (1, _1718, _2221) (1, _2512, _2598) -5000 ]", "BLACKBOX::RANGE [(_53, 1)] []", + "EXPR [ (1, _1718, _2177) (-1, _1718, _2507) (1, _2507) (-1, _2633) 0 ]", + "EXPR [ (1, _1718, _2178) (-1, _1718, _2509) (1, _2509) (-1, _2634) 0 ]", + "EXPR [ (1, _1718, _2179) (-1, _1718, _2511) (1, _2511) (-1, _2635) 0 ]", + "EXPR [ (1, _1718, _2180) (1, _2512, _2514) (-1, _2636) 0 ]", + "EXPR [ (1, _1718, _2181) (1, _2512, _2516) (-1, _2637) 0 ]", + "EXPR [ (1, _1718, _2182) (1, _2512, _2518) (-1, _2638) 0 ]", + "EXPR [ (1, _1718, _2183) (1, _2512, _2520) (-1, _2639) 0 ]", + "EXPR [ (1, _1718, _2184) (1, _2512, _2522) (-1, _2640) 0 ]", + "EXPR [ (1, _1718, _2185) (1, _2512, _2524) (-1, _2641) 0 ]", + "EXPR [ (1, _1718, _2186) (1, _2512, _2526) (-1, _2642) 0 ]", + "EXPR [ (1, _1718, _2187) (1, _2512, _2528) (-1, _2643) 0 ]", + "EXPR [ (1, _1718, _2188) (1, _2512, _2530) (-1, _2644) 0 ]", + "EXPR [ (1, _1718, _2189) (1, _2512, _2532) (-1, _2645) 0 ]", + "EXPR [ (1, _1718, _2190) (1, _2512, _2534) (-1, _2646) 0 ]", + "EXPR [ (1, _1718, _2191) (1, _2512, _2536) (-1, _2647) 0 ]", + "EXPR [ (1, _1718, _2192) (1, _2512, _2538) (-1, _2648) 0 ]", + "EXPR [ (1, _1718, _2193) (1, _2512, _2540) (-1, _2649) 0 ]", + "EXPR [ (1, _1718, _2194) (1, _2512, _2542) (-1, _2650) 0 ]", + "EXPR [ (1, _1718, _2195) (1, _2512, _2544) (-1, _2651) 0 ]", + "EXPR [ (1, _1718, _2196) (1, _2512, _2546) (-1, _2652) 0 ]", + "EXPR [ (1, _1718, _2197) (1, _2512, _2548) (-1, _2653) 0 ]", + "EXPR [ (1, _1718, _2198) (1, _2512, _2550) (-1, _2654) 0 ]", + "EXPR [ (1, _1718, _2199) (1, _2512, _2552) (-1, _2655) 0 ]", + "EXPR [ (1, _1718, _2200) (1, _2512, _2554) (-1, _2656) 0 ]", + "EXPR [ (1, _1718, _2201) (1, _2512, _2556) (-1, _2657) 0 ]", + "EXPR [ (1, _1718, _2202) (1, _2512, _2558) (-1, _2658) 0 ]", + "EXPR [ (1, _1718, _2203) (1, _2512, _2560) (-1, _2659) 0 ]", + "EXPR [ (1, _1718, _2204) (1, _2512, _2562) (-1, _2660) 0 ]", + "EXPR [ (1, _1718, _2205) (1, _2512, _2564) (-1, _2661) 0 ]", + "EXPR [ (1, _1718, _2206) (1, _2512, _2566) (-1, _2662) 0 ]", + "EXPR [ (1, _1718, _2207) (1, _2512, _2568) (-1, _2663) 0 ]", + "EXPR [ (1, _1718, _2208) (1, _2512, _2571) (-1, _2664) 0 ]", + "EXPR [ (1, _1718, _2209) (1, _2512, _2573) (-1, _2665) 0 ]", + "EXPR [ (1, _1718, _2210) (1, _2512, _2575) (-1, _2666) 0 ]", + "EXPR [ (1, _1718, _2211) (1, _2512, _2578) (-1, _2667) 0 ]", + "EXPR [ (1, _1718, _2212) (1, _2512, _2580) (-1, _2668) 0 ]", + "EXPR [ (1, _1718, _2213) (1, _2512, _2582) (-1, _2669) 0 ]", + "EXPR [ (1, _1718, _2214) (1, _2512, _2584) (-1, _2670) 0 ]", + "EXPR [ (1, _1718, _2215) (1, _2512, _2586) (-1, _2671) 0 ]", + "EXPR [ (1, _1718, _2216) (1, _2512, _2588) (-1, _2672) 0 ]", + "EXPR [ (1, _1718, _2217) (1, _2512, _2590) (-1, _2673) 0 ]", + "EXPR [ (1, _1718, _2218) (1, _2512, _2592) (-1, _2674) 0 ]", + "EXPR [ (1, _1718, _2219) (1, _2512, _2594) (-1, _2675) 0 ]", + "EXPR [ (1, _1718, _2220) (1, _2512, _2596) (-1, _2676) 0 ]", + "EXPR [ (-1, _2677) 5000 ]", + "EXPR [ (1, _1718, _2222) (1, _2512, _2600) (-1, _2678) 0 ]", + "EXPR [ (1, _1718, _2223) (1, _2512, _2602) (-1, _2679) 0 ]", + "EXPR [ (1, _1718, _2224) (1, _2512, _2604) (-1, _2680) 0 ]", + "EXPR [ (1, _1718, _2225) (1, _2512, _2606) (-1, _2681) 0 ]", + "EXPR [ (1, _1718, _2226) (1, _2512, _2608) (-1, _2682) 0 ]", + "EXPR [ (1, _1718, _2227) (1, _2512, _2610) (-1, _2683) 0 ]", + "EXPR [ (1, _1718, _2228) (1, _2512, _2612) (-1, _2684) 0 ]", + "EXPR [ (1, _1718, _2229) (1, _2512, _2614) (-1, _2685) 0 ]", + "EXPR [ (1, _1718, _2230) (1, _2512, _2616) (-1, _2686) 0 ]", + "EXPR [ (1, _1718, _2231) (1, _2512, _2618) (-1, _2687) 0 ]", + "EXPR [ (1, _1718, _2232) (1, _2512, _2620) (-1, _2688) 0 ]", + "EXPR [ (1, _1718, _2233) (1, _2512, _2622) (-1, _2689) 0 ]", + "EXPR [ (1, _1718, _2234) (1, _2512, _2624) (-1, _2690) 0 ]", + "EXPR [ (1, _1718, _2235) (1, _2512, _2626) (-1, _2691) 0 ]", + "EXPR [ (1, _1718, _2236) (1, _2512, _2628) (-1, _2692) 0 ]", + "EXPR [ (1, _1718, _2237) (1, _2512, _2630) (-1, _2693) 0 ]", + "EXPR [ (1, _1718, _2238) (1, _2512, _2632) (-1, _2694) 0 ]", + "INIT (id: 46, len: 62, witnesses: [_2633, _2634, _2635, _2636, _2637, _2638, _2639, _2640, _2641, _2642, _2643, _2644, _2645, _2646, _2647, _2648, _2649, _2650, _2651, _2652, _2653, _2654, _2655, _2656, _2657, _2658, _2659, _2660, _2661, _2662, _2663, _2664, _2665, _2666, _2667, _2668, _2669, _2670, _2671, _2672, _2673, _2674, _2675, _2676, _2677, _2678, _2679, _2680, _2681, _2682, _2683, _2684, _2685, _2686, _2687, _2688, _2689, _2690, _2691, _2692, _2693, _2694])", + "INIT (id: 47, len: 5, witnesses: [_30, _120, _803, _804, _805])", + "EXPR [ (2, _53) (-1, _2695) 1 ]", + "MEM (id: 47, read at: EXPR [ (1, _2695) 0 ], value: EXPR [ (1, _2696) 0 ]) ", + "MEM (id: 46, read at: EXPR [ (1, _2696) 0 ], value: EXPR [ (1, _2697) 0 ]) ", + "EXPR [ (1, _2696) (-1, _2698) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2698) 0 ], value: EXPR [ (1, _2699) 0 ]) ", + "EXPR [ (1, _2698) (-1, _2700) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2700) 0 ], value: EXPR [ (1, _2701) 0 ]) ", + "EXPR [ (1, _2700) (-1, _2702) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2702) 0 ], value: EXPR [ (1, _2703) 0 ]) ", + "EXPR [ (1, _2702) (-1, _2704) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2704) 0 ], value: EXPR [ (1, _2705) 0 ]) ", + "EXPR [ (1, _2704) (-1, _2706) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2706) 0 ], value: EXPR [ (1, _2707) 0 ]) ", + "EXPR [ (1, _2706) (-1, _2708) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2708) 0 ], value: EXPR [ (1, _2709) 0 ]) ", + "EXPR [ (1, _2708) (-1, _2710) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2710) 0 ], value: EXPR [ (1, _2711) 0 ]) ", + "EXPR [ (1, _2710) (-1, _2712) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2712) 0 ], value: EXPR [ (1, _2713) 0 ]) ", + "EXPR [ (1, _2712) (-1, _2714) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2714) 0 ], value: EXPR [ (1, _2715) 0 ]) ", + "EXPR [ (1, _2714) (-1, _2716) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2716) 0 ], value: EXPR [ (1, _2717) 0 ]) ", + "EXPR [ (1, _2716) (-1, _2718) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2718) 0 ], value: EXPR [ (1, _2719) 0 ]) ", + "EXPR [ (1, _2718) (-1, _2720) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2720) 0 ], value: EXPR [ (1, _2721) 0 ]) ", + "EXPR [ (1, _2720) (-1, _2722) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2722) 0 ], value: EXPR [ (1, _2723) 0 ]) ", + "EXPR [ (1, _2722) (-1, _2724) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2724) 0 ], value: EXPR [ (1, _2725) 0 ]) ", + "EXPR [ (1, _2724) (-1, _2726) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2726) 0 ], value: EXPR [ (1, _2727) 0 ]) ", + "EXPR [ (1, _2726) (-1, _2728) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2728) 0 ], value: EXPR [ (1, _2729) 0 ]) ", + "EXPR [ (1, _2728) (-1, _2730) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2730) 0 ], value: EXPR [ (1, _2731) 0 ]) ", + "EXPR [ (1, _2730) (-1, _2732) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2732) 0 ], value: EXPR [ (1, _2733) 0 ]) ", + "EXPR [ (1, _2732) (-1, _2734) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2734) 0 ], value: EXPR [ (1, _2735) 0 ]) ", + "EXPR [ (1, _2734) (-1, _2736) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2736) 0 ], value: EXPR [ (1, _2737) 0 ]) ", + "EXPR [ (1, _2736) (-1, _2738) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2738) 0 ], value: EXPR [ (1, _2739) 0 ]) ", + "EXPR [ (1, _2738) (-1, _2740) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2740) 0 ], value: EXPR [ (1, _2741) 0 ]) ", + "EXPR [ (1, _2740) (-1, _2742) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2742) 0 ], value: EXPR [ (1, _2743) 0 ]) ", + "EXPR [ (1, _2742) (-1, _2744) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2744) 0 ], value: EXPR [ (1, _2745) 0 ]) ", + "EXPR [ (1, _2744) (-1, _2746) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2746) 0 ], value: EXPR [ (1, _2747) 0 ]) ", + "EXPR [ (1, _2746) (-1, _2748) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2748) 0 ], value: EXPR [ (1, _2749) 0 ]) ", + "EXPR [ (1, _2748) (-1, _2750) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2750) 0 ], value: EXPR [ (1, _2751) 0 ]) ", + "INIT (id: 48, len: 28, witnesses: [_2697, _2699, _2701, _2703, _2705, _2707, _2709, _2711, _2713, _2715, _2717, _2719, _2721, _2723, _2725, _2727, _2729, _2731, _2733, _2735, _2737, _2739, _2741, _2743, _2745, _2747, _2749, _2751])", + "INIT (id: 49, len: 13, witnesses: [_30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42])", + "MEM (id: 49, read at: EXPR [ (1, _57) 0 ], value: EXPR [ (1, _2752) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _2752) 0 ], value: EXPR [ (1, _2753) 0 ]) ", + "EXPR [ (1, _2752) (-1, _2754) 1 ]", + "MEM (id: 48, read at: EXPR [ (1, _2754) 0 ], value: EXPR [ (1, _2755) 0 ]) ", + "EXPR [ (1, _2754) (-1, _2756) 1 ]", + "MEM (id: 48, read at: EXPR [ (1, _2756) 0 ], value: EXPR [ (1, _2757) 0 ]) ", + "MEM (id: 49, read at: EXPR [ (1, _776) 0 ], value: EXPR [ (1, _2758) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _2758) 0 ], value: EXPR [ (1, _2759) 0 ]) ", + "EXPR [ (1, _2758) (-1, _2760) 1 ]", + "MEM (id: 48, read at: EXPR [ (1, _2760) 0 ], value: EXPR [ (1, _2761) 0 ]) ", + "EXPR [ (1, _2760) (-1, _2762) 1 ]", + "MEM (id: 48, read at: EXPR [ (1, _2762) 0 ], value: EXPR [ (1, _2763) 0 ]) ", + "MEM (id: 49, read at: EXPR [ (1, _46) 0 ], value: EXPR [ (1, _2764) 0 ]) ", + "MEM (id: 48, write EXPR [ (1, _2753) 0 ] at: EXPR [ (1, _2764) 0 ]) ", + "EXPR [ (1, _2764) (-1, _2765) 1 ]", + "MEM (id: 48, write EXPR [ (1, _2755) 0 ] at: EXPR [ (1, _2765) 0 ]) ", + "EXPR [ (1, _2765) (-1, _2766) 1 ]", + "MEM (id: 48, write EXPR [ (1, _2757) 0 ] at: EXPR [ (1, _2766) 0 ]) ", + "MEM (id: 49, read at: EXPR [ (1, _30) 0 ], value: EXPR [ (1, _2767) 0 ]) ", + "MEM (id: 49, read at: EXPR [ (1, _31) 0 ], value: EXPR [ (1, _2768) 0 ]) ", + "MEM (id: 49, read at: EXPR [ (1, _118) 0 ], value: EXPR [ (1, _2769) 0 ]) ", + "MEM (id: 49, read at: EXPR [ (1, _120) 0 ], value: EXPR [ (1, _2770) 0 ]) ", + "MEM (id: 49, read at: EXPR [ (1, _32) 0 ], value: EXPR [ (1, _2771) 0 ]) ", + "MEM (id: 49, read at: EXPR [ (1, _123) 0 ], value: EXPR [ (1, _2772) 0 ]) ", + "MEM (id: 49, read at: EXPR [ (1, _125) 0 ], value: EXPR [ (1, _2773) 0 ]) ", + "MEM (id: 49, read at: EXPR [ (1, _33) 0 ], value: EXPR [ (1, _2774) 0 ]) ", + "MEM (id: 49, read at: EXPR [ (1, _34) 0 ], value: EXPR [ (1, _2775) 0 ]) ", + "MEM (id: 49, read at: EXPR [ (1, _129) 0 ], value: EXPR [ (1, _2776) 0 ]) ", + "MEM (id: 49, read at: EXPR [ (1, _131) 0 ], value: EXPR [ (1, _2777) 0 ]) ", + "MEM (id: 49, read at: EXPR [ (1, _35) 0 ], value: EXPR [ (1, _2778) 0 ]) ", + "MEM (id: 49, read at: EXPR [ (1, _134) 0 ], value: EXPR [ (1, _2779) 0 ]) ", + "INIT (id: 50, len: 13, witnesses: [_2767, _2768, _2769, _2770, _2771, _2772, _2773, _2774, _2775, _2776, _2777, _2778, _2779])", + "EXPR [ (1, _46) (-1, _2780) 1 ]", + "MEM (id: 50, read at: EXPR [ (1, _2780) 0 ], value: EXPR [ (1, _2781) 0 ]) ", + "MEM (id: 48, write EXPR [ (1, _2759) 0 ] at: EXPR [ (1, _2781) 0 ]) ", + "EXPR [ (1, _2781) (-1, _2782) 1 ]", + "MEM (id: 48, write EXPR [ (1, _2761) 0 ] at: EXPR [ (1, _2782) 0 ]) ", + "EXPR [ (1, _2782) (-1, _2783) 1 ]", + "MEM (id: 48, write EXPR [ (1, _2763) 0 ] at: EXPR [ (1, _2783) 0 ]) ", + "MEM (id: 47, read at: EXPR [ (1, _2695) 0 ], value: EXPR [ (1, _2784) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _30) 0 ], value: EXPR [ (1, _2785) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _31) 0 ], value: EXPR [ (1, _2786) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _118) 0 ], value: EXPR [ (1, _2787) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _120) 0 ], value: EXPR [ (1, _2788) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _32) 0 ], value: EXPR [ (1, _2789) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _123) 0 ], value: EXPR [ (1, _2790) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _125) 0 ], value: EXPR [ (1, _2791) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _33) 0 ], value: EXPR [ (1, _2792) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _34) 0 ], value: EXPR [ (1, _2793) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _129) 0 ], value: EXPR [ (1, _2794) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _131) 0 ], value: EXPR [ (1, _2795) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _35) 0 ], value: EXPR [ (1, _2796) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _134) 0 ], value: EXPR [ (1, _2797) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _1067) 0 ], value: EXPR [ (1, _2798) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _36) 0 ], value: EXPR [ (1, _2799) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _37) 0 ], value: EXPR [ (1, _2800) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _1071) 0 ], value: EXPR [ (1, _2801) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _1073) 0 ], value: EXPR [ (1, _2802) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _38) 0 ], value: EXPR [ (1, _2803) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _1076) 0 ], value: EXPR [ (1, _2804) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _1078) 0 ], value: EXPR [ (1, _2805) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _39) 0 ], value: EXPR [ (1, _2806) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _40) 0 ], value: EXPR [ (1, _2807) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _1082) 0 ], value: EXPR [ (1, _2808) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _1084) 0 ], value: EXPR [ (1, _2809) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _41) 0 ], value: EXPR [ (1, _2810) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _1087) 0 ], value: EXPR [ (1, _2811) 0 ]) ", + "MEM (id: 48, read at: EXPR [ (1, _1089) 0 ], value: EXPR [ (1, _2812) 0 ]) ", + "MEM (id: 46, write EXPR [ (1, _2785) 0 ] at: EXPR [ (1, _2784) 0 ]) ", + "EXPR [ (1, _2784) (-1, _2813) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2786) 0 ] at: EXPR [ (1, _2813) 0 ]) ", + "EXPR [ (1, _2813) (-1, _2814) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2787) 0 ] at: EXPR [ (1, _2814) 0 ]) ", + "EXPR [ (1, _2814) (-1, _2815) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2788) 0 ] at: EXPR [ (1, _2815) 0 ]) ", + "EXPR [ (1, _2815) (-1, _2816) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2789) 0 ] at: EXPR [ (1, _2816) 0 ]) ", + "EXPR [ (1, _2816) (-1, _2817) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2790) 0 ] at: EXPR [ (1, _2817) 0 ]) ", + "EXPR [ (1, _2817) (-1, _2818) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2791) 0 ] at: EXPR [ (1, _2818) 0 ]) ", + "EXPR [ (1, _2818) (-1, _2819) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2792) 0 ] at: EXPR [ (1, _2819) 0 ]) ", + "EXPR [ (1, _2819) (-1, _2820) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2793) 0 ] at: EXPR [ (1, _2820) 0 ]) ", + "EXPR [ (1, _2820) (-1, _2821) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2794) 0 ] at: EXPR [ (1, _2821) 0 ]) ", + "EXPR [ (1, _2821) (-1, _2822) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2795) 0 ] at: EXPR [ (1, _2822) 0 ]) ", + "EXPR [ (1, _2822) (-1, _2823) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2796) 0 ] at: EXPR [ (1, _2823) 0 ]) ", + "EXPR [ (1, _2823) (-1, _2824) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2797) 0 ] at: EXPR [ (1, _2824) 0 ]) ", + "EXPR [ (1, _2824) (-1, _2825) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2798) 0 ] at: EXPR [ (1, _2825) 0 ]) ", + "EXPR [ (1, _2825) (-1, _2826) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2799) 0 ] at: EXPR [ (1, _2826) 0 ]) ", + "EXPR [ (1, _2826) (-1, _2827) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2800) 0 ] at: EXPR [ (1, _2827) 0 ]) ", + "EXPR [ (1, _2827) (-1, _2828) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2801) 0 ] at: EXPR [ (1, _2828) 0 ]) ", + "EXPR [ (1, _2828) (-1, _2829) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2802) 0 ] at: EXPR [ (1, _2829) 0 ]) ", + "EXPR [ (1, _2829) (-1, _2830) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2803) 0 ] at: EXPR [ (1, _2830) 0 ]) ", + "EXPR [ (1, _2830) (-1, _2831) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2804) 0 ] at: EXPR [ (1, _2831) 0 ]) ", + "EXPR [ (1, _2831) (-1, _2832) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2805) 0 ] at: EXPR [ (1, _2832) 0 ]) ", + "EXPR [ (1, _2832) (-1, _2833) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2806) 0 ] at: EXPR [ (1, _2833) 0 ]) ", + "EXPR [ (1, _2833) (-1, _2834) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2807) 0 ] at: EXPR [ (1, _2834) 0 ]) ", + "EXPR [ (1, _2834) (-1, _2835) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2808) 0 ] at: EXPR [ (1, _2835) 0 ]) ", + "EXPR [ (1, _2835) (-1, _2836) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2809) 0 ] at: EXPR [ (1, _2836) 0 ]) ", + "EXPR [ (1, _2836) (-1, _2837) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2810) 0 ] at: EXPR [ (1, _2837) 0 ]) ", + "EXPR [ (1, _2837) (-1, _2838) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2811) 0 ] at: EXPR [ (1, _2838) 0 ]) ", + "EXPR [ (1, _2838) (-1, _2839) 1 ]", + "MEM (id: 46, write EXPR [ (1, _2812) 0 ] at: EXPR [ (1, _2839) 0 ]) ", + "MEM (id: 47, read at: EXPR [ (1, _30) 0 ], value: EXPR [ (1, _2840) 0 ]) ", + "MEM (id: 47, read at: EXPR [ (1, _31) 0 ], value: EXPR [ (1, _2841) 0 ]) ", + "MEM (id: 47, read at: EXPR [ (1, _118) 0 ], value: EXPR [ (1, _2842) 0 ]) ", + "MEM (id: 47, read at: EXPR [ (1, _120) 0 ], value: EXPR [ (1, _2843) 0 ]) ", + "MEM (id: 47, read at: EXPR [ (1, _32) 0 ], value: EXPR [ (1, _2844) 0 ]) ", + "INIT (id: 51, len: 5, witnesses: [_2840, _2841, _2842, _2843, _2844])", + "MEM (id: 51, read at: EXPR [ (1, _120) 0 ], value: EXPR [ (1, _2845) 0 ]) ", + "MEM (id: 46, read at: EXPR [ (1, _2845) 0 ], value: EXPR [ (1, _2846) 0 ]) ", + "EXPR [ (1, _2845) (-1, _2847) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2847) 0 ], value: EXPR [ (1, _2848) 0 ]) ", + "EXPR [ (1, _2847) (-1, _2849) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2849) 0 ], value: EXPR [ (1, _2850) 0 ]) ", + "EXPR [ (1, _2849) (-1, _2851) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2851) 0 ], value: EXPR [ (1, _2852) 0 ]) ", + "EXPR [ (1, _2851) (-1, _2853) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2853) 0 ], value: EXPR [ (1, _2854) 0 ]) ", + "EXPR [ (1, _2853) (-1, _2855) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2855) 0 ], value: EXPR [ (1, _2856) 0 ]) ", + "EXPR [ (1, _2855) (-1, _2857) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2857) 0 ], value: EXPR [ (1, _2858) 0 ]) ", + "EXPR [ (1, _2857) (-1, _2859) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2859) 0 ], value: EXPR [ (1, _2860) 0 ]) ", + "EXPR [ (1, _2859) (-1, _2861) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2861) 0 ], value: EXPR [ (1, _2862) 0 ]) ", + "EXPR [ (1, _2861) (-1, _2863) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2863) 0 ], value: EXPR [ (1, _2864) 0 ]) ", + "EXPR [ (1, _2863) (-1, _2865) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2865) 0 ], value: EXPR [ (1, _2866) 0 ]) ", + "EXPR [ (1, _2865) (-1, _2867) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2867) 0 ], value: EXPR [ (1, _2868) 0 ]) ", + "EXPR [ (1, _2867) (-1, _2869) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2869) 0 ], value: EXPR [ (1, _2870) 0 ]) ", + "EXPR [ (1, _2869) (-1, _2871) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2871) 0 ], value: EXPR [ (1, _2872) 0 ]) ", + "EXPR [ (1, _2871) (-1, _2873) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2873) 0 ], value: EXPR [ (1, _2874) 0 ]) ", + "EXPR [ (1, _2873) (-1, _2875) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2875) 0 ], value: EXPR [ (1, _2876) 0 ]) ", + "EXPR [ (1, _2875) (-1, _2877) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2877) 0 ], value: EXPR [ (1, _2878) 0 ]) ", + "EXPR [ (1, _2877) (-1, _2879) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2879) 0 ], value: EXPR [ (1, _2880) 0 ]) ", + "EXPR [ (1, _2879) (-1, _2881) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2881) 0 ], value: EXPR [ (1, _2882) 0 ]) ", + "EXPR [ (1, _2881) (-1, _2883) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2883) 0 ], value: EXPR [ (1, _2884) 0 ]) ", + "EXPR [ (1, _2883) (-1, _2885) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2885) 0 ], value: EXPR [ (1, _2886) 0 ]) ", + "EXPR [ (1, _2885) (-1, _2887) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2887) 0 ], value: EXPR [ (1, _2888) 0 ]) ", + "EXPR [ (1, _2887) (-1, _2889) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2889) 0 ], value: EXPR [ (1, _2890) 0 ]) ", + "EXPR [ (1, _2889) (-1, _2891) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2891) 0 ], value: EXPR [ (1, _2892) 0 ]) ", + "EXPR [ (1, _2891) (-1, _2893) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2893) 0 ], value: EXPR [ (1, _2894) 0 ]) ", + "EXPR [ (1, _2893) (-1, _2895) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2895) 0 ], value: EXPR [ (1, _2896) 0 ]) ", + "EXPR [ (1, _2895) (-1, _2897) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2897) 0 ], value: EXPR [ (1, _2898) 0 ]) ", + "EXPR [ (1, _2897) (-1, _2899) 1 ]", + "MEM (id: 46, read at: EXPR [ (1, _2899) 0 ], value: EXPR [ (1, _2900) 0 ]) ", + "EXPR [ (1, _2848) -20 ]", + "EXPR [ (1, _2850) -19 ]", + "EXPR [ (1, _2852) -5000 ]", "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) } }]", "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": "td3LjlzXkYXhd+FYg4yIHZftV2kYhiTTBgFCEmjJQEPQu3eey/pLHrDRnQVOeJYsn7Uyi/nVriKT4u8f/v7xh9/++bdPP/3j5399+Mt//f7hhy+fPn/+9M+/ff75x+9//fTzT8//9fc/vvugf/zbr18+fnz+Tx/+9O+fd/3y/ZePP/364S8//fb583cf/v3959/O/9O/fvn+p/P66/dfnv/28d2Hjz/9/Xl9Fv7j0+ePR/rju7e7H1+/1W3fN7svbs//x/3N/fm++8NfuX+V7s/1vvv78bX783+5//H2AXx4vTX8nx/A8AC2vfIEZnG/v/P+/cL9YXHfH27vuz/6a/ebfcOfgUgeQc4rzyCN+/f77q965f6R/5h51/3r8VVCB9Nv9jOwbPQI/JXX8J/uj8cr9y8ZWGved//Xfwbdv+VH8O3ncF75NPh2f1p89Rl8y8+DmfoYZr3yc5hvz2BeeQ1lS2H2KwdZmR5/Wb9y/yN1/+OVzyIVOkfqpddwpX7+ql56/i2DNfHK/Vv39+Px0j7P/yUB7bq/45VzrBePP1+63xf7r7x+m9dv71dOkTHdP7bfd//XX3/rW34OnHI9gn7lFfSn+7/+ldD6lp8DN18L7Ze+lvrT/fnVj8DxOv12z6D0Kt71ymehP92/v/pZNL/lV4P2SL0MnvGVz2RmfDnyjK9Ysrfvisxf+orInOPk2RDvbYh8b8PXPyfmt3w9mtfbY9ivPYu3hrCvPov6pq/J8LfHkC89iz839FfPh0PfN3wWW1+i2bJ66Vn8qSG+esrXt/xexdbaPIaXvlL8j4aXvlayxRdLlvHSRzL5dQ/LfOkzzPPLZBrmlfPW6sFjqEe/9Bgq3h6Dvbdhv/RzUYuG177ytnr7SFa/9HGosLfHsN/bUC99JGtzZnW89Cx683GYx0uPYfgi+hlf+jjMensM+dKrevLtMbz060k2xlcgE4/3Nix/b0O+9nOxcTH7pY/D5lvqZ3zpZ3M7j2H7S6/JGXt7FvudDdvsvQ3+0uthv3223y99nvRHDcdm/+fnyb8+/+n7Hz99+Y/f2vhgz63vPvjz///dhzh/XOePef5Y5499/jjnj/v80R7Xxa7Ldbtd99tVYFeDXRV2ddhVYs+W58+4P1ueLx236+LXJa7Lui55Xeq69PmL/D7XZZ+XeLY8P6XFs+X53MOvS1yXZ8vzEI88vkt4Xuu+9n2d+7qv63rcV7uvfv2a9or7uu7r0fd8Aqvu69H3fHxr7uu+rnn0PR9iHn3Pn9r0+xr3dd3XvK91X/u+zvUrurmvaz3uq93Xo+/5/Cru67qvx8f++fjr+OA/H2/1fZ37uq9rP+6r3Ve/r3H9Omiv+5r39eh7Pq/u+zr3dV/XedxXu69+X+P6VclZ9zXv69H3fB7T93Xu69H3/Onbj/t69D2f1/b7Gvd13de8r3Vf+77Ofd3X1R4PBVNwhVBYCqlQCq0wCmo2NZuaTc2mZlOzqdnUbGo2NZuaXc2uZlezq9nV7Gp2NbuaXc2u5lBzqDnUHGoONYeaQ82h5lBzqHmpeal5qXmpeal5qXmpeal5qXmpOdWcak41p5pTzanmVHOqOdWcai41l5pLzaXmUnOpudRcai41l5pbza3mVnOrudXcam41t5pbza3mUfOoedQ8ah41j5pHzaPmUfOoeatZ9kz4TPpM/Ez+TABNAk0ETQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0GXQZdBl0G/TAYjyOEwjp+N/oIqVAKrTAK+w6HwSuYgiuEgppbza3mVnOrudU8ah41j5pHzaPmUfOoedQ8ah41bzVvNW81bzVvNW81bzVvNW8177s5Hg8FU3CFUFgKqVAKrTAKajY1m5pNzaZmU7Op2dRsajY1m5pdza5mV7Or2dXsanY1u5pdza7mUHOoOdQcag41h5pDzaHmUHOoeal5qXmpeal5qXmpeal5qXmpeak51ZxqTjWnmlPNqeZUc6o51ZxqLjWXmkvNpWYZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGVwyuGRwyeCSwSWDSwaXDC4ZXDK4ZHDJ4JLBJYNLBpcMLhlcMrhkcMngksElg0sGlwwuGVwyuGRwyeCSwSWDSwaXDC4ZXDK4ZHDJ4JLBJYNLBpcMLhlcMrhkcMngksElg0sGlwwuGVwyuGRwyeCSwSWDSwbXafD4rvo0eHxveBo8w9GcRxiFo7mO7ysfCqbgCqGwFFKhFFphFNTcam41t5pbza3mVnOrudXcam41j5pHzaPmUfOoedQ8ah41j5pHzVvNW81bzVvNW81bzVvNW81bzftuzsdDwRRcIRSWQiqUQiuMgppNzaZmU7Op2dRsajY1m5pNzaZmV7Or2dXsanY1u5pdza5mV7OrOdQcag41h5pDzaHmUHOoOdQcal5qXmpeal5qXmpeal5qXmpeal5qTjWnmlPNqeZUc6o51ZxqTjXLYMpgymDKYMpgymDKYMpgymDKYMpgymDKYMpgymDKYMpgymDKYMpgymDKYMpgymDKYMpgymDKYMpgymDKYMpgymDKYMpgymDKYMpgymDKYMpgyWDJYMlgyWDJYMlgyWDJYMlgyWDJYMlgyWDJYMlgyWDJYMlgyWDJYMlgyWDJYJ0Gz1+bWwpH8xyhFI7mfYRR2Hc4DZ7BFFwhFJZCKpSCmkPNoeal5qXmpeal5qXmpeal5qXmpeal5lRzqjnVnGpONaeaU82p5lRzqrnUXGouNZeaS82l5lJzqbnUXGpuNbeaW82t5lZzq7nV3GpuNbeaR82j5lHzqHnUPGoeNY+aR82j5q3mreat5q3mreat5q3mreat5n039+OhYAquEApLIRVKoRVGQc2mZlOzqdnUbGo2NZuaTc2mZlOzq9nV7Gp2NbuaXc2uZhlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBlsGWwZbBnsw+B6HMEVQuH4vSs7QiqUQiuMwr7CHAavYAquEApLIRVKoRVGQc2mZlOzqdnUbGo2NZuaTc2mZlOzq9nV7Gp2NbuaXc2uZlezq9nVHGo+DB7vR53D4BVC4Wg+f3spFUqhFUZh3+EweAW73ic6h8ErhMLRfPxG1GHwCqXQCqOw73AYvIJd79+cw+AVQmEdvxt7hFQohVYYhX2Hw+Dxdso5DF7BFeJ4U/4RjuY6QiqUQiuMwr7DYfAKpuAKoaDmVnOrudXcam41j5pHzaPmUfOoedQ8ah41j5pHzVvNW81bzVvNW81bzVvNW81bzftu3o+Hgim4QigshVQohVYYBTWbmk3NpmZTs6nZ1GxqNjWbmk3NrmZXs6vZ1exqdjUfBrOP0AqjsO9wGLyCKbhCKKzrraH7MHiFUujjD0kcYRT2HQ6DVzAFV4jrXZr7MHiFVKjjz08coRVGYd/hMHgFU/DrDZP7MHiFpXA0Hx+Nw+AVWmEU9h0Og1ew672L+zB4hVA4mvcRUqGOPylxhGfz8d7/fRi8wr7DYbCPh3oYvIIff1LhCKGwjj+xcIRUKIVWGIV9h8PgFUzBFUJBzaPmUfOoedQ8at5q3mreat5q3mreat5q3mreat538/P36B8kIzkpSIuUpCI1aUhsGBvGhrFhbBgbxoaxYWwYG8aGs+FsOBvOhrPhbDgbzoaz4WwEG8HGgfT4UzbPFKRFSlKRmjSkrXRgvZOR2FhsLDYWG4uNxcZiY7GRbCQbyUaykWwkG8lGspFsJBvFRrFRbBQbxUaxUWwUG8VGsdFsNBvNRrPRbDQbzUaz0Ww0G8PGsDFsDBvDxrAxbAwbw+tqeF1tXleb19Xmtbt57W5eu5vX7ua1u3ntbjZwbjg3nBvODeeGc8O54dxwbjg3nBvODeeGc8O54dxwbjg3nBvODeeGc8O54dxwbjg3nBvODeeGc8O54dxwfr5Z505sBBvBRrARbAQbwcZiY7Gx2FhsLDYWG4uNxcZiY7GRbCQbyUaykWwkG8lGspFsJBvFRrFRbBQbxUaxUWwUG8VGsdFsNBvNRrPRbDQbzUaz0Ww0G8PGsDFsDBvDxrAxbAwbODecG84N54Zzw7nh3HBuODecG84N545zx7nj3HHuOHecO84d545zx7nj3HHuOHecO84d545zx7nj3HHuOHecO84d545zx7nj3HHuOHecO84d545zx7nj3HHuOHecO84d545zx7nj3HHuOHecO84d545zx7nj3HHuOHecO84d545zx7nj3HHuOHecO84d545zx7nj3HHuOHecO84d545zx7nj3HHuOHecO84d545zx7nj3HHuOHecO84d545zx7nj3HHuOHecO84d545zx7nj3HEeOA+cB84D54HzwHngPHAeOA+cB84D54HzwHngPHAeOA+cB84D54HzwHngPHAeOA+cB84D54HzwHngPHAeOA+cB84D54HzwHngPHAeOA+cB84D54HzwHngPHAeOA+cB84D54HzwHngPHAeOA+cB84D54HzwHngPHAeOA+cB84D54HzwHngPHAeOA+cB84D54HzwHngPHAeOA+cB84D54HzwHngPHAeOA+cB84D54HzwHngPHAeOA+cB87P9y3189c47Hzj0p2OjTmTk46NfaZFSlKRmjSkrXQ6v5KRnMSGsWFsGBvGhrFhbDgbzoaz4Ww4G86Gs+FsOBvORrARbAQbwUawEWwEG8FGsBFsLDYWG4uNxcZiY7Gx2FhsLDYWG8lGspFsJBvJRrKRbCQbyUayUWwczo//Toydb3u6U5AWKUlFatKQttLh/E5sNBvNRrPRbDQbzUaz0WwMG8PGsDFsDBvDxrAxbAwbw8ZmY7Ox2dhsbDY2G5uNzcZmY2vjfHPUnYzkpCAtUpKK1KQhsWFsGBvGhrFhbBgbxgbOE+eJ88R54jxxnjhPnCfOE+eJ88R54jxxnjhPnCfOE+eJ88R54jxxnjhPnCfOE+eJ88R54jxxnjhPnCfOE+eJ88R54jxxnjhPnCfOE+eJ88T5+c6qO7FRbBQbxUaxUWwUG8VGs9FsNBvNRrPRbDQbzUaz0WwMG8PGsDFsDBvDxrAxbAwbw8ZmY7Ox2dhsbDY2G5uNzcZmY2vjfAPWnYzkpCAtUpKK1KQhscF5XpznxXlenOfFeV6c58V5XjgvnBfOC+eF88J54bxwXjgvnBfOC+eF88J54bxwXjgvnBfOC+eF88J54bxwXjgvnBfOC+eF88J54bxwXjgvnBfOC+eF88J54bxwXjgvnBfOC+eF88J54bxwXjgvnBfOC+eF88J54bxwXjgvnBfOC+eF88J54bxwXjgvnBfOC+eF88J54bxwXjgvnBfOC+eF88J54bxwXjgvnBfOG+eN88Z547xx3jhvnDfOG+eN88Z547xx3jhvnDfOG+eN88Z547xx3jhvnDfOG+eN88Z547xx3jhvnDfOG+eN88Z547xx3jhvnDfOG+eN88Z547xx3jhvnDfOG+eN88Z547xx3jhvnDfOG+eN88Z547xx3jhvnDfOG+eN88Z547xx3jhvnDfOG+eN88Z547xx3jhvnDfOG+eN88Z547xx3jhvnDfOG+eN88Z547xx3jhvnDfOG+eN88Z543xwPjgfnA/OB+eD88H54HxwPjgfnA/OB+eD88H54HxwPjgfnA/OB+eD88H54HxwPjgfnA/OB+eD88H54HxwPjgfnA/OB+eD88H54HxwPjgfnA/OB+eD88H54HxwPjgfnA/OB+eD88H54HxwPjgfnA/OB+eD88H54HxwPjgfnA/OB+eD88H54HxwPjgfnA/OB+eD88H54HxwPjgfnA/OB+eD88H54HxwPjgfnA/OB+eD88H54HxwPjgfnA/ON87Pd6sd//EZO9+udqcgHd87n//VlfP78ysV6fj+PM40pOP783Wk8/vzKx0beSYnHRt1pkVKUpGaNKStdDi/k5GcxIaz4Ww4G86Gs+FsBBvBRrARbAQbwUawEWwEG8HGYmOxsdhYbCw2FhuLjcXGYmOxkWwkG8lGspFsJBvJRrKRbCQbxUaxUWwUG8VGsVFsFBvFRrHRbDQbzUaz0Ww0G81Gs9FsNBvDxrAxbAwbw8awMWwMG8PGsLHZ2GxsNjYbm43NxmZjs7HZ2PeGn++Hu5ORnBSkRUpSkZo0JDaMDWPD2DA2jA1jw9gwNowNY8PZcDacDWfD2XA2nA1nw9lwNoKNYON03mcK0iIlqUhNGtJWOp1fyUhsLDYWG4uNxcZiY7Gx2Eg2ko1kI9lINk7nc6YiNWlIW6nYKDaKjWKj2CieR/E8iudRPI/ieTQbzUaz0Ww0G81Gs9FsNBvNxrAxbAwbw8awMWwMG8PGsDFsbDY2G5uNzcZmY7Ox2dhsbDa2Ns73w93JSE4K0iIlqUhNGpJ8GM4N54Zzw7nh3HBuODecG84N54Zzw7nh3HBuODecG84N54Zzw7nh3HBuwUawEWwEG8FGsBFsBBuLjcXGYmOxsdhYbCw2FhuLjcVGspFsJBvJRrKRbCQbyUaykWwUG8VGsVFsFBvFRrFRbBQbxUaz0Ww0G81Gs9FsNBvNRrPRbAwbw8awMWwMG8PGsDFsDBvDxmZjs7HZ2GxsNjYbm43NxmaD89w5z53z3DnPnfPcOc+d89w5z53z3DnPHeeOc8e549xx7jh3nDvOHeeOc8e549xx7jh3nDvOHeeOc8e549xx7jh3nDvOHeeOc8e549xx7jh3nDvOHeeOc8e549xx7jh3nDvOHeeOc8e549xx7jh3nDvOHeeOc8e549xx7jh3nDvOHeeOc8e549xx7jh3nDvOHeeOc8e549xx7jh3nDvOHeeOc8e549xx7jh3nDvOHeeOc8e549xx7jh3nDvOHeeOc8d54DxwHjgPnAfOA+eB88B54DxwHjgPnAfOA+eB88B54DxwHjgPnAfOA+eB88B54DxwHjgPnAfOA+eB88B54DxwHjgPnAfOA+eB88B54DxwHjgPnAfOA+eB88B54DxwHjgPnAfOA+eB88B54DxwHjgPnAfOA+eB88B54DxwHjgPnAfOA+eB88B54DxwHjgPnAfOA+eB88B54DxwHjgPnAfOA+eB88B54DxwHjgPnAfOA+eB88B54DxwHjgPnC+cL5wvnC+cL5wvnC+cL5wvnC+cn++Hm30mIz03jr9owc/3w91pHX+9zJmSVMdfVHOmJg1pKx3O72QkJwVpkZLEhrPhbDgbwUawEWwEG8FGsBFsBBvBRrCx2FhsLDYWG4uNxcZiY7Gx2FhsJBvJRrKRbCQbyUaykWwkG8lGsVFsFBvFRrFRbBQbxUaxUWw0G81Gs9FsNBvNRrPRbDQbzcawMWwMG8PGsDFsDBvDxrAxbGw2Nhubjc3GZmOzsdnYbGw2tjbO98PdyUhOCtIiJalITRoSG8aGsWFsGBvGhrGB88R54jxxnjhPnCfOE+eJ88R54jxxnjhPnCfOE+eJ88R54jxxnjhPnJ/vhzv+ogI/3w93pdP5lYzkpCAtUpKK1CQ2FhvJRrKRbCQbyUaykWwkG8lGslFsnM7P/+r96fxKQVqkJLFRbBQbxUaz0TyP5nk0z6N5Hs3zaDaajWaj2Rg2ho1hY9gYNoaNYWPYGDaGjc3GZmOzsdnYbGw2Nhubjc3G1sb5frg7GclJQVqkJBWpSUNiw9gwNowNY8PYwHnhvHBeOC+cF84L54XzwnnhvHBeOC+cF84L54XzwnnhvHBeOC+cF84L58V5XpznxXlenOfFeV6c58V5XpznxXlenOfFeV6c58V5XpznxXlenOfFeV6c58V5XpznxXlenOfFeV6c58V5XpznxXlenOfFeV6c58V5XpznxXlenOfFeV6c58V5XpznxXlenOfFeV6c58V5XpznxXlenOfFeV6c58V5XpznxXlenOfFeV6c58V5XpznxXlenOfFeV6c58V5XpznzXnenOfNed6c58153pznzXnenOfNed6c58153pznzXnenOfNed44b5w3zhvnjfPGeeO8cd44b5w3zhvnjfPGeeO8cd44b5w3zhvnjfPGeeO8cd44b5w3zhvnjfPGeeO8cd44b5w3zhvnjfPGeeO8cd44b5w3zhvnjfPGeeO8cd44b5w3zhvnjfPGeeO8cd44b5w3zhvnjfPGeeO8cd44b5w3zhvnjfPGeeO8cd44b5w3zhvnjfPGeeO8cd44b5w3zhvnjfPB+eB8cD44H5wPzgfng/PB+eB8cD44H5wPzgfng/PB+eB8cD44H5wPzgfng/PB+eB8cD44H5wPzgfng/PB+eB8cD44H5wPzgfng/PB+eB8cD44H5wPzgfn5/vhjr+Izs/3w51/l/K/v//y6fsfPn/814e//H781Ve//fSj/p6r5z/++t+/6N/88OXT58+f/vm3X778/OPHv//25ePxd2Kd/+6Pv/7xPw==", + "debug_symbols": "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", "file_map": { "50": { "source": "struct Bar {\n inner: [Field; 3],\n}\n\nstruct Foo {\n a: Field,\n b: [Field; 3],\n bar: Bar,\n}\n\nstruct FooParent {\n array: [Field; 3],\n foos: [Foo; 4],\n}\n\nfn main(mut x: [Foo; 4], y: pub u32) {\n assert(x[y - 3].a == 1);\n assert(x[y - 3].b == [2, 3, 20]);\n assert(x[y - 2].a == 4);\n assert(x[y - 2].b == [5, 6, 21]);\n assert(x[y - 1].a == 7);\n assert(x[y - 1].b == [8, 9, 22]);\n assert(x[y].a == 10);\n assert(x[y].b == [11, 12, 23]);\n assert(x[y].bar.inner == [109, 110, 111]);\n // Check dynamic array set\n if y != 2 {\n x[y].a = 50;\n } else {\n x[y].a = 100;\n }\n assert(x[3].a == 50);\n\n if y == 2 {\n x[y - 1].b = [50, 51, 52];\n } else {\n x[y - 1].b = [100, 101, 102];\n }\n assert(x[2].b == [100, 101, 102]);\n\n assert(x[y - 3].bar.inner == [100, 101, 102]);\n assert(x[y - 2].bar.inner == [103, 104, 105]);\n assert(x[y - 1].bar.inner == [106, 107, 108]);\n assert(x[y].bar.inner == [109, 110, 111]);\n\n let foo_parent_one = FooParent { array: [0, 1, 2], foos: x };\n let foo_parent_two = FooParent { array: [3, 4, 5], foos: x };\n let mut foo_parents = [foo_parent_one, foo_parent_two];\n\n assert(foo_parents[y - 3].foos[y - 3].b == [2, 3, 20]);\n assert(foo_parents[y - 3].foos[y - 2].b == [5, 6, 21]);\n assert(foo_parents[y - 3].foos[y - 1].b == [100, 101, 102]);\n assert(foo_parents[y - 3].foos[y].b == [11, 12, 23]);\n\n assert(foo_parents[y - 3].foos[y].a == 50);\n\n assert(foo_parents[1].foos[1].b == [5, 6, 21]);\n if y == 2 {\n foo_parents[y - 2].foos[y - 2].b = [10, 9, 8];\n } else {\n foo_parents[y - 2].foos[y - 2].b = [20, 19, 18];\n }\n assert(foo_parents[1].foos[1].b == [20, 19, 18]);\n\n assert(foo_parents[1].foos[1].b[2] == 18);\n if y == 3 {\n foo_parents[y - 2].foos[y - 2].b[y - 1] = 5000;\n } else {\n foo_parents[y - 2].foos[y - 2].b[y - 1] = 1000;\n }\n assert(foo_parents[1].foos[1].b[2] == 5000);\n // Set a dynamic array value\n foo_parents[y - 2].foos[y - 3].b = foo_parents[y - 2].foos[y - 2].b;\n assert(foo_parents[1].foos[0].b == [20, 19, 5000]);\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index fdf6b844ae1..ca85221a540 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -94,9 +94,9 @@ expression: artifact "return value indices : []", "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 }]), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(28))], q_c: 0 })], outputs: []", "unconstrained func 0", - "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32867 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 29 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32838), size_address: Relative(3), offset_address: Relative(4) }, Cast { destination: Direct(32866), source: Direct(32866), bit_size: Integer(U32) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32838 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 13 }, 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) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 7 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 11 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 14 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 15 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 18 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 8 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 21 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 22 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 25 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 11 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Mov { destination: Relative(1), source: Relative(3) }, Mov { destination: Relative(2), source: Direct(32866) }, Call { location: 176 }, Call { location: 180 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32867 }, 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: 175 }, 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: 168 }, Return, Const { destination: Direct(32835), bit_size: Integer(U1), value: 1 }, Const { destination: Direct(32836), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(32837), bit_size: Integer(U32), value: 3 }, Return, Call { location: 599 }, 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) }, BinaryIntOp { destination: Relative(4), op: Sub, bit_size: U32, lhs: Relative(2), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U32, lhs: Direct(32837), rhs: Relative(2) }, JumpIf { condition: Relative(5), location: 188 }, Call { location: 605 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(5) }, JumpIf { condition: Relative(6), location: 192 }, Call { location: 608 }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, 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(6) }, Load { destination: Relative(4), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32836) }, 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) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(7) }, 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(6), source_pointer: Relative(11) }, 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: 211 }, Call { location: 611 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(9) }, Load { destination: Relative(9), 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(9) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 219 }, Call { location: 611 }, 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: Field, value: 1 }, BinaryFieldOp { destination: Relative(12), op: Equals, lhs: Relative(4), rhs: Relative(9) }, JumpIf { condition: Relative(12), location: 226 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(13) } }, Load { destination: Relative(4), source_pointer: Relative(8) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(4) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 232 }, Call { location: 611 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(4) }, Load { destination: Relative(4), 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(4) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 240 }, Call { location: 611 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(4) }, Const { destination: Relative(4), bit_size: Field, value: 2 }, Const { destination: Relative(6), bit_size: Field, value: 3 }, Const { destination: Relative(13), bit_size: Field, value: 20 }, 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(6) }, 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(6), 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(14) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 614 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(16) }, JumpIf { condition: Relative(4), location: 267 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(6) } }, BinaryIntOp { destination: Relative(4), op: Sub, bit_size: U32, lhs: Relative(2), rhs: Relative(7) }, BinaryIntOp { destination: Relative(6), op: LessThanEquals, bit_size: U32, lhs: Relative(7), rhs: Relative(2) }, JumpIf { condition: Relative(6), location: 271 }, Call { location: 605 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(5) }, JumpIf { condition: Relative(6), location: 274 }, Call { location: 608 }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(6) }, Load { destination: Relative(4), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32836) }, 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(13), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(7) }, 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(6), source_pointer: Relative(15) }, Load { destination: Relative(8), source_pointer: Relative(13) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(15), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(8) }, Not { destination: Relative(15), source: Relative(15), bit_size: U1 }, JumpIf { condition: Relative(15), location: 292 }, Call { location: 611 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(8) }, Load { destination: Relative(8), 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(8) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 300 }, Call { location: 611 }, 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(8), bit_size: Field, value: 4 }, BinaryFieldOp { destination: Relative(16), op: Equals, lhs: Relative(4), rhs: Relative(8) }, JumpIf { condition: Relative(16), location: 307 }, Const { destination: Relative(17), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(17) } }, Load { destination: Relative(4), source_pointer: Relative(13) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(4) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 313 }, Call { location: 611 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(6) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(17), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(4) }, Not { destination: Relative(17), source: Relative(17), bit_size: U1 }, JumpIf { condition: Relative(17), location: 321 }, Call { location: 611 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(4) }, Const { destination: Relative(4), bit_size: Field, value: 5 }, Const { destination: Relative(6), bit_size: Field, value: 6 }, Const { destination: Relative(17), bit_size: Field, value: 21 }, Mov { destination: Relative(18), 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(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(4) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Relative(6) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Relative(17) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 19 }, Mov { destination: Relative(19), source: Direct(0) }, Mov { destination: Relative(20), source: Relative(13) }, Mov { destination: Relative(21), source: Relative(18) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 614 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(20) }, JumpIf { condition: Relative(4), location: 348 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(6) } }, BinaryIntOp { destination: Relative(4), op: Sub, bit_size: U32, lhs: Relative(2), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(6), op: LessThanEquals, bit_size: U32, lhs: Direct(32836), rhs: Relative(2) }, JumpIf { condition: Relative(6), location: 352 }, Call { location: 605 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(5) }, JumpIf { condition: Relative(6), location: 355 }, Call { location: 608 }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(6) }, Load { destination: Relative(4), source_pointer: Relative(17) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(13) }, Load { destination: Relative(17), source_pointer: Relative(19) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(7) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(13) }, Load { destination: Relative(6), source_pointer: Relative(19) }, Load { destination: Relative(13), source_pointer: Relative(17) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(19), op: Equals, bit_size: U32, lhs: Relative(18), rhs: Relative(13) }, Not { destination: Relative(19), source: Relative(19), bit_size: U1 }, JumpIf { condition: Relative(19), location: 373 }, Call { location: 611 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(13) }, Load { destination: Relative(13), source_pointer: Relative(6) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(20), op: Equals, bit_size: U32, lhs: Relative(19), rhs: Relative(13) }, Not { destination: Relative(20), source: Relative(20), bit_size: U1 }, JumpIf { condition: Relative(20), location: 381 }, Call { location: 611 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(13) }, Const { destination: Relative(13), bit_size: Field, value: 7 }, BinaryFieldOp { destination: Relative(20), op: Equals, lhs: Relative(4), rhs: Relative(13) }, JumpIf { condition: Relative(20), location: 388 }, Const { destination: Relative(21), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(21) } }, Load { destination: Relative(4), source_pointer: Relative(17) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(20), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(4) }, Not { destination: Relative(20), source: Relative(20), bit_size: U1 }, JumpIf { condition: Relative(20), location: 394 }, Call { location: 611 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(6) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(21), op: Equals, bit_size: U32, lhs: Relative(20), rhs: Relative(4) }, Not { destination: Relative(21), source: Relative(21), bit_size: U1 }, JumpIf { condition: Relative(21), location: 402 }, Call { location: 611 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(4) }, Const { destination: Relative(4), bit_size: Field, value: 8 }, Const { destination: Relative(6), bit_size: Field, value: 9 }, Const { destination: Relative(21), bit_size: Field, value: 22 }, Mov { destination: Relative(22), source: Direct(1) }, Const { destination: Relative(23), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(23) }, IndirectConst { destination_pointer: Relative(22), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Mov { destination: Relative(24), source: Relative(23) }, Store { destination_pointer: Relative(24), source: Relative(4) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(24), rhs: Direct(2) }, Store { destination_pointer: Relative(24), source: Relative(6) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(24), rhs: Direct(2) }, Store { destination_pointer: Relative(24), source: Relative(21) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 23 }, Mov { destination: Relative(23), source: Direct(0) }, Mov { destination: Relative(24), source: Relative(17) }, Mov { destination: Relative(25), source: Relative(22) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 614 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(24) }, JumpIf { condition: Relative(4), location: 429 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(6) } }, BinaryIntOp { destination: Relative(4), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, JumpIf { condition: Relative(4), location: 432 }, Call { location: 608 }, BinaryIntOp { destination: Relative(4), op: Mul, bit_size: U32, lhs: Relative(2), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(4) }, Load { destination: Relative(5), source_pointer: Relative(17) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(6) }, Load { destination: Relative(17), source_pointer: Relative(22) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(7) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(1), 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) }, Load { destination: Relative(21), source_pointer: Relative(17) }, Const { destination: Relative(23), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(24), op: Equals, bit_size: U32, lhs: Relative(23), rhs: Relative(21) }, Not { destination: Relative(24), source: Relative(24), bit_size: U1 }, JumpIf { condition: Relative(24), location: 450 }, Call { location: 611 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(21) }, Load { destination: Relative(21), source_pointer: Relative(22) }, Const { destination: Relative(24), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(25), op: Equals, bit_size: U32, lhs: Relative(24), rhs: Relative(21) }, Not { destination: Relative(25), source: Relative(25), bit_size: U1 }, JumpIf { condition: Relative(25), location: 458 }, Call { location: 611 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(21) }, Const { destination: Relative(21), bit_size: Field, value: 10 }, BinaryFieldOp { destination: Relative(25), op: Equals, lhs: Relative(5), rhs: Relative(21) }, JumpIf { condition: Relative(25), location: 465 }, Const { destination: Relative(26), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(26) } }, Load { destination: Relative(5), source_pointer: Relative(17) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(25), op: Equals, bit_size: U32, lhs: Relative(21), rhs: Relative(5) }, Not { destination: Relative(25), source: Relative(25), bit_size: U1 }, JumpIf { condition: Relative(25), location: 471 }, Call { location: 611 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(5) }, Load { destination: Relative(5), source_pointer: Relative(22) }, Const { destination: Relative(25), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(26), op: Equals, bit_size: U32, lhs: Relative(25), rhs: Relative(5) }, Not { destination: Relative(26), source: Relative(26), bit_size: U1 }, JumpIf { condition: Relative(26), location: 479 }, Call { location: 611 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(5) }, Const { destination: Relative(5), bit_size: Field, value: 11 }, Const { destination: Relative(26), bit_size: Field, value: 12 }, Const { destination: Relative(27), bit_size: Field, value: 23 }, Mov { destination: Relative(28), 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(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(5) }, BinaryIntOp { destination: Relative(30), op: Add, bit_size: U32, lhs: Relative(30), rhs: Direct(2) }, Store { destination_pointer: Relative(30), source: Relative(26) }, BinaryIntOp { destination: Relative(30), op: Add, bit_size: U32, lhs: Relative(30), rhs: Direct(2) }, Store { destination_pointer: Relative(30), source: Relative(27) }, Const { destination: Relative(26), bit_size: Integer(U32), value: 29 }, Mov { destination: Relative(29), source: Direct(0) }, Mov { destination: Relative(30), source: Relative(17) }, Mov { destination: Relative(31), source: Relative(28) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(26) }, Call { location: 614 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(5), source: Relative(30) }, JumpIf { condition: Relative(5), location: 506 }, Const { destination: Relative(26), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(26) } }, Load { destination: Relative(5), source_pointer: Relative(17) }, Const { destination: Relative(26), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(27), op: Equals, bit_size: U32, lhs: Relative(26), rhs: Relative(5) }, Not { destination: Relative(27), source: Relative(27), bit_size: U1 }, JumpIf { condition: Relative(27), location: 512 }, Call { location: 611 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(5) }, Load { destination: Relative(5), source_pointer: Relative(22) }, Const { destination: Relative(27), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(28), op: Equals, bit_size: U32, lhs: Relative(27), rhs: Relative(5) }, Not { destination: Relative(28), source: Relative(28), bit_size: U1 }, JumpIf { condition: Relative(28), location: 520 }, Call { location: 611 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(5) }, Const { destination: Relative(5), bit_size: Field, value: 109 }, Const { destination: Relative(28), bit_size: Field, value: 110 }, Const { destination: Relative(29), bit_size: Field, value: 111 }, Mov { destination: Relative(30), source: Direct(1) }, Const { destination: Relative(31), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(31) }, IndirectConst { destination_pointer: Relative(30), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(30), rhs: Direct(2) }, Mov { destination: Relative(32), source: Relative(31) }, Store { destination_pointer: Relative(32), source: Relative(5) }, BinaryIntOp { destination: Relative(32), op: Add, bit_size: U32, lhs: Relative(32), rhs: Direct(2) }, Store { destination_pointer: Relative(32), source: Relative(28) }, BinaryIntOp { destination: Relative(32), op: Add, bit_size: U32, lhs: Relative(32), rhs: Direct(2) }, Store { destination_pointer: Relative(32), source: Relative(29) }, Const { destination: Relative(28), bit_size: Integer(U32), value: 31 }, Mov { destination: Relative(31), source: Direct(0) }, Mov { destination: Relative(32), source: Relative(22) }, Mov { destination: Relative(33), source: Relative(30) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(28) }, Call { location: 614 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(5), source: Relative(32) }, JumpIf { condition: Relative(5), location: 547 }, Const { destination: Relative(28), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(28) } }, BinaryIntOp { destination: Relative(5), op: Equals, bit_size: U32, lhs: Relative(2), rhs: Relative(7) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32836) }, JumpIf { condition: Relative(5), location: 575 }, Jump { location: 551 }, Const { destination: Relative(5), bit_size: Field, value: 50 }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 647 }, 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(5) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 647 }, Mov { destination: Relative(1), source: Direct(32773) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(6) }, Store { destination_pointer: Relative(5), source: Relative(17) }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 647 }, Mov { destination: Relative(4), source: Direct(32773) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(2) }, Store { destination_pointer: Relative(6), source: Relative(22) }, Store { destination_pointer: Relative(3), source: Relative(4) }, Jump { location: 599 }, Const { destination: Relative(5), bit_size: Field, value: 100 }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 647 }, 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(5) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 647 }, Mov { destination: Relative(1), source: Direct(32773) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(6) }, Store { destination_pointer: Relative(5), source: Relative(17) }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 647 }, Mov { destination: Relative(4), source: Direct(32773) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(2) }, Store { destination_pointer: Relative(6), source: Relative(22) }, Store { destination_pointer: Relative(3), source: Relative(4) }, Jump { location: 599 }, 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: 604 }, 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: 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, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 599 }, 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: 624 }, Call { location: 611 }, 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 }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 629 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32837) }, JumpIf { condition: Relative(5), location: 634 }, Jump { location: 632 }, 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(32836) }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 629 }, 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: 651 }, Jump { location: 653 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 668 }, 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: 665 }, 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: 658 }, 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: 668 }, Return]" + "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32867 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 29 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32838), size_address: Relative(3), offset_address: Relative(4) }, Cast { destination: Direct(32866), source: Direct(32866), bit_size: Integer(U32) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32838 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 13 }, 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) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 7 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 11 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 14 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 15 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 18 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 8 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 21 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 22 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 25 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 11 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Mov { destination: Relative(1), source: Relative(3) }, Mov { destination: Relative(2), source: Direct(32866) }, Call { location: 176 }, Call { location: 180 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32867 }, 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: 175 }, 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: 168 }, Return, Const { destination: Direct(32835), bit_size: Integer(U1), value: 1 }, Const { destination: Direct(32836), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(32837), bit_size: Integer(U32), value: 3 }, Return, Call { location: 1781 }, 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) }, BinaryIntOp { destination: Relative(4), op: Sub, bit_size: U32, lhs: Relative(2), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U32, lhs: Direct(32837), rhs: Relative(2) }, JumpIf { condition: Relative(5), location: 188 }, Call { location: 1787 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(5) }, JumpIf { condition: Relative(6), location: 192 }, Call { location: 1790 }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, 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(32836) }, 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) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(10) }, 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(6), source_pointer: Relative(13) }, Load { destination: Relative(12), 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(12) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 211 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(12) }, Load { destination: Relative(12), source_pointer: Relative(6) }, 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: 219 }, Call { location: 1793 }, 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(12), bit_size: Field, value: 1 }, BinaryFieldOp { destination: Relative(15), op: Equals, lhs: Relative(7), rhs: Relative(12) }, JumpIf { condition: Relative(15), location: 226 }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(16) } }, Load { destination: Relative(7), 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(7) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 232 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(7) }, Load { destination: Relative(7), source_pointer: Relative(6) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(17), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(7) }, Not { destination: Relative(17), source: Relative(17), bit_size: U1 }, JumpIf { condition: Relative(17), location: 240 }, Call { location: 1793 }, 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: Field, value: 2 }, Const { destination: Relative(7), bit_size: Field, value: 3 }, Const { destination: Relative(17), bit_size: Field, value: 20 }, Mov { destination: Relative(18), 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(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(6) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Relative(7) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Relative(17) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 21 }, Mov { destination: Relative(21), source: Direct(0) }, Mov { destination: Relative(22), source: Relative(9) }, Mov { destination: Relative(23), source: Relative(18) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(20) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(19), source: Relative(22) }, JumpIf { condition: Relative(19), location: 267 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(9) } }, BinaryIntOp { destination: Relative(9), op: Sub, bit_size: U32, lhs: Relative(2), rhs: Relative(10) }, BinaryIntOp { destination: Relative(19), op: LessThanEquals, bit_size: U32, lhs: Relative(10), rhs: Relative(2) }, JumpIf { condition: Relative(19), location: 271 }, Call { location: 1787 }, BinaryIntOp { destination: Relative(19), op: LessThan, bit_size: U32, lhs: Relative(9), rhs: Relative(5) }, JumpIf { condition: Relative(19), location: 274 }, Call { location: 1790 }, BinaryIntOp { destination: Relative(19), op: Mul, bit_size: U32, lhs: Relative(9), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(1), 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(32836) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(1), 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: Relative(10) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(23) }, Load { destination: Relative(19), source_pointer: Relative(25) }, Load { destination: Relative(24), source_pointer: Relative(22) }, Const { destination: Relative(25), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(26), op: Equals, bit_size: U32, lhs: Relative(25), rhs: Relative(24) }, Not { destination: Relative(26), source: Relative(26), bit_size: U1 }, JumpIf { condition: Relative(26), location: 292 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(24), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(24) }, Load { destination: Relative(24), source_pointer: Relative(19) }, Const { destination: Relative(26), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(27), op: Equals, bit_size: U32, lhs: Relative(26), rhs: Relative(24) }, Not { destination: Relative(27), source: Relative(27), bit_size: U1 }, JumpIf { condition: Relative(27), location: 300 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(24), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(24) }, Const { destination: Relative(24), bit_size: Field, value: 4 }, BinaryFieldOp { destination: Relative(27), op: Equals, lhs: Relative(20), rhs: Relative(24) }, JumpIf { condition: Relative(27), location: 307 }, Const { destination: Relative(28), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(28) } }, Load { destination: Relative(20), source_pointer: Relative(22) }, Const { destination: Relative(27), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(28), op: Equals, bit_size: U32, lhs: Relative(27), rhs: Relative(20) }, Not { destination: Relative(28), source: Relative(28), bit_size: U1 }, JumpIf { condition: Relative(28), location: 313 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(20) }, Load { destination: Relative(20), source_pointer: Relative(19) }, Const { destination: Relative(28), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(29), op: Equals, bit_size: U32, lhs: Relative(28), rhs: Relative(20) }, Not { destination: Relative(29), source: Relative(29), bit_size: U1 }, JumpIf { condition: Relative(29), location: 321 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(20) }, Const { destination: Relative(19), bit_size: Field, value: 5 }, Const { destination: Relative(20), bit_size: Field, value: 6 }, Const { destination: Relative(29), bit_size: Field, value: 21 }, Mov { destination: Relative(30), source: Direct(1) }, Const { destination: Relative(31), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(31) }, IndirectConst { destination_pointer: Relative(30), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(30), rhs: Direct(2) }, Mov { destination: Relative(32), source: Relative(31) }, Store { destination_pointer: Relative(32), source: Relative(19) }, BinaryIntOp { destination: Relative(32), op: Add, bit_size: U32, lhs: Relative(32), rhs: Direct(2) }, Store { destination_pointer: Relative(32), source: Relative(20) }, BinaryIntOp { destination: Relative(32), op: Add, bit_size: U32, lhs: Relative(32), rhs: Direct(2) }, Store { destination_pointer: Relative(32), source: Relative(29) }, Const { destination: Relative(29), bit_size: Integer(U32), value: 31 }, Mov { destination: Relative(31), source: Direct(0) }, Mov { destination: Relative(32), source: Relative(22) }, Mov { destination: Relative(33), source: Relative(30) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(29) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(20), source: Relative(32) }, JumpIf { condition: Relative(20), location: 348 }, Const { destination: Relative(22), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(22) } }, BinaryIntOp { destination: Relative(20), op: Sub, bit_size: U32, lhs: Relative(2), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(22), op: LessThanEquals, bit_size: U32, lhs: Direct(32836), rhs: Relative(2) }, JumpIf { condition: Relative(22), location: 352 }, Call { location: 1787 }, BinaryIntOp { destination: Relative(22), op: LessThan, bit_size: U32, lhs: Relative(20), rhs: Relative(5) }, JumpIf { condition: Relative(22), location: 355 }, Call { location: 1790 }, BinaryIntOp { destination: Relative(22), op: Mul, bit_size: U32, lhs: Relative(20), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(32), op: Add, bit_size: U32, lhs: Relative(31), rhs: Relative(22) }, Load { destination: Relative(29), source_pointer: Relative(32) }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(33), op: Add, bit_size: U32, lhs: Relative(1), 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) }, BinaryIntOp { destination: Relative(33), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(10) }, BinaryIntOp { destination: Relative(34), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(35), op: Add, bit_size: U32, lhs: Relative(34), rhs: Relative(33) }, Load { destination: Relative(22), source_pointer: Relative(35) }, Load { destination: Relative(34), source_pointer: Relative(32) }, Const { destination: Relative(35), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(36), op: Equals, bit_size: U32, lhs: Relative(35), rhs: Relative(34) }, Not { destination: Relative(36), source: Relative(36), bit_size: U1 }, JumpIf { condition: Relative(36), location: 373 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(34), op: Add, bit_size: U32, lhs: Relative(34), rhs: Direct(2) }, Store { destination_pointer: Relative(32), source: Relative(34) }, Load { destination: Relative(34), source_pointer: Relative(22) }, Const { destination: Relative(36), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(37), op: Equals, bit_size: U32, lhs: Relative(36), rhs: Relative(34) }, Not { destination: Relative(37), source: Relative(37), bit_size: U1 }, JumpIf { condition: Relative(37), location: 381 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(34), op: Add, bit_size: U32, lhs: Relative(34), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(34) }, Const { destination: Relative(34), bit_size: Field, value: 7 }, BinaryFieldOp { destination: Relative(37), op: Equals, lhs: Relative(29), rhs: Relative(34) }, JumpIf { condition: Relative(37), location: 388 }, Const { destination: Relative(38), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(38) } }, Load { destination: Relative(29), source_pointer: Relative(32) }, Const { destination: Relative(34), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(37), op: Equals, bit_size: U32, lhs: Relative(34), rhs: Relative(29) }, Not { destination: Relative(37), source: Relative(37), bit_size: U1 }, JumpIf { condition: Relative(37), location: 394 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(29), rhs: Direct(2) }, Store { destination_pointer: Relative(32), source: Relative(29) }, Load { destination: Relative(29), source_pointer: Relative(22) }, Const { destination: Relative(37), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(38), op: Equals, bit_size: U32, lhs: Relative(37), rhs: Relative(29) }, Not { destination: Relative(38), source: Relative(38), bit_size: U1 }, JumpIf { condition: Relative(38), location: 402 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(29), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(29) }, Const { destination: Relative(22), bit_size: Field, value: 8 }, Const { destination: Relative(29), bit_size: Field, value: 9 }, Const { destination: Relative(38), bit_size: Field, value: 22 }, Mov { destination: Relative(39), source: Direct(1) }, Const { destination: Relative(40), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(40) }, IndirectConst { destination_pointer: Relative(39), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(40), op: Add, bit_size: U32, lhs: Relative(39), rhs: Direct(2) }, Mov { destination: Relative(41), source: Relative(40) }, Store { destination_pointer: Relative(41), source: Relative(22) }, BinaryIntOp { destination: Relative(41), op: Add, bit_size: U32, lhs: Relative(41), rhs: Direct(2) }, Store { destination_pointer: Relative(41), source: Relative(29) }, BinaryIntOp { destination: Relative(41), op: Add, bit_size: U32, lhs: Relative(41), rhs: Direct(2) }, Store { destination_pointer: Relative(41), source: Relative(38) }, Const { destination: Relative(40), bit_size: Integer(U32), value: 41 }, Mov { destination: Relative(41), source: Direct(0) }, Mov { destination: Relative(42), source: Relative(32) }, Mov { destination: Relative(43), source: Relative(39) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(40) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(38), source: Relative(42) }, JumpIf { condition: Relative(38), location: 429 }, Const { destination: Relative(32), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(32) } }, BinaryIntOp { destination: Relative(32), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, JumpIf { condition: Relative(32), location: 432 }, Call { location: 1790 }, BinaryIntOp { destination: Relative(32), op: Mul, bit_size: U32, lhs: Relative(2), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(39), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(40), op: Add, bit_size: U32, lhs: Relative(39), rhs: Relative(32) }, Load { destination: Relative(38), source_pointer: Relative(40) }, BinaryIntOp { destination: Relative(39), op: Add, bit_size: U32, lhs: Relative(32), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(41), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(42), op: Add, bit_size: U32, lhs: Relative(41), rhs: Relative(39) }, Load { destination: Relative(40), source_pointer: Relative(42) }, BinaryIntOp { destination: Relative(41), op: Add, bit_size: U32, lhs: Relative(32), rhs: Relative(10) }, BinaryIntOp { destination: Relative(43), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(44), op: Add, bit_size: U32, lhs: Relative(43), rhs: Relative(41) }, Load { destination: Relative(42), source_pointer: Relative(44) }, Load { destination: Relative(43), source_pointer: Relative(40) }, Const { destination: Relative(44), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(45), op: Equals, bit_size: U32, lhs: Relative(44), rhs: Relative(43) }, Not { destination: Relative(45), source: Relative(45), bit_size: U1 }, JumpIf { condition: Relative(45), location: 450 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(43), op: Add, bit_size: U32, lhs: Relative(43), rhs: Direct(2) }, Store { destination_pointer: Relative(40), source: Relative(43) }, Load { destination: Relative(43), source_pointer: Relative(42) }, Const { destination: Relative(45), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(46), op: Equals, bit_size: U32, lhs: Relative(45), rhs: Relative(43) }, Not { destination: Relative(46), source: Relative(46), bit_size: U1 }, JumpIf { condition: Relative(46), location: 458 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(43), op: Add, bit_size: U32, lhs: Relative(43), rhs: Direct(2) }, Store { destination_pointer: Relative(42), source: Relative(43) }, Const { destination: Relative(43), bit_size: Field, value: 10 }, BinaryFieldOp { destination: Relative(46), op: Equals, lhs: Relative(38), rhs: Relative(43) }, JumpIf { condition: Relative(46), location: 465 }, Const { destination: Relative(47), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(47) } }, Load { destination: Relative(38), source_pointer: Relative(40) }, Const { destination: Relative(46), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(47), op: Equals, bit_size: U32, lhs: Relative(46), rhs: Relative(38) }, Not { destination: Relative(47), source: Relative(47), bit_size: U1 }, JumpIf { condition: Relative(47), location: 471 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(38), op: Add, bit_size: U32, lhs: Relative(38), rhs: Direct(2) }, Store { destination_pointer: Relative(40), source: Relative(38) }, Load { destination: Relative(38), source_pointer: Relative(42) }, Const { destination: Relative(47), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(48), op: Equals, bit_size: U32, lhs: Relative(47), rhs: Relative(38) }, Not { destination: Relative(48), source: Relative(48), bit_size: U1 }, JumpIf { condition: Relative(48), location: 479 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(38), op: Add, bit_size: U32, lhs: Relative(38), rhs: Direct(2) }, Store { destination_pointer: Relative(42), source: Relative(38) }, Const { destination: Relative(38), bit_size: Field, value: 11 }, Const { destination: Relative(48), bit_size: Field, value: 12 }, Const { destination: Relative(49), bit_size: Field, value: 23 }, Mov { destination: Relative(50), source: Direct(1) }, Const { destination: Relative(51), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(51) }, IndirectConst { destination_pointer: Relative(50), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(51), op: Add, bit_size: U32, lhs: Relative(50), rhs: Direct(2) }, Mov { destination: Relative(52), source: Relative(51) }, Store { destination_pointer: Relative(52), source: Relative(38) }, BinaryIntOp { destination: Relative(52), op: Add, bit_size: U32, lhs: Relative(52), rhs: Direct(2) }, Store { destination_pointer: Relative(52), source: Relative(48) }, BinaryIntOp { destination: Relative(52), op: Add, bit_size: U32, lhs: Relative(52), rhs: Direct(2) }, Store { destination_pointer: Relative(52), source: Relative(49) }, Const { destination: Relative(48), bit_size: Integer(U32), value: 51 }, Mov { destination: Relative(51), source: Direct(0) }, Mov { destination: Relative(52), source: Relative(40) }, Mov { destination: Relative(53), source: Relative(50) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(48) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(38), source: Relative(52) }, JumpIf { condition: Relative(38), location: 506 }, Const { destination: Relative(48), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(48) } }, Load { destination: Relative(38), source_pointer: Relative(40) }, Const { destination: Relative(48), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(49), op: Equals, bit_size: U32, lhs: Relative(48), rhs: Relative(38) }, Not { destination: Relative(49), source: Relative(49), bit_size: U1 }, JumpIf { condition: Relative(49), location: 512 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(38), op: Add, bit_size: U32, lhs: Relative(38), rhs: Direct(2) }, Store { destination_pointer: Relative(40), source: Relative(38) }, Load { destination: Relative(38), source_pointer: Relative(42) }, Const { destination: Relative(49), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(51), op: Equals, bit_size: U32, lhs: Relative(49), rhs: Relative(38) }, Not { destination: Relative(51), source: Relative(51), bit_size: U1 }, JumpIf { condition: Relative(51), location: 520 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(38), op: Add, bit_size: U32, lhs: Relative(38), rhs: Direct(2) }, Store { destination_pointer: Relative(42), source: Relative(38) }, Const { destination: Relative(38), bit_size: Field, value: 109 }, Const { destination: Relative(51), bit_size: Field, value: 110 }, Const { destination: Relative(52), bit_size: Field, value: 111 }, Mov { destination: Relative(53), source: Direct(1) }, Const { destination: Relative(54), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(54) }, IndirectConst { destination_pointer: Relative(53), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(54), op: Add, bit_size: U32, lhs: Relative(53), rhs: Direct(2) }, Mov { destination: Relative(55), source: Relative(54) }, Store { destination_pointer: Relative(55), source: Relative(38) }, BinaryIntOp { destination: Relative(55), op: Add, bit_size: U32, lhs: Relative(55), rhs: Direct(2) }, Store { destination_pointer: Relative(55), source: Relative(51) }, BinaryIntOp { destination: Relative(55), op: Add, bit_size: U32, lhs: Relative(55), rhs: Direct(2) }, Store { destination_pointer: Relative(55), source: Relative(52) }, Const { destination: Relative(51), bit_size: Integer(U32), value: 54 }, Mov { destination: Relative(54), source: Direct(0) }, Mov { destination: Relative(55), source: Relative(42) }, Mov { destination: Relative(56), source: Relative(53) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(51) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(38), source: Relative(55) }, JumpIf { condition: Relative(38), location: 547 }, Const { destination: Relative(51), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(51) } }, BinaryIntOp { destination: Relative(38), op: Equals, bit_size: U32, lhs: Relative(2), rhs: Relative(10) }, BinaryIntOp { destination: Relative(51), op: Add, bit_size: U32, lhs: Relative(39), rhs: Direct(32836) }, Const { destination: Relative(52), bit_size: Field, value: 100 }, Const { destination: Relative(54), bit_size: Field, value: 50 }, JumpIf { condition: Relative(38), location: 576 }, Jump { location: 553 }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, 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(32) }, Store { destination_pointer: Relative(15), source: Relative(54) }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, Mov { destination: Relative(1), source: Direct(32773) }, 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(39) }, Store { destination_pointer: Relative(15), source: Relative(40) }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, 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(51) }, Store { destination_pointer: Relative(15), source: Relative(42) }, Store { destination_pointer: Relative(3), source: Relative(13) }, Jump { location: 599 }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, 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(32) }, Store { destination_pointer: Relative(15), source: Relative(52) }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, Mov { destination: Relative(1), source: Direct(32773) }, 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(39) }, Store { destination_pointer: Relative(15), source: Relative(40) }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, 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(51) }, Store { destination_pointer: Relative(15), source: Relative(42) }, Store { destination_pointer: Relative(3), source: Relative(13) }, Jump { location: 599 }, Load { destination: Relative(1), source_pointer: Relative(3) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(13) }, Load { destination: Relative(14), source_pointer: Relative(15) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 11 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(16) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 12 }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(13) }, Load { destination: Relative(16), source_pointer: Relative(25) }, Load { destination: Relative(1), source_pointer: Relative(15) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(25), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(1) }, Not { destination: Relative(25), source: Relative(25), bit_size: U1 }, JumpIf { condition: Relative(25), location: 615 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(1) }, Load { destination: Relative(1), source_pointer: Relative(16) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(25), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(1) }, Not { destination: Relative(25), source: Relative(25), bit_size: U1 }, JumpIf { condition: Relative(25), location: 623 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(1) }, BinaryFieldOp { destination: Relative(1), op: Equals, lhs: Relative(14), rhs: Relative(54) }, JumpIf { condition: Relative(1), location: 629 }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(16) } }, Const { destination: Relative(1), bit_size: Field, value: 101 }, Const { destination: Relative(14), bit_size: Field, value: 102 }, Mov { destination: Relative(16), source: Direct(1) }, Const { destination: Relative(25), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(25) }, IndirectConst { destination_pointer: Relative(16), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Mov { destination: Relative(26), source: Relative(25) }, Store { destination_pointer: Relative(26), source: Relative(52) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(26), rhs: Direct(2) }, Store { destination_pointer: Relative(26), source: Relative(1) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(26), rhs: Direct(2) }, Store { destination_pointer: Relative(26), source: Relative(14) }, Load { destination: Relative(1), source_pointer: Relative(16) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(25), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(1) }, Not { destination: Relative(25), source: Relative(25), bit_size: U1 }, JumpIf { condition: Relative(25), location: 648 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(1) }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(31), rhs: Direct(32836) }, JumpIf { condition: Relative(38), location: 681 }, Jump { location: 653 }, Load { destination: Relative(13), source_pointer: Relative(16) }, 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: 659 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(13) }, Load { destination: Relative(13), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Relative(33) }, Load { destination: Relative(15), source_pointer: Relative(26) }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, 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(31) }, Store { destination_pointer: Relative(27), source: Relative(16) }, Mov { destination: Direct(32771), source: Relative(25) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, Mov { destination: Relative(13), source: Direct(32773) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(26), rhs: Relative(1) }, Store { destination_pointer: Relative(27), source: Relative(15) }, Store { destination_pointer: Relative(3), source: Relative(13) }, Jump { location: 715 }, Const { destination: Relative(1), bit_size: Field, value: 51 }, Const { destination: Relative(13), bit_size: Field, value: 52 }, 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(25), source: Relative(15) }, Store { destination_pointer: Relative(25), source: Relative(54) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, Store { destination_pointer: Relative(25), source: Relative(1) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, Store { destination_pointer: Relative(25), source: Relative(13) }, Load { destination: Relative(1), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(33) }, Load { destination: Relative(13), source_pointer: Relative(25) }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Relative(31) }, Store { destination_pointer: Relative(26), source: Relative(14) }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(31), rhs: Direct(32836) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, Mov { destination: Relative(14), source: Direct(32773) }, 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(1) }, Store { destination_pointer: Relative(26), source: Relative(13) }, Store { destination_pointer: Relative(3), source: Relative(14) }, Jump { location: 715 }, Load { destination: Relative(1), source_pointer: Relative(3) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 8 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Load { destination: Relative(13), source_pointer: Relative(14) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Load { destination: Relative(14), source_pointer: Relative(15) }, Load { destination: Relative(3), source_pointer: Relative(13) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(25), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(3) }, Not { destination: Relative(25), source: Relative(25), bit_size: U1 }, JumpIf { condition: Relative(25), location: 728 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(3) }, Load { destination: Relative(3), source_pointer: Relative(14) }, Const { destination: Relative(25), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(26), op: Equals, bit_size: U32, lhs: Relative(25), rhs: Relative(3) }, Not { destination: Relative(26), source: Relative(26), bit_size: U1 }, JumpIf { condition: Relative(26), location: 736 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(3) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 55 }, Mov { destination: Relative(55), source: Direct(0) }, Mov { destination: Relative(56), source: Relative(13) }, Mov { destination: Relative(57), source: Relative(16) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(14) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(3), source: Relative(56) }, JumpIf { condition: Relative(3), location: 749 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(13) } }, 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(8) }, Load { destination: Relative(3), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(11) }, Load { destination: Relative(13), source_pointer: Relative(26) }, Load { destination: Relative(14), source_pointer: Relative(3) }, Const { destination: Relative(26), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(27), op: Equals, bit_size: U32, lhs: Relative(26), rhs: Relative(14) }, Not { destination: Relative(27), source: Relative(27), bit_size: U1 }, JumpIf { condition: Relative(27), location: 761 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(14) }, Load { destination: Relative(3), source_pointer: Relative(13) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(27), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(3) }, Not { destination: Relative(27), source: Relative(27), bit_size: U1 }, JumpIf { condition: Relative(27), location: 769 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(3) }, Const { destination: Relative(27), bit_size: Integer(U32), value: 55 }, Mov { destination: Relative(55), source: Direct(0) }, Mov { destination: Relative(56), source: Relative(13) }, Mov { destination: Relative(57), source: Relative(16) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(27) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(3), source: Relative(56) }, JumpIf { condition: Relative(3), location: 782 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(13) } }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(21) }, Load { destination: Relative(3), source_pointer: Relative(27) }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(28), op: Add, bit_size: U32, lhs: Relative(27), rhs: Relative(23) }, Load { destination: Relative(13), source_pointer: Relative(28) }, Load { destination: Relative(27), source_pointer: Relative(3) }, Const { destination: Relative(28), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(34), op: Equals, bit_size: U32, lhs: Relative(28), rhs: Relative(27) }, Not { destination: Relative(34), source: Relative(34), bit_size: U1 }, JumpIf { condition: Relative(34), location: 794 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(27), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(27) }, Load { destination: Relative(3), source_pointer: Relative(13) }, Const { destination: Relative(27), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(34), op: Equals, bit_size: U32, lhs: Relative(27), rhs: Relative(3) }, Not { destination: Relative(34), source: Relative(34), bit_size: U1 }, JumpIf { condition: Relative(34), location: 802 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(3) }, Const { destination: Relative(3), bit_size: Field, value: 103 }, Const { destination: Relative(34), bit_size: Field, value: 104 }, Const { destination: Relative(35), bit_size: Field, value: 105 }, Mov { destination: Relative(36), source: Direct(1) }, Const { destination: Relative(37), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(37) }, IndirectConst { destination_pointer: Relative(36), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(37), op: Add, bit_size: U32, lhs: Relative(36), rhs: Direct(2) }, Mov { destination: Relative(40), source: Relative(37) }, Store { destination_pointer: Relative(40), source: Relative(3) }, BinaryIntOp { destination: Relative(40), op: Add, bit_size: U32, lhs: Relative(40), rhs: Direct(2) }, Store { destination_pointer: Relative(40), source: Relative(34) }, BinaryIntOp { destination: Relative(40), op: Add, bit_size: U32, lhs: Relative(40), rhs: Direct(2) }, Store { destination_pointer: Relative(40), source: Relative(35) }, Const { destination: Relative(34), bit_size: Integer(U32), value: 55 }, Mov { destination: Relative(55), source: Direct(0) }, Mov { destination: Relative(56), source: Relative(13) }, Mov { destination: Relative(57), source: Relative(36) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(34) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(3), source: Relative(56) }, JumpIf { condition: Relative(3), location: 829 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(13) } }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(34), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(31) }, Load { destination: Relative(3), source_pointer: Relative(34) }, BinaryIntOp { destination: Relative(34), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(35), op: Add, bit_size: U32, lhs: Relative(34), rhs: Relative(33) }, Load { destination: Relative(13), source_pointer: Relative(35) }, Load { destination: Relative(34), source_pointer: Relative(3) }, Const { destination: Relative(35), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(36), op: Equals, bit_size: U32, lhs: Relative(35), rhs: Relative(34) }, Not { destination: Relative(36), source: Relative(36), bit_size: U1 }, JumpIf { condition: Relative(36), location: 841 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(34), op: Add, bit_size: U32, lhs: Relative(34), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(34) }, Load { destination: Relative(3), source_pointer: Relative(13) }, Const { destination: Relative(34), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(36), op: Equals, bit_size: U32, lhs: Relative(34), rhs: Relative(3) }, Not { destination: Relative(36), source: Relative(36), bit_size: U1 }, JumpIf { condition: Relative(36), location: 849 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(3) }, Const { destination: Relative(3), bit_size: Field, value: 106 }, Const { destination: Relative(36), bit_size: Field, value: 107 }, Const { destination: Relative(37), bit_size: Field, value: 108 }, Mov { destination: Relative(40), source: Direct(1) }, Const { destination: Relative(42), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(42) }, IndirectConst { destination_pointer: Relative(40), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(42), op: Add, bit_size: U32, lhs: Relative(40), rhs: Direct(2) }, Mov { destination: Relative(44), source: Relative(42) }, Store { destination_pointer: Relative(44), source: Relative(3) }, BinaryIntOp { destination: Relative(44), op: Add, bit_size: U32, lhs: Relative(44), rhs: Direct(2) }, Store { destination_pointer: Relative(44), source: Relative(36) }, BinaryIntOp { destination: Relative(44), op: Add, bit_size: U32, lhs: Relative(44), rhs: Direct(2) }, Store { destination_pointer: Relative(44), source: Relative(37) }, Const { destination: Relative(36), bit_size: Integer(U32), value: 55 }, Mov { destination: Relative(55), source: Direct(0) }, Mov { destination: Relative(56), source: Relative(13) }, Mov { destination: Relative(57), source: Relative(40) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(36) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(3), source: Relative(56) }, JumpIf { condition: Relative(3), location: 876 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(13) } }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(36), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(39) }, Load { destination: Relative(3), source_pointer: Relative(36) }, BinaryIntOp { destination: Relative(36), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(37), op: Add, bit_size: U32, lhs: Relative(36), rhs: Relative(41) }, Load { destination: Relative(13), source_pointer: Relative(37) }, Load { destination: Relative(36), source_pointer: Relative(3) }, Const { destination: Relative(37), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(40), op: Equals, bit_size: U32, lhs: Relative(37), rhs: Relative(36) }, Not { destination: Relative(40), source: Relative(40), bit_size: U1 }, JumpIf { condition: Relative(40), location: 888 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(36), op: Add, bit_size: U32, lhs: Relative(36), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(36) }, Load { destination: Relative(3), source_pointer: Relative(13) }, Const { destination: Relative(36), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(40), op: Equals, bit_size: U32, lhs: Relative(36), rhs: Relative(3) }, Not { destination: Relative(40), source: Relative(40), bit_size: U1 }, JumpIf { condition: Relative(40), location: 896 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(3) }, Load { destination: Relative(3), source_pointer: Relative(53) }, Const { destination: Relative(40), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(42), op: Equals, bit_size: U32, lhs: Relative(40), rhs: Relative(3) }, Not { destination: Relative(42), source: Relative(42), bit_size: U1 }, JumpIf { condition: Relative(42), location: 904 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(53), source: Relative(3) }, Const { destination: Relative(42), bit_size: Integer(U32), value: 55 }, Mov { destination: Relative(55), source: Direct(0) }, Mov { destination: Relative(56), source: Relative(13) }, Mov { destination: Relative(57), source: Relative(53) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(42) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(3), source: Relative(56) }, JumpIf { condition: Relative(3), location: 917 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(13) } }, Const { destination: Relative(3), bit_size: Field, value: 0 }, Mov { destination: Relative(13), source: Direct(1) }, Const { destination: Relative(42), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(42) }, IndirectConst { destination_pointer: Relative(13), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(42), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Mov { destination: Relative(44), source: Relative(42) }, Store { destination_pointer: Relative(44), source: Relative(3) }, BinaryIntOp { destination: Relative(44), op: Add, bit_size: U32, lhs: Relative(44), rhs: Direct(2) }, Store { destination_pointer: Relative(44), source: Relative(12) }, BinaryIntOp { destination: Relative(44), op: Add, bit_size: U32, lhs: Relative(44), rhs: Direct(2) }, Store { destination_pointer: Relative(44), source: Relative(6) }, Load { destination: Relative(3), source_pointer: Relative(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(3) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 935 }, Call { location: 1793 }, 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(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(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Mov { destination: Relative(42), source: Relative(12) }, Store { destination_pointer: Relative(42), source: Relative(7) }, BinaryIntOp { destination: Relative(42), op: Add, bit_size: U32, lhs: Relative(42), rhs: Direct(2) }, Store { destination_pointer: Relative(42), source: Relative(24) }, BinaryIntOp { destination: Relative(42), op: Add, bit_size: U32, lhs: Relative(42), rhs: Direct(2) }, Store { destination_pointer: Relative(42), source: Relative(19) }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 5 }, 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(19), source: Relative(12) }, 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(1) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(3) }, 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(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(7) }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(10) }, JumpIf { condition: Relative(13), location: 967 }, Call { location: 1790 }, BinaryIntOp { destination: Relative(13), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Relative(10) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(13) }, Load { destination: Relative(4), source_pointer: Relative(24) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(42), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(19) }, Load { destination: Relative(13), source_pointer: Relative(42) }, Load { destination: Relative(19), source_pointer: Relative(4) }, Const { destination: Relative(24), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(42), op: Equals, bit_size: U32, lhs: Relative(24), rhs: Relative(19) }, Not { destination: Relative(42), source: Relative(42), bit_size: U1 }, JumpIf { condition: Relative(42), location: 981 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(19) }, Load { destination: Relative(19), source_pointer: Relative(13) }, Const { destination: Relative(42), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(44), op: Equals, bit_size: U32, lhs: Relative(42), rhs: Relative(19) }, Not { destination: Relative(44), source: Relative(44), bit_size: U1 }, JumpIf { condition: Relative(44), location: 989 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(19) }, BinaryIntOp { destination: Relative(44), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(45), op: Add, bit_size: U32, lhs: Relative(44), rhs: Relative(8) }, Load { destination: Relative(19), source_pointer: Relative(45) }, BinaryIntOp { destination: Relative(45), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(46), op: Add, bit_size: U32, lhs: Relative(45), rhs: Relative(11) }, Load { destination: Relative(44), source_pointer: Relative(46) }, Load { destination: Relative(45), source_pointer: Relative(19) }, Const { destination: Relative(46), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(47), op: Equals, bit_size: U32, lhs: Relative(46), rhs: Relative(45) }, Not { destination: Relative(47), source: Relative(47), bit_size: U1 }, JumpIf { condition: Relative(47), location: 1003 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(45), op: Add, bit_size: U32, lhs: Relative(45), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(45) }, Load { destination: Relative(45), source_pointer: Relative(44) }, Const { destination: Relative(47), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(48), op: Equals, bit_size: U32, lhs: Relative(47), rhs: Relative(45) }, Not { destination: Relative(48), source: Relative(48), bit_size: U1 }, JumpIf { condition: Relative(48), location: 1011 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(45), op: Add, bit_size: U32, lhs: Relative(45), rhs: Direct(2) }, Store { destination_pointer: Relative(44), source: Relative(45) }, Load { destination: Relative(44), source_pointer: Relative(18) }, Const { destination: Relative(45), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(48), op: Equals, bit_size: U32, lhs: Relative(45), rhs: Relative(44) }, Not { destination: Relative(48), source: Relative(48), bit_size: U1 }, JumpIf { condition: Relative(48), location: 1019 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(44), op: Add, bit_size: U32, lhs: Relative(44), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(44) }, Const { destination: Relative(48), bit_size: Integer(U32), value: 55 }, Mov { destination: Relative(55), source: Direct(0) }, Mov { destination: Relative(56), source: Relative(19) }, Mov { destination: Relative(57), source: Relative(18) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(48) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(44), source: Relative(56) }, JumpIf { condition: Relative(44), location: 1032 }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(18) } }, Load { destination: Relative(18), source_pointer: Relative(4) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(44), op: Equals, bit_size: U32, lhs: Relative(19), rhs: Relative(18) }, Not { destination: Relative(44), source: Relative(44), bit_size: U1 }, JumpIf { condition: Relative(44), location: 1038 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(18) }, Load { destination: Relative(18), source_pointer: Relative(13) }, Const { destination: Relative(44), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(48), op: Equals, bit_size: U32, lhs: Relative(44), rhs: Relative(18) }, Not { destination: Relative(48), source: Relative(48), bit_size: U1 }, JumpIf { condition: Relative(48), location: 1046 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(18) }, BinaryIntOp { destination: Relative(48), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(49), op: Add, bit_size: U32, lhs: Relative(48), rhs: Relative(21) }, Load { destination: Relative(18), source_pointer: Relative(49) }, BinaryIntOp { destination: Relative(49), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(51), op: Add, bit_size: U32, lhs: Relative(49), rhs: Relative(23) }, Load { destination: Relative(48), source_pointer: Relative(51) }, Load { destination: Relative(49), source_pointer: Relative(18) }, Const { destination: Relative(51), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(52), op: Equals, bit_size: U32, lhs: Relative(51), rhs: Relative(49) }, Not { destination: Relative(52), source: Relative(52), bit_size: U1 }, JumpIf { condition: Relative(52), location: 1060 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(49), op: Add, bit_size: U32, lhs: Relative(49), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(49) }, Load { destination: Relative(49), source_pointer: Relative(48) }, Const { destination: Relative(52), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(53), op: Equals, bit_size: U32, lhs: Relative(52), rhs: Relative(49) }, Not { destination: Relative(53), source: Relative(53), bit_size: U1 }, JumpIf { condition: Relative(53), location: 1068 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(49), op: Add, bit_size: U32, lhs: Relative(49), rhs: Direct(2) }, Store { destination_pointer: Relative(48), source: Relative(49) }, Load { destination: Relative(48), source_pointer: Relative(30) }, Const { destination: Relative(49), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(53), op: Equals, bit_size: U32, lhs: Relative(49), rhs: Relative(48) }, Not { destination: Relative(53), source: Relative(53), bit_size: U1 }, JumpIf { condition: Relative(53), location: 1076 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(48), op: Add, bit_size: U32, lhs: Relative(48), rhs: Direct(2) }, Store { destination_pointer: Relative(30), source: Relative(48) }, Const { destination: Relative(53), bit_size: Integer(U32), value: 55 }, Mov { destination: Relative(55), source: Direct(0) }, Mov { destination: Relative(56), source: Relative(18) }, Mov { destination: Relative(57), source: Relative(30) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(53) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(48), source: Relative(56) }, JumpIf { condition: Relative(48), location: 1089 }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(18) } }, Load { destination: Relative(18), source_pointer: Relative(4) }, Const { destination: Relative(48), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(53), op: Equals, bit_size: U32, lhs: Relative(48), rhs: Relative(18) }, Not { destination: Relative(53), source: Relative(53), bit_size: U1 }, JumpIf { condition: Relative(53), location: 1095 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(18) }, Load { destination: Relative(18), source_pointer: Relative(13) }, Const { destination: Relative(53), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(55), op: Equals, bit_size: U32, lhs: Relative(53), rhs: Relative(18) }, Not { destination: Relative(55), source: Relative(55), bit_size: U1 }, JumpIf { condition: Relative(55), location: 1103 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(18) }, BinaryIntOp { destination: Relative(55), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(56), op: Add, bit_size: U32, lhs: Relative(55), rhs: Relative(31) }, Load { destination: Relative(18), source_pointer: Relative(56) }, BinaryIntOp { destination: Relative(55), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(56), op: Add, bit_size: U32, lhs: Relative(55), rhs: Relative(33) }, Load { destination: Relative(31), source_pointer: Relative(56) }, Load { destination: Relative(33), source_pointer: Relative(18) }, Const { destination: Relative(55), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(56), op: Equals, bit_size: U32, lhs: Relative(55), rhs: Relative(33) }, Not { destination: Relative(56), source: Relative(56), bit_size: U1 }, JumpIf { condition: Relative(56), location: 1117 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(33), op: Add, bit_size: U32, lhs: Relative(33), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(33) }, Load { destination: Relative(33), source_pointer: Relative(31) }, Const { destination: Relative(56), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(57), op: Equals, bit_size: U32, lhs: Relative(56), rhs: Relative(33) }, Not { destination: Relative(57), source: Relative(57), bit_size: U1 }, JumpIf { condition: Relative(57), location: 1125 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(33), op: Add, bit_size: U32, lhs: Relative(33), rhs: Direct(2) }, Store { destination_pointer: Relative(31), source: Relative(33) }, Const { destination: Relative(33), bit_size: Integer(U32), value: 57 }, Mov { destination: Relative(57), source: Direct(0) }, Mov { destination: Relative(58), source: Relative(18) }, Mov { destination: Relative(59), source: Relative(16) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(33) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(31), source: Relative(58) }, JumpIf { condition: Relative(31), location: 1138 }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(16) } }, Load { destination: Relative(16), source_pointer: Relative(4) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(31), op: Equals, bit_size: U32, lhs: Relative(18), rhs: Relative(16) }, Not { destination: Relative(31), source: Relative(31), bit_size: U1 }, JumpIf { condition: Relative(31), location: 1144 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(16) }, Load { destination: Relative(16), source_pointer: Relative(13) }, Const { destination: Relative(31), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(33), op: Equals, bit_size: U32, lhs: Relative(31), rhs: Relative(16) }, Not { destination: Relative(33), source: Relative(33), bit_size: U1 }, JumpIf { condition: Relative(33), location: 1152 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(16) }, BinaryIntOp { destination: Relative(33), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(57), op: Add, bit_size: U32, lhs: Relative(33), rhs: Relative(39) }, Load { destination: Relative(16), source_pointer: Relative(57) }, BinaryIntOp { destination: Relative(39), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(57), op: Add, bit_size: U32, lhs: Relative(39), rhs: Relative(41) }, Load { destination: Relative(33), source_pointer: Relative(57) }, Load { destination: Relative(39), source_pointer: Relative(16) }, Const { destination: Relative(41), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(57), op: Equals, bit_size: U32, lhs: Relative(41), rhs: Relative(39) }, Not { destination: Relative(57), source: Relative(57), bit_size: U1 }, JumpIf { condition: Relative(57), location: 1166 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(39), op: Add, bit_size: U32, lhs: Relative(39), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(39) }, Load { destination: Relative(39), source_pointer: Relative(33) }, Const { destination: Relative(57), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(58), op: Equals, bit_size: U32, lhs: Relative(57), rhs: Relative(39) }, Not { destination: Relative(58), source: Relative(58), bit_size: U1 }, JumpIf { condition: Relative(58), location: 1174 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(39), op: Add, bit_size: U32, lhs: Relative(39), rhs: Direct(2) }, Store { destination_pointer: Relative(33), source: Relative(39) }, Load { destination: Relative(39), source_pointer: Relative(50) }, Const { destination: Relative(58), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(59), op: Equals, bit_size: U32, lhs: Relative(58), rhs: Relative(39) }, Not { destination: Relative(59), source: Relative(59), bit_size: U1 }, JumpIf { condition: Relative(59), location: 1182 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(39), op: Add, bit_size: U32, lhs: Relative(39), rhs: Direct(2) }, Store { destination_pointer: Relative(50), source: Relative(39) }, Const { destination: Relative(59), bit_size: Integer(U32), value: 60 }, Mov { destination: Relative(60), source: Direct(0) }, Mov { destination: Relative(61), source: Relative(16) }, Mov { destination: Relative(62), source: Relative(50) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(59) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(39), source: Relative(61) }, JumpIf { condition: Relative(39), location: 1195 }, Const { destination: Relative(50), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(50) } }, Load { destination: Relative(39), source_pointer: Relative(4) }, Const { destination: Relative(50), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(59), op: Equals, bit_size: U32, lhs: Relative(50), rhs: Relative(39) }, Not { destination: Relative(59), source: Relative(59), bit_size: U1 }, JumpIf { condition: Relative(59), location: 1201 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(39), op: Add, bit_size: U32, lhs: Relative(39), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(39) }, Load { destination: Relative(4), source_pointer: Relative(13) }, Const { destination: Relative(39), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(59), op: Equals, bit_size: U32, lhs: Relative(39), rhs: Relative(4) }, Not { destination: Relative(59), source: Relative(59), bit_size: U1 }, JumpIf { condition: Relative(59), location: 1209 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(4) }, BinaryIntOp { destination: Relative(59), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(60), op: Add, bit_size: U32, lhs: Relative(59), rhs: Relative(32) }, Load { destination: Relative(4), source_pointer: Relative(60) }, Load { destination: Relative(13), source_pointer: Relative(16) }, Const { destination: Relative(32), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(59), op: Equals, bit_size: U32, lhs: Relative(32), rhs: Relative(13) }, Not { destination: Relative(59), source: Relative(59), bit_size: U1 }, JumpIf { condition: Relative(59), location: 1220 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(13) }, Load { destination: Relative(13), source_pointer: Relative(33) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(59), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(13) }, Not { destination: Relative(59), source: Relative(59), bit_size: U1 }, JumpIf { condition: Relative(59), location: 1228 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(33), source: Relative(13) }, BinaryFieldOp { destination: Relative(13), op: Equals, lhs: Relative(4), rhs: Relative(54) }, JumpIf { condition: Relative(13), location: 1234 }, Const { destination: Relative(33), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(33) } }, Load { destination: Relative(4), source_pointer: Relative(3) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(33), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(4) }, Not { destination: Relative(33), source: Relative(33), bit_size: U1 }, JumpIf { condition: Relative(33), location: 1240 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(4) }, Load { destination: Relative(3), source_pointer: Relative(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(33), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, Not { destination: Relative(33), source: Relative(33), bit_size: U1 }, JumpIf { condition: Relative(33), location: 1248 }, Call { location: 1793 }, 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(3), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Relative(54), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Load { destination: Relative(33), source_pointer: Relative(54) }, Const { destination: Relative(54), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(60), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(54) }, Load { destination: Relative(59), source_pointer: Relative(60) }, Load { destination: Relative(1), source_pointer: Relative(33) }, Const { destination: Relative(60), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(61), op: Equals, bit_size: U32, lhs: Relative(60), rhs: Relative(1) }, Not { destination: Relative(61), source: Relative(61), bit_size: U1 }, JumpIf { condition: Relative(61), location: 1262 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(33), source: Relative(1) }, Load { destination: Relative(1), source_pointer: Relative(59) }, Const { destination: Relative(61), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(62), op: Equals, bit_size: U32, lhs: Relative(61), rhs: Relative(1) }, Not { destination: Relative(62), source: Relative(62), bit_size: U1 }, JumpIf { condition: Relative(62), location: 1270 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(59), source: Relative(1) }, Load { destination: Relative(1), source_pointer: Relative(30) }, Const { destination: Relative(59), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(62), op: Equals, bit_size: U32, lhs: Relative(59), rhs: Relative(1) }, Not { destination: Relative(62), source: Relative(62), bit_size: U1 }, JumpIf { condition: Relative(62), location: 1278 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(30), source: Relative(1) }, Const { destination: Relative(62), bit_size: Integer(U32), value: 63 }, Mov { destination: Relative(63), source: Direct(0) }, Mov { destination: Relative(64), source: Relative(33) }, Mov { destination: Relative(65), source: Relative(30) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(62) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(64) }, JumpIf { condition: Relative(1), location: 1291 }, Const { destination: Relative(30), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(30) } }, Const { destination: Relative(1), bit_size: Field, value: 19 }, Const { destination: Relative(30), bit_size: Field, value: 18 }, Mov { destination: Relative(33), source: Direct(1) }, Const { destination: Relative(62), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(62) }, IndirectConst { destination_pointer: Relative(33), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(62), op: Add, bit_size: U32, lhs: Relative(33), rhs: Direct(2) }, Mov { destination: Relative(63), source: Relative(62) }, Store { destination_pointer: Relative(63), source: Relative(17) }, BinaryIntOp { destination: Relative(63), op: Add, bit_size: U32, lhs: Relative(63), rhs: Direct(2) }, Store { destination_pointer: Relative(63), source: Relative(1) }, BinaryIntOp { destination: Relative(63), op: Add, bit_size: U32, lhs: Relative(63), rhs: Direct(2) }, Store { destination_pointer: Relative(63), source: Relative(30) }, BinaryIntOp { destination: Relative(62), op: LessThan, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(63), op: Mul, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(64), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(65), op: LessThan, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(66), op: Mul, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(67), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(68), op: LessThan, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(69), op: Mul, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(70), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(71), op: LessThan, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(72), op: Mul, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(73), op: LessThan, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(74), op: Mul, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, JumpIf { condition: Relative(38), location: 1359 }, Jump { location: 1319 }, Load { destination: Relative(4), source_pointer: Relative(33) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(4) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 1325 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(33), source: Relative(4) }, JumpIf { condition: Relative(62), location: 1329 }, Call { location: 1790 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(63), rhs: Direct(32836) }, 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(4) }, Load { destination: Relative(9), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(23) }, Load { destination: Relative(13), source_pointer: Relative(15) }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, 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(21) }, Store { destination_pointer: Relative(16), source: Relative(33) }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, Mov { destination: Relative(9), source: Direct(32773) }, 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(64) }, Store { destination_pointer: Relative(16), source: Relative(13) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 1829 }, 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(4) }, Store { destination_pointer: Relative(15), source: Relative(9) }, Store { destination_pointer: Relative(12), source: Relative(13) }, Jump { location: 1405 }, 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(13), source: Relative(6) }, Store { destination_pointer: Relative(13), source: Relative(43) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(29) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(22) }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, JumpIf { condition: Relative(6), location: 1373 }, Call { location: 1790 }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32836) }, 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(9) }, Load { destination: Relative(6), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(23) }, Load { destination: Relative(13), source_pointer: Relative(15) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, 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(21) }, Store { destination_pointer: Relative(16), source: Relative(4) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(32836) }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, Mov { destination: Relative(6), source: Direct(32773) }, 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(4) }, Store { destination_pointer: Relative(16), source: Relative(13) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 1829 }, 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(9) }, Store { destination_pointer: Relative(14), source: Relative(6) }, Store { destination_pointer: Relative(12), source: Relative(4) }, Jump { location: 1405 }, Load { destination: Relative(4), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, Load { destination: Relative(6), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(9) }, Load { destination: Relative(4), source_pointer: Relative(6) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(4) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 1416 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(4) }, Load { destination: Relative(4), 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(4) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 1424 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(4) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(3) }, Load { destination: Relative(4), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(54) }, Load { destination: Relative(14), source_pointer: Relative(15) }, Load { destination: Relative(15), source_pointer: Relative(4) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(18), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(15) }, Not { destination: Relative(18), source: Relative(18), bit_size: U1 }, JumpIf { condition: Relative(18), location: 1436 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(15) }, Load { destination: Relative(15), source_pointer: Relative(14) }, 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: 1444 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(15) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 75 }, Mov { destination: Relative(75), source: Direct(0) }, Mov { destination: Relative(76), source: Relative(4) }, Mov { destination: Relative(77), source: Relative(33) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(19) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(15), source: Relative(76) }, JumpIf { condition: Relative(15), location: 1457 }, Const { destination: Relative(19), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(19) } }, Load { destination: Relative(15), source_pointer: Relative(6) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(22), op: Equals, bit_size: U32, lhs: Relative(19), rhs: Relative(15) }, Not { destination: Relative(22), source: Relative(22), bit_size: U1 }, JumpIf { condition: Relative(22), location: 1463 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(15) }, Load { destination: Relative(6), source_pointer: Relative(7) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(22), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(6) }, Not { destination: Relative(22), source: Relative(22), bit_size: U1 }, JumpIf { condition: Relative(22), location: 1471 }, Call { location: 1793 }, 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(4) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(22), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(22), source: Relative(22), bit_size: U1 }, JumpIf { condition: Relative(22), location: 1479 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, Load { destination: Relative(6), source_pointer: Relative(14) }, Const { destination: Relative(22), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(24), op: Equals, bit_size: U32, lhs: Relative(22), rhs: Relative(6) }, Not { destination: Relative(24), source: Relative(24), bit_size: U1 }, JumpIf { condition: Relative(24), location: 1487 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(6) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, Load { destination: Relative(6), source_pointer: Relative(14) }, BinaryFieldOp { destination: Relative(4), op: Equals, lhs: Relative(6), rhs: Relative(30) }, JumpIf { condition: Relative(4), location: 1495 }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(14) } }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(2), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(2), op: LessThan, bit_size: U32, lhs: Relative(20), rhs: Direct(32837) }, Const { destination: Relative(6), bit_size: Field, value: 5000 }, JumpIf { condition: Relative(4), location: 1546 }, Jump { location: 1500 }, Load { destination: Relative(4), source_pointer: Relative(12) }, JumpIf { condition: Relative(68), location: 1503 }, Call { location: 1790 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(69), rhs: Direct(32836) }, 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(7) }, Load { destination: Relative(9), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(21) }, Load { destination: Relative(13), source_pointer: Relative(15) }, 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(23) }, Load { destination: Relative(14), source_pointer: Relative(16) }, JumpIf { condition: Relative(2), location: 1515 }, Call { location: 1790 }, Const { destination: Relative(2), bit_size: Field, value: 1000 }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 1829 }, 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(18), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(20) }, Store { destination_pointer: Relative(18), source: Relative(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, 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(16), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(21) }, Store { destination_pointer: Relative(16), source: Relative(15) }, Mov { destination: Direct(32771), source: Relative(2) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(70) }, Store { destination_pointer: Relative(15), source: Relative(14) }, Mov { destination: Direct(32771), source: Relative(4) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 1829 }, 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(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(7) }, Store { destination_pointer: Relative(14), source: Relative(9) }, Store { destination_pointer: Relative(12), source: Relative(2) }, Jump { location: 1592 }, Load { destination: Relative(2), source_pointer: Relative(12) }, JumpIf { condition: Relative(65), location: 1549 }, Call { location: 1790 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(66), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(4) }, Load { destination: Relative(7), source_pointer: Relative(13) }, 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(21) }, Load { destination: Relative(9), source_pointer: Relative(14) }, 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(23) }, Load { destination: Relative(13), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(20), rhs: Direct(32837) }, JumpIf { condition: Relative(14), location: 1562 }, Call { location: 1790 }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 1829 }, 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(20) }, Store { destination_pointer: Relative(16), source: Relative(6) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, Mov { destination: Relative(9), source: Direct(32773) }, 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(21) }, Store { destination_pointer: Relative(16), source: Relative(14) }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, 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(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(67) }, Store { destination_pointer: Relative(15), source: Relative(13) }, Mov { destination: Direct(32771), source: Relative(2) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 1829 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(9), 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) }, Store { destination_pointer: Relative(12), source: Relative(9) }, Jump { location: 1592 }, Load { destination: Relative(2), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32837) }, Load { destination: Relative(4), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(9) }, Load { destination: Relative(9), 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(9) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 1603 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(9) }, Load { destination: Relative(4), source_pointer: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(4) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 1611 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(4) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(3) }, Load { destination: Relative(4), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(54) }, Load { destination: Relative(3), source_pointer: Relative(14) }, Load { destination: Relative(7), 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(7) }, Not { destination: Relative(15), source: Relative(15), bit_size: U1 }, JumpIf { condition: Relative(15), location: 1623 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(7) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(7) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 1631 }, Call { location: 1793 }, 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(7), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, Load { destination: Relative(3), source_pointer: Relative(7) }, BinaryFieldOp { destination: Relative(4), op: Equals, lhs: Relative(3), rhs: Relative(6) }, JumpIf { condition: Relative(4), location: 1639 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(7) } }, JumpIf { condition: Relative(71), location: 1641 }, Call { location: 1790 }, 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(72) }, Load { destination: Relative(3), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(72), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(4) }, Load { destination: Relative(7), source_pointer: Relative(18) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(18), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(4) }, Not { destination: Relative(18), source: Relative(18), bit_size: U1 }, JumpIf { condition: Relative(18), location: 1654 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(4) }, Load { destination: Relative(3), source_pointer: Relative(7) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(18), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, Not { destination: Relative(18), source: Relative(18), bit_size: U1 }, JumpIf { condition: Relative(18), location: 1662 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(3) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(21) }, Load { destination: Relative(3), source_pointer: Relative(19) }, 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(23) }, Load { destination: Relative(18), source_pointer: Relative(20) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(20), op: Equals, bit_size: U32, lhs: Relative(19), rhs: Relative(7) }, Not { destination: Relative(20), source: Relative(20), bit_size: U1 }, JumpIf { condition: Relative(20), location: 1676 }, Call { location: 1793 }, 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(18) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(21), op: Equals, bit_size: U32, lhs: Relative(20), rhs: Relative(7) }, Not { destination: Relative(21), source: Relative(21), bit_size: U1 }, JumpIf { condition: Relative(21), location: 1684 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(7) }, JumpIf { condition: Relative(73), location: 1688 }, Call { location: 1790 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(74), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(7) }, Load { destination: Relative(18), source_pointer: Relative(22) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(11) }, Load { destination: Relative(21), source_pointer: Relative(23) }, Mov { destination: Direct(32771), source: Relative(18) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, Mov { destination: Relative(11), source: Direct(32773) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(8) }, Store { destination_pointer: Relative(23), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32836) }, Mov { destination: Direct(32771), source: Relative(11) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, Mov { destination: Relative(8), source: Direct(32773) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(3) }, Store { destination_pointer: Relative(22), source: Relative(21) }, Mov { destination: Direct(32771), source: Relative(2) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 1829 }, Mov { destination: Relative(3), source: Direct(32773) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(7) }, Store { destination_pointer: Relative(18), source: Relative(8) }, Store { destination_pointer: Relative(12), source: Relative(3) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32837) }, Load { destination: Relative(2), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(8) }, Load { destination: Relative(3), source_pointer: Relative(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(3) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 1728 }, Call { location: 1793 }, 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(2), source_pointer: Relative(7) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 1736 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(10) }, Load { destination: Relative(2), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32837) }, Load { destination: Relative(8), source_pointer: Relative(10) }, Load { destination: Relative(7), 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(7) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 1748 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(7) }, Load { destination: Relative(7), 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(7) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 1756 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, 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(12), source: Relative(8) }, Store { destination_pointer: Relative(12), source: Relative(17) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, 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(6) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 21 }, Mov { destination: Relative(21), source: Direct(0) }, Mov { destination: Relative(22), source: Relative(2) }, Mov { destination: Relative(23), source: Relative(7) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(22) }, JumpIf { condition: Relative(1), location: 1780 }, 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: 1786 }, 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: 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, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 1781 }, 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: 1806 }, Call { location: 1793 }, 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 }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 1811 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32837) }, JumpIf { condition: Relative(5), location: 1816 }, Jump { location: 1814 }, 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(32836) }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 1811 }, 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: 1833 }, Jump { location: 1835 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 1850 }, 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: 1847 }, 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: 1840 }, 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: 1850 }, Return]" ], - "debug_symbols": "pZnLbttIEEX/RWsvWP0u/0oQBI6jDAwIsqHYAwwC//t0kffIySLADLXxPbRUpymqS+qmfh6+Hb++/fXl6fz9+cfh/tPPw9fL0+n09NeX0/Pjw+vT83n+9+dhiT82yuHe7mZWZVN25VD6lr4oTZkO9ykyK4uyKpuyK4fS10zLojRlUmZlUVZlU3blUMpn8pl8Jp/JZ/KZfCafyWfymXxJvjR9OTIps7Ioq3L6SmRXDqVvmRelKZMyK4uyKuXL8mX5snxFviJfmb4amZVFWZVN2ZVD6VvWRWlK+ap8Vb4qX52+FtmVQ+lbtkVpyqTMyqKsSvna9PXIofQt+6I0ZVJm5fSNyKpsyq4cSt9yLEpTJmVWyjfkG/IN+YZ8Qz6Xz+Vz+Vw+l8/lc/lcPpfPN19eFqUpp88js7Ioq7Ipo3+XgAG4IFpkAwMSkIECVKABmA2zYU6YE+aEOfrFLKAAFWhABwbggmibDQxIAOaMOWPOmKN7LAUMwAXRQBsYkIAMFKACDcAcjWQ5wAXRShsYkIAMFCDMJaABHRiAC6KpNjAgARkoAOaGuWFumBvmjrlj7pg75o65Y+6YO+aOuWMemAfmgTl6zWpAASrQgA6EuQW4YP1KWsGABGSgABVoQAcwu8xlWQADEpCBMPeACjSgAwNwwdqDKxiQgAxgNsyG2TCvPTgCXLD24AoGJCADBahAAzqAOWHOmDPmtQc9IAMFqEADOjAAF6w9uIIBmAvmgrlgLpgL5oK5YK6YK+aKuWKumCvmirlirpgr5ujBtAQYkIAMFCBWGxbQgA4MwAXRgxsYkIAMFABzx9wxd8wd88AcPZhSQAIyUIAKNKADA3BB9OAGmB2zY3bM69owBzSgAwPwDeq6QFzBgARkoAAVCHMJ6MAAXLAuFVcwIAEZKEAFMBtmw2yYE+aEOXow1YAMFKACDejAAFwQPbiBAZgz5ow5Y44eTC2gAwNwQfTgBgYkIAMFqADm6MHUA8I8PxxqdNwGCchAASrQgA5cPS5YO24FzA1zw9wwN8wNc8PcMDfMHXPH3DF3zGujeUADOjAAF6yNtoIBCchAATAPzAPzwDwwO2bH7Jgds2N2zI7ZZW4xn/MS0IAOzEGzBbgg5vMGBiQgAwWoAOUxRXMK4DkxM3MOaEAHYvQS4IKYmRvE6C0AYczMDcKc3t/vDuxxv7xejsfY4v6y6Z1b4ZeHy/H8erg/v51Od4e/H05v65N+vDyc13x9uMxH52U4nr/NnMLvT6dj0PvdR/Xy59IU3w5r8dwbXsvr/6jv1/p6W/28IDvqS6O+7jr/dh2/+W3j92VP/bjWu+2qL9f6dGP9ntefYzuw1s9d1J76zPhz+3Pb+Lnvqa/X+jp21du13m+rb7te/6D551ZjR/3cK6h+7hFuGn9uLfaMHyvzrT6l2+rznv6bC3Xqy67r15g/c9V82/i73v/ycf3Hnus/15eqn8vJm8afq9A941de/1ww7anvzN+55NlR35aq+rbs+vy3awPNm7V7rsC8x8wlmLeZf3kP//MpLNf3cN6H9j2Cj0XAktoeQV4+zmDcegZ/egm5/tnQr9+j3X+r/zwPHh6fLr/9mvAeosvTw9fTUYff386Pvzz6+s8Lj/BrxMvl+fH47e1yDNPHTxLzz6dW+l1r4/O8GTOPrNU763UexZbtU3W/a0uJQ4vnzgnXlv75PU7tXw==", + "debug_symbols": "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", "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_u64, 1), 0);\n assert_eq(min(0_u64, 0), 0);\n assert_eq(min(1_u64, 1), 1);\n assert_eq(min(255_u8, 0), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0_u64, 1), 1);\n assert_eq(max(0_u64, 0), 0);\n assert_eq(max(1_u64, 1), 1);\n assert_eq(max(255_u8, 0), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_true_inliner_0.snap index fdf6b844ae1..ca85221a540 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_true_inliner_0.snap @@ -94,9 +94,9 @@ expression: artifact "return value indices : []", "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 }]), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(28))], q_c: 0 })], outputs: []", "unconstrained func 0", - "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32867 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 29 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32838), size_address: Relative(3), offset_address: Relative(4) }, Cast { destination: Direct(32866), source: Direct(32866), bit_size: Integer(U32) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32838 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 13 }, 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) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 7 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 11 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 14 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 15 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 18 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 8 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 21 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 22 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 25 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 11 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Mov { destination: Relative(1), source: Relative(3) }, Mov { destination: Relative(2), source: Direct(32866) }, Call { location: 176 }, Call { location: 180 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32867 }, 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: 175 }, 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: 168 }, Return, Const { destination: Direct(32835), bit_size: Integer(U1), value: 1 }, Const { destination: Direct(32836), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(32837), bit_size: Integer(U32), value: 3 }, Return, Call { location: 599 }, 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) }, BinaryIntOp { destination: Relative(4), op: Sub, bit_size: U32, lhs: Relative(2), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U32, lhs: Direct(32837), rhs: Relative(2) }, JumpIf { condition: Relative(5), location: 188 }, Call { location: 605 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(5) }, JumpIf { condition: Relative(6), location: 192 }, Call { location: 608 }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, 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(6) }, Load { destination: Relative(4), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32836) }, 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) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(7) }, 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(6), source_pointer: Relative(11) }, 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: 211 }, Call { location: 611 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(9) }, Load { destination: Relative(9), 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(9) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 219 }, Call { location: 611 }, 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: Field, value: 1 }, BinaryFieldOp { destination: Relative(12), op: Equals, lhs: Relative(4), rhs: Relative(9) }, JumpIf { condition: Relative(12), location: 226 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(13) } }, Load { destination: Relative(4), source_pointer: Relative(8) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(4) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 232 }, Call { location: 611 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(4) }, Load { destination: Relative(4), 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(4) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 240 }, Call { location: 611 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(4) }, Const { destination: Relative(4), bit_size: Field, value: 2 }, Const { destination: Relative(6), bit_size: Field, value: 3 }, Const { destination: Relative(13), bit_size: Field, value: 20 }, 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(6) }, 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(6), 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(14) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 614 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(16) }, JumpIf { condition: Relative(4), location: 267 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(6) } }, BinaryIntOp { destination: Relative(4), op: Sub, bit_size: U32, lhs: Relative(2), rhs: Relative(7) }, BinaryIntOp { destination: Relative(6), op: LessThanEquals, bit_size: U32, lhs: Relative(7), rhs: Relative(2) }, JumpIf { condition: Relative(6), location: 271 }, Call { location: 605 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(5) }, JumpIf { condition: Relative(6), location: 274 }, Call { location: 608 }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(8), rhs: Relative(6) }, Load { destination: Relative(4), source_pointer: Relative(13) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32836) }, 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(13), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(7) }, 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(6), source_pointer: Relative(15) }, Load { destination: Relative(8), source_pointer: Relative(13) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(15), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(8) }, Not { destination: Relative(15), source: Relative(15), bit_size: U1 }, JumpIf { condition: Relative(15), location: 292 }, Call { location: 611 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(8) }, Load { destination: Relative(8), 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(8) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 300 }, Call { location: 611 }, 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(8), bit_size: Field, value: 4 }, BinaryFieldOp { destination: Relative(16), op: Equals, lhs: Relative(4), rhs: Relative(8) }, JumpIf { condition: Relative(16), location: 307 }, Const { destination: Relative(17), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(17) } }, Load { destination: Relative(4), source_pointer: Relative(13) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(4) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 313 }, Call { location: 611 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(6) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(17), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(4) }, Not { destination: Relative(17), source: Relative(17), bit_size: U1 }, JumpIf { condition: Relative(17), location: 321 }, Call { location: 611 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(4) }, Const { destination: Relative(4), bit_size: Field, value: 5 }, Const { destination: Relative(6), bit_size: Field, value: 6 }, Const { destination: Relative(17), bit_size: Field, value: 21 }, Mov { destination: Relative(18), 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(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(4) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Relative(6) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Relative(17) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 19 }, Mov { destination: Relative(19), source: Direct(0) }, Mov { destination: Relative(20), source: Relative(13) }, Mov { destination: Relative(21), source: Relative(18) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 614 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(20) }, JumpIf { condition: Relative(4), location: 348 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(6) } }, BinaryIntOp { destination: Relative(4), op: Sub, bit_size: U32, lhs: Relative(2), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(6), op: LessThanEquals, bit_size: U32, lhs: Direct(32836), rhs: Relative(2) }, JumpIf { condition: Relative(6), location: 352 }, Call { location: 605 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(5) }, JumpIf { condition: Relative(6), location: 355 }, Call { location: 608 }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(6) }, Load { destination: Relative(4), source_pointer: Relative(17) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(13) }, Load { destination: Relative(17), source_pointer: Relative(19) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(7) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(13) }, Load { destination: Relative(6), source_pointer: Relative(19) }, Load { destination: Relative(13), source_pointer: Relative(17) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(19), op: Equals, bit_size: U32, lhs: Relative(18), rhs: Relative(13) }, Not { destination: Relative(19), source: Relative(19), bit_size: U1 }, JumpIf { condition: Relative(19), location: 373 }, Call { location: 611 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(13) }, Load { destination: Relative(13), source_pointer: Relative(6) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(20), op: Equals, bit_size: U32, lhs: Relative(19), rhs: Relative(13) }, Not { destination: Relative(20), source: Relative(20), bit_size: U1 }, JumpIf { condition: Relative(20), location: 381 }, Call { location: 611 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(13) }, Const { destination: Relative(13), bit_size: Field, value: 7 }, BinaryFieldOp { destination: Relative(20), op: Equals, lhs: Relative(4), rhs: Relative(13) }, JumpIf { condition: Relative(20), location: 388 }, Const { destination: Relative(21), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(21) } }, Load { destination: Relative(4), source_pointer: Relative(17) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(20), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(4) }, Not { destination: Relative(20), source: Relative(20), bit_size: U1 }, JumpIf { condition: Relative(20), location: 394 }, Call { location: 611 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(6) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(21), op: Equals, bit_size: U32, lhs: Relative(20), rhs: Relative(4) }, Not { destination: Relative(21), source: Relative(21), bit_size: U1 }, JumpIf { condition: Relative(21), location: 402 }, Call { location: 611 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(4) }, Const { destination: Relative(4), bit_size: Field, value: 8 }, Const { destination: Relative(6), bit_size: Field, value: 9 }, Const { destination: Relative(21), bit_size: Field, value: 22 }, Mov { destination: Relative(22), source: Direct(1) }, Const { destination: Relative(23), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(23) }, IndirectConst { destination_pointer: Relative(22), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(2) }, Mov { destination: Relative(24), source: Relative(23) }, Store { destination_pointer: Relative(24), source: Relative(4) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(24), rhs: Direct(2) }, Store { destination_pointer: Relative(24), source: Relative(6) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(24), rhs: Direct(2) }, Store { destination_pointer: Relative(24), source: Relative(21) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 23 }, Mov { destination: Relative(23), source: Direct(0) }, Mov { destination: Relative(24), source: Relative(17) }, Mov { destination: Relative(25), source: Relative(22) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 614 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(24) }, JumpIf { condition: Relative(4), location: 429 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(6) } }, BinaryIntOp { destination: Relative(4), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, JumpIf { condition: Relative(4), location: 432 }, Call { location: 608 }, BinaryIntOp { destination: Relative(4), op: Mul, bit_size: U32, lhs: Relative(2), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(17), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(4) }, Load { destination: Relative(5), source_pointer: Relative(17) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(6) }, Load { destination: Relative(17), source_pointer: Relative(22) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(7) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(1), 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) }, Load { destination: Relative(21), source_pointer: Relative(17) }, Const { destination: Relative(23), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(24), op: Equals, bit_size: U32, lhs: Relative(23), rhs: Relative(21) }, Not { destination: Relative(24), source: Relative(24), bit_size: U1 }, JumpIf { condition: Relative(24), location: 450 }, Call { location: 611 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(21) }, Load { destination: Relative(21), source_pointer: Relative(22) }, Const { destination: Relative(24), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(25), op: Equals, bit_size: U32, lhs: Relative(24), rhs: Relative(21) }, Not { destination: Relative(25), source: Relative(25), bit_size: U1 }, JumpIf { condition: Relative(25), location: 458 }, Call { location: 611 }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(21) }, Const { destination: Relative(21), bit_size: Field, value: 10 }, BinaryFieldOp { destination: Relative(25), op: Equals, lhs: Relative(5), rhs: Relative(21) }, JumpIf { condition: Relative(25), location: 465 }, Const { destination: Relative(26), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(26) } }, Load { destination: Relative(5), source_pointer: Relative(17) }, Const { destination: Relative(21), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(25), op: Equals, bit_size: U32, lhs: Relative(21), rhs: Relative(5) }, Not { destination: Relative(25), source: Relative(25), bit_size: U1 }, JumpIf { condition: Relative(25), location: 471 }, Call { location: 611 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(5) }, Load { destination: Relative(5), source_pointer: Relative(22) }, Const { destination: Relative(25), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(26), op: Equals, bit_size: U32, lhs: Relative(25), rhs: Relative(5) }, Not { destination: Relative(26), source: Relative(26), bit_size: U1 }, JumpIf { condition: Relative(26), location: 479 }, Call { location: 611 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(5) }, Const { destination: Relative(5), bit_size: Field, value: 11 }, Const { destination: Relative(26), bit_size: Field, value: 12 }, Const { destination: Relative(27), bit_size: Field, value: 23 }, Mov { destination: Relative(28), 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(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(5) }, BinaryIntOp { destination: Relative(30), op: Add, bit_size: U32, lhs: Relative(30), rhs: Direct(2) }, Store { destination_pointer: Relative(30), source: Relative(26) }, BinaryIntOp { destination: Relative(30), op: Add, bit_size: U32, lhs: Relative(30), rhs: Direct(2) }, Store { destination_pointer: Relative(30), source: Relative(27) }, Const { destination: Relative(26), bit_size: Integer(U32), value: 29 }, Mov { destination: Relative(29), source: Direct(0) }, Mov { destination: Relative(30), source: Relative(17) }, Mov { destination: Relative(31), source: Relative(28) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(26) }, Call { location: 614 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(5), source: Relative(30) }, JumpIf { condition: Relative(5), location: 506 }, Const { destination: Relative(26), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(26) } }, Load { destination: Relative(5), source_pointer: Relative(17) }, Const { destination: Relative(26), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(27), op: Equals, bit_size: U32, lhs: Relative(26), rhs: Relative(5) }, Not { destination: Relative(27), source: Relative(27), bit_size: U1 }, JumpIf { condition: Relative(27), location: 512 }, Call { location: 611 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(17), source: Relative(5) }, Load { destination: Relative(5), source_pointer: Relative(22) }, Const { destination: Relative(27), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(28), op: Equals, bit_size: U32, lhs: Relative(27), rhs: Relative(5) }, Not { destination: Relative(28), source: Relative(28), bit_size: U1 }, JumpIf { condition: Relative(28), location: 520 }, Call { location: 611 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(5) }, Const { destination: Relative(5), bit_size: Field, value: 109 }, Const { destination: Relative(28), bit_size: Field, value: 110 }, Const { destination: Relative(29), bit_size: Field, value: 111 }, Mov { destination: Relative(30), source: Direct(1) }, Const { destination: Relative(31), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(31) }, IndirectConst { destination_pointer: Relative(30), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(30), rhs: Direct(2) }, Mov { destination: Relative(32), source: Relative(31) }, Store { destination_pointer: Relative(32), source: Relative(5) }, BinaryIntOp { destination: Relative(32), op: Add, bit_size: U32, lhs: Relative(32), rhs: Direct(2) }, Store { destination_pointer: Relative(32), source: Relative(28) }, BinaryIntOp { destination: Relative(32), op: Add, bit_size: U32, lhs: Relative(32), rhs: Direct(2) }, Store { destination_pointer: Relative(32), source: Relative(29) }, Const { destination: Relative(28), bit_size: Integer(U32), value: 31 }, Mov { destination: Relative(31), source: Direct(0) }, Mov { destination: Relative(32), source: Relative(22) }, Mov { destination: Relative(33), source: Relative(30) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(28) }, Call { location: 614 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(5), source: Relative(32) }, JumpIf { condition: Relative(5), location: 547 }, Const { destination: Relative(28), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(28) } }, BinaryIntOp { destination: Relative(5), op: Equals, bit_size: U32, lhs: Relative(2), rhs: Relative(7) }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32836) }, JumpIf { condition: Relative(5), location: 575 }, Jump { location: 551 }, Const { destination: Relative(5), bit_size: Field, value: 50 }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 647 }, 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(5) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 647 }, Mov { destination: Relative(1), source: Direct(32773) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(6) }, Store { destination_pointer: Relative(5), source: Relative(17) }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 647 }, Mov { destination: Relative(4), source: Direct(32773) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(2) }, Store { destination_pointer: Relative(6), source: Relative(22) }, Store { destination_pointer: Relative(3), source: Relative(4) }, Jump { location: 599 }, Const { destination: Relative(5), bit_size: Field, value: 100 }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 647 }, 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(5) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 647 }, Mov { destination: Relative(1), source: Direct(32773) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(6) }, Store { destination_pointer: Relative(5), source: Relative(17) }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 647 }, Mov { destination: Relative(4), source: Direct(32773) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(2) }, Store { destination_pointer: Relative(6), source: Relative(22) }, Store { destination_pointer: Relative(3), source: Relative(4) }, Jump { location: 599 }, 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: 604 }, 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: 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, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 599 }, 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: 624 }, Call { location: 611 }, 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 }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 629 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32837) }, JumpIf { condition: Relative(5), location: 634 }, Jump { location: 632 }, 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(32836) }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 629 }, 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: 651 }, Jump { location: 653 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 668 }, 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: 665 }, 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: 658 }, 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: 668 }, Return]" + "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32867 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 29 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32838), size_address: Relative(3), offset_address: Relative(4) }, Cast { destination: Direct(32866), source: Direct(32866), bit_size: Integer(U32) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32838 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 13 }, 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) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 7 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 11 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 14 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 15 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 18 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 8 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 21 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 22 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 25 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 11 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 3 }, Mov { destination: Relative(10), 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(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 165 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Mov { destination: Relative(1), source: Relative(3) }, Mov { destination: Relative(2), source: Direct(32866) }, Call { location: 176 }, Call { location: 180 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32867 }, 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: 175 }, 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: 168 }, Return, Const { destination: Direct(32835), bit_size: Integer(U1), value: 1 }, Const { destination: Direct(32836), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(32837), bit_size: Integer(U32), value: 3 }, Return, Call { location: 1781 }, 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) }, BinaryIntOp { destination: Relative(4), op: Sub, bit_size: U32, lhs: Relative(2), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U32, lhs: Direct(32837), rhs: Relative(2) }, JumpIf { condition: Relative(5), location: 188 }, Call { location: 1787 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(5) }, JumpIf { condition: Relative(6), location: 192 }, Call { location: 1790 }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, 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(32836) }, 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) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(10) }, 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(6), source_pointer: Relative(13) }, Load { destination: Relative(12), 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(12) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 211 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(12) }, Load { destination: Relative(12), source_pointer: Relative(6) }, 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: 219 }, Call { location: 1793 }, 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(12), bit_size: Field, value: 1 }, BinaryFieldOp { destination: Relative(15), op: Equals, lhs: Relative(7), rhs: Relative(12) }, JumpIf { condition: Relative(15), location: 226 }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(16) } }, Load { destination: Relative(7), 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(7) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 232 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(9), source: Relative(7) }, Load { destination: Relative(7), source_pointer: Relative(6) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(17), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(7) }, Not { destination: Relative(17), source: Relative(17), bit_size: U1 }, JumpIf { condition: Relative(17), location: 240 }, Call { location: 1793 }, 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: Field, value: 2 }, Const { destination: Relative(7), bit_size: Field, value: 3 }, Const { destination: Relative(17), bit_size: Field, value: 20 }, Mov { destination: Relative(18), 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(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(6) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Relative(7) }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(20), source: Relative(17) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 21 }, Mov { destination: Relative(21), source: Direct(0) }, Mov { destination: Relative(22), source: Relative(9) }, Mov { destination: Relative(23), source: Relative(18) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(20) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(19), source: Relative(22) }, JumpIf { condition: Relative(19), location: 267 }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(9) } }, BinaryIntOp { destination: Relative(9), op: Sub, bit_size: U32, lhs: Relative(2), rhs: Relative(10) }, BinaryIntOp { destination: Relative(19), op: LessThanEquals, bit_size: U32, lhs: Relative(10), rhs: Relative(2) }, JumpIf { condition: Relative(19), location: 271 }, Call { location: 1787 }, BinaryIntOp { destination: Relative(19), op: LessThan, bit_size: U32, lhs: Relative(9), rhs: Relative(5) }, JumpIf { condition: Relative(19), location: 274 }, Call { location: 1790 }, BinaryIntOp { destination: Relative(19), op: Mul, bit_size: U32, lhs: Relative(9), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(1), 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(32836) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(1), 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: Relative(10) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(23) }, Load { destination: Relative(19), source_pointer: Relative(25) }, Load { destination: Relative(24), source_pointer: Relative(22) }, Const { destination: Relative(25), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(26), op: Equals, bit_size: U32, lhs: Relative(25), rhs: Relative(24) }, Not { destination: Relative(26), source: Relative(26), bit_size: U1 }, JumpIf { condition: Relative(26), location: 292 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(24), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(24) }, Load { destination: Relative(24), source_pointer: Relative(19) }, Const { destination: Relative(26), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(27), op: Equals, bit_size: U32, lhs: Relative(26), rhs: Relative(24) }, Not { destination: Relative(27), source: Relative(27), bit_size: U1 }, JumpIf { condition: Relative(27), location: 300 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(24), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(24) }, Const { destination: Relative(24), bit_size: Field, value: 4 }, BinaryFieldOp { destination: Relative(27), op: Equals, lhs: Relative(20), rhs: Relative(24) }, JumpIf { condition: Relative(27), location: 307 }, Const { destination: Relative(28), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(28) } }, Load { destination: Relative(20), source_pointer: Relative(22) }, Const { destination: Relative(27), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(28), op: Equals, bit_size: U32, lhs: Relative(27), rhs: Relative(20) }, Not { destination: Relative(28), source: Relative(28), bit_size: U1 }, JumpIf { condition: Relative(28), location: 313 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(20) }, Load { destination: Relative(20), source_pointer: Relative(19) }, Const { destination: Relative(28), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(29), op: Equals, bit_size: U32, lhs: Relative(28), rhs: Relative(20) }, Not { destination: Relative(29), source: Relative(29), bit_size: U1 }, JumpIf { condition: Relative(29), location: 321 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(20), op: Add, bit_size: U32, lhs: Relative(20), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(20) }, Const { destination: Relative(19), bit_size: Field, value: 5 }, Const { destination: Relative(20), bit_size: Field, value: 6 }, Const { destination: Relative(29), bit_size: Field, value: 21 }, Mov { destination: Relative(30), source: Direct(1) }, Const { destination: Relative(31), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(31) }, IndirectConst { destination_pointer: Relative(30), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(30), rhs: Direct(2) }, Mov { destination: Relative(32), source: Relative(31) }, Store { destination_pointer: Relative(32), source: Relative(19) }, BinaryIntOp { destination: Relative(32), op: Add, bit_size: U32, lhs: Relative(32), rhs: Direct(2) }, Store { destination_pointer: Relative(32), source: Relative(20) }, BinaryIntOp { destination: Relative(32), op: Add, bit_size: U32, lhs: Relative(32), rhs: Direct(2) }, Store { destination_pointer: Relative(32), source: Relative(29) }, Const { destination: Relative(29), bit_size: Integer(U32), value: 31 }, Mov { destination: Relative(31), source: Direct(0) }, Mov { destination: Relative(32), source: Relative(22) }, Mov { destination: Relative(33), source: Relative(30) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(29) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(20), source: Relative(32) }, JumpIf { condition: Relative(20), location: 348 }, Const { destination: Relative(22), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(22) } }, BinaryIntOp { destination: Relative(20), op: Sub, bit_size: U32, lhs: Relative(2), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(22), op: LessThanEquals, bit_size: U32, lhs: Direct(32836), rhs: Relative(2) }, JumpIf { condition: Relative(22), location: 352 }, Call { location: 1787 }, BinaryIntOp { destination: Relative(22), op: LessThan, bit_size: U32, lhs: Relative(20), rhs: Relative(5) }, JumpIf { condition: Relative(22), location: 355 }, Call { location: 1790 }, BinaryIntOp { destination: Relative(22), op: Mul, bit_size: U32, lhs: Relative(20), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(32), op: Add, bit_size: U32, lhs: Relative(31), rhs: Relative(22) }, Load { destination: Relative(29), source_pointer: Relative(32) }, BinaryIntOp { destination: Relative(31), op: Add, bit_size: U32, lhs: Relative(22), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(33), op: Add, bit_size: U32, lhs: Relative(1), 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) }, BinaryIntOp { destination: Relative(33), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(10) }, BinaryIntOp { destination: Relative(34), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(35), op: Add, bit_size: U32, lhs: Relative(34), rhs: Relative(33) }, Load { destination: Relative(22), source_pointer: Relative(35) }, Load { destination: Relative(34), source_pointer: Relative(32) }, Const { destination: Relative(35), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(36), op: Equals, bit_size: U32, lhs: Relative(35), rhs: Relative(34) }, Not { destination: Relative(36), source: Relative(36), bit_size: U1 }, JumpIf { condition: Relative(36), location: 373 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(34), op: Add, bit_size: U32, lhs: Relative(34), rhs: Direct(2) }, Store { destination_pointer: Relative(32), source: Relative(34) }, Load { destination: Relative(34), source_pointer: Relative(22) }, Const { destination: Relative(36), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(37), op: Equals, bit_size: U32, lhs: Relative(36), rhs: Relative(34) }, Not { destination: Relative(37), source: Relative(37), bit_size: U1 }, JumpIf { condition: Relative(37), location: 381 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(34), op: Add, bit_size: U32, lhs: Relative(34), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(34) }, Const { destination: Relative(34), bit_size: Field, value: 7 }, BinaryFieldOp { destination: Relative(37), op: Equals, lhs: Relative(29), rhs: Relative(34) }, JumpIf { condition: Relative(37), location: 388 }, Const { destination: Relative(38), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(38) } }, Load { destination: Relative(29), source_pointer: Relative(32) }, Const { destination: Relative(34), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(37), op: Equals, bit_size: U32, lhs: Relative(34), rhs: Relative(29) }, Not { destination: Relative(37), source: Relative(37), bit_size: U1 }, JumpIf { condition: Relative(37), location: 394 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(29), rhs: Direct(2) }, Store { destination_pointer: Relative(32), source: Relative(29) }, Load { destination: Relative(29), source_pointer: Relative(22) }, Const { destination: Relative(37), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(38), op: Equals, bit_size: U32, lhs: Relative(37), rhs: Relative(29) }, Not { destination: Relative(38), source: Relative(38), bit_size: U1 }, JumpIf { condition: Relative(38), location: 402 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(29), op: Add, bit_size: U32, lhs: Relative(29), rhs: Direct(2) }, Store { destination_pointer: Relative(22), source: Relative(29) }, Const { destination: Relative(22), bit_size: Field, value: 8 }, Const { destination: Relative(29), bit_size: Field, value: 9 }, Const { destination: Relative(38), bit_size: Field, value: 22 }, Mov { destination: Relative(39), source: Direct(1) }, Const { destination: Relative(40), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(40) }, IndirectConst { destination_pointer: Relative(39), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(40), op: Add, bit_size: U32, lhs: Relative(39), rhs: Direct(2) }, Mov { destination: Relative(41), source: Relative(40) }, Store { destination_pointer: Relative(41), source: Relative(22) }, BinaryIntOp { destination: Relative(41), op: Add, bit_size: U32, lhs: Relative(41), rhs: Direct(2) }, Store { destination_pointer: Relative(41), source: Relative(29) }, BinaryIntOp { destination: Relative(41), op: Add, bit_size: U32, lhs: Relative(41), rhs: Direct(2) }, Store { destination_pointer: Relative(41), source: Relative(38) }, Const { destination: Relative(40), bit_size: Integer(U32), value: 41 }, Mov { destination: Relative(41), source: Direct(0) }, Mov { destination: Relative(42), source: Relative(32) }, Mov { destination: Relative(43), source: Relative(39) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(40) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(38), source: Relative(42) }, JumpIf { condition: Relative(38), location: 429 }, Const { destination: Relative(32), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(32) } }, BinaryIntOp { destination: Relative(32), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, JumpIf { condition: Relative(32), location: 432 }, Call { location: 1790 }, BinaryIntOp { destination: Relative(32), op: Mul, bit_size: U32, lhs: Relative(2), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(39), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(40), op: Add, bit_size: U32, lhs: Relative(39), rhs: Relative(32) }, Load { destination: Relative(38), source_pointer: Relative(40) }, BinaryIntOp { destination: Relative(39), op: Add, bit_size: U32, lhs: Relative(32), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(41), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(42), op: Add, bit_size: U32, lhs: Relative(41), rhs: Relative(39) }, Load { destination: Relative(40), source_pointer: Relative(42) }, BinaryIntOp { destination: Relative(41), op: Add, bit_size: U32, lhs: Relative(32), rhs: Relative(10) }, BinaryIntOp { destination: Relative(43), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(44), op: Add, bit_size: U32, lhs: Relative(43), rhs: Relative(41) }, Load { destination: Relative(42), source_pointer: Relative(44) }, Load { destination: Relative(43), source_pointer: Relative(40) }, Const { destination: Relative(44), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(45), op: Equals, bit_size: U32, lhs: Relative(44), rhs: Relative(43) }, Not { destination: Relative(45), source: Relative(45), bit_size: U1 }, JumpIf { condition: Relative(45), location: 450 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(43), op: Add, bit_size: U32, lhs: Relative(43), rhs: Direct(2) }, Store { destination_pointer: Relative(40), source: Relative(43) }, Load { destination: Relative(43), source_pointer: Relative(42) }, Const { destination: Relative(45), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(46), op: Equals, bit_size: U32, lhs: Relative(45), rhs: Relative(43) }, Not { destination: Relative(46), source: Relative(46), bit_size: U1 }, JumpIf { condition: Relative(46), location: 458 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(43), op: Add, bit_size: U32, lhs: Relative(43), rhs: Direct(2) }, Store { destination_pointer: Relative(42), source: Relative(43) }, Const { destination: Relative(43), bit_size: Field, value: 10 }, BinaryFieldOp { destination: Relative(46), op: Equals, lhs: Relative(38), rhs: Relative(43) }, JumpIf { condition: Relative(46), location: 465 }, Const { destination: Relative(47), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(47) } }, Load { destination: Relative(38), source_pointer: Relative(40) }, Const { destination: Relative(46), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(47), op: Equals, bit_size: U32, lhs: Relative(46), rhs: Relative(38) }, Not { destination: Relative(47), source: Relative(47), bit_size: U1 }, JumpIf { condition: Relative(47), location: 471 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(38), op: Add, bit_size: U32, lhs: Relative(38), rhs: Direct(2) }, Store { destination_pointer: Relative(40), source: Relative(38) }, Load { destination: Relative(38), source_pointer: Relative(42) }, Const { destination: Relative(47), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(48), op: Equals, bit_size: U32, lhs: Relative(47), rhs: Relative(38) }, Not { destination: Relative(48), source: Relative(48), bit_size: U1 }, JumpIf { condition: Relative(48), location: 479 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(38), op: Add, bit_size: U32, lhs: Relative(38), rhs: Direct(2) }, Store { destination_pointer: Relative(42), source: Relative(38) }, Const { destination: Relative(38), bit_size: Field, value: 11 }, Const { destination: Relative(48), bit_size: Field, value: 12 }, Const { destination: Relative(49), bit_size: Field, value: 23 }, Mov { destination: Relative(50), source: Direct(1) }, Const { destination: Relative(51), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(51) }, IndirectConst { destination_pointer: Relative(50), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(51), op: Add, bit_size: U32, lhs: Relative(50), rhs: Direct(2) }, Mov { destination: Relative(52), source: Relative(51) }, Store { destination_pointer: Relative(52), source: Relative(38) }, BinaryIntOp { destination: Relative(52), op: Add, bit_size: U32, lhs: Relative(52), rhs: Direct(2) }, Store { destination_pointer: Relative(52), source: Relative(48) }, BinaryIntOp { destination: Relative(52), op: Add, bit_size: U32, lhs: Relative(52), rhs: Direct(2) }, Store { destination_pointer: Relative(52), source: Relative(49) }, Const { destination: Relative(48), bit_size: Integer(U32), value: 51 }, Mov { destination: Relative(51), source: Direct(0) }, Mov { destination: Relative(52), source: Relative(40) }, Mov { destination: Relative(53), source: Relative(50) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(48) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(38), source: Relative(52) }, JumpIf { condition: Relative(38), location: 506 }, Const { destination: Relative(48), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(48) } }, Load { destination: Relative(38), source_pointer: Relative(40) }, Const { destination: Relative(48), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(49), op: Equals, bit_size: U32, lhs: Relative(48), rhs: Relative(38) }, Not { destination: Relative(49), source: Relative(49), bit_size: U1 }, JumpIf { condition: Relative(49), location: 512 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(38), op: Add, bit_size: U32, lhs: Relative(38), rhs: Direct(2) }, Store { destination_pointer: Relative(40), source: Relative(38) }, Load { destination: Relative(38), source_pointer: Relative(42) }, Const { destination: Relative(49), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(51), op: Equals, bit_size: U32, lhs: Relative(49), rhs: Relative(38) }, Not { destination: Relative(51), source: Relative(51), bit_size: U1 }, JumpIf { condition: Relative(51), location: 520 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(38), op: Add, bit_size: U32, lhs: Relative(38), rhs: Direct(2) }, Store { destination_pointer: Relative(42), source: Relative(38) }, Const { destination: Relative(38), bit_size: Field, value: 109 }, Const { destination: Relative(51), bit_size: Field, value: 110 }, Const { destination: Relative(52), bit_size: Field, value: 111 }, Mov { destination: Relative(53), source: Direct(1) }, Const { destination: Relative(54), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(54) }, IndirectConst { destination_pointer: Relative(53), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(54), op: Add, bit_size: U32, lhs: Relative(53), rhs: Direct(2) }, Mov { destination: Relative(55), source: Relative(54) }, Store { destination_pointer: Relative(55), source: Relative(38) }, BinaryIntOp { destination: Relative(55), op: Add, bit_size: U32, lhs: Relative(55), rhs: Direct(2) }, Store { destination_pointer: Relative(55), source: Relative(51) }, BinaryIntOp { destination: Relative(55), op: Add, bit_size: U32, lhs: Relative(55), rhs: Direct(2) }, Store { destination_pointer: Relative(55), source: Relative(52) }, Const { destination: Relative(51), bit_size: Integer(U32), value: 54 }, Mov { destination: Relative(54), source: Direct(0) }, Mov { destination: Relative(55), source: Relative(42) }, Mov { destination: Relative(56), source: Relative(53) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(51) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(38), source: Relative(55) }, JumpIf { condition: Relative(38), location: 547 }, Const { destination: Relative(51), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(51) } }, BinaryIntOp { destination: Relative(38), op: Equals, bit_size: U32, lhs: Relative(2), rhs: Relative(10) }, BinaryIntOp { destination: Relative(51), op: Add, bit_size: U32, lhs: Relative(39), rhs: Direct(32836) }, Const { destination: Relative(52), bit_size: Field, value: 100 }, Const { destination: Relative(54), bit_size: Field, value: 50 }, JumpIf { condition: Relative(38), location: 576 }, Jump { location: 553 }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, 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(32) }, Store { destination_pointer: Relative(15), source: Relative(54) }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, Mov { destination: Relative(1), source: Direct(32773) }, 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(39) }, Store { destination_pointer: Relative(15), source: Relative(40) }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, 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(51) }, Store { destination_pointer: Relative(15), source: Relative(42) }, Store { destination_pointer: Relative(3), source: Relative(13) }, Jump { location: 599 }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, 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(32) }, Store { destination_pointer: Relative(15), source: Relative(52) }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, Mov { destination: Relative(1), source: Direct(32773) }, 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(39) }, Store { destination_pointer: Relative(15), source: Relative(40) }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, 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(51) }, Store { destination_pointer: Relative(15), source: Relative(42) }, Store { destination_pointer: Relative(3), source: Relative(13) }, Jump { location: 599 }, Load { destination: Relative(1), source_pointer: Relative(3) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 10 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(13) }, Load { destination: Relative(14), source_pointer: Relative(15) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 11 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(13) }, Load { destination: Relative(15), source_pointer: Relative(16) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 12 }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(13) }, Load { destination: Relative(16), source_pointer: Relative(25) }, Load { destination: Relative(1), source_pointer: Relative(15) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(25), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(1) }, Not { destination: Relative(25), source: Relative(25), bit_size: U1 }, JumpIf { condition: Relative(25), location: 615 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(15), source: Relative(1) }, Load { destination: Relative(1), source_pointer: Relative(16) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(25), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(1) }, Not { destination: Relative(25), source: Relative(25), bit_size: U1 }, JumpIf { condition: Relative(25), location: 623 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(1) }, BinaryFieldOp { destination: Relative(1), op: Equals, lhs: Relative(14), rhs: Relative(54) }, JumpIf { condition: Relative(1), location: 629 }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(16) } }, Const { destination: Relative(1), bit_size: Field, value: 101 }, Const { destination: Relative(14), bit_size: Field, value: 102 }, Mov { destination: Relative(16), source: Direct(1) }, Const { destination: Relative(25), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(25) }, IndirectConst { destination_pointer: Relative(16), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Mov { destination: Relative(26), source: Relative(25) }, Store { destination_pointer: Relative(26), source: Relative(52) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(26), rhs: Direct(2) }, Store { destination_pointer: Relative(26), source: Relative(1) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(26), rhs: Direct(2) }, Store { destination_pointer: Relative(26), source: Relative(14) }, Load { destination: Relative(1), source_pointer: Relative(16) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(25), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(1) }, Not { destination: Relative(25), source: Relative(25), bit_size: U1 }, JumpIf { condition: Relative(25), location: 648 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(1) }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(31), rhs: Direct(32836) }, JumpIf { condition: Relative(38), location: 681 }, Jump { location: 653 }, Load { destination: Relative(13), source_pointer: Relative(16) }, 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: 659 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(13) }, Load { destination: Relative(13), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Relative(33) }, Load { destination: Relative(15), source_pointer: Relative(26) }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, 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(31) }, Store { destination_pointer: Relative(27), source: Relative(16) }, Mov { destination: Direct(32771), source: Relative(25) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, Mov { destination: Relative(13), source: Direct(32773) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(26), rhs: Relative(1) }, Store { destination_pointer: Relative(27), source: Relative(15) }, Store { destination_pointer: Relative(3), source: Relative(13) }, Jump { location: 715 }, Const { destination: Relative(1), bit_size: Field, value: 51 }, Const { destination: Relative(13), bit_size: Field, value: 52 }, 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(25), source: Relative(15) }, Store { destination_pointer: Relative(25), source: Relative(54) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, Store { destination_pointer: Relative(25), source: Relative(1) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(25), rhs: Direct(2) }, Store { destination_pointer: Relative(25), source: Relative(13) }, Load { destination: Relative(1), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(15), rhs: Relative(33) }, Load { destination: Relative(13), source_pointer: Relative(25) }, Mov { destination: Direct(32771), source: Relative(1) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, Mov { destination: Relative(15), source: Direct(32773) }, BinaryIntOp { destination: Relative(25), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(25), rhs: Relative(31) }, Store { destination_pointer: Relative(26), source: Relative(14) }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(31), rhs: Direct(32836) }, Mov { destination: Direct(32771), source: Relative(15) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, Mov { destination: Relative(14), source: Direct(32773) }, 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(1) }, Store { destination_pointer: Relative(26), source: Relative(13) }, Store { destination_pointer: Relative(3), source: Relative(14) }, Jump { location: 715 }, Load { destination: Relative(1), source_pointer: Relative(3) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 8 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Load { destination: Relative(13), source_pointer: Relative(14) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Load { destination: Relative(14), source_pointer: Relative(15) }, Load { destination: Relative(3), source_pointer: Relative(13) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(25), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(3) }, Not { destination: Relative(25), source: Relative(25), bit_size: U1 }, JumpIf { condition: Relative(25), location: 728 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(3) }, Load { destination: Relative(3), source_pointer: Relative(14) }, Const { destination: Relative(25), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(26), op: Equals, bit_size: U32, lhs: Relative(25), rhs: Relative(3) }, Not { destination: Relative(26), source: Relative(26), bit_size: U1 }, JumpIf { condition: Relative(26), location: 736 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(3) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 55 }, Mov { destination: Relative(55), source: Direct(0) }, Mov { destination: Relative(56), source: Relative(13) }, Mov { destination: Relative(57), source: Relative(16) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(14) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(3), source: Relative(56) }, JumpIf { condition: Relative(3), location: 749 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(13) } }, 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(8) }, Load { destination: Relative(3), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(26), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(11) }, Load { destination: Relative(13), source_pointer: Relative(26) }, Load { destination: Relative(14), source_pointer: Relative(3) }, Const { destination: Relative(26), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(27), op: Equals, bit_size: U32, lhs: Relative(26), rhs: Relative(14) }, Not { destination: Relative(27), source: Relative(27), bit_size: U1 }, JumpIf { condition: Relative(27), location: 761 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(14), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(14) }, Load { destination: Relative(3), source_pointer: Relative(13) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(27), op: Equals, bit_size: U32, lhs: Relative(14), rhs: Relative(3) }, Not { destination: Relative(27), source: Relative(27), bit_size: U1 }, JumpIf { condition: Relative(27), location: 769 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(3) }, Const { destination: Relative(27), bit_size: Integer(U32), value: 55 }, Mov { destination: Relative(55), source: Direct(0) }, Mov { destination: Relative(56), source: Relative(13) }, Mov { destination: Relative(57), source: Relative(16) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(27) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(3), source: Relative(56) }, JumpIf { condition: Relative(3), location: 782 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(13) } }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(21) }, Load { destination: Relative(3), source_pointer: Relative(27) }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(28), op: Add, bit_size: U32, lhs: Relative(27), rhs: Relative(23) }, Load { destination: Relative(13), source_pointer: Relative(28) }, Load { destination: Relative(27), source_pointer: Relative(3) }, Const { destination: Relative(28), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(34), op: Equals, bit_size: U32, lhs: Relative(28), rhs: Relative(27) }, Not { destination: Relative(34), source: Relative(34), bit_size: U1 }, JumpIf { condition: Relative(34), location: 794 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(27), op: Add, bit_size: U32, lhs: Relative(27), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(27) }, Load { destination: Relative(3), source_pointer: Relative(13) }, Const { destination: Relative(27), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(34), op: Equals, bit_size: U32, lhs: Relative(27), rhs: Relative(3) }, Not { destination: Relative(34), source: Relative(34), bit_size: U1 }, JumpIf { condition: Relative(34), location: 802 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(3) }, Const { destination: Relative(3), bit_size: Field, value: 103 }, Const { destination: Relative(34), bit_size: Field, value: 104 }, Const { destination: Relative(35), bit_size: Field, value: 105 }, Mov { destination: Relative(36), source: Direct(1) }, Const { destination: Relative(37), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(37) }, IndirectConst { destination_pointer: Relative(36), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(37), op: Add, bit_size: U32, lhs: Relative(36), rhs: Direct(2) }, Mov { destination: Relative(40), source: Relative(37) }, Store { destination_pointer: Relative(40), source: Relative(3) }, BinaryIntOp { destination: Relative(40), op: Add, bit_size: U32, lhs: Relative(40), rhs: Direct(2) }, Store { destination_pointer: Relative(40), source: Relative(34) }, BinaryIntOp { destination: Relative(40), op: Add, bit_size: U32, lhs: Relative(40), rhs: Direct(2) }, Store { destination_pointer: Relative(40), source: Relative(35) }, Const { destination: Relative(34), bit_size: Integer(U32), value: 55 }, Mov { destination: Relative(55), source: Direct(0) }, Mov { destination: Relative(56), source: Relative(13) }, Mov { destination: Relative(57), source: Relative(36) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(34) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(3), source: Relative(56) }, JumpIf { condition: Relative(3), location: 829 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(13) } }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(34), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(31) }, Load { destination: Relative(3), source_pointer: Relative(34) }, BinaryIntOp { destination: Relative(34), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(35), op: Add, bit_size: U32, lhs: Relative(34), rhs: Relative(33) }, Load { destination: Relative(13), source_pointer: Relative(35) }, Load { destination: Relative(34), source_pointer: Relative(3) }, Const { destination: Relative(35), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(36), op: Equals, bit_size: U32, lhs: Relative(35), rhs: Relative(34) }, Not { destination: Relative(36), source: Relative(36), bit_size: U1 }, JumpIf { condition: Relative(36), location: 841 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(34), op: Add, bit_size: U32, lhs: Relative(34), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(34) }, Load { destination: Relative(3), source_pointer: Relative(13) }, Const { destination: Relative(34), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(36), op: Equals, bit_size: U32, lhs: Relative(34), rhs: Relative(3) }, Not { destination: Relative(36), source: Relative(36), bit_size: U1 }, JumpIf { condition: Relative(36), location: 849 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(3) }, Const { destination: Relative(3), bit_size: Field, value: 106 }, Const { destination: Relative(36), bit_size: Field, value: 107 }, Const { destination: Relative(37), bit_size: Field, value: 108 }, Mov { destination: Relative(40), source: Direct(1) }, Const { destination: Relative(42), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(42) }, IndirectConst { destination_pointer: Relative(40), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(42), op: Add, bit_size: U32, lhs: Relative(40), rhs: Direct(2) }, Mov { destination: Relative(44), source: Relative(42) }, Store { destination_pointer: Relative(44), source: Relative(3) }, BinaryIntOp { destination: Relative(44), op: Add, bit_size: U32, lhs: Relative(44), rhs: Direct(2) }, Store { destination_pointer: Relative(44), source: Relative(36) }, BinaryIntOp { destination: Relative(44), op: Add, bit_size: U32, lhs: Relative(44), rhs: Direct(2) }, Store { destination_pointer: Relative(44), source: Relative(37) }, Const { destination: Relative(36), bit_size: Integer(U32), value: 55 }, Mov { destination: Relative(55), source: Direct(0) }, Mov { destination: Relative(56), source: Relative(13) }, Mov { destination: Relative(57), source: Relative(40) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(36) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(3), source: Relative(56) }, JumpIf { condition: Relative(3), location: 876 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(13) } }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(36), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(39) }, Load { destination: Relative(3), source_pointer: Relative(36) }, BinaryIntOp { destination: Relative(36), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BinaryIntOp { destination: Relative(37), op: Add, bit_size: U32, lhs: Relative(36), rhs: Relative(41) }, Load { destination: Relative(13), source_pointer: Relative(37) }, Load { destination: Relative(36), source_pointer: Relative(3) }, Const { destination: Relative(37), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(40), op: Equals, bit_size: U32, lhs: Relative(37), rhs: Relative(36) }, Not { destination: Relative(40), source: Relative(40), bit_size: U1 }, JumpIf { condition: Relative(40), location: 888 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(36), op: Add, bit_size: U32, lhs: Relative(36), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(36) }, Load { destination: Relative(3), source_pointer: Relative(13) }, Const { destination: Relative(36), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(40), op: Equals, bit_size: U32, lhs: Relative(36), rhs: Relative(3) }, Not { destination: Relative(40), source: Relative(40), bit_size: U1 }, JumpIf { condition: Relative(40), location: 896 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(3) }, Load { destination: Relative(3), source_pointer: Relative(53) }, Const { destination: Relative(40), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(42), op: Equals, bit_size: U32, lhs: Relative(40), rhs: Relative(3) }, Not { destination: Relative(42), source: Relative(42), bit_size: U1 }, JumpIf { condition: Relative(42), location: 904 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(53), source: Relative(3) }, Const { destination: Relative(42), bit_size: Integer(U32), value: 55 }, Mov { destination: Relative(55), source: Direct(0) }, Mov { destination: Relative(56), source: Relative(13) }, Mov { destination: Relative(57), source: Relative(53) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(42) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(3), source: Relative(56) }, JumpIf { condition: Relative(3), location: 917 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(13) } }, Const { destination: Relative(3), bit_size: Field, value: 0 }, Mov { destination: Relative(13), source: Direct(1) }, Const { destination: Relative(42), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(42) }, IndirectConst { destination_pointer: Relative(13), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(42), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Mov { destination: Relative(44), source: Relative(42) }, Store { destination_pointer: Relative(44), source: Relative(3) }, BinaryIntOp { destination: Relative(44), op: Add, bit_size: U32, lhs: Relative(44), rhs: Direct(2) }, Store { destination_pointer: Relative(44), source: Relative(12) }, BinaryIntOp { destination: Relative(44), op: Add, bit_size: U32, lhs: Relative(44), rhs: Direct(2) }, Store { destination_pointer: Relative(44), source: Relative(6) }, Load { destination: Relative(3), source_pointer: Relative(1) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(3) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 935 }, Call { location: 1793 }, 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(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(3), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Mov { destination: Relative(42), source: Relative(12) }, Store { destination_pointer: Relative(42), source: Relative(7) }, BinaryIntOp { destination: Relative(42), op: Add, bit_size: U32, lhs: Relative(42), rhs: Direct(2) }, Store { destination_pointer: Relative(42), source: Relative(24) }, BinaryIntOp { destination: Relative(42), op: Add, bit_size: U32, lhs: Relative(42), rhs: Direct(2) }, Store { destination_pointer: Relative(42), source: Relative(19) }, Mov { destination: Relative(7), source: Direct(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 5 }, 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(19), source: Relative(12) }, 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(1) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(3) }, 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(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(7) }, BinaryIntOp { destination: Relative(13), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Relative(10) }, JumpIf { condition: Relative(13), location: 967 }, Call { location: 1790 }, BinaryIntOp { destination: Relative(13), op: Mul, bit_size: U32, lhs: Relative(4), rhs: Relative(10) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(19), rhs: Relative(13) }, Load { destination: Relative(4), source_pointer: Relative(24) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(24), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(42), op: Add, bit_size: U32, lhs: Relative(24), rhs: Relative(19) }, Load { destination: Relative(13), source_pointer: Relative(42) }, Load { destination: Relative(19), source_pointer: Relative(4) }, Const { destination: Relative(24), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(42), op: Equals, bit_size: U32, lhs: Relative(24), rhs: Relative(19) }, Not { destination: Relative(42), source: Relative(42), bit_size: U1 }, JumpIf { condition: Relative(42), location: 981 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(19) }, Load { destination: Relative(19), source_pointer: Relative(13) }, Const { destination: Relative(42), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(44), op: Equals, bit_size: U32, lhs: Relative(42), rhs: Relative(19) }, Not { destination: Relative(44), source: Relative(44), bit_size: U1 }, JumpIf { condition: Relative(44), location: 989 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(19), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(19) }, BinaryIntOp { destination: Relative(44), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(45), op: Add, bit_size: U32, lhs: Relative(44), rhs: Relative(8) }, Load { destination: Relative(19), source_pointer: Relative(45) }, BinaryIntOp { destination: Relative(45), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(46), op: Add, bit_size: U32, lhs: Relative(45), rhs: Relative(11) }, Load { destination: Relative(44), source_pointer: Relative(46) }, Load { destination: Relative(45), source_pointer: Relative(19) }, Const { destination: Relative(46), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(47), op: Equals, bit_size: U32, lhs: Relative(46), rhs: Relative(45) }, Not { destination: Relative(47), source: Relative(47), bit_size: U1 }, JumpIf { condition: Relative(47), location: 1003 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(45), op: Add, bit_size: U32, lhs: Relative(45), rhs: Direct(2) }, Store { destination_pointer: Relative(19), source: Relative(45) }, Load { destination: Relative(45), source_pointer: Relative(44) }, Const { destination: Relative(47), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(48), op: Equals, bit_size: U32, lhs: Relative(47), rhs: Relative(45) }, Not { destination: Relative(48), source: Relative(48), bit_size: U1 }, JumpIf { condition: Relative(48), location: 1011 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(45), op: Add, bit_size: U32, lhs: Relative(45), rhs: Direct(2) }, Store { destination_pointer: Relative(44), source: Relative(45) }, Load { destination: Relative(44), source_pointer: Relative(18) }, Const { destination: Relative(45), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(48), op: Equals, bit_size: U32, lhs: Relative(45), rhs: Relative(44) }, Not { destination: Relative(48), source: Relative(48), bit_size: U1 }, JumpIf { condition: Relative(48), location: 1019 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(44), op: Add, bit_size: U32, lhs: Relative(44), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(44) }, Const { destination: Relative(48), bit_size: Integer(U32), value: 55 }, Mov { destination: Relative(55), source: Direct(0) }, Mov { destination: Relative(56), source: Relative(19) }, Mov { destination: Relative(57), source: Relative(18) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(48) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(44), source: Relative(56) }, JumpIf { condition: Relative(44), location: 1032 }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(18) } }, Load { destination: Relative(18), source_pointer: Relative(4) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(44), op: Equals, bit_size: U32, lhs: Relative(19), rhs: Relative(18) }, Not { destination: Relative(44), source: Relative(44), bit_size: U1 }, JumpIf { condition: Relative(44), location: 1038 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(18) }, Load { destination: Relative(18), source_pointer: Relative(13) }, Const { destination: Relative(44), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(48), op: Equals, bit_size: U32, lhs: Relative(44), rhs: Relative(18) }, Not { destination: Relative(48), source: Relative(48), bit_size: U1 }, JumpIf { condition: Relative(48), location: 1046 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(18) }, BinaryIntOp { destination: Relative(48), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(49), op: Add, bit_size: U32, lhs: Relative(48), rhs: Relative(21) }, Load { destination: Relative(18), source_pointer: Relative(49) }, BinaryIntOp { destination: Relative(49), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(51), op: Add, bit_size: U32, lhs: Relative(49), rhs: Relative(23) }, Load { destination: Relative(48), source_pointer: Relative(51) }, Load { destination: Relative(49), source_pointer: Relative(18) }, Const { destination: Relative(51), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(52), op: Equals, bit_size: U32, lhs: Relative(51), rhs: Relative(49) }, Not { destination: Relative(52), source: Relative(52), bit_size: U1 }, JumpIf { condition: Relative(52), location: 1060 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(49), op: Add, bit_size: U32, lhs: Relative(49), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(49) }, Load { destination: Relative(49), source_pointer: Relative(48) }, Const { destination: Relative(52), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(53), op: Equals, bit_size: U32, lhs: Relative(52), rhs: Relative(49) }, Not { destination: Relative(53), source: Relative(53), bit_size: U1 }, JumpIf { condition: Relative(53), location: 1068 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(49), op: Add, bit_size: U32, lhs: Relative(49), rhs: Direct(2) }, Store { destination_pointer: Relative(48), source: Relative(49) }, Load { destination: Relative(48), source_pointer: Relative(30) }, Const { destination: Relative(49), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(53), op: Equals, bit_size: U32, lhs: Relative(49), rhs: Relative(48) }, Not { destination: Relative(53), source: Relative(53), bit_size: U1 }, JumpIf { condition: Relative(53), location: 1076 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(48), op: Add, bit_size: U32, lhs: Relative(48), rhs: Direct(2) }, Store { destination_pointer: Relative(30), source: Relative(48) }, Const { destination: Relative(53), bit_size: Integer(U32), value: 55 }, Mov { destination: Relative(55), source: Direct(0) }, Mov { destination: Relative(56), source: Relative(18) }, Mov { destination: Relative(57), source: Relative(30) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(53) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(48), source: Relative(56) }, JumpIf { condition: Relative(48), location: 1089 }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(18) } }, Load { destination: Relative(18), source_pointer: Relative(4) }, Const { destination: Relative(48), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(53), op: Equals, bit_size: U32, lhs: Relative(48), rhs: Relative(18) }, Not { destination: Relative(53), source: Relative(53), bit_size: U1 }, JumpIf { condition: Relative(53), location: 1095 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(18) }, Load { destination: Relative(18), source_pointer: Relative(13) }, Const { destination: Relative(53), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(55), op: Equals, bit_size: U32, lhs: Relative(53), rhs: Relative(18) }, Not { destination: Relative(55), source: Relative(55), bit_size: U1 }, JumpIf { condition: Relative(55), location: 1103 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(18) }, BinaryIntOp { destination: Relative(55), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(56), op: Add, bit_size: U32, lhs: Relative(55), rhs: Relative(31) }, Load { destination: Relative(18), source_pointer: Relative(56) }, BinaryIntOp { destination: Relative(55), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(56), op: Add, bit_size: U32, lhs: Relative(55), rhs: Relative(33) }, Load { destination: Relative(31), source_pointer: Relative(56) }, Load { destination: Relative(33), source_pointer: Relative(18) }, Const { destination: Relative(55), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(56), op: Equals, bit_size: U32, lhs: Relative(55), rhs: Relative(33) }, Not { destination: Relative(56), source: Relative(56), bit_size: U1 }, JumpIf { condition: Relative(56), location: 1117 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(33), op: Add, bit_size: U32, lhs: Relative(33), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(33) }, Load { destination: Relative(33), source_pointer: Relative(31) }, Const { destination: Relative(56), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(57), op: Equals, bit_size: U32, lhs: Relative(56), rhs: Relative(33) }, Not { destination: Relative(57), source: Relative(57), bit_size: U1 }, JumpIf { condition: Relative(57), location: 1125 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(33), op: Add, bit_size: U32, lhs: Relative(33), rhs: Direct(2) }, Store { destination_pointer: Relative(31), source: Relative(33) }, Const { destination: Relative(33), bit_size: Integer(U32), value: 57 }, Mov { destination: Relative(57), source: Direct(0) }, Mov { destination: Relative(58), source: Relative(18) }, Mov { destination: Relative(59), source: Relative(16) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(33) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(31), source: Relative(58) }, JumpIf { condition: Relative(31), location: 1138 }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(16) } }, Load { destination: Relative(16), source_pointer: Relative(4) }, Const { destination: Relative(18), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(31), op: Equals, bit_size: U32, lhs: Relative(18), rhs: Relative(16) }, Not { destination: Relative(31), source: Relative(31), bit_size: U1 }, JumpIf { condition: Relative(31), location: 1144 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(16) }, Load { destination: Relative(16), source_pointer: Relative(13) }, Const { destination: Relative(31), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(33), op: Equals, bit_size: U32, lhs: Relative(31), rhs: Relative(16) }, Not { destination: Relative(33), source: Relative(33), bit_size: U1 }, JumpIf { condition: Relative(33), location: 1152 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(16), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(16) }, BinaryIntOp { destination: Relative(33), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(57), op: Add, bit_size: U32, lhs: Relative(33), rhs: Relative(39) }, Load { destination: Relative(16), source_pointer: Relative(57) }, BinaryIntOp { destination: Relative(39), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(57), op: Add, bit_size: U32, lhs: Relative(39), rhs: Relative(41) }, Load { destination: Relative(33), source_pointer: Relative(57) }, Load { destination: Relative(39), source_pointer: Relative(16) }, Const { destination: Relative(41), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(57), op: Equals, bit_size: U32, lhs: Relative(41), rhs: Relative(39) }, Not { destination: Relative(57), source: Relative(57), bit_size: U1 }, JumpIf { condition: Relative(57), location: 1166 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(39), op: Add, bit_size: U32, lhs: Relative(39), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(39) }, Load { destination: Relative(39), source_pointer: Relative(33) }, Const { destination: Relative(57), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(58), op: Equals, bit_size: U32, lhs: Relative(57), rhs: Relative(39) }, Not { destination: Relative(58), source: Relative(58), bit_size: U1 }, JumpIf { condition: Relative(58), location: 1174 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(39), op: Add, bit_size: U32, lhs: Relative(39), rhs: Direct(2) }, Store { destination_pointer: Relative(33), source: Relative(39) }, Load { destination: Relative(39), source_pointer: Relative(50) }, Const { destination: Relative(58), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(59), op: Equals, bit_size: U32, lhs: Relative(58), rhs: Relative(39) }, Not { destination: Relative(59), source: Relative(59), bit_size: U1 }, JumpIf { condition: Relative(59), location: 1182 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(39), op: Add, bit_size: U32, lhs: Relative(39), rhs: Direct(2) }, Store { destination_pointer: Relative(50), source: Relative(39) }, Const { destination: Relative(59), bit_size: Integer(U32), value: 60 }, Mov { destination: Relative(60), source: Direct(0) }, Mov { destination: Relative(61), source: Relative(16) }, Mov { destination: Relative(62), source: Relative(50) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(59) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(39), source: Relative(61) }, JumpIf { condition: Relative(39), location: 1195 }, Const { destination: Relative(50), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(50) } }, Load { destination: Relative(39), source_pointer: Relative(4) }, Const { destination: Relative(50), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(59), op: Equals, bit_size: U32, lhs: Relative(50), rhs: Relative(39) }, Not { destination: Relative(59), source: Relative(59), bit_size: U1 }, JumpIf { condition: Relative(59), location: 1201 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(39), op: Add, bit_size: U32, lhs: Relative(39), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(39) }, Load { destination: Relative(4), source_pointer: Relative(13) }, Const { destination: Relative(39), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(59), op: Equals, bit_size: U32, lhs: Relative(39), rhs: Relative(4) }, Not { destination: Relative(59), source: Relative(59), bit_size: U1 }, JumpIf { condition: Relative(59), location: 1209 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(4) }, BinaryIntOp { destination: Relative(59), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, BinaryIntOp { destination: Relative(60), op: Add, bit_size: U32, lhs: Relative(59), rhs: Relative(32) }, Load { destination: Relative(4), source_pointer: Relative(60) }, Load { destination: Relative(13), source_pointer: Relative(16) }, Const { destination: Relative(32), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(59), op: Equals, bit_size: U32, lhs: Relative(32), rhs: Relative(13) }, Not { destination: Relative(59), source: Relative(59), bit_size: U1 }, JumpIf { condition: Relative(59), location: 1220 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(16), source: Relative(13) }, Load { destination: Relative(13), source_pointer: Relative(33) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(59), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(13) }, Not { destination: Relative(59), source: Relative(59), bit_size: U1 }, JumpIf { condition: Relative(59), location: 1228 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(33), source: Relative(13) }, BinaryFieldOp { destination: Relative(13), op: Equals, lhs: Relative(4), rhs: Relative(54) }, JumpIf { condition: Relative(13), location: 1234 }, Const { destination: Relative(33), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(33) } }, Load { destination: Relative(4), source_pointer: Relative(3) }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(33), op: Equals, bit_size: U32, lhs: Relative(13), rhs: Relative(4) }, Not { destination: Relative(33), source: Relative(33), bit_size: U1 }, JumpIf { condition: Relative(33), location: 1240 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(4) }, Load { destination: Relative(3), source_pointer: Relative(1) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(33), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, Not { destination: Relative(33), source: Relative(33), bit_size: U1 }, JumpIf { condition: Relative(33), location: 1248 }, Call { location: 1793 }, 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(3), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Relative(54), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Load { destination: Relative(33), source_pointer: Relative(54) }, Const { destination: Relative(54), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(60), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(54) }, Load { destination: Relative(59), source_pointer: Relative(60) }, Load { destination: Relative(1), source_pointer: Relative(33) }, Const { destination: Relative(60), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(61), op: Equals, bit_size: U32, lhs: Relative(60), rhs: Relative(1) }, Not { destination: Relative(61), source: Relative(61), bit_size: U1 }, JumpIf { condition: Relative(61), location: 1262 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(33), source: Relative(1) }, Load { destination: Relative(1), source_pointer: Relative(59) }, Const { destination: Relative(61), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(62), op: Equals, bit_size: U32, lhs: Relative(61), rhs: Relative(1) }, Not { destination: Relative(62), source: Relative(62), bit_size: U1 }, JumpIf { condition: Relative(62), location: 1270 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(59), source: Relative(1) }, Load { destination: Relative(1), source_pointer: Relative(30) }, Const { destination: Relative(59), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(62), op: Equals, bit_size: U32, lhs: Relative(59), rhs: Relative(1) }, Not { destination: Relative(62), source: Relative(62), bit_size: U1 }, JumpIf { condition: Relative(62), location: 1278 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Store { destination_pointer: Relative(30), source: Relative(1) }, Const { destination: Relative(62), bit_size: Integer(U32), value: 63 }, Mov { destination: Relative(63), source: Direct(0) }, Mov { destination: Relative(64), source: Relative(33) }, Mov { destination: Relative(65), source: Relative(30) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(62) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(64) }, JumpIf { condition: Relative(1), location: 1291 }, Const { destination: Relative(30), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(30) } }, Const { destination: Relative(1), bit_size: Field, value: 19 }, Const { destination: Relative(30), bit_size: Field, value: 18 }, Mov { destination: Relative(33), source: Direct(1) }, Const { destination: Relative(62), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(62) }, IndirectConst { destination_pointer: Relative(33), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(62), op: Add, bit_size: U32, lhs: Relative(33), rhs: Direct(2) }, Mov { destination: Relative(63), source: Relative(62) }, Store { destination_pointer: Relative(63), source: Relative(17) }, BinaryIntOp { destination: Relative(63), op: Add, bit_size: U32, lhs: Relative(63), rhs: Direct(2) }, Store { destination_pointer: Relative(63), source: Relative(1) }, BinaryIntOp { destination: Relative(63), op: Add, bit_size: U32, lhs: Relative(63), rhs: Direct(2) }, Store { destination_pointer: Relative(63), source: Relative(30) }, BinaryIntOp { destination: Relative(62), op: LessThan, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(63), op: Mul, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(64), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(65), op: LessThan, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(66), op: Mul, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(67), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(68), op: LessThan, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(69), op: Mul, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(70), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(71), op: LessThan, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(72), op: Mul, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(73), op: LessThan, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(74), op: Mul, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, JumpIf { condition: Relative(38), location: 1359 }, Jump { location: 1319 }, Load { destination: Relative(4), source_pointer: Relative(33) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(6), rhs: Relative(4) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 1325 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(33), source: Relative(4) }, JumpIf { condition: Relative(62), location: 1329 }, Call { location: 1790 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(63), rhs: Direct(32836) }, 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(4) }, Load { destination: Relative(9), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(23) }, Load { destination: Relative(13), source_pointer: Relative(15) }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, 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(21) }, Store { destination_pointer: Relative(16), source: Relative(33) }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, Mov { destination: Relative(9), source: Direct(32773) }, 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(64) }, Store { destination_pointer: Relative(16), source: Relative(13) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 1829 }, 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(4) }, Store { destination_pointer: Relative(15), source: Relative(9) }, Store { destination_pointer: Relative(12), source: Relative(13) }, Jump { location: 1405 }, 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(13), source: Relative(6) }, Store { destination_pointer: Relative(13), source: Relative(43) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(29) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(2) }, Store { destination_pointer: Relative(13), source: Relative(22) }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, JumpIf { condition: Relative(6), location: 1373 }, Call { location: 1790 }, BinaryIntOp { destination: Relative(6), op: Mul, bit_size: U32, lhs: Relative(9), rhs: Relative(10) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(32836) }, 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(9) }, Load { destination: Relative(6), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(23) }, Load { destination: Relative(13), source_pointer: Relative(15) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, 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(21) }, Store { destination_pointer: Relative(16), source: Relative(4) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(21), rhs: Direct(32836) }, Mov { destination: Direct(32771), source: Relative(14) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, Mov { destination: Relative(6), source: Direct(32773) }, 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(4) }, Store { destination_pointer: Relative(16), source: Relative(13) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 1829 }, 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(9) }, Store { destination_pointer: Relative(14), source: Relative(6) }, Store { destination_pointer: Relative(12), source: Relative(4) }, Jump { location: 1405 }, Load { destination: Relative(4), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, Load { destination: Relative(6), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(9) }, Load { destination: Relative(4), source_pointer: Relative(6) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(13), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(4) }, Not { destination: Relative(13), source: Relative(13), bit_size: U1 }, JumpIf { condition: Relative(13), location: 1416 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(4) }, Load { destination: Relative(4), 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(4) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 1424 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(4) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(3) }, Load { destination: Relative(4), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(54) }, Load { destination: Relative(14), source_pointer: Relative(15) }, Load { destination: Relative(15), source_pointer: Relative(4) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(18), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(15) }, Not { destination: Relative(18), source: Relative(18), bit_size: U1 }, JumpIf { condition: Relative(18), location: 1436 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(15) }, Load { destination: Relative(15), source_pointer: Relative(14) }, 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: 1444 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(15) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 75 }, Mov { destination: Relative(75), source: Direct(0) }, Mov { destination: Relative(76), source: Relative(4) }, Mov { destination: Relative(77), source: Relative(33) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(19) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(15), source: Relative(76) }, JumpIf { condition: Relative(15), location: 1457 }, Const { destination: Relative(19), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(19) } }, Load { destination: Relative(15), source_pointer: Relative(6) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(22), op: Equals, bit_size: U32, lhs: Relative(19), rhs: Relative(15) }, Not { destination: Relative(22), source: Relative(22), bit_size: U1 }, JumpIf { condition: Relative(22), location: 1463 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(15), rhs: Direct(2) }, Store { destination_pointer: Relative(6), source: Relative(15) }, Load { destination: Relative(6), source_pointer: Relative(7) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(22), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(6) }, Not { destination: Relative(22), source: Relative(22), bit_size: U1 }, JumpIf { condition: Relative(22), location: 1471 }, Call { location: 1793 }, 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(4) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(22), op: Equals, bit_size: U32, lhs: Relative(7), rhs: Relative(6) }, Not { destination: Relative(22), source: Relative(22), bit_size: U1 }, JumpIf { condition: Relative(22), location: 1479 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(6) }, Load { destination: Relative(6), source_pointer: Relative(14) }, Const { destination: Relative(22), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(24), op: Equals, bit_size: U32, lhs: Relative(22), rhs: Relative(6) }, Not { destination: Relative(24), source: Relative(24), bit_size: U1 }, JumpIf { condition: Relative(24), location: 1487 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, Store { destination_pointer: Relative(14), source: Relative(6) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, Load { destination: Relative(6), source_pointer: Relative(14) }, BinaryFieldOp { destination: Relative(4), op: Equals, lhs: Relative(6), rhs: Relative(30) }, JumpIf { condition: Relative(4), location: 1495 }, Const { destination: Relative(14), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(14) } }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(2), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(2), op: LessThan, bit_size: U32, lhs: Relative(20), rhs: Direct(32837) }, Const { destination: Relative(6), bit_size: Field, value: 5000 }, JumpIf { condition: Relative(4), location: 1546 }, Jump { location: 1500 }, Load { destination: Relative(4), source_pointer: Relative(12) }, JumpIf { condition: Relative(68), location: 1503 }, Call { location: 1790 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(69), rhs: Direct(32836) }, 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(7) }, Load { destination: Relative(9), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(21) }, Load { destination: Relative(13), source_pointer: Relative(15) }, 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(23) }, Load { destination: Relative(14), source_pointer: Relative(16) }, JumpIf { condition: Relative(2), location: 1515 }, Call { location: 1790 }, Const { destination: Relative(2), bit_size: Field, value: 1000 }, Mov { destination: Direct(32771), source: Relative(13) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 1829 }, 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(18), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(20) }, Store { destination_pointer: Relative(18), source: Relative(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, 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(16), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(21) }, Store { destination_pointer: Relative(16), source: Relative(15) }, Mov { destination: Direct(32771), source: Relative(2) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, BinaryIntOp { destination: Relative(15), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(70) }, Store { destination_pointer: Relative(15), source: Relative(14) }, Mov { destination: Direct(32771), source: Relative(4) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 1829 }, 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(14), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(7) }, Store { destination_pointer: Relative(14), source: Relative(9) }, Store { destination_pointer: Relative(12), source: Relative(2) }, Jump { location: 1592 }, Load { destination: Relative(2), source_pointer: Relative(12) }, JumpIf { condition: Relative(65), location: 1549 }, Call { location: 1790 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(66), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(9), rhs: Relative(4) }, Load { destination: Relative(7), source_pointer: Relative(13) }, 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(21) }, Load { destination: Relative(9), source_pointer: Relative(14) }, 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(23) }, Load { destination: Relative(13), source_pointer: Relative(15) }, BinaryIntOp { destination: Relative(14), op: LessThan, bit_size: U32, lhs: Relative(20), rhs: Direct(32837) }, JumpIf { condition: Relative(14), location: 1562 }, Call { location: 1790 }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 4 }, Call { location: 1829 }, 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(20) }, Store { destination_pointer: Relative(16), source: Relative(6) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, Mov { destination: Relative(9), source: Direct(32773) }, 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(21) }, Store { destination_pointer: Relative(16), source: Relative(14) }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, 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(15), op: Add, bit_size: U32, lhs: Relative(14), rhs: Relative(67) }, Store { destination_pointer: Relative(15), source: Relative(13) }, Mov { destination: Direct(32771), source: Relative(2) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 1829 }, Mov { destination: Relative(9), source: Direct(32773) }, BinaryIntOp { destination: Relative(13), op: Add, bit_size: U32, lhs: Relative(9), 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) }, Store { destination_pointer: Relative(12), source: Relative(9) }, Jump { location: 1592 }, Load { destination: Relative(2), source_pointer: Relative(12) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32837) }, Load { destination: Relative(4), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(9) }, Load { destination: Relative(9), 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(9) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 1603 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(9) }, Load { destination: Relative(4), source_pointer: Relative(7) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U32, lhs: Relative(9), rhs: Relative(4) }, Not { destination: Relative(14), source: Relative(14), bit_size: U1 }, JumpIf { condition: Relative(14), location: 1611 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(4) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(3) }, Load { destination: Relative(4), source_pointer: Relative(14) }, BinaryIntOp { destination: Relative(14), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(54) }, Load { destination: Relative(3), source_pointer: Relative(14) }, Load { destination: Relative(7), 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(7) }, Not { destination: Relative(15), source: Relative(15), bit_size: U1 }, JumpIf { condition: Relative(15), location: 1623 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Relative(7) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(16), op: Equals, bit_size: U32, lhs: Relative(15), rhs: Relative(7) }, Not { destination: Relative(16), source: Relative(16), bit_size: U1 }, JumpIf { condition: Relative(16), location: 1631 }, Call { location: 1793 }, 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(7), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32837) }, Load { destination: Relative(3), source_pointer: Relative(7) }, BinaryFieldOp { destination: Relative(4), op: Equals, lhs: Relative(3), rhs: Relative(6) }, JumpIf { condition: Relative(4), location: 1639 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(7) } }, JumpIf { condition: Relative(71), location: 1641 }, Call { location: 1790 }, 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(72) }, Load { destination: Relative(3), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(72), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(16), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(16), rhs: Relative(4) }, Load { destination: Relative(7), source_pointer: Relative(18) }, Load { destination: Relative(4), source_pointer: Relative(3) }, Const { destination: Relative(16), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(18), op: Equals, bit_size: U32, lhs: Relative(16), rhs: Relative(4) }, Not { destination: Relative(18), source: Relative(18), bit_size: U1 }, JumpIf { condition: Relative(18), location: 1654 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Relative(4) }, Load { destination: Relative(3), source_pointer: Relative(7) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(18), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, Not { destination: Relative(18), source: Relative(18), bit_size: U1 }, JumpIf { condition: Relative(18), location: 1662 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(3) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, BinaryIntOp { destination: Relative(19), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(21) }, Load { destination: Relative(3), source_pointer: Relative(19) }, 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(23) }, Load { destination: Relative(18), source_pointer: Relative(20) }, Load { destination: Relative(7), source_pointer: Relative(3) }, Const { destination: Relative(19), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(20), op: Equals, bit_size: U32, lhs: Relative(19), rhs: Relative(7) }, Not { destination: Relative(20), source: Relative(20), bit_size: U1 }, JumpIf { condition: Relative(20), location: 1676 }, Call { location: 1793 }, 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(18) }, Const { destination: Relative(20), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(21), op: Equals, bit_size: U32, lhs: Relative(20), rhs: Relative(7) }, Not { destination: Relative(21), source: Relative(21), bit_size: U1 }, JumpIf { condition: Relative(21), location: 1684 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(18), source: Relative(7) }, JumpIf { condition: Relative(73), location: 1688 }, Call { location: 1790 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(74), rhs: Direct(32836) }, BinaryIntOp { destination: Relative(21), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(21), rhs: Relative(7) }, Load { destination: Relative(18), source_pointer: Relative(22) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(18), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(11) }, Load { destination: Relative(21), source_pointer: Relative(23) }, Mov { destination: Direct(32771), source: Relative(18) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, Mov { destination: Relative(11), source: Direct(32773) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, BinaryIntOp { destination: Relative(23), op: Add, bit_size: U32, lhs: Relative(22), rhs: Relative(8) }, Store { destination_pointer: Relative(23), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32836) }, Mov { destination: Direct(32771), source: Relative(11) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 13 }, Call { location: 1829 }, Mov { destination: Relative(8), source: Direct(32773) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, BinaryIntOp { destination: Relative(22), op: Add, bit_size: U32, lhs: Relative(18), rhs: Relative(3) }, Store { destination_pointer: Relative(22), source: Relative(21) }, Mov { destination: Direct(32771), source: Relative(2) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 1829 }, Mov { destination: Relative(3), source: Direct(32773) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, BinaryIntOp { destination: Relative(18), op: Add, bit_size: U32, lhs: Relative(11), rhs: Relative(7) }, Store { destination_pointer: Relative(18), source: Relative(8) }, Store { destination_pointer: Relative(12), source: Relative(3) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32837) }, Load { destination: Relative(2), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(8) }, Load { destination: Relative(3), source_pointer: Relative(2) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(3) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 1728 }, Call { location: 1793 }, 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(2), source_pointer: Relative(7) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(8), op: Equals, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, Not { destination: Relative(8), source: Relative(8), bit_size: U1 }, JumpIf { condition: Relative(8), location: 1736 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(2) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Relative(10) }, Load { destination: Relative(2), source_pointer: Relative(8) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32837) }, Load { destination: Relative(8), source_pointer: Relative(10) }, Load { destination: Relative(7), 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(7) }, Not { destination: Relative(11), source: Relative(11), bit_size: U1 }, JumpIf { condition: Relative(11), location: 1748 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(7) }, Load { destination: Relative(7), 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(7) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 1756 }, Call { location: 1793 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(7) }, 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(12), source: Relative(8) }, Store { destination_pointer: Relative(12), source: Relative(17) }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, 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(6) }, Const { destination: Relative(6), bit_size: Integer(U32), value: 21 }, Mov { destination: Relative(21), source: Direct(0) }, Mov { destination: Relative(22), source: Relative(2) }, Mov { destination: Relative(23), source: Relative(7) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 1796 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(22) }, JumpIf { condition: Relative(1), location: 1780 }, 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: 1786 }, 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: 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, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 1781 }, 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: 1806 }, Call { location: 1793 }, 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 }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 1811 }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32837) }, JumpIf { condition: Relative(5), location: 1816 }, Jump { location: 1814 }, 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(32836) }, Mov { destination: Relative(3), source: Relative(5) }, Jump { location: 1811 }, 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: 1833 }, Jump { location: 1835 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 1850 }, 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: 1847 }, 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: 1840 }, 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: 1850 }, Return]" ], - "debug_symbols": "pZnLbttIEEX/RWsvWP0u/0oQBI6jDAwIsqHYAwwC//t0kffIySLADLXxPbRUpymqS+qmfh6+Hb++/fXl6fz9+cfh/tPPw9fL0+n09NeX0/Pjw+vT83n+9+dhiT82yuHe7mZWZVN25VD6lr4oTZkO9ykyK4uyKpuyK4fS10zLojRlUmZlUVZlU3blUMpn8pl8Jp/JZ/KZfCafyWfymXxJvjR9OTIps7Ioq3L6SmRXDqVvmRelKZMyK4uyKuXL8mX5snxFviJfmb4amZVFWZVN2ZVD6VvWRWlK+ap8Vb4qX52+FtmVQ+lbtkVpyqTMyqKsSvna9PXIofQt+6I0ZVJm5fSNyKpsyq4cSt9yLEpTJmVWyjfkG/IN+YZ8Qz6Xz+Vz+Vw+l8/lc/lcPpfPN19eFqUpp88js7Ioq7Ipo3+XgAG4IFpkAwMSkIECVKABmA2zYU6YE+aEOfrFLKAAFWhABwbggmibDQxIAOaMOWPOmKN7LAUMwAXRQBsYkIAMFKACDcAcjWQ5wAXRShsYkIAMFCDMJaABHRiAC6KpNjAgARkoAOaGuWFumBvmjrlj7pg75o65Y+6YO+aOuWMemAfmgTl6zWpAASrQgA6EuQW4YP1KWsGABGSgABVoQAcwu8xlWQADEpCBMPeACjSgAwNwwdqDKxiQgAxgNsyG2TCvPTgCXLD24AoGJCADBahAAzqAOWHOmDPmtQc9IAMFqEADOjAAF6w9uIIBmAvmgrlgLpgL5oK5YK6YK+aKuWKumCvmirlirpgr5ujBtAQYkIAMFCBWGxbQgA4MwAXRgxsYkIAMFABzx9wxd8wd88AcPZhSQAIyUIAKNKADA3BB9OAGmB2zY3bM69owBzSgAwPwDeq6QFzBgARkoAAVCHMJ6MAAXLAuFVcwIAEZKEAFMBtmw2yYE+aEOXow1YAMFKACDejAAFwQPbiBAZgz5ow5Y44eTC2gAwNwQfTgBgYkIAMFqADm6MHUA8I8PxxqdNwGCchAASrQgA5cPS5YO24FzA1zw9wwN8wNc8PcMDfMHXPH3DF3zGujeUADOjAAF6yNtoIBCchAATAPzAPzwDwwO2bH7Jgds2N2zI7ZZW4xn/MS0IAOzEGzBbgg5vMGBiQgAwWoAOUxRXMK4DkxM3MOaEAHYvQS4IKYmRvE6C0AYczMDcKc3t/vDuxxv7xejsfY4v6y6Z1b4ZeHy/H8erg/v51Od4e/H05v65N+vDyc13x9uMxH52U4nr/NnMLvT6dj0PvdR/Xy59IU3w5r8dwbXsvr/6jv1/p6W/28IDvqS6O+7jr/dh2/+W3j92VP/bjWu+2qL9f6dGP9ntefYzuw1s9d1J76zPhz+3Pb+Lnvqa/X+jp21du13m+rb7te/6D551ZjR/3cK6h+7hFuGn9uLfaMHyvzrT6l2+rznv6bC3Xqy67r15g/c9V82/i73v/ycf3Hnus/15eqn8vJm8afq9A941de/1ww7anvzN+55NlR35aq+rbs+vy3awPNm7V7rsC8x8wlmLeZf3kP//MpLNf3cN6H9j2Cj0XAktoeQV4+zmDcegZ/egm5/tnQr9+j3X+r/zwPHh6fLr/9mvAeosvTw9fTUYff386Pvzz6+s8Lj/BrxMvl+fH47e1yDNPHTxLzz6dW+l1r4/O8GTOPrNU763UexZbtU3W/a0uJQ4vnzgnXlv75PU7tXw==", + "debug_symbols": "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", "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_u64, 1), 0);\n assert_eq(min(0_u64, 0), 0);\n assert_eq(min(1_u64, 1), 1);\n assert_eq(min(255_u8, 0), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0_u64, 1), 1);\n assert_eq(max(0_u64, 0), 0);\n assert_eq(max(1_u64, 1), 1);\n assert_eq(max(255_u8, 0), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/nested_arrays_from_brillig/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/nested_arrays_from_brillig/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index 12203b94efc..39b565c3b05 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/nested_arrays_from_brillig/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/nested_arrays_from_brillig/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -38,10 +38,11 @@ expression: artifact "public parameters indices : []", "return value indices : []", "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 }])], outputs: [Array([Witness(6), Witness(7), Witness(8), Witness(9), Witness(10), Witness(11), Witness(12), Witness(13), Witness(14), Witness(15), Witness(16), Witness(17)])]", + "EXPR [ (1, _6) (1, _8) (1, _13) (1, _15) -10 ]", "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32854 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 6 }, 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: 6 }, Mov { destination: Relative(2), 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(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: 81 }, Mov { destination: Relative(1), source: Relative(2) }, Call { location: 92 }, Call { location: 93 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 32842 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Load { destination: Relative(4), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(6) }, Store { destination_pointer: Relative(7), source: Relative(4) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(8) }, 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(3), rhs: Relative(6) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 2 }, Mov { destination: Direct(32771), source: Relative(8) }, Mov { destination: Direct(32772), source: Relative(9) }, Mov { destination: Direct(32773), source: Relative(10) }, Call { location: 81 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(8) }, 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(3), rhs: Relative(6) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, Mov { destination: Direct(32771), source: Relative(8) }, Mov { destination: Direct(32772), source: Relative(9) }, Mov { destination: Direct(32773), source: Relative(10) }, Call { location: 81 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Load { destination: Relative(4), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(6) }, Store { destination_pointer: Relative(7), source: Relative(4) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(8) }, 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(3), rhs: Relative(6) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 2 }, Mov { destination: Direct(32771), source: Relative(8) }, Mov { destination: Direct(32772), source: Relative(9) }, Mov { destination: Direct(32773), source: Relative(10) }, Call { location: 81 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 5 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(8) }, 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(3), rhs: Relative(6) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, Mov { destination: Direct(32771), source: Relative(8) }, Mov { destination: Direct(32772), source: Relative(9) }, Mov { destination: Direct(32773), source: Relative(10) }, Call { location: 81 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 32842 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 12 }, 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: 91 }, 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: 84 }, Return, Return, Call { location: 167 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, 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(3) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(4) }, 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(6), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, 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(3) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(4) }, Load { destination: Relative(3), source_pointer: Relative(2) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 129 }, Call { location: 173 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(3) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Load { destination: Relative(7), source_pointer: Relative(8) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Load { destination: Relative(8), source_pointer: Relative(9) }, Mov { destination: Relative(3), 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(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: Relative(7) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(8) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(8), source_pointer: Relative(9) }, Mov { destination: Relative(1), 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(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(9), source: Relative(7) }, 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) }, 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(8) }, 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(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: 172 }, 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": "ndTfaoMwFAbwd8m1FzlJTv70VUYpts2GILY4HYziuy+nfmk3xmB401+P+n2KxNzUOR/nt0M3vF7e1e7lpo5j1/fd26G/nNqpuwzl6E1p+UlO7ahRiVf8SlA7U4gr6Q7pErAiQQMtdJChhwFGmFYJfYQ+Qh+hj0qfExl6GGCEadVoSNDA0seigww9DDDCtGo1LH1eNNDC0hdEhh4GGGFadRoSNNBC9Dn0udIXxQAjTKusIUEDLXSQIfoYfYw+Rp9Hn0efR59Hn0efl75laVRdTYdpzFkW07flVRbdtR3zMKndMPd9oz7afr5f9H5th7tTO5azulF5OBdL4WvXZ/m3NM+0/jtqg0HYRnrE+f/5aGs+mS355JB32m7IO67P7/yW53eBaj7qDXk2jDxbtyVvfc073pLnx/39lvv7WN9/oJ/vf1+m9tSNvza8tEjd2LXHPssxSc3DqV5SxunzWs/UXfM6Xk75PI9Z6p5bZ/ksXiI1ifayqZWBfGgoGBlJxmDLyPtFnucL", + "debug_symbols": "pZbdbuIwEIXfxde58Nge//AqFUIB0ipSFFBKVlqhvPt6yDHd1Yqqcm74GJzzxbaGOHd17o7zx6Ef3y+favd2V8epH4b+4zBcTu2tv4z517vS8pGc2lGjEq/wK4LamYy4Ij1AOgeskEADWtCBDHowgBFMKwk+go/gI/go+5yQQQ8GMIJppdEggQbMPhY6kEEPBjCCaaXVYPZ5oQEtmH1ByKAHAxjBtNJpkEADWhA+B5/LvigMYATTStYggQa0oAMZhI/hY/gYPg+fh8/D5+Hz8HnxLUujSjcdblPXSTP91V656a7t1I03tRvnYWjUr3aYHxd9XtvxwVs75VHdqG48Z2bhez908m1pvtL6ddQGg7CN9Izzz/PRlnwyNfnkkHfaVuQdl/k7XzN/F6jko67Is2Hk2bqavPUl77gmz8/7+5r7+1j2P1DN/gcTS97FV3n6RkChLICi3Sh43YHfClIRGG03CshsW0KlwNBTYDZuojGpaga2/A+N0xsFHDYu4bXgZ53s/83vc9We+um/oz/lJ7ls/iLWqW+PQydDEp7HU7kyl7ff1zJSXiOu0+XUneepE+vXu0Q+J94iNYn2csrngnxoKBgpScpgc8n7Rab1Bw==", "file_map": { "50": { "source": "struct Header {\n params: [Field; 3],\n}\n\nstruct MyNote {\n plain: Field,\n array: [Field; 2],\n header: Header,\n}\n\nfn access_nested(notes: [MyNote; 2]) -> Field {\n notes[0].array[1] + notes[1].array[0] + notes[0].plain + notes[1].header.params[0]\n}\n\nunconstrained fn create_inside_brillig(values: [Field; 6]) -> [MyNote; 2] {\n let header = Header { params: [values[0], values[1], values[2]] };\n let note0 = MyNote { array: [values[0], values[1]], plain: values[2], header };\n let note1 = MyNote { array: [values[3], values[4]], plain: values[5], header };\n [note0, note1]\n}\n\nfn main(values: [Field; 6]) {\n // Safety: testing context\n let notes = unsafe { create_inside_brillig(values) };\n assert(access_nested(notes) == (2 + 4 + 3 + 1));\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/nested_arrays_from_brillig/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/nested_arrays_from_brillig/execute__tests__force_brillig_false_inliner_0.snap index 12203b94efc..39b565c3b05 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/nested_arrays_from_brillig/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/nested_arrays_from_brillig/execute__tests__force_brillig_false_inliner_0.snap @@ -38,10 +38,11 @@ expression: artifact "public parameters indices : []", "return value indices : []", "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 }])], outputs: [Array([Witness(6), Witness(7), Witness(8), Witness(9), Witness(10), Witness(11), Witness(12), Witness(13), Witness(14), Witness(15), Witness(16), Witness(17)])]", + "EXPR [ (1, _6) (1, _8) (1, _13) (1, _15) -10 ]", "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32854 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 6 }, 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: 6 }, Mov { destination: Relative(2), 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(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: 81 }, Mov { destination: Relative(1), source: Relative(2) }, Call { location: 92 }, Call { location: 93 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 32842 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Load { destination: Relative(4), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(6) }, Store { destination_pointer: Relative(7), source: Relative(4) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(8) }, 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(3), rhs: Relative(6) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 2 }, Mov { destination: Direct(32771), source: Relative(8) }, Mov { destination: Direct(32772), source: Relative(9) }, Mov { destination: Direct(32773), source: Relative(10) }, Call { location: 81 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(8) }, 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(3), rhs: Relative(6) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, Mov { destination: Direct(32771), source: Relative(8) }, Mov { destination: Direct(32772), source: Relative(9) }, Mov { destination: Direct(32773), source: Relative(10) }, Call { location: 81 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Load { destination: Relative(4), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(6) }, Store { destination_pointer: Relative(7), source: Relative(4) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(8) }, 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(3), rhs: Relative(6) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 2 }, Mov { destination: Direct(32771), source: Relative(8) }, Mov { destination: Direct(32772), source: Relative(9) }, Mov { destination: Direct(32773), source: Relative(10) }, Call { location: 81 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 5 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(8) }, 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(3), rhs: Relative(6) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, Mov { destination: Direct(32771), source: Relative(8) }, Mov { destination: Direct(32772), source: Relative(9) }, Mov { destination: Direct(32773), source: Relative(10) }, Call { location: 81 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 32842 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 12 }, 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: 91 }, 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: 84 }, Return, Return, Call { location: 167 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, 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(3) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(4) }, 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(6), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, 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(3) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(4) }, Load { destination: Relative(3), source_pointer: Relative(2) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 129 }, Call { location: 173 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(3) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Load { destination: Relative(7), source_pointer: Relative(8) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Load { destination: Relative(8), source_pointer: Relative(9) }, Mov { destination: Relative(3), 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(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: Relative(7) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(8) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(8), source_pointer: Relative(9) }, Mov { destination: Relative(1), 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(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(9), source: Relative(7) }, 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) }, 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(8) }, 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(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: 172 }, 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": "ndTfaoMwFAbwd8m1FzlJTv70VUYpts2GILY4HYziuy+nfmk3xmB401+P+n2KxNzUOR/nt0M3vF7e1e7lpo5j1/fd26G/nNqpuwzl6E1p+UlO7ahRiVf8SlA7U4gr6Q7pErAiQQMtdJChhwFGmFYJfYQ+Qh+hj0qfExl6GGCEadVoSNDA0seigww9DDDCtGo1LH1eNNDC0hdEhh4GGGFadRoSNNBC9Dn0udIXxQAjTKusIUEDLXSQIfoYfYw+Rp9Hn0efR59Hn0efl75laVRdTYdpzFkW07flVRbdtR3zMKndMPd9oz7afr5f9H5th7tTO5azulF5OBdL4WvXZ/m3NM+0/jtqg0HYRnrE+f/5aGs+mS355JB32m7IO67P7/yW53eBaj7qDXk2jDxbtyVvfc073pLnx/39lvv7WN9/oJ/vf1+m9tSNvza8tEjd2LXHPssxSc3DqV5SxunzWs/UXfM6Xk75PI9Z6p5bZ/ksXiI1ifayqZWBfGgoGBlJxmDLyPtFnucL", + "debug_symbols": "pZbdbuIwEIXfxde58Nge//AqFUIB0ipSFFBKVlqhvPt6yDHd1Yqqcm74GJzzxbaGOHd17o7zx6Ef3y+favd2V8epH4b+4zBcTu2tv4z517vS8pGc2lGjEq/wK4LamYy4Ij1AOgeskEADWtCBDHowgBFMKwk+go/gI/go+5yQQQ8GMIJppdEggQbMPhY6kEEPBjCCaaXVYPZ5oQEtmH1ByKAHAxjBtNJpkEADWhA+B5/LvigMYATTStYggQa0oAMZhI/hY/gYPg+fh8/D5+Hz8HnxLUujSjcdblPXSTP91V656a7t1I03tRvnYWjUr3aYHxd9XtvxwVs75VHdqG48Z2bhez908m1pvtL6ddQGg7CN9Izzz/PRlnwyNfnkkHfaVuQdl/k7XzN/F6jko67Is2Hk2bqavPUl77gmz8/7+5r7+1j2P1DN/gcTS97FV3n6RkChLICi3Sh43YHfClIRGG03CshsW0KlwNBTYDZuojGpaga2/A+N0xsFHDYu4bXgZ53s/83vc9We+um/oz/lJ7ls/iLWqW+PQydDEp7HU7kyl7ff1zJSXiOu0+XUneepE+vXu0Q+J94iNYn2csrngnxoKBgpScpgc8n7Rab1Bw==", "file_map": { "50": { "source": "struct Header {\n params: [Field; 3],\n}\n\nstruct MyNote {\n plain: Field,\n array: [Field; 2],\n header: Header,\n}\n\nfn access_nested(notes: [MyNote; 2]) -> Field {\n notes[0].array[1] + notes[1].array[0] + notes[0].plain + notes[1].header.params[0]\n}\n\nunconstrained fn create_inside_brillig(values: [Field; 6]) -> [MyNote; 2] {\n let header = Header { params: [values[0], values[1], values[2]] };\n let note0 = MyNote { array: [values[0], values[1]], plain: values[2], header };\n let note1 = MyNote { array: [values[3], values[4]], plain: values[5], header };\n [note0, note1]\n}\n\nfn main(values: [Field; 6]) {\n // Safety: testing context\n let notes = unsafe { create_inside_brillig(values) };\n assert(access_nested(notes) == (2 + 4 + 3 + 1));\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/nested_arrays_from_brillig/execute__tests__force_brillig_false_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/nested_arrays_from_brillig/execute__tests__force_brillig_false_inliner_9223372036854775807.snap index 12203b94efc..39b565c3b05 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/nested_arrays_from_brillig/execute__tests__force_brillig_false_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/nested_arrays_from_brillig/execute__tests__force_brillig_false_inliner_9223372036854775807.snap @@ -38,10 +38,11 @@ expression: artifact "public parameters indices : []", "return value indices : []", "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 }])], outputs: [Array([Witness(6), Witness(7), Witness(8), Witness(9), Witness(10), Witness(11), Witness(12), Witness(13), Witness(14), Witness(15), Witness(16), Witness(17)])]", + "EXPR [ (1, _6) (1, _8) (1, _13) (1, _15) -10 ]", "unconstrained func 0", "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32854 }, Const { destination: Direct(0), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 6 }, 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: 6 }, Mov { destination: Relative(2), 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(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: 81 }, Mov { destination: Relative(1), source: Relative(2) }, Call { location: 92 }, Call { location: 93 }, BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 32842 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Load { destination: Relative(4), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(6) }, Store { destination_pointer: Relative(7), source: Relative(4) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(8) }, 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(3), rhs: Relative(6) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 2 }, Mov { destination: Direct(32771), source: Relative(8) }, Mov { destination: Direct(32772), source: Relative(9) }, Mov { destination: Direct(32773), source: Relative(10) }, Call { location: 81 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 2 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(8) }, 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(3), rhs: Relative(6) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, Mov { destination: Direct(32771), source: Relative(8) }, Mov { destination: Direct(32772), source: Relative(9) }, Mov { destination: Direct(32773), source: Relative(10) }, Call { location: 81 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Load { destination: Relative(4), source_pointer: Relative(7) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(3), rhs: Relative(6) }, Store { destination_pointer: Relative(7), source: Relative(4) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 4 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(8) }, 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(3), rhs: Relative(6) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 2 }, Mov { destination: Direct(32771), source: Relative(8) }, Mov { destination: Direct(32772), source: Relative(9) }, Mov { destination: Direct(32773), source: Relative(10) }, Call { location: 81 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 5 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 9 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(2), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(8) }, 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(3), rhs: Relative(6) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 3 }, Mov { destination: Direct(32771), source: Relative(8) }, Mov { destination: Direct(32772), source: Relative(9) }, Mov { destination: Direct(32773), source: Relative(10) }, Call { location: 81 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 32842 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 12 }, 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: 91 }, 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: 84 }, Return, Return, Call { location: 167 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, 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(3) }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(4) }, 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(6), source: Direct(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 3 }, 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(3) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(2) }, Store { destination_pointer: Relative(8), source: Relative(4) }, Load { destination: Relative(3), source_pointer: Relative(2) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(7), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, Not { destination: Relative(7), source: Relative(7), bit_size: U1 }, JumpIf { condition: Relative(7), location: 129 }, Call { location: 173 }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(2), source: Relative(3) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Load { destination: Relative(7), source_pointer: Relative(8) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 5 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(3) }, Load { destination: Relative(8), source_pointer: Relative(9) }, Mov { destination: Relative(3), 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(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: Relative(7) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(8) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(8), source_pointer: Relative(9) }, Mov { destination: Relative(1), 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(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, Mov { destination: Relative(9), source: Relative(7) }, 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) }, 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(8) }, 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(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: 172 }, 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": "ndTfaoMwFAbwd8m1FzlJTv70VUYpts2GILY4HYziuy+nfmk3xmB401+P+n2KxNzUOR/nt0M3vF7e1e7lpo5j1/fd26G/nNqpuwzl6E1p+UlO7ahRiVf8SlA7U4gr6Q7pErAiQQMtdJChhwFGmFYJfYQ+Qh+hj0qfExl6GGCEadVoSNDA0seigww9DDDCtGo1LH1eNNDC0hdEhh4GGGFadRoSNNBC9Dn0udIXxQAjTKusIUEDLXSQIfoYfYw+Rp9Hn0efR59Hn0efl75laVRdTYdpzFkW07flVRbdtR3zMKndMPd9oz7afr5f9H5th7tTO5azulF5OBdL4WvXZ/m3NM+0/jtqg0HYRnrE+f/5aGs+mS355JB32m7IO67P7/yW53eBaj7qDXk2jDxbtyVvfc073pLnx/39lvv7WN9/oJ/vf1+m9tSNvza8tEjd2LXHPssxSc3DqV5SxunzWs/UXfM6Xk75PI9Z6p5bZ/ksXiI1ifayqZWBfGgoGBlJxmDLyPtFnucL", + "debug_symbols": "pZbdbuIwEIXfxde58Nge//AqFUIB0ipSFFBKVlqhvPt6yDHd1Yqqcm74GJzzxbaGOHd17o7zx6Ef3y+favd2V8epH4b+4zBcTu2tv4z517vS8pGc2lGjEq/wK4LamYy4Ij1AOgeskEADWtCBDHowgBFMKwk+go/gI/go+5yQQQ8GMIJppdEggQbMPhY6kEEPBjCCaaXVYPZ5oQEtmH1ByKAHAxjBtNJpkEADWhA+B5/LvigMYATTStYggQa0oAMZhI/hY/gYPg+fh8/D5+Hz8HnxLUujSjcdblPXSTP91V656a7t1I03tRvnYWjUr3aYHxd9XtvxwVs75VHdqG48Z2bhez908m1pvtL6ddQGg7CN9Izzz/PRlnwyNfnkkHfaVuQdl/k7XzN/F6jko67Is2Hk2bqavPUl77gmz8/7+5r7+1j2P1DN/gcTS97FV3n6RkChLICi3Sh43YHfClIRGG03CshsW0KlwNBTYDZuojGpaga2/A+N0xsFHDYu4bXgZ53s/83vc9We+um/oz/lJ7ls/iLWqW+PQydDEp7HU7kyl7ff1zJSXiOu0+XUneepE+vXu0Q+J94iNYn2csrngnxoKBgpScpgc8n7Rab1Bw==", "file_map": { "50": { "source": "struct Header {\n params: [Field; 3],\n}\n\nstruct MyNote {\n plain: Field,\n array: [Field; 2],\n header: Header,\n}\n\nfn access_nested(notes: [MyNote; 2]) -> Field {\n notes[0].array[1] + notes[1].array[0] + notes[0].plain + notes[1].header.params[0]\n}\n\nunconstrained fn create_inside_brillig(values: [Field; 6]) -> [MyNote; 2] {\n let header = Header { params: [values[0], values[1], values[2]] };\n let note0 = MyNote { array: [values[0], values[1]], plain: values[2], header };\n let note1 = MyNote { array: [values[3], values[4]], plain: values[5], header };\n [note0, note1]\n}\n\nfn main(values: [Field; 6]) {\n // Safety: testing context\n let notes = unsafe { create_inside_brillig(values) };\n assert(access_nested(notes) == (2 + 4 + 3 + 1));\n}\n", 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 e223de5c083..2070d66afdb 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 @@ -60,7 +60,7 @@ expression: artifact }, "bytecode": [ "func 0", - "current witness index : _9", + "current witness index : _21", "private parameters indices : [_0, _1, _2, _3, _4, _5]", "public parameters indices : []", "return value indices : []", @@ -68,11 +68,28 @@ expression: artifact "EXPR [ (1, _0) (-1, _6) (-340282366920938463463374607431768211456, _7) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1))], q_c: 0 })], outputs: [Simple(Witness(8)), Simple(Witness(9))]", "EXPR [ (1, _1) (-1, _8) (-340282366920938463463374607431768211456, _9) 0 ]", + "BLACKBOX::MULTI_SCALAR_MUL [(3728882899078719075161482178784387565366481897740339799480980287259621149274, 254), (-9903063709032878667290627648209915537972247634463802596148419711785767431332, 254), (0, 1), (2393473289045184898987089634332637236754766663897650125720167164137088869378, 254), (-7135402912423807765050323395026152633898511180575289670895350565966806597339, 254), (0, 1), (_6, 254), (_7, 254), (_8, 254), (_9, 254)] [_10, _11, _12]", + "EXPR [ (-1, _3) (1, _10) 0 ]", + "EXPR [ (-1, _4) (1, _11) 0 ]", + "BLACKBOX::MULTI_SCALAR_MUL [(3728882899078719075161482178784387565366481897740339799480980287259621149274, 254), (-9903063709032878667290627648209915537972247634463802596148419711785767431332, 254), (0, 1), (2393473289045184898987089634332637236754766663897650125720167164137088869378, 254), (-7135402912423807765050323395026152633898511180575289670895350565966806597339, 254), (0, 1), (-1094708040843609169356775910874053498301840173462935739639689208799068762676, 254), (-718703907181967287621274717949248537252263842169639534402461291799004475262, 254), (0, 1), (_6, 254), (_7, 254), (_8, 254), (_9, 254), (2, 254), (0, 254)] [_13, _14, _15]", + "EXPR [ (-1, _5) (1, _13) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(3)), (1, Witness(5))], q_c: 0 })], outputs: [Simple(Witness(16))]", + "EXPR [ (-1, _3, _16) (1, _5, _16) -1 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(8, Witness(0)), (1, Witness(1)), (1, Witness(2))], q_c: 0 })], outputs: [Simple(Witness(17)), Simple(Witness(18))]", + "EXPR [ (8, _0) (1, _1) (1, _2) (-1, _17) (-340282366920938463463374607431768211456, _18) 0 ]", + "BLACKBOX::MULTI_SCALAR_MUL [(3728882899078719075161482178784387565366481897740339799480980287259621149274, 254), (-9903063709032878667290627648209915537972247634463802596148419711785767431332, 254), (0, 1), (_17, 254), (_18, 254)] [_19, _20, _21]", + "EXPR [ (-1, _19) 849707701676507062560416368841861616551813265068666159965855698002224802634 ]", "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]" + "[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]", + "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": "pZPBjoMgEED/hTMHGAHBX2mahlrakBA0VDfZNP77Dl1pazZ6cC+MI/MeDMk8yMWdx9vJx2t3J83hQc7Jh+Bvp9C1dvBdxL8PwvLCFWmAEl7/Bk2aCoMhjaAEsEJMEyUFOw3JuUx9eNDe2+TiQJo4hkDJlw3js+je2/iMg024yyhx8YIRhVcfXP6a6Jtm66hmMMMa1Avn9YLn67wSYuaVrPbwmhde6118ab5mq+dv9M9f/XPxfj65fD+5wSteGuBKyvcNzMKgNgzG6NkADFYN9bpBcGZmg+AS9higKl0IUGaXAeR/DbxeMxwxs61Pf6YMX45jCV4enkmVkykfkrw9B5frsmmMbcEwHb77slPGt09d6y5jcvmIjxnG9QCCgjlO+Ro/", + "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", + "path": "std/embedded_curve_ops.nr" + }, "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" @@ -90,6 +107,7 @@ expression: artifact "main" ], "brillig_names": [ - "decompose_hint" + "decompose_hint", + "directive_invert" ] } 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 e223de5c083..2070d66afdb 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 @@ -60,7 +60,7 @@ expression: artifact }, "bytecode": [ "func 0", - "current witness index : _9", + "current witness index : _21", "private parameters indices : [_0, _1, _2, _3, _4, _5]", "public parameters indices : []", "return value indices : []", @@ -68,11 +68,28 @@ expression: artifact "EXPR [ (1, _0) (-1, _6) (-340282366920938463463374607431768211456, _7) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1))], q_c: 0 })], outputs: [Simple(Witness(8)), Simple(Witness(9))]", "EXPR [ (1, _1) (-1, _8) (-340282366920938463463374607431768211456, _9) 0 ]", + "BLACKBOX::MULTI_SCALAR_MUL [(3728882899078719075161482178784387565366481897740339799480980287259621149274, 254), (-9903063709032878667290627648209915537972247634463802596148419711785767431332, 254), (0, 1), (2393473289045184898987089634332637236754766663897650125720167164137088869378, 254), (-7135402912423807765050323395026152633898511180575289670895350565966806597339, 254), (0, 1), (_6, 254), (_7, 254), (_8, 254), (_9, 254)] [_10, _11, _12]", + "EXPR [ (-1, _3) (1, _10) 0 ]", + "EXPR [ (-1, _4) (1, _11) 0 ]", + "BLACKBOX::MULTI_SCALAR_MUL [(3728882899078719075161482178784387565366481897740339799480980287259621149274, 254), (-9903063709032878667290627648209915537972247634463802596148419711785767431332, 254), (0, 1), (2393473289045184898987089634332637236754766663897650125720167164137088869378, 254), (-7135402912423807765050323395026152633898511180575289670895350565966806597339, 254), (0, 1), (-1094708040843609169356775910874053498301840173462935739639689208799068762676, 254), (-718703907181967287621274717949248537252263842169639534402461291799004475262, 254), (0, 1), (_6, 254), (_7, 254), (_8, 254), (_9, 254), (2, 254), (0, 254)] [_13, _14, _15]", + "EXPR [ (-1, _5) (1, _13) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(3)), (1, Witness(5))], q_c: 0 })], outputs: [Simple(Witness(16))]", + "EXPR [ (-1, _3, _16) (1, _5, _16) -1 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(8, Witness(0)), (1, Witness(1)), (1, Witness(2))], q_c: 0 })], outputs: [Simple(Witness(17)), Simple(Witness(18))]", + "EXPR [ (8, _0) (1, _1) (1, _2) (-1, _17) (-340282366920938463463374607431768211456, _18) 0 ]", + "BLACKBOX::MULTI_SCALAR_MUL [(3728882899078719075161482178784387565366481897740339799480980287259621149274, 254), (-9903063709032878667290627648209915537972247634463802596148419711785767431332, 254), (0, 1), (_17, 254), (_18, 254)] [_19, _20, _21]", + "EXPR [ (-1, _19) 849707701676507062560416368841861616551813265068666159965855698002224802634 ]", "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]" + "[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]", + "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": "pZPBjoMgEED/hTMHGAHBX2mahlrakBA0VDfZNP77Dl1pazZ6cC+MI/MeDMk8yMWdx9vJx2t3J83hQc7Jh+Bvp9C1dvBdxL8PwvLCFWmAEl7/Bk2aCoMhjaAEsEJMEyUFOw3JuUx9eNDe2+TiQJo4hkDJlw3js+je2/iMg024yyhx8YIRhVcfXP6a6Jtm66hmMMMa1Avn9YLn67wSYuaVrPbwmhde6118ab5mq+dv9M9f/XPxfj65fD+5wSteGuBKyvcNzMKgNgzG6NkADFYN9bpBcGZmg+AS9higKl0IUGaXAeR/DbxeMxwxs61Pf6YMX45jCV4enkmVkykfkrw9B5frsmmMbcEwHb77slPGt09d6y5jcvmIjxnG9QCCgjlO+Ro/", + "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", + "path": "std/embedded_curve_ops.nr" + }, "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" @@ -90,6 +107,7 @@ expression: artifact "main" ], "brillig_names": [ - "decompose_hint" + "decompose_hint", + "directive_invert" ] } 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 e223de5c083..2070d66afdb 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 @@ -60,7 +60,7 @@ expression: artifact }, "bytecode": [ "func 0", - "current witness index : _9", + "current witness index : _21", "private parameters indices : [_0, _1, _2, _3, _4, _5]", "public parameters indices : []", "return value indices : []", @@ -68,11 +68,28 @@ expression: artifact "EXPR [ (1, _0) (-1, _6) (-340282366920938463463374607431768211456, _7) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1))], q_c: 0 })], outputs: [Simple(Witness(8)), Simple(Witness(9))]", "EXPR [ (1, _1) (-1, _8) (-340282366920938463463374607431768211456, _9) 0 ]", + "BLACKBOX::MULTI_SCALAR_MUL [(3728882899078719075161482178784387565366481897740339799480980287259621149274, 254), (-9903063709032878667290627648209915537972247634463802596148419711785767431332, 254), (0, 1), (2393473289045184898987089634332637236754766663897650125720167164137088869378, 254), (-7135402912423807765050323395026152633898511180575289670895350565966806597339, 254), (0, 1), (_6, 254), (_7, 254), (_8, 254), (_9, 254)] [_10, _11, _12]", + "EXPR [ (-1, _3) (1, _10) 0 ]", + "EXPR [ (-1, _4) (1, _11) 0 ]", + "BLACKBOX::MULTI_SCALAR_MUL [(3728882899078719075161482178784387565366481897740339799480980287259621149274, 254), (-9903063709032878667290627648209915537972247634463802596148419711785767431332, 254), (0, 1), (2393473289045184898987089634332637236754766663897650125720167164137088869378, 254), (-7135402912423807765050323395026152633898511180575289670895350565966806597339, 254), (0, 1), (-1094708040843609169356775910874053498301840173462935739639689208799068762676, 254), (-718703907181967287621274717949248537252263842169639534402461291799004475262, 254), (0, 1), (_6, 254), (_7, 254), (_8, 254), (_9, 254), (2, 254), (0, 254)] [_13, _14, _15]", + "EXPR [ (-1, _5) (1, _13) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(3)), (1, Witness(5))], q_c: 0 })], outputs: [Simple(Witness(16))]", + "EXPR [ (-1, _3, _16) (1, _5, _16) -1 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(8, Witness(0)), (1, Witness(1)), (1, Witness(2))], q_c: 0 })], outputs: [Simple(Witness(17)), Simple(Witness(18))]", + "EXPR [ (8, _0) (1, _1) (1, _2) (-1, _17) (-340282366920938463463374607431768211456, _18) 0 ]", + "BLACKBOX::MULTI_SCALAR_MUL [(3728882899078719075161482178784387565366481897740339799480980287259621149274, 254), (-9903063709032878667290627648209915537972247634463802596148419711785767431332, 254), (0, 1), (_17, 254), (_18, 254)] [_19, _20, _21]", + "EXPR [ (-1, _19) 849707701676507062560416368841861616551813265068666159965855698002224802634 ]", "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]" + "[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]", + "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": "pZPBjoMgEED/hTMHGAHBX2mahlrakBA0VDfZNP77Dl1pazZ6cC+MI/MeDMk8yMWdx9vJx2t3J83hQc7Jh+Bvp9C1dvBdxL8PwvLCFWmAEl7/Bk2aCoMhjaAEsEJMEyUFOw3JuUx9eNDe2+TiQJo4hkDJlw3js+je2/iMg024yyhx8YIRhVcfXP6a6Jtm66hmMMMa1Avn9YLn67wSYuaVrPbwmhde6118ab5mq+dv9M9f/XPxfj65fD+5wSteGuBKyvcNzMKgNgzG6NkADFYN9bpBcGZmg+AS9higKl0IUGaXAeR/DbxeMxwxs61Pf6YMX45jCV4enkmVkykfkrw9B5frsmmMbcEwHb77slPGt09d6y5jcvmIjxnG9QCCgjlO+Ro/", + "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", + "path": "std/embedded_curve_ops.nr" + }, "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" @@ -90,6 +107,7 @@ expression: artifact "main" ], "brillig_names": [ - "decompose_hint" + "decompose_hint", + "directive_invert" ] } 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 c7e92af3e0c..724903a01e8 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 @@ -60,7 +60,7 @@ expression: artifact }, "bytecode": [ "func 0", - "current witness index : _8", + "current witness index : _11", "private parameters indices : [_0, _1, _2, _3, _4]", "public parameters indices : []", "return value indices : []", @@ -69,11 +69,18 @@ expression: artifact "EXPR [ (1, _0) (-1, _5) (-340282366920938463463374607431768211456, _6) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1))], q_c: 0 })], outputs: [Simple(Witness(7)), Simple(Witness(8))]", "EXPR [ (1, _1) (-1, _7) (-340282366920938463463374607431768211456, _8) 0 ]", + "BLACKBOX::MULTI_SCALAR_MUL [(3728882899078719075161482178784387565366481897740339799480980287259621149274, 254), (-9903063709032878667290627648209915537972247634463802596148419711785767431332, 254), (0, 1), (2393473289045184898987089634332637236754766663897650125720167164137088869378, 254), (-7135402912423807765050323395026152633898511180575289670895350565966806597339, 254), (0, 1), (_5, 254), (_6, 254), (_7, 254), (_8, 254)] [_9, _10, _11]", + "EXPR [ (-1, _2) (1, _9) 0 ]", + "EXPR [ (-1, _3) (1, _10) 0 ]", "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": "pZPBjoMgEED/Zc4cAAHBX2mahlrakBA0VDfZNP77Dl1p60EP9sI4Mu8NGOcBF3cebycfr90dmsMDzsmH4G+n0LV28F3Etw+geWEKGk6A1f9BQ1NhMNAIAhwrxDQRKNhpSM5l6sOD9t4mFwdo4hgCgR8bxmfRvbfxGQebcJcScPGCEYVXH1x+msibpuuopnyGNVcvnNULnq3zSoiZV7Law2tWeK138eXyNV3tv3F/Jkt/ps2Ll8vvJzd4xV4CJeX7BGZhUBsGY/Rs4JSvGup1g2DUzAbBJN9j4FW5heDK7DJw+a2B1WuGI2a29Wk5ZQx/WhwlLMHDV89E5GTKTZK35+ByXTaNsS0YpsNvX3bK+Papa91lTC63+JhhXA9cEG6OUz7GHw==", + "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", + "path": "std/embedded_curve_ops.nr" + }, "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" 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 c7e92af3e0c..724903a01e8 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 @@ -60,7 +60,7 @@ expression: artifact }, "bytecode": [ "func 0", - "current witness index : _8", + "current witness index : _11", "private parameters indices : [_0, _1, _2, _3, _4]", "public parameters indices : []", "return value indices : []", @@ -69,11 +69,18 @@ expression: artifact "EXPR [ (1, _0) (-1, _5) (-340282366920938463463374607431768211456, _6) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1))], q_c: 0 })], outputs: [Simple(Witness(7)), Simple(Witness(8))]", "EXPR [ (1, _1) (-1, _7) (-340282366920938463463374607431768211456, _8) 0 ]", + "BLACKBOX::MULTI_SCALAR_MUL [(3728882899078719075161482178784387565366481897740339799480980287259621149274, 254), (-9903063709032878667290627648209915537972247634463802596148419711785767431332, 254), (0, 1), (2393473289045184898987089634332637236754766663897650125720167164137088869378, 254), (-7135402912423807765050323395026152633898511180575289670895350565966806597339, 254), (0, 1), (_5, 254), (_6, 254), (_7, 254), (_8, 254)] [_9, _10, _11]", + "EXPR [ (-1, _2) (1, _9) 0 ]", + "EXPR [ (-1, _3) (1, _10) 0 ]", "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": "pZPBjoMgEED/Zc4cAAHBX2mahlrakBA0VDfZNP77Dl1p60EP9sI4Mu8NGOcBF3cebycfr90dmsMDzsmH4G+n0LV28F3Etw+geWEKGk6A1f9BQ1NhMNAIAhwrxDQRKNhpSM5l6sOD9t4mFwdo4hgCgR8bxmfRvbfxGQebcJcScPGCEYVXH1x+msibpuuopnyGNVcvnNULnq3zSoiZV7Law2tWeK138eXyNV3tv3F/Jkt/ps2Ll8vvJzd4xV4CJeX7BGZhUBsGY/Rs4JSvGup1g2DUzAbBJN9j4FW5heDK7DJw+a2B1WuGI2a29Wk5ZQx/WhwlLMHDV89E5GTKTZK35+ByXTaNsS0YpsNvX3bK+Papa91lTC63+JhhXA9cEG6OUz7GHw==", + "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", + "path": "std/embedded_curve_ops.nr" + }, "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" 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 c7e92af3e0c..724903a01e8 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 @@ -60,7 +60,7 @@ expression: artifact }, "bytecode": [ "func 0", - "current witness index : _8", + "current witness index : _11", "private parameters indices : [_0, _1, _2, _3, _4]", "public parameters indices : []", "return value indices : []", @@ -69,11 +69,18 @@ expression: artifact "EXPR [ (1, _0) (-1, _5) (-340282366920938463463374607431768211456, _6) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1))], q_c: 0 })], outputs: [Simple(Witness(7)), Simple(Witness(8))]", "EXPR [ (1, _1) (-1, _7) (-340282366920938463463374607431768211456, _8) 0 ]", + "BLACKBOX::MULTI_SCALAR_MUL [(3728882899078719075161482178784387565366481897740339799480980287259621149274, 254), (-9903063709032878667290627648209915537972247634463802596148419711785767431332, 254), (0, 1), (2393473289045184898987089634332637236754766663897650125720167164137088869378, 254), (-7135402912423807765050323395026152633898511180575289670895350565966806597339, 254), (0, 1), (_5, 254), (_6, 254), (_7, 254), (_8, 254)] [_9, _10, _11]", + "EXPR [ (-1, _2) (1, _9) 0 ]", + "EXPR [ (-1, _3) (1, _10) 0 ]", "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": "pZPBjoMgEED/Zc4cAAHBX2mahlrakBA0VDfZNP77Dl1p60EP9sI4Mu8NGOcBF3cebycfr90dmsMDzsmH4G+n0LV28F3Etw+geWEKGk6A1f9BQ1NhMNAIAhwrxDQRKNhpSM5l6sOD9t4mFwdo4hgCgR8bxmfRvbfxGQebcJcScPGCEYVXH1x+msibpuuopnyGNVcvnNULnq3zSoiZV7Law2tWeK138eXyNV3tv3F/Jkt/ps2Ll8vvJzd4xV4CJeX7BGZhUBsGY/Rs4JSvGup1g2DUzAbBJN9j4FW5heDK7DJw+a2B1WuGI2a29Wk5ZQx/WhwlLMHDV89E5GTKTZK35+ByXTaNsS0YpsNvX3bK+Papa91lTC63+JhhXA9cEG6OUz7GHw==", + "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", + "path": "std/embedded_curve_ops.nr" + }, "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" diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_5045/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_5045/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index 899a3f7b19f..3ab64605154 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_5045/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_5045/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -20,16 +20,39 @@ expression: artifact }, "bytecode": [ "func 0", - "current witness index : _0", + "current witness index : _12", "private parameters indices : [_0]", "public parameters indices : []", "return value indices : []", - "BLACKBOX::RANGE [(_0, 1)] []" + "BLACKBOX::RANGE [(_0, 1)] []", + "EXPR [ (-1, _0) (-1, _1) 1 ]", + "EXPR [ (-17631683881184975370165255887551781615748388533673675138855, _0) (-1, _2) 17631683881184975370165255887551781615748388533673675138860 ]", + "EXPR [ (-1, _3) 0 ]", + "BLACKBOX::EMBEDDED_CURVE_ADD [(_1, 254), (_2, 254), (_3, 1), (_1, 254), (_2, 254), (_3, 1)] [_4, _5, _6]", + "BLACKBOX::MULTI_SCALAR_MUL [(-8519034168028805793603472410045416908800114122389094750979358290384607299995, 254), (2726875754519434671146873023426441956600113087238248464305840046775215989920, 254), (_1, 1), (0, 254), (5, 254), (_1, 1), (1, 254), (0, 254), (1, 254), (0, 254)] [_7, _8, _9]", + "EXPR [ (-1, _4) (1, _7) (-1, _10) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(10))], q_c: 0 })], outputs: [Simple(Witness(11))]", + "EXPR [ (1, _10, _11) (1, _12) -1 ]", + "EXPR [ (1, _10, _12) 0 ]", + "EXPR [ (1, _0, _12) 0 ]", + "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": "XY5BCsQwCEXv4rqLWfcqw1BsaosgJtikMITefWyYQOlK/3/6tcJCc9km1jXuML4rzMYivE0SA2aO6m49B+hyykbkFty4byU00gyjFpEBDpTShvaE2mpGc/oagHTx6oErC13d+XGBge158UBjnIX+ci0abjR/Uyf942Qx0FKMrqTGPPsH", - "file_map": {}, + "debug_symbols": "rVTLboQgFP0X1i54q/MrTWNQcUJC0DDapDH+e68odlxg2slsOMDlHO6Dy4xaXU/3yriuf6Dbx4xqb6w198r2jRpN72B3XjIUl9XotYYt9GQH1qC8diO6ucnaDH0pO4VDj0G5gKPyYMUZ0q4FBMHOWL3OluyXjdNULulO5jk96OLMJ2m+pGTnS0EOPpEnPk3zCyyiAwUu85QCSysQQnG+S8Bc8Fe8YDiGUTBOUwriDV78QyOZjYt6Sn7UgyfrefUeSnrUU6b45QVflDw+KMlxKoI/K7BXcpCzGEPBTjF8wko1xp+6EBE4mCEaRhZGHkYBl8I1EgCSkm9QbFBuQPCKy+qLN6q2em/rbnLNU5eP30O0xH9g8H2j28nr1ZdgA+9+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", + "path": "std/embedded_curve_ops.nr" + }, + "50": { + "source": "use std::embedded_curve_ops::EmbeddedCurvePoint;\nuse std::embedded_curve_ops::EmbeddedCurveScalar;\n\nfn main(is_active: bool) {\n let a = EmbeddedCurvePoint {\n x: 0x1d8eb4378a3bde41e0b6a9a8dcbd21b7ff9c51bdd6ca13ce989abbbf90df3666,\n y: 0x06075b63354f2504f9cddba0b94ed0cef35fc88615e69ec1f853b51eb79a24a0,\n is_infinite: false,\n };\n\n if is_active {\n let bad = EmbeddedCurvePoint { x: 0, y: 5, is_infinite: false };\n let d = bad.double();\n let e = std::embedded_curve_ops::multi_scalar_mul(\n [a, bad],\n [EmbeddedCurveScalar { lo: 1, hi: 0 }, EmbeddedCurveScalar { lo: 1, hi: 0 }],\n );\n assert(e.x != d.x);\n }\n}\n", + "path": "" + } + }, "names": [ "main" ], - "brillig_names": [] + "brillig_names": [ + "directive_invert" + ] } diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_5045/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_5045/execute__tests__force_brillig_false_inliner_0.snap index 899a3f7b19f..3ab64605154 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_5045/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_5045/execute__tests__force_brillig_false_inliner_0.snap @@ -20,16 +20,39 @@ expression: artifact }, "bytecode": [ "func 0", - "current witness index : _0", + "current witness index : _12", "private parameters indices : [_0]", "public parameters indices : []", "return value indices : []", - "BLACKBOX::RANGE [(_0, 1)] []" + "BLACKBOX::RANGE [(_0, 1)] []", + "EXPR [ (-1, _0) (-1, _1) 1 ]", + "EXPR [ (-17631683881184975370165255887551781615748388533673675138855, _0) (-1, _2) 17631683881184975370165255887551781615748388533673675138860 ]", + "EXPR [ (-1, _3) 0 ]", + "BLACKBOX::EMBEDDED_CURVE_ADD [(_1, 254), (_2, 254), (_3, 1), (_1, 254), (_2, 254), (_3, 1)] [_4, _5, _6]", + "BLACKBOX::MULTI_SCALAR_MUL [(-8519034168028805793603472410045416908800114122389094750979358290384607299995, 254), (2726875754519434671146873023426441956600113087238248464305840046775215989920, 254), (_1, 1), (0, 254), (5, 254), (_1, 1), (1, 254), (0, 254), (1, 254), (0, 254)] [_7, _8, _9]", + "EXPR [ (-1, _4) (1, _7) (-1, _10) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(10))], q_c: 0 })], outputs: [Simple(Witness(11))]", + "EXPR [ (1, _10, _11) (1, _12) -1 ]", + "EXPR [ (1, _10, _12) 0 ]", + "EXPR [ (1, _0, _12) 0 ]", + "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": "XY5BCsQwCEXv4rqLWfcqw1BsaosgJtikMITefWyYQOlK/3/6tcJCc9km1jXuML4rzMYivE0SA2aO6m49B+hyykbkFty4byU00gyjFpEBDpTShvaE2mpGc/oagHTx6oErC13d+XGBge158UBjnIX+ci0abjR/Uyf942Qx0FKMrqTGPPsH", - "file_map": {}, + "debug_symbols": "rVTLboQgFP0X1i54q/MrTWNQcUJC0DDapDH+e68odlxg2slsOMDlHO6Dy4xaXU/3yriuf6Dbx4xqb6w198r2jRpN72B3XjIUl9XotYYt9GQH1qC8diO6ucnaDH0pO4VDj0G5gKPyYMUZ0q4FBMHOWL3OluyXjdNULulO5jk96OLMJ2m+pGTnS0EOPpEnPk3zCyyiAwUu85QCSysQQnG+S8Bc8Fe8YDiGUTBOUwriDV78QyOZjYt6Sn7UgyfrefUeSnrUU6b45QVflDw+KMlxKoI/K7BXcpCzGEPBTjF8wko1xp+6EBE4mCEaRhZGHkYBl8I1EgCSkm9QbFBuQPCKy+qLN6q2em/rbnLNU5eP30O0xH9g8H2j28nr1ZdgA+9+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", + "path": "std/embedded_curve_ops.nr" + }, + "50": { + "source": "use std::embedded_curve_ops::EmbeddedCurvePoint;\nuse std::embedded_curve_ops::EmbeddedCurveScalar;\n\nfn main(is_active: bool) {\n let a = EmbeddedCurvePoint {\n x: 0x1d8eb4378a3bde41e0b6a9a8dcbd21b7ff9c51bdd6ca13ce989abbbf90df3666,\n y: 0x06075b63354f2504f9cddba0b94ed0cef35fc88615e69ec1f853b51eb79a24a0,\n is_infinite: false,\n };\n\n if is_active {\n let bad = EmbeddedCurvePoint { x: 0, y: 5, is_infinite: false };\n let d = bad.double();\n let e = std::embedded_curve_ops::multi_scalar_mul(\n [a, bad],\n [EmbeddedCurveScalar { lo: 1, hi: 0 }, EmbeddedCurveScalar { lo: 1, hi: 0 }],\n );\n assert(e.x != d.x);\n }\n}\n", + "path": "" + } + }, "names": [ "main" ], - "brillig_names": [] + "brillig_names": [ + "directive_invert" + ] } diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_5045/execute__tests__force_brillig_false_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_5045/execute__tests__force_brillig_false_inliner_9223372036854775807.snap index 899a3f7b19f..3ab64605154 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_5045/execute__tests__force_brillig_false_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_5045/execute__tests__force_brillig_false_inliner_9223372036854775807.snap @@ -20,16 +20,39 @@ expression: artifact }, "bytecode": [ "func 0", - "current witness index : _0", + "current witness index : _12", "private parameters indices : [_0]", "public parameters indices : []", "return value indices : []", - "BLACKBOX::RANGE [(_0, 1)] []" + "BLACKBOX::RANGE [(_0, 1)] []", + "EXPR [ (-1, _0) (-1, _1) 1 ]", + "EXPR [ (-17631683881184975370165255887551781615748388533673675138855, _0) (-1, _2) 17631683881184975370165255887551781615748388533673675138860 ]", + "EXPR [ (-1, _3) 0 ]", + "BLACKBOX::EMBEDDED_CURVE_ADD [(_1, 254), (_2, 254), (_3, 1), (_1, 254), (_2, 254), (_3, 1)] [_4, _5, _6]", + "BLACKBOX::MULTI_SCALAR_MUL [(-8519034168028805793603472410045416908800114122389094750979358290384607299995, 254), (2726875754519434671146873023426441956600113087238248464305840046775215989920, 254), (_1, 1), (0, 254), (5, 254), (_1, 1), (1, 254), (0, 254), (1, 254), (0, 254)] [_7, _8, _9]", + "EXPR [ (-1, _4) (1, _7) (-1, _10) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(10))], q_c: 0 })], outputs: [Simple(Witness(11))]", + "EXPR [ (1, _10, _11) (1, _12) -1 ]", + "EXPR [ (1, _10, _12) 0 ]", + "EXPR [ (1, _0, _12) 0 ]", + "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": "XY5BCsQwCEXv4rqLWfcqw1BsaosgJtikMITefWyYQOlK/3/6tcJCc9km1jXuML4rzMYivE0SA2aO6m49B+hyykbkFty4byU00gyjFpEBDpTShvaE2mpGc/oagHTx6oErC13d+XGBge158UBjnIX+ci0abjR/Uyf942Qx0FKMrqTGPPsH", - "file_map": {}, + "debug_symbols": "rVTLboQgFP0X1i54q/MrTWNQcUJC0DDapDH+e68odlxg2slsOMDlHO6Dy4xaXU/3yriuf6Dbx4xqb6w198r2jRpN72B3XjIUl9XotYYt9GQH1qC8diO6ucnaDH0pO4VDj0G5gKPyYMUZ0q4FBMHOWL3OluyXjdNULulO5jk96OLMJ2m+pGTnS0EOPpEnPk3zCyyiAwUu85QCSysQQnG+S8Bc8Fe8YDiGUTBOUwriDV78QyOZjYt6Sn7UgyfrefUeSnrUU6b45QVflDw+KMlxKoI/K7BXcpCzGEPBTjF8wko1xp+6EBE4mCEaRhZGHkYBl8I1EgCSkm9QbFBuQPCKy+qLN6q2em/rbnLNU5eP30O0xH9g8H2j28nr1ZdgA+9+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", + "path": "std/embedded_curve_ops.nr" + }, + "50": { + "source": "use std::embedded_curve_ops::EmbeddedCurvePoint;\nuse std::embedded_curve_ops::EmbeddedCurveScalar;\n\nfn main(is_active: bool) {\n let a = EmbeddedCurvePoint {\n x: 0x1d8eb4378a3bde41e0b6a9a8dcbd21b7ff9c51bdd6ca13ce989abbbf90df3666,\n y: 0x06075b63354f2504f9cddba0b94ed0cef35fc88615e69ec1f853b51eb79a24a0,\n is_infinite: false,\n };\n\n if is_active {\n let bad = EmbeddedCurvePoint { x: 0, y: 5, is_infinite: false };\n let d = bad.double();\n let e = std::embedded_curve_ops::multi_scalar_mul(\n [a, bad],\n [EmbeddedCurveScalar { lo: 1, hi: 0 }, EmbeddedCurveScalar { lo: 1, hi: 0 }],\n );\n assert(e.x != d.x);\n }\n}\n", + "path": "" + } + }, "names": [ "main" ], - "brillig_names": [] + "brillig_names": [ + "directive_invert" + ] } diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_5045/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_5045/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index b1d36b3f818..79fbb2d5646 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_5045/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_5045/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -31,9 +31,9 @@ expression: artifact "return value indices : []", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 })], outputs: []", "unconstrained func 0", - "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32837 }, 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) }, Cast { destination: Direct(32836), source: Direct(32836), bit_size: Integer(U1) }, Mov { destination: Relative(1), source: Direct(32836) }, Call { location: 13 }, Call { location: 14 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32837 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, Return, Call { location: 87 }, JumpIf { condition: Relative(1), location: 17 }, Jump { location: 86 }, Const { destination: Relative(1), bit_size: Field, value: 0 }, Const { destination: Relative(2), bit_size: Field, value: 5 }, Const { destination: Relative(3), bit_size: Integer(U1), value: 0 }, 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) }, Mov { destination: Relative(12), source: Relative(1) }, Mov { destination: Relative(13), source: Relative(2) }, Mov { destination: Relative(14), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 93 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(9) }, Mov { destination: Relative(5), source: Relative(10) }, Mov { destination: Relative(6), source: Relative(11) }, Const { destination: Relative(7), bit_size: Field, value: -8519034168028805793603472410045416908800114122389094750979358290384607299995 }, Const { destination: Relative(8), bit_size: Field, value: 2726875754519434671146873023426441956600113087238248464305840046775215989920 }, Mov { destination: Relative(9), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(9), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Mov { destination: Relative(11), source: Relative(10) }, Store { destination_pointer: Relative(11), source: Relative(7) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(8) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(3) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, 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: Relative(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(3) }, Const { destination: Relative(2), bit_size: Field, value: 1 }, 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: Relative(2) }, 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(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(1) }, 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(9), rhs: Direct(2) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Const { destination: Relative(11), 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(2), size: Relative(8) }, scalars: HeapVector { pointer: Relative(10), size: Relative(11) }, outputs: HeapArray { pointer: Relative(12), size: 3 } }), Const { destination: Relative(2), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, Load { destination: Relative(7), source_pointer: Relative(8) }, BinaryFieldOp { destination: Relative(1), op: Equals, lhs: Relative(7), rhs: Relative(4) }, BinaryIntOp { destination: Relative(2), op: Equals, bit_size: U1, lhs: Relative(1), rhs: Relative(3) }, JumpIf { condition: Relative(2), location: 85 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(4) } }, Jump { location: 86 }, 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: 92 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 87 }, JumpIf { condition: Relative(3), location: 106 }, Jump { location: 96 }, JumpIf { condition: Relative(6), location: 98 }, Jump { location: 98 }, Mov { destination: Relative(4), source: Relative(1) }, Mov { destination: Relative(5), source: Relative(2) }, Mov { destination: Relative(6), source: Relative(3) }, Jump { location: 102 }, Mov { destination: Relative(7), source: Relative(4) }, Mov { destination: Relative(8), source: Relative(5) }, Mov { destination: Relative(9), source: Relative(6) }, Jump { location: 110 }, Mov { destination: Relative(7), source: Relative(4) }, Mov { destination: Relative(8), source: Relative(5) }, Mov { destination: Relative(9), source: Relative(6) }, Jump { location: 110 }, Mov { destination: Relative(1), source: Relative(7) }, Mov { destination: Relative(2), source: Relative(8) }, Mov { destination: Relative(3), source: Relative(9) }, Return]" + "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32837 }, 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) }, Cast { destination: Direct(32836), source: Direct(32836), bit_size: Integer(U1) }, Mov { destination: Relative(1), source: Direct(32836) }, Call { location: 13 }, Call { location: 15 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32837 }, 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: Integer(U32), value: 1 }, Return, Call { location: 87 }, JumpIf { condition: Relative(1), location: 18 }, Jump { location: 86 }, Const { destination: Relative(1), bit_size: Field, value: 0 }, Const { destination: Relative(2), bit_size: Field, value: 5 }, Const { destination: Relative(3), bit_size: Integer(U1), value: 0 }, 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) }, Mov { destination: Relative(12), source: Relative(1) }, Mov { destination: Relative(13), source: Relative(2) }, Mov { destination: Relative(14), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 93 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(9) }, Mov { destination: Relative(5), source: Relative(10) }, Mov { destination: Relative(6), source: Relative(11) }, Const { destination: Relative(7), bit_size: Field, value: -8519034168028805793603472410045416908800114122389094750979358290384607299995 }, Const { destination: Relative(8), bit_size: Field, value: 2726875754519434671146873023426441956600113087238248464305840046775215989920 }, Mov { destination: Relative(9), source: Direct(1) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 7 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(10) }, IndirectConst { destination_pointer: Relative(9), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(9), rhs: Direct(2) }, Mov { destination: Relative(11), source: Relative(10) }, Store { destination_pointer: Relative(11), source: Relative(7) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(8) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(3) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, 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: Relative(2) }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(11), rhs: Direct(2) }, Store { destination_pointer: Relative(11), source: Relative(3) }, Const { destination: Relative(2), bit_size: Field, value: 1 }, 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: Relative(2) }, 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(2) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(1) }, 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(9), rhs: Direct(2) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Const { destination: Relative(11), 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(2), size: Relative(8) }, scalars: HeapVector { pointer: Relative(10), size: Relative(11) }, outputs: HeapArray { pointer: Relative(12), size: 3 } }), BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32835) }, Load { destination: Relative(2), source_pointer: Relative(7) }, BinaryFieldOp { destination: Relative(1), op: Equals, lhs: Relative(2), rhs: Relative(4) }, BinaryIntOp { destination: Relative(2), op: Equals, bit_size: U1, lhs: Relative(1), rhs: Relative(3) }, JumpIf { condition: Relative(2), location: 85 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(4) } }, Jump { location: 86 }, 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: 92 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 87 }, JumpIf { condition: Relative(3), location: 124 }, Jump { location: 96 }, JumpIf { condition: Relative(6), location: 116 }, Jump { location: 98 }, Mov { destination: Relative(13), source: Direct(1) }, Const { destination: Relative(14), bit_size: Integer(U32), value: 4 }, 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) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(1), input1_y: Relative(2), input1_infinite: Relative(3), input2_x: Relative(4), input2_y: Relative(5), input2_infinite: Relative(6), result: HeapArray { pointer: Relative(14), size: 3 } }), BinaryIntOp { destination: Relative(2), op: Add, bit_size: U32, lhs: Relative(13), rhs: Direct(32835) }, Load { destination: Relative(1), source_pointer: Relative(2) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(2) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(13), rhs: Relative(2) }, Load { destination: Relative(4), source_pointer: Relative(5) }, Mov { destination: Relative(10), source: Relative(1) }, Mov { destination: Relative(11), source: Relative(3) }, Mov { destination: Relative(12), source: Relative(4) }, Jump { location: 120 }, Mov { destination: Relative(10), source: Relative(1) }, Mov { destination: Relative(11), source: Relative(2) }, Mov { destination: Relative(12), source: Relative(3) }, Jump { location: 120 }, Mov { destination: Relative(7), source: Relative(10) }, Mov { destination: Relative(8), source: Relative(11) }, Mov { destination: Relative(9), source: Relative(12) }, Jump { location: 128 }, Mov { destination: Relative(7), source: Relative(4) }, Mov { destination: Relative(8), source: Relative(5) }, Mov { destination: Relative(9), source: Relative(6) }, Jump { location: 128 }, Mov { destination: Relative(1), source: Relative(7) }, Mov { destination: Relative(2), source: Relative(8) }, Mov { destination: Relative(3), source: Relative(9) }, Return]" ], - "debug_symbols": "ndTNjoIwFIbhe+maBf07bb2ViTGo1ZA0QCpMMjHc+xz4hNEFxsyGR8TzVn7CXZzjcbge6ubS3sTu6y6OuU6pvh5Se6r6um3427sop410YqcKIT0IM6oEEiiggQEWEEBFoaJQ0ahoVDQqGhXNFclYQMABD8KMKYEECmiAikHFoGJQMagYVCwqFhWLiuWKZgywgIADHoQZKoEECqBCqBAqhApxxTIehBlXAgkU0MAACwhwhRgPwoznimMkUEADrrhxLMRyvw99jnG63U8PAD8WXZVj04tdM6RUiO8qDfOPbl3VzPZV5qNlIWJzZjl4qVOcPo3F33S5PWpIPYaNU+u4fZ2X2/Ok5GOerFznJX26Ppl13myu/+7/B7WuT1vz5s28DWa5AGTKrTP4uKD/cw2cXs7B65dz2PNedarzy2thnEq5ro4pPnYvQ3N6Otr/dMuR5bXS5fYUz0OOU+np3cLbL++KoPbjtNov", + "debug_symbols": "rdTfaoMwFMfxd8m1F/l7YvoqYxTbpkMQW5wORvHdd5Jf0rUXjjF200+sPV9rEG/iFA/L274fz5d3sXu5icPUD0P/th8ux27uLyN/exMyfahW7HQjVMhoCRTQwAALHCDgASoaFYOKQcWgYlAxqBiuKIaABy0IGSuBAhoYYAEqFhWLikXFouJQcag4VBwqjiuGcYCABy0IGZJAAQ0MQIVQIVQIFeKKY0LGS6CABgZY4AABD7hCTMi0XPGMAhoYYDOBBwITMkrKoirqoimm3ZRp4eqC6sLXRVsXoSyUrIu0t3JdG1Efr/08xZierofnjZ/CazfFcRa7cRmGRnx0w5J/9H7txuzcTXyWk3E8sRw890NMq7X5npbbo5Z0GbZe38fd87zanietyjw5dZ9X9Nvrk73P283r//T/g75fn7bm7Q/zLti6AWTl1h38umD+sgfe1HtozR/2gKQNNSDD5j202wWltPQlwWtn/6HhnxqvfNQd++npfbqm2tR3hyGWw/MyHh/Ozp/Xeqa+j6/T5RhPyxRT6eGlzJ8vrW+Cfl3T1b4A", "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", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_5045/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_5045/execute__tests__force_brillig_true_inliner_0.snap index ac92837fa72..a90e724aafd 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_5045/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_5045/execute__tests__force_brillig_true_inliner_0.snap @@ -31,10 +31,19 @@ expression: artifact "return value indices : []", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 })], outputs: []", "unconstrained func 0", - "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32837 }, 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) }, Cast { destination: Direct(32836), source: Direct(32836), bit_size: Integer(U1) }, Mov { destination: Relative(1), source: Direct(32836) }, Call { location: 13 }, Call { location: 14 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32837 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, Return, Call { location: 18 }, JumpIf { condition: Relative(1), location: 18 }, Jump { location: 17 }, 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: 23 }, 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(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32837 }, 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) }, Cast { destination: Direct(32836), source: Direct(32836), bit_size: Integer(U1) }, Mov { destination: Relative(1), source: Direct(32836) }, Call { location: 13 }, Call { location: 14 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32837 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, Return, Call { location: 81 }, JumpIf { condition: Relative(1), location: 17 }, Jump { location: 80 }, Const { destination: Relative(1), bit_size: Field, value: 0 }, Const { destination: Relative(2), bit_size: Field, value: 5 }, Const { destination: Relative(3), bit_size: Integer(U1), value: 0 }, 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) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(1), input1_y: Relative(2), input1_infinite: Relative(3), input2_x: Relative(1), input2_y: Relative(2), input2_infinite: Relative(3), result: HeapArray { pointer: Relative(5), size: 3 } }), Const { destination: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(5) }, Load { destination: Relative(6), source_pointer: Relative(7) }, Const { destination: Relative(4), bit_size: Field, value: -8519034168028805793603472410045416908800114122389094750979358290384607299995 }, Const { destination: Relative(7), bit_size: Field, value: 2726875754519434671146873023426441956600113087238248464305840046775215989920 }, 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: Relative(4) }, 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(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) }, 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) }, Const { destination: Relative(2), bit_size: Field, value: 1 }, Mov { destination: Relative(4), 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(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(9), source: Relative(7) }, 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(2) }, 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) }, 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(8), rhs: Direct(2) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(2), size: Relative(7) }, scalars: HeapVector { pointer: Relative(9), size: Relative(10) }, outputs: HeapArray { pointer: Relative(11), size: 3 } }), BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(5) }, Load { destination: Relative(2), source_pointer: Relative(4) }, BinaryFieldOp { destination: Relative(1), op: Equals, lhs: Relative(2), rhs: Relative(6) }, BinaryIntOp { destination: Relative(2), op: Equals, bit_size: U1, lhs: Relative(1), rhs: Relative(3) }, JumpIf { condition: Relative(2), location: 79 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(4) } }, Jump { location: 80 }, 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: 86 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "XY7BCoMwDIbfJece5nYZvoqIxBqlENISW2GI775UJsguSf58Sf7sMNFYliHIHFdoux1GDcxhGTh6zCGKdffDwSWHrETWghu3rYRKkqGVwuxgQy7n0JpQzpxRjT4ckEyW7eAcmGp19CbQB/133FADjkw/ORfxN5o/6SLXx0mjp6ko1UuVwaOGxmLXvN3z1R/V7Qs=", - "file_map": {}, + "debug_symbols": "rdTNaoNAFIbhe5m1i/k5c0ZzKyUEk0yCIEaMFkrw3nv0UxsXSind+GjMecUZ8KWu8dzdT0V1ezzV4eOlzk1RlsX9VD4ueVs8Kvn1pfRwMEEdKFEmBdmI1cAACxwg4AGrgxcCSIFUTKKcBgZY4AABDxgEkAJUCBVChVAhVAgVQoVQIVRIKixkI14DAyxwgIAHDAJAxaPCqDAqLJVUcICABwwCSEE2EjQwQCqZ4MDwRlr0kzwZJoe10X2fqHkrT20T47CTb3srO17nTaxadai6skzUZ15245+edV6Ntnkjd6UYq6sowVtRxuGsT36m9fYosZ2GKdhl3K/nzfY8WzPNszfLvOHVvN2Z15TNAZ3prYLbLhhjdZgScu7pHxphq7GzkkzLStDmSu7tRGaXleSt+bAz7zOat5JpcyV/XXB/WYPg5ndI3eodjnKVX4pm9e3qh1JT5OcyTpe3rrq83W2/6vnO/O2rm8clXrsmDqW3D6AcP1KTpHzsh6d9Aw==", + "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", + "path": "std/embedded_curve_ops.nr" + }, + "50": { + "source": "use std::embedded_curve_ops::EmbeddedCurvePoint;\nuse std::embedded_curve_ops::EmbeddedCurveScalar;\n\nfn main(is_active: bool) {\n let a = EmbeddedCurvePoint {\n x: 0x1d8eb4378a3bde41e0b6a9a8dcbd21b7ff9c51bdd6ca13ce989abbbf90df3666,\n y: 0x06075b63354f2504f9cddba0b94ed0cef35fc88615e69ec1f853b51eb79a24a0,\n is_infinite: false,\n };\n\n if is_active {\n let bad = EmbeddedCurvePoint { x: 0, y: 5, is_infinite: false };\n let d = bad.double();\n let e = std::embedded_curve_ops::multi_scalar_mul(\n [a, bad],\n [EmbeddedCurveScalar { lo: 1, hi: 0 }, EmbeddedCurveScalar { lo: 1, hi: 0 }],\n );\n assert(e.x != d.x);\n }\n}\n", + "path": "" + } + }, "names": [ "main" ], diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_5045/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_5045/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index ac92837fa72..a90e724aafd 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_5045/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_5045/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -31,10 +31,19 @@ expression: artifact "return value indices : []", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 })], outputs: []", "unconstrained func 0", - "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32837 }, 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) }, Cast { destination: Direct(32836), source: Direct(32836), bit_size: Integer(U1) }, Mov { destination: Relative(1), source: Direct(32836) }, Call { location: 13 }, Call { location: 14 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32837 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, Return, Call { location: 18 }, JumpIf { condition: Relative(1), location: 18 }, Jump { location: 17 }, 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: 23 }, 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(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32837 }, 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) }, Cast { destination: Direct(32836), source: Direct(32836), bit_size: Integer(U1) }, Mov { destination: Relative(1), source: Direct(32836) }, Call { location: 13 }, Call { location: 14 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32837 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, Stop { return_data: HeapVector { pointer: Relative(1), size: Relative(2) } }, Return, Call { location: 81 }, JumpIf { condition: Relative(1), location: 17 }, Jump { location: 80 }, Const { destination: Relative(1), bit_size: Field, value: 0 }, Const { destination: Relative(2), bit_size: Field, value: 5 }, Const { destination: Relative(3), bit_size: Integer(U1), value: 0 }, 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) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(1), input1_y: Relative(2), input1_infinite: Relative(3), input2_x: Relative(1), input2_y: Relative(2), input2_infinite: Relative(3), result: HeapArray { pointer: Relative(5), size: 3 } }), Const { destination: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(4), rhs: Relative(5) }, Load { destination: Relative(6), source_pointer: Relative(7) }, Const { destination: Relative(4), bit_size: Field, value: -8519034168028805793603472410045416908800114122389094750979358290384607299995 }, Const { destination: Relative(7), bit_size: Field, value: 2726875754519434671146873023426441956600113087238248464305840046775215989920 }, 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: Relative(4) }, 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(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) }, 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) }, Const { destination: Relative(2), bit_size: Field, value: 1 }, Mov { destination: Relative(4), 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(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Mov { destination: Relative(9), source: Relative(7) }, 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(2) }, 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) }, 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(8), rhs: Direct(2) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 6 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Const { destination: Relative(10), bit_size: Integer(U32), value: 4 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BlackBox(MultiScalarMul { points: HeapVector { pointer: Relative(2), size: Relative(7) }, scalars: HeapVector { pointer: Relative(9), size: Relative(10) }, outputs: HeapArray { pointer: Relative(11), size: 3 } }), BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(5) }, Load { destination: Relative(2), source_pointer: Relative(4) }, BinaryFieldOp { destination: Relative(1), op: Equals, lhs: Relative(2), rhs: Relative(6) }, BinaryIntOp { destination: Relative(2), op: Equals, bit_size: U1, lhs: Relative(1), rhs: Relative(3) }, JumpIf { condition: Relative(2), location: 79 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(4) } }, Jump { location: 80 }, 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: 86 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "XY7BCoMwDIbfJece5nYZvoqIxBqlENISW2GI775UJsguSf58Sf7sMNFYliHIHFdoux1GDcxhGTh6zCGKdffDwSWHrETWghu3rYRKkqGVwuxgQy7n0JpQzpxRjT4ckEyW7eAcmGp19CbQB/133FADjkw/ORfxN5o/6SLXx0mjp6ko1UuVwaOGxmLXvN3z1R/V7Qs=", - "file_map": {}, + "debug_symbols": "rdTNaoNAFIbhe5m1i/k5c0ZzKyUEk0yCIEaMFkrw3nv0UxsXSind+GjMecUZ8KWu8dzdT0V1ezzV4eOlzk1RlsX9VD4ueVs8Kvn1pfRwMEEdKFEmBdmI1cAACxwg4AGrgxcCSIFUTKKcBgZY4AABDxgEkAJUCBVChVAhVAgVQoVQIVRIKixkI14DAyxwgIAHDAJAxaPCqDAqLJVUcICABwwCSEE2EjQwQCqZ4MDwRlr0kzwZJoe10X2fqHkrT20T47CTb3srO17nTaxadai6skzUZ15245+edV6Ntnkjd6UYq6sowVtRxuGsT36m9fYosZ2GKdhl3K/nzfY8WzPNszfLvOHVvN2Z15TNAZ3prYLbLhhjdZgScu7pHxphq7GzkkzLStDmSu7tRGaXleSt+bAz7zOat5JpcyV/XXB/WYPg5ndI3eodjnKVX4pm9e3qh1JT5OcyTpe3rrq83W2/6vnO/O2rm8clXrsmDqW3D6AcP1KTpHzsh6d9Aw==", + "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", + "path": "std/embedded_curve_ops.nr" + }, + "50": { + "source": "use std::embedded_curve_ops::EmbeddedCurvePoint;\nuse std::embedded_curve_ops::EmbeddedCurveScalar;\n\nfn main(is_active: bool) {\n let a = EmbeddedCurvePoint {\n x: 0x1d8eb4378a3bde41e0b6a9a8dcbd21b7ff9c51bdd6ca13ce989abbbf90df3666,\n y: 0x06075b63354f2504f9cddba0b94ed0cef35fc88615e69ec1f853b51eb79a24a0,\n is_infinite: false,\n };\n\n if is_active {\n let bad = EmbeddedCurvePoint { x: 0, y: 5, is_infinite: false };\n let d = bad.double();\n let e = std::embedded_curve_ops::multi_scalar_mul(\n [a, bad],\n [EmbeddedCurveScalar { lo: 1, hi: 0 }, EmbeddedCurveScalar { lo: 1, hi: 0 }],\n );\n assert(e.x != d.x);\n }\n}\n", + "path": "" + } + }, "names": [ "main" ], diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_3/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_3/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index a0a1c8fba3f..683a321de87 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_3/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_3/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -9,6 +9,10 @@ expression: artifact "parameters": [], "return_type": null, "error_types": { + "2920182694213909827": { + "error_kind": "string", + "string": "attempt to subtract with overflow" + }, "5019202896831570965": { "error_kind": "string", "string": "attempt to add with overflow" @@ -21,6 +25,10 @@ expression: artifact "error_kind": "string", "string": "array ref-count underflow detected" }, + "14225679739041873922": { + "error_kind": "string", + "string": "Index out of bounds" + }, "17843811134343075018": { "error_kind": "string", "string": "Stack too deep" @@ -35,9 +43,9 @@ expression: artifact "return value indices : []", "BRILLIG CALL func 0: inputs: [], outputs: []", "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(1), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32839), size_address: Relative(1), offset_address: Relative(2) }, Call { location: 11 }, 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: Integer(U32), value: 0 }, Const { destination: Direct(32836), bit_size: Field, value: 0 }, Const { destination: Direct(32837), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(32838), bit_size: Integer(U32), value: 4 }, Return, Call { location: 67 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 73 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(9) }, Mov { destination: Relative(2), source: Relative(10) }, Mov { destination: Relative(3), source: Relative(11) }, Mov { destination: Relative(4), source: Relative(12) }, Mov { destination: Relative(5), source: Relative(13) }, Mov { destination: Relative(6), source: Relative(14) }, 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) }, 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) }, 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) }, 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) }, 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: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Relative(7) }, Mov { destination: Relative(10), source: Relative(1) }, Mov { destination: Relative(11), source: Relative(2) }, Mov { destination: Relative(12), source: Relative(3) }, Mov { destination: Relative(13), source: Relative(4) }, Mov { destination: Relative(14), source: Relative(5) }, Mov { destination: Relative(15), source: Direct(32838) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 115 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(1), source_pointer: Relative(3) }, 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: 65 }, Call { location: 146 }, 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: 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: 72 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 67 }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 5 }, 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(32836) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32836) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32836) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32836) }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 9 }, 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(32836) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32835) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32836) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32835) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32836) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32835) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32836) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32835) }, Mov { destination: Relative(6), source: Direct(32837) }, Mov { destination: Relative(4), source: Relative(2) }, Mov { destination: Relative(2), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(32836) }, Mov { destination: Relative(3), source: Direct(32835) }, Mov { destination: Relative(5), source: Direct(32835) }, Return, Call { location: 67 }, Mov { destination: Relative(8), source: Direct(32835) }, Jump { location: 118 }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, JumpIf { condition: Relative(9), location: 122 }, Jump { location: 121 }, Return, 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) }, 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: 149 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(9), 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(4) }, Mov { destination: Relative(13), source: Relative(5) }, Mov { destination: Relative(14), source: Direct(32836) }, Mov { destination: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 168 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32837) }, Mov { destination: Relative(8), source: Relative(9) }, Jump { location: 118 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 67 }, Load { destination: Relative(7), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(9), op: LessThanEquals, bit_size: U32, lhs: Relative(7), rhs: Relative(8) }, JumpIf { condition: Relative(9), location: 155 }, Call { location: 199 }, Load { destination: Relative(9), source_pointer: Relative(1) }, Load { destination: Relative(10), source_pointer: Relative(2) }, Load { destination: Relative(11), source_pointer: Relative(3) }, Load { destination: Relative(12), source_pointer: Relative(4) }, Load { destination: Relative(13), source_pointer: Relative(5) }, Store { destination_pointer: Relative(1), source: Relative(9) }, Store { destination_pointer: Relative(2), source: Relative(10) }, Store { destination_pointer: Relative(3), source: Relative(11) }, Store { destination_pointer: Relative(4), source: Relative(12) }, Store { destination_pointer: Relative(5), source: Relative(13) }, Store { destination_pointer: Relative(6), source: Relative(8) }, Mov { destination: Relative(1), source: Relative(7) }, Return, Call { location: 67 }, Load { destination: Relative(5), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32838) }, Const { destination: Relative(7), bit_size: Integer(U1), value: 1 }, JumpIf { condition: Relative(6), location: 174 }, Call { location: 202 }, Load { destination: Relative(6), source_pointer: Relative(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 9 }, Call { location: 205 }, 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(8) }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32837) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 9 }, Call { location: 205 }, 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(3) }, Store { destination_pointer: Relative(9), source: Relative(4) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(4), op: LessThanEquals, bit_size: U32, lhs: Relative(5), rhs: Relative(3) }, JumpIf { condition: Relative(4), location: 196 }, Call { location: 199 }, 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: 5019202896831570965 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 5727012404371710682 }, 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]" + "[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(1), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32842), size_address: Relative(1), offset_address: Relative(2) }, Call { location: 11 }, 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: Integer(U1), value: 0 }, Const { destination: Direct(32836), bit_size: Integer(U32), value: 0 }, Const { destination: Direct(32837), bit_size: Field, value: 0 }, Const { destination: Direct(32838), bit_size: Integer(U1), value: 1 }, 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: 4 }, Return, Call { location: 107 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 113 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(9) }, Mov { destination: Relative(2), source: Relative(10) }, Mov { destination: Relative(3), source: Relative(11) }, Mov { destination: Relative(4), source: Relative(12) }, Mov { destination: Relative(5), source: Relative(13) }, Mov { destination: Relative(6), source: Relative(14) }, 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) }, 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) }, 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) }, 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) }, 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: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Relative(7) }, Mov { destination: Relative(10), source: Relative(1) }, Mov { destination: Relative(11), source: Relative(2) }, Mov { destination: Relative(12), source: Relative(3) }, Mov { destination: Relative(13), source: Relative(4) }, Mov { destination: Relative(14), source: Relative(5) }, Mov { destination: Relative(15), source: Direct(32841) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 155 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(6), source_pointer: Relative(3) }, 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: 68 }, Call { location: 186 }, 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(8), bit_size: Integer(U32), value: 8 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Load { destination: Relative(10), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Direct(32841) }, JumpIf { condition: Relative(6), location: 77 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(11) } }, 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(1) }, Mov { destination: Relative(13), source: Relative(2) }, Mov { destination: Relative(14), source: Relative(3) }, 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(6) }, Call { location: 189 }, 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(1) }, Mov { destination: Relative(13), source: Relative(2) }, Mov { destination: Relative(14), source: Relative(3) }, 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(6) }, Call { location: 239 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(1), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, Load { destination: Relative(2), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(1), op: Equals, bit_size: U32, lhs: Relative(2), rhs: Direct(32841) }, JumpIf { condition: Relative(1), location: 106 }, 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: 112 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 107 }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 5 }, 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(32837) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(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(32837) }, 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) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 9 }, 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(32837) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32836) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32837) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32836) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32837) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32836) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32837) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32836) }, Mov { destination: Relative(4), source: Relative(2) }, Mov { destination: Relative(2), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(32837) }, Mov { destination: Relative(6), source: Direct(32839) }, Mov { destination: Relative(3), source: Direct(32836) }, Mov { destination: Relative(5), source: Direct(32836) }, Return, Call { location: 107 }, Mov { destination: Relative(8), source: Direct(32836) }, Jump { location: 158 }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, JumpIf { condition: Relative(9), location: 162 }, Jump { location: 161 }, Return, 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) }, 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: 310 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(9), 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(4) }, Mov { destination: Relative(13), source: Relative(5) }, Mov { destination: Relative(14), source: Direct(32837) }, Mov { destination: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 329 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32839) }, Mov { destination: Relative(8), source: Relative(9) }, Jump { location: 158 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 107 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 6 }, 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(32837) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, 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(32837) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, 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(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: Relative(8) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(7), source: Direct(32836) }, Jump { location: 211 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Relative(8) }, JumpIf { condition: Relative(10), location: 226 }, Jump { location: 214 }, Load { destination: Relative(7), source_pointer: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(3) }, Load { destination: Relative(9), source_pointer: Relative(4) }, Load { destination: Relative(10), source_pointer: Relative(5) }, Load { destination: Relative(11), source_pointer: Relative(6) }, Store { destination_pointer: Relative(1), source: Direct(32837) }, Store { destination_pointer: Relative(2), source: Relative(7) }, Store { destination_pointer: Relative(3), source: Relative(8) }, Store { destination_pointer: Relative(4), source: Relative(9) }, Store { destination_pointer: Relative(5), source: Relative(10) }, Store { destination_pointer: Relative(6), source: Relative(11) }, Return, Cast { destination: Relative(10), source: Relative(7), bit_size: Field }, Load { destination: Relative(11), source_pointer: Relative(9) }, Mov { destination: Direct(32771), source: Relative(11) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 6 }, Call { location: 358 }, 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(7) }, Store { destination_pointer: Relative(14), source: Relative(10) }, Store { destination_pointer: Relative(9), source: Relative(12) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32839) }, Mov { destination: Relative(7), source: Relative(10) }, Jump { location: 211 }, Call { location: 107 }, Load { destination: Relative(7), source_pointer: Relative(2) }, Load { destination: Relative(2), source_pointer: Relative(3) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(7) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(4) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 249 }, Call { location: 186 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(4) }, Load { destination: Relative(4), 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(4) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 257 }, Call { location: 186 }, 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(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(2) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 380 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(13) }, Mov { destination: Relative(10), source: Relative(14) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 16 }, Mov { destination: Relative(16), source: Direct(0) }, Mov { destination: Relative(17), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(15) }, Call { location: 453 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(2), source: Relative(17) }, Mov { destination: Relative(7), source: Relative(18) }, Mov { destination: Relative(11), source: Relative(19) }, Mov { destination: Relative(12), source: Relative(20) }, Mov { destination: Relative(13), source: Relative(21) }, Mov { destination: Relative(14), source: Relative(22) }, 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: 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(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(12) }, 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(13) }, 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(14) }, Const { destination: Relative(14), 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(2) }, Mov { destination: Relative(18), source: Relative(7) }, Mov { destination: Relative(19), source: Relative(11) }, Mov { destination: Relative(20), source: Relative(12) }, Mov { destination: Relative(21), source: Relative(13) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(14) }, Call { location: 498 }, Mov { destination: Direct(0), source: Relative(0) }, Return, Call { location: 107 }, Load { destination: Relative(7), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32839) }, BinaryIntOp { destination: Relative(9), op: LessThanEquals, bit_size: U32, lhs: Relative(7), rhs: Relative(8) }, JumpIf { condition: Relative(9), location: 316 }, Call { location: 576 }, Load { destination: Relative(9), source_pointer: Relative(1) }, Load { destination: Relative(10), source_pointer: Relative(2) }, Load { destination: Relative(11), source_pointer: Relative(3) }, Load { destination: Relative(12), source_pointer: Relative(4) }, Load { destination: Relative(13), source_pointer: Relative(5) }, Store { destination_pointer: Relative(1), source: Relative(9) }, Store { destination_pointer: Relative(2), source: Relative(10) }, Store { destination_pointer: Relative(3), source: Relative(11) }, Store { destination_pointer: Relative(4), source: Relative(12) }, Store { destination_pointer: Relative(5), source: Relative(13) }, Store { destination_pointer: Relative(6), source: Relative(8) }, Mov { destination: Relative(1), source: Relative(7) }, Return, Call { location: 107 }, Load { destination: Relative(5), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32841) }, JumpIf { condition: Relative(6), location: 334 }, Call { location: 579 }, Load { destination: Relative(6), source_pointer: Relative(1) }, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Direct(32840) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 9 }, Call { location: 358 }, 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(32839) }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 9 }, Call { location: 358 }, 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(32839) }, BinaryIntOp { destination: Relative(4), op: LessThanEquals, bit_size: U32, lhs: Relative(5), rhs: Relative(3) }, JumpIf { condition: Relative(4), location: 355 }, Call { location: 576 }, Store { destination_pointer: Relative(1), source: Relative(6) }, Store { destination_pointer: Relative(2), source: Relative(3) }, 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: 362 }, Jump { location: 364 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 379 }, 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: 376 }, 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: 369 }, 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: 379 }, Return, Call { location: 107 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 5 }, 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(32837) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, 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(32837) }, 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: 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) }, 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: 406 }, Call { location: 186 }, 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(32836) }, Jump { location: 410 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32841) }, JumpIf { condition: Relative(6), location: 416 }, Jump { location: 413 }, Load { destination: Relative(1), source_pointer: Relative(5) }, Load { destination: Relative(2), source_pointer: Relative(4) }, Return, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(6), location: 419 }, Jump { location: 450 }, 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: 425 }, Call { location: 186 }, 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: Sub, bit_size: U32, lhs: Relative(2), rhs: Relative(3) }, BinaryIntOp { destination: Relative(8), op: LessThanEquals, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(8), location: 431 }, Call { location: 582 }, BinaryIntOp { destination: Relative(8), op: Sub, bit_size: U32, lhs: Relative(6), rhs: Direct(32839) }, BinaryIntOp { destination: Relative(9), op: LessThanEquals, bit_size: U32, lhs: Direct(32839), rhs: Relative(6) }, JumpIf { condition: Relative(9), location: 435 }, Call { location: 582 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Direct(32841) }, JumpIf { condition: Relative(6), location: 438 }, Call { location: 585 }, 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(6), 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(6) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(8) }, Call { location: 588 }, Mov { destination: Direct(0), source: Relative(0) }, Jump { location: 450 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, Mov { destination: Relative(3), source: Relative(6) }, Jump { location: 410 }, Call { location: 107 }, Mov { destination: Relative(2), 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(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(32837) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32837) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32837) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32837) }, 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: 473 }, Call { location: 186 }, 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(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(3) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 481 }, Call { location: 186 }, 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(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: Direct(32841) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 608 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(3), source: Relative(9) }, Mov { destination: Relative(6), source: Relative(10) }, Mov { destination: Relative(5), source: Relative(2) }, Mov { destination: Relative(1), source: Relative(2) }, Mov { destination: Relative(4), source: Relative(6) }, Mov { destination: Relative(2), source: Direct(32836) }, Mov { destination: Relative(6), source: Direct(32836) }, Return, Call { location: 107 }, Load { destination: Relative(7), source_pointer: Relative(1) }, 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: 506 }, Call { location: 186 }, 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(8), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(7) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(8) }, Call { location: 647 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(8), source_pointer: Relative(2) }, 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: 521 }, Call { location: 186 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(10) }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Direct(32841), rhs: Relative(8) }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U1, lhs: Relative(10), rhs: Direct(32835) }, JumpIf { condition: Relative(12), location: 528 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(13) } }, Load { destination: Relative(10), source_pointer: Relative(3) }, Load { destination: Relative(12), source_pointer: Relative(4) }, Load { destination: Relative(13), source_pointer: Relative(5) }, Load { destination: Relative(14), source_pointer: Relative(6) }, Store { destination_pointer: Relative(1), source: Relative(7) }, Store { destination_pointer: Relative(2), source: Relative(8) }, Store { destination_pointer: Relative(4), source: Relative(12) }, Store { destination_pointer: Relative(5), source: Relative(13) }, Store { destination_pointer: Relative(6), source: Relative(14) }, Load { destination: Relative(7), source_pointer: Relative(10) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 543 }, Call { location: 186 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(7) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(10) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 683 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(7), source_pointer: Relative(4) }, 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: 558 }, Call { location: 186 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(12) }, BinaryIntOp { destination: Relative(12), op: LessThan, bit_size: U32, lhs: Direct(32841), rhs: Relative(7) }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U1, lhs: Relative(12), rhs: Direct(32835) }, JumpIf { condition: Relative(14), location: 565 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(15) } }, Load { destination: Relative(12), source_pointer: Relative(1) }, Load { destination: Relative(14), source_pointer: Relative(2) }, Load { destination: Relative(15), source_pointer: Relative(5) }, Load { destination: Relative(16), source_pointer: Relative(6) }, Store { destination_pointer: Relative(1), source: Relative(12) }, Store { destination_pointer: Relative(2), source: Relative(14) }, Store { destination_pointer: Relative(3), source: Relative(10) }, Store { destination_pointer: Relative(4), source: Relative(7) }, Store { destination_pointer: Relative(5), source: Relative(15) }, Store { destination_pointer: Relative(6), source: Relative(16) }, 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: 5727012404371710682 }, 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, Call { location: 107 }, Load { destination: Relative(4), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32841) }, JumpIf { condition: Relative(5), location: 593 }, Call { location: 579 }, Load { destination: Relative(5), source_pointer: Relative(1) }, Mov { destination: Direct(32771), source: Relative(5) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 358 }, 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(32839) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, JumpIf { condition: Relative(5), location: 605 }, Call { location: 576 }, Store { destination_pointer: Relative(1), source: Relative(6) }, Store { destination_pointer: Relative(2), source: Relative(3) }, Return, Call { location: 107 }, 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) }, BinaryIntOp { destination: Relative(1), op: LessThan, bit_size: U32, lhs: Direct(32841), rhs: Relative(2) }, BinaryIntOp { destination: Relative(5), op: Equals, bit_size: U1, lhs: Relative(1), rhs: Direct(32835) }, JumpIf { condition: Relative(5), location: 617 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(6) } }, Mov { destination: Relative(3), source: Relative(2) }, Jump { location: 619 }, BinaryIntOp { destination: Relative(1), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32841) }, JumpIf { condition: Relative(1), location: 624 }, Jump { location: 622 }, Load { destination: Relative(1), source_pointer: Relative(4) }, Return, Load { destination: Relative(5), source_pointer: Relative(4) }, JumpIf { condition: Relative(1), location: 627 }, Call { location: 585 }, BinaryIntOp { destination: Relative(1), op: Mul, bit_size: U32, lhs: Relative(3), rhs: Direct(32840) }, Mov { destination: Direct(32771), source: Relative(5) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 9 }, Call { location: 358 }, 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(1) }, Store { destination_pointer: Relative(8), source: Direct(32837) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32839) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 9 }, Call { location: 358 }, Mov { destination: Relative(1), source: Direct(32773) }, 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(5) }, Store { destination_pointer: Relative(8), source: Direct(32836) }, Store { destination_pointer: Relative(4), source: Relative(1) }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, Mov { destination: Relative(3), source: Relative(1) }, Jump { location: 619 }, Call { location: 107 }, 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(32839) }, Jump { location: 653 }, BinaryIntOp { destination: Relative(1), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32841) }, JumpIf { condition: Relative(1), location: 657 }, Jump { location: 656 }, Return, Mov { destination: Relative(1), source: Direct(32836) }, Jump { location: 659 }, BinaryIntOp { destination: Relative(4), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, JumpIf { condition: Relative(4), location: 665 }, Jump { location: 662 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32839) }, Mov { destination: Relative(2), source: Relative(1) }, Jump { location: 653 }, Load { destination: Relative(4), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32841) }, JumpIf { condition: Relative(5), location: 669 }, Call { location: 585 }, 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) }, Mov { destination: Direct(32771), source: Relative(4) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 358 }, 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(3), source: Relative(6) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32839) }, Mov { destination: Relative(1), source: Relative(4) }, Jump { location: 659 }, Call { location: 107 }, 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(32839) }, Jump { location: 689 }, BinaryIntOp { destination: Relative(1), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32841) }, JumpIf { condition: Relative(1), location: 693 }, Jump { location: 692 }, Return, BinaryIntOp { destination: Relative(4), op: Mul, bit_size: U32, lhs: Relative(2), rhs: Direct(32840) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32839) }, Mov { destination: Relative(1), source: Direct(32836) }, Jump { location: 697 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, JumpIf { condition: Relative(6), location: 703 }, Jump { location: 700 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32839) }, Mov { destination: Relative(2), source: Relative(1) }, Jump { location: 689 }, Load { destination: Relative(6), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32841) }, JumpIf { condition: Relative(7), location: 707 }, Call { location: 585 }, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(6), 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(32839) }, 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(9) }, Load { destination: Relative(7), source_pointer: Relative(11) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 9 }, Call { location: 358 }, 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(4) }, Store { destination_pointer: Relative(11), source: Relative(8) }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 9 }, Call { location: 358 }, 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(5) }, Store { destination_pointer: Relative(10), source: Relative(7) }, Store { destination_pointer: Relative(3), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32839) }, Mov { destination: Relative(1), source: Relative(6) }, Jump { location: 697 }]" ], - "debug_symbols": "ndbBbuIwEMbxd8mZQzy2x56+SlVVAUIVKQoohZVWiHdfO98MdA+gKhf+E0J+LYmb5trs++3l63OYDsfv5u392mznYRyHr8/xuOvOw3Eq716btr641Ly5TeMyIkuoRRxCiEcCEhFGoBAUguKheCgeiofioXgoHoqH4qF4KAFKgBKgBCgBSoASikIlCcmILIkt4hBCPBKQiECJUCKUCIWhMBSGwlAYCkNhKKm86UsiwkhCMiJLcos4hBCPQMlQMpQMJUPJUASKQBEoAkWgCBSBIlAEikBxbat1WtJ6bdBGLWuhubqaQmldOVzrtUEbtaxN2qwVtK6gpU6rnlevrqJUG7WsTdqsFbSupaVOS9rixdK6ShzVoXwg15LWa4M2almbtFkraF0wS9Vj9Vg9Vo/VYz0uleOk1mlJ67VBW1d+Wwe2IdmQbRAd6hLD4GwgG7wNwQaTs8nZ5GxyNllMFpPr0nPLDcXbEGyINrANVXa326ax+9Pnee77env6ccMqt7FTN/fTuXmbLuO4af5042X50Pepm5aeu7nsLT+/n/alBTwMY1+n2+ZxdPv80Mit6NGRvbsD8fdCcnchpXaF4BwnFVy5wCsE8sQqlFFWCSHchUTPhPhCIHcX6PmZfCWUvx4Tygpb8y1Y7FpQcrxC4BztW3BOj2/BvwakjQYIpTXA/UqwxBXAq9P4Uba63TD/91xwq9Y8dNux183DZdr92Hv+e7I99lxxmo+7fn+Z+yo9Hi7KyzuVE0DEH/XfQ9ksaztR3XDLPtpQGz5u9Vf5Bw==", + "debug_symbols": "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", "file_map": { "6": { "source": "use crate::{cmp::Eq, convert::From, runtime::is_unconstrained, static_assert};\n\n/// A `BoundedVec` is a growable storage similar to a `Vec` except that it\n/// is bounded with a maximum possible length. Unlike `Vec`, `BoundedVec` is not implemented\n/// via slices and thus is not subject to the same restrictions slices are (notably, nested\n/// slices - and thus nested vectors as well - are disallowed).\n///\n/// Since a BoundedVec is backed by a normal array under the hood, growing the BoundedVec by\n/// pushing an additional element is also more efficient - the length only needs to be increased\n/// by one.\n///\n/// For these reasons `BoundedVec` should generally be preferred over `Vec` when there\n/// is a reasonable maximum bound that can be placed on the vector.\n///\n/// Example:\n///\n/// ```noir\n/// let mut vector: BoundedVec = BoundedVec::new();\n/// for i in 0..5 {\n/// vector.push(i);\n/// }\n/// assert(vector.len() == 5);\n/// assert(vector.max_len() == 10);\n/// ```\npub struct BoundedVec {\n storage: [T; MaxLen],\n len: u32,\n}\n\nimpl BoundedVec {\n /// Creates a new, empty vector of length zero.\n ///\n /// Since this container is backed by an array internally, it still needs an initial value\n /// to give each element. To resolve this, each element is zeroed internally. This value\n /// is guaranteed to be inaccessible unless `get_unchecked` is used.\n ///\n /// Example:\n ///\n /// ```noir\n /// let empty_vector: BoundedVec = BoundedVec::new();\n /// assert(empty_vector.len() == 0);\n /// ```\n ///\n /// Note that whenever calling `new` the maximum length of the vector should always be specified\n /// via a type signature:\n ///\n /// ```noir\n /// fn good() -> BoundedVec {\n /// // Ok! MaxLen is specified with a type annotation\n /// let v1: BoundedVec = BoundedVec::new();\n /// let v2 = BoundedVec::new();\n ///\n /// // Ok! MaxLen is known from the type of `good`'s return value\n /// v2\n /// }\n ///\n /// fn bad() {\n /// // Error: Type annotation needed\n /// // The compiler can't infer `MaxLen` from the following code:\n /// let mut v3 = BoundedVec::new();\n /// v3.push(5);\n /// }\n /// ```\n ///\n /// This defaulting of `MaxLen` (and numeric generics in general) to zero may change in future noir versions\n /// but for now make sure to use type annotations when using bounded vectors. Otherwise, you will receive a\n /// constraint failure at runtime when the vec is pushed to.\n pub fn new() -> Self {\n let zeroed = crate::mem::zeroed();\n BoundedVec { storage: [zeroed; MaxLen], len: 0 }\n }\n\n /// Retrieves an element from the vector at the given index, starting from zero.\n ///\n /// If the given index is equal to or greater than the length of the vector, this\n /// will issue a constraint failure.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn foo(v: BoundedVec) {\n /// let first = v.get(0);\n /// let last = v.get(v.len() - 1);\n /// assert(first != last);\n /// }\n /// ```\n pub fn get(self, index: u32) -> T {\n assert(index < self.len, \"Attempted to read past end of BoundedVec\");\n self.get_unchecked(index)\n }\n\n /// Retrieves an element from the vector at the given index, starting from zero, without\n /// performing a bounds check.\n ///\n /// Since this function does not perform a bounds check on length before accessing the element,\n /// it is unsafe! Use at your own risk!\n ///\n /// Example:\n ///\n /// ```noir\n /// fn sum_of_first_three(v: BoundedVec) -> u32 {\n /// // Always ensure the length is larger than the largest\n /// // index passed to get_unchecked\n /// assert(v.len() > 2);\n /// let first = v.get_unchecked(0);\n /// let second = v.get_unchecked(1);\n /// let third = v.get_unchecked(2);\n /// first + second + third\n /// }\n /// ```\n pub fn get_unchecked(self, index: u32) -> T {\n self.storage[index]\n }\n\n /// Writes an element to the vector at the given index, starting from zero.\n ///\n /// If the given index is equal to or greater than the length of the vector, this will issue a constraint failure.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn foo(v: BoundedVec) {\n /// let first = v.get(0);\n /// assert(first != 42);\n /// v.set(0, 42);\n /// let new_first = v.get(0);\n /// assert(new_first == 42);\n /// }\n /// ```\n pub fn set(&mut self, index: u32, value: T) {\n assert(index < self.len, \"Attempted to write past end of BoundedVec\");\n self.set_unchecked(index, value)\n }\n\n /// Writes an element to the vector at the given index, starting from zero, without performing a bounds check.\n ///\n /// Since this function does not perform a bounds check on length before accessing the element, it is unsafe! Use at your own risk!\n ///\n /// Example:\n ///\n /// ```noir\n /// fn set_unchecked_example() {\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_array([1, 2]);\n ///\n /// // Here we're safely writing within the valid range of `vec`\n /// // `vec` now has the value [42, 2]\n /// vec.set_unchecked(0, 42);\n ///\n /// // We can then safely read this value back out of `vec`.\n /// // Notice that we use the checked version of `get` which would prevent reading unsafe values.\n /// assert_eq(vec.get(0), 42);\n ///\n /// // We've now written past the end of `vec`.\n /// // As this index is still within the maximum potential length of `v`,\n /// // it won't cause a constraint failure.\n /// vec.set_unchecked(2, 42);\n /// println(vec);\n ///\n /// // This will write past the end of the maximum potential length of `vec`,\n /// // it will then trigger a constraint failure.\n /// vec.set_unchecked(5, 42);\n /// println(vec);\n /// }\n /// ```\n pub fn set_unchecked(&mut self, index: u32, value: T) {\n self.storage[index] = value;\n }\n\n /// Pushes an element to the end of the vector. This increases the length\n /// of the vector by one.\n ///\n /// Panics if the new length of the vector will be greater than the max length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// v.push(1);\n /// v.push(2);\n ///\n /// // Panics with failed assertion \"push out of bounds\"\n /// v.push(3);\n /// ```\n pub fn push(&mut self, elem: T) {\n assert(self.len < MaxLen, \"push out of bounds\");\n\n self.storage[self.len] = elem;\n self.len += 1;\n }\n\n /// Returns the current length of this vector\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// assert(v.len() == 0);\n ///\n /// v.push(100);\n /// assert(v.len() == 1);\n ///\n /// v.push(200);\n /// v.push(300);\n /// v.push(400);\n /// assert(v.len() == 4);\n ///\n /// let _ = v.pop();\n /// let _ = v.pop();\n /// assert(v.len() == 2);\n /// ```\n pub fn len(self) -> u32 {\n self.len\n }\n\n /// Returns the maximum length of this vector. This is always\n /// equal to the `MaxLen` parameter this vector was initialized with.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// assert(v.max_len() == 5);\n /// v.push(10);\n /// assert(v.max_len() == 5);\n /// ```\n pub fn max_len(_self: BoundedVec) -> u32 {\n MaxLen\n }\n\n /// Returns the internal array within this vector.\n ///\n /// Since arrays in Noir are immutable, mutating the returned storage array will not mutate\n /// the storage held internally by this vector.\n ///\n /// Note that uninitialized elements may be zeroed out!\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// assert(v.storage() == [0, 0, 0, 0, 0]);\n ///\n /// v.push(57);\n /// assert(v.storage() == [57, 0, 0, 0, 0]);\n /// ```\n pub fn storage(self) -> [T; MaxLen] {\n self.storage\n }\n\n /// Pushes each element from the given array to this vector.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_array([2, 4]);\n ///\n /// assert(vec.len == 2);\n /// assert(vec.get(0) == 2);\n /// assert(vec.get(1) == 4);\n /// ```\n pub fn extend_from_array(&mut self, array: [T; Len]) {\n let new_len = self.len + array.len();\n assert(new_len <= MaxLen, \"extend_from_array out of bounds\");\n for i in 0..array.len() {\n self.storage[self.len + i] = array[i];\n }\n self.len = new_len;\n }\n\n /// Pushes each element from the given slice to this vector.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_slice(&[2, 4]);\n ///\n /// assert(vec.len == 2);\n /// assert(vec.get(0) == 2);\n /// assert(vec.get(1) == 4);\n /// ```\n pub fn extend_from_slice(&mut self, slice: [T]) {\n let new_len = self.len + slice.len();\n assert(new_len <= MaxLen, \"extend_from_slice out of bounds\");\n for i in 0..slice.len() {\n self.storage[self.len + i] = slice[i];\n }\n self.len = new_len;\n }\n\n /// Pushes each element from the other vector to this vector. The length of\n /// the other vector is left unchanged.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// ```noir\n /// let mut v1: BoundedVec = BoundedVec::new();\n /// let mut v2: BoundedVec = BoundedVec::new();\n ///\n /// v2.extend_from_array([1, 2, 3]);\n /// v1.extend_from_bounded_vec(v2);\n ///\n /// assert(v1.storage() == [1, 2, 3, 0, 0]);\n /// assert(v2.storage() == [1, 2, 3, 0, 0, 0, 0]);\n /// ```\n pub fn extend_from_bounded_vec(&mut self, vec: BoundedVec) {\n let append_len = vec.len();\n let new_len = self.len + append_len;\n assert(new_len <= MaxLen, \"extend_from_bounded_vec out of bounds\");\n\n if is_unconstrained() {\n for i in 0..append_len {\n self.storage[self.len + i] = vec.get_unchecked(i);\n }\n } else {\n let mut exceeded_len = false;\n for i in 0..Len {\n exceeded_len |= i == append_len;\n if !exceeded_len {\n self.storage[self.len + i] = vec.get_unchecked(i);\n }\n }\n }\n self.len = new_len;\n }\n\n /// Creates a new vector, populating it with values derived from an array input.\n /// The maximum length of the vector is determined based on the type signature.\n ///\n /// Example:\n ///\n /// ```noir\n /// let bounded_vec: BoundedVec = BoundedVec::from_array([1, 2, 3])\n /// ```\n pub fn from_array(array: [T; Len]) -> Self {\n static_assert(Len <= MaxLen, \"from array out of bounds\");\n let mut vec: BoundedVec = BoundedVec::new();\n vec.extend_from_array(array);\n vec\n }\n\n /// Pops the element at the end of the vector. This will decrease the length\n /// of the vector by one.\n ///\n /// Panics if the vector is empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// v.push(1);\n /// v.push(2);\n ///\n /// let two = v.pop();\n /// let one = v.pop();\n ///\n /// assert(two == 2);\n /// assert(one == 1);\n ///\n /// // error: cannot pop from an empty vector\n /// let _ = v.pop();\n /// ```\n pub fn pop(&mut self) -> T {\n assert(self.len > 0);\n self.len -= 1;\n\n let elem = self.storage[self.len];\n self.storage[self.len] = crate::mem::zeroed();\n elem\n }\n\n /// Returns true if the given predicate returns true for any element\n /// in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// v.extend_from_array([2, 4, 6]);\n ///\n /// let all_even = !v.any(|elem: u32| elem % 2 != 0);\n /// assert(all_even);\n /// ```\n pub fn any(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n if is_unconstrained() {\n for i in 0..self.len {\n ret |= predicate(self.storage[i]);\n }\n } else {\n let mut ret = false;\n let mut exceeded_len = false;\n for i in 0..MaxLen {\n exceeded_len |= i == self.len;\n if !exceeded_len {\n ret |= predicate(self.storage[i]);\n }\n }\n }\n ret\n }\n\n /// Creates a new vector of equal size by calling a closure on each element in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let result = vec.map(|value| value * 2);\n ///\n /// let expected = BoundedVec::from_array([2, 4, 6, 8]);\n /// assert_eq(result, expected);\n /// ```\n pub fn map(self, f: fn[Env](T) -> U) -> BoundedVec {\n let mut ret = BoundedVec::new();\n ret.len = self.len();\n\n if is_unconstrained() {\n for i in 0..self.len() {\n ret.storage[i] = f(self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n ret.storage[i] = f(self.get_unchecked(i));\n }\n }\n }\n\n ret\n }\n\n /// Creates a new vector of equal size by calling a closure on each element\n /// in this vector, along with its index.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let result = vec.mapi(|i, value| i + value * 2);\n ///\n /// let expected = BoundedVec::from_array([2, 5, 8, 11]);\n /// assert_eq(result, expected);\n /// ```\n pub fn mapi(self, f: fn[Env](u32, T) -> U) -> BoundedVec {\n let mut ret = BoundedVec::new();\n ret.len = self.len();\n\n if is_unconstrained() {\n for i in 0..self.len() {\n ret.storage[i] = f(i, self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n ret.storage[i] = f(i, self.get_unchecked(i));\n }\n }\n }\n\n ret\n }\n\n /// Calls a closure on each element in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let mut result = BoundedVec::::new();\n /// vec.for_each(|value| result.push(value * 2));\n ///\n /// let expected = BoundedVec::from_array([2, 4, 6, 8]);\n /// assert_eq(result, expected);\n /// ```\n pub fn for_each(self, f: fn[Env](T) -> ()) {\n if is_unconstrained() {\n for i in 0..self.len() {\n f(self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n f(self.get_unchecked(i));\n }\n }\n }\n }\n\n /// Calls a closure on each element in this vector, along with its index.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let mut result = BoundedVec::::new();\n /// vec.for_eachi(|i, value| result.push(i + value * 2));\n ///\n /// let expected = BoundedVec::from_array([2, 5, 8, 11]);\n /// assert_eq(result, expected);\n /// ```\n pub fn for_eachi(self, f: fn[Env](u32, T) -> ()) {\n if is_unconstrained() {\n for i in 0..self.len() {\n f(i, self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n f(i, self.get_unchecked(i));\n }\n }\n }\n }\n\n /// Creates a new BoundedVec from the given array and length.\n /// The given length must be less than or equal to the length of the array.\n ///\n /// This function will zero out any elements at or past index `len` of `array`.\n /// This incurs an extra runtime cost of O(MaxLen). If you are sure your array is\n /// zeroed after that index, you can use `from_parts_unchecked` to remove the extra loop.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_parts([1, 2, 3, 0], 3);\n /// assert_eq(vec.len(), 3);\n /// ```\n pub fn from_parts(mut array: [T; MaxLen], len: u32) -> Self {\n assert(len <= MaxLen);\n let zeroed = crate::mem::zeroed();\n\n if is_unconstrained() {\n for i in len..MaxLen {\n array[i] = zeroed;\n }\n } else {\n for i in 0..MaxLen {\n if i >= len {\n array[i] = zeroed;\n }\n }\n }\n\n BoundedVec { storage: array, len }\n }\n\n /// Creates a new BoundedVec from the given array and length.\n /// The given length must be less than or equal to the length of the array.\n ///\n /// This function is unsafe because it expects all elements past the `len` index\n /// of `array` to be zeroed, but does not check for this internally. Use `from_parts`\n /// for a safe version of this function which does zero out any indices past the\n /// given length. Invalidating this assumption can notably cause `BoundedVec::eq`\n /// to give incorrect results since it will check even elements past `len`.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 0], 3);\n /// assert_eq(vec.len(), 3);\n ///\n /// // invalid use!\n /// let vec1: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 1], 3);\n /// let vec2: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 2], 3);\n ///\n /// // both vecs have length 3 so we'd expect them to be equal, but this\n /// // fails because elements past the length are still checked in eq\n /// assert_eq(vec1, vec2); // fails\n /// ```\n pub fn from_parts_unchecked(array: [T; MaxLen], len: u32) -> Self {\n assert(len <= MaxLen);\n BoundedVec { storage: array, len }\n }\n}\n\nimpl Eq for BoundedVec\nwhere\n T: Eq,\n{\n fn eq(self, other: BoundedVec) -> bool {\n // TODO: https://github.com/noir-lang/noir/issues/4837\n //\n // We make the assumption that the user has used the proper interface for working with `BoundedVec`s\n // rather than directly manipulating the internal fields as this can result in an inconsistent internal state.\n if self.len == other.len {\n self.storage == other.storage\n } else {\n false\n }\n }\n}\n\nimpl From<[T; Len]> for BoundedVec {\n fn from(array: [T; Len]) -> BoundedVec {\n BoundedVec::from_array(array)\n }\n}\n\nmod bounded_vec_tests {\n\n mod get {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test(should_fail_with = \"Attempted to read past end of BoundedVec\")]\n fn panics_when_reading_elements_past_end_of_vec() {\n let vec: BoundedVec = BoundedVec::new();\n\n crate::println(vec.get(0));\n }\n }\n\n mod set {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn set_updates_values_properly() {\n let mut vec = BoundedVec::from_array([0, 0, 0, 0, 0]);\n\n vec.set(0, 42);\n assert_eq(vec.storage, [42, 0, 0, 0, 0]);\n\n vec.set(1, 43);\n assert_eq(vec.storage, [42, 43, 0, 0, 0]);\n\n vec.set(2, 44);\n assert_eq(vec.storage, [42, 43, 44, 0, 0]);\n\n vec.set(1, 10);\n assert_eq(vec.storage, [42, 10, 44, 0, 0]);\n\n vec.set(0, 0);\n assert_eq(vec.storage, [0, 10, 44, 0, 0]);\n }\n\n #[test(should_fail_with = \"Attempted to write past end of BoundedVec\")]\n fn panics_when_writing_elements_past_end_of_vec() {\n let mut vec: BoundedVec = BoundedVec::new();\n vec.set(0, 42);\n\n // Need to use println to avoid DIE removing the write operation.\n crate::println(vec.get(0));\n }\n }\n\n mod map {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn applies_function_correctly() {\n // docs:start:bounded-vec-map-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.map(|value| value * 2);\n // docs:end:bounded-vec-map-example\n let expected = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.map(|value| (value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = vec.map(|value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod mapi {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn applies_function_correctly() {\n // docs:start:bounded-vec-mapi-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.mapi(|i, value| i + value * 2);\n // docs:end:bounded-vec-mapi-example\n let expected = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.mapi(|i, value| (i + value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = vec.mapi(|_, value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod for_each {\n use crate::collections::bounded_vec::BoundedVec;\n\n // map in terms of for_each\n fn for_each_map(\n input: BoundedVec,\n f: fn[Env](T) -> U,\n ) -> BoundedVec {\n let mut output = BoundedVec::::new();\n let output_ref = &mut output;\n input.for_each(|x| output_ref.push(f(x)));\n output\n }\n\n #[test]\n fn smoke_test() {\n let mut acc = 0;\n let acc_ref = &mut acc;\n // docs:start:bounded-vec-for-each-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3]);\n vec.for_each(|value| { *acc_ref += value; });\n // docs:end:bounded-vec-for-each-example\n assert_eq(acc, 6);\n }\n\n #[test]\n fn applies_function_correctly() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_each_map(vec, |value| value * 2);\n let expected = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_each_map(vec, |value| (value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = for_each_map(vec, |value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod for_eachi {\n use crate::collections::bounded_vec::BoundedVec;\n\n // mapi in terms of for_eachi\n fn for_eachi_mapi(\n input: BoundedVec,\n f: fn[Env](u32, T) -> U,\n ) -> BoundedVec {\n let mut output = BoundedVec::::new();\n let output_ref = &mut output;\n input.for_eachi(|i, x| output_ref.push(f(i, x)));\n output\n }\n\n #[test]\n fn smoke_test() {\n let mut acc = 0;\n let acc_ref = &mut acc;\n // docs:start:bounded-vec-for-eachi-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3]);\n vec.for_eachi(|i, value| { *acc_ref += i * value; });\n // docs:end:bounded-vec-for-eachi-example\n\n // 0 * 1 + 1 * 2 + 2 * 3\n assert_eq(acc, 8);\n }\n\n #[test]\n fn applies_function_correctly() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_eachi_mapi(vec, |i, value| i + value * 2);\n let expected = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_eachi_mapi(vec, |i, value| (i + value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = for_eachi_mapi(vec, |_, value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod from_array {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn empty() {\n let empty_array: [Field; 0] = [];\n let bounded_vec = BoundedVec::from_array([]);\n\n assert_eq(bounded_vec.max_len(), 0);\n assert_eq(bounded_vec.len(), 0);\n assert_eq(bounded_vec.storage(), empty_array);\n }\n\n #[test]\n fn equal_len() {\n let array = [1, 2, 3];\n let bounded_vec = BoundedVec::from_array(array);\n\n assert_eq(bounded_vec.max_len(), 3);\n assert_eq(bounded_vec.len(), 3);\n assert_eq(bounded_vec.storage(), array);\n }\n\n #[test]\n fn max_len_greater_then_array_len() {\n let array = [1, 2, 3];\n let bounded_vec: BoundedVec = BoundedVec::from_array(array);\n\n assert_eq(bounded_vec.max_len(), 10);\n assert_eq(bounded_vec.len(), 3);\n assert_eq(bounded_vec.get(0), 1);\n assert_eq(bounded_vec.get(1), 2);\n assert_eq(bounded_vec.get(2), 3);\n }\n\n #[test(should_fail_with = \"from array out of bounds\")]\n fn max_len_lower_then_array_len() {\n let _: BoundedVec = BoundedVec::from_array([0; 3]);\n }\n }\n\n mod trait_from {\n use crate::collections::bounded_vec::BoundedVec;\n use crate::convert::From;\n\n #[test]\n fn simple() {\n let array = [1, 2];\n let bounded_vec: BoundedVec = BoundedVec::from(array);\n\n assert_eq(bounded_vec.max_len(), 10);\n assert_eq(bounded_vec.len(), 2);\n assert_eq(bounded_vec.get(0), 1);\n assert_eq(bounded_vec.get(1), 2);\n }\n }\n\n mod trait_eq {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn empty_equality() {\n let mut bounded_vec1: BoundedVec = BoundedVec::new();\n let mut bounded_vec2: BoundedVec = BoundedVec::new();\n\n assert_eq(bounded_vec1, bounded_vec2);\n }\n\n #[test]\n fn inequality() {\n let mut bounded_vec1: BoundedVec = BoundedVec::new();\n let mut bounded_vec2: BoundedVec = BoundedVec::new();\n bounded_vec1.push(1);\n bounded_vec2.push(2);\n\n assert(bounded_vec1 != bounded_vec2);\n }\n }\n\n mod from_parts {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn from_parts() {\n // docs:start:from-parts\n let vec: BoundedVec = BoundedVec::from_parts([1, 2, 3, 0], 3);\n assert_eq(vec.len(), 3);\n\n // Any elements past the given length are zeroed out, so these\n // two BoundedVecs will be completely equal\n let vec1: BoundedVec = BoundedVec::from_parts([1, 2, 3, 1], 3);\n let vec2: BoundedVec = BoundedVec::from_parts([1, 2, 3, 2], 3);\n assert_eq(vec1, vec2);\n // docs:end:from-parts\n }\n\n #[test]\n fn from_parts_unchecked() {\n // docs:start:from-parts-unchecked\n let vec: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 0], 3);\n assert_eq(vec.len(), 3);\n\n // invalid use!\n let vec1: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 1], 3);\n let vec2: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 2], 3);\n\n // both vecs have length 3 so we'd expect them to be equal, but this\n // fails because elements past the length are still checked in eq\n assert(vec1 != vec2);\n // docs:end:from-parts-unchecked\n }\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_3/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_3/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index a0a1c8fba3f..683a321de87 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_3/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_3/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -9,6 +9,10 @@ expression: artifact "parameters": [], "return_type": null, "error_types": { + "2920182694213909827": { + "error_kind": "string", + "string": "attempt to subtract with overflow" + }, "5019202896831570965": { "error_kind": "string", "string": "attempt to add with overflow" @@ -21,6 +25,10 @@ expression: artifact "error_kind": "string", "string": "array ref-count underflow detected" }, + "14225679739041873922": { + "error_kind": "string", + "string": "Index out of bounds" + }, "17843811134343075018": { "error_kind": "string", "string": "Stack too deep" @@ -35,9 +43,9 @@ expression: artifact "return value indices : []", "BRILLIG CALL func 0: inputs: [], outputs: []", "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(1), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32839), size_address: Relative(1), offset_address: Relative(2) }, Call { location: 11 }, 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: Integer(U32), value: 0 }, Const { destination: Direct(32836), bit_size: Field, value: 0 }, Const { destination: Direct(32837), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(32838), bit_size: Integer(U32), value: 4 }, Return, Call { location: 67 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 73 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(9) }, Mov { destination: Relative(2), source: Relative(10) }, Mov { destination: Relative(3), source: Relative(11) }, Mov { destination: Relative(4), source: Relative(12) }, Mov { destination: Relative(5), source: Relative(13) }, Mov { destination: Relative(6), source: Relative(14) }, 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) }, 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) }, 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) }, 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) }, 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: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Relative(7) }, Mov { destination: Relative(10), source: Relative(1) }, Mov { destination: Relative(11), source: Relative(2) }, Mov { destination: Relative(12), source: Relative(3) }, Mov { destination: Relative(13), source: Relative(4) }, Mov { destination: Relative(14), source: Relative(5) }, Mov { destination: Relative(15), source: Direct(32838) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 115 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(1), source_pointer: Relative(3) }, 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: 65 }, Call { location: 146 }, 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: 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: 72 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 67 }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 5 }, 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(32836) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32836) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32836) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(2) }, Store { destination_pointer: Relative(3), source: Direct(32836) }, Mov { destination: Relative(2), source: Direct(1) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 9 }, 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(32836) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32835) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32836) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32835) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32836) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32835) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32836) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32835) }, Mov { destination: Relative(6), source: Direct(32837) }, Mov { destination: Relative(4), source: Relative(2) }, Mov { destination: Relative(2), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(32836) }, Mov { destination: Relative(3), source: Direct(32835) }, Mov { destination: Relative(5), source: Direct(32835) }, Return, Call { location: 67 }, Mov { destination: Relative(8), source: Direct(32835) }, Jump { location: 118 }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, JumpIf { condition: Relative(9), location: 122 }, Jump { location: 121 }, Return, 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) }, 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: 149 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(9), 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(4) }, Mov { destination: Relative(13), source: Relative(5) }, Mov { destination: Relative(14), source: Direct(32836) }, Mov { destination: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 168 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32837) }, Mov { destination: Relative(8), source: Relative(9) }, Jump { location: 118 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 67 }, Load { destination: Relative(7), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(9), op: LessThanEquals, bit_size: U32, lhs: Relative(7), rhs: Relative(8) }, JumpIf { condition: Relative(9), location: 155 }, Call { location: 199 }, Load { destination: Relative(9), source_pointer: Relative(1) }, Load { destination: Relative(10), source_pointer: Relative(2) }, Load { destination: Relative(11), source_pointer: Relative(3) }, Load { destination: Relative(12), source_pointer: Relative(4) }, Load { destination: Relative(13), source_pointer: Relative(5) }, Store { destination_pointer: Relative(1), source: Relative(9) }, Store { destination_pointer: Relative(2), source: Relative(10) }, Store { destination_pointer: Relative(3), source: Relative(11) }, Store { destination_pointer: Relative(4), source: Relative(12) }, Store { destination_pointer: Relative(5), source: Relative(13) }, Store { destination_pointer: Relative(6), source: Relative(8) }, Mov { destination: Relative(1), source: Relative(7) }, Return, Call { location: 67 }, Load { destination: Relative(5), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32838) }, Const { destination: Relative(7), bit_size: Integer(U1), value: 1 }, JumpIf { condition: Relative(6), location: 174 }, Call { location: 202 }, Load { destination: Relative(6), source_pointer: Relative(1) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(8), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Relative(7) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 9 }, Call { location: 205 }, 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(8) }, Store { destination_pointer: Relative(10), source: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32837) }, Mov { destination: Direct(32771), source: Relative(7) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 9 }, Call { location: 205 }, 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(3) }, Store { destination_pointer: Relative(9), source: Relative(4) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(5), rhs: Direct(32837) }, BinaryIntOp { destination: Relative(4), op: LessThanEquals, bit_size: U32, lhs: Relative(5), rhs: Relative(3) }, JumpIf { condition: Relative(4), location: 196 }, Call { location: 199 }, 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: 5019202896831570965 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 5727012404371710682 }, 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]" + "[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(1), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 0 }, CalldataCopy { destination_address: Direct(32842), size_address: Relative(1), offset_address: Relative(2) }, Call { location: 11 }, 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: Integer(U1), value: 0 }, Const { destination: Direct(32836), bit_size: Integer(U32), value: 0 }, Const { destination: Direct(32837), bit_size: Field, value: 0 }, Const { destination: Direct(32838), bit_size: Integer(U1), value: 1 }, 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: 4 }, Return, Call { location: 107 }, Const { destination: Relative(7), bit_size: Integer(U32), value: 8 }, Mov { destination: Relative(8), source: Direct(0) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 113 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(1), source: Relative(9) }, Mov { destination: Relative(2), source: Relative(10) }, Mov { destination: Relative(3), source: Relative(11) }, Mov { destination: Relative(4), source: Relative(12) }, Mov { destination: Relative(5), source: Relative(13) }, Mov { destination: Relative(6), source: Relative(14) }, 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) }, 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) }, 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) }, 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) }, 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: 8 }, Mov { destination: Relative(8), source: Direct(0) }, Mov { destination: Relative(9), source: Relative(7) }, Mov { destination: Relative(10), source: Relative(1) }, Mov { destination: Relative(11), source: Relative(2) }, Mov { destination: Relative(12), source: Relative(3) }, Mov { destination: Relative(13), source: Relative(4) }, Mov { destination: Relative(14), source: Relative(5) }, Mov { destination: Relative(15), source: Direct(32841) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(6) }, Call { location: 155 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(6), source_pointer: Relative(3) }, 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: 68 }, Call { location: 186 }, 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(8), bit_size: Integer(U32), value: 8 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(6), rhs: Relative(8) }, Load { destination: Relative(10), source_pointer: Relative(11) }, BinaryIntOp { destination: Relative(6), op: Equals, bit_size: U32, lhs: Relative(10), rhs: Direct(32841) }, JumpIf { condition: Relative(6), location: 77 }, Const { destination: Relative(11), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(11) } }, 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(1) }, Mov { destination: Relative(13), source: Relative(2) }, Mov { destination: Relative(14), source: Relative(3) }, 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(6) }, Call { location: 189 }, 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(1) }, Mov { destination: Relative(13), source: Relative(2) }, Mov { destination: Relative(14), source: Relative(3) }, 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(6) }, Call { location: 239 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(1), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(8) }, Load { destination: Relative(2), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(1), op: Equals, bit_size: U32, lhs: Relative(2), rhs: Direct(32841) }, JumpIf { condition: Relative(1), location: 106 }, 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: 112 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 107 }, Mov { destination: Relative(1), source: Direct(1) }, Const { destination: Relative(2), bit_size: Integer(U32), value: 5 }, 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(32837) }, BinaryIntOp { destination: Relative(3), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(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(32837) }, 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) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 9 }, 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(32837) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32836) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32837) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32836) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32837) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32836) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32837) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32836) }, Mov { destination: Relative(4), source: Relative(2) }, Mov { destination: Relative(2), source: Relative(1) }, Mov { destination: Relative(1), source: Direct(32837) }, Mov { destination: Relative(6), source: Direct(32839) }, Mov { destination: Relative(3), source: Direct(32836) }, Mov { destination: Relative(5), source: Direct(32836) }, Return, Call { location: 107 }, Mov { destination: Relative(8), source: Direct(32836) }, Jump { location: 158 }, BinaryIntOp { destination: Relative(9), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, JumpIf { condition: Relative(9), location: 162 }, Jump { location: 161 }, Return, 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) }, 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: 310 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(9), 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(4) }, Mov { destination: Relative(13), source: Relative(5) }, Mov { destination: Relative(14), source: Direct(32837) }, Mov { destination: Relative(15), source: Relative(9) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(10) }, Call { location: 329 }, Mov { destination: Direct(0), source: Relative(0) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(8), rhs: Direct(32839) }, Mov { destination: Relative(8), source: Relative(9) }, Jump { location: 158 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 12049594436772143978 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return, Call { location: 107 }, Mov { destination: Relative(8), source: Direct(1) }, Const { destination: Relative(9), bit_size: Integer(U32), value: 6 }, 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(32837) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, 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(32837) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, 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(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: Relative(8) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 5 }, Mov { destination: Relative(7), source: Direct(32836) }, Jump { location: 211 }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Relative(7), rhs: Relative(8) }, JumpIf { condition: Relative(10), location: 226 }, Jump { location: 214 }, Load { destination: Relative(7), source_pointer: Relative(2) }, Load { destination: Relative(8), source_pointer: Relative(3) }, Load { destination: Relative(9), source_pointer: Relative(4) }, Load { destination: Relative(10), source_pointer: Relative(5) }, Load { destination: Relative(11), source_pointer: Relative(6) }, Store { destination_pointer: Relative(1), source: Direct(32837) }, Store { destination_pointer: Relative(2), source: Relative(7) }, Store { destination_pointer: Relative(3), source: Relative(8) }, Store { destination_pointer: Relative(4), source: Relative(9) }, Store { destination_pointer: Relative(5), source: Relative(10) }, Store { destination_pointer: Relative(6), source: Relative(11) }, Return, Cast { destination: Relative(10), source: Relative(7), bit_size: Field }, Load { destination: Relative(11), source_pointer: Relative(9) }, Mov { destination: Direct(32771), source: Relative(11) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 6 }, Call { location: 358 }, 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(7) }, Store { destination_pointer: Relative(14), source: Relative(10) }, Store { destination_pointer: Relative(9), source: Relative(12) }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32839) }, Mov { destination: Relative(7), source: Relative(10) }, Jump { location: 211 }, Call { location: 107 }, Load { destination: Relative(7), source_pointer: Relative(2) }, Load { destination: Relative(2), source_pointer: Relative(3) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Load { destination: Relative(4), source_pointer: Relative(7) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(4) }, Not { destination: Relative(9), source: Relative(9), bit_size: U1 }, JumpIf { condition: Relative(9), location: 249 }, Call { location: 186 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(4) }, Load { destination: Relative(4), 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(4) }, Not { destination: Relative(10), source: Relative(10), bit_size: U1 }, JumpIf { condition: Relative(10), location: 257 }, Call { location: 186 }, 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(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(2) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(11) }, Call { location: 380 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(4), source: Relative(13) }, Mov { destination: Relative(10), source: Relative(14) }, Const { destination: Relative(15), bit_size: Integer(U32), value: 16 }, Mov { destination: Relative(16), source: Direct(0) }, Mov { destination: Relative(17), source: Relative(3) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(15) }, Call { location: 453 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(2), source: Relative(17) }, Mov { destination: Relative(7), source: Relative(18) }, Mov { destination: Relative(11), source: Relative(19) }, Mov { destination: Relative(12), source: Relative(20) }, Mov { destination: Relative(13), source: Relative(21) }, Mov { destination: Relative(14), source: Relative(22) }, 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: 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(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(12) }, 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(13) }, 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(14) }, Const { destination: Relative(14), 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(2) }, Mov { destination: Relative(18), source: Relative(7) }, Mov { destination: Relative(19), source: Relative(11) }, Mov { destination: Relative(20), source: Relative(12) }, Mov { destination: Relative(21), source: Relative(13) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(14) }, Call { location: 498 }, Mov { destination: Direct(0), source: Relative(0) }, Return, Call { location: 107 }, Load { destination: Relative(7), source_pointer: Relative(6) }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(32839) }, BinaryIntOp { destination: Relative(9), op: LessThanEquals, bit_size: U32, lhs: Relative(7), rhs: Relative(8) }, JumpIf { condition: Relative(9), location: 316 }, Call { location: 576 }, Load { destination: Relative(9), source_pointer: Relative(1) }, Load { destination: Relative(10), source_pointer: Relative(2) }, Load { destination: Relative(11), source_pointer: Relative(3) }, Load { destination: Relative(12), source_pointer: Relative(4) }, Load { destination: Relative(13), source_pointer: Relative(5) }, Store { destination_pointer: Relative(1), source: Relative(9) }, Store { destination_pointer: Relative(2), source: Relative(10) }, Store { destination_pointer: Relative(3), source: Relative(11) }, Store { destination_pointer: Relative(4), source: Relative(12) }, Store { destination_pointer: Relative(5), source: Relative(13) }, Store { destination_pointer: Relative(6), source: Relative(8) }, Mov { destination: Relative(1), source: Relative(7) }, Return, Call { location: 107 }, Load { destination: Relative(5), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(5), rhs: Direct(32841) }, JumpIf { condition: Relative(6), location: 334 }, Call { location: 579 }, Load { destination: Relative(6), source_pointer: Relative(1) }, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U32, lhs: Relative(5), rhs: Direct(32840) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 9 }, Call { location: 358 }, 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(32839) }, Mov { destination: Direct(32771), source: Relative(8) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 9 }, Call { location: 358 }, 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(32839) }, BinaryIntOp { destination: Relative(4), op: LessThanEquals, bit_size: U32, lhs: Relative(5), rhs: Relative(3) }, JumpIf { condition: Relative(4), location: 355 }, Call { location: 576 }, Store { destination_pointer: Relative(1), source: Relative(6) }, Store { destination_pointer: Relative(2), source: Relative(3) }, 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: 362 }, Jump { location: 364 }, Mov { destination: Direct(32773), source: Direct(32771) }, Jump { location: 379 }, 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: 376 }, 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: 369 }, 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: 379 }, Return, Call { location: 107 }, Mov { destination: Relative(4), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 5 }, 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(32837) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(6), rhs: Direct(2) }, 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(32837) }, 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: 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) }, 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: 406 }, Call { location: 186 }, 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(32836) }, Jump { location: 410 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32841) }, JumpIf { condition: Relative(6), location: 416 }, Jump { location: 413 }, Load { destination: Relative(1), source_pointer: Relative(5) }, Load { destination: Relative(2), source_pointer: Relative(4) }, Return, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(6), location: 419 }, Jump { location: 450 }, 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: 425 }, Call { location: 186 }, 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: Sub, bit_size: U32, lhs: Relative(2), rhs: Relative(3) }, BinaryIntOp { destination: Relative(8), op: LessThanEquals, bit_size: U32, lhs: Relative(3), rhs: Relative(2) }, JumpIf { condition: Relative(8), location: 431 }, Call { location: 582 }, BinaryIntOp { destination: Relative(8), op: Sub, bit_size: U32, lhs: Relative(6), rhs: Direct(32839) }, BinaryIntOp { destination: Relative(9), op: LessThanEquals, bit_size: U32, lhs: Direct(32839), rhs: Relative(6) }, JumpIf { condition: Relative(9), location: 435 }, Call { location: 582 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(8), rhs: Direct(32841) }, JumpIf { condition: Relative(6), location: 438 }, Call { location: 585 }, 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(6), 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(6) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(8) }, Call { location: 588 }, Mov { destination: Direct(0), source: Relative(0) }, Jump { location: 450 }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, Mov { destination: Relative(3), source: Relative(6) }, Jump { location: 410 }, Call { location: 107 }, Mov { destination: Relative(2), 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(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(32837) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32837) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32837) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(2) }, Store { destination_pointer: Relative(4), source: Direct(32837) }, 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: 473 }, Call { location: 186 }, 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(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(3) }, Not { destination: Relative(6), source: Relative(6), bit_size: U1 }, JumpIf { condition: Relative(6), location: 481 }, Call { location: 186 }, 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(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: Direct(32841) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 608 }, Mov { destination: Direct(0), source: Relative(0) }, Mov { destination: Relative(3), source: Relative(9) }, Mov { destination: Relative(6), source: Relative(10) }, Mov { destination: Relative(5), source: Relative(2) }, Mov { destination: Relative(1), source: Relative(2) }, Mov { destination: Relative(4), source: Relative(6) }, Mov { destination: Relative(2), source: Direct(32836) }, Mov { destination: Relative(6), source: Direct(32836) }, Return, Call { location: 107 }, Load { destination: Relative(7), source_pointer: Relative(1) }, 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: 506 }, Call { location: 186 }, 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(8), bit_size: Integer(U32), value: 10 }, Mov { destination: Relative(10), source: Direct(0) }, Mov { destination: Relative(11), source: Relative(7) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(8) }, Call { location: 647 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(8), source_pointer: Relative(2) }, 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: 521 }, Call { location: 186 }, BinaryIntOp { destination: Relative(10), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Store { destination_pointer: Relative(7), source: Relative(10) }, BinaryIntOp { destination: Relative(10), op: LessThan, bit_size: U32, lhs: Direct(32841), rhs: Relative(8) }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U1, lhs: Relative(10), rhs: Direct(32835) }, JumpIf { condition: Relative(12), location: 528 }, Const { destination: Relative(13), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(13) } }, Load { destination: Relative(10), source_pointer: Relative(3) }, Load { destination: Relative(12), source_pointer: Relative(4) }, Load { destination: Relative(13), source_pointer: Relative(5) }, Load { destination: Relative(14), source_pointer: Relative(6) }, Store { destination_pointer: Relative(1), source: Relative(7) }, Store { destination_pointer: Relative(2), source: Relative(8) }, Store { destination_pointer: Relative(4), source: Relative(12) }, Store { destination_pointer: Relative(5), source: Relative(13) }, Store { destination_pointer: Relative(6), source: Relative(14) }, Load { destination: Relative(7), source_pointer: Relative(10) }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(12), op: Equals, bit_size: U32, lhs: Relative(8), rhs: Relative(7) }, Not { destination: Relative(12), source: Relative(12), bit_size: U1 }, JumpIf { condition: Relative(12), location: 543 }, Call { location: 186 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(7), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(7) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 12 }, Mov { destination: Relative(12), source: Direct(0) }, Mov { destination: Relative(13), source: Relative(10) }, BinaryIntOp { destination: Direct(0), op: Add, bit_size: U32, lhs: Direct(0), rhs: Relative(7) }, Call { location: 683 }, Mov { destination: Direct(0), source: Relative(0) }, Load { destination: Relative(7), source_pointer: Relative(4) }, 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: 558 }, Call { location: 186 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(12), rhs: Direct(2) }, Store { destination_pointer: Relative(10), source: Relative(12) }, BinaryIntOp { destination: Relative(12), op: LessThan, bit_size: U32, lhs: Direct(32841), rhs: Relative(7) }, BinaryIntOp { destination: Relative(14), op: Equals, bit_size: U1, lhs: Relative(12), rhs: Direct(32835) }, JumpIf { condition: Relative(14), location: 565 }, Const { destination: Relative(15), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(15) } }, Load { destination: Relative(12), source_pointer: Relative(1) }, Load { destination: Relative(14), source_pointer: Relative(2) }, Load { destination: Relative(15), source_pointer: Relative(5) }, Load { destination: Relative(16), source_pointer: Relative(6) }, Store { destination_pointer: Relative(1), source: Relative(12) }, Store { destination_pointer: Relative(2), source: Relative(14) }, Store { destination_pointer: Relative(3), source: Relative(10) }, Store { destination_pointer: Relative(4), source: Relative(7) }, Store { destination_pointer: Relative(5), source: Relative(15) }, Store { destination_pointer: Relative(6), source: Relative(16) }, 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: 5727012404371710682 }, 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, Call { location: 107 }, Load { destination: Relative(4), source_pointer: Relative(2) }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(4), rhs: Direct(32841) }, JumpIf { condition: Relative(5), location: 593 }, Call { location: 579 }, Load { destination: Relative(5), source_pointer: Relative(1) }, Mov { destination: Direct(32771), source: Relative(5) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 358 }, 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(32839) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, JumpIf { condition: Relative(5), location: 605 }, Call { location: 576 }, Store { destination_pointer: Relative(1), source: Relative(6) }, Store { destination_pointer: Relative(2), source: Relative(3) }, Return, Call { location: 107 }, 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) }, BinaryIntOp { destination: Relative(1), op: LessThan, bit_size: U32, lhs: Direct(32841), rhs: Relative(2) }, BinaryIntOp { destination: Relative(5), op: Equals, bit_size: U1, lhs: Relative(1), rhs: Direct(32835) }, JumpIf { condition: Relative(5), location: 617 }, Const { destination: Relative(6), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(6) } }, Mov { destination: Relative(3), source: Relative(2) }, Jump { location: 619 }, BinaryIntOp { destination: Relative(1), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Direct(32841) }, JumpIf { condition: Relative(1), location: 624 }, Jump { location: 622 }, Load { destination: Relative(1), source_pointer: Relative(4) }, Return, Load { destination: Relative(5), source_pointer: Relative(4) }, JumpIf { condition: Relative(1), location: 627 }, Call { location: 585 }, BinaryIntOp { destination: Relative(1), op: Mul, bit_size: U32, lhs: Relative(3), rhs: Direct(32840) }, Mov { destination: Direct(32771), source: Relative(5) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 9 }, Call { location: 358 }, 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(1) }, Store { destination_pointer: Relative(8), source: Direct(32837) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32839) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 9 }, Call { location: 358 }, Mov { destination: Relative(1), source: Direct(32773) }, 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(5) }, Store { destination_pointer: Relative(8), source: Direct(32836) }, Store { destination_pointer: Relative(4), source: Relative(1) }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(3), rhs: Direct(32839) }, Mov { destination: Relative(3), source: Relative(1) }, Jump { location: 619 }, Call { location: 107 }, 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(32839) }, Jump { location: 653 }, BinaryIntOp { destination: Relative(1), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32841) }, JumpIf { condition: Relative(1), location: 657 }, Jump { location: 656 }, Return, Mov { destination: Relative(1), source: Direct(32836) }, Jump { location: 659 }, BinaryIntOp { destination: Relative(4), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, JumpIf { condition: Relative(4), location: 665 }, Jump { location: 662 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32839) }, Mov { destination: Relative(2), source: Relative(1) }, Jump { location: 653 }, Load { destination: Relative(4), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(5), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32841) }, JumpIf { condition: Relative(5), location: 669 }, Call { location: 585 }, 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) }, Mov { destination: Direct(32771), source: Relative(4) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 5 }, Call { location: 358 }, 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(3), source: Relative(6) }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32839) }, Mov { destination: Relative(1), source: Relative(4) }, Jump { location: 659 }, Call { location: 107 }, 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(32839) }, Jump { location: 689 }, BinaryIntOp { destination: Relative(1), op: LessThan, bit_size: U32, lhs: Relative(2), rhs: Direct(32841) }, JumpIf { condition: Relative(1), location: 693 }, Jump { location: 692 }, Return, BinaryIntOp { destination: Relative(4), op: Mul, bit_size: U32, lhs: Relative(2), rhs: Direct(32840) }, BinaryIntOp { destination: Relative(5), op: Add, bit_size: U32, lhs: Relative(4), rhs: Direct(32839) }, Mov { destination: Relative(1), source: Direct(32836) }, Jump { location: 697 }, BinaryIntOp { destination: Relative(6), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, JumpIf { condition: Relative(6), location: 703 }, Jump { location: 700 }, BinaryIntOp { destination: Relative(1), op: Add, bit_size: U32, lhs: Relative(2), rhs: Direct(32839) }, Mov { destination: Relative(2), source: Relative(1) }, Jump { location: 689 }, Load { destination: Relative(6), source_pointer: Relative(3) }, BinaryIntOp { destination: Relative(7), op: LessThan, bit_size: U32, lhs: Relative(1), rhs: Direct(32841) }, JumpIf { condition: Relative(7), location: 707 }, Call { location: 585 }, BinaryIntOp { destination: Relative(7), op: Mul, bit_size: U32, lhs: Relative(1), rhs: Direct(32840) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(6), 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(32839) }, 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(9) }, Load { destination: Relative(7), source_pointer: Relative(11) }, Mov { destination: Direct(32771), source: Relative(6) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 9 }, Call { location: 358 }, 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(4) }, Store { destination_pointer: Relative(11), source: Relative(8) }, Mov { destination: Direct(32771), source: Relative(9) }, Const { destination: Direct(32772), bit_size: Integer(U32), value: 9 }, Call { location: 358 }, 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(5) }, Store { destination_pointer: Relative(10), source: Relative(7) }, Store { destination_pointer: Relative(3), source: Relative(6) }, BinaryIntOp { destination: Relative(6), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(32839) }, Mov { destination: Relative(1), source: Relative(6) }, Jump { location: 697 }]" ], - "debug_symbols": "ndbBbuIwEMbxd8mZQzy2x56+SlVVAUIVKQoohZVWiHdfO98MdA+gKhf+E0J+LYmb5trs++3l63OYDsfv5u392mznYRyHr8/xuOvOw3Eq716btr641Ly5TeMyIkuoRRxCiEcCEhFGoBAUguKheCgeiofioXgoHoqH4qF4KAFKgBKgBCgBSoASikIlCcmILIkt4hBCPBKQiECJUCKUCIWhMBSGwlAYCkNhKKm86UsiwkhCMiJLcos4hBCPQMlQMpQMJUPJUASKQBEoAkWgCBSBIlAEikBxbat1WtJ6bdBGLWuhubqaQmldOVzrtUEbtaxN2qwVtK6gpU6rnlevrqJUG7WsTdqsFbSupaVOS9rixdK6ShzVoXwg15LWa4M2almbtFkraF0wS9Vj9Vg9Vo/VYz0uleOk1mlJ67VBW1d+Wwe2IdmQbRAd6hLD4GwgG7wNwQaTs8nZ5GxyNllMFpPr0nPLDcXbEGyINrANVXa326ax+9Pnee77env6ccMqt7FTN/fTuXmbLuO4af5042X50Pepm5aeu7nsLT+/n/alBTwMY1+n2+ZxdPv80Mit6NGRvbsD8fdCcnchpXaF4BwnFVy5wCsE8sQqlFFWCSHchUTPhPhCIHcX6PmZfCWUvx4Tygpb8y1Y7FpQcrxC4BztW3BOj2/BvwakjQYIpTXA/UqwxBXAq9P4Uba63TD/91xwq9Y8dNux183DZdr92Hv+e7I99lxxmo+7fn+Z+yo9Hi7KyzuVE0DEH/XfQ9ksaztR3XDLPtpQGz5u9Vf5Bw==", + "debug_symbols": "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", "file_map": { "6": { "source": "use crate::{cmp::Eq, convert::From, runtime::is_unconstrained, static_assert};\n\n/// A `BoundedVec` is a growable storage similar to a `Vec` except that it\n/// is bounded with a maximum possible length. Unlike `Vec`, `BoundedVec` is not implemented\n/// via slices and thus is not subject to the same restrictions slices are (notably, nested\n/// slices - and thus nested vectors as well - are disallowed).\n///\n/// Since a BoundedVec is backed by a normal array under the hood, growing the BoundedVec by\n/// pushing an additional element is also more efficient - the length only needs to be increased\n/// by one.\n///\n/// For these reasons `BoundedVec` should generally be preferred over `Vec` when there\n/// is a reasonable maximum bound that can be placed on the vector.\n///\n/// Example:\n///\n/// ```noir\n/// let mut vector: BoundedVec = BoundedVec::new();\n/// for i in 0..5 {\n/// vector.push(i);\n/// }\n/// assert(vector.len() == 5);\n/// assert(vector.max_len() == 10);\n/// ```\npub struct BoundedVec {\n storage: [T; MaxLen],\n len: u32,\n}\n\nimpl BoundedVec {\n /// Creates a new, empty vector of length zero.\n ///\n /// Since this container is backed by an array internally, it still needs an initial value\n /// to give each element. To resolve this, each element is zeroed internally. This value\n /// is guaranteed to be inaccessible unless `get_unchecked` is used.\n ///\n /// Example:\n ///\n /// ```noir\n /// let empty_vector: BoundedVec = BoundedVec::new();\n /// assert(empty_vector.len() == 0);\n /// ```\n ///\n /// Note that whenever calling `new` the maximum length of the vector should always be specified\n /// via a type signature:\n ///\n /// ```noir\n /// fn good() -> BoundedVec {\n /// // Ok! MaxLen is specified with a type annotation\n /// let v1: BoundedVec = BoundedVec::new();\n /// let v2 = BoundedVec::new();\n ///\n /// // Ok! MaxLen is known from the type of `good`'s return value\n /// v2\n /// }\n ///\n /// fn bad() {\n /// // Error: Type annotation needed\n /// // The compiler can't infer `MaxLen` from the following code:\n /// let mut v3 = BoundedVec::new();\n /// v3.push(5);\n /// }\n /// ```\n ///\n /// This defaulting of `MaxLen` (and numeric generics in general) to zero may change in future noir versions\n /// but for now make sure to use type annotations when using bounded vectors. Otherwise, you will receive a\n /// constraint failure at runtime when the vec is pushed to.\n pub fn new() -> Self {\n let zeroed = crate::mem::zeroed();\n BoundedVec { storage: [zeroed; MaxLen], len: 0 }\n }\n\n /// Retrieves an element from the vector at the given index, starting from zero.\n ///\n /// If the given index is equal to or greater than the length of the vector, this\n /// will issue a constraint failure.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn foo(v: BoundedVec) {\n /// let first = v.get(0);\n /// let last = v.get(v.len() - 1);\n /// assert(first != last);\n /// }\n /// ```\n pub fn get(self, index: u32) -> T {\n assert(index < self.len, \"Attempted to read past end of BoundedVec\");\n self.get_unchecked(index)\n }\n\n /// Retrieves an element from the vector at the given index, starting from zero, without\n /// performing a bounds check.\n ///\n /// Since this function does not perform a bounds check on length before accessing the element,\n /// it is unsafe! Use at your own risk!\n ///\n /// Example:\n ///\n /// ```noir\n /// fn sum_of_first_three(v: BoundedVec) -> u32 {\n /// // Always ensure the length is larger than the largest\n /// // index passed to get_unchecked\n /// assert(v.len() > 2);\n /// let first = v.get_unchecked(0);\n /// let second = v.get_unchecked(1);\n /// let third = v.get_unchecked(2);\n /// first + second + third\n /// }\n /// ```\n pub fn get_unchecked(self, index: u32) -> T {\n self.storage[index]\n }\n\n /// Writes an element to the vector at the given index, starting from zero.\n ///\n /// If the given index is equal to or greater than the length of the vector, this will issue a constraint failure.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn foo(v: BoundedVec) {\n /// let first = v.get(0);\n /// assert(first != 42);\n /// v.set(0, 42);\n /// let new_first = v.get(0);\n /// assert(new_first == 42);\n /// }\n /// ```\n pub fn set(&mut self, index: u32, value: T) {\n assert(index < self.len, \"Attempted to write past end of BoundedVec\");\n self.set_unchecked(index, value)\n }\n\n /// Writes an element to the vector at the given index, starting from zero, without performing a bounds check.\n ///\n /// Since this function does not perform a bounds check on length before accessing the element, it is unsafe! Use at your own risk!\n ///\n /// Example:\n ///\n /// ```noir\n /// fn set_unchecked_example() {\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_array([1, 2]);\n ///\n /// // Here we're safely writing within the valid range of `vec`\n /// // `vec` now has the value [42, 2]\n /// vec.set_unchecked(0, 42);\n ///\n /// // We can then safely read this value back out of `vec`.\n /// // Notice that we use the checked version of `get` which would prevent reading unsafe values.\n /// assert_eq(vec.get(0), 42);\n ///\n /// // We've now written past the end of `vec`.\n /// // As this index is still within the maximum potential length of `v`,\n /// // it won't cause a constraint failure.\n /// vec.set_unchecked(2, 42);\n /// println(vec);\n ///\n /// // This will write past the end of the maximum potential length of `vec`,\n /// // it will then trigger a constraint failure.\n /// vec.set_unchecked(5, 42);\n /// println(vec);\n /// }\n /// ```\n pub fn set_unchecked(&mut self, index: u32, value: T) {\n self.storage[index] = value;\n }\n\n /// Pushes an element to the end of the vector. This increases the length\n /// of the vector by one.\n ///\n /// Panics if the new length of the vector will be greater than the max length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// v.push(1);\n /// v.push(2);\n ///\n /// // Panics with failed assertion \"push out of bounds\"\n /// v.push(3);\n /// ```\n pub fn push(&mut self, elem: T) {\n assert(self.len < MaxLen, \"push out of bounds\");\n\n self.storage[self.len] = elem;\n self.len += 1;\n }\n\n /// Returns the current length of this vector\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// assert(v.len() == 0);\n ///\n /// v.push(100);\n /// assert(v.len() == 1);\n ///\n /// v.push(200);\n /// v.push(300);\n /// v.push(400);\n /// assert(v.len() == 4);\n ///\n /// let _ = v.pop();\n /// let _ = v.pop();\n /// assert(v.len() == 2);\n /// ```\n pub fn len(self) -> u32 {\n self.len\n }\n\n /// Returns the maximum length of this vector. This is always\n /// equal to the `MaxLen` parameter this vector was initialized with.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// assert(v.max_len() == 5);\n /// v.push(10);\n /// assert(v.max_len() == 5);\n /// ```\n pub fn max_len(_self: BoundedVec) -> u32 {\n MaxLen\n }\n\n /// Returns the internal array within this vector.\n ///\n /// Since arrays in Noir are immutable, mutating the returned storage array will not mutate\n /// the storage held internally by this vector.\n ///\n /// Note that uninitialized elements may be zeroed out!\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// assert(v.storage() == [0, 0, 0, 0, 0]);\n ///\n /// v.push(57);\n /// assert(v.storage() == [57, 0, 0, 0, 0]);\n /// ```\n pub fn storage(self) -> [T; MaxLen] {\n self.storage\n }\n\n /// Pushes each element from the given array to this vector.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_array([2, 4]);\n ///\n /// assert(vec.len == 2);\n /// assert(vec.get(0) == 2);\n /// assert(vec.get(1) == 4);\n /// ```\n pub fn extend_from_array(&mut self, array: [T; Len]) {\n let new_len = self.len + array.len();\n assert(new_len <= MaxLen, \"extend_from_array out of bounds\");\n for i in 0..array.len() {\n self.storage[self.len + i] = array[i];\n }\n self.len = new_len;\n }\n\n /// Pushes each element from the given slice to this vector.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_slice(&[2, 4]);\n ///\n /// assert(vec.len == 2);\n /// assert(vec.get(0) == 2);\n /// assert(vec.get(1) == 4);\n /// ```\n pub fn extend_from_slice(&mut self, slice: [T]) {\n let new_len = self.len + slice.len();\n assert(new_len <= MaxLen, \"extend_from_slice out of bounds\");\n for i in 0..slice.len() {\n self.storage[self.len + i] = slice[i];\n }\n self.len = new_len;\n }\n\n /// Pushes each element from the other vector to this vector. The length of\n /// the other vector is left unchanged.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// ```noir\n /// let mut v1: BoundedVec = BoundedVec::new();\n /// let mut v2: BoundedVec = BoundedVec::new();\n ///\n /// v2.extend_from_array([1, 2, 3]);\n /// v1.extend_from_bounded_vec(v2);\n ///\n /// assert(v1.storage() == [1, 2, 3, 0, 0]);\n /// assert(v2.storage() == [1, 2, 3, 0, 0, 0, 0]);\n /// ```\n pub fn extend_from_bounded_vec(&mut self, vec: BoundedVec) {\n let append_len = vec.len();\n let new_len = self.len + append_len;\n assert(new_len <= MaxLen, \"extend_from_bounded_vec out of bounds\");\n\n if is_unconstrained() {\n for i in 0..append_len {\n self.storage[self.len + i] = vec.get_unchecked(i);\n }\n } else {\n let mut exceeded_len = false;\n for i in 0..Len {\n exceeded_len |= i == append_len;\n if !exceeded_len {\n self.storage[self.len + i] = vec.get_unchecked(i);\n }\n }\n }\n self.len = new_len;\n }\n\n /// Creates a new vector, populating it with values derived from an array input.\n /// The maximum length of the vector is determined based on the type signature.\n ///\n /// Example:\n ///\n /// ```noir\n /// let bounded_vec: BoundedVec = BoundedVec::from_array([1, 2, 3])\n /// ```\n pub fn from_array(array: [T; Len]) -> Self {\n static_assert(Len <= MaxLen, \"from array out of bounds\");\n let mut vec: BoundedVec = BoundedVec::new();\n vec.extend_from_array(array);\n vec\n }\n\n /// Pops the element at the end of the vector. This will decrease the length\n /// of the vector by one.\n ///\n /// Panics if the vector is empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// v.push(1);\n /// v.push(2);\n ///\n /// let two = v.pop();\n /// let one = v.pop();\n ///\n /// assert(two == 2);\n /// assert(one == 1);\n ///\n /// // error: cannot pop from an empty vector\n /// let _ = v.pop();\n /// ```\n pub fn pop(&mut self) -> T {\n assert(self.len > 0);\n self.len -= 1;\n\n let elem = self.storage[self.len];\n self.storage[self.len] = crate::mem::zeroed();\n elem\n }\n\n /// Returns true if the given predicate returns true for any element\n /// in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// v.extend_from_array([2, 4, 6]);\n ///\n /// let all_even = !v.any(|elem: u32| elem % 2 != 0);\n /// assert(all_even);\n /// ```\n pub fn any(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n if is_unconstrained() {\n for i in 0..self.len {\n ret |= predicate(self.storage[i]);\n }\n } else {\n let mut ret = false;\n let mut exceeded_len = false;\n for i in 0..MaxLen {\n exceeded_len |= i == self.len;\n if !exceeded_len {\n ret |= predicate(self.storage[i]);\n }\n }\n }\n ret\n }\n\n /// Creates a new vector of equal size by calling a closure on each element in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let result = vec.map(|value| value * 2);\n ///\n /// let expected = BoundedVec::from_array([2, 4, 6, 8]);\n /// assert_eq(result, expected);\n /// ```\n pub fn map(self, f: fn[Env](T) -> U) -> BoundedVec {\n let mut ret = BoundedVec::new();\n ret.len = self.len();\n\n if is_unconstrained() {\n for i in 0..self.len() {\n ret.storage[i] = f(self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n ret.storage[i] = f(self.get_unchecked(i));\n }\n }\n }\n\n ret\n }\n\n /// Creates a new vector of equal size by calling a closure on each element\n /// in this vector, along with its index.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let result = vec.mapi(|i, value| i + value * 2);\n ///\n /// let expected = BoundedVec::from_array([2, 5, 8, 11]);\n /// assert_eq(result, expected);\n /// ```\n pub fn mapi(self, f: fn[Env](u32, T) -> U) -> BoundedVec {\n let mut ret = BoundedVec::new();\n ret.len = self.len();\n\n if is_unconstrained() {\n for i in 0..self.len() {\n ret.storage[i] = f(i, self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n ret.storage[i] = f(i, self.get_unchecked(i));\n }\n }\n }\n\n ret\n }\n\n /// Calls a closure on each element in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let mut result = BoundedVec::::new();\n /// vec.for_each(|value| result.push(value * 2));\n ///\n /// let expected = BoundedVec::from_array([2, 4, 6, 8]);\n /// assert_eq(result, expected);\n /// ```\n pub fn for_each(self, f: fn[Env](T) -> ()) {\n if is_unconstrained() {\n for i in 0..self.len() {\n f(self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n f(self.get_unchecked(i));\n }\n }\n }\n }\n\n /// Calls a closure on each element in this vector, along with its index.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let mut result = BoundedVec::::new();\n /// vec.for_eachi(|i, value| result.push(i + value * 2));\n ///\n /// let expected = BoundedVec::from_array([2, 5, 8, 11]);\n /// assert_eq(result, expected);\n /// ```\n pub fn for_eachi(self, f: fn[Env](u32, T) -> ()) {\n if is_unconstrained() {\n for i in 0..self.len() {\n f(i, self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n f(i, self.get_unchecked(i));\n }\n }\n }\n }\n\n /// Creates a new BoundedVec from the given array and length.\n /// The given length must be less than or equal to the length of the array.\n ///\n /// This function will zero out any elements at or past index `len` of `array`.\n /// This incurs an extra runtime cost of O(MaxLen). If you are sure your array is\n /// zeroed after that index, you can use `from_parts_unchecked` to remove the extra loop.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_parts([1, 2, 3, 0], 3);\n /// assert_eq(vec.len(), 3);\n /// ```\n pub fn from_parts(mut array: [T; MaxLen], len: u32) -> Self {\n assert(len <= MaxLen);\n let zeroed = crate::mem::zeroed();\n\n if is_unconstrained() {\n for i in len..MaxLen {\n array[i] = zeroed;\n }\n } else {\n for i in 0..MaxLen {\n if i >= len {\n array[i] = zeroed;\n }\n }\n }\n\n BoundedVec { storage: array, len }\n }\n\n /// Creates a new BoundedVec from the given array and length.\n /// The given length must be less than or equal to the length of the array.\n ///\n /// This function is unsafe because it expects all elements past the `len` index\n /// of `array` to be zeroed, but does not check for this internally. Use `from_parts`\n /// for a safe version of this function which does zero out any indices past the\n /// given length. Invalidating this assumption can notably cause `BoundedVec::eq`\n /// to give incorrect results since it will check even elements past `len`.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 0], 3);\n /// assert_eq(vec.len(), 3);\n ///\n /// // invalid use!\n /// let vec1: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 1], 3);\n /// let vec2: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 2], 3);\n ///\n /// // both vecs have length 3 so we'd expect them to be equal, but this\n /// // fails because elements past the length are still checked in eq\n /// assert_eq(vec1, vec2); // fails\n /// ```\n pub fn from_parts_unchecked(array: [T; MaxLen], len: u32) -> Self {\n assert(len <= MaxLen);\n BoundedVec { storage: array, len }\n }\n}\n\nimpl Eq for BoundedVec\nwhere\n T: Eq,\n{\n fn eq(self, other: BoundedVec) -> bool {\n // TODO: https://github.com/noir-lang/noir/issues/4837\n //\n // We make the assumption that the user has used the proper interface for working with `BoundedVec`s\n // rather than directly manipulating the internal fields as this can result in an inconsistent internal state.\n if self.len == other.len {\n self.storage == other.storage\n } else {\n false\n }\n }\n}\n\nimpl From<[T; Len]> for BoundedVec {\n fn from(array: [T; Len]) -> BoundedVec {\n BoundedVec::from_array(array)\n }\n}\n\nmod bounded_vec_tests {\n\n mod get {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test(should_fail_with = \"Attempted to read past end of BoundedVec\")]\n fn panics_when_reading_elements_past_end_of_vec() {\n let vec: BoundedVec = BoundedVec::new();\n\n crate::println(vec.get(0));\n }\n }\n\n mod set {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn set_updates_values_properly() {\n let mut vec = BoundedVec::from_array([0, 0, 0, 0, 0]);\n\n vec.set(0, 42);\n assert_eq(vec.storage, [42, 0, 0, 0, 0]);\n\n vec.set(1, 43);\n assert_eq(vec.storage, [42, 43, 0, 0, 0]);\n\n vec.set(2, 44);\n assert_eq(vec.storage, [42, 43, 44, 0, 0]);\n\n vec.set(1, 10);\n assert_eq(vec.storage, [42, 10, 44, 0, 0]);\n\n vec.set(0, 0);\n assert_eq(vec.storage, [0, 10, 44, 0, 0]);\n }\n\n #[test(should_fail_with = \"Attempted to write past end of BoundedVec\")]\n fn panics_when_writing_elements_past_end_of_vec() {\n let mut vec: BoundedVec = BoundedVec::new();\n vec.set(0, 42);\n\n // Need to use println to avoid DIE removing the write operation.\n crate::println(vec.get(0));\n }\n }\n\n mod map {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn applies_function_correctly() {\n // docs:start:bounded-vec-map-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.map(|value| value * 2);\n // docs:end:bounded-vec-map-example\n let expected = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.map(|value| (value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = vec.map(|value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod mapi {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn applies_function_correctly() {\n // docs:start:bounded-vec-mapi-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.mapi(|i, value| i + value * 2);\n // docs:end:bounded-vec-mapi-example\n let expected = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.mapi(|i, value| (i + value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = vec.mapi(|_, value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod for_each {\n use crate::collections::bounded_vec::BoundedVec;\n\n // map in terms of for_each\n fn for_each_map(\n input: BoundedVec,\n f: fn[Env](T) -> U,\n ) -> BoundedVec {\n let mut output = BoundedVec::::new();\n let output_ref = &mut output;\n input.for_each(|x| output_ref.push(f(x)));\n output\n }\n\n #[test]\n fn smoke_test() {\n let mut acc = 0;\n let acc_ref = &mut acc;\n // docs:start:bounded-vec-for-each-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3]);\n vec.for_each(|value| { *acc_ref += value; });\n // docs:end:bounded-vec-for-each-example\n assert_eq(acc, 6);\n }\n\n #[test]\n fn applies_function_correctly() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_each_map(vec, |value| value * 2);\n let expected = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_each_map(vec, |value| (value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = for_each_map(vec, |value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod for_eachi {\n use crate::collections::bounded_vec::BoundedVec;\n\n // mapi in terms of for_eachi\n fn for_eachi_mapi(\n input: BoundedVec,\n f: fn[Env](u32, T) -> U,\n ) -> BoundedVec {\n let mut output = BoundedVec::::new();\n let output_ref = &mut output;\n input.for_eachi(|i, x| output_ref.push(f(i, x)));\n output\n }\n\n #[test]\n fn smoke_test() {\n let mut acc = 0;\n let acc_ref = &mut acc;\n // docs:start:bounded-vec-for-eachi-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3]);\n vec.for_eachi(|i, value| { *acc_ref += i * value; });\n // docs:end:bounded-vec-for-eachi-example\n\n // 0 * 1 + 1 * 2 + 2 * 3\n assert_eq(acc, 8);\n }\n\n #[test]\n fn applies_function_correctly() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_eachi_mapi(vec, |i, value| i + value * 2);\n let expected = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_eachi_mapi(vec, |i, value| (i + value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = for_eachi_mapi(vec, |_, value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod from_array {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn empty() {\n let empty_array: [Field; 0] = [];\n let bounded_vec = BoundedVec::from_array([]);\n\n assert_eq(bounded_vec.max_len(), 0);\n assert_eq(bounded_vec.len(), 0);\n assert_eq(bounded_vec.storage(), empty_array);\n }\n\n #[test]\n fn equal_len() {\n let array = [1, 2, 3];\n let bounded_vec = BoundedVec::from_array(array);\n\n assert_eq(bounded_vec.max_len(), 3);\n assert_eq(bounded_vec.len(), 3);\n assert_eq(bounded_vec.storage(), array);\n }\n\n #[test]\n fn max_len_greater_then_array_len() {\n let array = [1, 2, 3];\n let bounded_vec: BoundedVec = BoundedVec::from_array(array);\n\n assert_eq(bounded_vec.max_len(), 10);\n assert_eq(bounded_vec.len(), 3);\n assert_eq(bounded_vec.get(0), 1);\n assert_eq(bounded_vec.get(1), 2);\n assert_eq(bounded_vec.get(2), 3);\n }\n\n #[test(should_fail_with = \"from array out of bounds\")]\n fn max_len_lower_then_array_len() {\n let _: BoundedVec = BoundedVec::from_array([0; 3]);\n }\n }\n\n mod trait_from {\n use crate::collections::bounded_vec::BoundedVec;\n use crate::convert::From;\n\n #[test]\n fn simple() {\n let array = [1, 2];\n let bounded_vec: BoundedVec = BoundedVec::from(array);\n\n assert_eq(bounded_vec.max_len(), 10);\n assert_eq(bounded_vec.len(), 2);\n assert_eq(bounded_vec.get(0), 1);\n assert_eq(bounded_vec.get(1), 2);\n }\n }\n\n mod trait_eq {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn empty_equality() {\n let mut bounded_vec1: BoundedVec = BoundedVec::new();\n let mut bounded_vec2: BoundedVec = BoundedVec::new();\n\n assert_eq(bounded_vec1, bounded_vec2);\n }\n\n #[test]\n fn inequality() {\n let mut bounded_vec1: BoundedVec = BoundedVec::new();\n let mut bounded_vec2: BoundedVec = BoundedVec::new();\n bounded_vec1.push(1);\n bounded_vec2.push(2);\n\n assert(bounded_vec1 != bounded_vec2);\n }\n }\n\n mod from_parts {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn from_parts() {\n // docs:start:from-parts\n let vec: BoundedVec = BoundedVec::from_parts([1, 2, 3, 0], 3);\n assert_eq(vec.len(), 3);\n\n // Any elements past the given length are zeroed out, so these\n // two BoundedVecs will be completely equal\n let vec1: BoundedVec = BoundedVec::from_parts([1, 2, 3, 1], 3);\n let vec2: BoundedVec = BoundedVec::from_parts([1, 2, 3, 2], 3);\n assert_eq(vec1, vec2);\n // docs:end:from-parts\n }\n\n #[test]\n fn from_parts_unchecked() {\n // docs:start:from-parts-unchecked\n let vec: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 0], 3);\n assert_eq(vec.len(), 3);\n\n // invalid use!\n let vec1: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 1], 3);\n let vec2: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 2], 3);\n\n // both vecs have length 3 so we'd expect them to be equal, but this\n // fails because elements past the length are still checked in eq\n assert(vec1 != vec2);\n // docs:end:from-parts-unchecked\n }\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_7612/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_7612/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index a2c9b87598b..8a754765ba1 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_7612/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_7612/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -71,9 +71,9 @@ expression: artifact "return value indices : []", "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 }]), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(2))], q_c: 0 })], outputs: []", "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(3), bit_size: Integer(U32), value: 3 }, 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(32837), source: Direct(32837), bit_size: Integer(U32) }, Cast { destination: Direct(32838), source: Direct(32838), bit_size: Integer(U1) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32836 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, 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) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 1 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(12) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 43 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Mov { destination: Relative(1), source: Relative(3) }, Mov { destination: Relative(2), source: Direct(32838) }, Call { location: 54 }, Call { location: 55 }, 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) } }, 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: 53 }, 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: 46 }, Return, Return, Call { location: 71 }, Not { destination: Relative(3), source: Relative(2), bit_size: U1 }, Cast { destination: Relative(2), source: Relative(3), bit_size: Integer(U32) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(2), rhs: Relative(3) }, JumpIf { condition: Relative(4), location: 70 }, Jump { location: 62 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Sub, bit_size: U32, lhs: Relative(2), rhs: Relative(1) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, JumpIf { condition: Relative(5), location: 67 }, Call { location: 77 }, BinaryIntOp { destination: Relative(1), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, JumpIf { condition: Relative(1), location: 70 }, Call { location: 80 }, 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: 76 }, 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: 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]" + "[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(3), bit_size: Integer(U32), value: 3 }, 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(32837), source: Direct(32837), bit_size: Integer(U32) }, Cast { destination: Direct(32838), source: Direct(32838), bit_size: Integer(U1) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32836 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, 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) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 1 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(12) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 43 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Mov { destination: Relative(1), source: Relative(3) }, Mov { destination: Relative(2), source: Direct(32838) }, Call { location: 54 }, Call { location: 55 }, 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) } }, 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: 53 }, 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: 46 }, Return, Return, Call { location: 81 }, Not { destination: Relative(3), source: Relative(2), bit_size: U1 }, Cast { destination: Relative(2), source: Relative(3), bit_size: Integer(U32) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(2), rhs: Relative(3) }, JumpIf { condition: Relative(4), location: 80 }, Jump { location: 62 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Sub, bit_size: U32, lhs: Relative(2), rhs: Relative(4) }, BinaryIntOp { destination: Relative(6), op: LessThanEquals, bit_size: U32, lhs: Relative(4), rhs: Relative(2) }, JumpIf { condition: Relative(6), location: 67 }, Call { location: 87 }, BinaryIntOp { destination: Relative(2), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(3) }, JumpIf { condition: Relative(2), location: 70 }, Call { location: 90 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(2), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Relative(1) }, Const { destination: Relative(1), bit_size: Integer(U1), value: 1 }, JumpIf { condition: Relative(2), location: 79 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(3) } }, Jump { location: 80 }, 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: 86 }, 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: 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": "jZFBjoQgEEXvUmsWgo00XsUYg4odEoKGhkkmhrtPITrdvZhkNjw+xf9Uih1mPcbHYNyyPqHtdhi9sdY8BrtOKpjV4ekOVV74HVpKgMsDDYOWIeqCWwEvaApEwb0AfSwlAlfyELzWOfjtKWxgU167AK2L1hL4UjYel56bcgeD8litCGg3IzFwMVbnXSIvd/W3lXJ5mmkjf+38/35Zn35WsQ9/j0pNxn8ML+Ukb9Ro9SmX6Ka3avjerso1/M2vk56j1znp9QM46+5WE173BCiedIIS0WRBsxBEyD7lNn4A", + "debug_symbols": "pZLfioUgEIffZa69yMrSXiUirOwgiIWnFpbo3Xds6vy5WFj23Pg5jt+PAd1gMN16a60fpztU9QZdsM7ZW+umXi928ni6QRIXIaHiDIQ6UKRQpYiMkBMEoSCUBElQB0rMyhCckBIwJUfkBEEoCCUBU/J9Z3AN1i7BmDjXy6Q4/6yD8QtUfnWOwZd263HpPmt/cNEBuwkD4wckBo7Wmbjb2dNOfle5UKfMC/XQxd99lZ1+mqT/8WX58LPPfC7e/AYr3dvw9vZ7TApWd86c5bj6/qW7fM9X5/o7c5h6M6zBxKTnB8JHrvOMiaxhwPGklpzJIhY8FiWTqtnjGD8=", "file_map": { "50": { "source": "pub struct Data {\n fields: [Field; 1],\n counter: u32,\n}\n\nfn main(array: call_data(0) [Data; 1], x: bool) {\n let index = if x { 0 } else { 1 };\n if index != 0 {\n assert(array[index - 1].counter < 3);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_7612/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_7612/execute__tests__force_brillig_true_inliner_0.snap index a2c9b87598b..8a754765ba1 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_7612/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_7612/execute__tests__force_brillig_true_inliner_0.snap @@ -71,9 +71,9 @@ expression: artifact "return value indices : []", "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 }]), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(2))], q_c: 0 })], outputs: []", "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(3), bit_size: Integer(U32), value: 3 }, 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(32837), source: Direct(32837), bit_size: Integer(U32) }, Cast { destination: Direct(32838), source: Direct(32838), bit_size: Integer(U1) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32836 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, 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) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 1 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(12) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 43 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Mov { destination: Relative(1), source: Relative(3) }, Mov { destination: Relative(2), source: Direct(32838) }, Call { location: 54 }, Call { location: 55 }, 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) } }, 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: 53 }, 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: 46 }, Return, Return, Call { location: 71 }, Not { destination: Relative(3), source: Relative(2), bit_size: U1 }, Cast { destination: Relative(2), source: Relative(3), bit_size: Integer(U32) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(2), rhs: Relative(3) }, JumpIf { condition: Relative(4), location: 70 }, Jump { location: 62 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Sub, bit_size: U32, lhs: Relative(2), rhs: Relative(1) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, JumpIf { condition: Relative(5), location: 67 }, Call { location: 77 }, BinaryIntOp { destination: Relative(1), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, JumpIf { condition: Relative(1), location: 70 }, Call { location: 80 }, 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: 76 }, 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: 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]" + "[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(3), bit_size: Integer(U32), value: 3 }, 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(32837), source: Direct(32837), bit_size: Integer(U32) }, Cast { destination: Direct(32838), source: Direct(32838), bit_size: Integer(U1) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32836 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, 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) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 1 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(12) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 43 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Mov { destination: Relative(1), source: Relative(3) }, Mov { destination: Relative(2), source: Direct(32838) }, Call { location: 54 }, Call { location: 55 }, 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) } }, 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: 53 }, 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: 46 }, Return, Return, Call { location: 81 }, Not { destination: Relative(3), source: Relative(2), bit_size: U1 }, Cast { destination: Relative(2), source: Relative(3), bit_size: Integer(U32) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(2), rhs: Relative(3) }, JumpIf { condition: Relative(4), location: 80 }, Jump { location: 62 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Sub, bit_size: U32, lhs: Relative(2), rhs: Relative(4) }, BinaryIntOp { destination: Relative(6), op: LessThanEquals, bit_size: U32, lhs: Relative(4), rhs: Relative(2) }, JumpIf { condition: Relative(6), location: 67 }, Call { location: 87 }, BinaryIntOp { destination: Relative(2), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(3) }, JumpIf { condition: Relative(2), location: 70 }, Call { location: 90 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(2), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Relative(1) }, Const { destination: Relative(1), bit_size: Integer(U1), value: 1 }, JumpIf { condition: Relative(2), location: 79 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(3) } }, Jump { location: 80 }, 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: 86 }, 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: 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": "jZFBjoQgEEXvUmsWgo00XsUYg4odEoKGhkkmhrtPITrdvZhkNjw+xf9Uih1mPcbHYNyyPqHtdhi9sdY8BrtOKpjV4ekOVV74HVpKgMsDDYOWIeqCWwEvaApEwb0AfSwlAlfyELzWOfjtKWxgU167AK2L1hL4UjYel56bcgeD8litCGg3IzFwMVbnXSIvd/W3lXJ5mmkjf+38/35Zn35WsQ9/j0pNxn8ML+Ukb9Ro9SmX6Ka3avjerso1/M2vk56j1znp9QM46+5WE173BCiedIIS0WRBsxBEyD7lNn4A", + "debug_symbols": "pZLfioUgEIffZa69yMrSXiUirOwgiIWnFpbo3Xds6vy5WFj23Pg5jt+PAd1gMN16a60fpztU9QZdsM7ZW+umXi928ni6QRIXIaHiDIQ6UKRQpYiMkBMEoSCUBElQB0rMyhCckBIwJUfkBEEoCCUBU/J9Z3AN1i7BmDjXy6Q4/6yD8QtUfnWOwZd263HpPmt/cNEBuwkD4wckBo7Wmbjb2dNOfle5UKfMC/XQxd99lZ1+mqT/8WX58LPPfC7e/AYr3dvw9vZ7TApWd86c5bj6/qW7fM9X5/o7c5h6M6zBxKTnB8JHrvOMiaxhwPGklpzJIhY8FiWTqtnjGD8=", "file_map": { "50": { "source": "pub struct Data {\n fields: [Field; 1],\n counter: u32,\n}\n\nfn main(array: call_data(0) [Data; 1], x: bool) {\n let index = if x { 0 } else { 1 };\n if index != 0 {\n assert(array[index - 1].counter < 3);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_7612/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_7612/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index a2c9b87598b..8a754765ba1 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_7612/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_7612/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -71,9 +71,9 @@ expression: artifact "return value indices : []", "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 }]), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(2))], q_c: 0 })], outputs: []", "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(3), bit_size: Integer(U32), value: 3 }, 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(32837), source: Direct(32837), bit_size: Integer(U32) }, Cast { destination: Direct(32838), source: Direct(32838), bit_size: Integer(U1) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32836 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, 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) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 1 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(12) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 43 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Mov { destination: Relative(1), source: Relative(3) }, Mov { destination: Relative(2), source: Direct(32838) }, Call { location: 54 }, Call { location: 55 }, 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) } }, 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: 53 }, 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: 46 }, Return, Return, Call { location: 71 }, Not { destination: Relative(3), source: Relative(2), bit_size: U1 }, Cast { destination: Relative(2), source: Relative(3), bit_size: Integer(U32) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(2), rhs: Relative(3) }, JumpIf { condition: Relative(4), location: 70 }, Jump { location: 62 }, Const { destination: Relative(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(4), op: Sub, bit_size: U32, lhs: Relative(2), rhs: Relative(1) }, BinaryIntOp { destination: Relative(5), op: LessThanEquals, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, JumpIf { condition: Relative(5), location: 67 }, Call { location: 77 }, BinaryIntOp { destination: Relative(1), op: Equals, bit_size: U32, lhs: Relative(4), rhs: Relative(3) }, JumpIf { condition: Relative(1), location: 70 }, Call { location: 80 }, 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: 76 }, 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: 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]" + "[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(3), bit_size: Integer(U32), value: 3 }, 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(32837), source: Direct(32837), bit_size: Integer(U32) }, Cast { destination: Direct(32838), source: Direct(32838), bit_size: Integer(U1) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 32836 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 2 }, Mov { destination: Relative(3), source: Direct(1) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, 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) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 0 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Const { destination: Relative(11), bit_size: Integer(U32), value: 1 }, Mov { destination: Relative(10), source: Direct(1) }, Const { destination: Relative(12), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Direct(1), op: Add, bit_size: U32, lhs: Direct(1), rhs: Relative(12) }, IndirectConst { destination_pointer: Relative(10), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(12), op: Add, bit_size: U32, lhs: Relative(10), rhs: Direct(2) }, Mov { destination: Direct(32771), source: Relative(9) }, Mov { destination: Direct(32772), source: Relative(12) }, Mov { destination: Direct(32773), source: Relative(11) }, Call { location: 43 }, BinaryIntOp { destination: Relative(11), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(11), source: Relative(10) }, Const { destination: Relative(7), bit_size: Integer(U32), value: 1 }, Const { destination: Relative(8), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(7) }, Load { destination: Relative(6), source_pointer: Relative(9) }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(5), rhs: Relative(8) }, Store { destination_pointer: Relative(9), source: Relative(6) }, Mov { destination: Relative(1), source: Relative(3) }, Mov { destination: Relative(2), source: Direct(32838) }, Call { location: 54 }, Call { location: 55 }, 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) } }, 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: 53 }, 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: 46 }, Return, Return, Call { location: 81 }, Not { destination: Relative(3), source: Relative(2), bit_size: U1 }, Cast { destination: Relative(2), source: Relative(3), bit_size: Integer(U32) }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, BinaryIntOp { destination: Relative(4), op: Equals, bit_size: U32, lhs: Relative(2), rhs: Relative(3) }, JumpIf { condition: Relative(4), location: 80 }, Jump { location: 62 }, Const { destination: Relative(4), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(5), op: Sub, bit_size: U32, lhs: Relative(2), rhs: Relative(4) }, BinaryIntOp { destination: Relative(6), op: LessThanEquals, bit_size: U32, lhs: Relative(4), rhs: Relative(2) }, JumpIf { condition: Relative(6), location: 67 }, Call { location: 87 }, BinaryIntOp { destination: Relative(2), op: Equals, bit_size: U32, lhs: Relative(5), rhs: Relative(3) }, JumpIf { condition: Relative(2), location: 70 }, Call { location: 90 }, Const { destination: Relative(2), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(4), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(2) }, Load { destination: Relative(3), source_pointer: Relative(4) }, Const { destination: Relative(1), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(2), op: LessThan, bit_size: U32, lhs: Relative(3), rhs: Relative(1) }, Const { destination: Relative(1), bit_size: Integer(U1), value: 1 }, JumpIf { condition: Relative(2), location: 79 }, Const { destination: Relative(3), bit_size: Integer(U32), value: 0 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Relative(3) } }, Jump { location: 80 }, 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: 86 }, 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: 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": "jZFBjoQgEEXvUmsWgo00XsUYg4odEoKGhkkmhrtPITrdvZhkNjw+xf9Uih1mPcbHYNyyPqHtdhi9sdY8BrtOKpjV4ekOVV74HVpKgMsDDYOWIeqCWwEvaApEwb0AfSwlAlfyELzWOfjtKWxgU167AK2L1hL4UjYel56bcgeD8litCGg3IzFwMVbnXSIvd/W3lXJ5mmkjf+38/35Zn35WsQ9/j0pNxn8ML+Ukb9Ro9SmX6Ka3avjerso1/M2vk56j1znp9QM46+5WE173BCiedIIS0WRBsxBEyD7lNn4A", + "debug_symbols": "pZLfioUgEIffZa69yMrSXiUirOwgiIWnFpbo3Xds6vy5WFj23Pg5jt+PAd1gMN16a60fpztU9QZdsM7ZW+umXi928ni6QRIXIaHiDIQ6UKRQpYiMkBMEoSCUBElQB0rMyhCckBIwJUfkBEEoCCUBU/J9Z3AN1i7BmDjXy6Q4/6yD8QtUfnWOwZd263HpPmt/cNEBuwkD4wckBo7Wmbjb2dNOfle5UKfMC/XQxd99lZ1+mqT/8WX58LPPfC7e/AYr3dvw9vZ7TApWd86c5bj6/qW7fM9X5/o7c5h6M6zBxKTnB8JHrvOMiaxhwPGklpzJIhY8FiWTqtnjGD8=", "file_map": { "50": { "source": "pub struct Data {\n fields: [Field; 1],\n counter: u32,\n}\n\nfn main(array: call_data(0) [Data; 1], x: bool) {\n let index = if x { 0 } else { 1 };\n if index != 0 {\n assert(array[index - 1].counter < 3);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_7744/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_7744/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 1d0bdb31a52..879e8fb5882 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_7744/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_7744/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -57,10 +57,19 @@ expression: artifact "return value indices : [_1, _2, _3]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 })], outputs: [Simple(Witness(1)), Simple(Witness(2)), Simple(Witness(3))]", "unconstrained func 0", - "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32840 }, 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) }, Cast { destination: Direct(32836), source: Direct(32836), bit_size: Integer(U1) }, Mov { destination: Relative(1), source: Direct(32836) }, Call { location: 16 }, Call { location: 17 }, Mov { destination: Direct(32837), source: Relative(1) }, Mov { destination: Direct(32838), source: Relative(2) }, Mov { destination: Direct(32839), source: Relative(3) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 32837 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, Stop { return_data: HeapVector { pointer: Relative(4), size: Relative(5) } }, Return, Call { location: 28 }, JumpIf { condition: Relative(1), location: 28 }, Jump { location: 20 }, Const { destination: Relative(4), bit_size: Field, value: 0 }, Const { destination: Relative(5), bit_size: Field, value: 5 }, Const { destination: Relative(6), bit_size: Integer(U1), value: 0 }, Mov { destination: Relative(1), source: Relative(4) }, Mov { destination: Relative(2), source: Relative(5) }, Mov { destination: Relative(3), source: Relative(6) }, Jump { location: 27 }, 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: 33 }, 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(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32840 }, 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) }, Cast { destination: Direct(32836), source: Direct(32836), bit_size: Integer(U1) }, Mov { destination: Relative(1), source: Direct(32836) }, Call { location: 16 }, Call { location: 17 }, Mov { destination: Direct(32837), source: Relative(1) }, Mov { destination: Direct(32838), source: Relative(2) }, Mov { destination: Direct(32839), source: Relative(3) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 32837 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, Stop { return_data: HeapVector { pointer: Relative(4), size: Relative(5) } }, Return, Call { location: 50 }, Const { destination: Relative(5), bit_size: Field, value: 0 }, Const { destination: Relative(6), bit_size: Field, value: 5 }, Const { destination: Relative(7), bit_size: Integer(U1), value: 0 }, JumpIf { condition: Relative(1), location: 27 }, Jump { location: 23 }, Mov { destination: Relative(2), source: Relative(5) }, Mov { destination: Relative(3), source: Relative(6) }, Mov { destination: Relative(4), source: Relative(7) }, Jump { location: 46 }, Mov { destination: Relative(1), 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(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(5), input1_y: Relative(6), input1_infinite: Relative(7), input2_x: Relative(5), input2_y: Relative(6), input2_infinite: Relative(7), result: HeapArray { pointer: Relative(8), size: 3 } }), Const { destination: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(5) }, Load { destination: Relative(6), source_pointer: Relative(7) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(8) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(5) }, Load { destination: Relative(8), source_pointer: Relative(9) }, Mov { destination: Relative(2), source: Relative(6) }, Mov { destination: Relative(3), source: Relative(7) }, Mov { destination: Relative(4), source: Relative(8) }, Jump { location: 46 }, Mov { destination: Relative(1), source: Relative(2) }, Mov { destination: Relative(2), source: Relative(3) }, Mov { destination: Relative(3), 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: 55 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "XY7BCoMwDIbfJecetnkZvoqIxBqlENISW2GI775UJsguSf58Sf7sMNFYliHIHFdoux1GDcxhGTh6zCGKdffDwSWHrETWghu3rYRKkqGVwuxgQy7n0JpQzpxRjT4ckEyW7eAcmGp19CbQB/133FADjkw/ORfxN5o/6SLXx0mjp6ko1UuVwaOGp8Xu9XZN0x/V7Qs=", - "file_map": {}, + "debug_symbols": "nZHNroMgEIXfZdYs+JFafZWmMajYkBA0VG5yY3j3gqO1LrrpZr4ZhnNmklmg1214NMYN4xPq2wKtN9aaR2PHTs1mdOl1AZoDL6HmBPgVUa0QFMEQHCGgFgkFQiIuiBJxRVQrCopILiJGAvvwZvZa59kf26QdJ+W1m6F2wVoCf8qG9dNzUm7lrHzqUgLa9YnJcDBW5yySQ02/S3lVbWIhirdcnvXsu54xTsvNIeXy8GCXXz3Kk8c9Vaoz/nSnmN28Ua3VWzkE13105/9p7+x3nvzY6T54nZ2OY7MUb5ISKe8xT3sB", + "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", + "path": "std/embedded_curve_ops.nr" + }, + "50": { + "source": "// https://github.com/noir-lang/noir/issues/7744\n\nuse std::embedded_curve_ops::{embedded_curve_add_unsafe, EmbeddedCurvePoint};\n\n// is_active = false\nfn main(is_active: bool) -> pub EmbeddedCurvePoint {\n let bad = EmbeddedCurvePoint { x: 0, y: 5, is_infinite: false };\n if is_active {\n embedded_curve_add_unsafe(bad, bad)\n } else {\n bad\n }\n}\n", + "path": "" + } + }, "names": [ "main" ], diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_7744/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_7744/execute__tests__force_brillig_true_inliner_0.snap index 1d0bdb31a52..879e8fb5882 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_7744/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_7744/execute__tests__force_brillig_true_inliner_0.snap @@ -57,10 +57,19 @@ expression: artifact "return value indices : [_1, _2, _3]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 })], outputs: [Simple(Witness(1)), Simple(Witness(2)), Simple(Witness(3))]", "unconstrained func 0", - "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32840 }, 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) }, Cast { destination: Direct(32836), source: Direct(32836), bit_size: Integer(U1) }, Mov { destination: Relative(1), source: Direct(32836) }, Call { location: 16 }, Call { location: 17 }, Mov { destination: Direct(32837), source: Relative(1) }, Mov { destination: Direct(32838), source: Relative(2) }, Mov { destination: Direct(32839), source: Relative(3) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 32837 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, Stop { return_data: HeapVector { pointer: Relative(4), size: Relative(5) } }, Return, Call { location: 28 }, JumpIf { condition: Relative(1), location: 28 }, Jump { location: 20 }, Const { destination: Relative(4), bit_size: Field, value: 0 }, Const { destination: Relative(5), bit_size: Field, value: 5 }, Const { destination: Relative(6), bit_size: Integer(U1), value: 0 }, Mov { destination: Relative(1), source: Relative(4) }, Mov { destination: Relative(2), source: Relative(5) }, Mov { destination: Relative(3), source: Relative(6) }, Jump { location: 27 }, 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: 33 }, 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(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32840 }, 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) }, Cast { destination: Direct(32836), source: Direct(32836), bit_size: Integer(U1) }, Mov { destination: Relative(1), source: Direct(32836) }, Call { location: 16 }, Call { location: 17 }, Mov { destination: Direct(32837), source: Relative(1) }, Mov { destination: Direct(32838), source: Relative(2) }, Mov { destination: Direct(32839), source: Relative(3) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 32837 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, Stop { return_data: HeapVector { pointer: Relative(4), size: Relative(5) } }, Return, Call { location: 50 }, Const { destination: Relative(5), bit_size: Field, value: 0 }, Const { destination: Relative(6), bit_size: Field, value: 5 }, Const { destination: Relative(7), bit_size: Integer(U1), value: 0 }, JumpIf { condition: Relative(1), location: 27 }, Jump { location: 23 }, Mov { destination: Relative(2), source: Relative(5) }, Mov { destination: Relative(3), source: Relative(6) }, Mov { destination: Relative(4), source: Relative(7) }, Jump { location: 46 }, Mov { destination: Relative(1), 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(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(5), input1_y: Relative(6), input1_infinite: Relative(7), input2_x: Relative(5), input2_y: Relative(6), input2_infinite: Relative(7), result: HeapArray { pointer: Relative(8), size: 3 } }), Const { destination: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(5) }, Load { destination: Relative(6), source_pointer: Relative(7) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(8) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(5) }, Load { destination: Relative(8), source_pointer: Relative(9) }, Mov { destination: Relative(2), source: Relative(6) }, Mov { destination: Relative(3), source: Relative(7) }, Mov { destination: Relative(4), source: Relative(8) }, Jump { location: 46 }, Mov { destination: Relative(1), source: Relative(2) }, Mov { destination: Relative(2), source: Relative(3) }, Mov { destination: Relative(3), 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: 55 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "XY7BCoMwDIbfJecetnkZvoqIxBqlENISW2GI775UJsguSf58Sf7sMNFYliHIHFdoux1GDcxhGTh6zCGKdffDwSWHrETWghu3rYRKkqGVwuxgQy7n0JpQzpxRjT4ckEyW7eAcmGp19CbQB/133FADjkw/ORfxN5o/6SLXx0mjp6ko1UuVwaOGp8Xu9XZN0x/V7Qs=", - "file_map": {}, + "debug_symbols": "nZHNroMgEIXfZdYs+JFafZWmMajYkBA0VG5yY3j3gqO1LrrpZr4ZhnNmklmg1214NMYN4xPq2wKtN9aaR2PHTs1mdOl1AZoDL6HmBPgVUa0QFMEQHCGgFgkFQiIuiBJxRVQrCopILiJGAvvwZvZa59kf26QdJ+W1m6F2wVoCf8qG9dNzUm7lrHzqUgLa9YnJcDBW5yySQ02/S3lVbWIhirdcnvXsu54xTsvNIeXy8GCXXz3Kk8c9Vaoz/nSnmN28Ua3VWzkE13105/9p7+x3nvzY6T54nZ2OY7MUb5ISKe8xT3sB", + "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", + "path": "std/embedded_curve_ops.nr" + }, + "50": { + "source": "// https://github.com/noir-lang/noir/issues/7744\n\nuse std::embedded_curve_ops::{embedded_curve_add_unsafe, EmbeddedCurvePoint};\n\n// is_active = false\nfn main(is_active: bool) -> pub EmbeddedCurvePoint {\n let bad = EmbeddedCurvePoint { x: 0, y: 5, is_infinite: false };\n if is_active {\n embedded_curve_add_unsafe(bad, bad)\n } else {\n bad\n }\n}\n", + "path": "" + } + }, "names": [ "main" ], diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_7744/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_7744/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 1d0bdb31a52..879e8fb5882 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_7744/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_7744/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -57,10 +57,19 @@ expression: artifact "return value indices : [_1, _2, _3]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 })], outputs: [Simple(Witness(1)), Simple(Witness(2)), Simple(Witness(3))]", "unconstrained func 0", - "[Const { destination: Direct(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32840 }, 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) }, Cast { destination: Direct(32836), source: Direct(32836), bit_size: Integer(U1) }, Mov { destination: Relative(1), source: Direct(32836) }, Call { location: 16 }, Call { location: 17 }, Mov { destination: Direct(32837), source: Relative(1) }, Mov { destination: Direct(32838), source: Relative(2) }, Mov { destination: Direct(32839), source: Relative(3) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 32837 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, Stop { return_data: HeapVector { pointer: Relative(4), size: Relative(5) } }, Return, Call { location: 28 }, JumpIf { condition: Relative(1), location: 28 }, Jump { location: 20 }, Const { destination: Relative(4), bit_size: Field, value: 0 }, Const { destination: Relative(5), bit_size: Field, value: 5 }, Const { destination: Relative(6), bit_size: Integer(U1), value: 0 }, Mov { destination: Relative(1), source: Relative(4) }, Mov { destination: Relative(2), source: Relative(5) }, Mov { destination: Relative(3), source: Relative(6) }, Jump { location: 27 }, 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: 33 }, 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(2), bit_size: Integer(U32), value: 1 }, Const { destination: Direct(1), bit_size: Integer(U32), value: 32840 }, 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) }, Cast { destination: Direct(32836), source: Direct(32836), bit_size: Integer(U1) }, Mov { destination: Relative(1), source: Direct(32836) }, Call { location: 16 }, Call { location: 17 }, Mov { destination: Direct(32837), source: Relative(1) }, Mov { destination: Direct(32838), source: Relative(2) }, Mov { destination: Direct(32839), source: Relative(3) }, Const { destination: Relative(4), bit_size: Integer(U32), value: 32837 }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, Stop { return_data: HeapVector { pointer: Relative(4), size: Relative(5) } }, Return, Call { location: 50 }, Const { destination: Relative(5), bit_size: Field, value: 0 }, Const { destination: Relative(6), bit_size: Field, value: 5 }, Const { destination: Relative(7), bit_size: Integer(U1), value: 0 }, JumpIf { condition: Relative(1), location: 27 }, Jump { location: 23 }, Mov { destination: Relative(2), source: Relative(5) }, Mov { destination: Relative(3), source: Relative(6) }, Mov { destination: Relative(4), source: Relative(7) }, Jump { location: 46 }, Mov { destination: Relative(1), 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(1), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Direct(2) }, BlackBox(EmbeddedCurveAdd { input1_x: Relative(5), input1_y: Relative(6), input1_infinite: Relative(7), input2_x: Relative(5), input2_y: Relative(6), input2_infinite: Relative(7), result: HeapArray { pointer: Relative(8), size: 3 } }), Const { destination: Relative(5), bit_size: Integer(U32), value: 1 }, BinaryIntOp { destination: Relative(7), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(5) }, Load { destination: Relative(6), source_pointer: Relative(7) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 2 }, BinaryIntOp { destination: Relative(8), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(5) }, Load { destination: Relative(7), source_pointer: Relative(8) }, Const { destination: Relative(5), bit_size: Integer(U32), value: 3 }, BinaryIntOp { destination: Relative(9), op: Add, bit_size: U32, lhs: Relative(1), rhs: Relative(5) }, Load { destination: Relative(8), source_pointer: Relative(9) }, Mov { destination: Relative(2), source: Relative(6) }, Mov { destination: Relative(3), source: Relative(7) }, Mov { destination: Relative(4), source: Relative(8) }, Jump { location: 46 }, Mov { destination: Relative(1), source: Relative(2) }, Mov { destination: Relative(2), source: Relative(3) }, Mov { destination: Relative(3), 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: 55 }, IndirectConst { destination_pointer: Direct(1), bit_size: Integer(U64), value: 17843811134343075018 }, Trap { revert_data: HeapVector { pointer: Direct(1), size: Direct(2) } }, Return]" ], - "debug_symbols": "XY7BCoMwDIbfJecetnkZvoqIxBqlENISW2GI775UJsguSf58Sf7sMNFYliHIHFdoux1GDcxhGTh6zCGKdffDwSWHrETWghu3rYRKkqGVwuxgQy7n0JpQzpxRjT4ckEyW7eAcmGp19CbQB/133FADjkw/ORfxN5o/6SLXx0mjp6ko1UuVwaOGp8Xu9XZN0x/V7Qs=", - "file_map": {}, + "debug_symbols": "nZHNroMgEIXfZdYs+JFafZWmMajYkBA0VG5yY3j3gqO1LrrpZr4ZhnNmklmg1214NMYN4xPq2wKtN9aaR2PHTs1mdOl1AZoDL6HmBPgVUa0QFMEQHCGgFgkFQiIuiBJxRVQrCopILiJGAvvwZvZa59kf26QdJ+W1m6F2wVoCf8qG9dNzUm7lrHzqUgLa9YnJcDBW5yySQ02/S3lVbWIhirdcnvXsu54xTsvNIeXy8GCXXz3Kk8c9Vaoz/nSnmN28Ua3VWzkE13105/9p7+x3nvzY6T54nZ2OY7MUb5ISKe8xT3sB", + "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", + "path": "std/embedded_curve_ops.nr" + }, + "50": { + "source": "// https://github.com/noir-lang/noir/issues/7744\n\nuse std::embedded_curve_ops::{embedded_curve_add_unsafe, EmbeddedCurvePoint};\n\n// is_active = false\nfn main(is_active: bool) -> pub EmbeddedCurvePoint {\n let bad = EmbeddedCurvePoint { x: 0, y: 5, is_infinite: false };\n if is_active {\n embedded_curve_add_unsafe(bad, bad)\n } else {\n bad\n }\n}\n", + "path": "" + } + }, "names": [ "main" ], diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/signed_div/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/signed_div/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index 919616adc2c..4f078bf6487 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/signed_div/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/signed_div/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -51,7 +51,7 @@ expression: artifact }, "bytecode": [ "func 0", - "current witness index : _139", + "current witness index : _329", "private parameters indices : [_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44]", "public parameters indices : []", "return value indices : []", @@ -250,12 +250,312 @@ expression: artifact "EXPR [ (-2, _123, _128) (256, _123) (1, _128) (-1, _138) 0 ]", "EXPR [ (-1, _137) (-1, _139) 1 ]", "EXPR [ (1, _134, _135) (-1, _14) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(16))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(140)), Simple(Witness(141))]", + "BLACKBOX::RANGE [(_140, 1)] []", + "BLACKBOX::RANGE [(_141, 7)] []", + "EXPR [ (1, _16) (-128, _140) (-1, _141) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(15))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(142)), Simple(Witness(143))]", + "BLACKBOX::RANGE [(_142, 1)] []", + "BLACKBOX::RANGE [(_143, 7)] []", + "EXPR [ (1, _15) (-128, _142) (-1, _143) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(16), Witness(140))], linear_combinations: [(1, Witness(16)), (256, Witness(140))], q_c: 0 })], outputs: [Simple(Witness(144))]", + "EXPR [ (-2, _16, _140) (1, _16) (256, _140) (-1, _145) 0 ]", + "EXPR [ (1, _144, _145) -1 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(15), Witness(142))], linear_combinations: [(1, Witness(15)), (256, Witness(142))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(145))], q_c: 0 })], outputs: [Simple(Witness(146)), Simple(Witness(147))]", + "BLACKBOX::RANGE [(_146, 8)] []", + "BLACKBOX::RANGE [(_147, 8)] []", + "EXPR [ (1, _145) (-1, _147) (-1, _148) -1 ]", + "BLACKBOX::RANGE [(_148, 8)] []", + "EXPR [ (-2, _15, _142) (-1, _145, _146) (1, _15) (256, _142) (-1, _147) 0 ]", + "EXPR [ (-1, _146) (-1, _149) 128 ]", + "EXPR [ (-2, _140, _142) (1, _140) (1, _142) (-1, _150) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(146))], q_c: 0 })], outputs: [Simple(Witness(151))]", + "EXPR [ (1, _146, _151) (1, _152) -1 ]", + "EXPR [ (1, _146, _152) 0 ]", + "EXPR [ (2, _149, _150) (1, _146) (-1, _153) 0 ]", + "EXPR [ (-1, _152) (-1, _154) 1 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(147))], q_c: 0 })], outputs: [Simple(Witness(155))]", + "EXPR [ (1, _147, _155) (1, _156) -1 ]", + "EXPR [ (1, _147, _156) 0 ]", + "EXPR [ (-2, _142, _147) (256, _142) (1, _147) (-1, _157) 0 ]", + "EXPR [ (-1, _156) (-1, _158) 1 ]", + "EXPR [ (1, _153, _154) (-1, _17) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(19))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(159)), Simple(Witness(160))]", + "BLACKBOX::RANGE [(_159, 1)] []", + "BLACKBOX::RANGE [(_160, 7)] []", + "EXPR [ (1, _19) (-128, _159) (-1, _160) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(18))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(161)), Simple(Witness(162))]", + "BLACKBOX::RANGE [(_161, 1)] []", + "BLACKBOX::RANGE [(_162, 7)] []", + "EXPR [ (1, _18) (-128, _161) (-1, _162) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(19), Witness(159))], linear_combinations: [(1, Witness(19)), (256, Witness(159))], q_c: 0 })], outputs: [Simple(Witness(163))]", + "EXPR [ (-2, _19, _159) (1, _19) (256, _159) (-1, _164) 0 ]", + "EXPR [ (1, _163, _164) -1 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(18), Witness(161))], linear_combinations: [(1, Witness(18)), (256, Witness(161))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(164))], q_c: 0 })], outputs: [Simple(Witness(165)), Simple(Witness(166))]", + "BLACKBOX::RANGE [(_165, 8)] []", + "BLACKBOX::RANGE [(_166, 8)] []", + "EXPR [ (1, _164) (-1, _166) (-1, _167) -1 ]", + "BLACKBOX::RANGE [(_167, 8)] []", + "EXPR [ (-2, _18, _161) (-1, _164, _165) (1, _18) (256, _161) (-1, _166) 0 ]", + "EXPR [ (-1, _165) (-1, _168) 128 ]", + "EXPR [ (-2, _159, _161) (1, _159) (1, _161) (-1, _169) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(165))], q_c: 0 })], outputs: [Simple(Witness(170))]", + "EXPR [ (1, _165, _170) (1, _171) -1 ]", + "EXPR [ (1, _165, _171) 0 ]", + "EXPR [ (2, _168, _169) (1, _165) (-1, _172) 0 ]", + "EXPR [ (-1, _171) (-1, _173) 1 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(166))], q_c: 0 })], outputs: [Simple(Witness(174))]", + "EXPR [ (1, _166, _174) (1, _175) -1 ]", + "EXPR [ (1, _166, _175) 0 ]", + "EXPR [ (-2, _161, _166) (256, _161) (1, _166) (-1, _176) 0 ]", + "EXPR [ (-1, _175) (-1, _177) 1 ]", + "EXPR [ (1, _172, _173) (-1, _20) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(22))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(178)), Simple(Witness(179))]", + "BLACKBOX::RANGE [(_178, 1)] []", + "BLACKBOX::RANGE [(_179, 7)] []", + "EXPR [ (1, _22) (-128, _178) (-1, _179) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(21))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(180)), Simple(Witness(181))]", + "BLACKBOX::RANGE [(_180, 1)] []", + "BLACKBOX::RANGE [(_181, 7)] []", + "EXPR [ (1, _21) (-128, _180) (-1, _181) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(22), Witness(178))], linear_combinations: [(1, Witness(22)), (256, Witness(178))], q_c: 0 })], outputs: [Simple(Witness(182))]", + "EXPR [ (-2, _22, _178) (1, _22) (256, _178) (-1, _183) 0 ]", + "EXPR [ (1, _182, _183) -1 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(21), Witness(180))], linear_combinations: [(1, Witness(21)), (256, Witness(180))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(183))], q_c: 0 })], outputs: [Simple(Witness(184)), Simple(Witness(185))]", + "BLACKBOX::RANGE [(_184, 8)] []", + "BLACKBOX::RANGE [(_185, 8)] []", + "EXPR [ (1, _183) (-1, _185) (-1, _186) -1 ]", + "BLACKBOX::RANGE [(_186, 8)] []", + "EXPR [ (-2, _21, _180) (-1, _183, _184) (1, _21) (256, _180) (-1, _185) 0 ]", + "EXPR [ (-1, _184) (-1, _187) 128 ]", + "EXPR [ (-2, _178, _180) (1, _178) (1, _180) (-1, _188) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(184))], q_c: 0 })], outputs: [Simple(Witness(189))]", + "EXPR [ (1, _184, _189) (1, _190) -1 ]", + "EXPR [ (1, _184, _190) 0 ]", + "EXPR [ (2, _187, _188) (1, _184) (-1, _191) 0 ]", + "EXPR [ (-1, _190) (-1, _192) 1 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(185))], q_c: 0 })], outputs: [Simple(Witness(193))]", + "EXPR [ (1, _185, _193) (1, _194) -1 ]", + "EXPR [ (1, _185, _194) 0 ]", + "EXPR [ (-2, _180, _185) (256, _180) (1, _185) (-1, _195) 0 ]", + "EXPR [ (-1, _194) (-1, _196) 1 ]", + "EXPR [ (1, _191, _192) (-1, _23) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(25))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(197)), Simple(Witness(198))]", + "BLACKBOX::RANGE [(_197, 1)] []", + "BLACKBOX::RANGE [(_198, 7)] []", + "EXPR [ (1, _25) (-128, _197) (-1, _198) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(24))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(199)), Simple(Witness(200))]", + "BLACKBOX::RANGE [(_199, 1)] []", + "BLACKBOX::RANGE [(_200, 7)] []", + "EXPR [ (1, _24) (-128, _199) (-1, _200) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(25), Witness(197))], linear_combinations: [(1, Witness(25)), (256, Witness(197))], q_c: 0 })], outputs: [Simple(Witness(201))]", + "EXPR [ (-2, _25, _197) (1, _25) (256, _197) (-1, _202) 0 ]", + "EXPR [ (1, _201, _202) -1 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(24), Witness(199))], linear_combinations: [(1, Witness(24)), (256, Witness(199))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(202))], q_c: 0 })], outputs: [Simple(Witness(203)), Simple(Witness(204))]", + "BLACKBOX::RANGE [(_203, 8)] []", + "BLACKBOX::RANGE [(_204, 8)] []", + "EXPR [ (1, _202) (-1, _204) (-1, _205) -1 ]", + "BLACKBOX::RANGE [(_205, 8)] []", + "EXPR [ (-2, _24, _199) (-1, _202, _203) (1, _24) (256, _199) (-1, _204) 0 ]", + "EXPR [ (-1, _203) (-1, _206) 128 ]", + "EXPR [ (-2, _197, _199) (1, _197) (1, _199) (-1, _207) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(203))], q_c: 0 })], outputs: [Simple(Witness(208))]", + "EXPR [ (1, _203, _208) (1, _209) -1 ]", + "EXPR [ (1, _203, _209) 0 ]", + "EXPR [ (2, _206, _207) (1, _203) (-1, _210) 0 ]", + "EXPR [ (-1, _209) (-1, _211) 1 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(204))], q_c: 0 })], outputs: [Simple(Witness(212))]", + "EXPR [ (1, _204, _212) (1, _213) -1 ]", + "EXPR [ (1, _204, _213) 0 ]", + "EXPR [ (-2, _199, _204) (256, _199) (1, _204) (-1, _214) 0 ]", + "EXPR [ (-1, _213) (-1, _215) 1 ]", + "EXPR [ (1, _210, _211) (-1, _26) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(28))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(216)), Simple(Witness(217))]", + "BLACKBOX::RANGE [(_216, 1)] []", + "BLACKBOX::RANGE [(_217, 7)] []", + "EXPR [ (1, _28) (-128, _216) (-1, _217) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(27))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(218)), Simple(Witness(219))]", + "BLACKBOX::RANGE [(_218, 1)] []", + "BLACKBOX::RANGE [(_219, 7)] []", + "EXPR [ (1, _27) (-128, _218) (-1, _219) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(28), Witness(216))], linear_combinations: [(1, Witness(28)), (256, Witness(216))], q_c: 0 })], outputs: [Simple(Witness(220))]", + "EXPR [ (-2, _28, _216) (1, _28) (256, _216) (-1, _221) 0 ]", + "EXPR [ (1, _220, _221) -1 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(27), Witness(218))], linear_combinations: [(1, Witness(27)), (256, Witness(218))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(221))], q_c: 0 })], outputs: [Simple(Witness(222)), Simple(Witness(223))]", + "BLACKBOX::RANGE [(_222, 8)] []", + "BLACKBOX::RANGE [(_223, 8)] []", + "EXPR [ (1, _221) (-1, _223) (-1, _224) -1 ]", + "BLACKBOX::RANGE [(_224, 8)] []", + "EXPR [ (-2, _27, _218) (-1, _221, _222) (1, _27) (256, _218) (-1, _223) 0 ]", + "EXPR [ (-1, _222) (-1, _225) 128 ]", + "EXPR [ (-2, _216, _218) (1, _216) (1, _218) (-1, _226) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(222))], q_c: 0 })], outputs: [Simple(Witness(227))]", + "EXPR [ (1, _222, _227) (1, _228) -1 ]", + "EXPR [ (1, _222, _228) 0 ]", + "EXPR [ (2, _225, _226) (1, _222) (-1, _229) 0 ]", + "EXPR [ (-1, _228) (-1, _230) 1 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(223))], q_c: 0 })], outputs: [Simple(Witness(231))]", + "EXPR [ (1, _223, _231) (1, _232) -1 ]", + "EXPR [ (1, _223, _232) 0 ]", + "EXPR [ (-2, _218, _223) (256, _218) (1, _223) (-1, _233) 0 ]", + "EXPR [ (-1, _232) (-1, _234) 1 ]", + "EXPR [ (1, _229, _230) (-1, _29) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(31))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(235)), Simple(Witness(236))]", + "BLACKBOX::RANGE [(_235, 1)] []", + "BLACKBOX::RANGE [(_236, 7)] []", + "EXPR [ (1, _31) (-128, _235) (-1, _236) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(30))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(237)), Simple(Witness(238))]", + "BLACKBOX::RANGE [(_237, 1)] []", + "BLACKBOX::RANGE [(_238, 7)] []", + "EXPR [ (1, _30) (-128, _237) (-1, _238) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(31), Witness(235))], linear_combinations: [(1, Witness(31)), (256, Witness(235))], q_c: 0 })], outputs: [Simple(Witness(239))]", + "EXPR [ (-2, _31, _235) (1, _31) (256, _235) (-1, _240) 0 ]", + "EXPR [ (1, _239, _240) -1 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(30), Witness(237))], linear_combinations: [(1, Witness(30)), (256, Witness(237))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(240))], q_c: 0 })], outputs: [Simple(Witness(241)), Simple(Witness(242))]", + "BLACKBOX::RANGE [(_241, 8)] []", + "BLACKBOX::RANGE [(_242, 8)] []", + "EXPR [ (1, _240) (-1, _242) (-1, _243) -1 ]", + "BLACKBOX::RANGE [(_243, 8)] []", + "EXPR [ (-2, _30, _237) (-1, _240, _241) (1, _30) (256, _237) (-1, _242) 0 ]", + "EXPR [ (-1, _241) (-1, _244) 128 ]", + "EXPR [ (-2, _235, _237) (1, _235) (1, _237) (-1, _245) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(241))], q_c: 0 })], outputs: [Simple(Witness(246))]", + "EXPR [ (1, _241, _246) (1, _247) -1 ]", + "EXPR [ (1, _241, _247) 0 ]", + "EXPR [ (2, _244, _245) (1, _241) (-1, _248) 0 ]", + "EXPR [ (-1, _247) (-1, _249) 1 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(242))], q_c: 0 })], outputs: [Simple(Witness(250))]", + "EXPR [ (1, _242, _250) (1, _251) -1 ]", + "EXPR [ (1, _242, _251) 0 ]", + "EXPR [ (-2, _237, _242) (256, _237) (1, _242) (-1, _252) 0 ]", + "EXPR [ (-1, _251) (-1, _253) 1 ]", + "EXPR [ (1, _248, _249) (-1, _32) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(34))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(254)), Simple(Witness(255))]", + "BLACKBOX::RANGE [(_254, 1)] []", + "BLACKBOX::RANGE [(_255, 7)] []", + "EXPR [ (1, _34) (-128, _254) (-1, _255) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(33))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(256)), Simple(Witness(257))]", + "BLACKBOX::RANGE [(_256, 1)] []", + "BLACKBOX::RANGE [(_257, 7)] []", + "EXPR [ (1, _33) (-128, _256) (-1, _257) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(34), Witness(254))], linear_combinations: [(1, Witness(34)), (256, Witness(254))], q_c: 0 })], outputs: [Simple(Witness(258))]", + "EXPR [ (-2, _34, _254) (1, _34) (256, _254) (-1, _259) 0 ]", + "EXPR [ (1, _258, _259) -1 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(33), Witness(256))], linear_combinations: [(1, Witness(33)), (256, Witness(256))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(259))], q_c: 0 })], outputs: [Simple(Witness(260)), Simple(Witness(261))]", + "BLACKBOX::RANGE [(_260, 8)] []", + "BLACKBOX::RANGE [(_261, 8)] []", + "EXPR [ (1, _259) (-1, _261) (-1, _262) -1 ]", + "BLACKBOX::RANGE [(_262, 8)] []", + "EXPR [ (-2, _33, _256) (-1, _259, _260) (1, _33) (256, _256) (-1, _261) 0 ]", + "EXPR [ (-1, _260) (-1, _263) 128 ]", + "EXPR [ (-2, _254, _256) (1, _254) (1, _256) (-1, _264) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(260))], q_c: 0 })], outputs: [Simple(Witness(265))]", + "EXPR [ (1, _260, _265) (1, _266) -1 ]", + "EXPR [ (1, _260, _266) 0 ]", + "EXPR [ (2, _263, _264) (1, _260) (-1, _267) 0 ]", + "EXPR [ (-1, _266) (-1, _268) 1 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(261))], q_c: 0 })], outputs: [Simple(Witness(269))]", + "EXPR [ (1, _261, _269) (1, _270) -1 ]", + "EXPR [ (1, _261, _270) 0 ]", + "EXPR [ (-2, _256, _261) (256, _256) (1, _261) (-1, _271) 0 ]", + "EXPR [ (-1, _270) (-1, _272) 1 ]", + "EXPR [ (1, _267, _268) (-1, _35) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(37))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(273)), Simple(Witness(274))]", + "BLACKBOX::RANGE [(_273, 1)] []", + "BLACKBOX::RANGE [(_274, 7)] []", + "EXPR [ (1, _37) (-128, _273) (-1, _274) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(36))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(275)), Simple(Witness(276))]", + "BLACKBOX::RANGE [(_275, 1)] []", + "BLACKBOX::RANGE [(_276, 7)] []", + "EXPR [ (1, _36) (-128, _275) (-1, _276) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(37), Witness(273))], linear_combinations: [(1, Witness(37)), (256, Witness(273))], q_c: 0 })], outputs: [Simple(Witness(277))]", + "EXPR [ (-2, _37, _273) (1, _37) (256, _273) (-1, _278) 0 ]", + "EXPR [ (1, _277, _278) -1 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(36), Witness(275))], linear_combinations: [(1, Witness(36)), (256, Witness(275))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(278))], q_c: 0 })], outputs: [Simple(Witness(279)), Simple(Witness(280))]", + "BLACKBOX::RANGE [(_279, 8)] []", + "BLACKBOX::RANGE [(_280, 8)] []", + "EXPR [ (1, _278) (-1, _280) (-1, _281) -1 ]", + "BLACKBOX::RANGE [(_281, 8)] []", + "EXPR [ (-2, _36, _275) (-1, _278, _279) (1, _36) (256, _275) (-1, _280) 0 ]", + "EXPR [ (-1, _279) (-1, _282) 128 ]", + "EXPR [ (-2, _273, _275) (1, _273) (1, _275) (-1, _283) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(279))], q_c: 0 })], outputs: [Simple(Witness(284))]", + "EXPR [ (1, _279, _284) (1, _285) -1 ]", + "EXPR [ (1, _279, _285) 0 ]", + "EXPR [ (2, _282, _283) (1, _279) (-1, _286) 0 ]", + "EXPR [ (-1, _285) (-1, _287) 1 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(280))], q_c: 0 })], outputs: [Simple(Witness(288))]", + "EXPR [ (1, _280, _288) (1, _289) -1 ]", + "EXPR [ (1, _280, _289) 0 ]", + "EXPR [ (-2, _275, _280) (256, _275) (1, _280) (-1, _290) 0 ]", + "EXPR [ (-1, _289) (-1, _291) 1 ]", + "EXPR [ (1, _286, _287) (-1, _38) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(40))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(292)), Simple(Witness(293))]", + "BLACKBOX::RANGE [(_292, 1)] []", + "BLACKBOX::RANGE [(_293, 7)] []", + "EXPR [ (1, _40) (-128, _292) (-1, _293) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(39))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(294)), Simple(Witness(295))]", + "BLACKBOX::RANGE [(_294, 1)] []", + "BLACKBOX::RANGE [(_295, 7)] []", + "EXPR [ (1, _39) (-128, _294) (-1, _295) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(40), Witness(292))], linear_combinations: [(1, Witness(40)), (256, Witness(292))], q_c: 0 })], outputs: [Simple(Witness(296))]", + "EXPR [ (-2, _40, _292) (1, _40) (256, _292) (-1, _297) 0 ]", + "EXPR [ (1, _296, _297) -1 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(39), Witness(294))], linear_combinations: [(1, Witness(39)), (256, Witness(294))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(297))], q_c: 0 })], outputs: [Simple(Witness(298)), Simple(Witness(299))]", + "BLACKBOX::RANGE [(_298, 8)] []", + "BLACKBOX::RANGE [(_299, 8)] []", + "EXPR [ (1, _297) (-1, _299) (-1, _300) -1 ]", + "BLACKBOX::RANGE [(_300, 8)] []", + "EXPR [ (-2, _39, _294) (-1, _297, _298) (1, _39) (256, _294) (-1, _299) 0 ]", + "EXPR [ (-1, _298) (-1, _301) 128 ]", + "EXPR [ (-2, _292, _294) (1, _292) (1, _294) (-1, _302) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(298))], q_c: 0 })], outputs: [Simple(Witness(303))]", + "EXPR [ (1, _298, _303) (1, _304) -1 ]", + "EXPR [ (1, _298, _304) 0 ]", + "EXPR [ (2, _301, _302) (1, _298) (-1, _305) 0 ]", + "EXPR [ (-1, _304) (-1, _306) 1 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(299))], q_c: 0 })], outputs: [Simple(Witness(307))]", + "EXPR [ (1, _299, _307) (1, _308) -1 ]", + "EXPR [ (1, _299, _308) 0 ]", + "EXPR [ (-2, _294, _299) (256, _294) (1, _299) (-1, _309) 0 ]", + "EXPR [ (-1, _308) (-1, _310) 1 ]", + "EXPR [ (1, _305, _306) (-1, _41) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(43))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(311)), Simple(Witness(312))]", + "BLACKBOX::RANGE [(_311, 1)] []", + "BLACKBOX::RANGE [(_312, 7)] []", + "EXPR [ (1, _43) (-128, _311) (-1, _312) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(42))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(313)), Simple(Witness(314))]", + "BLACKBOX::RANGE [(_313, 1)] []", + "BLACKBOX::RANGE [(_314, 7)] []", + "EXPR [ (1, _42) (-128, _313) (-1, _314) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(43), Witness(311))], linear_combinations: [(1, Witness(43)), (256, Witness(311))], q_c: 0 })], outputs: [Simple(Witness(315))]", + "EXPR [ (-2, _43, _311) (1, _43) (256, _311) (-1, _316) 0 ]", + "EXPR [ (1, _315, _316) -1 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(42), Witness(313))], linear_combinations: [(1, Witness(42)), (256, Witness(313))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(316))], q_c: 0 })], outputs: [Simple(Witness(317)), Simple(Witness(318))]", + "BLACKBOX::RANGE [(_317, 8)] []", + "BLACKBOX::RANGE [(_318, 8)] []", + "EXPR [ (1, _316) (-1, _318) (-1, _319) -1 ]", + "BLACKBOX::RANGE [(_319, 8)] []", + "EXPR [ (-2, _42, _313) (-1, _316, _317) (1, _42) (256, _313) (-1, _318) 0 ]", + "EXPR [ (-1, _317) (-1, _320) 128 ]", + "EXPR [ (-2, _311, _313) (1, _311) (1, _313) (-1, _321) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(317))], q_c: 0 })], outputs: [Simple(Witness(322))]", + "EXPR [ (1, _317, _322) (1, _323) -1 ]", + "EXPR [ (1, _317, _323) 0 ]", + "EXPR [ (2, _320, _321) (1, _317) (-1, _324) 0 ]", + "EXPR [ (-1, _323) (-1, _325) 1 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(318))], q_c: 0 })], outputs: [Simple(Witness(326))]", + "EXPR [ (1, _318, _326) (1, _327) -1 ]", + "EXPR [ (1, _318, _327) 0 ]", + "EXPR [ (-2, _313, _318) (256, _313) (1, _318) (-1, _328) 0 ]", + "EXPR [ (-1, _327) (-1, _329) 1 ]", + "EXPR [ (1, _324, _325) (-1, _44) 0 ]", "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) } }]", "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": "pdXBbptAFIXhd2HtBWcGZoa8SlVF2MYREsIWsSNVVt692Od3kywqVenqBpP7GeRz4Frth+3l5XmcD8fX6unHtdou4zSNL8/Tcdefx+O8fnp931SPw+fzMgzrR9Wn8+vWqV+G+Vw9zZdp2lRv/XS5/9PrqZ/v89wv69l6Uw3zfp0reBin4fbX++Zju/77qmLHspr2z3r77/tteOy35Tv7H9+fwnf2U/PYz/X/fX/OX/Z/rkf9bly+/GJV01ZPcVM1ySN7FI/uPtraQx7BI3o0HlZaK62V1kprJVlJVpKVZCVZSVaSlWQlWUlWspVsJVvJVvKqtOuwkq1kK9lKtlKsFCvFSrFSfC3FSrFSrBQrxUpnpbPSWemsdFY6K52VzkpnpbOiumaKGZiR6dtS3XKcmJlZmHjCE57whKeGiSc84QlPeAEv4AW8gBfwAl7AC3gBL+BFvIgX8SJe5H4jXsSLeBEv4jV4DV6D1+A1XB9JF1EXWRdhF2kXcRd5F4EXiReRF5kXoRepF7EXuRfBF8kX0RfZV+J+Sb+Iv8i/KIBogKiA6IAogWiBMtdHD0QRRBNEFUQXRBlEG0QdRB9EIUQjRCVEJ0QpRCtELUQvRDFEM3Srxu3J/NYvY7+dBl4ch8u8+/QeOf86Pc483jSn5bgb9pdluD3B7ufWZ9pv", + "debug_symbols": "pdfdSiNpFIXhe8mxB9lrrfrzVoZBosYmEKJEHRjEe5+Y/dZ098HA0H20O6brNYX7ofJ9bB739+/f7g6np+fXze0fH5v78+F4PHy7Oz4/7N4Oz6fLTz8+bzbry7u3835/+dHmh/cvV73szvvT2+b29H483mz+2h3fr//p9WV3us633fny7vZmsz89XuYl+HQ47r/+9Xnz/ertf19aXri4Mvx7+fD/rx+0Xj/Mv3L9998/6leuH7NeP21/7/dP00/X/3l5tXs4nH/6i20ybG59s8nYY+ox91iuY9j2qB7q4R7p0ZWhK0NXhq4MXRm7MnZl7MrYlbErY1fGroxdGbsydmXqytSVqStTV6ZLZbiMrkxdmboydWXqytyVuStzV+auzP1Z5q7MXZm7Mndl7srSlaUrS1eWrixdWbqydGXpytKVpSu13TKLKaaZfVu1HXg9MifmzKRX9Ipe0St6FSa9olf0il7REz3REz3REz3REz3REz3RMz3TMz3TM/dreqZneqZneqEXeqEXeuHzsenFqhe7Xix7se3Fuhf7Xix8sfHFyhc7Xyx9sfXF2hd7Xyx+sfnF6he7XyP3y/YX61/sfwGgEFAQKAwUCAoFNfH5cFBAKCQUFAoLBYZCQ8Gh8FCAKEQUJAoTBYpCRcGicFHAKGTUwv1io8BR6Ch4FD6ED+FD+BA+tA1zYI7MiTkz6eFD+BA+hA/hQ/gQPoQP4UP4ED6ED+FD+JD6foUP4UP4ED6ED+FD+BA+hA+Zz4cP4UP4ED6ED+FD+BA+hA/hQ/gQPoQP4UP4ED6ED+FD+NDA/eJD+BA+hA/hQ/gQPoQP4UM8HIQP4UP4ED6ED+FD+BA+hA/hQ/gQPoQP4UP4ED6ED+FD+NDM/eJD+BA+hA/hQ/gQPoQP4UM8OoQP4UP4ED6ED+PD+DA+jA/jw/gwPowP48P4MD6MD+PD+HD1/RofxofxYXwYH8aH8WF8GB/m+WF8GB/Gh/FhfBgfxofxYXwYH8aH8WF8GB/Gh/FhfBgfxofD/eLD+DA+jA/jw/gwPowP48M8P4wP48P4MD6MD+PD+DA+jA/jw/gwPowP48P4MD6MD+PD+DBfo4wP48P4MD6MD+PD+DA+jA/z/DA+jA/jw/gwPowP48P4MD6MD+PD+DA+jA/jI/gIPoKP4CN8vwo+go/gI/gIPoKP4CP4CD7C8yP4CD6Cj+Aj+Ag+go/gI/gIPoKP4CP4CD6Cj+Aj+Ag+go/w/Sr4CD6Cj+Aj+Ag+go/gI/gIz4+sJ4n1KLGeJdbDBD6Cj+Aj+Ag+go/gI/gIPoKP4CP4CD6Cj+AjfL/KuJ506OEj+Ag+go/gI/gIPsLzI/jItB6d6OEj+Ag+go/gI/gIPoKP4CPzehajh4/gI/gIPoKPXL9ffX6dEM+H3f1x/9oH86f308MP5/S3v1/Wd9aT/Mv5+WH/+H7ef50Qr+9dzoz/AA==", "file_map": { "50": { "source": "struct SignedDivOp {\n lhs: i8,\n rhs: i8,\n result: i8,\n}\n\nfn main(ops: [SignedDivOp; 15]) {\n for i in 0..15 {\n assert_eq(ops[i].lhs / ops[i].rhs, ops[i].result);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/signed_div/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/signed_div/execute__tests__force_brillig_false_inliner_0.snap index 919616adc2c..4f078bf6487 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/signed_div/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/signed_div/execute__tests__force_brillig_false_inliner_0.snap @@ -51,7 +51,7 @@ expression: artifact }, "bytecode": [ "func 0", - "current witness index : _139", + "current witness index : _329", "private parameters indices : [_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44]", "public parameters indices : []", "return value indices : []", @@ -250,12 +250,312 @@ expression: artifact "EXPR [ (-2, _123, _128) (256, _123) (1, _128) (-1, _138) 0 ]", "EXPR [ (-1, _137) (-1, _139) 1 ]", "EXPR [ (1, _134, _135) (-1, _14) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(16))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(140)), Simple(Witness(141))]", + "BLACKBOX::RANGE [(_140, 1)] []", + "BLACKBOX::RANGE [(_141, 7)] []", + "EXPR [ (1, _16) (-128, _140) (-1, _141) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(15))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(142)), Simple(Witness(143))]", + "BLACKBOX::RANGE [(_142, 1)] []", + "BLACKBOX::RANGE [(_143, 7)] []", + "EXPR [ (1, _15) (-128, _142) (-1, _143) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(16), Witness(140))], linear_combinations: [(1, Witness(16)), (256, Witness(140))], q_c: 0 })], outputs: [Simple(Witness(144))]", + "EXPR [ (-2, _16, _140) (1, _16) (256, _140) (-1, _145) 0 ]", + "EXPR [ (1, _144, _145) -1 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(15), Witness(142))], linear_combinations: [(1, Witness(15)), (256, Witness(142))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(145))], q_c: 0 })], outputs: [Simple(Witness(146)), Simple(Witness(147))]", + "BLACKBOX::RANGE [(_146, 8)] []", + "BLACKBOX::RANGE [(_147, 8)] []", + "EXPR [ (1, _145) (-1, _147) (-1, _148) -1 ]", + "BLACKBOX::RANGE [(_148, 8)] []", + "EXPR [ (-2, _15, _142) (-1, _145, _146) (1, _15) (256, _142) (-1, _147) 0 ]", + "EXPR [ (-1, _146) (-1, _149) 128 ]", + "EXPR [ (-2, _140, _142) (1, _140) (1, _142) (-1, _150) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(146))], q_c: 0 })], outputs: [Simple(Witness(151))]", + "EXPR [ (1, _146, _151) (1, _152) -1 ]", + "EXPR [ (1, _146, _152) 0 ]", + "EXPR [ (2, _149, _150) (1, _146) (-1, _153) 0 ]", + "EXPR [ (-1, _152) (-1, _154) 1 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(147))], q_c: 0 })], outputs: [Simple(Witness(155))]", + "EXPR [ (1, _147, _155) (1, _156) -1 ]", + "EXPR [ (1, _147, _156) 0 ]", + "EXPR [ (-2, _142, _147) (256, _142) (1, _147) (-1, _157) 0 ]", + "EXPR [ (-1, _156) (-1, _158) 1 ]", + "EXPR [ (1, _153, _154) (-1, _17) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(19))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(159)), Simple(Witness(160))]", + "BLACKBOX::RANGE [(_159, 1)] []", + "BLACKBOX::RANGE [(_160, 7)] []", + "EXPR [ (1, _19) (-128, _159) (-1, _160) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(18))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(161)), Simple(Witness(162))]", + "BLACKBOX::RANGE [(_161, 1)] []", + "BLACKBOX::RANGE [(_162, 7)] []", + "EXPR [ (1, _18) (-128, _161) (-1, _162) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(19), Witness(159))], linear_combinations: [(1, Witness(19)), (256, Witness(159))], q_c: 0 })], outputs: [Simple(Witness(163))]", + "EXPR [ (-2, _19, _159) (1, _19) (256, _159) (-1, _164) 0 ]", + "EXPR [ (1, _163, _164) -1 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(18), Witness(161))], linear_combinations: [(1, Witness(18)), (256, Witness(161))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(164))], q_c: 0 })], outputs: [Simple(Witness(165)), Simple(Witness(166))]", + "BLACKBOX::RANGE [(_165, 8)] []", + "BLACKBOX::RANGE [(_166, 8)] []", + "EXPR [ (1, _164) (-1, _166) (-1, _167) -1 ]", + "BLACKBOX::RANGE [(_167, 8)] []", + "EXPR [ (-2, _18, _161) (-1, _164, _165) (1, _18) (256, _161) (-1, _166) 0 ]", + "EXPR [ (-1, _165) (-1, _168) 128 ]", + "EXPR [ (-2, _159, _161) (1, _159) (1, _161) (-1, _169) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(165))], q_c: 0 })], outputs: [Simple(Witness(170))]", + "EXPR [ (1, _165, _170) (1, _171) -1 ]", + "EXPR [ (1, _165, _171) 0 ]", + "EXPR [ (2, _168, _169) (1, _165) (-1, _172) 0 ]", + "EXPR [ (-1, _171) (-1, _173) 1 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(166))], q_c: 0 })], outputs: [Simple(Witness(174))]", + "EXPR [ (1, _166, _174) (1, _175) -1 ]", + "EXPR [ (1, _166, _175) 0 ]", + "EXPR [ (-2, _161, _166) (256, _161) (1, _166) (-1, _176) 0 ]", + "EXPR [ (-1, _175) (-1, _177) 1 ]", + "EXPR [ (1, _172, _173) (-1, _20) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(22))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(178)), Simple(Witness(179))]", + "BLACKBOX::RANGE [(_178, 1)] []", + "BLACKBOX::RANGE [(_179, 7)] []", + "EXPR [ (1, _22) (-128, _178) (-1, _179) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(21))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(180)), Simple(Witness(181))]", + "BLACKBOX::RANGE [(_180, 1)] []", + "BLACKBOX::RANGE [(_181, 7)] []", + "EXPR [ (1, _21) (-128, _180) (-1, _181) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(22), Witness(178))], linear_combinations: [(1, Witness(22)), (256, Witness(178))], q_c: 0 })], outputs: [Simple(Witness(182))]", + "EXPR [ (-2, _22, _178) (1, _22) (256, _178) (-1, _183) 0 ]", + "EXPR [ (1, _182, _183) -1 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(21), Witness(180))], linear_combinations: [(1, Witness(21)), (256, Witness(180))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(183))], q_c: 0 })], outputs: [Simple(Witness(184)), Simple(Witness(185))]", + "BLACKBOX::RANGE [(_184, 8)] []", + "BLACKBOX::RANGE [(_185, 8)] []", + "EXPR [ (1, _183) (-1, _185) (-1, _186) -1 ]", + "BLACKBOX::RANGE [(_186, 8)] []", + "EXPR [ (-2, _21, _180) (-1, _183, _184) (1, _21) (256, _180) (-1, _185) 0 ]", + "EXPR [ (-1, _184) (-1, _187) 128 ]", + "EXPR [ (-2, _178, _180) (1, _178) (1, _180) (-1, _188) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(184))], q_c: 0 })], outputs: [Simple(Witness(189))]", + "EXPR [ (1, _184, _189) (1, _190) -1 ]", + "EXPR [ (1, _184, _190) 0 ]", + "EXPR [ (2, _187, _188) (1, _184) (-1, _191) 0 ]", + "EXPR [ (-1, _190) (-1, _192) 1 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(185))], q_c: 0 })], outputs: [Simple(Witness(193))]", + "EXPR [ (1, _185, _193) (1, _194) -1 ]", + "EXPR [ (1, _185, _194) 0 ]", + "EXPR [ (-2, _180, _185) (256, _180) (1, _185) (-1, _195) 0 ]", + "EXPR [ (-1, _194) (-1, _196) 1 ]", + "EXPR [ (1, _191, _192) (-1, _23) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(25))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(197)), Simple(Witness(198))]", + "BLACKBOX::RANGE [(_197, 1)] []", + "BLACKBOX::RANGE [(_198, 7)] []", + "EXPR [ (1, _25) (-128, _197) (-1, _198) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(24))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(199)), Simple(Witness(200))]", + "BLACKBOX::RANGE [(_199, 1)] []", + "BLACKBOX::RANGE [(_200, 7)] []", + "EXPR [ (1, _24) (-128, _199) (-1, _200) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(25), Witness(197))], linear_combinations: [(1, Witness(25)), (256, Witness(197))], q_c: 0 })], outputs: [Simple(Witness(201))]", + "EXPR [ (-2, _25, _197) (1, _25) (256, _197) (-1, _202) 0 ]", + "EXPR [ (1, _201, _202) -1 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(24), Witness(199))], linear_combinations: [(1, Witness(24)), (256, Witness(199))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(202))], q_c: 0 })], outputs: [Simple(Witness(203)), Simple(Witness(204))]", + "BLACKBOX::RANGE [(_203, 8)] []", + "BLACKBOX::RANGE [(_204, 8)] []", + "EXPR [ (1, _202) (-1, _204) (-1, _205) -1 ]", + "BLACKBOX::RANGE [(_205, 8)] []", + "EXPR [ (-2, _24, _199) (-1, _202, _203) (1, _24) (256, _199) (-1, _204) 0 ]", + "EXPR [ (-1, _203) (-1, _206) 128 ]", + "EXPR [ (-2, _197, _199) (1, _197) (1, _199) (-1, _207) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(203))], q_c: 0 })], outputs: [Simple(Witness(208))]", + "EXPR [ (1, _203, _208) (1, _209) -1 ]", + "EXPR [ (1, _203, _209) 0 ]", + "EXPR [ (2, _206, _207) (1, _203) (-1, _210) 0 ]", + "EXPR [ (-1, _209) (-1, _211) 1 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(204))], q_c: 0 })], outputs: [Simple(Witness(212))]", + "EXPR [ (1, _204, _212) (1, _213) -1 ]", + "EXPR [ (1, _204, _213) 0 ]", + "EXPR [ (-2, _199, _204) (256, _199) (1, _204) (-1, _214) 0 ]", + "EXPR [ (-1, _213) (-1, _215) 1 ]", + "EXPR [ (1, _210, _211) (-1, _26) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(28))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(216)), Simple(Witness(217))]", + "BLACKBOX::RANGE [(_216, 1)] []", + "BLACKBOX::RANGE [(_217, 7)] []", + "EXPR [ (1, _28) (-128, _216) (-1, _217) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(27))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(218)), Simple(Witness(219))]", + "BLACKBOX::RANGE [(_218, 1)] []", + "BLACKBOX::RANGE [(_219, 7)] []", + "EXPR [ (1, _27) (-128, _218) (-1, _219) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(28), Witness(216))], linear_combinations: [(1, Witness(28)), (256, Witness(216))], q_c: 0 })], outputs: [Simple(Witness(220))]", + "EXPR [ (-2, _28, _216) (1, _28) (256, _216) (-1, _221) 0 ]", + "EXPR [ (1, _220, _221) -1 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(27), Witness(218))], linear_combinations: [(1, Witness(27)), (256, Witness(218))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(221))], q_c: 0 })], outputs: [Simple(Witness(222)), Simple(Witness(223))]", + "BLACKBOX::RANGE [(_222, 8)] []", + "BLACKBOX::RANGE [(_223, 8)] []", + "EXPR [ (1, _221) (-1, _223) (-1, _224) -1 ]", + "BLACKBOX::RANGE [(_224, 8)] []", + "EXPR [ (-2, _27, _218) (-1, _221, _222) (1, _27) (256, _218) (-1, _223) 0 ]", + "EXPR [ (-1, _222) (-1, _225) 128 ]", + "EXPR [ (-2, _216, _218) (1, _216) (1, _218) (-1, _226) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(222))], q_c: 0 })], outputs: [Simple(Witness(227))]", + "EXPR [ (1, _222, _227) (1, _228) -1 ]", + "EXPR [ (1, _222, _228) 0 ]", + "EXPR [ (2, _225, _226) (1, _222) (-1, _229) 0 ]", + "EXPR [ (-1, _228) (-1, _230) 1 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(223))], q_c: 0 })], outputs: [Simple(Witness(231))]", + "EXPR [ (1, _223, _231) (1, _232) -1 ]", + "EXPR [ (1, _223, _232) 0 ]", + "EXPR [ (-2, _218, _223) (256, _218) (1, _223) (-1, _233) 0 ]", + "EXPR [ (-1, _232) (-1, _234) 1 ]", + "EXPR [ (1, _229, _230) (-1, _29) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(31))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(235)), Simple(Witness(236))]", + "BLACKBOX::RANGE [(_235, 1)] []", + "BLACKBOX::RANGE [(_236, 7)] []", + "EXPR [ (1, _31) (-128, _235) (-1, _236) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(30))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(237)), Simple(Witness(238))]", + "BLACKBOX::RANGE [(_237, 1)] []", + "BLACKBOX::RANGE [(_238, 7)] []", + "EXPR [ (1, _30) (-128, _237) (-1, _238) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(31), Witness(235))], linear_combinations: [(1, Witness(31)), (256, Witness(235))], q_c: 0 })], outputs: [Simple(Witness(239))]", + "EXPR [ (-2, _31, _235) (1, _31) (256, _235) (-1, _240) 0 ]", + "EXPR [ (1, _239, _240) -1 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(30), Witness(237))], linear_combinations: [(1, Witness(30)), (256, Witness(237))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(240))], q_c: 0 })], outputs: [Simple(Witness(241)), Simple(Witness(242))]", + "BLACKBOX::RANGE [(_241, 8)] []", + "BLACKBOX::RANGE [(_242, 8)] []", + "EXPR [ (1, _240) (-1, _242) (-1, _243) -1 ]", + "BLACKBOX::RANGE [(_243, 8)] []", + "EXPR [ (-2, _30, _237) (-1, _240, _241) (1, _30) (256, _237) (-1, _242) 0 ]", + "EXPR [ (-1, _241) (-1, _244) 128 ]", + "EXPR [ (-2, _235, _237) (1, _235) (1, _237) (-1, _245) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(241))], q_c: 0 })], outputs: [Simple(Witness(246))]", + "EXPR [ (1, _241, _246) (1, _247) -1 ]", + "EXPR [ (1, _241, _247) 0 ]", + "EXPR [ (2, _244, _245) (1, _241) (-1, _248) 0 ]", + "EXPR [ (-1, _247) (-1, _249) 1 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(242))], q_c: 0 })], outputs: [Simple(Witness(250))]", + "EXPR [ (1, _242, _250) (1, _251) -1 ]", + "EXPR [ (1, _242, _251) 0 ]", + "EXPR [ (-2, _237, _242) (256, _237) (1, _242) (-1, _252) 0 ]", + "EXPR [ (-1, _251) (-1, _253) 1 ]", + "EXPR [ (1, _248, _249) (-1, _32) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(34))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(254)), Simple(Witness(255))]", + "BLACKBOX::RANGE [(_254, 1)] []", + "BLACKBOX::RANGE [(_255, 7)] []", + "EXPR [ (1, _34) (-128, _254) (-1, _255) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(33))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(256)), Simple(Witness(257))]", + "BLACKBOX::RANGE [(_256, 1)] []", + "BLACKBOX::RANGE [(_257, 7)] []", + "EXPR [ (1, _33) (-128, _256) (-1, _257) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(34), Witness(254))], linear_combinations: [(1, Witness(34)), (256, Witness(254))], q_c: 0 })], outputs: [Simple(Witness(258))]", + "EXPR [ (-2, _34, _254) (1, _34) (256, _254) (-1, _259) 0 ]", + "EXPR [ (1, _258, _259) -1 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(33), Witness(256))], linear_combinations: [(1, Witness(33)), (256, Witness(256))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(259))], q_c: 0 })], outputs: [Simple(Witness(260)), Simple(Witness(261))]", + "BLACKBOX::RANGE [(_260, 8)] []", + "BLACKBOX::RANGE [(_261, 8)] []", + "EXPR [ (1, _259) (-1, _261) (-1, _262) -1 ]", + "BLACKBOX::RANGE [(_262, 8)] []", + "EXPR [ (-2, _33, _256) (-1, _259, _260) (1, _33) (256, _256) (-1, _261) 0 ]", + "EXPR [ (-1, _260) (-1, _263) 128 ]", + "EXPR [ (-2, _254, _256) (1, _254) (1, _256) (-1, _264) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(260))], q_c: 0 })], outputs: [Simple(Witness(265))]", + "EXPR [ (1, _260, _265) (1, _266) -1 ]", + "EXPR [ (1, _260, _266) 0 ]", + "EXPR [ (2, _263, _264) (1, _260) (-1, _267) 0 ]", + "EXPR [ (-1, _266) (-1, _268) 1 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(261))], q_c: 0 })], outputs: [Simple(Witness(269))]", + "EXPR [ (1, _261, _269) (1, _270) -1 ]", + "EXPR [ (1, _261, _270) 0 ]", + "EXPR [ (-2, _256, _261) (256, _256) (1, _261) (-1, _271) 0 ]", + "EXPR [ (-1, _270) (-1, _272) 1 ]", + "EXPR [ (1, _267, _268) (-1, _35) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(37))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(273)), Simple(Witness(274))]", + "BLACKBOX::RANGE [(_273, 1)] []", + "BLACKBOX::RANGE [(_274, 7)] []", + "EXPR [ (1, _37) (-128, _273) (-1, _274) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(36))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(275)), Simple(Witness(276))]", + "BLACKBOX::RANGE [(_275, 1)] []", + "BLACKBOX::RANGE [(_276, 7)] []", + "EXPR [ (1, _36) (-128, _275) (-1, _276) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(37), Witness(273))], linear_combinations: [(1, Witness(37)), (256, Witness(273))], q_c: 0 })], outputs: [Simple(Witness(277))]", + "EXPR [ (-2, _37, _273) (1, _37) (256, _273) (-1, _278) 0 ]", + "EXPR [ (1, _277, _278) -1 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(36), Witness(275))], linear_combinations: [(1, Witness(36)), (256, Witness(275))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(278))], q_c: 0 })], outputs: [Simple(Witness(279)), Simple(Witness(280))]", + "BLACKBOX::RANGE [(_279, 8)] []", + "BLACKBOX::RANGE [(_280, 8)] []", + "EXPR [ (1, _278) (-1, _280) (-1, _281) -1 ]", + "BLACKBOX::RANGE [(_281, 8)] []", + "EXPR [ (-2, _36, _275) (-1, _278, _279) (1, _36) (256, _275) (-1, _280) 0 ]", + "EXPR [ (-1, _279) (-1, _282) 128 ]", + "EXPR [ (-2, _273, _275) (1, _273) (1, _275) (-1, _283) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(279))], q_c: 0 })], outputs: [Simple(Witness(284))]", + "EXPR [ (1, _279, _284) (1, _285) -1 ]", + "EXPR [ (1, _279, _285) 0 ]", + "EXPR [ (2, _282, _283) (1, _279) (-1, _286) 0 ]", + "EXPR [ (-1, _285) (-1, _287) 1 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(280))], q_c: 0 })], outputs: [Simple(Witness(288))]", + "EXPR [ (1, _280, _288) (1, _289) -1 ]", + "EXPR [ (1, _280, _289) 0 ]", + "EXPR [ (-2, _275, _280) (256, _275) (1, _280) (-1, _290) 0 ]", + "EXPR [ (-1, _289) (-1, _291) 1 ]", + "EXPR [ (1, _286, _287) (-1, _38) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(40))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(292)), Simple(Witness(293))]", + "BLACKBOX::RANGE [(_292, 1)] []", + "BLACKBOX::RANGE [(_293, 7)] []", + "EXPR [ (1, _40) (-128, _292) (-1, _293) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(39))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(294)), Simple(Witness(295))]", + "BLACKBOX::RANGE [(_294, 1)] []", + "BLACKBOX::RANGE [(_295, 7)] []", + "EXPR [ (1, _39) (-128, _294) (-1, _295) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(40), Witness(292))], linear_combinations: [(1, Witness(40)), (256, Witness(292))], q_c: 0 })], outputs: [Simple(Witness(296))]", + "EXPR [ (-2, _40, _292) (1, _40) (256, _292) (-1, _297) 0 ]", + "EXPR [ (1, _296, _297) -1 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(39), Witness(294))], linear_combinations: [(1, Witness(39)), (256, Witness(294))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(297))], q_c: 0 })], outputs: [Simple(Witness(298)), Simple(Witness(299))]", + "BLACKBOX::RANGE [(_298, 8)] []", + "BLACKBOX::RANGE [(_299, 8)] []", + "EXPR [ (1, _297) (-1, _299) (-1, _300) -1 ]", + "BLACKBOX::RANGE [(_300, 8)] []", + "EXPR [ (-2, _39, _294) (-1, _297, _298) (1, _39) (256, _294) (-1, _299) 0 ]", + "EXPR [ (-1, _298) (-1, _301) 128 ]", + "EXPR [ (-2, _292, _294) (1, _292) (1, _294) (-1, _302) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(298))], q_c: 0 })], outputs: [Simple(Witness(303))]", + "EXPR [ (1, _298, _303) (1, _304) -1 ]", + "EXPR [ (1, _298, _304) 0 ]", + "EXPR [ (2, _301, _302) (1, _298) (-1, _305) 0 ]", + "EXPR [ (-1, _304) (-1, _306) 1 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(299))], q_c: 0 })], outputs: [Simple(Witness(307))]", + "EXPR [ (1, _299, _307) (1, _308) -1 ]", + "EXPR [ (1, _299, _308) 0 ]", + "EXPR [ (-2, _294, _299) (256, _294) (1, _299) (-1, _309) 0 ]", + "EXPR [ (-1, _308) (-1, _310) 1 ]", + "EXPR [ (1, _305, _306) (-1, _41) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(43))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(311)), Simple(Witness(312))]", + "BLACKBOX::RANGE [(_311, 1)] []", + "BLACKBOX::RANGE [(_312, 7)] []", + "EXPR [ (1, _43) (-128, _311) (-1, _312) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(42))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(313)), Simple(Witness(314))]", + "BLACKBOX::RANGE [(_313, 1)] []", + "BLACKBOX::RANGE [(_314, 7)] []", + "EXPR [ (1, _42) (-128, _313) (-1, _314) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(43), Witness(311))], linear_combinations: [(1, Witness(43)), (256, Witness(311))], q_c: 0 })], outputs: [Simple(Witness(315))]", + "EXPR [ (-2, _43, _311) (1, _43) (256, _311) (-1, _316) 0 ]", + "EXPR [ (1, _315, _316) -1 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(42), Witness(313))], linear_combinations: [(1, Witness(42)), (256, Witness(313))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(316))], q_c: 0 })], outputs: [Simple(Witness(317)), Simple(Witness(318))]", + "BLACKBOX::RANGE [(_317, 8)] []", + "BLACKBOX::RANGE [(_318, 8)] []", + "EXPR [ (1, _316) (-1, _318) (-1, _319) -1 ]", + "BLACKBOX::RANGE [(_319, 8)] []", + "EXPR [ (-2, _42, _313) (-1, _316, _317) (1, _42) (256, _313) (-1, _318) 0 ]", + "EXPR [ (-1, _317) (-1, _320) 128 ]", + "EXPR [ (-2, _311, _313) (1, _311) (1, _313) (-1, _321) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(317))], q_c: 0 })], outputs: [Simple(Witness(322))]", + "EXPR [ (1, _317, _322) (1, _323) -1 ]", + "EXPR [ (1, _317, _323) 0 ]", + "EXPR [ (2, _320, _321) (1, _317) (-1, _324) 0 ]", + "EXPR [ (-1, _323) (-1, _325) 1 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(318))], q_c: 0 })], outputs: [Simple(Witness(326))]", + "EXPR [ (1, _318, _326) (1, _327) -1 ]", + "EXPR [ (1, _318, _327) 0 ]", + "EXPR [ (-2, _313, _318) (256, _313) (1, _318) (-1, _328) 0 ]", + "EXPR [ (-1, _327) (-1, _329) 1 ]", + "EXPR [ (1, _324, _325) (-1, _44) 0 ]", "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) } }]", "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": "pdXBbptAFIXhd2HtBWcGZoa8SlVF2MYREsIWsSNVVt692Od3kywqVenqBpP7GeRz4Frth+3l5XmcD8fX6unHtdou4zSNL8/Tcdefx+O8fnp931SPw+fzMgzrR9Wn8+vWqV+G+Vw9zZdp2lRv/XS5/9PrqZ/v89wv69l6Uw3zfp0reBin4fbX++Zju/77qmLHspr2z3r77/tteOy35Tv7H9+fwnf2U/PYz/X/fX/OX/Z/rkf9bly+/GJV01ZPcVM1ySN7FI/uPtraQx7BI3o0HlZaK62V1kprJVlJVpKVZCVZSVaSlWQlWUlWspVsJVvJVvKqtOuwkq1kK9lKtlKsFCvFSrFSfC3FSrFSrBQrxUpnpbPSWemsdFY6K52VzkpnpbOiumaKGZiR6dtS3XKcmJlZmHjCE57whKeGiSc84QlPeAEv4AW8gBfwAl7AC3gBL+BFvIgX8SJe5H4jXsSLeBEv4jV4DV6D1+A1XB9JF1EXWRdhF2kXcRd5F4EXiReRF5kXoRepF7EXuRfBF8kX0RfZV+J+Sb+Iv8i/KIBogKiA6IAogWiBMtdHD0QRRBNEFUQXRBlEG0QdRB9EIUQjRCVEJ0QpRCtELUQvRDFEM3Srxu3J/NYvY7+dBl4ch8u8+/QeOf86Pc483jSn5bgb9pdluD3B7ufWZ9pv", + "debug_symbols": "pdfdSiNpFIXhe8mxB9lrrfrzVoZBosYmEKJEHRjEe5+Y/dZ098HA0H20O6brNYX7ofJ9bB739+/f7g6np+fXze0fH5v78+F4PHy7Oz4/7N4Oz6fLTz8+bzbry7u3835/+dHmh/cvV73szvvT2+b29H483mz+2h3fr//p9WV3us633fny7vZmsz89XuYl+HQ47r/+9Xnz/ertf19aXri4Mvx7+fD/rx+0Xj/Mv3L9998/6leuH7NeP21/7/dP00/X/3l5tXs4nH/6i20ybG59s8nYY+ox91iuY9j2qB7q4R7p0ZWhK0NXhq4MXRm7MnZl7MrYlbErY1fGroxdGbsydmXqytSVqStTV6ZLZbiMrkxdmboydWXqytyVuStzV+auzP1Z5q7MXZm7Mndl7srSlaUrS1eWrixdWbqydGXpytKVpSu13TKLKaaZfVu1HXg9MifmzKRX9Ipe0St6FSa9olf0il7REz3REz3REz3REz3REz3RMz3TMz3TM/dreqZneqZneqEXeqEXeuHzsenFqhe7Xix7se3Fuhf7Xix8sfHFyhc7Xyx9sfXF2hd7Xyx+sfnF6he7XyP3y/YX61/sfwGgEFAQKAwUCAoFNfH5cFBAKCQUFAoLBYZCQ8Gh8FCAKEQUJAoTBYpCRcGicFHAKGTUwv1io8BR6Ch4FD6ED+FD+BA+tA1zYI7MiTkz6eFD+BA+hA/hQ/gQPoQP4UP4ED6ED+FD+JD6foUP4UP4ED6ED+FD+BA+hA+Zz4cP4UP4ED6ED+FD+BA+hA/hQ/gQPoQP4UP4ED6ED+FD+NDA/eJD+BA+hA/hQ/gQPoQP4UM8HIQP4UP4ED6ED+FD+BA+hA/hQ/gQPoQP4UP4ED6ED+FD+NDM/eJD+BA+hA/hQ/gQPoQP4UM8OoQP4UP4ED6ED+PD+DA+jA/jw/gwPowP48P4MD6MD+PD+HD1/RofxofxYXwYH8aH8WF8GB/m+WF8GB/Gh/FhfBgfxofxYXwYH8aH8WF8GB/Gh/FhfBgfxofD/eLD+DA+jA/jw/gwPowP48M8P4wP48P4MD6MD+PD+DA+jA/jw/gwPowP48P4MD6MD+PD+DBfo4wP48P4MD6MD+PD+DA+jA/z/DA+jA/jw/gwPowP48P4MD6MD+PD+DA+jA/jI/gIPoKP4CN8vwo+go/gI/gIPoKP4CP4CD7C8yP4CD6Cj+Aj+Ag+go/gI/gIPoKP4CP4CD6Cj+Aj+Ag+go/w/Sr4CD6Cj+Aj+Ag+go/gI/gIz4+sJ4n1KLGeJdbDBD6Cj+Aj+Ag+go/gI/gIPoKP4CP4CD6Cj+AjfL/KuJ506OEj+Ag+go/gI/gIPsLzI/jItB6d6OEj+Ag+go/gI/gIPoKP4CPzehajh4/gI/gIPoKPXL9ffX6dEM+H3f1x/9oH86f308MP5/S3v1/Wd9aT/Mv5+WH/+H7ef50Qr+9dzoz/AA==", "file_map": { "50": { "source": "struct SignedDivOp {\n lhs: i8,\n rhs: i8,\n result: i8,\n}\n\nfn main(ops: [SignedDivOp; 15]) {\n for i in 0..15 {\n assert_eq(ops[i].lhs / ops[i].rhs, ops[i].result);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/signed_div/execute__tests__force_brillig_false_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/signed_div/execute__tests__force_brillig_false_inliner_9223372036854775807.snap index 919616adc2c..4f078bf6487 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/signed_div/execute__tests__force_brillig_false_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/signed_div/execute__tests__force_brillig_false_inliner_9223372036854775807.snap @@ -51,7 +51,7 @@ expression: artifact }, "bytecode": [ "func 0", - "current witness index : _139", + "current witness index : _329", "private parameters indices : [_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44]", "public parameters indices : []", "return value indices : []", @@ -250,12 +250,312 @@ expression: artifact "EXPR [ (-2, _123, _128) (256, _123) (1, _128) (-1, _138) 0 ]", "EXPR [ (-1, _137) (-1, _139) 1 ]", "EXPR [ (1, _134, _135) (-1, _14) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(16))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(140)), Simple(Witness(141))]", + "BLACKBOX::RANGE [(_140, 1)] []", + "BLACKBOX::RANGE [(_141, 7)] []", + "EXPR [ (1, _16) (-128, _140) (-1, _141) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(15))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(142)), Simple(Witness(143))]", + "BLACKBOX::RANGE [(_142, 1)] []", + "BLACKBOX::RANGE [(_143, 7)] []", + "EXPR [ (1, _15) (-128, _142) (-1, _143) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(16), Witness(140))], linear_combinations: [(1, Witness(16)), (256, Witness(140))], q_c: 0 })], outputs: [Simple(Witness(144))]", + "EXPR [ (-2, _16, _140) (1, _16) (256, _140) (-1, _145) 0 ]", + "EXPR [ (1, _144, _145) -1 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(15), Witness(142))], linear_combinations: [(1, Witness(15)), (256, Witness(142))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(145))], q_c: 0 })], outputs: [Simple(Witness(146)), Simple(Witness(147))]", + "BLACKBOX::RANGE [(_146, 8)] []", + "BLACKBOX::RANGE [(_147, 8)] []", + "EXPR [ (1, _145) (-1, _147) (-1, _148) -1 ]", + "BLACKBOX::RANGE [(_148, 8)] []", + "EXPR [ (-2, _15, _142) (-1, _145, _146) (1, _15) (256, _142) (-1, _147) 0 ]", + "EXPR [ (-1, _146) (-1, _149) 128 ]", + "EXPR [ (-2, _140, _142) (1, _140) (1, _142) (-1, _150) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(146))], q_c: 0 })], outputs: [Simple(Witness(151))]", + "EXPR [ (1, _146, _151) (1, _152) -1 ]", + "EXPR [ (1, _146, _152) 0 ]", + "EXPR [ (2, _149, _150) (1, _146) (-1, _153) 0 ]", + "EXPR [ (-1, _152) (-1, _154) 1 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(147))], q_c: 0 })], outputs: [Simple(Witness(155))]", + "EXPR [ (1, _147, _155) (1, _156) -1 ]", + "EXPR [ (1, _147, _156) 0 ]", + "EXPR [ (-2, _142, _147) (256, _142) (1, _147) (-1, _157) 0 ]", + "EXPR [ (-1, _156) (-1, _158) 1 ]", + "EXPR [ (1, _153, _154) (-1, _17) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(19))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(159)), Simple(Witness(160))]", + "BLACKBOX::RANGE [(_159, 1)] []", + "BLACKBOX::RANGE [(_160, 7)] []", + "EXPR [ (1, _19) (-128, _159) (-1, _160) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(18))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(161)), Simple(Witness(162))]", + "BLACKBOX::RANGE [(_161, 1)] []", + "BLACKBOX::RANGE [(_162, 7)] []", + "EXPR [ (1, _18) (-128, _161) (-1, _162) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(19), Witness(159))], linear_combinations: [(1, Witness(19)), (256, Witness(159))], q_c: 0 })], outputs: [Simple(Witness(163))]", + "EXPR [ (-2, _19, _159) (1, _19) (256, _159) (-1, _164) 0 ]", + "EXPR [ (1, _163, _164) -1 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(18), Witness(161))], linear_combinations: [(1, Witness(18)), (256, Witness(161))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(164))], q_c: 0 })], outputs: [Simple(Witness(165)), Simple(Witness(166))]", + "BLACKBOX::RANGE [(_165, 8)] []", + "BLACKBOX::RANGE [(_166, 8)] []", + "EXPR [ (1, _164) (-1, _166) (-1, _167) -1 ]", + "BLACKBOX::RANGE [(_167, 8)] []", + "EXPR [ (-2, _18, _161) (-1, _164, _165) (1, _18) (256, _161) (-1, _166) 0 ]", + "EXPR [ (-1, _165) (-1, _168) 128 ]", + "EXPR [ (-2, _159, _161) (1, _159) (1, _161) (-1, _169) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(165))], q_c: 0 })], outputs: [Simple(Witness(170))]", + "EXPR [ (1, _165, _170) (1, _171) -1 ]", + "EXPR [ (1, _165, _171) 0 ]", + "EXPR [ (2, _168, _169) (1, _165) (-1, _172) 0 ]", + "EXPR [ (-1, _171) (-1, _173) 1 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(166))], q_c: 0 })], outputs: [Simple(Witness(174))]", + "EXPR [ (1, _166, _174) (1, _175) -1 ]", + "EXPR [ (1, _166, _175) 0 ]", + "EXPR [ (-2, _161, _166) (256, _161) (1, _166) (-1, _176) 0 ]", + "EXPR [ (-1, _175) (-1, _177) 1 ]", + "EXPR [ (1, _172, _173) (-1, _20) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(22))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(178)), Simple(Witness(179))]", + "BLACKBOX::RANGE [(_178, 1)] []", + "BLACKBOX::RANGE [(_179, 7)] []", + "EXPR [ (1, _22) (-128, _178) (-1, _179) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(21))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(180)), Simple(Witness(181))]", + "BLACKBOX::RANGE [(_180, 1)] []", + "BLACKBOX::RANGE [(_181, 7)] []", + "EXPR [ (1, _21) (-128, _180) (-1, _181) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(22), Witness(178))], linear_combinations: [(1, Witness(22)), (256, Witness(178))], q_c: 0 })], outputs: [Simple(Witness(182))]", + "EXPR [ (-2, _22, _178) (1, _22) (256, _178) (-1, _183) 0 ]", + "EXPR [ (1, _182, _183) -1 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(21), Witness(180))], linear_combinations: [(1, Witness(21)), (256, Witness(180))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(183))], q_c: 0 })], outputs: [Simple(Witness(184)), Simple(Witness(185))]", + "BLACKBOX::RANGE [(_184, 8)] []", + "BLACKBOX::RANGE [(_185, 8)] []", + "EXPR [ (1, _183) (-1, _185) (-1, _186) -1 ]", + "BLACKBOX::RANGE [(_186, 8)] []", + "EXPR [ (-2, _21, _180) (-1, _183, _184) (1, _21) (256, _180) (-1, _185) 0 ]", + "EXPR [ (-1, _184) (-1, _187) 128 ]", + "EXPR [ (-2, _178, _180) (1, _178) (1, _180) (-1, _188) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(184))], q_c: 0 })], outputs: [Simple(Witness(189))]", + "EXPR [ (1, _184, _189) (1, _190) -1 ]", + "EXPR [ (1, _184, _190) 0 ]", + "EXPR [ (2, _187, _188) (1, _184) (-1, _191) 0 ]", + "EXPR [ (-1, _190) (-1, _192) 1 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(185))], q_c: 0 })], outputs: [Simple(Witness(193))]", + "EXPR [ (1, _185, _193) (1, _194) -1 ]", + "EXPR [ (1, _185, _194) 0 ]", + "EXPR [ (-2, _180, _185) (256, _180) (1, _185) (-1, _195) 0 ]", + "EXPR [ (-1, _194) (-1, _196) 1 ]", + "EXPR [ (1, _191, _192) (-1, _23) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(25))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(197)), Simple(Witness(198))]", + "BLACKBOX::RANGE [(_197, 1)] []", + "BLACKBOX::RANGE [(_198, 7)] []", + "EXPR [ (1, _25) (-128, _197) (-1, _198) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(24))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(199)), Simple(Witness(200))]", + "BLACKBOX::RANGE [(_199, 1)] []", + "BLACKBOX::RANGE [(_200, 7)] []", + "EXPR [ (1, _24) (-128, _199) (-1, _200) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(25), Witness(197))], linear_combinations: [(1, Witness(25)), (256, Witness(197))], q_c: 0 })], outputs: [Simple(Witness(201))]", + "EXPR [ (-2, _25, _197) (1, _25) (256, _197) (-1, _202) 0 ]", + "EXPR [ (1, _201, _202) -1 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(24), Witness(199))], linear_combinations: [(1, Witness(24)), (256, Witness(199))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(202))], q_c: 0 })], outputs: [Simple(Witness(203)), Simple(Witness(204))]", + "BLACKBOX::RANGE [(_203, 8)] []", + "BLACKBOX::RANGE [(_204, 8)] []", + "EXPR [ (1, _202) (-1, _204) (-1, _205) -1 ]", + "BLACKBOX::RANGE [(_205, 8)] []", + "EXPR [ (-2, _24, _199) (-1, _202, _203) (1, _24) (256, _199) (-1, _204) 0 ]", + "EXPR [ (-1, _203) (-1, _206) 128 ]", + "EXPR [ (-2, _197, _199) (1, _197) (1, _199) (-1, _207) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(203))], q_c: 0 })], outputs: [Simple(Witness(208))]", + "EXPR [ (1, _203, _208) (1, _209) -1 ]", + "EXPR [ (1, _203, _209) 0 ]", + "EXPR [ (2, _206, _207) (1, _203) (-1, _210) 0 ]", + "EXPR [ (-1, _209) (-1, _211) 1 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(204))], q_c: 0 })], outputs: [Simple(Witness(212))]", + "EXPR [ (1, _204, _212) (1, _213) -1 ]", + "EXPR [ (1, _204, _213) 0 ]", + "EXPR [ (-2, _199, _204) (256, _199) (1, _204) (-1, _214) 0 ]", + "EXPR [ (-1, _213) (-1, _215) 1 ]", + "EXPR [ (1, _210, _211) (-1, _26) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(28))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(216)), Simple(Witness(217))]", + "BLACKBOX::RANGE [(_216, 1)] []", + "BLACKBOX::RANGE [(_217, 7)] []", + "EXPR [ (1, _28) (-128, _216) (-1, _217) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(27))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(218)), Simple(Witness(219))]", + "BLACKBOX::RANGE [(_218, 1)] []", + "BLACKBOX::RANGE [(_219, 7)] []", + "EXPR [ (1, _27) (-128, _218) (-1, _219) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(28), Witness(216))], linear_combinations: [(1, Witness(28)), (256, Witness(216))], q_c: 0 })], outputs: [Simple(Witness(220))]", + "EXPR [ (-2, _28, _216) (1, _28) (256, _216) (-1, _221) 0 ]", + "EXPR [ (1, _220, _221) -1 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(27), Witness(218))], linear_combinations: [(1, Witness(27)), (256, Witness(218))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(221))], q_c: 0 })], outputs: [Simple(Witness(222)), Simple(Witness(223))]", + "BLACKBOX::RANGE [(_222, 8)] []", + "BLACKBOX::RANGE [(_223, 8)] []", + "EXPR [ (1, _221) (-1, _223) (-1, _224) -1 ]", + "BLACKBOX::RANGE [(_224, 8)] []", + "EXPR [ (-2, _27, _218) (-1, _221, _222) (1, _27) (256, _218) (-1, _223) 0 ]", + "EXPR [ (-1, _222) (-1, _225) 128 ]", + "EXPR [ (-2, _216, _218) (1, _216) (1, _218) (-1, _226) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(222))], q_c: 0 })], outputs: [Simple(Witness(227))]", + "EXPR [ (1, _222, _227) (1, _228) -1 ]", + "EXPR [ (1, _222, _228) 0 ]", + "EXPR [ (2, _225, _226) (1, _222) (-1, _229) 0 ]", + "EXPR [ (-1, _228) (-1, _230) 1 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(223))], q_c: 0 })], outputs: [Simple(Witness(231))]", + "EXPR [ (1, _223, _231) (1, _232) -1 ]", + "EXPR [ (1, _223, _232) 0 ]", + "EXPR [ (-2, _218, _223) (256, _218) (1, _223) (-1, _233) 0 ]", + "EXPR [ (-1, _232) (-1, _234) 1 ]", + "EXPR [ (1, _229, _230) (-1, _29) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(31))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(235)), Simple(Witness(236))]", + "BLACKBOX::RANGE [(_235, 1)] []", + "BLACKBOX::RANGE [(_236, 7)] []", + "EXPR [ (1, _31) (-128, _235) (-1, _236) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(30))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(237)), Simple(Witness(238))]", + "BLACKBOX::RANGE [(_237, 1)] []", + "BLACKBOX::RANGE [(_238, 7)] []", + "EXPR [ (1, _30) (-128, _237) (-1, _238) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(31), Witness(235))], linear_combinations: [(1, Witness(31)), (256, Witness(235))], q_c: 0 })], outputs: [Simple(Witness(239))]", + "EXPR [ (-2, _31, _235) (1, _31) (256, _235) (-1, _240) 0 ]", + "EXPR [ (1, _239, _240) -1 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(30), Witness(237))], linear_combinations: [(1, Witness(30)), (256, Witness(237))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(240))], q_c: 0 })], outputs: [Simple(Witness(241)), Simple(Witness(242))]", + "BLACKBOX::RANGE [(_241, 8)] []", + "BLACKBOX::RANGE [(_242, 8)] []", + "EXPR [ (1, _240) (-1, _242) (-1, _243) -1 ]", + "BLACKBOX::RANGE [(_243, 8)] []", + "EXPR [ (-2, _30, _237) (-1, _240, _241) (1, _30) (256, _237) (-1, _242) 0 ]", + "EXPR [ (-1, _241) (-1, _244) 128 ]", + "EXPR [ (-2, _235, _237) (1, _235) (1, _237) (-1, _245) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(241))], q_c: 0 })], outputs: [Simple(Witness(246))]", + "EXPR [ (1, _241, _246) (1, _247) -1 ]", + "EXPR [ (1, _241, _247) 0 ]", + "EXPR [ (2, _244, _245) (1, _241) (-1, _248) 0 ]", + "EXPR [ (-1, _247) (-1, _249) 1 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(242))], q_c: 0 })], outputs: [Simple(Witness(250))]", + "EXPR [ (1, _242, _250) (1, _251) -1 ]", + "EXPR [ (1, _242, _251) 0 ]", + "EXPR [ (-2, _237, _242) (256, _237) (1, _242) (-1, _252) 0 ]", + "EXPR [ (-1, _251) (-1, _253) 1 ]", + "EXPR [ (1, _248, _249) (-1, _32) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(34))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(254)), Simple(Witness(255))]", + "BLACKBOX::RANGE [(_254, 1)] []", + "BLACKBOX::RANGE [(_255, 7)] []", + "EXPR [ (1, _34) (-128, _254) (-1, _255) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(33))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(256)), Simple(Witness(257))]", + "BLACKBOX::RANGE [(_256, 1)] []", + "BLACKBOX::RANGE [(_257, 7)] []", + "EXPR [ (1, _33) (-128, _256) (-1, _257) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(34), Witness(254))], linear_combinations: [(1, Witness(34)), (256, Witness(254))], q_c: 0 })], outputs: [Simple(Witness(258))]", + "EXPR [ (-2, _34, _254) (1, _34) (256, _254) (-1, _259) 0 ]", + "EXPR [ (1, _258, _259) -1 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(33), Witness(256))], linear_combinations: [(1, Witness(33)), (256, Witness(256))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(259))], q_c: 0 })], outputs: [Simple(Witness(260)), Simple(Witness(261))]", + "BLACKBOX::RANGE [(_260, 8)] []", + "BLACKBOX::RANGE [(_261, 8)] []", + "EXPR [ (1, _259) (-1, _261) (-1, _262) -1 ]", + "BLACKBOX::RANGE [(_262, 8)] []", + "EXPR [ (-2, _33, _256) (-1, _259, _260) (1, _33) (256, _256) (-1, _261) 0 ]", + "EXPR [ (-1, _260) (-1, _263) 128 ]", + "EXPR [ (-2, _254, _256) (1, _254) (1, _256) (-1, _264) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(260))], q_c: 0 })], outputs: [Simple(Witness(265))]", + "EXPR [ (1, _260, _265) (1, _266) -1 ]", + "EXPR [ (1, _260, _266) 0 ]", + "EXPR [ (2, _263, _264) (1, _260) (-1, _267) 0 ]", + "EXPR [ (-1, _266) (-1, _268) 1 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(261))], q_c: 0 })], outputs: [Simple(Witness(269))]", + "EXPR [ (1, _261, _269) (1, _270) -1 ]", + "EXPR [ (1, _261, _270) 0 ]", + "EXPR [ (-2, _256, _261) (256, _256) (1, _261) (-1, _271) 0 ]", + "EXPR [ (-1, _270) (-1, _272) 1 ]", + "EXPR [ (1, _267, _268) (-1, _35) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(37))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(273)), Simple(Witness(274))]", + "BLACKBOX::RANGE [(_273, 1)] []", + "BLACKBOX::RANGE [(_274, 7)] []", + "EXPR [ (1, _37) (-128, _273) (-1, _274) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(36))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(275)), Simple(Witness(276))]", + "BLACKBOX::RANGE [(_275, 1)] []", + "BLACKBOX::RANGE [(_276, 7)] []", + "EXPR [ (1, _36) (-128, _275) (-1, _276) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(37), Witness(273))], linear_combinations: [(1, Witness(37)), (256, Witness(273))], q_c: 0 })], outputs: [Simple(Witness(277))]", + "EXPR [ (-2, _37, _273) (1, _37) (256, _273) (-1, _278) 0 ]", + "EXPR [ (1, _277, _278) -1 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(36), Witness(275))], linear_combinations: [(1, Witness(36)), (256, Witness(275))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(278))], q_c: 0 })], outputs: [Simple(Witness(279)), Simple(Witness(280))]", + "BLACKBOX::RANGE [(_279, 8)] []", + "BLACKBOX::RANGE [(_280, 8)] []", + "EXPR [ (1, _278) (-1, _280) (-1, _281) -1 ]", + "BLACKBOX::RANGE [(_281, 8)] []", + "EXPR [ (-2, _36, _275) (-1, _278, _279) (1, _36) (256, _275) (-1, _280) 0 ]", + "EXPR [ (-1, _279) (-1, _282) 128 ]", + "EXPR [ (-2, _273, _275) (1, _273) (1, _275) (-1, _283) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(279))], q_c: 0 })], outputs: [Simple(Witness(284))]", + "EXPR [ (1, _279, _284) (1, _285) -1 ]", + "EXPR [ (1, _279, _285) 0 ]", + "EXPR [ (2, _282, _283) (1, _279) (-1, _286) 0 ]", + "EXPR [ (-1, _285) (-1, _287) 1 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(280))], q_c: 0 })], outputs: [Simple(Witness(288))]", + "EXPR [ (1, _280, _288) (1, _289) -1 ]", + "EXPR [ (1, _280, _289) 0 ]", + "EXPR [ (-2, _275, _280) (256, _275) (1, _280) (-1, _290) 0 ]", + "EXPR [ (-1, _289) (-1, _291) 1 ]", + "EXPR [ (1, _286, _287) (-1, _38) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(40))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(292)), Simple(Witness(293))]", + "BLACKBOX::RANGE [(_292, 1)] []", + "BLACKBOX::RANGE [(_293, 7)] []", + "EXPR [ (1, _40) (-128, _292) (-1, _293) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(39))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(294)), Simple(Witness(295))]", + "BLACKBOX::RANGE [(_294, 1)] []", + "BLACKBOX::RANGE [(_295, 7)] []", + "EXPR [ (1, _39) (-128, _294) (-1, _295) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(40), Witness(292))], linear_combinations: [(1, Witness(40)), (256, Witness(292))], q_c: 0 })], outputs: [Simple(Witness(296))]", + "EXPR [ (-2, _40, _292) (1, _40) (256, _292) (-1, _297) 0 ]", + "EXPR [ (1, _296, _297) -1 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(39), Witness(294))], linear_combinations: [(1, Witness(39)), (256, Witness(294))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(297))], q_c: 0 })], outputs: [Simple(Witness(298)), Simple(Witness(299))]", + "BLACKBOX::RANGE [(_298, 8)] []", + "BLACKBOX::RANGE [(_299, 8)] []", + "EXPR [ (1, _297) (-1, _299) (-1, _300) -1 ]", + "BLACKBOX::RANGE [(_300, 8)] []", + "EXPR [ (-2, _39, _294) (-1, _297, _298) (1, _39) (256, _294) (-1, _299) 0 ]", + "EXPR [ (-1, _298) (-1, _301) 128 ]", + "EXPR [ (-2, _292, _294) (1, _292) (1, _294) (-1, _302) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(298))], q_c: 0 })], outputs: [Simple(Witness(303))]", + "EXPR [ (1, _298, _303) (1, _304) -1 ]", + "EXPR [ (1, _298, _304) 0 ]", + "EXPR [ (2, _301, _302) (1, _298) (-1, _305) 0 ]", + "EXPR [ (-1, _304) (-1, _306) 1 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(299))], q_c: 0 })], outputs: [Simple(Witness(307))]", + "EXPR [ (1, _299, _307) (1, _308) -1 ]", + "EXPR [ (1, _299, _308) 0 ]", + "EXPR [ (-2, _294, _299) (256, _294) (1, _299) (-1, _309) 0 ]", + "EXPR [ (-1, _308) (-1, _310) 1 ]", + "EXPR [ (1, _305, _306) (-1, _41) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(43))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(311)), Simple(Witness(312))]", + "BLACKBOX::RANGE [(_311, 1)] []", + "BLACKBOX::RANGE [(_312, 7)] []", + "EXPR [ (1, _43) (-128, _311) (-1, _312) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(42))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 128 })], outputs: [Simple(Witness(313)), Simple(Witness(314))]", + "BLACKBOX::RANGE [(_313, 1)] []", + "BLACKBOX::RANGE [(_314, 7)] []", + "EXPR [ (1, _42) (-128, _313) (-1, _314) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-2, Witness(43), Witness(311))], linear_combinations: [(1, Witness(43)), (256, Witness(311))], q_c: 0 })], outputs: [Simple(Witness(315))]", + "EXPR [ (-2, _43, _311) (1, _43) (256, _311) (-1, _316) 0 ]", + "EXPR [ (1, _315, _316) -1 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(-2, Witness(42), Witness(313))], linear_combinations: [(1, Witness(42)), (256, Witness(313))], q_c: 0 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(316))], q_c: 0 })], outputs: [Simple(Witness(317)), Simple(Witness(318))]", + "BLACKBOX::RANGE [(_317, 8)] []", + "BLACKBOX::RANGE [(_318, 8)] []", + "EXPR [ (1, _316) (-1, _318) (-1, _319) -1 ]", + "BLACKBOX::RANGE [(_319, 8)] []", + "EXPR [ (-2, _42, _313) (-1, _316, _317) (1, _42) (256, _313) (-1, _318) 0 ]", + "EXPR [ (-1, _317) (-1, _320) 128 ]", + "EXPR [ (-2, _311, _313) (1, _311) (1, _313) (-1, _321) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(317))], q_c: 0 })], outputs: [Simple(Witness(322))]", + "EXPR [ (1, _317, _322) (1, _323) -1 ]", + "EXPR [ (1, _317, _323) 0 ]", + "EXPR [ (2, _320, _321) (1, _317) (-1, _324) 0 ]", + "EXPR [ (-1, _323) (-1, _325) 1 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(318))], q_c: 0 })], outputs: [Simple(Witness(326))]", + "EXPR [ (1, _318, _326) (1, _327) -1 ]", + "EXPR [ (1, _318, _327) 0 ]", + "EXPR [ (-2, _313, _318) (256, _313) (1, _318) (-1, _328) 0 ]", + "EXPR [ (-1, _327) (-1, _329) 1 ]", + "EXPR [ (1, _324, _325) (-1, _44) 0 ]", "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) } }]", "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": "pdXBbptAFIXhd2HtBWcGZoa8SlVF2MYREsIWsSNVVt692Od3kywqVenqBpP7GeRz4Frth+3l5XmcD8fX6unHtdou4zSNL8/Tcdefx+O8fnp931SPw+fzMgzrR9Wn8+vWqV+G+Vw9zZdp2lRv/XS5/9PrqZ/v89wv69l6Uw3zfp0reBin4fbX++Zju/77qmLHspr2z3r77/tteOy35Tv7H9+fwnf2U/PYz/X/fX/OX/Z/rkf9bly+/GJV01ZPcVM1ySN7FI/uPtraQx7BI3o0HlZaK62V1kprJVlJVpKVZCVZSVaSlWQlWUlWspVsJVvJVvKqtOuwkq1kK9lKtlKsFCvFSrFSfC3FSrFSrBQrxUpnpbPSWemsdFY6K52VzkpnpbOiumaKGZiR6dtS3XKcmJlZmHjCE57whKeGiSc84QlPeAEv4AW8gBfwAl7AC3gBL+BFvIgX8SJe5H4jXsSLeBEv4jV4DV6D1+A1XB9JF1EXWRdhF2kXcRd5F4EXiReRF5kXoRepF7EXuRfBF8kX0RfZV+J+Sb+Iv8i/KIBogKiA6IAogWiBMtdHD0QRRBNEFUQXRBlEG0QdRB9EIUQjRCVEJ0QpRCtELUQvRDFEM3Srxu3J/NYvY7+dBl4ch8u8+/QeOf86Pc483jSn5bgb9pdluD3B7ufWZ9pv", + "debug_symbols": "pdfdSiNpFIXhe8mxB9lrrfrzVoZBosYmEKJEHRjEe5+Y/dZ098HA0H20O6brNYX7ofJ9bB739+/f7g6np+fXze0fH5v78+F4PHy7Oz4/7N4Oz6fLTz8+bzbry7u3835/+dHmh/cvV73szvvT2+b29H483mz+2h3fr//p9WV3us633fny7vZmsz89XuYl+HQ47r/+9Xnz/ertf19aXri4Mvx7+fD/rx+0Xj/Mv3L9998/6leuH7NeP21/7/dP00/X/3l5tXs4nH/6i20ybG59s8nYY+ox91iuY9j2qB7q4R7p0ZWhK0NXhq4MXRm7MnZl7MrYlbErY1fGroxdGbsydmXqytSVqStTV6ZLZbiMrkxdmboydWXqytyVuStzV+auzP1Z5q7MXZm7Mndl7srSlaUrS1eWrixdWbqydGXpytKVpSu13TKLKaaZfVu1HXg9MifmzKRX9Ipe0St6FSa9olf0il7REz3REz3REz3REz3REz3RMz3TMz3TM/dreqZneqZneqEXeqEXeuHzsenFqhe7Xix7se3Fuhf7Xix8sfHFyhc7Xyx9sfXF2hd7Xyx+sfnF6he7XyP3y/YX61/sfwGgEFAQKAwUCAoFNfH5cFBAKCQUFAoLBYZCQ8Gh8FCAKEQUJAoTBYpCRcGicFHAKGTUwv1io8BR6Ch4FD6ED+FD+BA+tA1zYI7MiTkz6eFD+BA+hA/hQ/gQPoQP4UP4ED6ED+FD+JD6foUP4UP4ED6ED+FD+BA+hA+Zz4cP4UP4ED6ED+FD+BA+hA/hQ/gQPoQP4UP4ED6ED+FD+NDA/eJD+BA+hA/hQ/gQPoQP4UM8HIQP4UP4ED6ED+FD+BA+hA/hQ/gQPoQP4UP4ED6ED+FD+NDM/eJD+BA+hA/hQ/gQPoQP4UM8OoQP4UP4ED6ED+PD+DA+jA/jw/gwPowP48P4MD6MD+PD+HD1/RofxofxYXwYH8aH8WF8GB/m+WF8GB/Gh/FhfBgfxofxYXwYH8aH8WF8GB/Gh/FhfBgfxofD/eLD+DA+jA/jw/gwPowP48M8P4wP48P4MD6MD+PD+DA+jA/jw/gwPowP48P4MD6MD+PD+DBfo4wP48P4MD6MD+PD+DA+jA/z/DA+jA/jw/gwPowP48P4MD6MD+PD+DA+jA/jI/gIPoKP4CN8vwo+go/gI/gIPoKP4CP4CD7C8yP4CD6Cj+Aj+Ag+go/gI/gIPoKP4CP4CD6Cj+Aj+Ag+go/w/Sr4CD6Cj+Aj+Ag+go/gI/gIz4+sJ4n1KLGeJdbDBD6Cj+Aj+Ag+go/gI/gIPoKP4CP4CD6Cj+AjfL/KuJ506OEj+Ag+go/gI/gIPsLzI/jItB6d6OEj+Ag+go/gI/gIPoKP4CPzehajh4/gI/gIPoKPXL9ffX6dEM+H3f1x/9oH86f308MP5/S3v1/Wd9aT/Mv5+WH/+H7ef50Qr+9dzoz/AA==", "file_map": { "50": { "source": "struct SignedDivOp {\n lhs: i8,\n rhs: i8,\n result: i8,\n}\n\nfn main(ops: [SignedDivOp; 15]) {\n for i in 0..15 {\n assert_eq(ops[i].lhs / ops[i].rhs, ops[i].result);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/slice_loop/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/slice_loop/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index 214bb7edaf0..f9a4bc8b091 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/slice_loop/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/slice_loop/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -42,10 +42,16 @@ expression: artifact "current witness index : _5", "private parameters indices : [_0, _1, _2, _3, _4, _5]", "public parameters indices : []", - "return value indices : []" + "return value indices : []", + "EXPR [ (1, _0) (1, _1) (1, _2) (1, _3) (1, _4) (1, _5) -21 ]" ], - "debug_symbols": "XY5BCsQwCEXv4rqLWfcqw1BsaosgJtikMITefWyYQOlK/3/6tcJCc9km1jXuML4rzMYivE0SA2aO6m49B+hyykbkFty4byU00gyjFpEBDpTShvaE2mpGc/oagHTx6oErC13d+XGBge158UBjnIX+ci0abjR/Uyf942Qx0FKMrqTGPPsH", - "file_map": {}, + "debug_symbols": "pZFBCoMwEEXvMmsXaaI09SqlSIyjBEISYlIo4t0bJba6EApdTWZ+3h+YP0GHbRwaZXo7Qn2foPVKazU02koRlDVpOs0FbG0TPGIawU5PlBMeTYDaRK0LeAod10+jE2atQfikkgLQdKkmw15pXF5z8aXJOcpKmmFW8g9e/cxzUmWe0+sZT895SnnmKbv9t59dDvwjdUIqf7g4EKjLebHzSrQacwp9NHIXSni5Tdlic95K7KLHxW7V0oI3", + "file_map": { + "50": { + "source": "struct Point {\n x: Field,\n y: Field,\n}\n\nimpl Point {\n fn serialize(self) -> [Field; 2] {\n [self.x, self.y]\n }\n}\n\nfn sum(values: [Field]) -> Field {\n let mut sum = 0;\n for value in values {\n sum = sum + value;\n }\n sum\n}\n\nfn main(points: [Point; 3]) {\n let mut serialized_points = &[];\n for point in points {\n serialized_points = serialized_points.append(point.serialize().as_slice());\n }\n // Do a compile-time check that needs the previous loop to be unrolled\n if serialized_points.len() > 5 {\n let empty_point = Point { x: 0, y: 0 };\n serialized_points = serialized_points.append(empty_point.serialize().as_slice());\n }\n // Do a sum that needs both the previous loop and the previous if to have been simplified\n assert_eq(sum(serialized_points), 21);\n}\n", + "path": "" + } + }, "names": [ "main" ], diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/slice_loop/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/slice_loop/execute__tests__force_brillig_false_inliner_0.snap index 214bb7edaf0..f9a4bc8b091 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/slice_loop/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/slice_loop/execute__tests__force_brillig_false_inliner_0.snap @@ -42,10 +42,16 @@ expression: artifact "current witness index : _5", "private parameters indices : [_0, _1, _2, _3, _4, _5]", "public parameters indices : []", - "return value indices : []" + "return value indices : []", + "EXPR [ (1, _0) (1, _1) (1, _2) (1, _3) (1, _4) (1, _5) -21 ]" ], - "debug_symbols": "XY5BCsQwCEXv4rqLWfcqw1BsaosgJtikMITefWyYQOlK/3/6tcJCc9km1jXuML4rzMYivE0SA2aO6m49B+hyykbkFty4byU00gyjFpEBDpTShvaE2mpGc/oagHTx6oErC13d+XGBge158UBjnIX+ci0abjR/Uyf942Qx0FKMrqTGPPsH", - "file_map": {}, + "debug_symbols": "pZFBCoMwEEXvMmsXaaI09SqlSIyjBEISYlIo4t0bJba6EApdTWZ+3h+YP0GHbRwaZXo7Qn2foPVKazU02koRlDVpOs0FbG0TPGIawU5PlBMeTYDaRK0LeAod10+jE2atQfikkgLQdKkmw15pXF5z8aXJOcpKmmFW8g9e/cxzUmWe0+sZT895SnnmKbv9t59dDvwjdUIqf7g4EKjLebHzSrQacwp9NHIXSni5Tdlic95K7KLHxW7V0oI3", + "file_map": { + "50": { + "source": "struct Point {\n x: Field,\n y: Field,\n}\n\nimpl Point {\n fn serialize(self) -> [Field; 2] {\n [self.x, self.y]\n }\n}\n\nfn sum(values: [Field]) -> Field {\n let mut sum = 0;\n for value in values {\n sum = sum + value;\n }\n sum\n}\n\nfn main(points: [Point; 3]) {\n let mut serialized_points = &[];\n for point in points {\n serialized_points = serialized_points.append(point.serialize().as_slice());\n }\n // Do a compile-time check that needs the previous loop to be unrolled\n if serialized_points.len() > 5 {\n let empty_point = Point { x: 0, y: 0 };\n serialized_points = serialized_points.append(empty_point.serialize().as_slice());\n }\n // Do a sum that needs both the previous loop and the previous if to have been simplified\n assert_eq(sum(serialized_points), 21);\n}\n", + "path": "" + } + }, "names": [ "main" ], diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/slice_loop/execute__tests__force_brillig_false_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/slice_loop/execute__tests__force_brillig_false_inliner_9223372036854775807.snap index 214bb7edaf0..f9a4bc8b091 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/slice_loop/execute__tests__force_brillig_false_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/slice_loop/execute__tests__force_brillig_false_inliner_9223372036854775807.snap @@ -42,10 +42,16 @@ expression: artifact "current witness index : _5", "private parameters indices : [_0, _1, _2, _3, _4, _5]", "public parameters indices : []", - "return value indices : []" + "return value indices : []", + "EXPR [ (1, _0) (1, _1) (1, _2) (1, _3) (1, _4) (1, _5) -21 ]" ], - "debug_symbols": "XY5BCsQwCEXv4rqLWfcqw1BsaosgJtikMITefWyYQOlK/3/6tcJCc9km1jXuML4rzMYivE0SA2aO6m49B+hyykbkFty4byU00gyjFpEBDpTShvaE2mpGc/oagHTx6oErC13d+XGBge158UBjnIX+ci0abjR/Uyf942Qx0FKMrqTGPPsH", - "file_map": {}, + "debug_symbols": "pZFBCoMwEEXvMmsXaaI09SqlSIyjBEISYlIo4t0bJba6EApdTWZ+3h+YP0GHbRwaZXo7Qn2foPVKazU02koRlDVpOs0FbG0TPGIawU5PlBMeTYDaRK0LeAod10+jE2atQfikkgLQdKkmw15pXF5z8aXJOcpKmmFW8g9e/cxzUmWe0+sZT895SnnmKbv9t59dDvwjdUIqf7g4EKjLebHzSrQacwp9NHIXSni5Tdlic95K7KLHxW7V0oI3", + "file_map": { + "50": { + "source": "struct Point {\n x: Field,\n y: Field,\n}\n\nimpl Point {\n fn serialize(self) -> [Field; 2] {\n [self.x, self.y]\n }\n}\n\nfn sum(values: [Field]) -> Field {\n let mut sum = 0;\n for value in values {\n sum = sum + value;\n }\n sum\n}\n\nfn main(points: [Point; 3]) {\n let mut serialized_points = &[];\n for point in points {\n serialized_points = serialized_points.append(point.serialize().as_slice());\n }\n // Do a compile-time check that needs the previous loop to be unrolled\n if serialized_points.len() > 5 {\n let empty_point = Point { x: 0, y: 0 };\n serialized_points = serialized_points.append(empty_point.serialize().as_slice());\n }\n // Do a sum that needs both the previous loop and the previous if to have been simplified\n assert_eq(sum(serialized_points), 21);\n}\n", + "path": "" + } + }, "names": [ "main" ], From 38cdd58c070ae552325963f2e1d34a4c070140fa Mon Sep 17 00:00:00 2001 From: Tom French <15848336+TomAFrench@users.noreply.github.com> Date: Wed, 16 Jul 2025 13:19:44 +0000 Subject: [PATCH 3/5] code review --- .../opt/remove_unreachable_instructions.rs | 28 +++++++++---------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/compiler/noirc_evaluator/src/ssa/opt/remove_unreachable_instructions.rs b/compiler/noirc_evaluator/src/ssa/opt/remove_unreachable_instructions.rs index 7e275d4363b..3ea137df79a 100644 --- a/compiler/noirc_evaluator/src/ssa/opt/remove_unreachable_instructions.rs +++ b/compiler/noirc_evaluator/src/ssa/opt/remove_unreachable_instructions.rs @@ -176,29 +176,27 @@ impl Function { Instruction::ArrayGet { array, index, offset } | Instruction::ArraySet { array, index, offset, .. } => { - // Check if the current predicate is known to be enabled. - let is_predicate_constant_one = - match context.dfg.get_numeric_constant(side_effects_condition) { - Some(predicate) => predicate.is_one(), - None => false, // The predicate is a variable - }; - let array_or_slice_type = context.dfg.type_of_value(*array); - match array_or_slice_type { - Type::Slice(_) => (), + let array_op_always_fails = match array_or_slice_type { + Type::Slice(_) => false, array_type @ Type::Array(_, len) => { - if len == 0 { - current_block_reachability = Reachability::Unreachable; - } else if context.dfg.get_numeric_constant(*index).is_some_and(|index| { + len == 0 || context.dfg.get_numeric_constant(*index).is_some_and(|index| { (index.try_to_u32().unwrap() - offset.to_u32()) - >= array_type.flattened_size()}) { - current_block_reachability = if is_predicate_constant_one { Reachability::Unreachable} else {Reachability::UnreachableUnderPredicate}; - } + >= array_type.flattened_size()}) } _ => unreachable!( "Encountered non-array type during array read/write operation" ), + }; + + if array_op_always_fails { + let is_predicate_constant_one = + match context.dfg.get_numeric_constant(side_effects_condition) { + Some(predicate) => predicate.is_one(), + None => false, // The predicate is a variable + }; + current_block_reachability = if is_predicate_constant_one { Reachability::Unreachable } else { Reachability::UnreachableUnderPredicate }; } } _ => (), From c341c82e3d2b607fabd6ca3a61f563fedbe3805e Mon Sep 17 00:00:00 2001 From: Tom French <15848336+TomAFrench@users.noreply.github.com> Date: Wed, 16 Jul 2025 13:26:04 +0000 Subject: [PATCH 4/5] . --- .../opt/remove_unreachable_instructions.rs | 29 +++++++++++-------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/compiler/noirc_evaluator/src/ssa/opt/remove_unreachable_instructions.rs b/compiler/noirc_evaluator/src/ssa/opt/remove_unreachable_instructions.rs index 3ea137df79a..d52fd080d64 100644 --- a/compiler/noirc_evaluator/src/ssa/opt/remove_unreachable_instructions.rs +++ b/compiler/noirc_evaluator/src/ssa/opt/remove_unreachable_instructions.rs @@ -180,23 +180,29 @@ impl Function { let array_op_always_fails = match array_or_slice_type { Type::Slice(_) => false, array_type @ Type::Array(_, len) => { - len == 0 || context.dfg.get_numeric_constant(*index).is_some_and(|index| { - (index.try_to_u32().unwrap() - offset.to_u32()) - >= array_type.flattened_size()}) + len == 0 + || context.dfg.get_numeric_constant(*index).is_some_and(|index| { + (index.try_to_u32().unwrap() - offset.to_u32()) + >= array_type.flattened_size() + }) } - + _ => unreachable!( "Encountered non-array type during array read/write operation" ), }; if array_op_always_fails { - let is_predicate_constant_one = - match context.dfg.get_numeric_constant(side_effects_condition) { - Some(predicate) => predicate.is_one(), - None => false, // The predicate is a variable - }; - current_block_reachability = if is_predicate_constant_one { Reachability::Unreachable } else { Reachability::UnreachableUnderPredicate }; + let is_predicate_constant_one = + match context.dfg.get_numeric_constant(side_effects_condition) { + Some(predicate) => predicate.is_one(), + None => false, // The predicate is a variable + }; + current_block_reachability = if is_predicate_constant_one { + Reachability::Unreachable + } else { + Reachability::UnreachableUnderPredicate + }; } } _ => (), @@ -457,8 +463,7 @@ mod test { } #[test] - fn replaces_sub_that_overflows_with_constraint_under_unknown_side_effects_condition() - { + fn replaces_sub_that_overflows_with_constraint_under_unknown_side_effects_condition() { let src = r#" acir(inline) predicate_pure fn main f0 { b0(v0: u1): From e8a4fd7fa121728e57d3d6c4fd1585d3dd51e50b Mon Sep 17 00:00:00 2001 From: Tom French <15848336+TomAFrench@users.noreply.github.com> Date: Wed, 16 Jul 2025 14:33:20 +0000 Subject: [PATCH 5/5] . --- ...ig_false_inliner_-9223372036854775808.snap | 1433 ++++++++--------- ..._tests__force_brillig_false_inliner_0.snap | 1433 ++++++++--------- ...lig_false_inliner_9223372036854775807.snap | 1433 ++++++++--------- ...ig_false_inliner_-9223372036854775808.snap | 6 +- ..._tests__force_brillig_false_inliner_0.snap | 6 +- ...lig_false_inliner_9223372036854775807.snap | 6 +- 6 files changed, 1980 insertions(+), 2337 deletions(-) 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 328a2e85ff7..c52417fad1f 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 @@ -70,7 +70,7 @@ expression: artifact }, "bytecode": [ "func 0", - "current witness index : _2577", + "current witness index : _2474", "private parameters indices : [_0, _1, _2, _3, _4, _5, _6, _7, _8, _9]", "public parameters indices : [_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41]", "return value indices : []", @@ -119,9 +119,9 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 0 })], outputs: [Simple(Witness(42))]", "EXPR [ (-1, _0, _42) (1, _43) -1 ]", "EXPR [ (-1, _0, _43) 0 ]", - "EXPR [ (1, _0, _43) (-1, _1993) 0 ]", - "EXPR [ (1, _4, _43) (-1, _1994) 0 ]", - "EXPR [ (-1, _44) (1, _1993) (1, _1994) 0 ]", + "EXPR [ (1, _0, _43) (-1, _1912) 0 ]", + "EXPR [ (1, _4, _43) (-1, _1913) 0 ]", + "EXPR [ (-1, _44) (1, _1912) (1, _1913) 0 ]", "BLACKBOX::RANGE [(_44, 32)] []", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(44))], q_c: -4864 })], outputs: [Simple(Witness(45))]", "EXPR [ (1, _44, _45) (-4864, _45) (1, _46) -1 ]", @@ -130,8 +130,8 @@ expression: artifact "MEM (id: 0, read at: EXPR [ (1, _47) 0 ], value: EXPR [ (1, _48) 0 ]) ", "EXPR [ (1, _43, _46) (-1, _49) 0 ]", "INIT (id: 3, len: 4, witnesses: [_1, _2, _3, _4])", - "EXPR [ (1, _44, _49) (-1, _1995) 0 ]", - "EXPR [ (-1, _48, _49) (1, _48) (-1, _50) (1, _1995) 0 ]", + "EXPR [ (1, _44, _49) (-1, _1914) 0 ]", + "EXPR [ (-1, _48, _49) (1, _48) (-1, _50) (1, _1914) 0 ]", "MEM (id: 3, write EXPR [ (1, _50) 0 ] at: EXPR [ (1, _47) 0 ]) ", "EXPR [ (-1, _51) 0 ]", "MEM (id: 3, read at: EXPR [ (1, _51) 0 ], value: EXPR [ (1, _52) 0 ]) ", @@ -140,30 +140,30 @@ expression: artifact "EXPR [ (-1, _55) 2 ]", "MEM (id: 3, read at: EXPR [ (1, _55) 0 ], value: EXPR [ (1, _56) 0 ]) ", "EXPR [ (-1, _3, _49) (1, _49, _56) (1, _3) (-1, _57) 0 ]", - "EXPR [ (1, _43, _44) (-1, _1999) 0 ]", - "EXPR [ (-1, _58) (1, _1994) (1, _1999) 0 ]", + "EXPR [ (1, _43, _44) (-1, _1918) 0 ]", + "EXPR [ (-1, _58) (1, _1913) (1, _1918) 0 ]", "BLACKBOX::RANGE [(_58, 32)] []", - "EXPR [ (1, _43, _57) (-1, _2000) 0 ]", - "EXPR [ (1, _43, _58) (-1, _59) (1, _2000) 0 ]", + "EXPR [ (1, _43, _57) (-1, _1919) 0 ]", + "EXPR [ (1, _43, _58) (-1, _59) (1, _1919) 0 ]", "BLACKBOX::RANGE [(_59, 32)] []", "EXPR [ (-1, _43) (-1, _60) 1 ]", - "EXPR [ (1, _0) (-1, _61) (-1, _1993) (1, _1999) 0 ]", + "EXPR [ (1, _0) (-1, _61) (-1, _1912) (1, _1918) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(59))], q_c: -4864 })], outputs: [Simple(Witness(62))]", "EXPR [ (1, _59, _62) (-4864, _62) (1, _63) -1 ]", "EXPR [ (1, _59, _63) (-4864, _63) 0 ]", "EXPR [ (1, _43, _63) (-1, _64) 0 ]", "EXPR [ (-1, _43, _63) (-1, _65) 1 ]", - "EXPR [ (-1, _4, _49) (1, _4) (-1, _66) (1, _1995) 0 ]", + "EXPR [ (-1, _4, _49) (1, _4) (-1, _66) (1, _1914) 0 ]", "EXPR [ (-1, _2, _49) (1, _49, _54) (1, _2) (-1, _67) 0 ]", - "EXPR [ (1, _43, _59) (-1, _2005) 0 ]", - "EXPR [ (-1, _68) (1, _1994) (1, _2005) 0 ]", + "EXPR [ (1, _43, _59) (-1, _1924) 0 ]", + "EXPR [ (-1, _68) (1, _1913) (1, _1924) 0 ]", "BLACKBOX::RANGE [(_68, 32)] []", - "EXPR [ (1, _43, _68) (-1, _69) (1, _2000) 0 ]", + "EXPR [ (1, _43, _68) (-1, _69) (1, _1919) 0 ]", "BLACKBOX::RANGE [(_69, 32)] []", - "EXPR [ (1, _43, _67) (-1, _2007) 0 ]", - "EXPR [ (1, _43, _69) (-1, _70) (1, _2007) 0 ]", + "EXPR [ (1, _43, _67) (-1, _1926) 0 ]", + "EXPR [ (1, _43, _69) (-1, _70) (1, _1926) 0 ]", "BLACKBOX::RANGE [(_70, 32)] []", - "EXPR [ (1, _60, _61) (-1, _71) (1, _2005) 0 ]", + "EXPR [ (1, _60, _61) (-1, _71) (1, _1924) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(70))], q_c: -4864 })], outputs: [Simple(Witness(72))]", "EXPR [ (1, _70, _72) (-4864, _72) (1, _73) -1 ]", "EXPR [ (1, _70, _73) (-4864, _73) 0 ]", @@ -171,16 +171,16 @@ expression: artifact "EXPR [ (-1, _43, _73) (-1, _75) 1 ]", "EXPR [ (1, _59, _64) (1, _65, _66) (-1, _76) 0 ]", "EXPR [ (-1, _1, _49) (1, _49, _52) (1, _1) (-1, _77) 0 ]", - "EXPR [ (1, _43, _70) (-1, _2014) 0 ]", - "EXPR [ (-1, _78) (1, _1994) (1, _2014) 0 ]", + "EXPR [ (1, _43, _70) (-1, _1933) 0 ]", + "EXPR [ (-1, _78) (1, _1913) (1, _1933) 0 ]", "BLACKBOX::RANGE [(_78, 32)] []", - "EXPR [ (1, _43, _78) (-1, _79) (1, _2000) 0 ]", + "EXPR [ (1, _43, _78) (-1, _79) (1, _1919) 0 ]", "BLACKBOX::RANGE [(_79, 32)] []", - "EXPR [ (1, _43, _79) (-1, _80) (1, _2007) 0 ]", + "EXPR [ (1, _43, _79) (-1, _80) (1, _1926) 0 ]", "BLACKBOX::RANGE [(_80, 32)] []", "EXPR [ (1, _43, _77) (1, _43, _80) (-1, _81) 0 ]", "BLACKBOX::RANGE [(_81, 32)] []", - "EXPR [ (1, _60, _71) (-1, _82) (1, _2014) 0 ]", + "EXPR [ (1, _60, _71) (-1, _82) (1, _1933) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(81))], q_c: -4864 })], outputs: [Simple(Witness(83))]", "EXPR [ (1, _81, _83) (-4864, _83) (1, _84) -1 ]", "EXPR [ (1, _81, _84) (-4864, _84) 0 ]", @@ -193,13 +193,13 @@ expression: artifact "EXPR [ (1, _81, _85) (1, _86, _87) (-1, _90) 0 ]", "EXPR [ (-1, _89) (-1, _91) 1 ]", "EXPR [ (1, _43, _57) (-1, _92) 0 ]", - "EXPR [ (1, _43, _81) (-1, _2024) 0 ]", - "EXPR [ (1, _60, _82) (-1, _2025) 0 ]", - "EXPR [ (-1, _93) (1, _1994) (1, _2024) (1, _2025) 0 ]", + "EXPR [ (1, _43, _81) (-1, _1943) 0 ]", + "EXPR [ (1, _60, _82) (-1, _1944) 0 ]", + "EXPR [ (-1, _93) (1, _1913) (1, _1943) (1, _1944) 0 ]", "EXPR [ (1, _89, _93) (-1, _94) 0 ]", "BLACKBOX::RANGE [(_94, 32)] []", - "EXPR [ (1, _89, _90) (-1, _2026) 0 ]", - "EXPR [ (1, _89, _94) (-1, _95) (1, _2026) 0 ]", + "EXPR [ (1, _89, _90) (-1, _1945) 0 ]", + "EXPR [ (1, _89, _94) (-1, _95) (1, _1945) 0 ]", "BLACKBOX::RANGE [(_95, 32)] []", "EXPR [ (1, _43, _67) (1, _95) (-1, _96) 0 ]", "EXPR [ (1, _89, _96) (-1, _97) 0 ]", @@ -207,7 +207,7 @@ expression: artifact "EXPR [ (1, _43, _77) (1, _97) (-1, _98) 0 ]", "EXPR [ (1, _89, _98) (-1, _99) 0 ]", "BLACKBOX::RANGE [(_99, 32)] []", - "EXPR [ (-1, _100) (1, _2024) (1, _2025) 0 ]", + "EXPR [ (-1, _100) (1, _1943) (1, _1944) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(99))], q_c: -4864 })], outputs: [Simple(Witness(101))]", "EXPR [ (1, _99, _101) (-4864, _101) (1, _102) -1 ]", "EXPR [ (1, _99, _102) (-4864, _102) 0 ]", @@ -217,10 +217,10 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _99) (-1, _106) 0 ]", "EXPR [ (1, _89, _106) (-1, _107) 0 ]", "BLACKBOX::RANGE [(_107, 32)] []", - "EXPR [ (1, _89, _107) (-1, _108) (1, _2026) 0 ]", + "EXPR [ (1, _89, _107) (-1, _108) (1, _1945) 0 ]", "BLACKBOX::RANGE [(_108, 32)] []", - "EXPR [ (1, _57, _89) (-1, _2029) 0 ]", - "EXPR [ (1, _89, _108) (-1, _109) (1, _2029) 0 ]", + "EXPR [ (1, _57, _89) (-1, _1948) 0 ]", + "EXPR [ (1, _89, _108) (-1, _109) (1, _1948) 0 ]", "BLACKBOX::RANGE [(_109, 32)] []", "EXPR [ (1, _43, _77) (1, _109) (-1, _110) 0 ]", "EXPR [ (1, _89, _110) (-1, _111) 0 ]", @@ -236,12 +236,12 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _111) (-1, _119) 0 ]", "EXPR [ (1, _89, _119) (-1, _120) 0 ]", "BLACKBOX::RANGE [(_120, 32)] []", - "EXPR [ (1, _89, _120) (-1, _121) (1, _2026) 0 ]", + "EXPR [ (1, _89, _120) (-1, _121) (1, _1945) 0 ]", "BLACKBOX::RANGE [(_121, 32)] []", - "EXPR [ (1, _89, _121) (-1, _122) (1, _2029) 0 ]", + "EXPR [ (1, _89, _121) (-1, _122) (1, _1948) 0 ]", "BLACKBOX::RANGE [(_122, 32)] []", - "EXPR [ (1, _67, _89) (-1, _2037) 0 ]", - "EXPR [ (1, _89, _122) (-1, _123) (1, _2037) 0 ]", + "EXPR [ (1, _67, _89) (-1, _1956) 0 ]", + "EXPR [ (1, _89, _122) (-1, _123) (1, _1956) 0 ]", "BLACKBOX::RANGE [(_123, 32)] []", "EXPR [ (1, _89, _111) (1, _91, _112) (-1, _124) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(123))], q_c: -4864 })], outputs: [Simple(Witness(125))]", @@ -253,11 +253,11 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _123) (-1, _130) 0 ]", "EXPR [ (1, _89, _130) (-1, _131) 0 ]", "BLACKBOX::RANGE [(_131, 32)] []", - "EXPR [ (1, _89, _131) (-1, _132) (1, _2026) 0 ]", + "EXPR [ (1, _89, _131) (-1, _132) (1, _1945) 0 ]", "BLACKBOX::RANGE [(_132, 32)] []", - "EXPR [ (1, _89, _132) (-1, _133) (1, _2029) 0 ]", + "EXPR [ (1, _89, _132) (-1, _133) (1, _1948) 0 ]", "BLACKBOX::RANGE [(_133, 32)] []", - "EXPR [ (1, _89, _133) (-1, _134) (1, _2037) 0 ]", + "EXPR [ (1, _89, _133) (-1, _134) (1, _1956) 0 ]", "BLACKBOX::RANGE [(_134, 32)] []", "EXPR [ (1, _89, _123) (1, _91, _124) (-1, _135) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(134))], q_c: -4864 })], outputs: [Simple(Witness(136))]", @@ -271,40 +271,40 @@ expression: artifact "EXPR [ (-1, _0, _142) (2, _142) 0 ]", "EXPR [ (1, _134, _138) (1, _139, _140) (-1, _143) 0 ]", "EXPR [ (-1, _142) (-1, _144) 1 ]", - "EXPR [ (1, _91, _105) (-1, _145) (1, _2029) 0 ]", - "EXPR [ (1, _89, _134) (-1, _2053) 0 ]", - "EXPR [ (1, _91, _135) (-1, _2054) 0 ]", - "EXPR [ (-1, _146) (1, _1994) (1, _2053) (1, _2054) 0 ]", + "EXPR [ (1, _91, _105) (-1, _145) (1, _1948) 0 ]", + "EXPR [ (1, _89, _134) (-1, _1972) 0 ]", + "EXPR [ (1, _91, _135) (-1, _1973) 0 ]", + "EXPR [ (-1, _146) (1, _1913) (1, _1972) (1, _1973) 0 ]", "EXPR [ (1, _142, _146) (-1, _147) 0 ]", "BLACKBOX::RANGE [(_147, 32)] []", - "EXPR [ (1, _91, _92) (-1, _2055) 0 ]", - "EXPR [ (1, _147) (-1, _148) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _91, _92) (-1, _1974) 0 ]", + "EXPR [ (1, _147) (-1, _148) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _142, _148) (-1, _149) 0 ]", "BLACKBOX::RANGE [(_149, 32)] []", - "EXPR [ (1, _142, _143) (-1, _2056) 0 ]", - "EXPR [ (1, _142, _149) (-1, _150) (1, _2056) 0 ]", + "EXPR [ (1, _142, _143) (-1, _1975) 0 ]", + "EXPR [ (1, _142, _149) (-1, _150) (1, _1975) 0 ]", "BLACKBOX::RANGE [(_150, 32)] []", - "EXPR [ (1, _91, _118) (-1, _2058) 0 ]", - "EXPR [ (1, _150) (-1, _151) (1, _2037) (1, _2058) 0 ]", + "EXPR [ (1, _91, _118) (-1, _1977) 0 ]", + "EXPR [ (1, _150) (-1, _151) (1, _1956) (1, _1977) 0 ]", "EXPR [ (1, _142, _151) (-1, _152) 0 ]", "BLACKBOX::RANGE [(_152, 32)] []", - "EXPR [ (-1, _153) (1, _2053) (1, _2054) 0 ]", + "EXPR [ (-1, _153) (1, _1972) (1, _1973) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(152))], q_c: -4864 })], outputs: [Simple(Witness(154))]", "EXPR [ (1, _152, _154) (-4864, _154) (1, _155) -1 ]", "EXPR [ (1, _152, _155) (-4864, _155) 0 ]", "EXPR [ (1, _142, _155) (-1, _156) 0 ]", "EXPR [ (-1, _142, _155) (-1, _157) 1 ]", - "EXPR [ (-1, _158) (1, _2037) (1, _2058) 0 ]", + "EXPR [ (-1, _158) (1, _1956) (1, _1977) 0 ]", "EXPR [ (1, _4, _43) (1, _152) (-1, _159) 0 ]", "EXPR [ (1, _142, _159) (-1, _160) 0 ]", "BLACKBOX::RANGE [(_160, 32)] []", - "EXPR [ (1, _160) (-1, _161) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _160) (-1, _161) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _142, _161) (-1, _162) 0 ]", "BLACKBOX::RANGE [(_162, 32)] []", - "EXPR [ (1, _142, _162) (-1, _163) (1, _2056) 0 ]", + "EXPR [ (1, _142, _162) (-1, _163) (1, _1975) 0 ]", "BLACKBOX::RANGE [(_163, 32)] []", - "EXPR [ (1, _57, _142) (-1, _2060) 0 ]", - "EXPR [ (1, _142, _163) (-1, _164) (1, _2060) 0 ]", + "EXPR [ (1, _57, _142) (-1, _1979) 0 ]", + "EXPR [ (1, _142, _163) (-1, _164) (1, _1979) 0 ]", "BLACKBOX::RANGE [(_164, 32)] []", "EXPR [ (1, _142, _152) (1, _144, _153) (-1, _165) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(164))], q_c: -4864 })], outputs: [Simple(Witness(166))]", @@ -316,12 +316,12 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _164) (-1, _171) 0 ]", "EXPR [ (1, _142, _171) (-1, _172) 0 ]", "BLACKBOX::RANGE [(_172, 32)] []", - "EXPR [ (1, _172) (-1, _173) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _172) (-1, _173) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _142, _173) (-1, _174) 0 ]", "BLACKBOX::RANGE [(_174, 32)] []", - "EXPR [ (1, _142, _174) (-1, _175) (1, _2056) 0 ]", + "EXPR [ (1, _142, _174) (-1, _175) (1, _1975) 0 ]", "BLACKBOX::RANGE [(_175, 32)] []", - "EXPR [ (1, _142, _175) (-1, _176) (1, _2060) 0 ]", + "EXPR [ (1, _142, _175) (-1, _176) (1, _1979) 0 ]", "BLACKBOX::RANGE [(_176, 32)] []", "EXPR [ (1, _142, _164) (1, _144, _165) (-1, _177) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(176))], q_c: -4864 })], outputs: [Simple(Witness(178))]", @@ -333,12 +333,12 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _176) (-1, _183) 0 ]", "EXPR [ (1, _142, _183) (-1, _184) 0 ]", "BLACKBOX::RANGE [(_184, 32)] []", - "EXPR [ (1, _184) (-1, _185) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _184) (-1, _185) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _142, _185) (-1, _186) 0 ]", "BLACKBOX::RANGE [(_186, 32)] []", - "EXPR [ (1, _142, _186) (-1, _187) (1, _2056) 0 ]", + "EXPR [ (1, _142, _186) (-1, _187) (1, _1975) 0 ]", "BLACKBOX::RANGE [(_187, 32)] []", - "EXPR [ (1, _142, _187) (-1, _188) (1, _2060) 0 ]", + "EXPR [ (1, _142, _187) (-1, _188) (1, _1979) 0 ]", "BLACKBOX::RANGE [(_188, 32)] []", "EXPR [ (1, _142, _176) (1, _144, _177) (-1, _189) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(188))], q_c: -4864 })], outputs: [Simple(Witness(190))]", @@ -352,23 +352,23 @@ expression: artifact "EXPR [ (-1, _0, _196) (3, _196) 0 ]", "EXPR [ (1, _188, _192) (1, _193, _194) (-1, _197) 0 ]", "EXPR [ (-1, _196) (-1, _198) 1 ]", - "EXPR [ (1, _144, _158) (-1, _199) (1, _2060) 0 ]", - "EXPR [ (1, _142, _188) (-1, _2081) 0 ]", - "EXPR [ (1, _144, _189) (-1, _2082) 0 ]", - "EXPR [ (-1, _200) (1, _1994) (1, _2081) (1, _2082) 0 ]", + "EXPR [ (1, _144, _158) (-1, _199) (1, _1979) 0 ]", + "EXPR [ (1, _142, _188) (-1, _2000) 0 ]", + "EXPR [ (1, _144, _189) (-1, _2001) 0 ]", + "EXPR [ (-1, _200) (1, _1913) (1, _2000) (1, _2001) 0 ]", "EXPR [ (1, _196, _200) (-1, _201) 0 ]", "BLACKBOX::RANGE [(_201, 32)] []", - "EXPR [ (1, _201) (-1, _202) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _201) (-1, _202) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _196, _202) (-1, _203) 0 ]", "BLACKBOX::RANGE [(_203, 32)] []", - "EXPR [ (1, _144, _145) (-1, _2083) 0 ]", - "EXPR [ (1, _203) (-1, _204) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _144, _145) (-1, _2002) 0 ]", + "EXPR [ (1, _203) (-1, _204) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _196, _204) (-1, _205) 0 ]", "BLACKBOX::RANGE [(_205, 32)] []", - "EXPR [ (1, _196, _197) (-1, _2084) 0 ]", - "EXPR [ (1, _196, _205) (-1, _206) (1, _2084) 0 ]", + "EXPR [ (1, _196, _197) (-1, _2003) 0 ]", + "EXPR [ (1, _196, _205) (-1, _206) (1, _2003) 0 ]", "BLACKBOX::RANGE [(_206, 32)] []", - "EXPR [ (-1, _207) (1, _2081) (1, _2082) 0 ]", + "EXPR [ (-1, _207) (1, _2000) (1, _2001) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(206))], q_c: -4864 })], outputs: [Simple(Witness(208))]", "EXPR [ (1, _206, _208) (-4864, _208) (1, _209) -1 ]", "EXPR [ (1, _206, _209) (-4864, _209) 0 ]", @@ -377,13 +377,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _206) (-1, _212) 0 ]", "EXPR [ (1, _196, _212) (-1, _213) 0 ]", "BLACKBOX::RANGE [(_213, 32)] []", - "EXPR [ (1, _213) (-1, _214) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _213) (-1, _214) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _196, _214) (-1, _215) 0 ]", "BLACKBOX::RANGE [(_215, 32)] []", - "EXPR [ (1, _215) (-1, _216) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _215) (-1, _216) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _196, _216) (-1, _217) 0 ]", "BLACKBOX::RANGE [(_217, 32)] []", - "EXPR [ (1, _196, _217) (-1, _218) (1, _2084) 0 ]", + "EXPR [ (1, _196, _217) (-1, _218) (1, _2003) 0 ]", "BLACKBOX::RANGE [(_218, 32)] []", "EXPR [ (1, _196, _206) (1, _198, _207) (-1, _219) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(218))], q_c: -4864 })], outputs: [Simple(Witness(220))]", @@ -395,13 +395,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _218) (-1, _225) 0 ]", "EXPR [ (1, _196, _225) (-1, _226) 0 ]", "BLACKBOX::RANGE [(_226, 32)] []", - "EXPR [ (1, _226) (-1, _227) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _226) (-1, _227) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _196, _227) (-1, _228) 0 ]", "BLACKBOX::RANGE [(_228, 32)] []", - "EXPR [ (1, _228) (-1, _229) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _228) (-1, _229) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _196, _229) (-1, _230) 0 ]", "BLACKBOX::RANGE [(_230, 32)] []", - "EXPR [ (1, _196, _230) (-1, _231) (1, _2084) 0 ]", + "EXPR [ (1, _196, _230) (-1, _231) (1, _2003) 0 ]", "BLACKBOX::RANGE [(_231, 32)] []", "EXPR [ (1, _196, _218) (1, _198, _219) (-1, _232) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(231))], q_c: -4864 })], outputs: [Simple(Witness(233))]", @@ -413,13 +413,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _231) (-1, _238) 0 ]", "EXPR [ (1, _196, _238) (-1, _239) 0 ]", "BLACKBOX::RANGE [(_239, 32)] []", - "EXPR [ (1, _239) (-1, _240) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _239) (-1, _240) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _196, _240) (-1, _241) 0 ]", "BLACKBOX::RANGE [(_241, 32)] []", - "EXPR [ (1, _241) (-1, _242) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _241) (-1, _242) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _196, _242) (-1, _243) 0 ]", "BLACKBOX::RANGE [(_243, 32)] []", - "EXPR [ (1, _196, _243) (-1, _244) (1, _2084) 0 ]", + "EXPR [ (1, _196, _243) (-1, _244) (1, _2003) 0 ]", "BLACKBOX::RANGE [(_244, 32)] []", "EXPR [ (1, _196, _231) (1, _198, _232) (-1, _245) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(244))], q_c: -4864 })], outputs: [Simple(Witness(246))]", @@ -431,23 +431,23 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 4 })], outputs: [Simple(Witness(251))]", "EXPR [ (-1, _0, _251) (4, _251) (1, _252) -1 ]", "EXPR [ (-1, _0, _252) (4, _252) 0 ]", - "EXPR [ (1, _196, _244) (-1, _2101) 0 ]", - "EXPR [ (1, _198, _245) (-1, _2102) 0 ]", - "EXPR [ (-1, _253) (1, _1994) (1, _2101) (1, _2102) 0 ]", + "EXPR [ (1, _196, _244) (-1, _2020) 0 ]", + "EXPR [ (1, _198, _245) (-1, _2021) 0 ]", + "EXPR [ (-1, _253) (1, _1913) (1, _2020) (1, _2021) 0 ]", "EXPR [ (1, _252, _253) (-1, _254) 0 ]", "BLACKBOX::RANGE [(_254, 32)] []", - "EXPR [ (1, _254) (-1, _255) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _254) (-1, _255) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _252, _255) (-1, _256) 0 ]", "BLACKBOX::RANGE [(_256, 32)] []", - "EXPR [ (1, _256) (-1, _257) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _256) (-1, _257) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _252, _257) (-1, _258) 0 ]", "BLACKBOX::RANGE [(_258, 32)] []", - "EXPR [ (1, _198, _199) (-1, _2103) 0 ]", - "EXPR [ (1, _258) (-1, _259) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _198, _199) (-1, _2022) 0 ]", + "EXPR [ (1, _258) (-1, _259) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _252, _259) (-1, _260) 0 ]", "BLACKBOX::RANGE [(_260, 32)] []", "EXPR [ (-1, _252) (-1, _261) 1 ]", - "EXPR [ (-1, _262) (1, _2101) (1, _2102) 0 ]", + "EXPR [ (-1, _262) (1, _2020) (1, _2021) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(260))], q_c: -4864 })], outputs: [Simple(Witness(263))]", "EXPR [ (1, _260, _263) (-4864, _263) (1, _264) -1 ]", "EXPR [ (1, _260, _264) (-4864, _264) 0 ]", @@ -457,13 +457,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _260) (-1, _268) 0 ]", "EXPR [ (1, _252, _268) (-1, _269) 0 ]", "BLACKBOX::RANGE [(_269, 32)] []", - "EXPR [ (1, _269) (-1, _270) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _269) (-1, _270) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _252, _270) (-1, _271) 0 ]", "BLACKBOX::RANGE [(_271, 32)] []", - "EXPR [ (1, _271) (-1, _272) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _271) (-1, _272) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _252, _272) (-1, _273) 0 ]", "BLACKBOX::RANGE [(_273, 32)] []", - "EXPR [ (1, _273) (-1, _274) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _273) (-1, _274) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _252, _274) (-1, _275) 0 ]", "BLACKBOX::RANGE [(_275, 32)] []", "EXPR [ (1, _252, _260) (1, _261, _262) (-1, _276) 0 ]", @@ -476,13 +476,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _275) (-1, _282) 0 ]", "EXPR [ (1, _252, _282) (-1, _283) 0 ]", "BLACKBOX::RANGE [(_283, 32)] []", - "EXPR [ (1, _283) (-1, _284) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _283) (-1, _284) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _252, _284) (-1, _285) 0 ]", "BLACKBOX::RANGE [(_285, 32)] []", - "EXPR [ (1, _285) (-1, _286) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _285) (-1, _286) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _252, _286) (-1, _287) 0 ]", "BLACKBOX::RANGE [(_287, 32)] []", - "EXPR [ (1, _287) (-1, _288) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _287) (-1, _288) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _252, _288) (-1, _289) 0 ]", "BLACKBOX::RANGE [(_289, 32)] []", "EXPR [ (1, _252, _275) (1, _261, _276) (-1, _290) 0 ]", @@ -495,13 +495,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _289) (-1, _296) 0 ]", "EXPR [ (1, _252, _296) (-1, _297) 0 ]", "BLACKBOX::RANGE [(_297, 32)] []", - "EXPR [ (1, _297) (-1, _298) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _297) (-1, _298) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _252, _298) (-1, _299) 0 ]", "BLACKBOX::RANGE [(_299, 32)] []", - "EXPR [ (1, _299) (-1, _300) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _299) (-1, _300) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _252, _300) (-1, _301) 0 ]", "BLACKBOX::RANGE [(_301, 32)] []", - "EXPR [ (1, _301) (-1, _302) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _301) (-1, _302) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _252, _302) (-1, _303) 0 ]", "BLACKBOX::RANGE [(_303, 32)] []", "EXPR [ (1, _252, _289) (1, _261, _290) (-1, _304) 0 ]", @@ -514,22 +514,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 5 })], outputs: [Simple(Witness(310))]", "EXPR [ (-1, _0, _310) (5, _310) (1, _311) -1 ]", "EXPR [ (-1, _0, _311) (5, _311) 0 ]", - "EXPR [ (1, _252, _303) (-1, _2118) 0 ]", - "EXPR [ (1, _261, _304) (-1, _2119) 0 ]", - "EXPR [ (-1, _312) (1, _1994) (1, _2118) (1, _2119) 0 ]", + "EXPR [ (1, _252, _303) (-1, _2037) 0 ]", + "EXPR [ (1, _261, _304) (-1, _2038) 0 ]", + "EXPR [ (-1, _312) (1, _1913) (1, _2037) (1, _2038) 0 ]", "EXPR [ (1, _311, _312) (-1, _313) 0 ]", "BLACKBOX::RANGE [(_313, 32)] []", - "EXPR [ (1, _313) (-1, _314) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _313) (-1, _314) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _311, _314) (-1, _315) 0 ]", "BLACKBOX::RANGE [(_315, 32)] []", - "EXPR [ (1, _315) (-1, _316) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _315) (-1, _316) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _311, _316) (-1, _317) 0 ]", "BLACKBOX::RANGE [(_317, 32)] []", - "EXPR [ (1, _317) (-1, _318) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _317) (-1, _318) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _311, _318) (-1, _319) 0 ]", "BLACKBOX::RANGE [(_319, 32)] []", "EXPR [ (-1, _311) (-1, _320) 1 ]", - "EXPR [ (-1, _321) (1, _2118) (1, _2119) 0 ]", + "EXPR [ (-1, _321) (1, _2037) (1, _2038) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(319))], q_c: -4864 })], outputs: [Simple(Witness(322))]", "EXPR [ (1, _319, _322) (-4864, _322) (1, _323) -1 ]", "EXPR [ (1, _319, _323) (-4864, _323) 0 ]", @@ -539,13 +539,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _319) (-1, _327) 0 ]", "EXPR [ (1, _311, _327) (-1, _328) 0 ]", "BLACKBOX::RANGE [(_328, 32)] []", - "EXPR [ (1, _328) (-1, _329) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _328) (-1, _329) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _311, _329) (-1, _330) 0 ]", "BLACKBOX::RANGE [(_330, 32)] []", - "EXPR [ (1, _330) (-1, _331) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _330) (-1, _331) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _311, _331) (-1, _332) 0 ]", "BLACKBOX::RANGE [(_332, 32)] []", - "EXPR [ (1, _332) (-1, _333) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _332) (-1, _333) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _311, _333) (-1, _334) 0 ]", "BLACKBOX::RANGE [(_334, 32)] []", "EXPR [ (1, _311, _319) (1, _320, _321) (-1, _335) 0 ]", @@ -558,13 +558,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _334) (-1, _341) 0 ]", "EXPR [ (1, _311, _341) (-1, _342) 0 ]", "BLACKBOX::RANGE [(_342, 32)] []", - "EXPR [ (1, _342) (-1, _343) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _342) (-1, _343) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _311, _343) (-1, _344) 0 ]", "BLACKBOX::RANGE [(_344, 32)] []", - "EXPR [ (1, _344) (-1, _345) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _344) (-1, _345) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _311, _345) (-1, _346) 0 ]", "BLACKBOX::RANGE [(_346, 32)] []", - "EXPR [ (1, _346) (-1, _347) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _346) (-1, _347) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _311, _347) (-1, _348) 0 ]", "BLACKBOX::RANGE [(_348, 32)] []", "EXPR [ (1, _311, _334) (1, _320, _335) (-1, _349) 0 ]", @@ -577,13 +577,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _348) (-1, _355) 0 ]", "EXPR [ (1, _311, _355) (-1, _356) 0 ]", "BLACKBOX::RANGE [(_356, 32)] []", - "EXPR [ (1, _356) (-1, _357) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _356) (-1, _357) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _311, _357) (-1, _358) 0 ]", "BLACKBOX::RANGE [(_358, 32)] []", - "EXPR [ (1, _358) (-1, _359) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _358) (-1, _359) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _311, _359) (-1, _360) 0 ]", "BLACKBOX::RANGE [(_360, 32)] []", - "EXPR [ (1, _360) (-1, _361) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _360) (-1, _361) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _311, _361) (-1, _362) 0 ]", "BLACKBOX::RANGE [(_362, 32)] []", "EXPR [ (1, _311, _348) (1, _320, _349) (-1, _363) 0 ]", @@ -596,22 +596,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 6 })], outputs: [Simple(Witness(369))]", "EXPR [ (-1, _0, _369) (6, _369) (1, _370) -1 ]", "EXPR [ (-1, _0, _370) (6, _370) 0 ]", - "EXPR [ (1, _311, _362) (-1, _2134) 0 ]", - "EXPR [ (1, _320, _363) (-1, _2135) 0 ]", - "EXPR [ (-1, _371) (1, _1994) (1, _2134) (1, _2135) 0 ]", + "EXPR [ (1, _311, _362) (-1, _2053) 0 ]", + "EXPR [ (1, _320, _363) (-1, _2054) 0 ]", + "EXPR [ (-1, _371) (1, _1913) (1, _2053) (1, _2054) 0 ]", "EXPR [ (1, _370, _371) (-1, _372) 0 ]", "BLACKBOX::RANGE [(_372, 32)] []", - "EXPR [ (1, _372) (-1, _373) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _372) (-1, _373) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _370, _373) (-1, _374) 0 ]", "BLACKBOX::RANGE [(_374, 32)] []", - "EXPR [ (1, _374) (-1, _375) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _374) (-1, _375) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _370, _375) (-1, _376) 0 ]", "BLACKBOX::RANGE [(_376, 32)] []", - "EXPR [ (1, _376) (-1, _377) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _376) (-1, _377) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _370, _377) (-1, _378) 0 ]", "BLACKBOX::RANGE [(_378, 32)] []", "EXPR [ (-1, _370) (-1, _379) 1 ]", - "EXPR [ (-1, _380) (1, _2134) (1, _2135) 0 ]", + "EXPR [ (-1, _380) (1, _2053) (1, _2054) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(378))], q_c: -4864 })], outputs: [Simple(Witness(381))]", "EXPR [ (1, _378, _381) (-4864, _381) (1, _382) -1 ]", "EXPR [ (1, _378, _382) (-4864, _382) 0 ]", @@ -621,13 +621,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _378) (-1, _386) 0 ]", "EXPR [ (1, _370, _386) (-1, _387) 0 ]", "BLACKBOX::RANGE [(_387, 32)] []", - "EXPR [ (1, _387) (-1, _388) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _387) (-1, _388) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _370, _388) (-1, _389) 0 ]", "BLACKBOX::RANGE [(_389, 32)] []", - "EXPR [ (1, _389) (-1, _390) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _389) (-1, _390) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _370, _390) (-1, _391) 0 ]", "BLACKBOX::RANGE [(_391, 32)] []", - "EXPR [ (1, _391) (-1, _392) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _391) (-1, _392) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _370, _392) (-1, _393) 0 ]", "BLACKBOX::RANGE [(_393, 32)] []", "EXPR [ (1, _370, _378) (1, _379, _380) (-1, _394) 0 ]", @@ -640,13 +640,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _393) (-1, _400) 0 ]", "EXPR [ (1, _370, _400) (-1, _401) 0 ]", "BLACKBOX::RANGE [(_401, 32)] []", - "EXPR [ (1, _401) (-1, _402) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _401) (-1, _402) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _370, _402) (-1, _403) 0 ]", "BLACKBOX::RANGE [(_403, 32)] []", - "EXPR [ (1, _403) (-1, _404) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _403) (-1, _404) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _370, _404) (-1, _405) 0 ]", "BLACKBOX::RANGE [(_405, 32)] []", - "EXPR [ (1, _405) (-1, _406) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _405) (-1, _406) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _370, _406) (-1, _407) 0 ]", "BLACKBOX::RANGE [(_407, 32)] []", "EXPR [ (1, _370, _393) (1, _379, _394) (-1, _408) 0 ]", @@ -659,13 +659,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _407) (-1, _414) 0 ]", "EXPR [ (1, _370, _414) (-1, _415) 0 ]", "BLACKBOX::RANGE [(_415, 32)] []", - "EXPR [ (1, _415) (-1, _416) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _415) (-1, _416) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _370, _416) (-1, _417) 0 ]", "BLACKBOX::RANGE [(_417, 32)] []", - "EXPR [ (1, _417) (-1, _418) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _417) (-1, _418) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _370, _418) (-1, _419) 0 ]", "BLACKBOX::RANGE [(_419, 32)] []", - "EXPR [ (1, _419) (-1, _420) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _419) (-1, _420) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _370, _420) (-1, _421) 0 ]", "BLACKBOX::RANGE [(_421, 32)] []", "EXPR [ (1, _370, _407) (1, _379, _408) (-1, _422) 0 ]", @@ -678,22 +678,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 7 })], outputs: [Simple(Witness(428))]", "EXPR [ (-1, _0, _428) (7, _428) (1, _429) -1 ]", "EXPR [ (-1, _0, _429) (7, _429) 0 ]", - "EXPR [ (1, _370, _421) (-1, _2150) 0 ]", - "EXPR [ (1, _379, _422) (-1, _2151) 0 ]", - "EXPR [ (-1, _430) (1, _1994) (1, _2150) (1, _2151) 0 ]", + "EXPR [ (1, _370, _421) (-1, _2069) 0 ]", + "EXPR [ (1, _379, _422) (-1, _2070) 0 ]", + "EXPR [ (-1, _430) (1, _1913) (1, _2069) (1, _2070) 0 ]", "EXPR [ (1, _429, _430) (-1, _431) 0 ]", "BLACKBOX::RANGE [(_431, 32)] []", - "EXPR [ (1, _431) (-1, _432) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _431) (-1, _432) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _429, _432) (-1, _433) 0 ]", "BLACKBOX::RANGE [(_433, 32)] []", - "EXPR [ (1, _433) (-1, _434) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _433) (-1, _434) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _429, _434) (-1, _435) 0 ]", "BLACKBOX::RANGE [(_435, 32)] []", - "EXPR [ (1, _435) (-1, _436) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _435) (-1, _436) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _429, _436) (-1, _437) 0 ]", "BLACKBOX::RANGE [(_437, 32)] []", "EXPR [ (-1, _429) (-1, _438) 1 ]", - "EXPR [ (-1, _439) (1, _2150) (1, _2151) 0 ]", + "EXPR [ (-1, _439) (1, _2069) (1, _2070) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(437))], q_c: -4864 })], outputs: [Simple(Witness(440))]", "EXPR [ (1, _437, _440) (-4864, _440) (1, _441) -1 ]", "EXPR [ (1, _437, _441) (-4864, _441) 0 ]", @@ -703,13 +703,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _437) (-1, _445) 0 ]", "EXPR [ (1, _429, _445) (-1, _446) 0 ]", "BLACKBOX::RANGE [(_446, 32)] []", - "EXPR [ (1, _446) (-1, _447) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _446) (-1, _447) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _429, _447) (-1, _448) 0 ]", "BLACKBOX::RANGE [(_448, 32)] []", - "EXPR [ (1, _448) (-1, _449) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _448) (-1, _449) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _429, _449) (-1, _450) 0 ]", "BLACKBOX::RANGE [(_450, 32)] []", - "EXPR [ (1, _450) (-1, _451) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _450) (-1, _451) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _429, _451) (-1, _452) 0 ]", "BLACKBOX::RANGE [(_452, 32)] []", "EXPR [ (1, _429, _437) (1, _438, _439) (-1, _453) 0 ]", @@ -722,13 +722,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _452) (-1, _459) 0 ]", "EXPR [ (1, _429, _459) (-1, _460) 0 ]", "BLACKBOX::RANGE [(_460, 32)] []", - "EXPR [ (1, _460) (-1, _461) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _460) (-1, _461) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _429, _461) (-1, _462) 0 ]", "BLACKBOX::RANGE [(_462, 32)] []", - "EXPR [ (1, _462) (-1, _463) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _462) (-1, _463) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _429, _463) (-1, _464) 0 ]", "BLACKBOX::RANGE [(_464, 32)] []", - "EXPR [ (1, _464) (-1, _465) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _464) (-1, _465) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _429, _465) (-1, _466) 0 ]", "BLACKBOX::RANGE [(_466, 32)] []", "EXPR [ (1, _429, _452) (1, _438, _453) (-1, _467) 0 ]", @@ -741,13 +741,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _466) (-1, _473) 0 ]", "EXPR [ (1, _429, _473) (-1, _474) 0 ]", "BLACKBOX::RANGE [(_474, 32)] []", - "EXPR [ (1, _474) (-1, _475) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _474) (-1, _475) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _429, _475) (-1, _476) 0 ]", "BLACKBOX::RANGE [(_476, 32)] []", - "EXPR [ (1, _476) (-1, _477) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _476) (-1, _477) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _429, _477) (-1, _478) 0 ]", "BLACKBOX::RANGE [(_478, 32)] []", - "EXPR [ (1, _478) (-1, _479) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _478) (-1, _479) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _429, _479) (-1, _480) 0 ]", "BLACKBOX::RANGE [(_480, 32)] []", "EXPR [ (1, _429, _466) (1, _438, _467) (-1, _481) 0 ]", @@ -760,22 +760,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 8 })], outputs: [Simple(Witness(487))]", "EXPR [ (-1, _0, _487) (8, _487) (1, _488) -1 ]", "EXPR [ (-1, _0, _488) (8, _488) 0 ]", - "EXPR [ (1, _429, _480) (-1, _2166) 0 ]", - "EXPR [ (1, _438, _481) (-1, _2167) 0 ]", - "EXPR [ (-1, _489) (1, _1994) (1, _2166) (1, _2167) 0 ]", + "EXPR [ (1, _429, _480) (-1, _2085) 0 ]", + "EXPR [ (1, _438, _481) (-1, _2086) 0 ]", + "EXPR [ (-1, _489) (1, _1913) (1, _2085) (1, _2086) 0 ]", "EXPR [ (1, _488, _489) (-1, _490) 0 ]", "BLACKBOX::RANGE [(_490, 32)] []", - "EXPR [ (1, _490) (-1, _491) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _490) (-1, _491) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _488, _491) (-1, _492) 0 ]", "BLACKBOX::RANGE [(_492, 32)] []", - "EXPR [ (1, _492) (-1, _493) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _492) (-1, _493) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _488, _493) (-1, _494) 0 ]", "BLACKBOX::RANGE [(_494, 32)] []", - "EXPR [ (1, _494) (-1, _495) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _494) (-1, _495) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _488, _495) (-1, _496) 0 ]", "BLACKBOX::RANGE [(_496, 32)] []", "EXPR [ (-1, _488) (-1, _497) 1 ]", - "EXPR [ (-1, _498) (1, _2166) (1, _2167) 0 ]", + "EXPR [ (-1, _498) (1, _2085) (1, _2086) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(496))], q_c: -4864 })], outputs: [Simple(Witness(499))]", "EXPR [ (1, _496, _499) (-4864, _499) (1, _500) -1 ]", "EXPR [ (1, _496, _500) (-4864, _500) 0 ]", @@ -785,13 +785,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _496) (-1, _504) 0 ]", "EXPR [ (1, _488, _504) (-1, _505) 0 ]", "BLACKBOX::RANGE [(_505, 32)] []", - "EXPR [ (1, _505) (-1, _506) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _505) (-1, _506) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _488, _506) (-1, _507) 0 ]", "BLACKBOX::RANGE [(_507, 32)] []", - "EXPR [ (1, _507) (-1, _508) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _507) (-1, _508) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _488, _508) (-1, _509) 0 ]", "BLACKBOX::RANGE [(_509, 32)] []", - "EXPR [ (1, _509) (-1, _510) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _509) (-1, _510) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _488, _510) (-1, _511) 0 ]", "BLACKBOX::RANGE [(_511, 32)] []", "EXPR [ (1, _488, _496) (1, _497, _498) (-1, _512) 0 ]", @@ -804,13 +804,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _511) (-1, _518) 0 ]", "EXPR [ (1, _488, _518) (-1, _519) 0 ]", "BLACKBOX::RANGE [(_519, 32)] []", - "EXPR [ (1, _519) (-1, _520) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _519) (-1, _520) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _488, _520) (-1, _521) 0 ]", "BLACKBOX::RANGE [(_521, 32)] []", - "EXPR [ (1, _521) (-1, _522) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _521) (-1, _522) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _488, _522) (-1, _523) 0 ]", "BLACKBOX::RANGE [(_523, 32)] []", - "EXPR [ (1, _523) (-1, _524) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _523) (-1, _524) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _488, _524) (-1, _525) 0 ]", "BLACKBOX::RANGE [(_525, 32)] []", "EXPR [ (1, _488, _511) (1, _497, _512) (-1, _526) 0 ]", @@ -823,13 +823,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _525) (-1, _532) 0 ]", "EXPR [ (1, _488, _532) (-1, _533) 0 ]", "BLACKBOX::RANGE [(_533, 32)] []", - "EXPR [ (1, _533) (-1, _534) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _533) (-1, _534) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _488, _534) (-1, _535) 0 ]", "BLACKBOX::RANGE [(_535, 32)] []", - "EXPR [ (1, _535) (-1, _536) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _535) (-1, _536) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _488, _536) (-1, _537) 0 ]", "BLACKBOX::RANGE [(_537, 32)] []", - "EXPR [ (1, _537) (-1, _538) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _537) (-1, _538) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _488, _538) (-1, _539) 0 ]", "BLACKBOX::RANGE [(_539, 32)] []", "EXPR [ (1, _488, _525) (1, _497, _526) (-1, _540) 0 ]", @@ -842,22 +842,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 9 })], outputs: [Simple(Witness(546))]", "EXPR [ (-1, _0, _546) (9, _546) (1, _547) -1 ]", "EXPR [ (-1, _0, _547) (9, _547) 0 ]", - "EXPR [ (1, _488, _539) (-1, _2182) 0 ]", - "EXPR [ (1, _497, _540) (-1, _2183) 0 ]", - "EXPR [ (-1, _548) (1, _1994) (1, _2182) (1, _2183) 0 ]", + "EXPR [ (1, _488, _539) (-1, _2101) 0 ]", + "EXPR [ (1, _497, _540) (-1, _2102) 0 ]", + "EXPR [ (-1, _548) (1, _1913) (1, _2101) (1, _2102) 0 ]", "EXPR [ (1, _547, _548) (-1, _549) 0 ]", "BLACKBOX::RANGE [(_549, 32)] []", - "EXPR [ (1, _549) (-1, _550) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _549) (-1, _550) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _547, _550) (-1, _551) 0 ]", "BLACKBOX::RANGE [(_551, 32)] []", - "EXPR [ (1, _551) (-1, _552) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _551) (-1, _552) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _547, _552) (-1, _553) 0 ]", "BLACKBOX::RANGE [(_553, 32)] []", - "EXPR [ (1, _553) (-1, _554) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _553) (-1, _554) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _547, _554) (-1, _555) 0 ]", "BLACKBOX::RANGE [(_555, 32)] []", "EXPR [ (-1, _547) (-1, _556) 1 ]", - "EXPR [ (-1, _557) (1, _2182) (1, _2183) 0 ]", + "EXPR [ (-1, _557) (1, _2101) (1, _2102) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(555))], q_c: -4864 })], outputs: [Simple(Witness(558))]", "EXPR [ (1, _555, _558) (-4864, _558) (1, _559) -1 ]", "EXPR [ (1, _555, _559) (-4864, _559) 0 ]", @@ -867,13 +867,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _555) (-1, _563) 0 ]", "EXPR [ (1, _547, _563) (-1, _564) 0 ]", "BLACKBOX::RANGE [(_564, 32)] []", - "EXPR [ (1, _564) (-1, _565) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _564) (-1, _565) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _547, _565) (-1, _566) 0 ]", "BLACKBOX::RANGE [(_566, 32)] []", - "EXPR [ (1, _566) (-1, _567) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _566) (-1, _567) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _547, _567) (-1, _568) 0 ]", "BLACKBOX::RANGE [(_568, 32)] []", - "EXPR [ (1, _568) (-1, _569) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _568) (-1, _569) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _547, _569) (-1, _570) 0 ]", "BLACKBOX::RANGE [(_570, 32)] []", "EXPR [ (1, _547, _555) (1, _556, _557) (-1, _571) 0 ]", @@ -886,13 +886,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _570) (-1, _577) 0 ]", "EXPR [ (1, _547, _577) (-1, _578) 0 ]", "BLACKBOX::RANGE [(_578, 32)] []", - "EXPR [ (1, _578) (-1, _579) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _578) (-1, _579) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _547, _579) (-1, _580) 0 ]", "BLACKBOX::RANGE [(_580, 32)] []", - "EXPR [ (1, _580) (-1, _581) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _580) (-1, _581) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _547, _581) (-1, _582) 0 ]", "BLACKBOX::RANGE [(_582, 32)] []", - "EXPR [ (1, _582) (-1, _583) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _582) (-1, _583) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _547, _583) (-1, _584) 0 ]", "BLACKBOX::RANGE [(_584, 32)] []", "EXPR [ (1, _547, _570) (1, _556, _571) (-1, _585) 0 ]", @@ -905,13 +905,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _584) (-1, _591) 0 ]", "EXPR [ (1, _547, _591) (-1, _592) 0 ]", "BLACKBOX::RANGE [(_592, 32)] []", - "EXPR [ (1, _592) (-1, _593) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _592) (-1, _593) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _547, _593) (-1, _594) 0 ]", "BLACKBOX::RANGE [(_594, 32)] []", - "EXPR [ (1, _594) (-1, _595) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _594) (-1, _595) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _547, _595) (-1, _596) 0 ]", "BLACKBOX::RANGE [(_596, 32)] []", - "EXPR [ (1, _596) (-1, _597) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _596) (-1, _597) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _547, _597) (-1, _598) 0 ]", "BLACKBOX::RANGE [(_598, 32)] []", "EXPR [ (1, _547, _584) (1, _556, _585) (-1, _599) 0 ]", @@ -924,22 +924,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 10 })], outputs: [Simple(Witness(605))]", "EXPR [ (-1, _0, _605) (10, _605) (1, _606) -1 ]", "EXPR [ (-1, _0, _606) (10, _606) 0 ]", - "EXPR [ (1, _547, _598) (-1, _2198) 0 ]", - "EXPR [ (1, _556, _599) (-1, _2199) 0 ]", - "EXPR [ (-1, _607) (1, _1994) (1, _2198) (1, _2199) 0 ]", + "EXPR [ (1, _547, _598) (-1, _2117) 0 ]", + "EXPR [ (1, _556, _599) (-1, _2118) 0 ]", + "EXPR [ (-1, _607) (1, _1913) (1, _2117) (1, _2118) 0 ]", "EXPR [ (1, _606, _607) (-1, _608) 0 ]", "BLACKBOX::RANGE [(_608, 32)] []", - "EXPR [ (1, _608) (-1, _609) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _608) (-1, _609) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _606, _609) (-1, _610) 0 ]", "BLACKBOX::RANGE [(_610, 32)] []", - "EXPR [ (1, _610) (-1, _611) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _610) (-1, _611) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _606, _611) (-1, _612) 0 ]", "BLACKBOX::RANGE [(_612, 32)] []", - "EXPR [ (1, _612) (-1, _613) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _612) (-1, _613) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _606, _613) (-1, _614) 0 ]", "BLACKBOX::RANGE [(_614, 32)] []", "EXPR [ (-1, _606) (-1, _615) 1 ]", - "EXPR [ (-1, _616) (1, _2198) (1, _2199) 0 ]", + "EXPR [ (-1, _616) (1, _2117) (1, _2118) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(614))], q_c: -4864 })], outputs: [Simple(Witness(617))]", "EXPR [ (1, _614, _617) (-4864, _617) (1, _618) -1 ]", "EXPR [ (1, _614, _618) (-4864, _618) 0 ]", @@ -949,13 +949,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _614) (-1, _622) 0 ]", "EXPR [ (1, _606, _622) (-1, _623) 0 ]", "BLACKBOX::RANGE [(_623, 32)] []", - "EXPR [ (1, _623) (-1, _624) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _623) (-1, _624) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _606, _624) (-1, _625) 0 ]", "BLACKBOX::RANGE [(_625, 32)] []", - "EXPR [ (1, _625) (-1, _626) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _625) (-1, _626) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _606, _626) (-1, _627) 0 ]", "BLACKBOX::RANGE [(_627, 32)] []", - "EXPR [ (1, _627) (-1, _628) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _627) (-1, _628) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _606, _628) (-1, _629) 0 ]", "BLACKBOX::RANGE [(_629, 32)] []", "EXPR [ (1, _606, _614) (1, _615, _616) (-1, _630) 0 ]", @@ -968,13 +968,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _629) (-1, _636) 0 ]", "EXPR [ (1, _606, _636) (-1, _637) 0 ]", "BLACKBOX::RANGE [(_637, 32)] []", - "EXPR [ (1, _637) (-1, _638) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _637) (-1, _638) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _606, _638) (-1, _639) 0 ]", "BLACKBOX::RANGE [(_639, 32)] []", - "EXPR [ (1, _639) (-1, _640) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _639) (-1, _640) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _606, _640) (-1, _641) 0 ]", "BLACKBOX::RANGE [(_641, 32)] []", - "EXPR [ (1, _641) (-1, _642) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _641) (-1, _642) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _606, _642) (-1, _643) 0 ]", "BLACKBOX::RANGE [(_643, 32)] []", "EXPR [ (1, _606, _629) (1, _615, _630) (-1, _644) 0 ]", @@ -987,13 +987,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _643) (-1, _650) 0 ]", "EXPR [ (1, _606, _650) (-1, _651) 0 ]", "BLACKBOX::RANGE [(_651, 32)] []", - "EXPR [ (1, _651) (-1, _652) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _651) (-1, _652) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _606, _652) (-1, _653) 0 ]", "BLACKBOX::RANGE [(_653, 32)] []", - "EXPR [ (1, _653) (-1, _654) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _653) (-1, _654) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _606, _654) (-1, _655) 0 ]", "BLACKBOX::RANGE [(_655, 32)] []", - "EXPR [ (1, _655) (-1, _656) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _655) (-1, _656) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _606, _656) (-1, _657) 0 ]", "BLACKBOX::RANGE [(_657, 32)] []", "EXPR [ (1, _606, _643) (1, _615, _644) (-1, _658) 0 ]", @@ -1006,22 +1006,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 11 })], outputs: [Simple(Witness(664))]", "EXPR [ (-1, _0, _664) (11, _664) (1, _665) -1 ]", "EXPR [ (-1, _0, _665) (11, _665) 0 ]", - "EXPR [ (1, _606, _657) (-1, _2214) 0 ]", - "EXPR [ (1, _615, _658) (-1, _2215) 0 ]", - "EXPR [ (-1, _666) (1, _1994) (1, _2214) (1, _2215) 0 ]", + "EXPR [ (1, _606, _657) (-1, _2133) 0 ]", + "EXPR [ (1, _615, _658) (-1, _2134) 0 ]", + "EXPR [ (-1, _666) (1, _1913) (1, _2133) (1, _2134) 0 ]", "EXPR [ (1, _665, _666) (-1, _667) 0 ]", "BLACKBOX::RANGE [(_667, 32)] []", - "EXPR [ (1, _667) (-1, _668) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _667) (-1, _668) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _665, _668) (-1, _669) 0 ]", "BLACKBOX::RANGE [(_669, 32)] []", - "EXPR [ (1, _669) (-1, _670) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _669) (-1, _670) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _665, _670) (-1, _671) 0 ]", "BLACKBOX::RANGE [(_671, 32)] []", - "EXPR [ (1, _671) (-1, _672) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _671) (-1, _672) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _665, _672) (-1, _673) 0 ]", "BLACKBOX::RANGE [(_673, 32)] []", "EXPR [ (-1, _665) (-1, _674) 1 ]", - "EXPR [ (-1, _675) (1, _2214) (1, _2215) 0 ]", + "EXPR [ (-1, _675) (1, _2133) (1, _2134) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(673))], q_c: -4864 })], outputs: [Simple(Witness(676))]", "EXPR [ (1, _673, _676) (-4864, _676) (1, _677) -1 ]", "EXPR [ (1, _673, _677) (-4864, _677) 0 ]", @@ -1031,13 +1031,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _673) (-1, _681) 0 ]", "EXPR [ (1, _665, _681) (-1, _682) 0 ]", "BLACKBOX::RANGE [(_682, 32)] []", - "EXPR [ (1, _682) (-1, _683) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _682) (-1, _683) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _665, _683) (-1, _684) 0 ]", "BLACKBOX::RANGE [(_684, 32)] []", - "EXPR [ (1, _684) (-1, _685) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _684) (-1, _685) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _665, _685) (-1, _686) 0 ]", "BLACKBOX::RANGE [(_686, 32)] []", - "EXPR [ (1, _686) (-1, _687) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _686) (-1, _687) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _665, _687) (-1, _688) 0 ]", "BLACKBOX::RANGE [(_688, 32)] []", "EXPR [ (1, _665, _673) (1, _674, _675) (-1, _689) 0 ]", @@ -1050,13 +1050,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _688) (-1, _695) 0 ]", "EXPR [ (1, _665, _695) (-1, _696) 0 ]", "BLACKBOX::RANGE [(_696, 32)] []", - "EXPR [ (1, _696) (-1, _697) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _696) (-1, _697) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _665, _697) (-1, _698) 0 ]", "BLACKBOX::RANGE [(_698, 32)] []", - "EXPR [ (1, _698) (-1, _699) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _698) (-1, _699) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _665, _699) (-1, _700) 0 ]", "BLACKBOX::RANGE [(_700, 32)] []", - "EXPR [ (1, _700) (-1, _701) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _700) (-1, _701) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _665, _701) (-1, _702) 0 ]", "BLACKBOX::RANGE [(_702, 32)] []", "EXPR [ (1, _665, _688) (1, _674, _689) (-1, _703) 0 ]", @@ -1069,13 +1069,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _702) (-1, _709) 0 ]", "EXPR [ (1, _665, _709) (-1, _710) 0 ]", "BLACKBOX::RANGE [(_710, 32)] []", - "EXPR [ (1, _710) (-1, _711) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _710) (-1, _711) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _665, _711) (-1, _712) 0 ]", "BLACKBOX::RANGE [(_712, 32)] []", - "EXPR [ (1, _712) (-1, _713) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _712) (-1, _713) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _665, _713) (-1, _714) 0 ]", "BLACKBOX::RANGE [(_714, 32)] []", - "EXPR [ (1, _714) (-1, _715) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _714) (-1, _715) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _665, _715) (-1, _716) 0 ]", "BLACKBOX::RANGE [(_716, 32)] []", "EXPR [ (1, _665, _702) (1, _674, _703) (-1, _717) 0 ]", @@ -1088,22 +1088,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 12 })], outputs: [Simple(Witness(723))]", "EXPR [ (-1, _0, _723) (12, _723) (1, _724) -1 ]", "EXPR [ (-1, _0, _724) (12, _724) 0 ]", - "EXPR [ (1, _665, _716) (-1, _2230) 0 ]", - "EXPR [ (1, _674, _717) (-1, _2231) 0 ]", - "EXPR [ (-1, _725) (1, _1994) (1, _2230) (1, _2231) 0 ]", + "EXPR [ (1, _665, _716) (-1, _2149) 0 ]", + "EXPR [ (1, _674, _717) (-1, _2150) 0 ]", + "EXPR [ (-1, _725) (1, _1913) (1, _2149) (1, _2150) 0 ]", "EXPR [ (1, _724, _725) (-1, _726) 0 ]", "BLACKBOX::RANGE [(_726, 32)] []", - "EXPR [ (1, _726) (-1, _727) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _726) (-1, _727) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _724, _727) (-1, _728) 0 ]", "BLACKBOX::RANGE [(_728, 32)] []", - "EXPR [ (1, _728) (-1, _729) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _728) (-1, _729) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _724, _729) (-1, _730) 0 ]", "BLACKBOX::RANGE [(_730, 32)] []", - "EXPR [ (1, _730) (-1, _731) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _730) (-1, _731) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _724, _731) (-1, _732) 0 ]", "BLACKBOX::RANGE [(_732, 32)] []", "EXPR [ (-1, _724) (-1, _733) 1 ]", - "EXPR [ (-1, _734) (1, _2230) (1, _2231) 0 ]", + "EXPR [ (-1, _734) (1, _2149) (1, _2150) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(732))], q_c: -4864 })], outputs: [Simple(Witness(735))]", "EXPR [ (1, _732, _735) (-4864, _735) (1, _736) -1 ]", "EXPR [ (1, _732, _736) (-4864, _736) 0 ]", @@ -1113,13 +1113,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _732) (-1, _740) 0 ]", "EXPR [ (1, _724, _740) (-1, _741) 0 ]", "BLACKBOX::RANGE [(_741, 32)] []", - "EXPR [ (1, _741) (-1, _742) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _741) (-1, _742) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _724, _742) (-1, _743) 0 ]", "BLACKBOX::RANGE [(_743, 32)] []", - "EXPR [ (1, _743) (-1, _744) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _743) (-1, _744) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _724, _744) (-1, _745) 0 ]", "BLACKBOX::RANGE [(_745, 32)] []", - "EXPR [ (1, _745) (-1, _746) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _745) (-1, _746) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _724, _746) (-1, _747) 0 ]", "BLACKBOX::RANGE [(_747, 32)] []", "EXPR [ (1, _724, _732) (1, _733, _734) (-1, _748) 0 ]", @@ -1132,13 +1132,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _747) (-1, _754) 0 ]", "EXPR [ (1, _724, _754) (-1, _755) 0 ]", "BLACKBOX::RANGE [(_755, 32)] []", - "EXPR [ (1, _755) (-1, _756) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _755) (-1, _756) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _724, _756) (-1, _757) 0 ]", "BLACKBOX::RANGE [(_757, 32)] []", - "EXPR [ (1, _757) (-1, _758) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _757) (-1, _758) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _724, _758) (-1, _759) 0 ]", "BLACKBOX::RANGE [(_759, 32)] []", - "EXPR [ (1, _759) (-1, _760) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _759) (-1, _760) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _724, _760) (-1, _761) 0 ]", "BLACKBOX::RANGE [(_761, 32)] []", "EXPR [ (1, _724, _747) (1, _733, _748) (-1, _762) 0 ]", @@ -1151,13 +1151,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _761) (-1, _768) 0 ]", "EXPR [ (1, _724, _768) (-1, _769) 0 ]", "BLACKBOX::RANGE [(_769, 32)] []", - "EXPR [ (1, _769) (-1, _770) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _769) (-1, _770) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _724, _770) (-1, _771) 0 ]", "BLACKBOX::RANGE [(_771, 32)] []", - "EXPR [ (1, _771) (-1, _772) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _771) (-1, _772) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _724, _772) (-1, _773) 0 ]", "BLACKBOX::RANGE [(_773, 32)] []", - "EXPR [ (1, _773) (-1, _774) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _773) (-1, _774) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _724, _774) (-1, _775) 0 ]", "BLACKBOX::RANGE [(_775, 32)] []", "EXPR [ (1, _724, _761) (1, _733, _762) (-1, _776) 0 ]", @@ -1170,22 +1170,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 13 })], outputs: [Simple(Witness(782))]", "EXPR [ (-1, _0, _782) (13, _782) (1, _783) -1 ]", "EXPR [ (-1, _0, _783) (13, _783) 0 ]", - "EXPR [ (1, _724, _775) (-1, _2246) 0 ]", - "EXPR [ (1, _733, _776) (-1, _2247) 0 ]", - "EXPR [ (-1, _784) (1, _1994) (1, _2246) (1, _2247) 0 ]", + "EXPR [ (1, _724, _775) (-1, _2165) 0 ]", + "EXPR [ (1, _733, _776) (-1, _2166) 0 ]", + "EXPR [ (-1, _784) (1, _1913) (1, _2165) (1, _2166) 0 ]", "EXPR [ (1, _783, _784) (-1, _785) 0 ]", "BLACKBOX::RANGE [(_785, 32)] []", - "EXPR [ (1, _785) (-1, _786) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _785) (-1, _786) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _783, _786) (-1, _787) 0 ]", "BLACKBOX::RANGE [(_787, 32)] []", - "EXPR [ (1, _787) (-1, _788) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _787) (-1, _788) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _783, _788) (-1, _789) 0 ]", "BLACKBOX::RANGE [(_789, 32)] []", - "EXPR [ (1, _789) (-1, _790) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _789) (-1, _790) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _783, _790) (-1, _791) 0 ]", "BLACKBOX::RANGE [(_791, 32)] []", "EXPR [ (-1, _783) (-1, _792) 1 ]", - "EXPR [ (-1, _793) (1, _2246) (1, _2247) 0 ]", + "EXPR [ (-1, _793) (1, _2165) (1, _2166) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(791))], q_c: -4864 })], outputs: [Simple(Witness(794))]", "EXPR [ (1, _791, _794) (-4864, _794) (1, _795) -1 ]", "EXPR [ (1, _791, _795) (-4864, _795) 0 ]", @@ -1195,13 +1195,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _791) (-1, _799) 0 ]", "EXPR [ (1, _783, _799) (-1, _800) 0 ]", "BLACKBOX::RANGE [(_800, 32)] []", - "EXPR [ (1, _800) (-1, _801) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _800) (-1, _801) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _783, _801) (-1, _802) 0 ]", "BLACKBOX::RANGE [(_802, 32)] []", - "EXPR [ (1, _802) (-1, _803) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _802) (-1, _803) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _783, _803) (-1, _804) 0 ]", "BLACKBOX::RANGE [(_804, 32)] []", - "EXPR [ (1, _804) (-1, _805) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _804) (-1, _805) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _783, _805) (-1, _806) 0 ]", "BLACKBOX::RANGE [(_806, 32)] []", "EXPR [ (1, _783, _791) (1, _792, _793) (-1, _807) 0 ]", @@ -1214,13 +1214,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _806) (-1, _813) 0 ]", "EXPR [ (1, _783, _813) (-1, _814) 0 ]", "BLACKBOX::RANGE [(_814, 32)] []", - "EXPR [ (1, _814) (-1, _815) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _814) (-1, _815) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _783, _815) (-1, _816) 0 ]", "BLACKBOX::RANGE [(_816, 32)] []", - "EXPR [ (1, _816) (-1, _817) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _816) (-1, _817) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _783, _817) (-1, _818) 0 ]", "BLACKBOX::RANGE [(_818, 32)] []", - "EXPR [ (1, _818) (-1, _819) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _818) (-1, _819) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _783, _819) (-1, _820) 0 ]", "BLACKBOX::RANGE [(_820, 32)] []", "EXPR [ (1, _783, _806) (1, _792, _807) (-1, _821) 0 ]", @@ -1233,13 +1233,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _820) (-1, _827) 0 ]", "EXPR [ (1, _783, _827) (-1, _828) 0 ]", "BLACKBOX::RANGE [(_828, 32)] []", - "EXPR [ (1, _828) (-1, _829) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _828) (-1, _829) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _783, _829) (-1, _830) 0 ]", "BLACKBOX::RANGE [(_830, 32)] []", - "EXPR [ (1, _830) (-1, _831) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _830) (-1, _831) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _783, _831) (-1, _832) 0 ]", "BLACKBOX::RANGE [(_832, 32)] []", - "EXPR [ (1, _832) (-1, _833) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _832) (-1, _833) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _783, _833) (-1, _834) 0 ]", "BLACKBOX::RANGE [(_834, 32)] []", "EXPR [ (1, _783, _820) (1, _792, _821) (-1, _835) 0 ]", @@ -1252,22 +1252,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 14 })], outputs: [Simple(Witness(841))]", "EXPR [ (-1, _0, _841) (14, _841) (1, _842) -1 ]", "EXPR [ (-1, _0, _842) (14, _842) 0 ]", - "EXPR [ (1, _783, _834) (-1, _2262) 0 ]", - "EXPR [ (1, _792, _835) (-1, _2263) 0 ]", - "EXPR [ (-1, _843) (1, _1994) (1, _2262) (1, _2263) 0 ]", + "EXPR [ (1, _783, _834) (-1, _2181) 0 ]", + "EXPR [ (1, _792, _835) (-1, _2182) 0 ]", + "EXPR [ (-1, _843) (1, _1913) (1, _2181) (1, _2182) 0 ]", "EXPR [ (1, _842, _843) (-1, _844) 0 ]", "BLACKBOX::RANGE [(_844, 32)] []", - "EXPR [ (1, _844) (-1, _845) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _844) (-1, _845) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _842, _845) (-1, _846) 0 ]", "BLACKBOX::RANGE [(_846, 32)] []", - "EXPR [ (1, _846) (-1, _847) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _846) (-1, _847) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _842, _847) (-1, _848) 0 ]", "BLACKBOX::RANGE [(_848, 32)] []", - "EXPR [ (1, _848) (-1, _849) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _848) (-1, _849) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _842, _849) (-1, _850) 0 ]", "BLACKBOX::RANGE [(_850, 32)] []", "EXPR [ (-1, _842) (-1, _851) 1 ]", - "EXPR [ (-1, _852) (1, _2262) (1, _2263) 0 ]", + "EXPR [ (-1, _852) (1, _2181) (1, _2182) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(850))], q_c: -4864 })], outputs: [Simple(Witness(853))]", "EXPR [ (1, _850, _853) (-4864, _853) (1, _854) -1 ]", "EXPR [ (1, _850, _854) (-4864, _854) 0 ]", @@ -1277,13 +1277,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _850) (-1, _858) 0 ]", "EXPR [ (1, _842, _858) (-1, _859) 0 ]", "BLACKBOX::RANGE [(_859, 32)] []", - "EXPR [ (1, _859) (-1, _860) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _859) (-1, _860) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _842, _860) (-1, _861) 0 ]", "BLACKBOX::RANGE [(_861, 32)] []", - "EXPR [ (1, _861) (-1, _862) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _861) (-1, _862) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _842, _862) (-1, _863) 0 ]", "BLACKBOX::RANGE [(_863, 32)] []", - "EXPR [ (1, _863) (-1, _864) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _863) (-1, _864) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _842, _864) (-1, _865) 0 ]", "BLACKBOX::RANGE [(_865, 32)] []", "EXPR [ (1, _842, _850) (1, _851, _852) (-1, _866) 0 ]", @@ -1296,13 +1296,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _865) (-1, _872) 0 ]", "EXPR [ (1, _842, _872) (-1, _873) 0 ]", "BLACKBOX::RANGE [(_873, 32)] []", - "EXPR [ (1, _873) (-1, _874) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _873) (-1, _874) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _842, _874) (-1, _875) 0 ]", "BLACKBOX::RANGE [(_875, 32)] []", - "EXPR [ (1, _875) (-1, _876) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _875) (-1, _876) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _842, _876) (-1, _877) 0 ]", "BLACKBOX::RANGE [(_877, 32)] []", - "EXPR [ (1, _877) (-1, _878) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _877) (-1, _878) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _842, _878) (-1, _879) 0 ]", "BLACKBOX::RANGE [(_879, 32)] []", "EXPR [ (1, _842, _865) (1, _851, _866) (-1, _880) 0 ]", @@ -1315,13 +1315,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _879) (-1, _886) 0 ]", "EXPR [ (1, _842, _886) (-1, _887) 0 ]", "BLACKBOX::RANGE [(_887, 32)] []", - "EXPR [ (1, _887) (-1, _888) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _887) (-1, _888) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _842, _888) (-1, _889) 0 ]", "BLACKBOX::RANGE [(_889, 32)] []", - "EXPR [ (1, _889) (-1, _890) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _889) (-1, _890) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _842, _890) (-1, _891) 0 ]", "BLACKBOX::RANGE [(_891, 32)] []", - "EXPR [ (1, _891) (-1, _892) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _891) (-1, _892) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _842, _892) (-1, _893) 0 ]", "BLACKBOX::RANGE [(_893, 32)] []", "EXPR [ (1, _842, _879) (1, _851, _880) (-1, _894) 0 ]", @@ -1334,22 +1334,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 15 })], outputs: [Simple(Witness(900))]", "EXPR [ (-1, _0, _900) (15, _900) (1, _901) -1 ]", "EXPR [ (-1, _0, _901) (15, _901) 0 ]", - "EXPR [ (1, _842, _893) (-1, _2278) 0 ]", - "EXPR [ (1, _851, _894) (-1, _2279) 0 ]", - "EXPR [ (-1, _902) (1, _1994) (1, _2278) (1, _2279) 0 ]", + "EXPR [ (1, _842, _893) (-1, _2197) 0 ]", + "EXPR [ (1, _851, _894) (-1, _2198) 0 ]", + "EXPR [ (-1, _902) (1, _1913) (1, _2197) (1, _2198) 0 ]", "EXPR [ (1, _901, _902) (-1, _903) 0 ]", "BLACKBOX::RANGE [(_903, 32)] []", - "EXPR [ (1, _903) (-1, _904) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _903) (-1, _904) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _901, _904) (-1, _905) 0 ]", "BLACKBOX::RANGE [(_905, 32)] []", - "EXPR [ (1, _905) (-1, _906) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _905) (-1, _906) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _901, _906) (-1, _907) 0 ]", "BLACKBOX::RANGE [(_907, 32)] []", - "EXPR [ (1, _907) (-1, _908) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _907) (-1, _908) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _901, _908) (-1, _909) 0 ]", "BLACKBOX::RANGE [(_909, 32)] []", "EXPR [ (-1, _901) (-1, _910) 1 ]", - "EXPR [ (-1, _911) (1, _2278) (1, _2279) 0 ]", + "EXPR [ (-1, _911) (1, _2197) (1, _2198) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(909))], q_c: -4864 })], outputs: [Simple(Witness(912))]", "EXPR [ (1, _909, _912) (-4864, _912) (1, _913) -1 ]", "EXPR [ (1, _909, _913) (-4864, _913) 0 ]", @@ -1359,13 +1359,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _909) (-1, _917) 0 ]", "EXPR [ (1, _901, _917) (-1, _918) 0 ]", "BLACKBOX::RANGE [(_918, 32)] []", - "EXPR [ (1, _918) (-1, _919) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _918) (-1, _919) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _901, _919) (-1, _920) 0 ]", "BLACKBOX::RANGE [(_920, 32)] []", - "EXPR [ (1, _920) (-1, _921) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _920) (-1, _921) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _901, _921) (-1, _922) 0 ]", "BLACKBOX::RANGE [(_922, 32)] []", - "EXPR [ (1, _922) (-1, _923) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _922) (-1, _923) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _901, _923) (-1, _924) 0 ]", "BLACKBOX::RANGE [(_924, 32)] []", "EXPR [ (1, _901, _909) (1, _910, _911) (-1, _925) 0 ]", @@ -1378,13 +1378,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _924) (-1, _931) 0 ]", "EXPR [ (1, _901, _931) (-1, _932) 0 ]", "BLACKBOX::RANGE [(_932, 32)] []", - "EXPR [ (1, _932) (-1, _933) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _932) (-1, _933) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _901, _933) (-1, _934) 0 ]", "BLACKBOX::RANGE [(_934, 32)] []", - "EXPR [ (1, _934) (-1, _935) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _934) (-1, _935) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _901, _935) (-1, _936) 0 ]", "BLACKBOX::RANGE [(_936, 32)] []", - "EXPR [ (1, _936) (-1, _937) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _936) (-1, _937) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _901, _937) (-1, _938) 0 ]", "BLACKBOX::RANGE [(_938, 32)] []", "EXPR [ (1, _901, _924) (1, _910, _925) (-1, _939) 0 ]", @@ -1397,13 +1397,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _938) (-1, _945) 0 ]", "EXPR [ (1, _901, _945) (-1, _946) 0 ]", "BLACKBOX::RANGE [(_946, 32)] []", - "EXPR [ (1, _946) (-1, _947) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _946) (-1, _947) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _901, _947) (-1, _948) 0 ]", "BLACKBOX::RANGE [(_948, 32)] []", - "EXPR [ (1, _948) (-1, _949) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _948) (-1, _949) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _901, _949) (-1, _950) 0 ]", "BLACKBOX::RANGE [(_950, 32)] []", - "EXPR [ (1, _950) (-1, _951) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _950) (-1, _951) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _901, _951) (-1, _952) 0 ]", "BLACKBOX::RANGE [(_952, 32)] []", "EXPR [ (1, _901, _938) (1, _910, _939) (-1, _953) 0 ]", @@ -1416,22 +1416,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 16 })], outputs: [Simple(Witness(959))]", "EXPR [ (-1, _0, _959) (16, _959) (1, _960) -1 ]", "EXPR [ (-1, _0, _960) (16, _960) 0 ]", - "EXPR [ (1, _901, _952) (-1, _2294) 0 ]", - "EXPR [ (1, _910, _953) (-1, _2295) 0 ]", - "EXPR [ (-1, _961) (1, _1994) (1, _2294) (1, _2295) 0 ]", + "EXPR [ (1, _901, _952) (-1, _2213) 0 ]", + "EXPR [ (1, _910, _953) (-1, _2214) 0 ]", + "EXPR [ (-1, _961) (1, _1913) (1, _2213) (1, _2214) 0 ]", "EXPR [ (1, _960, _961) (-1, _962) 0 ]", "BLACKBOX::RANGE [(_962, 32)] []", - "EXPR [ (1, _962) (-1, _963) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _962) (-1, _963) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _960, _963) (-1, _964) 0 ]", "BLACKBOX::RANGE [(_964, 32)] []", - "EXPR [ (1, _964) (-1, _965) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _964) (-1, _965) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _960, _965) (-1, _966) 0 ]", "BLACKBOX::RANGE [(_966, 32)] []", - "EXPR [ (1, _966) (-1, _967) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _966) (-1, _967) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _960, _967) (-1, _968) 0 ]", "BLACKBOX::RANGE [(_968, 32)] []", "EXPR [ (-1, _960) (-1, _969) 1 ]", - "EXPR [ (-1, _970) (1, _2294) (1, _2295) 0 ]", + "EXPR [ (-1, _970) (1, _2213) (1, _2214) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(968))], q_c: -4864 })], outputs: [Simple(Witness(971))]", "EXPR [ (1, _968, _971) (-4864, _971) (1, _972) -1 ]", "EXPR [ (1, _968, _972) (-4864, _972) 0 ]", @@ -1441,13 +1441,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _968) (-1, _976) 0 ]", "EXPR [ (1, _960, _976) (-1, _977) 0 ]", "BLACKBOX::RANGE [(_977, 32)] []", - "EXPR [ (1, _977) (-1, _978) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _977) (-1, _978) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _960, _978) (-1, _979) 0 ]", "BLACKBOX::RANGE [(_979, 32)] []", - "EXPR [ (1, _979) (-1, _980) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _979) (-1, _980) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _960, _980) (-1, _981) 0 ]", "BLACKBOX::RANGE [(_981, 32)] []", - "EXPR [ (1, _981) (-1, _982) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _981) (-1, _982) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _960, _982) (-1, _983) 0 ]", "BLACKBOX::RANGE [(_983, 32)] []", "EXPR [ (1, _960, _968) (1, _969, _970) (-1, _984) 0 ]", @@ -1460,13 +1460,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _983) (-1, _990) 0 ]", "EXPR [ (1, _960, _990) (-1, _991) 0 ]", "BLACKBOX::RANGE [(_991, 32)] []", - "EXPR [ (1, _991) (-1, _992) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _991) (-1, _992) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _960, _992) (-1, _993) 0 ]", "BLACKBOX::RANGE [(_993, 32)] []", - "EXPR [ (1, _993) (-1, _994) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _993) (-1, _994) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _960, _994) (-1, _995) 0 ]", "BLACKBOX::RANGE [(_995, 32)] []", - "EXPR [ (1, _995) (-1, _996) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _995) (-1, _996) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _960, _996) (-1, _997) 0 ]", "BLACKBOX::RANGE [(_997, 32)] []", "EXPR [ (1, _960, _983) (1, _969, _984) (-1, _998) 0 ]", @@ -1479,13 +1479,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _997) (-1, _1004) 0 ]", "EXPR [ (1, _960, _1004) (-1, _1005) 0 ]", "BLACKBOX::RANGE [(_1005, 32)] []", - "EXPR [ (1, _1005) (-1, _1006) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1005) (-1, _1006) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _960, _1006) (-1, _1007) 0 ]", "BLACKBOX::RANGE [(_1007, 32)] []", - "EXPR [ (1, _1007) (-1, _1008) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1007) (-1, _1008) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _960, _1008) (-1, _1009) 0 ]", "BLACKBOX::RANGE [(_1009, 32)] []", - "EXPR [ (1, _1009) (-1, _1010) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1009) (-1, _1010) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _960, _1010) (-1, _1011) 0 ]", "BLACKBOX::RANGE [(_1011, 32)] []", "EXPR [ (1, _960, _997) (1, _969, _998) (-1, _1012) 0 ]", @@ -1498,22 +1498,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 17 })], outputs: [Simple(Witness(1018))]", "EXPR [ (-1, _0, _1018) (17, _1018) (1, _1019) -1 ]", "EXPR [ (-1, _0, _1019) (17, _1019) 0 ]", - "EXPR [ (1, _960, _1011) (-1, _2310) 0 ]", - "EXPR [ (1, _969, _1012) (-1, _2311) 0 ]", - "EXPR [ (-1, _1020) (1, _1994) (1, _2310) (1, _2311) 0 ]", + "EXPR [ (1, _960, _1011) (-1, _2229) 0 ]", + "EXPR [ (1, _969, _1012) (-1, _2230) 0 ]", + "EXPR [ (-1, _1020) (1, _1913) (1, _2229) (1, _2230) 0 ]", "EXPR [ (1, _1019, _1020) (-1, _1021) 0 ]", "BLACKBOX::RANGE [(_1021, 32)] []", - "EXPR [ (1, _1021) (-1, _1022) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1021) (-1, _1022) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1019, _1022) (-1, _1023) 0 ]", "BLACKBOX::RANGE [(_1023, 32)] []", - "EXPR [ (1, _1023) (-1, _1024) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1023) (-1, _1024) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1019, _1024) (-1, _1025) 0 ]", "BLACKBOX::RANGE [(_1025, 32)] []", - "EXPR [ (1, _1025) (-1, _1026) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1025) (-1, _1026) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1019, _1026) (-1, _1027) 0 ]", "BLACKBOX::RANGE [(_1027, 32)] []", "EXPR [ (-1, _1019) (-1, _1028) 1 ]", - "EXPR [ (-1, _1029) (1, _2310) (1, _2311) 0 ]", + "EXPR [ (-1, _1029) (1, _2229) (1, _2230) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1027))], q_c: -4864 })], outputs: [Simple(Witness(1030))]", "EXPR [ (1, _1027, _1030) (-4864, _1030) (1, _1031) -1 ]", "EXPR [ (1, _1027, _1031) (-4864, _1031) 0 ]", @@ -1523,13 +1523,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1027) (-1, _1035) 0 ]", "EXPR [ (1, _1019, _1035) (-1, _1036) 0 ]", "BLACKBOX::RANGE [(_1036, 32)] []", - "EXPR [ (1, _1036) (-1, _1037) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1036) (-1, _1037) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1019, _1037) (-1, _1038) 0 ]", "BLACKBOX::RANGE [(_1038, 32)] []", - "EXPR [ (1, _1038) (-1, _1039) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1038) (-1, _1039) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1019, _1039) (-1, _1040) 0 ]", "BLACKBOX::RANGE [(_1040, 32)] []", - "EXPR [ (1, _1040) (-1, _1041) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1040) (-1, _1041) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1019, _1041) (-1, _1042) 0 ]", "BLACKBOX::RANGE [(_1042, 32)] []", "EXPR [ (1, _1019, _1027) (1, _1028, _1029) (-1, _1043) 0 ]", @@ -1542,13 +1542,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1042) (-1, _1049) 0 ]", "EXPR [ (1, _1019, _1049) (-1, _1050) 0 ]", "BLACKBOX::RANGE [(_1050, 32)] []", - "EXPR [ (1, _1050) (-1, _1051) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1050) (-1, _1051) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1019, _1051) (-1, _1052) 0 ]", "BLACKBOX::RANGE [(_1052, 32)] []", - "EXPR [ (1, _1052) (-1, _1053) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1052) (-1, _1053) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1019, _1053) (-1, _1054) 0 ]", "BLACKBOX::RANGE [(_1054, 32)] []", - "EXPR [ (1, _1054) (-1, _1055) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1054) (-1, _1055) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1019, _1055) (-1, _1056) 0 ]", "BLACKBOX::RANGE [(_1056, 32)] []", "EXPR [ (1, _1019, _1042) (1, _1028, _1043) (-1, _1057) 0 ]", @@ -1561,13 +1561,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1056) (-1, _1063) 0 ]", "EXPR [ (1, _1019, _1063) (-1, _1064) 0 ]", "BLACKBOX::RANGE [(_1064, 32)] []", - "EXPR [ (1, _1064) (-1, _1065) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1064) (-1, _1065) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1019, _1065) (-1, _1066) 0 ]", "BLACKBOX::RANGE [(_1066, 32)] []", - "EXPR [ (1, _1066) (-1, _1067) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1066) (-1, _1067) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1019, _1067) (-1, _1068) 0 ]", "BLACKBOX::RANGE [(_1068, 32)] []", - "EXPR [ (1, _1068) (-1, _1069) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1068) (-1, _1069) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1019, _1069) (-1, _1070) 0 ]", "BLACKBOX::RANGE [(_1070, 32)] []", "EXPR [ (1, _1019, _1056) (1, _1028, _1057) (-1, _1071) 0 ]", @@ -1580,22 +1580,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 18 })], outputs: [Simple(Witness(1077))]", "EXPR [ (-1, _0, _1077) (18, _1077) (1, _1078) -1 ]", "EXPR [ (-1, _0, _1078) (18, _1078) 0 ]", - "EXPR [ (1, _1019, _1070) (-1, _2326) 0 ]", - "EXPR [ (1, _1028, _1071) (-1, _2327) 0 ]", - "EXPR [ (-1, _1079) (1, _1994) (1, _2326) (1, _2327) 0 ]", + "EXPR [ (1, _1019, _1070) (-1, _2245) 0 ]", + "EXPR [ (1, _1028, _1071) (-1, _2246) 0 ]", + "EXPR [ (-1, _1079) (1, _1913) (1, _2245) (1, _2246) 0 ]", "EXPR [ (1, _1078, _1079) (-1, _1080) 0 ]", "BLACKBOX::RANGE [(_1080, 32)] []", - "EXPR [ (1, _1080) (-1, _1081) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1080) (-1, _1081) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1078, _1081) (-1, _1082) 0 ]", "BLACKBOX::RANGE [(_1082, 32)] []", - "EXPR [ (1, _1082) (-1, _1083) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1082) (-1, _1083) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1078, _1083) (-1, _1084) 0 ]", "BLACKBOX::RANGE [(_1084, 32)] []", - "EXPR [ (1, _1084) (-1, _1085) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1084) (-1, _1085) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1078, _1085) (-1, _1086) 0 ]", "BLACKBOX::RANGE [(_1086, 32)] []", "EXPR [ (-1, _1078) (-1, _1087) 1 ]", - "EXPR [ (-1, _1088) (1, _2326) (1, _2327) 0 ]", + "EXPR [ (-1, _1088) (1, _2245) (1, _2246) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1086))], q_c: -4864 })], outputs: [Simple(Witness(1089))]", "EXPR [ (1, _1086, _1089) (-4864, _1089) (1, _1090) -1 ]", "EXPR [ (1, _1086, _1090) (-4864, _1090) 0 ]", @@ -1605,13 +1605,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1086) (-1, _1094) 0 ]", "EXPR [ (1, _1078, _1094) (-1, _1095) 0 ]", "BLACKBOX::RANGE [(_1095, 32)] []", - "EXPR [ (1, _1095) (-1, _1096) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1095) (-1, _1096) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1078, _1096) (-1, _1097) 0 ]", "BLACKBOX::RANGE [(_1097, 32)] []", - "EXPR [ (1, _1097) (-1, _1098) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1097) (-1, _1098) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1078, _1098) (-1, _1099) 0 ]", "BLACKBOX::RANGE [(_1099, 32)] []", - "EXPR [ (1, _1099) (-1, _1100) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1099) (-1, _1100) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1078, _1100) (-1, _1101) 0 ]", "BLACKBOX::RANGE [(_1101, 32)] []", "EXPR [ (1, _1078, _1086) (1, _1087, _1088) (-1, _1102) 0 ]", @@ -1624,13 +1624,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1101) (-1, _1108) 0 ]", "EXPR [ (1, _1078, _1108) (-1, _1109) 0 ]", "BLACKBOX::RANGE [(_1109, 32)] []", - "EXPR [ (1, _1109) (-1, _1110) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1109) (-1, _1110) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1078, _1110) (-1, _1111) 0 ]", "BLACKBOX::RANGE [(_1111, 32)] []", - "EXPR [ (1, _1111) (-1, _1112) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1111) (-1, _1112) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1078, _1112) (-1, _1113) 0 ]", "BLACKBOX::RANGE [(_1113, 32)] []", - "EXPR [ (1, _1113) (-1, _1114) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1113) (-1, _1114) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1078, _1114) (-1, _1115) 0 ]", "BLACKBOX::RANGE [(_1115, 32)] []", "EXPR [ (1, _1078, _1101) (1, _1087, _1102) (-1, _1116) 0 ]", @@ -1643,13 +1643,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1115) (-1, _1122) 0 ]", "EXPR [ (1, _1078, _1122) (-1, _1123) 0 ]", "BLACKBOX::RANGE [(_1123, 32)] []", - "EXPR [ (1, _1123) (-1, _1124) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1123) (-1, _1124) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1078, _1124) (-1, _1125) 0 ]", "BLACKBOX::RANGE [(_1125, 32)] []", - "EXPR [ (1, _1125) (-1, _1126) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1125) (-1, _1126) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1078, _1126) (-1, _1127) 0 ]", "BLACKBOX::RANGE [(_1127, 32)] []", - "EXPR [ (1, _1127) (-1, _1128) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1127) (-1, _1128) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1078, _1128) (-1, _1129) 0 ]", "BLACKBOX::RANGE [(_1129, 32)] []", "EXPR [ (1, _1078, _1115) (1, _1087, _1116) (-1, _1130) 0 ]", @@ -1662,22 +1662,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 19 })], outputs: [Simple(Witness(1136))]", "EXPR [ (-1, _0, _1136) (19, _1136) (1, _1137) -1 ]", "EXPR [ (-1, _0, _1137) (19, _1137) 0 ]", - "EXPR [ (1, _1078, _1129) (-1, _2342) 0 ]", - "EXPR [ (1, _1087, _1130) (-1, _2343) 0 ]", - "EXPR [ (-1, _1138) (1, _1994) (1, _2342) (1, _2343) 0 ]", + "EXPR [ (1, _1078, _1129) (-1, _2261) 0 ]", + "EXPR [ (1, _1087, _1130) (-1, _2262) 0 ]", + "EXPR [ (-1, _1138) (1, _1913) (1, _2261) (1, _2262) 0 ]", "EXPR [ (1, _1137, _1138) (-1, _1139) 0 ]", "BLACKBOX::RANGE [(_1139, 32)] []", - "EXPR [ (1, _1139) (-1, _1140) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1139) (-1, _1140) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1137, _1140) (-1, _1141) 0 ]", "BLACKBOX::RANGE [(_1141, 32)] []", - "EXPR [ (1, _1141) (-1, _1142) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1141) (-1, _1142) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1137, _1142) (-1, _1143) 0 ]", "BLACKBOX::RANGE [(_1143, 32)] []", - "EXPR [ (1, _1143) (-1, _1144) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1143) (-1, _1144) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1137, _1144) (-1, _1145) 0 ]", "BLACKBOX::RANGE [(_1145, 32)] []", "EXPR [ (-1, _1137) (-1, _1146) 1 ]", - "EXPR [ (-1, _1147) (1, _2342) (1, _2343) 0 ]", + "EXPR [ (-1, _1147) (1, _2261) (1, _2262) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1145))], q_c: -4864 })], outputs: [Simple(Witness(1148))]", "EXPR [ (1, _1145, _1148) (-4864, _1148) (1, _1149) -1 ]", "EXPR [ (1, _1145, _1149) (-4864, _1149) 0 ]", @@ -1687,13 +1687,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1145) (-1, _1153) 0 ]", "EXPR [ (1, _1137, _1153) (-1, _1154) 0 ]", "BLACKBOX::RANGE [(_1154, 32)] []", - "EXPR [ (1, _1154) (-1, _1155) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1154) (-1, _1155) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1137, _1155) (-1, _1156) 0 ]", "BLACKBOX::RANGE [(_1156, 32)] []", - "EXPR [ (1, _1156) (-1, _1157) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1156) (-1, _1157) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1137, _1157) (-1, _1158) 0 ]", "BLACKBOX::RANGE [(_1158, 32)] []", - "EXPR [ (1, _1158) (-1, _1159) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1158) (-1, _1159) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1137, _1159) (-1, _1160) 0 ]", "BLACKBOX::RANGE [(_1160, 32)] []", "EXPR [ (1, _1137, _1145) (1, _1146, _1147) (-1, _1161) 0 ]", @@ -1706,13 +1706,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1160) (-1, _1167) 0 ]", "EXPR [ (1, _1137, _1167) (-1, _1168) 0 ]", "BLACKBOX::RANGE [(_1168, 32)] []", - "EXPR [ (1, _1168) (-1, _1169) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1168) (-1, _1169) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1137, _1169) (-1, _1170) 0 ]", "BLACKBOX::RANGE [(_1170, 32)] []", - "EXPR [ (1, _1170) (-1, _1171) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1170) (-1, _1171) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1137, _1171) (-1, _1172) 0 ]", "BLACKBOX::RANGE [(_1172, 32)] []", - "EXPR [ (1, _1172) (-1, _1173) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1172) (-1, _1173) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1137, _1173) (-1, _1174) 0 ]", "BLACKBOX::RANGE [(_1174, 32)] []", "EXPR [ (1, _1137, _1160) (1, _1146, _1161) (-1, _1175) 0 ]", @@ -1725,13 +1725,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1174) (-1, _1181) 0 ]", "EXPR [ (1, _1137, _1181) (-1, _1182) 0 ]", "BLACKBOX::RANGE [(_1182, 32)] []", - "EXPR [ (1, _1182) (-1, _1183) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1182) (-1, _1183) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1137, _1183) (-1, _1184) 0 ]", "BLACKBOX::RANGE [(_1184, 32)] []", - "EXPR [ (1, _1184) (-1, _1185) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1184) (-1, _1185) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1137, _1185) (-1, _1186) 0 ]", "BLACKBOX::RANGE [(_1186, 32)] []", - "EXPR [ (1, _1186) (-1, _1187) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1186) (-1, _1187) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1137, _1187) (-1, _1188) 0 ]", "BLACKBOX::RANGE [(_1188, 32)] []", "EXPR [ (1, _1137, _1174) (1, _1146, _1175) (-1, _1189) 0 ]", @@ -1744,22 +1744,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 20 })], outputs: [Simple(Witness(1195))]", "EXPR [ (-1, _0, _1195) (20, _1195) (1, _1196) -1 ]", "EXPR [ (-1, _0, _1196) (20, _1196) 0 ]", - "EXPR [ (1, _1137, _1188) (-1, _2358) 0 ]", - "EXPR [ (1, _1146, _1189) (-1, _2359) 0 ]", - "EXPR [ (-1, _1197) (1, _1994) (1, _2358) (1, _2359) 0 ]", + "EXPR [ (1, _1137, _1188) (-1, _2277) 0 ]", + "EXPR [ (1, _1146, _1189) (-1, _2278) 0 ]", + "EXPR [ (-1, _1197) (1, _1913) (1, _2277) (1, _2278) 0 ]", "EXPR [ (1, _1196, _1197) (-1, _1198) 0 ]", "BLACKBOX::RANGE [(_1198, 32)] []", - "EXPR [ (1, _1198) (-1, _1199) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1198) (-1, _1199) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1196, _1199) (-1, _1200) 0 ]", "BLACKBOX::RANGE [(_1200, 32)] []", - "EXPR [ (1, _1200) (-1, _1201) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1200) (-1, _1201) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1196, _1201) (-1, _1202) 0 ]", "BLACKBOX::RANGE [(_1202, 32)] []", - "EXPR [ (1, _1202) (-1, _1203) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1202) (-1, _1203) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1196, _1203) (-1, _1204) 0 ]", "BLACKBOX::RANGE [(_1204, 32)] []", "EXPR [ (-1, _1196) (-1, _1205) 1 ]", - "EXPR [ (-1, _1206) (1, _2358) (1, _2359) 0 ]", + "EXPR [ (-1, _1206) (1, _2277) (1, _2278) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1204))], q_c: -4864 })], outputs: [Simple(Witness(1207))]", "EXPR [ (1, _1204, _1207) (-4864, _1207) (1, _1208) -1 ]", "EXPR [ (1, _1204, _1208) (-4864, _1208) 0 ]", @@ -1769,13 +1769,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1204) (-1, _1212) 0 ]", "EXPR [ (1, _1196, _1212) (-1, _1213) 0 ]", "BLACKBOX::RANGE [(_1213, 32)] []", - "EXPR [ (1, _1213) (-1, _1214) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1213) (-1, _1214) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1196, _1214) (-1, _1215) 0 ]", "BLACKBOX::RANGE [(_1215, 32)] []", - "EXPR [ (1, _1215) (-1, _1216) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1215) (-1, _1216) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1196, _1216) (-1, _1217) 0 ]", "BLACKBOX::RANGE [(_1217, 32)] []", - "EXPR [ (1, _1217) (-1, _1218) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1217) (-1, _1218) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1196, _1218) (-1, _1219) 0 ]", "BLACKBOX::RANGE [(_1219, 32)] []", "EXPR [ (1, _1196, _1204) (1, _1205, _1206) (-1, _1220) 0 ]", @@ -1788,13 +1788,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1219) (-1, _1226) 0 ]", "EXPR [ (1, _1196, _1226) (-1, _1227) 0 ]", "BLACKBOX::RANGE [(_1227, 32)] []", - "EXPR [ (1, _1227) (-1, _1228) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1227) (-1, _1228) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1196, _1228) (-1, _1229) 0 ]", "BLACKBOX::RANGE [(_1229, 32)] []", - "EXPR [ (1, _1229) (-1, _1230) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1229) (-1, _1230) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1196, _1230) (-1, _1231) 0 ]", "BLACKBOX::RANGE [(_1231, 32)] []", - "EXPR [ (1, _1231) (-1, _1232) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1231) (-1, _1232) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1196, _1232) (-1, _1233) 0 ]", "BLACKBOX::RANGE [(_1233, 32)] []", "EXPR [ (1, _1196, _1219) (1, _1205, _1220) (-1, _1234) 0 ]", @@ -1807,13 +1807,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1233) (-1, _1240) 0 ]", "EXPR [ (1, _1196, _1240) (-1, _1241) 0 ]", "BLACKBOX::RANGE [(_1241, 32)] []", - "EXPR [ (1, _1241) (-1, _1242) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1241) (-1, _1242) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1196, _1242) (-1, _1243) 0 ]", "BLACKBOX::RANGE [(_1243, 32)] []", - "EXPR [ (1, _1243) (-1, _1244) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1243) (-1, _1244) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1196, _1244) (-1, _1245) 0 ]", "BLACKBOX::RANGE [(_1245, 32)] []", - "EXPR [ (1, _1245) (-1, _1246) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1245) (-1, _1246) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1196, _1246) (-1, _1247) 0 ]", "BLACKBOX::RANGE [(_1247, 32)] []", "EXPR [ (1, _1196, _1233) (1, _1205, _1234) (-1, _1248) 0 ]", @@ -1826,22 +1826,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 21 })], outputs: [Simple(Witness(1254))]", "EXPR [ (-1, _0, _1254) (21, _1254) (1, _1255) -1 ]", "EXPR [ (-1, _0, _1255) (21, _1255) 0 ]", - "EXPR [ (1, _1196, _1247) (-1, _2374) 0 ]", - "EXPR [ (1, _1205, _1248) (-1, _2375) 0 ]", - "EXPR [ (-1, _1256) (1, _1994) (1, _2374) (1, _2375) 0 ]", + "EXPR [ (1, _1196, _1247) (-1, _2293) 0 ]", + "EXPR [ (1, _1205, _1248) (-1, _2294) 0 ]", + "EXPR [ (-1, _1256) (1, _1913) (1, _2293) (1, _2294) 0 ]", "EXPR [ (1, _1255, _1256) (-1, _1257) 0 ]", "BLACKBOX::RANGE [(_1257, 32)] []", - "EXPR [ (1, _1257) (-1, _1258) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1257) (-1, _1258) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1255, _1258) (-1, _1259) 0 ]", "BLACKBOX::RANGE [(_1259, 32)] []", - "EXPR [ (1, _1259) (-1, _1260) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1259) (-1, _1260) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1255, _1260) (-1, _1261) 0 ]", "BLACKBOX::RANGE [(_1261, 32)] []", - "EXPR [ (1, _1261) (-1, _1262) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1261) (-1, _1262) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1255, _1262) (-1, _1263) 0 ]", "BLACKBOX::RANGE [(_1263, 32)] []", "EXPR [ (-1, _1255) (-1, _1264) 1 ]", - "EXPR [ (-1, _1265) (1, _2374) (1, _2375) 0 ]", + "EXPR [ (-1, _1265) (1, _2293) (1, _2294) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1263))], q_c: -4864 })], outputs: [Simple(Witness(1266))]", "EXPR [ (1, _1263, _1266) (-4864, _1266) (1, _1267) -1 ]", "EXPR [ (1, _1263, _1267) (-4864, _1267) 0 ]", @@ -1851,13 +1851,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1263) (-1, _1271) 0 ]", "EXPR [ (1, _1255, _1271) (-1, _1272) 0 ]", "BLACKBOX::RANGE [(_1272, 32)] []", - "EXPR [ (1, _1272) (-1, _1273) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1272) (-1, _1273) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1255, _1273) (-1, _1274) 0 ]", "BLACKBOX::RANGE [(_1274, 32)] []", - "EXPR [ (1, _1274) (-1, _1275) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1274) (-1, _1275) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1255, _1275) (-1, _1276) 0 ]", "BLACKBOX::RANGE [(_1276, 32)] []", - "EXPR [ (1, _1276) (-1, _1277) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1276) (-1, _1277) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1255, _1277) (-1, _1278) 0 ]", "BLACKBOX::RANGE [(_1278, 32)] []", "EXPR [ (1, _1255, _1263) (1, _1264, _1265) (-1, _1279) 0 ]", @@ -1870,13 +1870,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1278) (-1, _1285) 0 ]", "EXPR [ (1, _1255, _1285) (-1, _1286) 0 ]", "BLACKBOX::RANGE [(_1286, 32)] []", - "EXPR [ (1, _1286) (-1, _1287) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1286) (-1, _1287) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1255, _1287) (-1, _1288) 0 ]", "BLACKBOX::RANGE [(_1288, 32)] []", - "EXPR [ (1, _1288) (-1, _1289) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1288) (-1, _1289) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1255, _1289) (-1, _1290) 0 ]", "BLACKBOX::RANGE [(_1290, 32)] []", - "EXPR [ (1, _1290) (-1, _1291) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1290) (-1, _1291) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1255, _1291) (-1, _1292) 0 ]", "BLACKBOX::RANGE [(_1292, 32)] []", "EXPR [ (1, _1255, _1278) (1, _1264, _1279) (-1, _1293) 0 ]", @@ -1889,13 +1889,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1292) (-1, _1299) 0 ]", "EXPR [ (1, _1255, _1299) (-1, _1300) 0 ]", "BLACKBOX::RANGE [(_1300, 32)] []", - "EXPR [ (1, _1300) (-1, _1301) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1300) (-1, _1301) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1255, _1301) (-1, _1302) 0 ]", "BLACKBOX::RANGE [(_1302, 32)] []", - "EXPR [ (1, _1302) (-1, _1303) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1302) (-1, _1303) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1255, _1303) (-1, _1304) 0 ]", "BLACKBOX::RANGE [(_1304, 32)] []", - "EXPR [ (1, _1304) (-1, _1305) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1304) (-1, _1305) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1255, _1305) (-1, _1306) 0 ]", "BLACKBOX::RANGE [(_1306, 32)] []", "EXPR [ (1, _1255, _1292) (1, _1264, _1293) (-1, _1307) 0 ]", @@ -1908,22 +1908,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 22 })], outputs: [Simple(Witness(1313))]", "EXPR [ (-1, _0, _1313) (22, _1313) (1, _1314) -1 ]", "EXPR [ (-1, _0, _1314) (22, _1314) 0 ]", - "EXPR [ (1, _1255, _1306) (-1, _2390) 0 ]", - "EXPR [ (1, _1264, _1307) (-1, _2391) 0 ]", - "EXPR [ (-1, _1315) (1, _1994) (1, _2390) (1, _2391) 0 ]", + "EXPR [ (1, _1255, _1306) (-1, _2309) 0 ]", + "EXPR [ (1, _1264, _1307) (-1, _2310) 0 ]", + "EXPR [ (-1, _1315) (1, _1913) (1, _2309) (1, _2310) 0 ]", "EXPR [ (1, _1314, _1315) (-1, _1316) 0 ]", "BLACKBOX::RANGE [(_1316, 32)] []", - "EXPR [ (1, _1316) (-1, _1317) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1316) (-1, _1317) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1314, _1317) (-1, _1318) 0 ]", "BLACKBOX::RANGE [(_1318, 32)] []", - "EXPR [ (1, _1318) (-1, _1319) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1318) (-1, _1319) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1314, _1319) (-1, _1320) 0 ]", "BLACKBOX::RANGE [(_1320, 32)] []", - "EXPR [ (1, _1320) (-1, _1321) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1320) (-1, _1321) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1314, _1321) (-1, _1322) 0 ]", "BLACKBOX::RANGE [(_1322, 32)] []", "EXPR [ (-1, _1314) (-1, _1323) 1 ]", - "EXPR [ (-1, _1324) (1, _2390) (1, _2391) 0 ]", + "EXPR [ (-1, _1324) (1, _2309) (1, _2310) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1322))], q_c: -4864 })], outputs: [Simple(Witness(1325))]", "EXPR [ (1, _1322, _1325) (-4864, _1325) (1, _1326) -1 ]", "EXPR [ (1, _1322, _1326) (-4864, _1326) 0 ]", @@ -1933,13 +1933,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1322) (-1, _1330) 0 ]", "EXPR [ (1, _1314, _1330) (-1, _1331) 0 ]", "BLACKBOX::RANGE [(_1331, 32)] []", - "EXPR [ (1, _1331) (-1, _1332) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1331) (-1, _1332) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1314, _1332) (-1, _1333) 0 ]", "BLACKBOX::RANGE [(_1333, 32)] []", - "EXPR [ (1, _1333) (-1, _1334) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1333) (-1, _1334) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1314, _1334) (-1, _1335) 0 ]", "BLACKBOX::RANGE [(_1335, 32)] []", - "EXPR [ (1, _1335) (-1, _1336) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1335) (-1, _1336) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1314, _1336) (-1, _1337) 0 ]", "BLACKBOX::RANGE [(_1337, 32)] []", "EXPR [ (1, _1314, _1322) (1, _1323, _1324) (-1, _1338) 0 ]", @@ -1952,13 +1952,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1337) (-1, _1344) 0 ]", "EXPR [ (1, _1314, _1344) (-1, _1345) 0 ]", "BLACKBOX::RANGE [(_1345, 32)] []", - "EXPR [ (1, _1345) (-1, _1346) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1345) (-1, _1346) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1314, _1346) (-1, _1347) 0 ]", "BLACKBOX::RANGE [(_1347, 32)] []", - "EXPR [ (1, _1347) (-1, _1348) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1347) (-1, _1348) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1314, _1348) (-1, _1349) 0 ]", "BLACKBOX::RANGE [(_1349, 32)] []", - "EXPR [ (1, _1349) (-1, _1350) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1349) (-1, _1350) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1314, _1350) (-1, _1351) 0 ]", "BLACKBOX::RANGE [(_1351, 32)] []", "EXPR [ (1, _1314, _1337) (1, _1323, _1338) (-1, _1352) 0 ]", @@ -1971,13 +1971,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1351) (-1, _1358) 0 ]", "EXPR [ (1, _1314, _1358) (-1, _1359) 0 ]", "BLACKBOX::RANGE [(_1359, 32)] []", - "EXPR [ (1, _1359) (-1, _1360) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1359) (-1, _1360) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1314, _1360) (-1, _1361) 0 ]", "BLACKBOX::RANGE [(_1361, 32)] []", - "EXPR [ (1, _1361) (-1, _1362) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1361) (-1, _1362) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1314, _1362) (-1, _1363) 0 ]", "BLACKBOX::RANGE [(_1363, 32)] []", - "EXPR [ (1, _1363) (-1, _1364) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1363) (-1, _1364) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1314, _1364) (-1, _1365) 0 ]", "BLACKBOX::RANGE [(_1365, 32)] []", "EXPR [ (1, _1314, _1351) (1, _1323, _1352) (-1, _1366) 0 ]", @@ -1990,22 +1990,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 23 })], outputs: [Simple(Witness(1372))]", "EXPR [ (-1, _0, _1372) (23, _1372) (1, _1373) -1 ]", "EXPR [ (-1, _0, _1373) (23, _1373) 0 ]", - "EXPR [ (1, _1314, _1365) (-1, _2406) 0 ]", - "EXPR [ (1, _1323, _1366) (-1, _2407) 0 ]", - "EXPR [ (-1, _1374) (1, _1994) (1, _2406) (1, _2407) 0 ]", + "EXPR [ (1, _1314, _1365) (-1, _2325) 0 ]", + "EXPR [ (1, _1323, _1366) (-1, _2326) 0 ]", + "EXPR [ (-1, _1374) (1, _1913) (1, _2325) (1, _2326) 0 ]", "EXPR [ (1, _1373, _1374) (-1, _1375) 0 ]", "BLACKBOX::RANGE [(_1375, 32)] []", - "EXPR [ (1, _1375) (-1, _1376) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1375) (-1, _1376) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1373, _1376) (-1, _1377) 0 ]", "BLACKBOX::RANGE [(_1377, 32)] []", - "EXPR [ (1, _1377) (-1, _1378) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1377) (-1, _1378) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1373, _1378) (-1, _1379) 0 ]", "BLACKBOX::RANGE [(_1379, 32)] []", - "EXPR [ (1, _1379) (-1, _1380) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1379) (-1, _1380) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1373, _1380) (-1, _1381) 0 ]", "BLACKBOX::RANGE [(_1381, 32)] []", "EXPR [ (-1, _1373) (-1, _1382) 1 ]", - "EXPR [ (-1, _1383) (1, _2406) (1, _2407) 0 ]", + "EXPR [ (-1, _1383) (1, _2325) (1, _2326) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1381))], q_c: -4864 })], outputs: [Simple(Witness(1384))]", "EXPR [ (1, _1381, _1384) (-4864, _1384) (1, _1385) -1 ]", "EXPR [ (1, _1381, _1385) (-4864, _1385) 0 ]", @@ -2015,13 +2015,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1381) (-1, _1389) 0 ]", "EXPR [ (1, _1373, _1389) (-1, _1390) 0 ]", "BLACKBOX::RANGE [(_1390, 32)] []", - "EXPR [ (1, _1390) (-1, _1391) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1390) (-1, _1391) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1373, _1391) (-1, _1392) 0 ]", "BLACKBOX::RANGE [(_1392, 32)] []", - "EXPR [ (1, _1392) (-1, _1393) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1392) (-1, _1393) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1373, _1393) (-1, _1394) 0 ]", "BLACKBOX::RANGE [(_1394, 32)] []", - "EXPR [ (1, _1394) (-1, _1395) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1394) (-1, _1395) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1373, _1395) (-1, _1396) 0 ]", "BLACKBOX::RANGE [(_1396, 32)] []", "EXPR [ (1, _1373, _1381) (1, _1382, _1383) (-1, _1397) 0 ]", @@ -2034,13 +2034,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1396) (-1, _1403) 0 ]", "EXPR [ (1, _1373, _1403) (-1, _1404) 0 ]", "BLACKBOX::RANGE [(_1404, 32)] []", - "EXPR [ (1, _1404) (-1, _1405) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1404) (-1, _1405) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1373, _1405) (-1, _1406) 0 ]", "BLACKBOX::RANGE [(_1406, 32)] []", - "EXPR [ (1, _1406) (-1, _1407) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1406) (-1, _1407) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1373, _1407) (-1, _1408) 0 ]", "BLACKBOX::RANGE [(_1408, 32)] []", - "EXPR [ (1, _1408) (-1, _1409) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1408) (-1, _1409) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1373, _1409) (-1, _1410) 0 ]", "BLACKBOX::RANGE [(_1410, 32)] []", "EXPR [ (1, _1373, _1396) (1, _1382, _1397) (-1, _1411) 0 ]", @@ -2053,13 +2053,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1410) (-1, _1417) 0 ]", "EXPR [ (1, _1373, _1417) (-1, _1418) 0 ]", "BLACKBOX::RANGE [(_1418, 32)] []", - "EXPR [ (1, _1418) (-1, _1419) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1418) (-1, _1419) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1373, _1419) (-1, _1420) 0 ]", "BLACKBOX::RANGE [(_1420, 32)] []", - "EXPR [ (1, _1420) (-1, _1421) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1420) (-1, _1421) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1373, _1421) (-1, _1422) 0 ]", "BLACKBOX::RANGE [(_1422, 32)] []", - "EXPR [ (1, _1422) (-1, _1423) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1422) (-1, _1423) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1373, _1423) (-1, _1424) 0 ]", "BLACKBOX::RANGE [(_1424, 32)] []", "EXPR [ (1, _1373, _1410) (1, _1382, _1411) (-1, _1425) 0 ]", @@ -2072,22 +2072,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 24 })], outputs: [Simple(Witness(1431))]", "EXPR [ (-1, _0, _1431) (24, _1431) (1, _1432) -1 ]", "EXPR [ (-1, _0, _1432) (24, _1432) 0 ]", - "EXPR [ (1, _1373, _1424) (-1, _2422) 0 ]", - "EXPR [ (1, _1382, _1425) (-1, _2423) 0 ]", - "EXPR [ (-1, _1433) (1, _1994) (1, _2422) (1, _2423) 0 ]", + "EXPR [ (1, _1373, _1424) (-1, _2341) 0 ]", + "EXPR [ (1, _1382, _1425) (-1, _2342) 0 ]", + "EXPR [ (-1, _1433) (1, _1913) (1, _2341) (1, _2342) 0 ]", "EXPR [ (1, _1432, _1433) (-1, _1434) 0 ]", "BLACKBOX::RANGE [(_1434, 32)] []", - "EXPR [ (1, _1434) (-1, _1435) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1434) (-1, _1435) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1432, _1435) (-1, _1436) 0 ]", "BLACKBOX::RANGE [(_1436, 32)] []", - "EXPR [ (1, _1436) (-1, _1437) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1436) (-1, _1437) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1432, _1437) (-1, _1438) 0 ]", "BLACKBOX::RANGE [(_1438, 32)] []", - "EXPR [ (1, _1438) (-1, _1439) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1438) (-1, _1439) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1432, _1439) (-1, _1440) 0 ]", "BLACKBOX::RANGE [(_1440, 32)] []", "EXPR [ (-1, _1432) (-1, _1441) 1 ]", - "EXPR [ (-1, _1442) (1, _2422) (1, _2423) 0 ]", + "EXPR [ (-1, _1442) (1, _2341) (1, _2342) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1440))], q_c: -4864 })], outputs: [Simple(Witness(1443))]", "EXPR [ (1, _1440, _1443) (-4864, _1443) (1, _1444) -1 ]", "EXPR [ (1, _1440, _1444) (-4864, _1444) 0 ]", @@ -2097,13 +2097,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1440) (-1, _1448) 0 ]", "EXPR [ (1, _1432, _1448) (-1, _1449) 0 ]", "BLACKBOX::RANGE [(_1449, 32)] []", - "EXPR [ (1, _1449) (-1, _1450) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1449) (-1, _1450) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1432, _1450) (-1, _1451) 0 ]", "BLACKBOX::RANGE [(_1451, 32)] []", - "EXPR [ (1, _1451) (-1, _1452) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1451) (-1, _1452) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1432, _1452) (-1, _1453) 0 ]", "BLACKBOX::RANGE [(_1453, 32)] []", - "EXPR [ (1, _1453) (-1, _1454) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1453) (-1, _1454) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1432, _1454) (-1, _1455) 0 ]", "BLACKBOX::RANGE [(_1455, 32)] []", "EXPR [ (1, _1432, _1440) (1, _1441, _1442) (-1, _1456) 0 ]", @@ -2116,13 +2116,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1455) (-1, _1462) 0 ]", "EXPR [ (1, _1432, _1462) (-1, _1463) 0 ]", "BLACKBOX::RANGE [(_1463, 32)] []", - "EXPR [ (1, _1463) (-1, _1464) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1463) (-1, _1464) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1432, _1464) (-1, _1465) 0 ]", "BLACKBOX::RANGE [(_1465, 32)] []", - "EXPR [ (1, _1465) (-1, _1466) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1465) (-1, _1466) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1432, _1466) (-1, _1467) 0 ]", "BLACKBOX::RANGE [(_1467, 32)] []", - "EXPR [ (1, _1467) (-1, _1468) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1467) (-1, _1468) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1432, _1468) (-1, _1469) 0 ]", "BLACKBOX::RANGE [(_1469, 32)] []", "EXPR [ (1, _1432, _1455) (1, _1441, _1456) (-1, _1470) 0 ]", @@ -2135,13 +2135,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1469) (-1, _1476) 0 ]", "EXPR [ (1, _1432, _1476) (-1, _1477) 0 ]", "BLACKBOX::RANGE [(_1477, 32)] []", - "EXPR [ (1, _1477) (-1, _1478) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1477) (-1, _1478) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1432, _1478) (-1, _1479) 0 ]", "BLACKBOX::RANGE [(_1479, 32)] []", - "EXPR [ (1, _1479) (-1, _1480) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1479) (-1, _1480) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1432, _1480) (-1, _1481) 0 ]", "BLACKBOX::RANGE [(_1481, 32)] []", - "EXPR [ (1, _1481) (-1, _1482) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1481) (-1, _1482) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1432, _1482) (-1, _1483) 0 ]", "BLACKBOX::RANGE [(_1483, 32)] []", "EXPR [ (1, _1432, _1469) (1, _1441, _1470) (-1, _1484) 0 ]", @@ -2154,22 +2154,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 25 })], outputs: [Simple(Witness(1490))]", "EXPR [ (-1, _0, _1490) (25, _1490) (1, _1491) -1 ]", "EXPR [ (-1, _0, _1491) (25, _1491) 0 ]", - "EXPR [ (1, _1432, _1483) (-1, _2438) 0 ]", - "EXPR [ (1, _1441, _1484) (-1, _2439) 0 ]", - "EXPR [ (-1, _1492) (1, _1994) (1, _2438) (1, _2439) 0 ]", + "EXPR [ (1, _1432, _1483) (-1, _2357) 0 ]", + "EXPR [ (1, _1441, _1484) (-1, _2358) 0 ]", + "EXPR [ (-1, _1492) (1, _1913) (1, _2357) (1, _2358) 0 ]", "EXPR [ (1, _1491, _1492) (-1, _1493) 0 ]", "BLACKBOX::RANGE [(_1493, 32)] []", - "EXPR [ (1, _1493) (-1, _1494) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1493) (-1, _1494) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1491, _1494) (-1, _1495) 0 ]", "BLACKBOX::RANGE [(_1495, 32)] []", - "EXPR [ (1, _1495) (-1, _1496) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1495) (-1, _1496) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1491, _1496) (-1, _1497) 0 ]", "BLACKBOX::RANGE [(_1497, 32)] []", - "EXPR [ (1, _1497) (-1, _1498) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1497) (-1, _1498) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1491, _1498) (-1, _1499) 0 ]", "BLACKBOX::RANGE [(_1499, 32)] []", "EXPR [ (-1, _1491) (-1, _1500) 1 ]", - "EXPR [ (-1, _1501) (1, _2438) (1, _2439) 0 ]", + "EXPR [ (-1, _1501) (1, _2357) (1, _2358) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1499))], q_c: -4864 })], outputs: [Simple(Witness(1502))]", "EXPR [ (1, _1499, _1502) (-4864, _1502) (1, _1503) -1 ]", "EXPR [ (1, _1499, _1503) (-4864, _1503) 0 ]", @@ -2179,13 +2179,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1499) (-1, _1507) 0 ]", "EXPR [ (1, _1491, _1507) (-1, _1508) 0 ]", "BLACKBOX::RANGE [(_1508, 32)] []", - "EXPR [ (1, _1508) (-1, _1509) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1508) (-1, _1509) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1491, _1509) (-1, _1510) 0 ]", "BLACKBOX::RANGE [(_1510, 32)] []", - "EXPR [ (1, _1510) (-1, _1511) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1510) (-1, _1511) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1491, _1511) (-1, _1512) 0 ]", "BLACKBOX::RANGE [(_1512, 32)] []", - "EXPR [ (1, _1512) (-1, _1513) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1512) (-1, _1513) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1491, _1513) (-1, _1514) 0 ]", "BLACKBOX::RANGE [(_1514, 32)] []", "EXPR [ (1, _1491, _1499) (1, _1500, _1501) (-1, _1515) 0 ]", @@ -2198,13 +2198,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1514) (-1, _1521) 0 ]", "EXPR [ (1, _1491, _1521) (-1, _1522) 0 ]", "BLACKBOX::RANGE [(_1522, 32)] []", - "EXPR [ (1, _1522) (-1, _1523) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1522) (-1, _1523) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1491, _1523) (-1, _1524) 0 ]", "BLACKBOX::RANGE [(_1524, 32)] []", - "EXPR [ (1, _1524) (-1, _1525) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1524) (-1, _1525) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1491, _1525) (-1, _1526) 0 ]", "BLACKBOX::RANGE [(_1526, 32)] []", - "EXPR [ (1, _1526) (-1, _1527) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1526) (-1, _1527) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1491, _1527) (-1, _1528) 0 ]", "BLACKBOX::RANGE [(_1528, 32)] []", "EXPR [ (1, _1491, _1514) (1, _1500, _1515) (-1, _1529) 0 ]", @@ -2217,13 +2217,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1528) (-1, _1535) 0 ]", "EXPR [ (1, _1491, _1535) (-1, _1536) 0 ]", "BLACKBOX::RANGE [(_1536, 32)] []", - "EXPR [ (1, _1536) (-1, _1537) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1536) (-1, _1537) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1491, _1537) (-1, _1538) 0 ]", "BLACKBOX::RANGE [(_1538, 32)] []", - "EXPR [ (1, _1538) (-1, _1539) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1538) (-1, _1539) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1491, _1539) (-1, _1540) 0 ]", "BLACKBOX::RANGE [(_1540, 32)] []", - "EXPR [ (1, _1540) (-1, _1541) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1540) (-1, _1541) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1491, _1541) (-1, _1542) 0 ]", "BLACKBOX::RANGE [(_1542, 32)] []", "EXPR [ (1, _1491, _1528) (1, _1500, _1529) (-1, _1543) 0 ]", @@ -2236,22 +2236,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 26 })], outputs: [Simple(Witness(1549))]", "EXPR [ (-1, _0, _1549) (26, _1549) (1, _1550) -1 ]", "EXPR [ (-1, _0, _1550) (26, _1550) 0 ]", - "EXPR [ (1, _1491, _1542) (-1, _2454) 0 ]", - "EXPR [ (1, _1500, _1543) (-1, _2455) 0 ]", - "EXPR [ (-1, _1551) (1, _1994) (1, _2454) (1, _2455) 0 ]", + "EXPR [ (1, _1491, _1542) (-1, _2373) 0 ]", + "EXPR [ (1, _1500, _1543) (-1, _2374) 0 ]", + "EXPR [ (-1, _1551) (1, _1913) (1, _2373) (1, _2374) 0 ]", "EXPR [ (1, _1550, _1551) (-1, _1552) 0 ]", "BLACKBOX::RANGE [(_1552, 32)] []", - "EXPR [ (1, _1552) (-1, _1553) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1552) (-1, _1553) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1550, _1553) (-1, _1554) 0 ]", "BLACKBOX::RANGE [(_1554, 32)] []", - "EXPR [ (1, _1554) (-1, _1555) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1554) (-1, _1555) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1550, _1555) (-1, _1556) 0 ]", "BLACKBOX::RANGE [(_1556, 32)] []", - "EXPR [ (1, _1556) (-1, _1557) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1556) (-1, _1557) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1550, _1557) (-1, _1558) 0 ]", "BLACKBOX::RANGE [(_1558, 32)] []", "EXPR [ (-1, _1550) (-1, _1559) 1 ]", - "EXPR [ (-1, _1560) (1, _2454) (1, _2455) 0 ]", + "EXPR [ (-1, _1560) (1, _2373) (1, _2374) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1558))], q_c: -4864 })], outputs: [Simple(Witness(1561))]", "EXPR [ (1, _1558, _1561) (-4864, _1561) (1, _1562) -1 ]", "EXPR [ (1, _1558, _1562) (-4864, _1562) 0 ]", @@ -2261,13 +2261,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1558) (-1, _1566) 0 ]", "EXPR [ (1, _1550, _1566) (-1, _1567) 0 ]", "BLACKBOX::RANGE [(_1567, 32)] []", - "EXPR [ (1, _1567) (-1, _1568) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1567) (-1, _1568) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1550, _1568) (-1, _1569) 0 ]", "BLACKBOX::RANGE [(_1569, 32)] []", - "EXPR [ (1, _1569) (-1, _1570) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1569) (-1, _1570) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1550, _1570) (-1, _1571) 0 ]", "BLACKBOX::RANGE [(_1571, 32)] []", - "EXPR [ (1, _1571) (-1, _1572) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1571) (-1, _1572) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1550, _1572) (-1, _1573) 0 ]", "BLACKBOX::RANGE [(_1573, 32)] []", "EXPR [ (1, _1550, _1558) (1, _1559, _1560) (-1, _1574) 0 ]", @@ -2280,13 +2280,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1573) (-1, _1580) 0 ]", "EXPR [ (1, _1550, _1580) (-1, _1581) 0 ]", "BLACKBOX::RANGE [(_1581, 32)] []", - "EXPR [ (1, _1581) (-1, _1582) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1581) (-1, _1582) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1550, _1582) (-1, _1583) 0 ]", "BLACKBOX::RANGE [(_1583, 32)] []", - "EXPR [ (1, _1583) (-1, _1584) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1583) (-1, _1584) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1550, _1584) (-1, _1585) 0 ]", "BLACKBOX::RANGE [(_1585, 32)] []", - "EXPR [ (1, _1585) (-1, _1586) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1585) (-1, _1586) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1550, _1586) (-1, _1587) 0 ]", "BLACKBOX::RANGE [(_1587, 32)] []", "EXPR [ (1, _1550, _1573) (1, _1559, _1574) (-1, _1588) 0 ]", @@ -2299,13 +2299,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1587) (-1, _1594) 0 ]", "EXPR [ (1, _1550, _1594) (-1, _1595) 0 ]", "BLACKBOX::RANGE [(_1595, 32)] []", - "EXPR [ (1, _1595) (-1, _1596) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1595) (-1, _1596) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1550, _1596) (-1, _1597) 0 ]", "BLACKBOX::RANGE [(_1597, 32)] []", - "EXPR [ (1, _1597) (-1, _1598) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1597) (-1, _1598) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1550, _1598) (-1, _1599) 0 ]", "BLACKBOX::RANGE [(_1599, 32)] []", - "EXPR [ (1, _1599) (-1, _1600) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1599) (-1, _1600) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1550, _1600) (-1, _1601) 0 ]", "BLACKBOX::RANGE [(_1601, 32)] []", "EXPR [ (1, _1550, _1587) (1, _1559, _1588) (-1, _1602) 0 ]", @@ -2318,22 +2318,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 27 })], outputs: [Simple(Witness(1608))]", "EXPR [ (-1, _0, _1608) (27, _1608) (1, _1609) -1 ]", "EXPR [ (-1, _0, _1609) (27, _1609) 0 ]", - "EXPR [ (1, _1550, _1601) (-1, _2470) 0 ]", - "EXPR [ (1, _1559, _1602) (-1, _2471) 0 ]", - "EXPR [ (-1, _1610) (1, _1994) (1, _2470) (1, _2471) 0 ]", + "EXPR [ (1, _1550, _1601) (-1, _2389) 0 ]", + "EXPR [ (1, _1559, _1602) (-1, _2390) 0 ]", + "EXPR [ (-1, _1610) (1, _1913) (1, _2389) (1, _2390) 0 ]", "EXPR [ (1, _1609, _1610) (-1, _1611) 0 ]", "BLACKBOX::RANGE [(_1611, 32)] []", - "EXPR [ (1, _1611) (-1, _1612) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1611) (-1, _1612) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1609, _1612) (-1, _1613) 0 ]", "BLACKBOX::RANGE [(_1613, 32)] []", - "EXPR [ (1, _1613) (-1, _1614) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1613) (-1, _1614) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1609, _1614) (-1, _1615) 0 ]", "BLACKBOX::RANGE [(_1615, 32)] []", - "EXPR [ (1, _1615) (-1, _1616) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1615) (-1, _1616) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1609, _1616) (-1, _1617) 0 ]", "BLACKBOX::RANGE [(_1617, 32)] []", "EXPR [ (-1, _1609) (-1, _1618) 1 ]", - "EXPR [ (-1, _1619) (1, _2470) (1, _2471) 0 ]", + "EXPR [ (-1, _1619) (1, _2389) (1, _2390) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1617))], q_c: -4864 })], outputs: [Simple(Witness(1620))]", "EXPR [ (1, _1617, _1620) (-4864, _1620) (1, _1621) -1 ]", "EXPR [ (1, _1617, _1621) (-4864, _1621) 0 ]", @@ -2343,13 +2343,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1617) (-1, _1625) 0 ]", "EXPR [ (1, _1609, _1625) (-1, _1626) 0 ]", "BLACKBOX::RANGE [(_1626, 32)] []", - "EXPR [ (1, _1626) (-1, _1627) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1626) (-1, _1627) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1609, _1627) (-1, _1628) 0 ]", "BLACKBOX::RANGE [(_1628, 32)] []", - "EXPR [ (1, _1628) (-1, _1629) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1628) (-1, _1629) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1609, _1629) (-1, _1630) 0 ]", "BLACKBOX::RANGE [(_1630, 32)] []", - "EXPR [ (1, _1630) (-1, _1631) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1630) (-1, _1631) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1609, _1631) (-1, _1632) 0 ]", "BLACKBOX::RANGE [(_1632, 32)] []", "EXPR [ (1, _1609, _1617) (1, _1618, _1619) (-1, _1633) 0 ]", @@ -2362,13 +2362,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1632) (-1, _1639) 0 ]", "EXPR [ (1, _1609, _1639) (-1, _1640) 0 ]", "BLACKBOX::RANGE [(_1640, 32)] []", - "EXPR [ (1, _1640) (-1, _1641) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1640) (-1, _1641) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1609, _1641) (-1, _1642) 0 ]", "BLACKBOX::RANGE [(_1642, 32)] []", - "EXPR [ (1, _1642) (-1, _1643) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1642) (-1, _1643) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1609, _1643) (-1, _1644) 0 ]", "BLACKBOX::RANGE [(_1644, 32)] []", - "EXPR [ (1, _1644) (-1, _1645) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1644) (-1, _1645) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1609, _1645) (-1, _1646) 0 ]", "BLACKBOX::RANGE [(_1646, 32)] []", "EXPR [ (1, _1609, _1632) (1, _1618, _1633) (-1, _1647) 0 ]", @@ -2381,13 +2381,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1646) (-1, _1653) 0 ]", "EXPR [ (1, _1609, _1653) (-1, _1654) 0 ]", "BLACKBOX::RANGE [(_1654, 32)] []", - "EXPR [ (1, _1654) (-1, _1655) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1654) (-1, _1655) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1609, _1655) (-1, _1656) 0 ]", "BLACKBOX::RANGE [(_1656, 32)] []", - "EXPR [ (1, _1656) (-1, _1657) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1656) (-1, _1657) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1609, _1657) (-1, _1658) 0 ]", "BLACKBOX::RANGE [(_1658, 32)] []", - "EXPR [ (1, _1658) (-1, _1659) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1658) (-1, _1659) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1609, _1659) (-1, _1660) 0 ]", "BLACKBOX::RANGE [(_1660, 32)] []", "EXPR [ (1, _1609, _1646) (1, _1618, _1647) (-1, _1661) 0 ]", @@ -2400,22 +2400,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 28 })], outputs: [Simple(Witness(1667))]", "EXPR [ (-1, _0, _1667) (28, _1667) (1, _1668) -1 ]", "EXPR [ (-1, _0, _1668) (28, _1668) 0 ]", - "EXPR [ (1, _1609, _1660) (-1, _2486) 0 ]", - "EXPR [ (1, _1618, _1661) (-1, _2487) 0 ]", - "EXPR [ (-1, _1669) (1, _1994) (1, _2486) (1, _2487) 0 ]", + "EXPR [ (1, _1609, _1660) (-1, _2405) 0 ]", + "EXPR [ (1, _1618, _1661) (-1, _2406) 0 ]", + "EXPR [ (-1, _1669) (1, _1913) (1, _2405) (1, _2406) 0 ]", "EXPR [ (1, _1668, _1669) (-1, _1670) 0 ]", "BLACKBOX::RANGE [(_1670, 32)] []", - "EXPR [ (1, _1670) (-1, _1671) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1670) (-1, _1671) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1668, _1671) (-1, _1672) 0 ]", "BLACKBOX::RANGE [(_1672, 32)] []", - "EXPR [ (1, _1672) (-1, _1673) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1672) (-1, _1673) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1668, _1673) (-1, _1674) 0 ]", "BLACKBOX::RANGE [(_1674, 32)] []", - "EXPR [ (1, _1674) (-1, _1675) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1674) (-1, _1675) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1668, _1675) (-1, _1676) 0 ]", "BLACKBOX::RANGE [(_1676, 32)] []", "EXPR [ (-1, _1668) (-1, _1677) 1 ]", - "EXPR [ (-1, _1678) (1, _2486) (1, _2487) 0 ]", + "EXPR [ (-1, _1678) (1, _2405) (1, _2406) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1676))], q_c: -4864 })], outputs: [Simple(Witness(1679))]", "EXPR [ (1, _1676, _1679) (-4864, _1679) (1, _1680) -1 ]", "EXPR [ (1, _1676, _1680) (-4864, _1680) 0 ]", @@ -2425,13 +2425,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1676) (-1, _1684) 0 ]", "EXPR [ (1, _1668, _1684) (-1, _1685) 0 ]", "BLACKBOX::RANGE [(_1685, 32)] []", - "EXPR [ (1, _1685) (-1, _1686) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1685) (-1, _1686) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1668, _1686) (-1, _1687) 0 ]", "BLACKBOX::RANGE [(_1687, 32)] []", - "EXPR [ (1, _1687) (-1, _1688) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1687) (-1, _1688) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1668, _1688) (-1, _1689) 0 ]", "BLACKBOX::RANGE [(_1689, 32)] []", - "EXPR [ (1, _1689) (-1, _1690) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1689) (-1, _1690) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1668, _1690) (-1, _1691) 0 ]", "BLACKBOX::RANGE [(_1691, 32)] []", "EXPR [ (1, _1668, _1676) (1, _1677, _1678) (-1, _1692) 0 ]", @@ -2444,13 +2444,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1691) (-1, _1698) 0 ]", "EXPR [ (1, _1668, _1698) (-1, _1699) 0 ]", "BLACKBOX::RANGE [(_1699, 32)] []", - "EXPR [ (1, _1699) (-1, _1700) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1699) (-1, _1700) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1668, _1700) (-1, _1701) 0 ]", "BLACKBOX::RANGE [(_1701, 32)] []", - "EXPR [ (1, _1701) (-1, _1702) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1701) (-1, _1702) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1668, _1702) (-1, _1703) 0 ]", "BLACKBOX::RANGE [(_1703, 32)] []", - "EXPR [ (1, _1703) (-1, _1704) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1703) (-1, _1704) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1668, _1704) (-1, _1705) 0 ]", "BLACKBOX::RANGE [(_1705, 32)] []", "EXPR [ (1, _1668, _1691) (1, _1677, _1692) (-1, _1706) 0 ]", @@ -2463,13 +2463,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1705) (-1, _1712) 0 ]", "EXPR [ (1, _1668, _1712) (-1, _1713) 0 ]", "BLACKBOX::RANGE [(_1713, 32)] []", - "EXPR [ (1, _1713) (-1, _1714) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1713) (-1, _1714) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1668, _1714) (-1, _1715) 0 ]", "BLACKBOX::RANGE [(_1715, 32)] []", - "EXPR [ (1, _1715) (-1, _1716) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1715) (-1, _1716) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1668, _1716) (-1, _1717) 0 ]", "BLACKBOX::RANGE [(_1717, 32)] []", - "EXPR [ (1, _1717) (-1, _1718) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1717) (-1, _1718) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1668, _1718) (-1, _1719) 0 ]", "BLACKBOX::RANGE [(_1719, 32)] []", "EXPR [ (1, _1668, _1705) (1, _1677, _1706) (-1, _1720) 0 ]", @@ -2482,22 +2482,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 29 })], outputs: [Simple(Witness(1726))]", "EXPR [ (-1, _0, _1726) (29, _1726) (1, _1727) -1 ]", "EXPR [ (-1, _0, _1727) (29, _1727) 0 ]", - "EXPR [ (1, _1668, _1719) (-1, _2502) 0 ]", - "EXPR [ (1, _1677, _1720) (-1, _2503) 0 ]", - "EXPR [ (-1, _1728) (1, _1994) (1, _2502) (1, _2503) 0 ]", + "EXPR [ (1, _1668, _1719) (-1, _2421) 0 ]", + "EXPR [ (1, _1677, _1720) (-1, _2422) 0 ]", + "EXPR [ (-1, _1728) (1, _1913) (1, _2421) (1, _2422) 0 ]", "EXPR [ (1, _1727, _1728) (-1, _1729) 0 ]", "BLACKBOX::RANGE [(_1729, 32)] []", - "EXPR [ (1, _1729) (-1, _1730) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1729) (-1, _1730) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1727, _1730) (-1, _1731) 0 ]", "BLACKBOX::RANGE [(_1731, 32)] []", - "EXPR [ (1, _1731) (-1, _1732) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1731) (-1, _1732) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1727, _1732) (-1, _1733) 0 ]", "BLACKBOX::RANGE [(_1733, 32)] []", - "EXPR [ (1, _1733) (-1, _1734) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1733) (-1, _1734) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1727, _1734) (-1, _1735) 0 ]", "BLACKBOX::RANGE [(_1735, 32)] []", "EXPR [ (-1, _1727) (-1, _1736) 1 ]", - "EXPR [ (-1, _1737) (1, _2502) (1, _2503) 0 ]", + "EXPR [ (-1, _1737) (1, _2421) (1, _2422) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1735))], q_c: -4864 })], outputs: [Simple(Witness(1738))]", "EXPR [ (1, _1735, _1738) (-4864, _1738) (1, _1739) -1 ]", "EXPR [ (1, _1735, _1739) (-4864, _1739) 0 ]", @@ -2507,13 +2507,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1735) (-1, _1743) 0 ]", "EXPR [ (1, _1727, _1743) (-1, _1744) 0 ]", "BLACKBOX::RANGE [(_1744, 32)] []", - "EXPR [ (1, _1744) (-1, _1745) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1744) (-1, _1745) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1727, _1745) (-1, _1746) 0 ]", "BLACKBOX::RANGE [(_1746, 32)] []", - "EXPR [ (1, _1746) (-1, _1747) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1746) (-1, _1747) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1727, _1747) (-1, _1748) 0 ]", "BLACKBOX::RANGE [(_1748, 32)] []", - "EXPR [ (1, _1748) (-1, _1749) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1748) (-1, _1749) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1727, _1749) (-1, _1750) 0 ]", "BLACKBOX::RANGE [(_1750, 32)] []", "EXPR [ (1, _1727, _1735) (1, _1736, _1737) (-1, _1751) 0 ]", @@ -2527,13 +2527,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1750) (-1, _1758) 0 ]", "EXPR [ (1, _1727, _1758) (-1, _1759) 0 ]", "BLACKBOX::RANGE [(_1759, 32)] []", - "EXPR [ (1, _1759) (-1, _1760) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1759) (-1, _1760) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1727, _1760) (-1, _1761) 0 ]", "BLACKBOX::RANGE [(_1761, 32)] []", - "EXPR [ (1, _1761) (-1, _1762) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1761) (-1, _1762) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1727, _1762) (-1, _1763) 0 ]", "BLACKBOX::RANGE [(_1763, 32)] []", - "EXPR [ (1, _1763) (-1, _1764) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1763) (-1, _1764) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1727, _1764) (-1, _1765) 0 ]", "BLACKBOX::RANGE [(_1765, 32)] []", "EXPR [ (1, _1727, _1750) (1, _1736, _1751) (-1, _1766) 0 ]", @@ -2545,295 +2545,180 @@ expression: artifact "EXPR [ (1, _1750, _1754) (1, _1755, _1756) (-1, _1771) 0 ]", "EXPR [ (32, _1727) (-1, _1772) 0 ]", "BLACKBOX::RANGE [(_1772, 5)] []", - "EXPR [ (1, _4, _43) (1, _1765) (-1, _1773) 0 ]", - "EXPR [ (1, _1727, _1773) (-1, _1774) 0 ]", - "BLACKBOX::RANGE [(_1774, 32)] []", - "EXPR [ (1, _1774) (-1, _1775) (1, _2026) (1, _2055) 0 ]", - "EXPR [ (1, _1727, _1775) (-1, _1776) 0 ]", - "BLACKBOX::RANGE [(_1776, 32)] []", - "EXPR [ (1, _1776) (-1, _1777) (1, _2056) (1, _2083) 0 ]", - "EXPR [ (1, _1727, _1777) (-1, _1778) 0 ]", - "BLACKBOX::RANGE [(_1778, 32)] []", - "EXPR [ (1, _1778) (-1, _1779) (1, _2084) (1, _2103) 0 ]", - "EXPR [ (1, _1727, _1779) (-1, _1780) 0 ]", - "BLACKBOX::RANGE [(_1780, 32)] []", - "EXPR [ (1, _1727, _1765) (1, _1736, _1766) (-1, _1781) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1780))], q_c: -4864 })], outputs: [Simple(Witness(1782))]", - "EXPR [ (1, _1780, _1782) (-4864, _1782) (1, _1783) -1 ]", - "EXPR [ (1, _1780, _1783) (-4864, _1783) 0 ]", - "EXPR [ (1, _1727, _1783) (-1, _1784) 0 ]", - "EXPR [ (-1, _1727, _1783) (-1, _1785) 1 ]", - "EXPR [ (1, _1765, _1769) (1, _1770, _1771) (-1, _1786) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 30 })], outputs: [Simple(Witness(1787))]", - "EXPR [ (-1, _0, _1787) (30, _1787) (1, _1788) -1 ]", - "EXPR [ (-1, _0, _1788) (30, _1788) 0 ]", - "EXPR [ (1, _1727, _1780) (-1, _2518) 0 ]", - "EXPR [ (1, _1736, _1781) (-1, _2519) 0 ]", - "EXPR [ (-1, _1789) (1, _1994) (1, _2518) (1, _2519) 0 ]", - "EXPR [ (1, _1788, _1789) (-1, _1790) 0 ]", - "BLACKBOX::RANGE [(_1790, 32)] []", - "EXPR [ (1, _1790) (-1, _1791) (1, _2026) (1, _2055) 0 ]", - "EXPR [ (1, _1788, _1791) (-1, _1792) 0 ]", - "BLACKBOX::RANGE [(_1792, 32)] []", - "EXPR [ (1, _1792) (-1, _1793) (1, _2056) (1, _2083) 0 ]", - "EXPR [ (1, _1788, _1793) (-1, _1794) 0 ]", - "BLACKBOX::RANGE [(_1794, 32)] []", - "EXPR [ (1, _1794) (-1, _1795) (1, _2084) (1, _2103) 0 ]", - "EXPR [ (1, _1788, _1795) (-1, _1796) 0 ]", - "BLACKBOX::RANGE [(_1796, 32)] []", - "EXPR [ (-1, _1788) (-1, _1797) 1 ]", - "EXPR [ (-1, _1798) (1, _2518) (1, _2519) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1796))], q_c: -4864 })], outputs: [Simple(Witness(1799))]", - "EXPR [ (1, _1796, _1799) (-4864, _1799) (1, _1800) -1 ]", - "EXPR [ (1, _1796, _1800) (-4864, _1800) 0 ]", - "EXPR [ (1, _1788, _1800) (-1, _1801) 0 ]", - "EXPR [ (-1, _1788, _1800) (-1, _1802) 1 ]", - "EXPR [ (1, _1780, _1784) (1, _1785, _1786) (-1, _1803) 0 ]", - "EXPR [ (1, _67, _1727) (1, _1736, _1757) (-1, _1804) 0 ]", - "EXPR [ (1, _4, _43) (1, _1796) (-1, _1805) 0 ]", - "EXPR [ (1, _1788, _1805) (-1, _1806) 0 ]", - "BLACKBOX::RANGE [(_1806, 32)] []", - "EXPR [ (1, _1806) (-1, _1807) (1, _2026) (1, _2055) 0 ]", - "EXPR [ (1, _1788, _1807) (-1, _1808) 0 ]", - "BLACKBOX::RANGE [(_1808, 32)] []", - "EXPR [ (1, _1808) (-1, _1809) (1, _2056) (1, _2083) 0 ]", - "EXPR [ (1, _1788, _1809) (-1, _1810) 0 ]", - "BLACKBOX::RANGE [(_1810, 32)] []", - "EXPR [ (1, _1810) (-1, _1811) (1, _2084) (1, _2103) 0 ]", - "EXPR [ (1, _1788, _1811) (-1, _1812) 0 ]", - "BLACKBOX::RANGE [(_1812, 32)] []", - "EXPR [ (1, _1788, _1796) (1, _1797, _1798) (-1, _1813) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1812))], q_c: -4864 })], outputs: [Simple(Witness(1814))]", - "EXPR [ (1, _1812, _1814) (-4864, _1814) (1, _1815) -1 ]", - "EXPR [ (1, _1812, _1815) (-4864, _1815) 0 ]", - "EXPR [ (1, _1788, _1815) (-1, _1816) 0 ]", - "EXPR [ (-1, _1788, _1815) (-1, _1817) 1 ]", - "EXPR [ (1, _1796, _1801) (1, _1802, _1803) (-1, _1818) 0 ]", - "EXPR [ (32, _1788) (-1, _1819) 0 ]", - "BLACKBOX::RANGE [(_1819, 5)] []", - "EXPR [ (1, _4, _43) (1, _1812) (-1, _1820) 0 ]", - "EXPR [ (1, _1788, _1820) (-1, _1821) 0 ]", + "EXPR [ (1, _1727, _1765) (1, _1736, _1766) (-1, _1773) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 30 })], outputs: [Simple(Witness(1774))]", + "EXPR [ (-1, _0, _1774) (30, _1774) (1, _1775) -1 ]", + "EXPR [ (-1, _0, _1775) (30, _1775) 0 ]", + "EXPR [ (1, _1736, _1773) (-1, _1776) (1, _1913) 0 ]", + "EXPR [ (1, _1775, _1776) (-1, _1777) 0 ]", + "BLACKBOX::RANGE [(_1777, 32)] []", + "EXPR [ (1, _1777) (-1, _1778) (1, _1945) (1, _1974) 0 ]", + "EXPR [ (1, _1775, _1778) (-1, _1779) 0 ]", + "BLACKBOX::RANGE [(_1779, 32)] []", + "EXPR [ (1, _1779) (-1, _1780) (1, _1975) (1, _2002) 0 ]", + "EXPR [ (1, _1775, _1780) (-1, _1781) 0 ]", + "BLACKBOX::RANGE [(_1781, 32)] []", + "EXPR [ (1, _1781) (-1, _1782) (1, _2003) (1, _2022) 0 ]", + "EXPR [ (1, _1775, _1782) (-1, _1783) 0 ]", + "BLACKBOX::RANGE [(_1783, 32)] []", + "EXPR [ (-1, _1775) (-1, _1784) 1 ]", + "EXPR [ (1, _1736, _1773) (-1, _1785) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1783))], q_c: -4864 })], outputs: [Simple(Witness(1786))]", + "EXPR [ (1, _1783, _1786) (-4864, _1786) (1, _1787) -1 ]", + "EXPR [ (1, _1783, _1787) (-4864, _1787) 0 ]", + "EXPR [ (1, _1775, _1787) (-1, _1788) 0 ]", + "EXPR [ (-1, _1775, _1787) (-1, _1789) 1 ]", + "EXPR [ (1, _1765, _1769) (1, _1770, _1771) (-1, _1790) 0 ]", + "EXPR [ (1, _67, _1727) (1, _1736, _1757) (-1, _1791) 0 ]", + "EXPR [ (1, _4, _43) (1, _1783) (-1, _1792) 0 ]", + "EXPR [ (1, _1775, _1792) (-1, _1793) 0 ]", + "BLACKBOX::RANGE [(_1793, 32)] []", + "EXPR [ (1, _1793) (-1, _1794) (1, _1945) (1, _1974) 0 ]", + "EXPR [ (1, _1775, _1794) (-1, _1795) 0 ]", + "BLACKBOX::RANGE [(_1795, 32)] []", + "EXPR [ (1, _1795) (-1, _1796) (1, _1975) (1, _2002) 0 ]", + "EXPR [ (1, _1775, _1796) (-1, _1797) 0 ]", + "BLACKBOX::RANGE [(_1797, 32)] []", + "EXPR [ (1, _1797) (-1, _1798) (1, _2003) (1, _2022) 0 ]", + "EXPR [ (1, _1775, _1798) (-1, _1799) 0 ]", + "BLACKBOX::RANGE [(_1799, 32)] []", + "EXPR [ (1, _1775, _1783) (1, _1784, _1785) (-1, _1800) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1799))], q_c: -4864 })], outputs: [Simple(Witness(1801))]", + "EXPR [ (1, _1799, _1801) (-4864, _1801) (1, _1802) -1 ]", + "EXPR [ (1, _1799, _1802) (-4864, _1802) 0 ]", + "EXPR [ (1, _1775, _1802) (-1, _1803) 0 ]", + "EXPR [ (-1, _1775, _1802) (-1, _1804) 1 ]", + "EXPR [ (1, _1783, _1788) (1, _1789, _1790) (-1, _1805) 0 ]", + "EXPR [ (32, _1775) (-1, _1806) 0 ]", + "BLACKBOX::RANGE [(_1806, 5)] []", + "EXPR [ (1, _1775, _1799) (1, _1784, _1800) (-1, _1807) 0 ]", + "EXPR [ (33, _1775) (-1, _1808) 0 ]", + "BLACKBOX::RANGE [(_1808, 5)] []", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 31 })], outputs: [Simple(Witness(1809))]", + "EXPR [ (-1, _0, _1809) (31, _1809) (1, _1810) -1 ]", + "EXPR [ (-1, _0, _1810) (31, _1810) 0 ]", + "EXPR [ (1, _1799, _1803) (1, _1804, _1805) (-1, _1811) 0 ]", + "EXPR [ (-1, _1810) (-1, _1812) 1 ]", + "EXPR [ (1, _57, _1775) (1, _1784, _1791) (-1, _1813) 0 ]", + "EXPR [ (1, _1784, _1807) (-1, _1814) (1, _1913) 0 ]", + "EXPR [ (1, _1810, _1814) (-1, _1815) 0 ]", + "BLACKBOX::RANGE [(_1815, 32)] []", + "EXPR [ (1, _1815) (-1, _1816) (1, _1945) (1, _1974) 0 ]", + "EXPR [ (1, _1810, _1816) (-1, _1817) 0 ]", + "BLACKBOX::RANGE [(_1817, 32)] []", + "EXPR [ (1, _1817) (-1, _1818) (1, _1975) (1, _2002) 0 ]", + "EXPR [ (1, _1810, _1818) (-1, _1819) 0 ]", + "BLACKBOX::RANGE [(_1819, 32)] []", + "EXPR [ (1, _1819) (-1, _1820) (1, _2003) (1, _2022) 0 ]", + "EXPR [ (1, _1810, _1820) (-1, _1821) 0 ]", "BLACKBOX::RANGE [(_1821, 32)] []", - "EXPR [ (1, _1821) (-1, _1822) (1, _2026) (1, _2055) 0 ]", - "EXPR [ (1, _1788, _1822) (-1, _1823) 0 ]", - "BLACKBOX::RANGE [(_1823, 32)] []", - "EXPR [ (1, _1823) (-1, _1824) (1, _2056) (1, _2083) 0 ]", - "EXPR [ (1, _1788, _1824) (-1, _1825) 0 ]", - "BLACKBOX::RANGE [(_1825, 32)] []", - "EXPR [ (1, _1825) (-1, _1826) (1, _2084) (1, _2103) 0 ]", - "EXPR [ (1, _1788, _1826) (-1, _1827) 0 ]", - "BLACKBOX::RANGE [(_1827, 32)] []", - "EXPR [ (1, _1788, _1812) (1, _1797, _1813) (-1, _1828) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1827))], q_c: -4864 })], outputs: [Simple(Witness(1829))]", - "EXPR [ (1, _1827, _1829) (-4864, _1829) (1, _1830) -1 ]", - "EXPR [ (1, _1827, _1830) (-4864, _1830) 0 ]", - "EXPR [ (1, _1788, _1830) (-1, _1831) 0 ]", - "EXPR [ (-1, _1788, _1830) (-1, _1832) 1 ]", - "EXPR [ (1, _1812, _1816) (1, _1817, _1818) (-1, _1833) 0 ]", - "EXPR [ (33, _1788) (-1, _1834) 0 ]", - "BLACKBOX::RANGE [(_1834, 5)] []", - "EXPR [ (1, _4, _43) (1, _1827) (-1, _1835) 0 ]", - "EXPR [ (1, _1788, _1835) (-1, _1836) 0 ]", - "BLACKBOX::RANGE [(_1836, 32)] []", - "EXPR [ (1, _1836) (-1, _1837) (1, _2026) (1, _2055) 0 ]", - "EXPR [ (1, _1788, _1837) (-1, _1838) 0 ]", - "BLACKBOX::RANGE [(_1838, 32)] []", - "EXPR [ (1, _1838) (-1, _1839) (1, _2056) (1, _2083) 0 ]", - "EXPR [ (1, _1788, _1839) (-1, _1840) 0 ]", - "BLACKBOX::RANGE [(_1840, 32)] []", - "EXPR [ (1, _1840) (-1, _1841) (1, _2084) (1, _2103) 0 ]", - "EXPR [ (1, _1788, _1841) (-1, _1842) 0 ]", - "BLACKBOX::RANGE [(_1842, 32)] []", - "EXPR [ (1, _1788, _1827) (1, _1797, _1828) (-1, _1843) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1842))], q_c: -4864 })], outputs: [Simple(Witness(1844))]", - "EXPR [ (1, _1842, _1844) (-4864, _1844) (1, _1845) -1 ]", - "EXPR [ (1, _1842, _1845) (-4864, _1845) 0 ]", - "EXPR [ (1, _1788, _1845) (-1, _1846) 0 ]", - "EXPR [ (-1, _1788, _1845) (-1, _1847) 1 ]", - "EXPR [ (1, _1827, _1831) (1, _1832, _1833) (-1, _1848) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 31 })], outputs: [Simple(Witness(1849))]", - "EXPR [ (-1, _0, _1849) (31, _1849) (1, _1850) -1 ]", - "EXPR [ (-1, _0, _1850) (31, _1850) 0 ]", - "EXPR [ (1, _1842, _1846) (1, _1847, _1848) (-1, _1851) 0 ]", - "EXPR [ (-1, _1850) (-1, _1852) 1 ]", - "EXPR [ (1, _57, _1788) (1, _1797, _1804) (-1, _1853) 0 ]", - "EXPR [ (1, _1788, _1842) (-1, _2540) 0 ]", - "EXPR [ (1, _1797, _1843) (-1, _2541) 0 ]", - "EXPR [ (-1, _1854) (1, _1994) (1, _2540) (1, _2541) 0 ]", - "EXPR [ (1, _1850, _1854) (-1, _1855) 0 ]", - "BLACKBOX::RANGE [(_1855, 32)] []", - "EXPR [ (1, _1855) (-1, _1856) (1, _2026) (1, _2055) 0 ]", - "EXPR [ (1, _1850, _1856) (-1, _1857) 0 ]", - "BLACKBOX::RANGE [(_1857, 32)] []", - "EXPR [ (1, _1857) (-1, _1858) (1, _2056) (1, _2083) 0 ]", - "EXPR [ (1, _1850, _1858) (-1, _1859) 0 ]", - "BLACKBOX::RANGE [(_1859, 32)] []", - "EXPR [ (1, _1859) (-1, _1860) (1, _2084) (1, _2103) 0 ]", - "EXPR [ (1, _1850, _1860) (-1, _1861) 0 ]", - "BLACKBOX::RANGE [(_1861, 32)] []", - "EXPR [ (-1, _1862) (1, _2540) (1, _2541) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1861))], q_c: -4864 })], outputs: [Simple(Witness(1863))]", - "EXPR [ (1, _1861, _1863) (-4864, _1863) (1, _1864) -1 ]", - "EXPR [ (1, _1861, _1864) (-4864, _1864) 0 ]", - "EXPR [ (1, _1850, _1864) (-1, _1865) 0 ]", - "EXPR [ (-1, _1850, _1864) (-1, _1866) 1 ]", - "EXPR [ (32, _1850) (-1, _1867) 0 ]", - "BLACKBOX::RANGE [(_1867, 5)] []", - "EXPR [ (1, _4, _43) (1, _1861) (-1, _1868) 0 ]", - "EXPR [ (1, _1850, _1868) (-1, _1869) 0 ]", + "EXPR [ (1, _1784, _1807) (-1, _1822) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1821))], q_c: -4864 })], outputs: [Simple(Witness(1823))]", + "EXPR [ (1, _1821, _1823) (-4864, _1823) (1, _1824) -1 ]", + "EXPR [ (1, _1821, _1824) (-4864, _1824) 0 ]", + "EXPR [ (1, _1810, _1824) (-1, _1825) 0 ]", + "EXPR [ (-1, _1810, _1824) (-1, _1826) 1 ]", + "EXPR [ (32, _1810) (-1, _1827) 0 ]", + "BLACKBOX::RANGE [(_1827, 5)] []", + "EXPR [ (1, _1810, _1821) (1, _1812, _1822) (-1, _1828) 0 ]", + "EXPR [ (33, _1810) (-1, _1829) 0 ]", + "BLACKBOX::RANGE [(_1829, 5)] []", + "EXPR [ (34, _1810) (-1, _1830) 0 ]", + "BLACKBOX::RANGE [(_1830, 5)] []", + "EXPR [ (1, _1810, _1811) (1, _1812, _1813) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(1, Witness(1812), Witness(1828))], linear_combinations: [], q_c: -13 })], outputs: [Simple(Witness(1831))]", + "EXPR [ (1, _1812, _1828) (-1, _1832) -13 ]", + "EXPR [ (1, _1831, _1832) -1 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 })], outputs: [Simple(Witness(1833))]", + "EXPR [ (1, _0, _1833) (1, _1834) -1 ]", + "EXPR [ (1, _0, _1834) 0 ]", + "EXPR [ (1, _0) 0 ]", + "EXPR [ (-1, _1834) 1 ]", + "EXPR [ (-1, _77, _1834) (1, _77) (3, _1834) (-1, _1835) 0 ]", + "EXPR [ (1, _1834, _1835) -3 ]", + "BLACKBOX::BLAKE3 [(_5, 8), (_6, 8), (_7, 8), (_8, 8), (_9, 8)] [_1836, _1837, _1838, _1839, _1840, _1841, _1842, _1843, _1844, _1845, _1846, _1847, _1848, _1849, _1850, _1851, _1852, _1853, _1854, _1855, _1856, _1857, _1858, _1859, _1860, _1861, _1862, _1863, _1864, _1865, _1866, _1867]", + "EXPR [ (1, _1834, _1836) (-1, _10) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(1, Witness(1834), Witness(67))], linear_combinations: [], q_c: 4294967293 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 4294967296 })], outputs: [Simple(Witness(1868)), Simple(Witness(1869))]", + "BLACKBOX::RANGE [(_1868, 1)] []", "BLACKBOX::RANGE [(_1869, 32)] []", - "EXPR [ (1, _1869) (-1, _1870) (1, _2026) (1, _2055) 0 ]", - "EXPR [ (1, _1850, _1870) (-1, _1871) 0 ]", - "BLACKBOX::RANGE [(_1871, 32)] []", - "EXPR [ (1, _1871) (-1, _1872) (1, _2056) (1, _2083) 0 ]", - "EXPR [ (1, _1850, _1872) (-1, _1873) 0 ]", + "EXPR [ (1, _67, _1834) (-4294967296, _1868) (-1, _1869) 4294967293 ]", + "EXPR [ (-1, _1868) (-1, _1870) 1 ]", + "EXPR [ (1, _67, _1834) (-1, _1871) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-1, Witness(1870), Witness(1871))], linear_combinations: [(1, Witness(57)), (-3, Witness(1868))], q_c: 4294967296 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 4294967296 })], outputs: [Simple(Witness(1872)), Simple(Witness(1873))]", + "BLACKBOX::RANGE [(_1872, 1)] []", "BLACKBOX::RANGE [(_1873, 32)] []", - "EXPR [ (1, _1873) (-1, _1874) (1, _2084) (1, _2103) 0 ]", - "EXPR [ (1, _1850, _1874) (-1, _1875) 0 ]", - "BLACKBOX::RANGE [(_1875, 32)] []", - "EXPR [ (1, _1850, _1861) (1, _1852, _1862) (-1, _1876) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1875))], q_c: -4864 })], outputs: [Simple(Witness(1877))]", - "EXPR [ (1, _1875, _1877) (-4864, _1877) (1, _1878) -1 ]", - "EXPR [ (1, _1875, _1878) (-4864, _1878) 0 ]", - "EXPR [ (1, _1850, _1878) (-1, _1879) 0 ]", - "EXPR [ (-1, _1850, _1878) (-1, _1880) 1 ]", - "EXPR [ (1, _1851, _1866) (1, _1861, _1865) (-1, _1881) 0 ]", - "EXPR [ (33, _1850) (-1, _1882) 0 ]", - "BLACKBOX::RANGE [(_1882, 5)] []", - "EXPR [ (1, _4, _43) (1, _1875) (-1, _1883) 0 ]", - "EXPR [ (1, _1850, _1883) (-1, _1884) 0 ]", - "BLACKBOX::RANGE [(_1884, 32)] []", - "EXPR [ (1, _1884) (-1, _1885) (1, _2026) (1, _2055) 0 ]", - "EXPR [ (1, _1850, _1885) (-1, _1886) 0 ]", + "EXPR [ (-1, _1870, _1871) (1, _57) (-3, _1868) (-4294967296, _1872) (-1, _1873) 4294967296 ]", + "EXPR [ (1, _1870, _1871) (3, _1868) (-1, _1874) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-1, Witness(1868), Witness(1871)), (1, Witness(1872), Witness(57)), (-1, Witness(1872), Witness(1874))], linear_combinations: [(-3, Witness(1870)), (1, Witness(1874))], q_c: 4294967296 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 4294967296 })], outputs: [Simple(Witness(1875)), Simple(Witness(1876))]", + "BLACKBOX::RANGE [(_1875, 1)] []", + "BLACKBOX::RANGE [(_1876, 32)] []", + "EXPR [ (1, _57, _1872) (-1, _2457) 0 ]", + "EXPR [ (-1, _1872, _1874) (-1, _2459) 0 ]", + "EXPR [ (-1, _1868, _1871) (-3, _1870) (1, _1874) (-4294967296, _1875) (-1, _1876) (1, _2457) (1, _2459) 4294967296 ]", + "EXPR [ (-1, _1875) (-1, _1877) 1 ]", + "EXPR [ (1, _1874) (-1, _1878) (1, _2457) (1, _2459) 0 ]", + "EXPR [ (1, _1868, _1871) (3, _1870) (-1, _1879) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(1, Witness(1825), Witness(1821)), (1, Witness(1826), Witness(1811)), (1, Witness(1872), Witness(57)), (-1, Witness(1872), Witness(1874))], linear_combinations: [(-1, Witness(57))], q_c: 4294967296 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 4294967296 })], outputs: [Simple(Witness(1880)), Simple(Witness(1881))]", + "BLACKBOX::RANGE [(_1880, 1)] []", + "BLACKBOX::RANGE [(_1881, 32)] []", + "EXPR [ (1, _1811, _1826) (-1, _2462) 0 ]", + "EXPR [ (1, _1821, _1825) (-1, _2463) 0 ]", + "EXPR [ (-1, _57) (-4294967296, _1880) (-1, _1881) (1, _2457) (1, _2459) (1, _2462) (1, _2463) 4294967296 ]", + "EXPR [ (-1, _1880) (-1, _1882) 1 ]", + "EXPR [ (-1, _1883) (1, _2462) (1, _2463) 0 ]", + "EXPR [ (1, _57) (-1, _1884) (-1, _2457) (-1, _2459) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-1, Witness(1875), Witness(1879)), (-1, Witness(1877), Witness(1878)), (1, Witness(1880), Witness(1883)), (1, Witness(1882), Witness(1884))], linear_combinations: [], q_c: 4294967296 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 4294967296 })], outputs: [Simple(Witness(1885)), Simple(Witness(1886))]", + "BLACKBOX::RANGE [(_1885, 1)] []", "BLACKBOX::RANGE [(_1886, 32)] []", - "EXPR [ (1, _1886) (-1, _1887) (1, _2056) (1, _2083) 0 ]", - "EXPR [ (1, _1850, _1887) (-1, _1888) 0 ]", - "BLACKBOX::RANGE [(_1888, 32)] []", - "EXPR [ (1, _1888) (-1, _1889) (1, _2084) (1, _2103) 0 ]", - "EXPR [ (1, _1850, _1889) (-1, _1890) 0 ]", - "BLACKBOX::RANGE [(_1890, 32)] []", - "EXPR [ (1, _1850, _1875) (1, _1852, _1876) (-1, _1891) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1890))], q_c: -4864 })], outputs: [Simple(Witness(1892))]", - "EXPR [ (1, _1890, _1892) (-4864, _1892) (1, _1893) -1 ]", - "EXPR [ (1, _1890, _1893) (-4864, _1893) 0 ]", - "EXPR [ (1, _1850, _1893) (-1, _1894) 0 ]", - "EXPR [ (-1, _1850, _1893) (-1, _1895) 1 ]", - "EXPR [ (1, _1875, _1879) (1, _1880, _1881) (-1, _1896) 0 ]", - "EXPR [ (34, _1850) (-1, _1897) 0 ]", - "BLACKBOX::RANGE [(_1897, 5)] []", - "EXPR [ (1, _4, _43) (1, _1890) (-1, _1898) 0 ]", - "EXPR [ (1, _1850, _1898) (-1, _1899) 0 ]", - "BLACKBOX::RANGE [(_1899, 32)] []", - "EXPR [ (1, _1899) (-1, _1900) (1, _2026) (1, _2055) 0 ]", - "EXPR [ (1, _1850, _1900) (-1, _1901) 0 ]", - "BLACKBOX::RANGE [(_1901, 32)] []", - "EXPR [ (1, _1901) (-1, _1902) (1, _2056) (1, _2083) 0 ]", - "EXPR [ (1, _1850, _1902) (-1, _1903) 0 ]", - "BLACKBOX::RANGE [(_1903, 32)] []", - "EXPR [ (1, _1903) (-1, _1904) (1, _2084) (1, _2103) 0 ]", - "EXPR [ (1, _1850, _1904) (-1, _1905) 0 ]", - "BLACKBOX::RANGE [(_1905, 32)] []", - "EXPR [ (1, _1850, _1890) (1, _1852, _1891) (-1, _1906) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1905))], q_c: -4864 })], outputs: [Simple(Witness(1907))]", - "EXPR [ (1, _1905, _1907) (-4864, _1907) (1, _1908) -1 ]", - "EXPR [ (1, _1905, _1908) (-4864, _1908) 0 ]", - "EXPR [ (1, _1850, _1908) (-1, _1909) 0 ]", - "EXPR [ (-1, _1850, _1908) (-1, _1910) 1 ]", - "EXPR [ (1, _1890, _1894) (1, _1895, _1896) (-1, _1911) 0 ]", - "EXPR [ (1, _1850, _1851) (1, _1852, _1853) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(1, Witness(1850), Witness(1905)), (1, Witness(1852), Witness(1906))], linear_combinations: [], q_c: -13 })], outputs: [Simple(Witness(1912))]", - "EXPR [ (1, _1850, _1905) (1, _1852, _1906) (-1, _1913) -13 ]", - "EXPR [ (1, _1912, _1913) -1 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 })], outputs: [Simple(Witness(1914))]", - "EXPR [ (1, _0, _1914) (1, _1915) -1 ]", - "EXPR [ (1, _0, _1915) 0 ]", - "EXPR [ (1, _0) 0 ]", - "EXPR [ (-1, _1915) 1 ]", - "EXPR [ (-1, _77, _1915) (1, _77) (3, _1915) (-1, _1916) 0 ]", - "EXPR [ (1, _1915, _1916) -3 ]", - "BLACKBOX::BLAKE3 [(_5, 8), (_6, 8), (_7, 8), (_8, 8), (_9, 8)] [_1917, _1918, _1919, _1920, _1921, _1922, _1923, _1924, _1925, _1926, _1927, _1928, _1929, _1930, _1931, _1932, _1933, _1934, _1935, _1936, _1937, _1938, _1939, _1940, _1941, _1942, _1943, _1944, _1945, _1946, _1947, _1948]", - "EXPR [ (1, _1915, _1917) (-1, _10) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(1, Witness(1915), Witness(67))], linear_combinations: [], q_c: 4294967293 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 4294967296 })], outputs: [Simple(Witness(1949)), Simple(Witness(1950))]", - "BLACKBOX::RANGE [(_1949, 1)] []", - "BLACKBOX::RANGE [(_1950, 32)] []", - "EXPR [ (1, _67, _1915) (-4294967296, _1949) (-1, _1950) 4294967293 ]", - "EXPR [ (-1, _1949) (-1, _1951) 1 ]", - "EXPR [ (1, _67, _1915) (-1, _1952) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-1, Witness(1951), Witness(1952))], linear_combinations: [(1, Witness(57)), (-3, Witness(1949))], q_c: 4294967296 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 4294967296 })], outputs: [Simple(Witness(1953)), Simple(Witness(1954))]", - "BLACKBOX::RANGE [(_1953, 1)] []", - "BLACKBOX::RANGE [(_1954, 32)] []", - "EXPR [ (-1, _1951, _1952) (1, _57) (-3, _1949) (-4294967296, _1953) (-1, _1954) 4294967296 ]", - "EXPR [ (1, _1951, _1952) (3, _1949) (-1, _1955) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-1, Witness(1949), Witness(1952)), (1, Witness(1953), Witness(57)), (-1, Witness(1953), Witness(1955))], linear_combinations: [(-3, Witness(1951)), (1, Witness(1955))], q_c: 4294967296 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 4294967296 })], outputs: [Simple(Witness(1956)), Simple(Witness(1957))]", - "BLACKBOX::RANGE [(_1956, 1)] []", - "BLACKBOX::RANGE [(_1957, 32)] []", - "EXPR [ (1, _57, _1953) (-1, _2560) 0 ]", - "EXPR [ (-1, _1953, _1955) (-1, _2562) 0 ]", - "EXPR [ (-1, _1949, _1952) (-3, _1951) (1, _1955) (-4294967296, _1956) (-1, _1957) (1, _2560) (1, _2562) 4294967296 ]", - "EXPR [ (-1, _1956) (-1, _1958) 1 ]", - "EXPR [ (1, _1955) (-1, _1959) (1, _2560) (1, _2562) 0 ]", - "EXPR [ (1, _1949, _1952) (3, _1951) (-1, _1960) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(1, Witness(1909), Witness(1905)), (1, Witness(1910), Witness(1911)), (1, Witness(1953), Witness(57)), (-1, Witness(1953), Witness(1955))], linear_combinations: [(-1, Witness(57))], q_c: 4294967296 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 4294967296 })], outputs: [Simple(Witness(1961)), Simple(Witness(1962))]", - "BLACKBOX::RANGE [(_1961, 1)] []", - "BLACKBOX::RANGE [(_1962, 32)] []", - "EXPR [ (1, _1905, _1909) (-1, _2565) 0 ]", - "EXPR [ (1, _1910, _1911) (-1, _2566) 0 ]", - "EXPR [ (-1, _57) (-4294967296, _1961) (-1, _1962) (1, _2560) (1, _2562) (1, _2565) (1, _2566) 4294967296 ]", - "EXPR [ (-1, _1961) (-1, _1963) 1 ]", - "EXPR [ (-1, _1964) (1, _2565) (1, _2566) 0 ]", - "EXPR [ (1, _57) (-1, _1965) (-1, _2560) (-1, _2562) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-1, Witness(1956), Witness(1960)), (-1, Witness(1958), Witness(1959)), (1, Witness(1961), Witness(1964)), (1, Witness(1963), Witness(1965))], linear_combinations: [], q_c: 4294967296 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 4294967296 })], outputs: [Simple(Witness(1966)), Simple(Witness(1967))]", - "BLACKBOX::RANGE [(_1966, 1)] []", - "BLACKBOX::RANGE [(_1967, 32)] []", - "EXPR [ (-1, _1956, _1960) (-1, _2569) 0 ]", - "EXPR [ (-1, _1958, _1959) (-1, _2570) 0 ]", - "EXPR [ (1, _1961, _1964) (-1, _2571) 0 ]", - "EXPR [ (1, _1963, _1965) (-1, _2572) 0 ]", - "EXPR [ (-4294967296, _1966) (-1, _1967) (1, _2569) (1, _2570) (1, _2571) (1, _2572) 4294967296 ]", - "EXPR [ (-1, _1966) (-1, _1968) 1 ]", - "EXPR [ (-1, _1969) (1, _2571) (1, _2572) 0 ]", - "EXPR [ (-1, _1970) (-1, _2569) (-1, _2570) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-1, Witness(1956), Witness(1959)), (-1, Witness(1958), Witness(1960)), (1, Witness(1966), Witness(1969)), (1, Witness(1968), Witness(1970))], linear_combinations: [], q_c: 4294967296 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 4294967296 })], outputs: [Simple(Witness(1971)), Simple(Witness(1972))]", - "BLACKBOX::RANGE [(_1971, 1)] []", - "BLACKBOX::RANGE [(_1972, 32)] []", - "EXPR [ (-1, _1956, _1959) (-1, _2574) 0 ]", - "EXPR [ (-1, _1958, _1960) (-1, _2575) 0 ]", - "EXPR [ (1, _1966, _1969) (-1, _2576) 0 ]", - "EXPR [ (1, _1968, _1970) (-1, _2577) 0 ]", - "EXPR [ (-4294967296, _1971) (-1, _1972) (1, _2574) (1, _2575) (1, _2576) (1, _2577) 4294967296 ]", - "EXPR [ (-1, _1971) (-1, _1973) 1 ]", - "EXPR [ (-1, _1974) (1, _2576) (1, _2577) 0 ]", - "EXPR [ (-1, _1975) (-1, _2574) (-1, _2575) 0 ]", - "EXPR [ (1, _1961, _1965) (1, _1963, _1964) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(12, Witness(1915))], q_c: 0 })], outputs: [Simple(Witness(1976))]", - "EXPR [ (12, _1915, _1976) (1, _1977) -1 ]", - "EXPR [ (12, _1915, _1977) 0 ]", - "EXPR [ (-1, _1977) (-1, _1978) 1 ]", - "EXPR [ (2, _1915, _1915) (-1, _1979) 0 ]", - "EXPR [ (1, _1978, _1979) (3, _1977) -2 ]", - "EXPR [ (1, _1966, _1970) (1, _1968, _1969) (-1, _1980) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1980))], q_c: 0 })], outputs: [Simple(Witness(1981))]", - "EXPR [ (1, _1980, _1981) (1, _1982) -1 ]", - "EXPR [ (1, _1980, _1982) 0 ]", - "EXPR [ (1, _1971, _1975) (1, _1973, _1974) (-1, _1983) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1983))], q_c: 0 })], outputs: [Simple(Witness(1984))]", - "EXPR [ (1, _1983, _1984) (1, _1985) -1 ]", - "EXPR [ (1, _1983, _1985) 0 ]", - "EXPR [ (-1, _1985) (-1, _1986) 1 ]", - "EXPR [ (-2, _1977, _1982) (2, _1977) (3, _1982) (-1, _1987) 0 ]", - "EXPR [ (1, _1971, _1974) (1, _1973, _1975) (-1, _1988) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1988))], q_c: 0 })], outputs: [Simple(Witness(1989))]", - "EXPR [ (1, _1988, _1989) (1, _1990) -1 ]", - "EXPR [ (1, _1988, _1990) 0 ]", - "EXPR [ (-1, _1990) (-1, _1991) 1 ]", - "EXPR [ (1, _1986, _1987) (4, _1985) (-1, _1992) 0 ]", - "EXPR [ (1, _1991, _1992) (5, _1990) 0 ]", + "EXPR [ (-1, _1875, _1879) (-1, _2466) 0 ]", + "EXPR [ (-1, _1877, _1878) (-1, _2467) 0 ]", + "EXPR [ (1, _1880, _1883) (-1, _2468) 0 ]", + "EXPR [ (1, _1882, _1884) (-1, _2469) 0 ]", + "EXPR [ (-4294967296, _1885) (-1, _1886) (1, _2466) (1, _2467) (1, _2468) (1, _2469) 4294967296 ]", + "EXPR [ (-1, _1885) (-1, _1887) 1 ]", + "EXPR [ (-1, _1888) (1, _2468) (1, _2469) 0 ]", + "EXPR [ (-1, _1889) (-1, _2466) (-1, _2467) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-1, Witness(1875), Witness(1878)), (-1, Witness(1877), Witness(1879)), (1, Witness(1885), Witness(1888)), (1, Witness(1887), Witness(1889))], linear_combinations: [], q_c: 4294967296 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 4294967296 })], outputs: [Simple(Witness(1890)), Simple(Witness(1891))]", + "BLACKBOX::RANGE [(_1890, 1)] []", + "BLACKBOX::RANGE [(_1891, 32)] []", + "EXPR [ (-1, _1875, _1878) (-1, _2471) 0 ]", + "EXPR [ (-1, _1877, _1879) (-1, _2472) 0 ]", + "EXPR [ (1, _1885, _1888) (-1, _2473) 0 ]", + "EXPR [ (1, _1887, _1889) (-1, _2474) 0 ]", + "EXPR [ (-4294967296, _1890) (-1, _1891) (1, _2471) (1, _2472) (1, _2473) (1, _2474) 4294967296 ]", + "EXPR [ (-1, _1890) (-1, _1892) 1 ]", + "EXPR [ (-1, _1893) (1, _2473) (1, _2474) 0 ]", + "EXPR [ (-1, _1894) (-1, _2471) (-1, _2472) 0 ]", + "EXPR [ (1, _1880, _1884) (1, _1882, _1883) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(12, Witness(1834))], q_c: 0 })], outputs: [Simple(Witness(1895))]", + "EXPR [ (12, _1834, _1895) (1, _1896) -1 ]", + "EXPR [ (12, _1834, _1896) 0 ]", + "EXPR [ (-1, _1896) (-1, _1897) 1 ]", + "EXPR [ (2, _1834, _1834) (-1, _1898) 0 ]", + "EXPR [ (1, _1897, _1898) (3, _1896) -2 ]", + "EXPR [ (1, _1885, _1889) (1, _1887, _1888) (-1, _1899) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1899))], q_c: 0 })], outputs: [Simple(Witness(1900))]", + "EXPR [ (1, _1899, _1900) (1, _1901) -1 ]", + "EXPR [ (1, _1899, _1901) 0 ]", + "EXPR [ (1, _1890, _1894) (1, _1892, _1893) (-1, _1902) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1902))], q_c: 0 })], outputs: [Simple(Witness(1903))]", + "EXPR [ (1, _1902, _1903) (1, _1904) -1 ]", + "EXPR [ (1, _1902, _1904) 0 ]", + "EXPR [ (-1, _1904) (-1, _1905) 1 ]", + "EXPR [ (-2, _1896, _1901) (2, _1896) (3, _1901) (-1, _1906) 0 ]", + "EXPR [ (1, _1890, _1893) (1, _1892, _1894) (-1, _1907) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1907))], q_c: 0 })], outputs: [Simple(Witness(1908))]", + "EXPR [ (1, _1907, _1908) (1, _1909) -1 ]", + "EXPR [ (1, _1907, _1909) 0 ]", + "EXPR [ (-1, _1909) (-1, _1910) 1 ]", + "EXPR [ (1, _1905, _1906) (4, _1904) (-1, _1911) 0 ]", + "EXPR [ (1, _1910, _1911) (5, _1909) 0 ]", "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) } }]", "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\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 type H = H;\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 u8 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 u16 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 u32 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 u64 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", 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 328a2e85ff7..c52417fad1f 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 @@ -70,7 +70,7 @@ expression: artifact }, "bytecode": [ "func 0", - "current witness index : _2577", + "current witness index : _2474", "private parameters indices : [_0, _1, _2, _3, _4, _5, _6, _7, _8, _9]", "public parameters indices : [_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41]", "return value indices : []", @@ -119,9 +119,9 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 0 })], outputs: [Simple(Witness(42))]", "EXPR [ (-1, _0, _42) (1, _43) -1 ]", "EXPR [ (-1, _0, _43) 0 ]", - "EXPR [ (1, _0, _43) (-1, _1993) 0 ]", - "EXPR [ (1, _4, _43) (-1, _1994) 0 ]", - "EXPR [ (-1, _44) (1, _1993) (1, _1994) 0 ]", + "EXPR [ (1, _0, _43) (-1, _1912) 0 ]", + "EXPR [ (1, _4, _43) (-1, _1913) 0 ]", + "EXPR [ (-1, _44) (1, _1912) (1, _1913) 0 ]", "BLACKBOX::RANGE [(_44, 32)] []", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(44))], q_c: -4864 })], outputs: [Simple(Witness(45))]", "EXPR [ (1, _44, _45) (-4864, _45) (1, _46) -1 ]", @@ -130,8 +130,8 @@ expression: artifact "MEM (id: 0, read at: EXPR [ (1, _47) 0 ], value: EXPR [ (1, _48) 0 ]) ", "EXPR [ (1, _43, _46) (-1, _49) 0 ]", "INIT (id: 3, len: 4, witnesses: [_1, _2, _3, _4])", - "EXPR [ (1, _44, _49) (-1, _1995) 0 ]", - "EXPR [ (-1, _48, _49) (1, _48) (-1, _50) (1, _1995) 0 ]", + "EXPR [ (1, _44, _49) (-1, _1914) 0 ]", + "EXPR [ (-1, _48, _49) (1, _48) (-1, _50) (1, _1914) 0 ]", "MEM (id: 3, write EXPR [ (1, _50) 0 ] at: EXPR [ (1, _47) 0 ]) ", "EXPR [ (-1, _51) 0 ]", "MEM (id: 3, read at: EXPR [ (1, _51) 0 ], value: EXPR [ (1, _52) 0 ]) ", @@ -140,30 +140,30 @@ expression: artifact "EXPR [ (-1, _55) 2 ]", "MEM (id: 3, read at: EXPR [ (1, _55) 0 ], value: EXPR [ (1, _56) 0 ]) ", "EXPR [ (-1, _3, _49) (1, _49, _56) (1, _3) (-1, _57) 0 ]", - "EXPR [ (1, _43, _44) (-1, _1999) 0 ]", - "EXPR [ (-1, _58) (1, _1994) (1, _1999) 0 ]", + "EXPR [ (1, _43, _44) (-1, _1918) 0 ]", + "EXPR [ (-1, _58) (1, _1913) (1, _1918) 0 ]", "BLACKBOX::RANGE [(_58, 32)] []", - "EXPR [ (1, _43, _57) (-1, _2000) 0 ]", - "EXPR [ (1, _43, _58) (-1, _59) (1, _2000) 0 ]", + "EXPR [ (1, _43, _57) (-1, _1919) 0 ]", + "EXPR [ (1, _43, _58) (-1, _59) (1, _1919) 0 ]", "BLACKBOX::RANGE [(_59, 32)] []", "EXPR [ (-1, _43) (-1, _60) 1 ]", - "EXPR [ (1, _0) (-1, _61) (-1, _1993) (1, _1999) 0 ]", + "EXPR [ (1, _0) (-1, _61) (-1, _1912) (1, _1918) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(59))], q_c: -4864 })], outputs: [Simple(Witness(62))]", "EXPR [ (1, _59, _62) (-4864, _62) (1, _63) -1 ]", "EXPR [ (1, _59, _63) (-4864, _63) 0 ]", "EXPR [ (1, _43, _63) (-1, _64) 0 ]", "EXPR [ (-1, _43, _63) (-1, _65) 1 ]", - "EXPR [ (-1, _4, _49) (1, _4) (-1, _66) (1, _1995) 0 ]", + "EXPR [ (-1, _4, _49) (1, _4) (-1, _66) (1, _1914) 0 ]", "EXPR [ (-1, _2, _49) (1, _49, _54) (1, _2) (-1, _67) 0 ]", - "EXPR [ (1, _43, _59) (-1, _2005) 0 ]", - "EXPR [ (-1, _68) (1, _1994) (1, _2005) 0 ]", + "EXPR [ (1, _43, _59) (-1, _1924) 0 ]", + "EXPR [ (-1, _68) (1, _1913) (1, _1924) 0 ]", "BLACKBOX::RANGE [(_68, 32)] []", - "EXPR [ (1, _43, _68) (-1, _69) (1, _2000) 0 ]", + "EXPR [ (1, _43, _68) (-1, _69) (1, _1919) 0 ]", "BLACKBOX::RANGE [(_69, 32)] []", - "EXPR [ (1, _43, _67) (-1, _2007) 0 ]", - "EXPR [ (1, _43, _69) (-1, _70) (1, _2007) 0 ]", + "EXPR [ (1, _43, _67) (-1, _1926) 0 ]", + "EXPR [ (1, _43, _69) (-1, _70) (1, _1926) 0 ]", "BLACKBOX::RANGE [(_70, 32)] []", - "EXPR [ (1, _60, _61) (-1, _71) (1, _2005) 0 ]", + "EXPR [ (1, _60, _61) (-1, _71) (1, _1924) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(70))], q_c: -4864 })], outputs: [Simple(Witness(72))]", "EXPR [ (1, _70, _72) (-4864, _72) (1, _73) -1 ]", "EXPR [ (1, _70, _73) (-4864, _73) 0 ]", @@ -171,16 +171,16 @@ expression: artifact "EXPR [ (-1, _43, _73) (-1, _75) 1 ]", "EXPR [ (1, _59, _64) (1, _65, _66) (-1, _76) 0 ]", "EXPR [ (-1, _1, _49) (1, _49, _52) (1, _1) (-1, _77) 0 ]", - "EXPR [ (1, _43, _70) (-1, _2014) 0 ]", - "EXPR [ (-1, _78) (1, _1994) (1, _2014) 0 ]", + "EXPR [ (1, _43, _70) (-1, _1933) 0 ]", + "EXPR [ (-1, _78) (1, _1913) (1, _1933) 0 ]", "BLACKBOX::RANGE [(_78, 32)] []", - "EXPR [ (1, _43, _78) (-1, _79) (1, _2000) 0 ]", + "EXPR [ (1, _43, _78) (-1, _79) (1, _1919) 0 ]", "BLACKBOX::RANGE [(_79, 32)] []", - "EXPR [ (1, _43, _79) (-1, _80) (1, _2007) 0 ]", + "EXPR [ (1, _43, _79) (-1, _80) (1, _1926) 0 ]", "BLACKBOX::RANGE [(_80, 32)] []", "EXPR [ (1, _43, _77) (1, _43, _80) (-1, _81) 0 ]", "BLACKBOX::RANGE [(_81, 32)] []", - "EXPR [ (1, _60, _71) (-1, _82) (1, _2014) 0 ]", + "EXPR [ (1, _60, _71) (-1, _82) (1, _1933) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(81))], q_c: -4864 })], outputs: [Simple(Witness(83))]", "EXPR [ (1, _81, _83) (-4864, _83) (1, _84) -1 ]", "EXPR [ (1, _81, _84) (-4864, _84) 0 ]", @@ -193,13 +193,13 @@ expression: artifact "EXPR [ (1, _81, _85) (1, _86, _87) (-1, _90) 0 ]", "EXPR [ (-1, _89) (-1, _91) 1 ]", "EXPR [ (1, _43, _57) (-1, _92) 0 ]", - "EXPR [ (1, _43, _81) (-1, _2024) 0 ]", - "EXPR [ (1, _60, _82) (-1, _2025) 0 ]", - "EXPR [ (-1, _93) (1, _1994) (1, _2024) (1, _2025) 0 ]", + "EXPR [ (1, _43, _81) (-1, _1943) 0 ]", + "EXPR [ (1, _60, _82) (-1, _1944) 0 ]", + "EXPR [ (-1, _93) (1, _1913) (1, _1943) (1, _1944) 0 ]", "EXPR [ (1, _89, _93) (-1, _94) 0 ]", "BLACKBOX::RANGE [(_94, 32)] []", - "EXPR [ (1, _89, _90) (-1, _2026) 0 ]", - "EXPR [ (1, _89, _94) (-1, _95) (1, _2026) 0 ]", + "EXPR [ (1, _89, _90) (-1, _1945) 0 ]", + "EXPR [ (1, _89, _94) (-1, _95) (1, _1945) 0 ]", "BLACKBOX::RANGE [(_95, 32)] []", "EXPR [ (1, _43, _67) (1, _95) (-1, _96) 0 ]", "EXPR [ (1, _89, _96) (-1, _97) 0 ]", @@ -207,7 +207,7 @@ expression: artifact "EXPR [ (1, _43, _77) (1, _97) (-1, _98) 0 ]", "EXPR [ (1, _89, _98) (-1, _99) 0 ]", "BLACKBOX::RANGE [(_99, 32)] []", - "EXPR [ (-1, _100) (1, _2024) (1, _2025) 0 ]", + "EXPR [ (-1, _100) (1, _1943) (1, _1944) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(99))], q_c: -4864 })], outputs: [Simple(Witness(101))]", "EXPR [ (1, _99, _101) (-4864, _101) (1, _102) -1 ]", "EXPR [ (1, _99, _102) (-4864, _102) 0 ]", @@ -217,10 +217,10 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _99) (-1, _106) 0 ]", "EXPR [ (1, _89, _106) (-1, _107) 0 ]", "BLACKBOX::RANGE [(_107, 32)] []", - "EXPR [ (1, _89, _107) (-1, _108) (1, _2026) 0 ]", + "EXPR [ (1, _89, _107) (-1, _108) (1, _1945) 0 ]", "BLACKBOX::RANGE [(_108, 32)] []", - "EXPR [ (1, _57, _89) (-1, _2029) 0 ]", - "EXPR [ (1, _89, _108) (-1, _109) (1, _2029) 0 ]", + "EXPR [ (1, _57, _89) (-1, _1948) 0 ]", + "EXPR [ (1, _89, _108) (-1, _109) (1, _1948) 0 ]", "BLACKBOX::RANGE [(_109, 32)] []", "EXPR [ (1, _43, _77) (1, _109) (-1, _110) 0 ]", "EXPR [ (1, _89, _110) (-1, _111) 0 ]", @@ -236,12 +236,12 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _111) (-1, _119) 0 ]", "EXPR [ (1, _89, _119) (-1, _120) 0 ]", "BLACKBOX::RANGE [(_120, 32)] []", - "EXPR [ (1, _89, _120) (-1, _121) (1, _2026) 0 ]", + "EXPR [ (1, _89, _120) (-1, _121) (1, _1945) 0 ]", "BLACKBOX::RANGE [(_121, 32)] []", - "EXPR [ (1, _89, _121) (-1, _122) (1, _2029) 0 ]", + "EXPR [ (1, _89, _121) (-1, _122) (1, _1948) 0 ]", "BLACKBOX::RANGE [(_122, 32)] []", - "EXPR [ (1, _67, _89) (-1, _2037) 0 ]", - "EXPR [ (1, _89, _122) (-1, _123) (1, _2037) 0 ]", + "EXPR [ (1, _67, _89) (-1, _1956) 0 ]", + "EXPR [ (1, _89, _122) (-1, _123) (1, _1956) 0 ]", "BLACKBOX::RANGE [(_123, 32)] []", "EXPR [ (1, _89, _111) (1, _91, _112) (-1, _124) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(123))], q_c: -4864 })], outputs: [Simple(Witness(125))]", @@ -253,11 +253,11 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _123) (-1, _130) 0 ]", "EXPR [ (1, _89, _130) (-1, _131) 0 ]", "BLACKBOX::RANGE [(_131, 32)] []", - "EXPR [ (1, _89, _131) (-1, _132) (1, _2026) 0 ]", + "EXPR [ (1, _89, _131) (-1, _132) (1, _1945) 0 ]", "BLACKBOX::RANGE [(_132, 32)] []", - "EXPR [ (1, _89, _132) (-1, _133) (1, _2029) 0 ]", + "EXPR [ (1, _89, _132) (-1, _133) (1, _1948) 0 ]", "BLACKBOX::RANGE [(_133, 32)] []", - "EXPR [ (1, _89, _133) (-1, _134) (1, _2037) 0 ]", + "EXPR [ (1, _89, _133) (-1, _134) (1, _1956) 0 ]", "BLACKBOX::RANGE [(_134, 32)] []", "EXPR [ (1, _89, _123) (1, _91, _124) (-1, _135) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(134))], q_c: -4864 })], outputs: [Simple(Witness(136))]", @@ -271,40 +271,40 @@ expression: artifact "EXPR [ (-1, _0, _142) (2, _142) 0 ]", "EXPR [ (1, _134, _138) (1, _139, _140) (-1, _143) 0 ]", "EXPR [ (-1, _142) (-1, _144) 1 ]", - "EXPR [ (1, _91, _105) (-1, _145) (1, _2029) 0 ]", - "EXPR [ (1, _89, _134) (-1, _2053) 0 ]", - "EXPR [ (1, _91, _135) (-1, _2054) 0 ]", - "EXPR [ (-1, _146) (1, _1994) (1, _2053) (1, _2054) 0 ]", + "EXPR [ (1, _91, _105) (-1, _145) (1, _1948) 0 ]", + "EXPR [ (1, _89, _134) (-1, _1972) 0 ]", + "EXPR [ (1, _91, _135) (-1, _1973) 0 ]", + "EXPR [ (-1, _146) (1, _1913) (1, _1972) (1, _1973) 0 ]", "EXPR [ (1, _142, _146) (-1, _147) 0 ]", "BLACKBOX::RANGE [(_147, 32)] []", - "EXPR [ (1, _91, _92) (-1, _2055) 0 ]", - "EXPR [ (1, _147) (-1, _148) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _91, _92) (-1, _1974) 0 ]", + "EXPR [ (1, _147) (-1, _148) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _142, _148) (-1, _149) 0 ]", "BLACKBOX::RANGE [(_149, 32)] []", - "EXPR [ (1, _142, _143) (-1, _2056) 0 ]", - "EXPR [ (1, _142, _149) (-1, _150) (1, _2056) 0 ]", + "EXPR [ (1, _142, _143) (-1, _1975) 0 ]", + "EXPR [ (1, _142, _149) (-1, _150) (1, _1975) 0 ]", "BLACKBOX::RANGE [(_150, 32)] []", - "EXPR [ (1, _91, _118) (-1, _2058) 0 ]", - "EXPR [ (1, _150) (-1, _151) (1, _2037) (1, _2058) 0 ]", + "EXPR [ (1, _91, _118) (-1, _1977) 0 ]", + "EXPR [ (1, _150) (-1, _151) (1, _1956) (1, _1977) 0 ]", "EXPR [ (1, _142, _151) (-1, _152) 0 ]", "BLACKBOX::RANGE [(_152, 32)] []", - "EXPR [ (-1, _153) (1, _2053) (1, _2054) 0 ]", + "EXPR [ (-1, _153) (1, _1972) (1, _1973) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(152))], q_c: -4864 })], outputs: [Simple(Witness(154))]", "EXPR [ (1, _152, _154) (-4864, _154) (1, _155) -1 ]", "EXPR [ (1, _152, _155) (-4864, _155) 0 ]", "EXPR [ (1, _142, _155) (-1, _156) 0 ]", "EXPR [ (-1, _142, _155) (-1, _157) 1 ]", - "EXPR [ (-1, _158) (1, _2037) (1, _2058) 0 ]", + "EXPR [ (-1, _158) (1, _1956) (1, _1977) 0 ]", "EXPR [ (1, _4, _43) (1, _152) (-1, _159) 0 ]", "EXPR [ (1, _142, _159) (-1, _160) 0 ]", "BLACKBOX::RANGE [(_160, 32)] []", - "EXPR [ (1, _160) (-1, _161) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _160) (-1, _161) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _142, _161) (-1, _162) 0 ]", "BLACKBOX::RANGE [(_162, 32)] []", - "EXPR [ (1, _142, _162) (-1, _163) (1, _2056) 0 ]", + "EXPR [ (1, _142, _162) (-1, _163) (1, _1975) 0 ]", "BLACKBOX::RANGE [(_163, 32)] []", - "EXPR [ (1, _57, _142) (-1, _2060) 0 ]", - "EXPR [ (1, _142, _163) (-1, _164) (1, _2060) 0 ]", + "EXPR [ (1, _57, _142) (-1, _1979) 0 ]", + "EXPR [ (1, _142, _163) (-1, _164) (1, _1979) 0 ]", "BLACKBOX::RANGE [(_164, 32)] []", "EXPR [ (1, _142, _152) (1, _144, _153) (-1, _165) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(164))], q_c: -4864 })], outputs: [Simple(Witness(166))]", @@ -316,12 +316,12 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _164) (-1, _171) 0 ]", "EXPR [ (1, _142, _171) (-1, _172) 0 ]", "BLACKBOX::RANGE [(_172, 32)] []", - "EXPR [ (1, _172) (-1, _173) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _172) (-1, _173) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _142, _173) (-1, _174) 0 ]", "BLACKBOX::RANGE [(_174, 32)] []", - "EXPR [ (1, _142, _174) (-1, _175) (1, _2056) 0 ]", + "EXPR [ (1, _142, _174) (-1, _175) (1, _1975) 0 ]", "BLACKBOX::RANGE [(_175, 32)] []", - "EXPR [ (1, _142, _175) (-1, _176) (1, _2060) 0 ]", + "EXPR [ (1, _142, _175) (-1, _176) (1, _1979) 0 ]", "BLACKBOX::RANGE [(_176, 32)] []", "EXPR [ (1, _142, _164) (1, _144, _165) (-1, _177) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(176))], q_c: -4864 })], outputs: [Simple(Witness(178))]", @@ -333,12 +333,12 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _176) (-1, _183) 0 ]", "EXPR [ (1, _142, _183) (-1, _184) 0 ]", "BLACKBOX::RANGE [(_184, 32)] []", - "EXPR [ (1, _184) (-1, _185) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _184) (-1, _185) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _142, _185) (-1, _186) 0 ]", "BLACKBOX::RANGE [(_186, 32)] []", - "EXPR [ (1, _142, _186) (-1, _187) (1, _2056) 0 ]", + "EXPR [ (1, _142, _186) (-1, _187) (1, _1975) 0 ]", "BLACKBOX::RANGE [(_187, 32)] []", - "EXPR [ (1, _142, _187) (-1, _188) (1, _2060) 0 ]", + "EXPR [ (1, _142, _187) (-1, _188) (1, _1979) 0 ]", "BLACKBOX::RANGE [(_188, 32)] []", "EXPR [ (1, _142, _176) (1, _144, _177) (-1, _189) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(188))], q_c: -4864 })], outputs: [Simple(Witness(190))]", @@ -352,23 +352,23 @@ expression: artifact "EXPR [ (-1, _0, _196) (3, _196) 0 ]", "EXPR [ (1, _188, _192) (1, _193, _194) (-1, _197) 0 ]", "EXPR [ (-1, _196) (-1, _198) 1 ]", - "EXPR [ (1, _144, _158) (-1, _199) (1, _2060) 0 ]", - "EXPR [ (1, _142, _188) (-1, _2081) 0 ]", - "EXPR [ (1, _144, _189) (-1, _2082) 0 ]", - "EXPR [ (-1, _200) (1, _1994) (1, _2081) (1, _2082) 0 ]", + "EXPR [ (1, _144, _158) (-1, _199) (1, _1979) 0 ]", + "EXPR [ (1, _142, _188) (-1, _2000) 0 ]", + "EXPR [ (1, _144, _189) (-1, _2001) 0 ]", + "EXPR [ (-1, _200) (1, _1913) (1, _2000) (1, _2001) 0 ]", "EXPR [ (1, _196, _200) (-1, _201) 0 ]", "BLACKBOX::RANGE [(_201, 32)] []", - "EXPR [ (1, _201) (-1, _202) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _201) (-1, _202) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _196, _202) (-1, _203) 0 ]", "BLACKBOX::RANGE [(_203, 32)] []", - "EXPR [ (1, _144, _145) (-1, _2083) 0 ]", - "EXPR [ (1, _203) (-1, _204) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _144, _145) (-1, _2002) 0 ]", + "EXPR [ (1, _203) (-1, _204) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _196, _204) (-1, _205) 0 ]", "BLACKBOX::RANGE [(_205, 32)] []", - "EXPR [ (1, _196, _197) (-1, _2084) 0 ]", - "EXPR [ (1, _196, _205) (-1, _206) (1, _2084) 0 ]", + "EXPR [ (1, _196, _197) (-1, _2003) 0 ]", + "EXPR [ (1, _196, _205) (-1, _206) (1, _2003) 0 ]", "BLACKBOX::RANGE [(_206, 32)] []", - "EXPR [ (-1, _207) (1, _2081) (1, _2082) 0 ]", + "EXPR [ (-1, _207) (1, _2000) (1, _2001) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(206))], q_c: -4864 })], outputs: [Simple(Witness(208))]", "EXPR [ (1, _206, _208) (-4864, _208) (1, _209) -1 ]", "EXPR [ (1, _206, _209) (-4864, _209) 0 ]", @@ -377,13 +377,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _206) (-1, _212) 0 ]", "EXPR [ (1, _196, _212) (-1, _213) 0 ]", "BLACKBOX::RANGE [(_213, 32)] []", - "EXPR [ (1, _213) (-1, _214) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _213) (-1, _214) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _196, _214) (-1, _215) 0 ]", "BLACKBOX::RANGE [(_215, 32)] []", - "EXPR [ (1, _215) (-1, _216) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _215) (-1, _216) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _196, _216) (-1, _217) 0 ]", "BLACKBOX::RANGE [(_217, 32)] []", - "EXPR [ (1, _196, _217) (-1, _218) (1, _2084) 0 ]", + "EXPR [ (1, _196, _217) (-1, _218) (1, _2003) 0 ]", "BLACKBOX::RANGE [(_218, 32)] []", "EXPR [ (1, _196, _206) (1, _198, _207) (-1, _219) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(218))], q_c: -4864 })], outputs: [Simple(Witness(220))]", @@ -395,13 +395,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _218) (-1, _225) 0 ]", "EXPR [ (1, _196, _225) (-1, _226) 0 ]", "BLACKBOX::RANGE [(_226, 32)] []", - "EXPR [ (1, _226) (-1, _227) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _226) (-1, _227) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _196, _227) (-1, _228) 0 ]", "BLACKBOX::RANGE [(_228, 32)] []", - "EXPR [ (1, _228) (-1, _229) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _228) (-1, _229) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _196, _229) (-1, _230) 0 ]", "BLACKBOX::RANGE [(_230, 32)] []", - "EXPR [ (1, _196, _230) (-1, _231) (1, _2084) 0 ]", + "EXPR [ (1, _196, _230) (-1, _231) (1, _2003) 0 ]", "BLACKBOX::RANGE [(_231, 32)] []", "EXPR [ (1, _196, _218) (1, _198, _219) (-1, _232) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(231))], q_c: -4864 })], outputs: [Simple(Witness(233))]", @@ -413,13 +413,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _231) (-1, _238) 0 ]", "EXPR [ (1, _196, _238) (-1, _239) 0 ]", "BLACKBOX::RANGE [(_239, 32)] []", - "EXPR [ (1, _239) (-1, _240) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _239) (-1, _240) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _196, _240) (-1, _241) 0 ]", "BLACKBOX::RANGE [(_241, 32)] []", - "EXPR [ (1, _241) (-1, _242) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _241) (-1, _242) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _196, _242) (-1, _243) 0 ]", "BLACKBOX::RANGE [(_243, 32)] []", - "EXPR [ (1, _196, _243) (-1, _244) (1, _2084) 0 ]", + "EXPR [ (1, _196, _243) (-1, _244) (1, _2003) 0 ]", "BLACKBOX::RANGE [(_244, 32)] []", "EXPR [ (1, _196, _231) (1, _198, _232) (-1, _245) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(244))], q_c: -4864 })], outputs: [Simple(Witness(246))]", @@ -431,23 +431,23 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 4 })], outputs: [Simple(Witness(251))]", "EXPR [ (-1, _0, _251) (4, _251) (1, _252) -1 ]", "EXPR [ (-1, _0, _252) (4, _252) 0 ]", - "EXPR [ (1, _196, _244) (-1, _2101) 0 ]", - "EXPR [ (1, _198, _245) (-1, _2102) 0 ]", - "EXPR [ (-1, _253) (1, _1994) (1, _2101) (1, _2102) 0 ]", + "EXPR [ (1, _196, _244) (-1, _2020) 0 ]", + "EXPR [ (1, _198, _245) (-1, _2021) 0 ]", + "EXPR [ (-1, _253) (1, _1913) (1, _2020) (1, _2021) 0 ]", "EXPR [ (1, _252, _253) (-1, _254) 0 ]", "BLACKBOX::RANGE [(_254, 32)] []", - "EXPR [ (1, _254) (-1, _255) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _254) (-1, _255) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _252, _255) (-1, _256) 0 ]", "BLACKBOX::RANGE [(_256, 32)] []", - "EXPR [ (1, _256) (-1, _257) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _256) (-1, _257) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _252, _257) (-1, _258) 0 ]", "BLACKBOX::RANGE [(_258, 32)] []", - "EXPR [ (1, _198, _199) (-1, _2103) 0 ]", - "EXPR [ (1, _258) (-1, _259) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _198, _199) (-1, _2022) 0 ]", + "EXPR [ (1, _258) (-1, _259) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _252, _259) (-1, _260) 0 ]", "BLACKBOX::RANGE [(_260, 32)] []", "EXPR [ (-1, _252) (-1, _261) 1 ]", - "EXPR [ (-1, _262) (1, _2101) (1, _2102) 0 ]", + "EXPR [ (-1, _262) (1, _2020) (1, _2021) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(260))], q_c: -4864 })], outputs: [Simple(Witness(263))]", "EXPR [ (1, _260, _263) (-4864, _263) (1, _264) -1 ]", "EXPR [ (1, _260, _264) (-4864, _264) 0 ]", @@ -457,13 +457,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _260) (-1, _268) 0 ]", "EXPR [ (1, _252, _268) (-1, _269) 0 ]", "BLACKBOX::RANGE [(_269, 32)] []", - "EXPR [ (1, _269) (-1, _270) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _269) (-1, _270) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _252, _270) (-1, _271) 0 ]", "BLACKBOX::RANGE [(_271, 32)] []", - "EXPR [ (1, _271) (-1, _272) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _271) (-1, _272) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _252, _272) (-1, _273) 0 ]", "BLACKBOX::RANGE [(_273, 32)] []", - "EXPR [ (1, _273) (-1, _274) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _273) (-1, _274) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _252, _274) (-1, _275) 0 ]", "BLACKBOX::RANGE [(_275, 32)] []", "EXPR [ (1, _252, _260) (1, _261, _262) (-1, _276) 0 ]", @@ -476,13 +476,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _275) (-1, _282) 0 ]", "EXPR [ (1, _252, _282) (-1, _283) 0 ]", "BLACKBOX::RANGE [(_283, 32)] []", - "EXPR [ (1, _283) (-1, _284) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _283) (-1, _284) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _252, _284) (-1, _285) 0 ]", "BLACKBOX::RANGE [(_285, 32)] []", - "EXPR [ (1, _285) (-1, _286) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _285) (-1, _286) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _252, _286) (-1, _287) 0 ]", "BLACKBOX::RANGE [(_287, 32)] []", - "EXPR [ (1, _287) (-1, _288) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _287) (-1, _288) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _252, _288) (-1, _289) 0 ]", "BLACKBOX::RANGE [(_289, 32)] []", "EXPR [ (1, _252, _275) (1, _261, _276) (-1, _290) 0 ]", @@ -495,13 +495,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _289) (-1, _296) 0 ]", "EXPR [ (1, _252, _296) (-1, _297) 0 ]", "BLACKBOX::RANGE [(_297, 32)] []", - "EXPR [ (1, _297) (-1, _298) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _297) (-1, _298) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _252, _298) (-1, _299) 0 ]", "BLACKBOX::RANGE [(_299, 32)] []", - "EXPR [ (1, _299) (-1, _300) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _299) (-1, _300) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _252, _300) (-1, _301) 0 ]", "BLACKBOX::RANGE [(_301, 32)] []", - "EXPR [ (1, _301) (-1, _302) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _301) (-1, _302) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _252, _302) (-1, _303) 0 ]", "BLACKBOX::RANGE [(_303, 32)] []", "EXPR [ (1, _252, _289) (1, _261, _290) (-1, _304) 0 ]", @@ -514,22 +514,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 5 })], outputs: [Simple(Witness(310))]", "EXPR [ (-1, _0, _310) (5, _310) (1, _311) -1 ]", "EXPR [ (-1, _0, _311) (5, _311) 0 ]", - "EXPR [ (1, _252, _303) (-1, _2118) 0 ]", - "EXPR [ (1, _261, _304) (-1, _2119) 0 ]", - "EXPR [ (-1, _312) (1, _1994) (1, _2118) (1, _2119) 0 ]", + "EXPR [ (1, _252, _303) (-1, _2037) 0 ]", + "EXPR [ (1, _261, _304) (-1, _2038) 0 ]", + "EXPR [ (-1, _312) (1, _1913) (1, _2037) (1, _2038) 0 ]", "EXPR [ (1, _311, _312) (-1, _313) 0 ]", "BLACKBOX::RANGE [(_313, 32)] []", - "EXPR [ (1, _313) (-1, _314) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _313) (-1, _314) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _311, _314) (-1, _315) 0 ]", "BLACKBOX::RANGE [(_315, 32)] []", - "EXPR [ (1, _315) (-1, _316) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _315) (-1, _316) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _311, _316) (-1, _317) 0 ]", "BLACKBOX::RANGE [(_317, 32)] []", - "EXPR [ (1, _317) (-1, _318) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _317) (-1, _318) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _311, _318) (-1, _319) 0 ]", "BLACKBOX::RANGE [(_319, 32)] []", "EXPR [ (-1, _311) (-1, _320) 1 ]", - "EXPR [ (-1, _321) (1, _2118) (1, _2119) 0 ]", + "EXPR [ (-1, _321) (1, _2037) (1, _2038) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(319))], q_c: -4864 })], outputs: [Simple(Witness(322))]", "EXPR [ (1, _319, _322) (-4864, _322) (1, _323) -1 ]", "EXPR [ (1, _319, _323) (-4864, _323) 0 ]", @@ -539,13 +539,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _319) (-1, _327) 0 ]", "EXPR [ (1, _311, _327) (-1, _328) 0 ]", "BLACKBOX::RANGE [(_328, 32)] []", - "EXPR [ (1, _328) (-1, _329) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _328) (-1, _329) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _311, _329) (-1, _330) 0 ]", "BLACKBOX::RANGE [(_330, 32)] []", - "EXPR [ (1, _330) (-1, _331) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _330) (-1, _331) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _311, _331) (-1, _332) 0 ]", "BLACKBOX::RANGE [(_332, 32)] []", - "EXPR [ (1, _332) (-1, _333) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _332) (-1, _333) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _311, _333) (-1, _334) 0 ]", "BLACKBOX::RANGE [(_334, 32)] []", "EXPR [ (1, _311, _319) (1, _320, _321) (-1, _335) 0 ]", @@ -558,13 +558,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _334) (-1, _341) 0 ]", "EXPR [ (1, _311, _341) (-1, _342) 0 ]", "BLACKBOX::RANGE [(_342, 32)] []", - "EXPR [ (1, _342) (-1, _343) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _342) (-1, _343) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _311, _343) (-1, _344) 0 ]", "BLACKBOX::RANGE [(_344, 32)] []", - "EXPR [ (1, _344) (-1, _345) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _344) (-1, _345) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _311, _345) (-1, _346) 0 ]", "BLACKBOX::RANGE [(_346, 32)] []", - "EXPR [ (1, _346) (-1, _347) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _346) (-1, _347) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _311, _347) (-1, _348) 0 ]", "BLACKBOX::RANGE [(_348, 32)] []", "EXPR [ (1, _311, _334) (1, _320, _335) (-1, _349) 0 ]", @@ -577,13 +577,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _348) (-1, _355) 0 ]", "EXPR [ (1, _311, _355) (-1, _356) 0 ]", "BLACKBOX::RANGE [(_356, 32)] []", - "EXPR [ (1, _356) (-1, _357) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _356) (-1, _357) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _311, _357) (-1, _358) 0 ]", "BLACKBOX::RANGE [(_358, 32)] []", - "EXPR [ (1, _358) (-1, _359) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _358) (-1, _359) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _311, _359) (-1, _360) 0 ]", "BLACKBOX::RANGE [(_360, 32)] []", - "EXPR [ (1, _360) (-1, _361) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _360) (-1, _361) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _311, _361) (-1, _362) 0 ]", "BLACKBOX::RANGE [(_362, 32)] []", "EXPR [ (1, _311, _348) (1, _320, _349) (-1, _363) 0 ]", @@ -596,22 +596,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 6 })], outputs: [Simple(Witness(369))]", "EXPR [ (-1, _0, _369) (6, _369) (1, _370) -1 ]", "EXPR [ (-1, _0, _370) (6, _370) 0 ]", - "EXPR [ (1, _311, _362) (-1, _2134) 0 ]", - "EXPR [ (1, _320, _363) (-1, _2135) 0 ]", - "EXPR [ (-1, _371) (1, _1994) (1, _2134) (1, _2135) 0 ]", + "EXPR [ (1, _311, _362) (-1, _2053) 0 ]", + "EXPR [ (1, _320, _363) (-1, _2054) 0 ]", + "EXPR [ (-1, _371) (1, _1913) (1, _2053) (1, _2054) 0 ]", "EXPR [ (1, _370, _371) (-1, _372) 0 ]", "BLACKBOX::RANGE [(_372, 32)] []", - "EXPR [ (1, _372) (-1, _373) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _372) (-1, _373) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _370, _373) (-1, _374) 0 ]", "BLACKBOX::RANGE [(_374, 32)] []", - "EXPR [ (1, _374) (-1, _375) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _374) (-1, _375) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _370, _375) (-1, _376) 0 ]", "BLACKBOX::RANGE [(_376, 32)] []", - "EXPR [ (1, _376) (-1, _377) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _376) (-1, _377) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _370, _377) (-1, _378) 0 ]", "BLACKBOX::RANGE [(_378, 32)] []", "EXPR [ (-1, _370) (-1, _379) 1 ]", - "EXPR [ (-1, _380) (1, _2134) (1, _2135) 0 ]", + "EXPR [ (-1, _380) (1, _2053) (1, _2054) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(378))], q_c: -4864 })], outputs: [Simple(Witness(381))]", "EXPR [ (1, _378, _381) (-4864, _381) (1, _382) -1 ]", "EXPR [ (1, _378, _382) (-4864, _382) 0 ]", @@ -621,13 +621,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _378) (-1, _386) 0 ]", "EXPR [ (1, _370, _386) (-1, _387) 0 ]", "BLACKBOX::RANGE [(_387, 32)] []", - "EXPR [ (1, _387) (-1, _388) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _387) (-1, _388) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _370, _388) (-1, _389) 0 ]", "BLACKBOX::RANGE [(_389, 32)] []", - "EXPR [ (1, _389) (-1, _390) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _389) (-1, _390) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _370, _390) (-1, _391) 0 ]", "BLACKBOX::RANGE [(_391, 32)] []", - "EXPR [ (1, _391) (-1, _392) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _391) (-1, _392) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _370, _392) (-1, _393) 0 ]", "BLACKBOX::RANGE [(_393, 32)] []", "EXPR [ (1, _370, _378) (1, _379, _380) (-1, _394) 0 ]", @@ -640,13 +640,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _393) (-1, _400) 0 ]", "EXPR [ (1, _370, _400) (-1, _401) 0 ]", "BLACKBOX::RANGE [(_401, 32)] []", - "EXPR [ (1, _401) (-1, _402) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _401) (-1, _402) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _370, _402) (-1, _403) 0 ]", "BLACKBOX::RANGE [(_403, 32)] []", - "EXPR [ (1, _403) (-1, _404) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _403) (-1, _404) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _370, _404) (-1, _405) 0 ]", "BLACKBOX::RANGE [(_405, 32)] []", - "EXPR [ (1, _405) (-1, _406) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _405) (-1, _406) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _370, _406) (-1, _407) 0 ]", "BLACKBOX::RANGE [(_407, 32)] []", "EXPR [ (1, _370, _393) (1, _379, _394) (-1, _408) 0 ]", @@ -659,13 +659,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _407) (-1, _414) 0 ]", "EXPR [ (1, _370, _414) (-1, _415) 0 ]", "BLACKBOX::RANGE [(_415, 32)] []", - "EXPR [ (1, _415) (-1, _416) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _415) (-1, _416) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _370, _416) (-1, _417) 0 ]", "BLACKBOX::RANGE [(_417, 32)] []", - "EXPR [ (1, _417) (-1, _418) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _417) (-1, _418) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _370, _418) (-1, _419) 0 ]", "BLACKBOX::RANGE [(_419, 32)] []", - "EXPR [ (1, _419) (-1, _420) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _419) (-1, _420) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _370, _420) (-1, _421) 0 ]", "BLACKBOX::RANGE [(_421, 32)] []", "EXPR [ (1, _370, _407) (1, _379, _408) (-1, _422) 0 ]", @@ -678,22 +678,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 7 })], outputs: [Simple(Witness(428))]", "EXPR [ (-1, _0, _428) (7, _428) (1, _429) -1 ]", "EXPR [ (-1, _0, _429) (7, _429) 0 ]", - "EXPR [ (1, _370, _421) (-1, _2150) 0 ]", - "EXPR [ (1, _379, _422) (-1, _2151) 0 ]", - "EXPR [ (-1, _430) (1, _1994) (1, _2150) (1, _2151) 0 ]", + "EXPR [ (1, _370, _421) (-1, _2069) 0 ]", + "EXPR [ (1, _379, _422) (-1, _2070) 0 ]", + "EXPR [ (-1, _430) (1, _1913) (1, _2069) (1, _2070) 0 ]", "EXPR [ (1, _429, _430) (-1, _431) 0 ]", "BLACKBOX::RANGE [(_431, 32)] []", - "EXPR [ (1, _431) (-1, _432) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _431) (-1, _432) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _429, _432) (-1, _433) 0 ]", "BLACKBOX::RANGE [(_433, 32)] []", - "EXPR [ (1, _433) (-1, _434) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _433) (-1, _434) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _429, _434) (-1, _435) 0 ]", "BLACKBOX::RANGE [(_435, 32)] []", - "EXPR [ (1, _435) (-1, _436) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _435) (-1, _436) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _429, _436) (-1, _437) 0 ]", "BLACKBOX::RANGE [(_437, 32)] []", "EXPR [ (-1, _429) (-1, _438) 1 ]", - "EXPR [ (-1, _439) (1, _2150) (1, _2151) 0 ]", + "EXPR [ (-1, _439) (1, _2069) (1, _2070) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(437))], q_c: -4864 })], outputs: [Simple(Witness(440))]", "EXPR [ (1, _437, _440) (-4864, _440) (1, _441) -1 ]", "EXPR [ (1, _437, _441) (-4864, _441) 0 ]", @@ -703,13 +703,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _437) (-1, _445) 0 ]", "EXPR [ (1, _429, _445) (-1, _446) 0 ]", "BLACKBOX::RANGE [(_446, 32)] []", - "EXPR [ (1, _446) (-1, _447) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _446) (-1, _447) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _429, _447) (-1, _448) 0 ]", "BLACKBOX::RANGE [(_448, 32)] []", - "EXPR [ (1, _448) (-1, _449) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _448) (-1, _449) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _429, _449) (-1, _450) 0 ]", "BLACKBOX::RANGE [(_450, 32)] []", - "EXPR [ (1, _450) (-1, _451) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _450) (-1, _451) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _429, _451) (-1, _452) 0 ]", "BLACKBOX::RANGE [(_452, 32)] []", "EXPR [ (1, _429, _437) (1, _438, _439) (-1, _453) 0 ]", @@ -722,13 +722,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _452) (-1, _459) 0 ]", "EXPR [ (1, _429, _459) (-1, _460) 0 ]", "BLACKBOX::RANGE [(_460, 32)] []", - "EXPR [ (1, _460) (-1, _461) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _460) (-1, _461) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _429, _461) (-1, _462) 0 ]", "BLACKBOX::RANGE [(_462, 32)] []", - "EXPR [ (1, _462) (-1, _463) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _462) (-1, _463) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _429, _463) (-1, _464) 0 ]", "BLACKBOX::RANGE [(_464, 32)] []", - "EXPR [ (1, _464) (-1, _465) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _464) (-1, _465) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _429, _465) (-1, _466) 0 ]", "BLACKBOX::RANGE [(_466, 32)] []", "EXPR [ (1, _429, _452) (1, _438, _453) (-1, _467) 0 ]", @@ -741,13 +741,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _466) (-1, _473) 0 ]", "EXPR [ (1, _429, _473) (-1, _474) 0 ]", "BLACKBOX::RANGE [(_474, 32)] []", - "EXPR [ (1, _474) (-1, _475) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _474) (-1, _475) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _429, _475) (-1, _476) 0 ]", "BLACKBOX::RANGE [(_476, 32)] []", - "EXPR [ (1, _476) (-1, _477) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _476) (-1, _477) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _429, _477) (-1, _478) 0 ]", "BLACKBOX::RANGE [(_478, 32)] []", - "EXPR [ (1, _478) (-1, _479) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _478) (-1, _479) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _429, _479) (-1, _480) 0 ]", "BLACKBOX::RANGE [(_480, 32)] []", "EXPR [ (1, _429, _466) (1, _438, _467) (-1, _481) 0 ]", @@ -760,22 +760,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 8 })], outputs: [Simple(Witness(487))]", "EXPR [ (-1, _0, _487) (8, _487) (1, _488) -1 ]", "EXPR [ (-1, _0, _488) (8, _488) 0 ]", - "EXPR [ (1, _429, _480) (-1, _2166) 0 ]", - "EXPR [ (1, _438, _481) (-1, _2167) 0 ]", - "EXPR [ (-1, _489) (1, _1994) (1, _2166) (1, _2167) 0 ]", + "EXPR [ (1, _429, _480) (-1, _2085) 0 ]", + "EXPR [ (1, _438, _481) (-1, _2086) 0 ]", + "EXPR [ (-1, _489) (1, _1913) (1, _2085) (1, _2086) 0 ]", "EXPR [ (1, _488, _489) (-1, _490) 0 ]", "BLACKBOX::RANGE [(_490, 32)] []", - "EXPR [ (1, _490) (-1, _491) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _490) (-1, _491) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _488, _491) (-1, _492) 0 ]", "BLACKBOX::RANGE [(_492, 32)] []", - "EXPR [ (1, _492) (-1, _493) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _492) (-1, _493) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _488, _493) (-1, _494) 0 ]", "BLACKBOX::RANGE [(_494, 32)] []", - "EXPR [ (1, _494) (-1, _495) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _494) (-1, _495) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _488, _495) (-1, _496) 0 ]", "BLACKBOX::RANGE [(_496, 32)] []", "EXPR [ (-1, _488) (-1, _497) 1 ]", - "EXPR [ (-1, _498) (1, _2166) (1, _2167) 0 ]", + "EXPR [ (-1, _498) (1, _2085) (1, _2086) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(496))], q_c: -4864 })], outputs: [Simple(Witness(499))]", "EXPR [ (1, _496, _499) (-4864, _499) (1, _500) -1 ]", "EXPR [ (1, _496, _500) (-4864, _500) 0 ]", @@ -785,13 +785,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _496) (-1, _504) 0 ]", "EXPR [ (1, _488, _504) (-1, _505) 0 ]", "BLACKBOX::RANGE [(_505, 32)] []", - "EXPR [ (1, _505) (-1, _506) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _505) (-1, _506) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _488, _506) (-1, _507) 0 ]", "BLACKBOX::RANGE [(_507, 32)] []", - "EXPR [ (1, _507) (-1, _508) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _507) (-1, _508) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _488, _508) (-1, _509) 0 ]", "BLACKBOX::RANGE [(_509, 32)] []", - "EXPR [ (1, _509) (-1, _510) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _509) (-1, _510) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _488, _510) (-1, _511) 0 ]", "BLACKBOX::RANGE [(_511, 32)] []", "EXPR [ (1, _488, _496) (1, _497, _498) (-1, _512) 0 ]", @@ -804,13 +804,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _511) (-1, _518) 0 ]", "EXPR [ (1, _488, _518) (-1, _519) 0 ]", "BLACKBOX::RANGE [(_519, 32)] []", - "EXPR [ (1, _519) (-1, _520) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _519) (-1, _520) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _488, _520) (-1, _521) 0 ]", "BLACKBOX::RANGE [(_521, 32)] []", - "EXPR [ (1, _521) (-1, _522) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _521) (-1, _522) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _488, _522) (-1, _523) 0 ]", "BLACKBOX::RANGE [(_523, 32)] []", - "EXPR [ (1, _523) (-1, _524) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _523) (-1, _524) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _488, _524) (-1, _525) 0 ]", "BLACKBOX::RANGE [(_525, 32)] []", "EXPR [ (1, _488, _511) (1, _497, _512) (-1, _526) 0 ]", @@ -823,13 +823,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _525) (-1, _532) 0 ]", "EXPR [ (1, _488, _532) (-1, _533) 0 ]", "BLACKBOX::RANGE [(_533, 32)] []", - "EXPR [ (1, _533) (-1, _534) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _533) (-1, _534) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _488, _534) (-1, _535) 0 ]", "BLACKBOX::RANGE [(_535, 32)] []", - "EXPR [ (1, _535) (-1, _536) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _535) (-1, _536) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _488, _536) (-1, _537) 0 ]", "BLACKBOX::RANGE [(_537, 32)] []", - "EXPR [ (1, _537) (-1, _538) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _537) (-1, _538) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _488, _538) (-1, _539) 0 ]", "BLACKBOX::RANGE [(_539, 32)] []", "EXPR [ (1, _488, _525) (1, _497, _526) (-1, _540) 0 ]", @@ -842,22 +842,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 9 })], outputs: [Simple(Witness(546))]", "EXPR [ (-1, _0, _546) (9, _546) (1, _547) -1 ]", "EXPR [ (-1, _0, _547) (9, _547) 0 ]", - "EXPR [ (1, _488, _539) (-1, _2182) 0 ]", - "EXPR [ (1, _497, _540) (-1, _2183) 0 ]", - "EXPR [ (-1, _548) (1, _1994) (1, _2182) (1, _2183) 0 ]", + "EXPR [ (1, _488, _539) (-1, _2101) 0 ]", + "EXPR [ (1, _497, _540) (-1, _2102) 0 ]", + "EXPR [ (-1, _548) (1, _1913) (1, _2101) (1, _2102) 0 ]", "EXPR [ (1, _547, _548) (-1, _549) 0 ]", "BLACKBOX::RANGE [(_549, 32)] []", - "EXPR [ (1, _549) (-1, _550) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _549) (-1, _550) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _547, _550) (-1, _551) 0 ]", "BLACKBOX::RANGE [(_551, 32)] []", - "EXPR [ (1, _551) (-1, _552) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _551) (-1, _552) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _547, _552) (-1, _553) 0 ]", "BLACKBOX::RANGE [(_553, 32)] []", - "EXPR [ (1, _553) (-1, _554) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _553) (-1, _554) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _547, _554) (-1, _555) 0 ]", "BLACKBOX::RANGE [(_555, 32)] []", "EXPR [ (-1, _547) (-1, _556) 1 ]", - "EXPR [ (-1, _557) (1, _2182) (1, _2183) 0 ]", + "EXPR [ (-1, _557) (1, _2101) (1, _2102) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(555))], q_c: -4864 })], outputs: [Simple(Witness(558))]", "EXPR [ (1, _555, _558) (-4864, _558) (1, _559) -1 ]", "EXPR [ (1, _555, _559) (-4864, _559) 0 ]", @@ -867,13 +867,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _555) (-1, _563) 0 ]", "EXPR [ (1, _547, _563) (-1, _564) 0 ]", "BLACKBOX::RANGE [(_564, 32)] []", - "EXPR [ (1, _564) (-1, _565) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _564) (-1, _565) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _547, _565) (-1, _566) 0 ]", "BLACKBOX::RANGE [(_566, 32)] []", - "EXPR [ (1, _566) (-1, _567) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _566) (-1, _567) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _547, _567) (-1, _568) 0 ]", "BLACKBOX::RANGE [(_568, 32)] []", - "EXPR [ (1, _568) (-1, _569) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _568) (-1, _569) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _547, _569) (-1, _570) 0 ]", "BLACKBOX::RANGE [(_570, 32)] []", "EXPR [ (1, _547, _555) (1, _556, _557) (-1, _571) 0 ]", @@ -886,13 +886,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _570) (-1, _577) 0 ]", "EXPR [ (1, _547, _577) (-1, _578) 0 ]", "BLACKBOX::RANGE [(_578, 32)] []", - "EXPR [ (1, _578) (-1, _579) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _578) (-1, _579) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _547, _579) (-1, _580) 0 ]", "BLACKBOX::RANGE [(_580, 32)] []", - "EXPR [ (1, _580) (-1, _581) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _580) (-1, _581) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _547, _581) (-1, _582) 0 ]", "BLACKBOX::RANGE [(_582, 32)] []", - "EXPR [ (1, _582) (-1, _583) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _582) (-1, _583) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _547, _583) (-1, _584) 0 ]", "BLACKBOX::RANGE [(_584, 32)] []", "EXPR [ (1, _547, _570) (1, _556, _571) (-1, _585) 0 ]", @@ -905,13 +905,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _584) (-1, _591) 0 ]", "EXPR [ (1, _547, _591) (-1, _592) 0 ]", "BLACKBOX::RANGE [(_592, 32)] []", - "EXPR [ (1, _592) (-1, _593) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _592) (-1, _593) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _547, _593) (-1, _594) 0 ]", "BLACKBOX::RANGE [(_594, 32)] []", - "EXPR [ (1, _594) (-1, _595) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _594) (-1, _595) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _547, _595) (-1, _596) 0 ]", "BLACKBOX::RANGE [(_596, 32)] []", - "EXPR [ (1, _596) (-1, _597) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _596) (-1, _597) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _547, _597) (-1, _598) 0 ]", "BLACKBOX::RANGE [(_598, 32)] []", "EXPR [ (1, _547, _584) (1, _556, _585) (-1, _599) 0 ]", @@ -924,22 +924,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 10 })], outputs: [Simple(Witness(605))]", "EXPR [ (-1, _0, _605) (10, _605) (1, _606) -1 ]", "EXPR [ (-1, _0, _606) (10, _606) 0 ]", - "EXPR [ (1, _547, _598) (-1, _2198) 0 ]", - "EXPR [ (1, _556, _599) (-1, _2199) 0 ]", - "EXPR [ (-1, _607) (1, _1994) (1, _2198) (1, _2199) 0 ]", + "EXPR [ (1, _547, _598) (-1, _2117) 0 ]", + "EXPR [ (1, _556, _599) (-1, _2118) 0 ]", + "EXPR [ (-1, _607) (1, _1913) (1, _2117) (1, _2118) 0 ]", "EXPR [ (1, _606, _607) (-1, _608) 0 ]", "BLACKBOX::RANGE [(_608, 32)] []", - "EXPR [ (1, _608) (-1, _609) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _608) (-1, _609) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _606, _609) (-1, _610) 0 ]", "BLACKBOX::RANGE [(_610, 32)] []", - "EXPR [ (1, _610) (-1, _611) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _610) (-1, _611) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _606, _611) (-1, _612) 0 ]", "BLACKBOX::RANGE [(_612, 32)] []", - "EXPR [ (1, _612) (-1, _613) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _612) (-1, _613) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _606, _613) (-1, _614) 0 ]", "BLACKBOX::RANGE [(_614, 32)] []", "EXPR [ (-1, _606) (-1, _615) 1 ]", - "EXPR [ (-1, _616) (1, _2198) (1, _2199) 0 ]", + "EXPR [ (-1, _616) (1, _2117) (1, _2118) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(614))], q_c: -4864 })], outputs: [Simple(Witness(617))]", "EXPR [ (1, _614, _617) (-4864, _617) (1, _618) -1 ]", "EXPR [ (1, _614, _618) (-4864, _618) 0 ]", @@ -949,13 +949,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _614) (-1, _622) 0 ]", "EXPR [ (1, _606, _622) (-1, _623) 0 ]", "BLACKBOX::RANGE [(_623, 32)] []", - "EXPR [ (1, _623) (-1, _624) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _623) (-1, _624) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _606, _624) (-1, _625) 0 ]", "BLACKBOX::RANGE [(_625, 32)] []", - "EXPR [ (1, _625) (-1, _626) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _625) (-1, _626) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _606, _626) (-1, _627) 0 ]", "BLACKBOX::RANGE [(_627, 32)] []", - "EXPR [ (1, _627) (-1, _628) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _627) (-1, _628) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _606, _628) (-1, _629) 0 ]", "BLACKBOX::RANGE [(_629, 32)] []", "EXPR [ (1, _606, _614) (1, _615, _616) (-1, _630) 0 ]", @@ -968,13 +968,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _629) (-1, _636) 0 ]", "EXPR [ (1, _606, _636) (-1, _637) 0 ]", "BLACKBOX::RANGE [(_637, 32)] []", - "EXPR [ (1, _637) (-1, _638) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _637) (-1, _638) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _606, _638) (-1, _639) 0 ]", "BLACKBOX::RANGE [(_639, 32)] []", - "EXPR [ (1, _639) (-1, _640) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _639) (-1, _640) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _606, _640) (-1, _641) 0 ]", "BLACKBOX::RANGE [(_641, 32)] []", - "EXPR [ (1, _641) (-1, _642) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _641) (-1, _642) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _606, _642) (-1, _643) 0 ]", "BLACKBOX::RANGE [(_643, 32)] []", "EXPR [ (1, _606, _629) (1, _615, _630) (-1, _644) 0 ]", @@ -987,13 +987,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _643) (-1, _650) 0 ]", "EXPR [ (1, _606, _650) (-1, _651) 0 ]", "BLACKBOX::RANGE [(_651, 32)] []", - "EXPR [ (1, _651) (-1, _652) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _651) (-1, _652) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _606, _652) (-1, _653) 0 ]", "BLACKBOX::RANGE [(_653, 32)] []", - "EXPR [ (1, _653) (-1, _654) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _653) (-1, _654) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _606, _654) (-1, _655) 0 ]", "BLACKBOX::RANGE [(_655, 32)] []", - "EXPR [ (1, _655) (-1, _656) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _655) (-1, _656) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _606, _656) (-1, _657) 0 ]", "BLACKBOX::RANGE [(_657, 32)] []", "EXPR [ (1, _606, _643) (1, _615, _644) (-1, _658) 0 ]", @@ -1006,22 +1006,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 11 })], outputs: [Simple(Witness(664))]", "EXPR [ (-1, _0, _664) (11, _664) (1, _665) -1 ]", "EXPR [ (-1, _0, _665) (11, _665) 0 ]", - "EXPR [ (1, _606, _657) (-1, _2214) 0 ]", - "EXPR [ (1, _615, _658) (-1, _2215) 0 ]", - "EXPR [ (-1, _666) (1, _1994) (1, _2214) (1, _2215) 0 ]", + "EXPR [ (1, _606, _657) (-1, _2133) 0 ]", + "EXPR [ (1, _615, _658) (-1, _2134) 0 ]", + "EXPR [ (-1, _666) (1, _1913) (1, _2133) (1, _2134) 0 ]", "EXPR [ (1, _665, _666) (-1, _667) 0 ]", "BLACKBOX::RANGE [(_667, 32)] []", - "EXPR [ (1, _667) (-1, _668) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _667) (-1, _668) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _665, _668) (-1, _669) 0 ]", "BLACKBOX::RANGE [(_669, 32)] []", - "EXPR [ (1, _669) (-1, _670) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _669) (-1, _670) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _665, _670) (-1, _671) 0 ]", "BLACKBOX::RANGE [(_671, 32)] []", - "EXPR [ (1, _671) (-1, _672) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _671) (-1, _672) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _665, _672) (-1, _673) 0 ]", "BLACKBOX::RANGE [(_673, 32)] []", "EXPR [ (-1, _665) (-1, _674) 1 ]", - "EXPR [ (-1, _675) (1, _2214) (1, _2215) 0 ]", + "EXPR [ (-1, _675) (1, _2133) (1, _2134) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(673))], q_c: -4864 })], outputs: [Simple(Witness(676))]", "EXPR [ (1, _673, _676) (-4864, _676) (1, _677) -1 ]", "EXPR [ (1, _673, _677) (-4864, _677) 0 ]", @@ -1031,13 +1031,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _673) (-1, _681) 0 ]", "EXPR [ (1, _665, _681) (-1, _682) 0 ]", "BLACKBOX::RANGE [(_682, 32)] []", - "EXPR [ (1, _682) (-1, _683) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _682) (-1, _683) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _665, _683) (-1, _684) 0 ]", "BLACKBOX::RANGE [(_684, 32)] []", - "EXPR [ (1, _684) (-1, _685) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _684) (-1, _685) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _665, _685) (-1, _686) 0 ]", "BLACKBOX::RANGE [(_686, 32)] []", - "EXPR [ (1, _686) (-1, _687) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _686) (-1, _687) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _665, _687) (-1, _688) 0 ]", "BLACKBOX::RANGE [(_688, 32)] []", "EXPR [ (1, _665, _673) (1, _674, _675) (-1, _689) 0 ]", @@ -1050,13 +1050,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _688) (-1, _695) 0 ]", "EXPR [ (1, _665, _695) (-1, _696) 0 ]", "BLACKBOX::RANGE [(_696, 32)] []", - "EXPR [ (1, _696) (-1, _697) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _696) (-1, _697) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _665, _697) (-1, _698) 0 ]", "BLACKBOX::RANGE [(_698, 32)] []", - "EXPR [ (1, _698) (-1, _699) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _698) (-1, _699) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _665, _699) (-1, _700) 0 ]", "BLACKBOX::RANGE [(_700, 32)] []", - "EXPR [ (1, _700) (-1, _701) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _700) (-1, _701) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _665, _701) (-1, _702) 0 ]", "BLACKBOX::RANGE [(_702, 32)] []", "EXPR [ (1, _665, _688) (1, _674, _689) (-1, _703) 0 ]", @@ -1069,13 +1069,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _702) (-1, _709) 0 ]", "EXPR [ (1, _665, _709) (-1, _710) 0 ]", "BLACKBOX::RANGE [(_710, 32)] []", - "EXPR [ (1, _710) (-1, _711) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _710) (-1, _711) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _665, _711) (-1, _712) 0 ]", "BLACKBOX::RANGE [(_712, 32)] []", - "EXPR [ (1, _712) (-1, _713) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _712) (-1, _713) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _665, _713) (-1, _714) 0 ]", "BLACKBOX::RANGE [(_714, 32)] []", - "EXPR [ (1, _714) (-1, _715) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _714) (-1, _715) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _665, _715) (-1, _716) 0 ]", "BLACKBOX::RANGE [(_716, 32)] []", "EXPR [ (1, _665, _702) (1, _674, _703) (-1, _717) 0 ]", @@ -1088,22 +1088,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 12 })], outputs: [Simple(Witness(723))]", "EXPR [ (-1, _0, _723) (12, _723) (1, _724) -1 ]", "EXPR [ (-1, _0, _724) (12, _724) 0 ]", - "EXPR [ (1, _665, _716) (-1, _2230) 0 ]", - "EXPR [ (1, _674, _717) (-1, _2231) 0 ]", - "EXPR [ (-1, _725) (1, _1994) (1, _2230) (1, _2231) 0 ]", + "EXPR [ (1, _665, _716) (-1, _2149) 0 ]", + "EXPR [ (1, _674, _717) (-1, _2150) 0 ]", + "EXPR [ (-1, _725) (1, _1913) (1, _2149) (1, _2150) 0 ]", "EXPR [ (1, _724, _725) (-1, _726) 0 ]", "BLACKBOX::RANGE [(_726, 32)] []", - "EXPR [ (1, _726) (-1, _727) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _726) (-1, _727) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _724, _727) (-1, _728) 0 ]", "BLACKBOX::RANGE [(_728, 32)] []", - "EXPR [ (1, _728) (-1, _729) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _728) (-1, _729) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _724, _729) (-1, _730) 0 ]", "BLACKBOX::RANGE [(_730, 32)] []", - "EXPR [ (1, _730) (-1, _731) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _730) (-1, _731) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _724, _731) (-1, _732) 0 ]", "BLACKBOX::RANGE [(_732, 32)] []", "EXPR [ (-1, _724) (-1, _733) 1 ]", - "EXPR [ (-1, _734) (1, _2230) (1, _2231) 0 ]", + "EXPR [ (-1, _734) (1, _2149) (1, _2150) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(732))], q_c: -4864 })], outputs: [Simple(Witness(735))]", "EXPR [ (1, _732, _735) (-4864, _735) (1, _736) -1 ]", "EXPR [ (1, _732, _736) (-4864, _736) 0 ]", @@ -1113,13 +1113,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _732) (-1, _740) 0 ]", "EXPR [ (1, _724, _740) (-1, _741) 0 ]", "BLACKBOX::RANGE [(_741, 32)] []", - "EXPR [ (1, _741) (-1, _742) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _741) (-1, _742) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _724, _742) (-1, _743) 0 ]", "BLACKBOX::RANGE [(_743, 32)] []", - "EXPR [ (1, _743) (-1, _744) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _743) (-1, _744) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _724, _744) (-1, _745) 0 ]", "BLACKBOX::RANGE [(_745, 32)] []", - "EXPR [ (1, _745) (-1, _746) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _745) (-1, _746) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _724, _746) (-1, _747) 0 ]", "BLACKBOX::RANGE [(_747, 32)] []", "EXPR [ (1, _724, _732) (1, _733, _734) (-1, _748) 0 ]", @@ -1132,13 +1132,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _747) (-1, _754) 0 ]", "EXPR [ (1, _724, _754) (-1, _755) 0 ]", "BLACKBOX::RANGE [(_755, 32)] []", - "EXPR [ (1, _755) (-1, _756) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _755) (-1, _756) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _724, _756) (-1, _757) 0 ]", "BLACKBOX::RANGE [(_757, 32)] []", - "EXPR [ (1, _757) (-1, _758) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _757) (-1, _758) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _724, _758) (-1, _759) 0 ]", "BLACKBOX::RANGE [(_759, 32)] []", - "EXPR [ (1, _759) (-1, _760) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _759) (-1, _760) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _724, _760) (-1, _761) 0 ]", "BLACKBOX::RANGE [(_761, 32)] []", "EXPR [ (1, _724, _747) (1, _733, _748) (-1, _762) 0 ]", @@ -1151,13 +1151,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _761) (-1, _768) 0 ]", "EXPR [ (1, _724, _768) (-1, _769) 0 ]", "BLACKBOX::RANGE [(_769, 32)] []", - "EXPR [ (1, _769) (-1, _770) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _769) (-1, _770) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _724, _770) (-1, _771) 0 ]", "BLACKBOX::RANGE [(_771, 32)] []", - "EXPR [ (1, _771) (-1, _772) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _771) (-1, _772) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _724, _772) (-1, _773) 0 ]", "BLACKBOX::RANGE [(_773, 32)] []", - "EXPR [ (1, _773) (-1, _774) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _773) (-1, _774) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _724, _774) (-1, _775) 0 ]", "BLACKBOX::RANGE [(_775, 32)] []", "EXPR [ (1, _724, _761) (1, _733, _762) (-1, _776) 0 ]", @@ -1170,22 +1170,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 13 })], outputs: [Simple(Witness(782))]", "EXPR [ (-1, _0, _782) (13, _782) (1, _783) -1 ]", "EXPR [ (-1, _0, _783) (13, _783) 0 ]", - "EXPR [ (1, _724, _775) (-1, _2246) 0 ]", - "EXPR [ (1, _733, _776) (-1, _2247) 0 ]", - "EXPR [ (-1, _784) (1, _1994) (1, _2246) (1, _2247) 0 ]", + "EXPR [ (1, _724, _775) (-1, _2165) 0 ]", + "EXPR [ (1, _733, _776) (-1, _2166) 0 ]", + "EXPR [ (-1, _784) (1, _1913) (1, _2165) (1, _2166) 0 ]", "EXPR [ (1, _783, _784) (-1, _785) 0 ]", "BLACKBOX::RANGE [(_785, 32)] []", - "EXPR [ (1, _785) (-1, _786) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _785) (-1, _786) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _783, _786) (-1, _787) 0 ]", "BLACKBOX::RANGE [(_787, 32)] []", - "EXPR [ (1, _787) (-1, _788) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _787) (-1, _788) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _783, _788) (-1, _789) 0 ]", "BLACKBOX::RANGE [(_789, 32)] []", - "EXPR [ (1, _789) (-1, _790) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _789) (-1, _790) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _783, _790) (-1, _791) 0 ]", "BLACKBOX::RANGE [(_791, 32)] []", "EXPR [ (-1, _783) (-1, _792) 1 ]", - "EXPR [ (-1, _793) (1, _2246) (1, _2247) 0 ]", + "EXPR [ (-1, _793) (1, _2165) (1, _2166) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(791))], q_c: -4864 })], outputs: [Simple(Witness(794))]", "EXPR [ (1, _791, _794) (-4864, _794) (1, _795) -1 ]", "EXPR [ (1, _791, _795) (-4864, _795) 0 ]", @@ -1195,13 +1195,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _791) (-1, _799) 0 ]", "EXPR [ (1, _783, _799) (-1, _800) 0 ]", "BLACKBOX::RANGE [(_800, 32)] []", - "EXPR [ (1, _800) (-1, _801) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _800) (-1, _801) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _783, _801) (-1, _802) 0 ]", "BLACKBOX::RANGE [(_802, 32)] []", - "EXPR [ (1, _802) (-1, _803) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _802) (-1, _803) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _783, _803) (-1, _804) 0 ]", "BLACKBOX::RANGE [(_804, 32)] []", - "EXPR [ (1, _804) (-1, _805) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _804) (-1, _805) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _783, _805) (-1, _806) 0 ]", "BLACKBOX::RANGE [(_806, 32)] []", "EXPR [ (1, _783, _791) (1, _792, _793) (-1, _807) 0 ]", @@ -1214,13 +1214,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _806) (-1, _813) 0 ]", "EXPR [ (1, _783, _813) (-1, _814) 0 ]", "BLACKBOX::RANGE [(_814, 32)] []", - "EXPR [ (1, _814) (-1, _815) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _814) (-1, _815) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _783, _815) (-1, _816) 0 ]", "BLACKBOX::RANGE [(_816, 32)] []", - "EXPR [ (1, _816) (-1, _817) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _816) (-1, _817) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _783, _817) (-1, _818) 0 ]", "BLACKBOX::RANGE [(_818, 32)] []", - "EXPR [ (1, _818) (-1, _819) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _818) (-1, _819) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _783, _819) (-1, _820) 0 ]", "BLACKBOX::RANGE [(_820, 32)] []", "EXPR [ (1, _783, _806) (1, _792, _807) (-1, _821) 0 ]", @@ -1233,13 +1233,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _820) (-1, _827) 0 ]", "EXPR [ (1, _783, _827) (-1, _828) 0 ]", "BLACKBOX::RANGE [(_828, 32)] []", - "EXPR [ (1, _828) (-1, _829) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _828) (-1, _829) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _783, _829) (-1, _830) 0 ]", "BLACKBOX::RANGE [(_830, 32)] []", - "EXPR [ (1, _830) (-1, _831) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _830) (-1, _831) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _783, _831) (-1, _832) 0 ]", "BLACKBOX::RANGE [(_832, 32)] []", - "EXPR [ (1, _832) (-1, _833) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _832) (-1, _833) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _783, _833) (-1, _834) 0 ]", "BLACKBOX::RANGE [(_834, 32)] []", "EXPR [ (1, _783, _820) (1, _792, _821) (-1, _835) 0 ]", @@ -1252,22 +1252,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 14 })], outputs: [Simple(Witness(841))]", "EXPR [ (-1, _0, _841) (14, _841) (1, _842) -1 ]", "EXPR [ (-1, _0, _842) (14, _842) 0 ]", - "EXPR [ (1, _783, _834) (-1, _2262) 0 ]", - "EXPR [ (1, _792, _835) (-1, _2263) 0 ]", - "EXPR [ (-1, _843) (1, _1994) (1, _2262) (1, _2263) 0 ]", + "EXPR [ (1, _783, _834) (-1, _2181) 0 ]", + "EXPR [ (1, _792, _835) (-1, _2182) 0 ]", + "EXPR [ (-1, _843) (1, _1913) (1, _2181) (1, _2182) 0 ]", "EXPR [ (1, _842, _843) (-1, _844) 0 ]", "BLACKBOX::RANGE [(_844, 32)] []", - "EXPR [ (1, _844) (-1, _845) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _844) (-1, _845) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _842, _845) (-1, _846) 0 ]", "BLACKBOX::RANGE [(_846, 32)] []", - "EXPR [ (1, _846) (-1, _847) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _846) (-1, _847) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _842, _847) (-1, _848) 0 ]", "BLACKBOX::RANGE [(_848, 32)] []", - "EXPR [ (1, _848) (-1, _849) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _848) (-1, _849) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _842, _849) (-1, _850) 0 ]", "BLACKBOX::RANGE [(_850, 32)] []", "EXPR [ (-1, _842) (-1, _851) 1 ]", - "EXPR [ (-1, _852) (1, _2262) (1, _2263) 0 ]", + "EXPR [ (-1, _852) (1, _2181) (1, _2182) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(850))], q_c: -4864 })], outputs: [Simple(Witness(853))]", "EXPR [ (1, _850, _853) (-4864, _853) (1, _854) -1 ]", "EXPR [ (1, _850, _854) (-4864, _854) 0 ]", @@ -1277,13 +1277,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _850) (-1, _858) 0 ]", "EXPR [ (1, _842, _858) (-1, _859) 0 ]", "BLACKBOX::RANGE [(_859, 32)] []", - "EXPR [ (1, _859) (-1, _860) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _859) (-1, _860) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _842, _860) (-1, _861) 0 ]", "BLACKBOX::RANGE [(_861, 32)] []", - "EXPR [ (1, _861) (-1, _862) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _861) (-1, _862) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _842, _862) (-1, _863) 0 ]", "BLACKBOX::RANGE [(_863, 32)] []", - "EXPR [ (1, _863) (-1, _864) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _863) (-1, _864) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _842, _864) (-1, _865) 0 ]", "BLACKBOX::RANGE [(_865, 32)] []", "EXPR [ (1, _842, _850) (1, _851, _852) (-1, _866) 0 ]", @@ -1296,13 +1296,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _865) (-1, _872) 0 ]", "EXPR [ (1, _842, _872) (-1, _873) 0 ]", "BLACKBOX::RANGE [(_873, 32)] []", - "EXPR [ (1, _873) (-1, _874) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _873) (-1, _874) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _842, _874) (-1, _875) 0 ]", "BLACKBOX::RANGE [(_875, 32)] []", - "EXPR [ (1, _875) (-1, _876) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _875) (-1, _876) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _842, _876) (-1, _877) 0 ]", "BLACKBOX::RANGE [(_877, 32)] []", - "EXPR [ (1, _877) (-1, _878) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _877) (-1, _878) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _842, _878) (-1, _879) 0 ]", "BLACKBOX::RANGE [(_879, 32)] []", "EXPR [ (1, _842, _865) (1, _851, _866) (-1, _880) 0 ]", @@ -1315,13 +1315,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _879) (-1, _886) 0 ]", "EXPR [ (1, _842, _886) (-1, _887) 0 ]", "BLACKBOX::RANGE [(_887, 32)] []", - "EXPR [ (1, _887) (-1, _888) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _887) (-1, _888) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _842, _888) (-1, _889) 0 ]", "BLACKBOX::RANGE [(_889, 32)] []", - "EXPR [ (1, _889) (-1, _890) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _889) (-1, _890) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _842, _890) (-1, _891) 0 ]", "BLACKBOX::RANGE [(_891, 32)] []", - "EXPR [ (1, _891) (-1, _892) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _891) (-1, _892) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _842, _892) (-1, _893) 0 ]", "BLACKBOX::RANGE [(_893, 32)] []", "EXPR [ (1, _842, _879) (1, _851, _880) (-1, _894) 0 ]", @@ -1334,22 +1334,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 15 })], outputs: [Simple(Witness(900))]", "EXPR [ (-1, _0, _900) (15, _900) (1, _901) -1 ]", "EXPR [ (-1, _0, _901) (15, _901) 0 ]", - "EXPR [ (1, _842, _893) (-1, _2278) 0 ]", - "EXPR [ (1, _851, _894) (-1, _2279) 0 ]", - "EXPR [ (-1, _902) (1, _1994) (1, _2278) (1, _2279) 0 ]", + "EXPR [ (1, _842, _893) (-1, _2197) 0 ]", + "EXPR [ (1, _851, _894) (-1, _2198) 0 ]", + "EXPR [ (-1, _902) (1, _1913) (1, _2197) (1, _2198) 0 ]", "EXPR [ (1, _901, _902) (-1, _903) 0 ]", "BLACKBOX::RANGE [(_903, 32)] []", - "EXPR [ (1, _903) (-1, _904) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _903) (-1, _904) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _901, _904) (-1, _905) 0 ]", "BLACKBOX::RANGE [(_905, 32)] []", - "EXPR [ (1, _905) (-1, _906) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _905) (-1, _906) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _901, _906) (-1, _907) 0 ]", "BLACKBOX::RANGE [(_907, 32)] []", - "EXPR [ (1, _907) (-1, _908) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _907) (-1, _908) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _901, _908) (-1, _909) 0 ]", "BLACKBOX::RANGE [(_909, 32)] []", "EXPR [ (-1, _901) (-1, _910) 1 ]", - "EXPR [ (-1, _911) (1, _2278) (1, _2279) 0 ]", + "EXPR [ (-1, _911) (1, _2197) (1, _2198) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(909))], q_c: -4864 })], outputs: [Simple(Witness(912))]", "EXPR [ (1, _909, _912) (-4864, _912) (1, _913) -1 ]", "EXPR [ (1, _909, _913) (-4864, _913) 0 ]", @@ -1359,13 +1359,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _909) (-1, _917) 0 ]", "EXPR [ (1, _901, _917) (-1, _918) 0 ]", "BLACKBOX::RANGE [(_918, 32)] []", - "EXPR [ (1, _918) (-1, _919) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _918) (-1, _919) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _901, _919) (-1, _920) 0 ]", "BLACKBOX::RANGE [(_920, 32)] []", - "EXPR [ (1, _920) (-1, _921) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _920) (-1, _921) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _901, _921) (-1, _922) 0 ]", "BLACKBOX::RANGE [(_922, 32)] []", - "EXPR [ (1, _922) (-1, _923) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _922) (-1, _923) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _901, _923) (-1, _924) 0 ]", "BLACKBOX::RANGE [(_924, 32)] []", "EXPR [ (1, _901, _909) (1, _910, _911) (-1, _925) 0 ]", @@ -1378,13 +1378,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _924) (-1, _931) 0 ]", "EXPR [ (1, _901, _931) (-1, _932) 0 ]", "BLACKBOX::RANGE [(_932, 32)] []", - "EXPR [ (1, _932) (-1, _933) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _932) (-1, _933) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _901, _933) (-1, _934) 0 ]", "BLACKBOX::RANGE [(_934, 32)] []", - "EXPR [ (1, _934) (-1, _935) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _934) (-1, _935) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _901, _935) (-1, _936) 0 ]", "BLACKBOX::RANGE [(_936, 32)] []", - "EXPR [ (1, _936) (-1, _937) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _936) (-1, _937) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _901, _937) (-1, _938) 0 ]", "BLACKBOX::RANGE [(_938, 32)] []", "EXPR [ (1, _901, _924) (1, _910, _925) (-1, _939) 0 ]", @@ -1397,13 +1397,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _938) (-1, _945) 0 ]", "EXPR [ (1, _901, _945) (-1, _946) 0 ]", "BLACKBOX::RANGE [(_946, 32)] []", - "EXPR [ (1, _946) (-1, _947) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _946) (-1, _947) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _901, _947) (-1, _948) 0 ]", "BLACKBOX::RANGE [(_948, 32)] []", - "EXPR [ (1, _948) (-1, _949) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _948) (-1, _949) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _901, _949) (-1, _950) 0 ]", "BLACKBOX::RANGE [(_950, 32)] []", - "EXPR [ (1, _950) (-1, _951) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _950) (-1, _951) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _901, _951) (-1, _952) 0 ]", "BLACKBOX::RANGE [(_952, 32)] []", "EXPR [ (1, _901, _938) (1, _910, _939) (-1, _953) 0 ]", @@ -1416,22 +1416,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 16 })], outputs: [Simple(Witness(959))]", "EXPR [ (-1, _0, _959) (16, _959) (1, _960) -1 ]", "EXPR [ (-1, _0, _960) (16, _960) 0 ]", - "EXPR [ (1, _901, _952) (-1, _2294) 0 ]", - "EXPR [ (1, _910, _953) (-1, _2295) 0 ]", - "EXPR [ (-1, _961) (1, _1994) (1, _2294) (1, _2295) 0 ]", + "EXPR [ (1, _901, _952) (-1, _2213) 0 ]", + "EXPR [ (1, _910, _953) (-1, _2214) 0 ]", + "EXPR [ (-1, _961) (1, _1913) (1, _2213) (1, _2214) 0 ]", "EXPR [ (1, _960, _961) (-1, _962) 0 ]", "BLACKBOX::RANGE [(_962, 32)] []", - "EXPR [ (1, _962) (-1, _963) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _962) (-1, _963) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _960, _963) (-1, _964) 0 ]", "BLACKBOX::RANGE [(_964, 32)] []", - "EXPR [ (1, _964) (-1, _965) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _964) (-1, _965) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _960, _965) (-1, _966) 0 ]", "BLACKBOX::RANGE [(_966, 32)] []", - "EXPR [ (1, _966) (-1, _967) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _966) (-1, _967) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _960, _967) (-1, _968) 0 ]", "BLACKBOX::RANGE [(_968, 32)] []", "EXPR [ (-1, _960) (-1, _969) 1 ]", - "EXPR [ (-1, _970) (1, _2294) (1, _2295) 0 ]", + "EXPR [ (-1, _970) (1, _2213) (1, _2214) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(968))], q_c: -4864 })], outputs: [Simple(Witness(971))]", "EXPR [ (1, _968, _971) (-4864, _971) (1, _972) -1 ]", "EXPR [ (1, _968, _972) (-4864, _972) 0 ]", @@ -1441,13 +1441,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _968) (-1, _976) 0 ]", "EXPR [ (1, _960, _976) (-1, _977) 0 ]", "BLACKBOX::RANGE [(_977, 32)] []", - "EXPR [ (1, _977) (-1, _978) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _977) (-1, _978) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _960, _978) (-1, _979) 0 ]", "BLACKBOX::RANGE [(_979, 32)] []", - "EXPR [ (1, _979) (-1, _980) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _979) (-1, _980) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _960, _980) (-1, _981) 0 ]", "BLACKBOX::RANGE [(_981, 32)] []", - "EXPR [ (1, _981) (-1, _982) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _981) (-1, _982) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _960, _982) (-1, _983) 0 ]", "BLACKBOX::RANGE [(_983, 32)] []", "EXPR [ (1, _960, _968) (1, _969, _970) (-1, _984) 0 ]", @@ -1460,13 +1460,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _983) (-1, _990) 0 ]", "EXPR [ (1, _960, _990) (-1, _991) 0 ]", "BLACKBOX::RANGE [(_991, 32)] []", - "EXPR [ (1, _991) (-1, _992) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _991) (-1, _992) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _960, _992) (-1, _993) 0 ]", "BLACKBOX::RANGE [(_993, 32)] []", - "EXPR [ (1, _993) (-1, _994) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _993) (-1, _994) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _960, _994) (-1, _995) 0 ]", "BLACKBOX::RANGE [(_995, 32)] []", - "EXPR [ (1, _995) (-1, _996) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _995) (-1, _996) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _960, _996) (-1, _997) 0 ]", "BLACKBOX::RANGE [(_997, 32)] []", "EXPR [ (1, _960, _983) (1, _969, _984) (-1, _998) 0 ]", @@ -1479,13 +1479,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _997) (-1, _1004) 0 ]", "EXPR [ (1, _960, _1004) (-1, _1005) 0 ]", "BLACKBOX::RANGE [(_1005, 32)] []", - "EXPR [ (1, _1005) (-1, _1006) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1005) (-1, _1006) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _960, _1006) (-1, _1007) 0 ]", "BLACKBOX::RANGE [(_1007, 32)] []", - "EXPR [ (1, _1007) (-1, _1008) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1007) (-1, _1008) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _960, _1008) (-1, _1009) 0 ]", "BLACKBOX::RANGE [(_1009, 32)] []", - "EXPR [ (1, _1009) (-1, _1010) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1009) (-1, _1010) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _960, _1010) (-1, _1011) 0 ]", "BLACKBOX::RANGE [(_1011, 32)] []", "EXPR [ (1, _960, _997) (1, _969, _998) (-1, _1012) 0 ]", @@ -1498,22 +1498,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 17 })], outputs: [Simple(Witness(1018))]", "EXPR [ (-1, _0, _1018) (17, _1018) (1, _1019) -1 ]", "EXPR [ (-1, _0, _1019) (17, _1019) 0 ]", - "EXPR [ (1, _960, _1011) (-1, _2310) 0 ]", - "EXPR [ (1, _969, _1012) (-1, _2311) 0 ]", - "EXPR [ (-1, _1020) (1, _1994) (1, _2310) (1, _2311) 0 ]", + "EXPR [ (1, _960, _1011) (-1, _2229) 0 ]", + "EXPR [ (1, _969, _1012) (-1, _2230) 0 ]", + "EXPR [ (-1, _1020) (1, _1913) (1, _2229) (1, _2230) 0 ]", "EXPR [ (1, _1019, _1020) (-1, _1021) 0 ]", "BLACKBOX::RANGE [(_1021, 32)] []", - "EXPR [ (1, _1021) (-1, _1022) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1021) (-1, _1022) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1019, _1022) (-1, _1023) 0 ]", "BLACKBOX::RANGE [(_1023, 32)] []", - "EXPR [ (1, _1023) (-1, _1024) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1023) (-1, _1024) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1019, _1024) (-1, _1025) 0 ]", "BLACKBOX::RANGE [(_1025, 32)] []", - "EXPR [ (1, _1025) (-1, _1026) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1025) (-1, _1026) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1019, _1026) (-1, _1027) 0 ]", "BLACKBOX::RANGE [(_1027, 32)] []", "EXPR [ (-1, _1019) (-1, _1028) 1 ]", - "EXPR [ (-1, _1029) (1, _2310) (1, _2311) 0 ]", + "EXPR [ (-1, _1029) (1, _2229) (1, _2230) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1027))], q_c: -4864 })], outputs: [Simple(Witness(1030))]", "EXPR [ (1, _1027, _1030) (-4864, _1030) (1, _1031) -1 ]", "EXPR [ (1, _1027, _1031) (-4864, _1031) 0 ]", @@ -1523,13 +1523,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1027) (-1, _1035) 0 ]", "EXPR [ (1, _1019, _1035) (-1, _1036) 0 ]", "BLACKBOX::RANGE [(_1036, 32)] []", - "EXPR [ (1, _1036) (-1, _1037) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1036) (-1, _1037) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1019, _1037) (-1, _1038) 0 ]", "BLACKBOX::RANGE [(_1038, 32)] []", - "EXPR [ (1, _1038) (-1, _1039) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1038) (-1, _1039) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1019, _1039) (-1, _1040) 0 ]", "BLACKBOX::RANGE [(_1040, 32)] []", - "EXPR [ (1, _1040) (-1, _1041) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1040) (-1, _1041) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1019, _1041) (-1, _1042) 0 ]", "BLACKBOX::RANGE [(_1042, 32)] []", "EXPR [ (1, _1019, _1027) (1, _1028, _1029) (-1, _1043) 0 ]", @@ -1542,13 +1542,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1042) (-1, _1049) 0 ]", "EXPR [ (1, _1019, _1049) (-1, _1050) 0 ]", "BLACKBOX::RANGE [(_1050, 32)] []", - "EXPR [ (1, _1050) (-1, _1051) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1050) (-1, _1051) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1019, _1051) (-1, _1052) 0 ]", "BLACKBOX::RANGE [(_1052, 32)] []", - "EXPR [ (1, _1052) (-1, _1053) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1052) (-1, _1053) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1019, _1053) (-1, _1054) 0 ]", "BLACKBOX::RANGE [(_1054, 32)] []", - "EXPR [ (1, _1054) (-1, _1055) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1054) (-1, _1055) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1019, _1055) (-1, _1056) 0 ]", "BLACKBOX::RANGE [(_1056, 32)] []", "EXPR [ (1, _1019, _1042) (1, _1028, _1043) (-1, _1057) 0 ]", @@ -1561,13 +1561,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1056) (-1, _1063) 0 ]", "EXPR [ (1, _1019, _1063) (-1, _1064) 0 ]", "BLACKBOX::RANGE [(_1064, 32)] []", - "EXPR [ (1, _1064) (-1, _1065) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1064) (-1, _1065) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1019, _1065) (-1, _1066) 0 ]", "BLACKBOX::RANGE [(_1066, 32)] []", - "EXPR [ (1, _1066) (-1, _1067) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1066) (-1, _1067) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1019, _1067) (-1, _1068) 0 ]", "BLACKBOX::RANGE [(_1068, 32)] []", - "EXPR [ (1, _1068) (-1, _1069) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1068) (-1, _1069) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1019, _1069) (-1, _1070) 0 ]", "BLACKBOX::RANGE [(_1070, 32)] []", "EXPR [ (1, _1019, _1056) (1, _1028, _1057) (-1, _1071) 0 ]", @@ -1580,22 +1580,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 18 })], outputs: [Simple(Witness(1077))]", "EXPR [ (-1, _0, _1077) (18, _1077) (1, _1078) -1 ]", "EXPR [ (-1, _0, _1078) (18, _1078) 0 ]", - "EXPR [ (1, _1019, _1070) (-1, _2326) 0 ]", - "EXPR [ (1, _1028, _1071) (-1, _2327) 0 ]", - "EXPR [ (-1, _1079) (1, _1994) (1, _2326) (1, _2327) 0 ]", + "EXPR [ (1, _1019, _1070) (-1, _2245) 0 ]", + "EXPR [ (1, _1028, _1071) (-1, _2246) 0 ]", + "EXPR [ (-1, _1079) (1, _1913) (1, _2245) (1, _2246) 0 ]", "EXPR [ (1, _1078, _1079) (-1, _1080) 0 ]", "BLACKBOX::RANGE [(_1080, 32)] []", - "EXPR [ (1, _1080) (-1, _1081) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1080) (-1, _1081) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1078, _1081) (-1, _1082) 0 ]", "BLACKBOX::RANGE [(_1082, 32)] []", - "EXPR [ (1, _1082) (-1, _1083) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1082) (-1, _1083) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1078, _1083) (-1, _1084) 0 ]", "BLACKBOX::RANGE [(_1084, 32)] []", - "EXPR [ (1, _1084) (-1, _1085) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1084) (-1, _1085) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1078, _1085) (-1, _1086) 0 ]", "BLACKBOX::RANGE [(_1086, 32)] []", "EXPR [ (-1, _1078) (-1, _1087) 1 ]", - "EXPR [ (-1, _1088) (1, _2326) (1, _2327) 0 ]", + "EXPR [ (-1, _1088) (1, _2245) (1, _2246) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1086))], q_c: -4864 })], outputs: [Simple(Witness(1089))]", "EXPR [ (1, _1086, _1089) (-4864, _1089) (1, _1090) -1 ]", "EXPR [ (1, _1086, _1090) (-4864, _1090) 0 ]", @@ -1605,13 +1605,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1086) (-1, _1094) 0 ]", "EXPR [ (1, _1078, _1094) (-1, _1095) 0 ]", "BLACKBOX::RANGE [(_1095, 32)] []", - "EXPR [ (1, _1095) (-1, _1096) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1095) (-1, _1096) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1078, _1096) (-1, _1097) 0 ]", "BLACKBOX::RANGE [(_1097, 32)] []", - "EXPR [ (1, _1097) (-1, _1098) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1097) (-1, _1098) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1078, _1098) (-1, _1099) 0 ]", "BLACKBOX::RANGE [(_1099, 32)] []", - "EXPR [ (1, _1099) (-1, _1100) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1099) (-1, _1100) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1078, _1100) (-1, _1101) 0 ]", "BLACKBOX::RANGE [(_1101, 32)] []", "EXPR [ (1, _1078, _1086) (1, _1087, _1088) (-1, _1102) 0 ]", @@ -1624,13 +1624,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1101) (-1, _1108) 0 ]", "EXPR [ (1, _1078, _1108) (-1, _1109) 0 ]", "BLACKBOX::RANGE [(_1109, 32)] []", - "EXPR [ (1, _1109) (-1, _1110) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1109) (-1, _1110) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1078, _1110) (-1, _1111) 0 ]", "BLACKBOX::RANGE [(_1111, 32)] []", - "EXPR [ (1, _1111) (-1, _1112) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1111) (-1, _1112) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1078, _1112) (-1, _1113) 0 ]", "BLACKBOX::RANGE [(_1113, 32)] []", - "EXPR [ (1, _1113) (-1, _1114) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1113) (-1, _1114) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1078, _1114) (-1, _1115) 0 ]", "BLACKBOX::RANGE [(_1115, 32)] []", "EXPR [ (1, _1078, _1101) (1, _1087, _1102) (-1, _1116) 0 ]", @@ -1643,13 +1643,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1115) (-1, _1122) 0 ]", "EXPR [ (1, _1078, _1122) (-1, _1123) 0 ]", "BLACKBOX::RANGE [(_1123, 32)] []", - "EXPR [ (1, _1123) (-1, _1124) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1123) (-1, _1124) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1078, _1124) (-1, _1125) 0 ]", "BLACKBOX::RANGE [(_1125, 32)] []", - "EXPR [ (1, _1125) (-1, _1126) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1125) (-1, _1126) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1078, _1126) (-1, _1127) 0 ]", "BLACKBOX::RANGE [(_1127, 32)] []", - "EXPR [ (1, _1127) (-1, _1128) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1127) (-1, _1128) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1078, _1128) (-1, _1129) 0 ]", "BLACKBOX::RANGE [(_1129, 32)] []", "EXPR [ (1, _1078, _1115) (1, _1087, _1116) (-1, _1130) 0 ]", @@ -1662,22 +1662,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 19 })], outputs: [Simple(Witness(1136))]", "EXPR [ (-1, _0, _1136) (19, _1136) (1, _1137) -1 ]", "EXPR [ (-1, _0, _1137) (19, _1137) 0 ]", - "EXPR [ (1, _1078, _1129) (-1, _2342) 0 ]", - "EXPR [ (1, _1087, _1130) (-1, _2343) 0 ]", - "EXPR [ (-1, _1138) (1, _1994) (1, _2342) (1, _2343) 0 ]", + "EXPR [ (1, _1078, _1129) (-1, _2261) 0 ]", + "EXPR [ (1, _1087, _1130) (-1, _2262) 0 ]", + "EXPR [ (-1, _1138) (1, _1913) (1, _2261) (1, _2262) 0 ]", "EXPR [ (1, _1137, _1138) (-1, _1139) 0 ]", "BLACKBOX::RANGE [(_1139, 32)] []", - "EXPR [ (1, _1139) (-1, _1140) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1139) (-1, _1140) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1137, _1140) (-1, _1141) 0 ]", "BLACKBOX::RANGE [(_1141, 32)] []", - "EXPR [ (1, _1141) (-1, _1142) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1141) (-1, _1142) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1137, _1142) (-1, _1143) 0 ]", "BLACKBOX::RANGE [(_1143, 32)] []", - "EXPR [ (1, _1143) (-1, _1144) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1143) (-1, _1144) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1137, _1144) (-1, _1145) 0 ]", "BLACKBOX::RANGE [(_1145, 32)] []", "EXPR [ (-1, _1137) (-1, _1146) 1 ]", - "EXPR [ (-1, _1147) (1, _2342) (1, _2343) 0 ]", + "EXPR [ (-1, _1147) (1, _2261) (1, _2262) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1145))], q_c: -4864 })], outputs: [Simple(Witness(1148))]", "EXPR [ (1, _1145, _1148) (-4864, _1148) (1, _1149) -1 ]", "EXPR [ (1, _1145, _1149) (-4864, _1149) 0 ]", @@ -1687,13 +1687,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1145) (-1, _1153) 0 ]", "EXPR [ (1, _1137, _1153) (-1, _1154) 0 ]", "BLACKBOX::RANGE [(_1154, 32)] []", - "EXPR [ (1, _1154) (-1, _1155) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1154) (-1, _1155) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1137, _1155) (-1, _1156) 0 ]", "BLACKBOX::RANGE [(_1156, 32)] []", - "EXPR [ (1, _1156) (-1, _1157) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1156) (-1, _1157) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1137, _1157) (-1, _1158) 0 ]", "BLACKBOX::RANGE [(_1158, 32)] []", - "EXPR [ (1, _1158) (-1, _1159) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1158) (-1, _1159) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1137, _1159) (-1, _1160) 0 ]", "BLACKBOX::RANGE [(_1160, 32)] []", "EXPR [ (1, _1137, _1145) (1, _1146, _1147) (-1, _1161) 0 ]", @@ -1706,13 +1706,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1160) (-1, _1167) 0 ]", "EXPR [ (1, _1137, _1167) (-1, _1168) 0 ]", "BLACKBOX::RANGE [(_1168, 32)] []", - "EXPR [ (1, _1168) (-1, _1169) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1168) (-1, _1169) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1137, _1169) (-1, _1170) 0 ]", "BLACKBOX::RANGE [(_1170, 32)] []", - "EXPR [ (1, _1170) (-1, _1171) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1170) (-1, _1171) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1137, _1171) (-1, _1172) 0 ]", "BLACKBOX::RANGE [(_1172, 32)] []", - "EXPR [ (1, _1172) (-1, _1173) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1172) (-1, _1173) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1137, _1173) (-1, _1174) 0 ]", "BLACKBOX::RANGE [(_1174, 32)] []", "EXPR [ (1, _1137, _1160) (1, _1146, _1161) (-1, _1175) 0 ]", @@ -1725,13 +1725,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1174) (-1, _1181) 0 ]", "EXPR [ (1, _1137, _1181) (-1, _1182) 0 ]", "BLACKBOX::RANGE [(_1182, 32)] []", - "EXPR [ (1, _1182) (-1, _1183) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1182) (-1, _1183) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1137, _1183) (-1, _1184) 0 ]", "BLACKBOX::RANGE [(_1184, 32)] []", - "EXPR [ (1, _1184) (-1, _1185) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1184) (-1, _1185) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1137, _1185) (-1, _1186) 0 ]", "BLACKBOX::RANGE [(_1186, 32)] []", - "EXPR [ (1, _1186) (-1, _1187) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1186) (-1, _1187) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1137, _1187) (-1, _1188) 0 ]", "BLACKBOX::RANGE [(_1188, 32)] []", "EXPR [ (1, _1137, _1174) (1, _1146, _1175) (-1, _1189) 0 ]", @@ -1744,22 +1744,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 20 })], outputs: [Simple(Witness(1195))]", "EXPR [ (-1, _0, _1195) (20, _1195) (1, _1196) -1 ]", "EXPR [ (-1, _0, _1196) (20, _1196) 0 ]", - "EXPR [ (1, _1137, _1188) (-1, _2358) 0 ]", - "EXPR [ (1, _1146, _1189) (-1, _2359) 0 ]", - "EXPR [ (-1, _1197) (1, _1994) (1, _2358) (1, _2359) 0 ]", + "EXPR [ (1, _1137, _1188) (-1, _2277) 0 ]", + "EXPR [ (1, _1146, _1189) (-1, _2278) 0 ]", + "EXPR [ (-1, _1197) (1, _1913) (1, _2277) (1, _2278) 0 ]", "EXPR [ (1, _1196, _1197) (-1, _1198) 0 ]", "BLACKBOX::RANGE [(_1198, 32)] []", - "EXPR [ (1, _1198) (-1, _1199) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1198) (-1, _1199) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1196, _1199) (-1, _1200) 0 ]", "BLACKBOX::RANGE [(_1200, 32)] []", - "EXPR [ (1, _1200) (-1, _1201) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1200) (-1, _1201) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1196, _1201) (-1, _1202) 0 ]", "BLACKBOX::RANGE [(_1202, 32)] []", - "EXPR [ (1, _1202) (-1, _1203) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1202) (-1, _1203) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1196, _1203) (-1, _1204) 0 ]", "BLACKBOX::RANGE [(_1204, 32)] []", "EXPR [ (-1, _1196) (-1, _1205) 1 ]", - "EXPR [ (-1, _1206) (1, _2358) (1, _2359) 0 ]", + "EXPR [ (-1, _1206) (1, _2277) (1, _2278) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1204))], q_c: -4864 })], outputs: [Simple(Witness(1207))]", "EXPR [ (1, _1204, _1207) (-4864, _1207) (1, _1208) -1 ]", "EXPR [ (1, _1204, _1208) (-4864, _1208) 0 ]", @@ -1769,13 +1769,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1204) (-1, _1212) 0 ]", "EXPR [ (1, _1196, _1212) (-1, _1213) 0 ]", "BLACKBOX::RANGE [(_1213, 32)] []", - "EXPR [ (1, _1213) (-1, _1214) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1213) (-1, _1214) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1196, _1214) (-1, _1215) 0 ]", "BLACKBOX::RANGE [(_1215, 32)] []", - "EXPR [ (1, _1215) (-1, _1216) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1215) (-1, _1216) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1196, _1216) (-1, _1217) 0 ]", "BLACKBOX::RANGE [(_1217, 32)] []", - "EXPR [ (1, _1217) (-1, _1218) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1217) (-1, _1218) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1196, _1218) (-1, _1219) 0 ]", "BLACKBOX::RANGE [(_1219, 32)] []", "EXPR [ (1, _1196, _1204) (1, _1205, _1206) (-1, _1220) 0 ]", @@ -1788,13 +1788,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1219) (-1, _1226) 0 ]", "EXPR [ (1, _1196, _1226) (-1, _1227) 0 ]", "BLACKBOX::RANGE [(_1227, 32)] []", - "EXPR [ (1, _1227) (-1, _1228) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1227) (-1, _1228) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1196, _1228) (-1, _1229) 0 ]", "BLACKBOX::RANGE [(_1229, 32)] []", - "EXPR [ (1, _1229) (-1, _1230) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1229) (-1, _1230) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1196, _1230) (-1, _1231) 0 ]", "BLACKBOX::RANGE [(_1231, 32)] []", - "EXPR [ (1, _1231) (-1, _1232) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1231) (-1, _1232) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1196, _1232) (-1, _1233) 0 ]", "BLACKBOX::RANGE [(_1233, 32)] []", "EXPR [ (1, _1196, _1219) (1, _1205, _1220) (-1, _1234) 0 ]", @@ -1807,13 +1807,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1233) (-1, _1240) 0 ]", "EXPR [ (1, _1196, _1240) (-1, _1241) 0 ]", "BLACKBOX::RANGE [(_1241, 32)] []", - "EXPR [ (1, _1241) (-1, _1242) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1241) (-1, _1242) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1196, _1242) (-1, _1243) 0 ]", "BLACKBOX::RANGE [(_1243, 32)] []", - "EXPR [ (1, _1243) (-1, _1244) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1243) (-1, _1244) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1196, _1244) (-1, _1245) 0 ]", "BLACKBOX::RANGE [(_1245, 32)] []", - "EXPR [ (1, _1245) (-1, _1246) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1245) (-1, _1246) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1196, _1246) (-1, _1247) 0 ]", "BLACKBOX::RANGE [(_1247, 32)] []", "EXPR [ (1, _1196, _1233) (1, _1205, _1234) (-1, _1248) 0 ]", @@ -1826,22 +1826,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 21 })], outputs: [Simple(Witness(1254))]", "EXPR [ (-1, _0, _1254) (21, _1254) (1, _1255) -1 ]", "EXPR [ (-1, _0, _1255) (21, _1255) 0 ]", - "EXPR [ (1, _1196, _1247) (-1, _2374) 0 ]", - "EXPR [ (1, _1205, _1248) (-1, _2375) 0 ]", - "EXPR [ (-1, _1256) (1, _1994) (1, _2374) (1, _2375) 0 ]", + "EXPR [ (1, _1196, _1247) (-1, _2293) 0 ]", + "EXPR [ (1, _1205, _1248) (-1, _2294) 0 ]", + "EXPR [ (-1, _1256) (1, _1913) (1, _2293) (1, _2294) 0 ]", "EXPR [ (1, _1255, _1256) (-1, _1257) 0 ]", "BLACKBOX::RANGE [(_1257, 32)] []", - "EXPR [ (1, _1257) (-1, _1258) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1257) (-1, _1258) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1255, _1258) (-1, _1259) 0 ]", "BLACKBOX::RANGE [(_1259, 32)] []", - "EXPR [ (1, _1259) (-1, _1260) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1259) (-1, _1260) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1255, _1260) (-1, _1261) 0 ]", "BLACKBOX::RANGE [(_1261, 32)] []", - "EXPR [ (1, _1261) (-1, _1262) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1261) (-1, _1262) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1255, _1262) (-1, _1263) 0 ]", "BLACKBOX::RANGE [(_1263, 32)] []", "EXPR [ (-1, _1255) (-1, _1264) 1 ]", - "EXPR [ (-1, _1265) (1, _2374) (1, _2375) 0 ]", + "EXPR [ (-1, _1265) (1, _2293) (1, _2294) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1263))], q_c: -4864 })], outputs: [Simple(Witness(1266))]", "EXPR [ (1, _1263, _1266) (-4864, _1266) (1, _1267) -1 ]", "EXPR [ (1, _1263, _1267) (-4864, _1267) 0 ]", @@ -1851,13 +1851,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1263) (-1, _1271) 0 ]", "EXPR [ (1, _1255, _1271) (-1, _1272) 0 ]", "BLACKBOX::RANGE [(_1272, 32)] []", - "EXPR [ (1, _1272) (-1, _1273) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1272) (-1, _1273) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1255, _1273) (-1, _1274) 0 ]", "BLACKBOX::RANGE [(_1274, 32)] []", - "EXPR [ (1, _1274) (-1, _1275) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1274) (-1, _1275) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1255, _1275) (-1, _1276) 0 ]", "BLACKBOX::RANGE [(_1276, 32)] []", - "EXPR [ (1, _1276) (-1, _1277) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1276) (-1, _1277) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1255, _1277) (-1, _1278) 0 ]", "BLACKBOX::RANGE [(_1278, 32)] []", "EXPR [ (1, _1255, _1263) (1, _1264, _1265) (-1, _1279) 0 ]", @@ -1870,13 +1870,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1278) (-1, _1285) 0 ]", "EXPR [ (1, _1255, _1285) (-1, _1286) 0 ]", "BLACKBOX::RANGE [(_1286, 32)] []", - "EXPR [ (1, _1286) (-1, _1287) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1286) (-1, _1287) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1255, _1287) (-1, _1288) 0 ]", "BLACKBOX::RANGE [(_1288, 32)] []", - "EXPR [ (1, _1288) (-1, _1289) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1288) (-1, _1289) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1255, _1289) (-1, _1290) 0 ]", "BLACKBOX::RANGE [(_1290, 32)] []", - "EXPR [ (1, _1290) (-1, _1291) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1290) (-1, _1291) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1255, _1291) (-1, _1292) 0 ]", "BLACKBOX::RANGE [(_1292, 32)] []", "EXPR [ (1, _1255, _1278) (1, _1264, _1279) (-1, _1293) 0 ]", @@ -1889,13 +1889,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1292) (-1, _1299) 0 ]", "EXPR [ (1, _1255, _1299) (-1, _1300) 0 ]", "BLACKBOX::RANGE [(_1300, 32)] []", - "EXPR [ (1, _1300) (-1, _1301) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1300) (-1, _1301) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1255, _1301) (-1, _1302) 0 ]", "BLACKBOX::RANGE [(_1302, 32)] []", - "EXPR [ (1, _1302) (-1, _1303) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1302) (-1, _1303) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1255, _1303) (-1, _1304) 0 ]", "BLACKBOX::RANGE [(_1304, 32)] []", - "EXPR [ (1, _1304) (-1, _1305) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1304) (-1, _1305) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1255, _1305) (-1, _1306) 0 ]", "BLACKBOX::RANGE [(_1306, 32)] []", "EXPR [ (1, _1255, _1292) (1, _1264, _1293) (-1, _1307) 0 ]", @@ -1908,22 +1908,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 22 })], outputs: [Simple(Witness(1313))]", "EXPR [ (-1, _0, _1313) (22, _1313) (1, _1314) -1 ]", "EXPR [ (-1, _0, _1314) (22, _1314) 0 ]", - "EXPR [ (1, _1255, _1306) (-1, _2390) 0 ]", - "EXPR [ (1, _1264, _1307) (-1, _2391) 0 ]", - "EXPR [ (-1, _1315) (1, _1994) (1, _2390) (1, _2391) 0 ]", + "EXPR [ (1, _1255, _1306) (-1, _2309) 0 ]", + "EXPR [ (1, _1264, _1307) (-1, _2310) 0 ]", + "EXPR [ (-1, _1315) (1, _1913) (1, _2309) (1, _2310) 0 ]", "EXPR [ (1, _1314, _1315) (-1, _1316) 0 ]", "BLACKBOX::RANGE [(_1316, 32)] []", - "EXPR [ (1, _1316) (-1, _1317) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1316) (-1, _1317) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1314, _1317) (-1, _1318) 0 ]", "BLACKBOX::RANGE [(_1318, 32)] []", - "EXPR [ (1, _1318) (-1, _1319) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1318) (-1, _1319) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1314, _1319) (-1, _1320) 0 ]", "BLACKBOX::RANGE [(_1320, 32)] []", - "EXPR [ (1, _1320) (-1, _1321) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1320) (-1, _1321) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1314, _1321) (-1, _1322) 0 ]", "BLACKBOX::RANGE [(_1322, 32)] []", "EXPR [ (-1, _1314) (-1, _1323) 1 ]", - "EXPR [ (-1, _1324) (1, _2390) (1, _2391) 0 ]", + "EXPR [ (-1, _1324) (1, _2309) (1, _2310) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1322))], q_c: -4864 })], outputs: [Simple(Witness(1325))]", "EXPR [ (1, _1322, _1325) (-4864, _1325) (1, _1326) -1 ]", "EXPR [ (1, _1322, _1326) (-4864, _1326) 0 ]", @@ -1933,13 +1933,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1322) (-1, _1330) 0 ]", "EXPR [ (1, _1314, _1330) (-1, _1331) 0 ]", "BLACKBOX::RANGE [(_1331, 32)] []", - "EXPR [ (1, _1331) (-1, _1332) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1331) (-1, _1332) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1314, _1332) (-1, _1333) 0 ]", "BLACKBOX::RANGE [(_1333, 32)] []", - "EXPR [ (1, _1333) (-1, _1334) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1333) (-1, _1334) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1314, _1334) (-1, _1335) 0 ]", "BLACKBOX::RANGE [(_1335, 32)] []", - "EXPR [ (1, _1335) (-1, _1336) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1335) (-1, _1336) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1314, _1336) (-1, _1337) 0 ]", "BLACKBOX::RANGE [(_1337, 32)] []", "EXPR [ (1, _1314, _1322) (1, _1323, _1324) (-1, _1338) 0 ]", @@ -1952,13 +1952,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1337) (-1, _1344) 0 ]", "EXPR [ (1, _1314, _1344) (-1, _1345) 0 ]", "BLACKBOX::RANGE [(_1345, 32)] []", - "EXPR [ (1, _1345) (-1, _1346) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1345) (-1, _1346) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1314, _1346) (-1, _1347) 0 ]", "BLACKBOX::RANGE [(_1347, 32)] []", - "EXPR [ (1, _1347) (-1, _1348) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1347) (-1, _1348) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1314, _1348) (-1, _1349) 0 ]", "BLACKBOX::RANGE [(_1349, 32)] []", - "EXPR [ (1, _1349) (-1, _1350) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1349) (-1, _1350) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1314, _1350) (-1, _1351) 0 ]", "BLACKBOX::RANGE [(_1351, 32)] []", "EXPR [ (1, _1314, _1337) (1, _1323, _1338) (-1, _1352) 0 ]", @@ -1971,13 +1971,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1351) (-1, _1358) 0 ]", "EXPR [ (1, _1314, _1358) (-1, _1359) 0 ]", "BLACKBOX::RANGE [(_1359, 32)] []", - "EXPR [ (1, _1359) (-1, _1360) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1359) (-1, _1360) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1314, _1360) (-1, _1361) 0 ]", "BLACKBOX::RANGE [(_1361, 32)] []", - "EXPR [ (1, _1361) (-1, _1362) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1361) (-1, _1362) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1314, _1362) (-1, _1363) 0 ]", "BLACKBOX::RANGE [(_1363, 32)] []", - "EXPR [ (1, _1363) (-1, _1364) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1363) (-1, _1364) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1314, _1364) (-1, _1365) 0 ]", "BLACKBOX::RANGE [(_1365, 32)] []", "EXPR [ (1, _1314, _1351) (1, _1323, _1352) (-1, _1366) 0 ]", @@ -1990,22 +1990,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 23 })], outputs: [Simple(Witness(1372))]", "EXPR [ (-1, _0, _1372) (23, _1372) (1, _1373) -1 ]", "EXPR [ (-1, _0, _1373) (23, _1373) 0 ]", - "EXPR [ (1, _1314, _1365) (-1, _2406) 0 ]", - "EXPR [ (1, _1323, _1366) (-1, _2407) 0 ]", - "EXPR [ (-1, _1374) (1, _1994) (1, _2406) (1, _2407) 0 ]", + "EXPR [ (1, _1314, _1365) (-1, _2325) 0 ]", + "EXPR [ (1, _1323, _1366) (-1, _2326) 0 ]", + "EXPR [ (-1, _1374) (1, _1913) (1, _2325) (1, _2326) 0 ]", "EXPR [ (1, _1373, _1374) (-1, _1375) 0 ]", "BLACKBOX::RANGE [(_1375, 32)] []", - "EXPR [ (1, _1375) (-1, _1376) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1375) (-1, _1376) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1373, _1376) (-1, _1377) 0 ]", "BLACKBOX::RANGE [(_1377, 32)] []", - "EXPR [ (1, _1377) (-1, _1378) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1377) (-1, _1378) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1373, _1378) (-1, _1379) 0 ]", "BLACKBOX::RANGE [(_1379, 32)] []", - "EXPR [ (1, _1379) (-1, _1380) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1379) (-1, _1380) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1373, _1380) (-1, _1381) 0 ]", "BLACKBOX::RANGE [(_1381, 32)] []", "EXPR [ (-1, _1373) (-1, _1382) 1 ]", - "EXPR [ (-1, _1383) (1, _2406) (1, _2407) 0 ]", + "EXPR [ (-1, _1383) (1, _2325) (1, _2326) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1381))], q_c: -4864 })], outputs: [Simple(Witness(1384))]", "EXPR [ (1, _1381, _1384) (-4864, _1384) (1, _1385) -1 ]", "EXPR [ (1, _1381, _1385) (-4864, _1385) 0 ]", @@ -2015,13 +2015,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1381) (-1, _1389) 0 ]", "EXPR [ (1, _1373, _1389) (-1, _1390) 0 ]", "BLACKBOX::RANGE [(_1390, 32)] []", - "EXPR [ (1, _1390) (-1, _1391) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1390) (-1, _1391) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1373, _1391) (-1, _1392) 0 ]", "BLACKBOX::RANGE [(_1392, 32)] []", - "EXPR [ (1, _1392) (-1, _1393) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1392) (-1, _1393) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1373, _1393) (-1, _1394) 0 ]", "BLACKBOX::RANGE [(_1394, 32)] []", - "EXPR [ (1, _1394) (-1, _1395) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1394) (-1, _1395) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1373, _1395) (-1, _1396) 0 ]", "BLACKBOX::RANGE [(_1396, 32)] []", "EXPR [ (1, _1373, _1381) (1, _1382, _1383) (-1, _1397) 0 ]", @@ -2034,13 +2034,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1396) (-1, _1403) 0 ]", "EXPR [ (1, _1373, _1403) (-1, _1404) 0 ]", "BLACKBOX::RANGE [(_1404, 32)] []", - "EXPR [ (1, _1404) (-1, _1405) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1404) (-1, _1405) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1373, _1405) (-1, _1406) 0 ]", "BLACKBOX::RANGE [(_1406, 32)] []", - "EXPR [ (1, _1406) (-1, _1407) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1406) (-1, _1407) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1373, _1407) (-1, _1408) 0 ]", "BLACKBOX::RANGE [(_1408, 32)] []", - "EXPR [ (1, _1408) (-1, _1409) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1408) (-1, _1409) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1373, _1409) (-1, _1410) 0 ]", "BLACKBOX::RANGE [(_1410, 32)] []", "EXPR [ (1, _1373, _1396) (1, _1382, _1397) (-1, _1411) 0 ]", @@ -2053,13 +2053,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1410) (-1, _1417) 0 ]", "EXPR [ (1, _1373, _1417) (-1, _1418) 0 ]", "BLACKBOX::RANGE [(_1418, 32)] []", - "EXPR [ (1, _1418) (-1, _1419) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1418) (-1, _1419) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1373, _1419) (-1, _1420) 0 ]", "BLACKBOX::RANGE [(_1420, 32)] []", - "EXPR [ (1, _1420) (-1, _1421) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1420) (-1, _1421) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1373, _1421) (-1, _1422) 0 ]", "BLACKBOX::RANGE [(_1422, 32)] []", - "EXPR [ (1, _1422) (-1, _1423) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1422) (-1, _1423) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1373, _1423) (-1, _1424) 0 ]", "BLACKBOX::RANGE [(_1424, 32)] []", "EXPR [ (1, _1373, _1410) (1, _1382, _1411) (-1, _1425) 0 ]", @@ -2072,22 +2072,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 24 })], outputs: [Simple(Witness(1431))]", "EXPR [ (-1, _0, _1431) (24, _1431) (1, _1432) -1 ]", "EXPR [ (-1, _0, _1432) (24, _1432) 0 ]", - "EXPR [ (1, _1373, _1424) (-1, _2422) 0 ]", - "EXPR [ (1, _1382, _1425) (-1, _2423) 0 ]", - "EXPR [ (-1, _1433) (1, _1994) (1, _2422) (1, _2423) 0 ]", + "EXPR [ (1, _1373, _1424) (-1, _2341) 0 ]", + "EXPR [ (1, _1382, _1425) (-1, _2342) 0 ]", + "EXPR [ (-1, _1433) (1, _1913) (1, _2341) (1, _2342) 0 ]", "EXPR [ (1, _1432, _1433) (-1, _1434) 0 ]", "BLACKBOX::RANGE [(_1434, 32)] []", - "EXPR [ (1, _1434) (-1, _1435) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1434) (-1, _1435) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1432, _1435) (-1, _1436) 0 ]", "BLACKBOX::RANGE [(_1436, 32)] []", - "EXPR [ (1, _1436) (-1, _1437) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1436) (-1, _1437) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1432, _1437) (-1, _1438) 0 ]", "BLACKBOX::RANGE [(_1438, 32)] []", - "EXPR [ (1, _1438) (-1, _1439) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1438) (-1, _1439) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1432, _1439) (-1, _1440) 0 ]", "BLACKBOX::RANGE [(_1440, 32)] []", "EXPR [ (-1, _1432) (-1, _1441) 1 ]", - "EXPR [ (-1, _1442) (1, _2422) (1, _2423) 0 ]", + "EXPR [ (-1, _1442) (1, _2341) (1, _2342) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1440))], q_c: -4864 })], outputs: [Simple(Witness(1443))]", "EXPR [ (1, _1440, _1443) (-4864, _1443) (1, _1444) -1 ]", "EXPR [ (1, _1440, _1444) (-4864, _1444) 0 ]", @@ -2097,13 +2097,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1440) (-1, _1448) 0 ]", "EXPR [ (1, _1432, _1448) (-1, _1449) 0 ]", "BLACKBOX::RANGE [(_1449, 32)] []", - "EXPR [ (1, _1449) (-1, _1450) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1449) (-1, _1450) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1432, _1450) (-1, _1451) 0 ]", "BLACKBOX::RANGE [(_1451, 32)] []", - "EXPR [ (1, _1451) (-1, _1452) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1451) (-1, _1452) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1432, _1452) (-1, _1453) 0 ]", "BLACKBOX::RANGE [(_1453, 32)] []", - "EXPR [ (1, _1453) (-1, _1454) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1453) (-1, _1454) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1432, _1454) (-1, _1455) 0 ]", "BLACKBOX::RANGE [(_1455, 32)] []", "EXPR [ (1, _1432, _1440) (1, _1441, _1442) (-1, _1456) 0 ]", @@ -2116,13 +2116,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1455) (-1, _1462) 0 ]", "EXPR [ (1, _1432, _1462) (-1, _1463) 0 ]", "BLACKBOX::RANGE [(_1463, 32)] []", - "EXPR [ (1, _1463) (-1, _1464) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1463) (-1, _1464) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1432, _1464) (-1, _1465) 0 ]", "BLACKBOX::RANGE [(_1465, 32)] []", - "EXPR [ (1, _1465) (-1, _1466) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1465) (-1, _1466) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1432, _1466) (-1, _1467) 0 ]", "BLACKBOX::RANGE [(_1467, 32)] []", - "EXPR [ (1, _1467) (-1, _1468) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1467) (-1, _1468) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1432, _1468) (-1, _1469) 0 ]", "BLACKBOX::RANGE [(_1469, 32)] []", "EXPR [ (1, _1432, _1455) (1, _1441, _1456) (-1, _1470) 0 ]", @@ -2135,13 +2135,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1469) (-1, _1476) 0 ]", "EXPR [ (1, _1432, _1476) (-1, _1477) 0 ]", "BLACKBOX::RANGE [(_1477, 32)] []", - "EXPR [ (1, _1477) (-1, _1478) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1477) (-1, _1478) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1432, _1478) (-1, _1479) 0 ]", "BLACKBOX::RANGE [(_1479, 32)] []", - "EXPR [ (1, _1479) (-1, _1480) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1479) (-1, _1480) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1432, _1480) (-1, _1481) 0 ]", "BLACKBOX::RANGE [(_1481, 32)] []", - "EXPR [ (1, _1481) (-1, _1482) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1481) (-1, _1482) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1432, _1482) (-1, _1483) 0 ]", "BLACKBOX::RANGE [(_1483, 32)] []", "EXPR [ (1, _1432, _1469) (1, _1441, _1470) (-1, _1484) 0 ]", @@ -2154,22 +2154,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 25 })], outputs: [Simple(Witness(1490))]", "EXPR [ (-1, _0, _1490) (25, _1490) (1, _1491) -1 ]", "EXPR [ (-1, _0, _1491) (25, _1491) 0 ]", - "EXPR [ (1, _1432, _1483) (-1, _2438) 0 ]", - "EXPR [ (1, _1441, _1484) (-1, _2439) 0 ]", - "EXPR [ (-1, _1492) (1, _1994) (1, _2438) (1, _2439) 0 ]", + "EXPR [ (1, _1432, _1483) (-1, _2357) 0 ]", + "EXPR [ (1, _1441, _1484) (-1, _2358) 0 ]", + "EXPR [ (-1, _1492) (1, _1913) (1, _2357) (1, _2358) 0 ]", "EXPR [ (1, _1491, _1492) (-1, _1493) 0 ]", "BLACKBOX::RANGE [(_1493, 32)] []", - "EXPR [ (1, _1493) (-1, _1494) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1493) (-1, _1494) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1491, _1494) (-1, _1495) 0 ]", "BLACKBOX::RANGE [(_1495, 32)] []", - "EXPR [ (1, _1495) (-1, _1496) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1495) (-1, _1496) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1491, _1496) (-1, _1497) 0 ]", "BLACKBOX::RANGE [(_1497, 32)] []", - "EXPR [ (1, _1497) (-1, _1498) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1497) (-1, _1498) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1491, _1498) (-1, _1499) 0 ]", "BLACKBOX::RANGE [(_1499, 32)] []", "EXPR [ (-1, _1491) (-1, _1500) 1 ]", - "EXPR [ (-1, _1501) (1, _2438) (1, _2439) 0 ]", + "EXPR [ (-1, _1501) (1, _2357) (1, _2358) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1499))], q_c: -4864 })], outputs: [Simple(Witness(1502))]", "EXPR [ (1, _1499, _1502) (-4864, _1502) (1, _1503) -1 ]", "EXPR [ (1, _1499, _1503) (-4864, _1503) 0 ]", @@ -2179,13 +2179,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1499) (-1, _1507) 0 ]", "EXPR [ (1, _1491, _1507) (-1, _1508) 0 ]", "BLACKBOX::RANGE [(_1508, 32)] []", - "EXPR [ (1, _1508) (-1, _1509) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1508) (-1, _1509) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1491, _1509) (-1, _1510) 0 ]", "BLACKBOX::RANGE [(_1510, 32)] []", - "EXPR [ (1, _1510) (-1, _1511) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1510) (-1, _1511) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1491, _1511) (-1, _1512) 0 ]", "BLACKBOX::RANGE [(_1512, 32)] []", - "EXPR [ (1, _1512) (-1, _1513) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1512) (-1, _1513) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1491, _1513) (-1, _1514) 0 ]", "BLACKBOX::RANGE [(_1514, 32)] []", "EXPR [ (1, _1491, _1499) (1, _1500, _1501) (-1, _1515) 0 ]", @@ -2198,13 +2198,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1514) (-1, _1521) 0 ]", "EXPR [ (1, _1491, _1521) (-1, _1522) 0 ]", "BLACKBOX::RANGE [(_1522, 32)] []", - "EXPR [ (1, _1522) (-1, _1523) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1522) (-1, _1523) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1491, _1523) (-1, _1524) 0 ]", "BLACKBOX::RANGE [(_1524, 32)] []", - "EXPR [ (1, _1524) (-1, _1525) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1524) (-1, _1525) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1491, _1525) (-1, _1526) 0 ]", "BLACKBOX::RANGE [(_1526, 32)] []", - "EXPR [ (1, _1526) (-1, _1527) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1526) (-1, _1527) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1491, _1527) (-1, _1528) 0 ]", "BLACKBOX::RANGE [(_1528, 32)] []", "EXPR [ (1, _1491, _1514) (1, _1500, _1515) (-1, _1529) 0 ]", @@ -2217,13 +2217,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1528) (-1, _1535) 0 ]", "EXPR [ (1, _1491, _1535) (-1, _1536) 0 ]", "BLACKBOX::RANGE [(_1536, 32)] []", - "EXPR [ (1, _1536) (-1, _1537) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1536) (-1, _1537) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1491, _1537) (-1, _1538) 0 ]", "BLACKBOX::RANGE [(_1538, 32)] []", - "EXPR [ (1, _1538) (-1, _1539) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1538) (-1, _1539) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1491, _1539) (-1, _1540) 0 ]", "BLACKBOX::RANGE [(_1540, 32)] []", - "EXPR [ (1, _1540) (-1, _1541) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1540) (-1, _1541) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1491, _1541) (-1, _1542) 0 ]", "BLACKBOX::RANGE [(_1542, 32)] []", "EXPR [ (1, _1491, _1528) (1, _1500, _1529) (-1, _1543) 0 ]", @@ -2236,22 +2236,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 26 })], outputs: [Simple(Witness(1549))]", "EXPR [ (-1, _0, _1549) (26, _1549) (1, _1550) -1 ]", "EXPR [ (-1, _0, _1550) (26, _1550) 0 ]", - "EXPR [ (1, _1491, _1542) (-1, _2454) 0 ]", - "EXPR [ (1, _1500, _1543) (-1, _2455) 0 ]", - "EXPR [ (-1, _1551) (1, _1994) (1, _2454) (1, _2455) 0 ]", + "EXPR [ (1, _1491, _1542) (-1, _2373) 0 ]", + "EXPR [ (1, _1500, _1543) (-1, _2374) 0 ]", + "EXPR [ (-1, _1551) (1, _1913) (1, _2373) (1, _2374) 0 ]", "EXPR [ (1, _1550, _1551) (-1, _1552) 0 ]", "BLACKBOX::RANGE [(_1552, 32)] []", - "EXPR [ (1, _1552) (-1, _1553) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1552) (-1, _1553) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1550, _1553) (-1, _1554) 0 ]", "BLACKBOX::RANGE [(_1554, 32)] []", - "EXPR [ (1, _1554) (-1, _1555) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1554) (-1, _1555) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1550, _1555) (-1, _1556) 0 ]", "BLACKBOX::RANGE [(_1556, 32)] []", - "EXPR [ (1, _1556) (-1, _1557) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1556) (-1, _1557) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1550, _1557) (-1, _1558) 0 ]", "BLACKBOX::RANGE [(_1558, 32)] []", "EXPR [ (-1, _1550) (-1, _1559) 1 ]", - "EXPR [ (-1, _1560) (1, _2454) (1, _2455) 0 ]", + "EXPR [ (-1, _1560) (1, _2373) (1, _2374) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1558))], q_c: -4864 })], outputs: [Simple(Witness(1561))]", "EXPR [ (1, _1558, _1561) (-4864, _1561) (1, _1562) -1 ]", "EXPR [ (1, _1558, _1562) (-4864, _1562) 0 ]", @@ -2261,13 +2261,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1558) (-1, _1566) 0 ]", "EXPR [ (1, _1550, _1566) (-1, _1567) 0 ]", "BLACKBOX::RANGE [(_1567, 32)] []", - "EXPR [ (1, _1567) (-1, _1568) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1567) (-1, _1568) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1550, _1568) (-1, _1569) 0 ]", "BLACKBOX::RANGE [(_1569, 32)] []", - "EXPR [ (1, _1569) (-1, _1570) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1569) (-1, _1570) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1550, _1570) (-1, _1571) 0 ]", "BLACKBOX::RANGE [(_1571, 32)] []", - "EXPR [ (1, _1571) (-1, _1572) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1571) (-1, _1572) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1550, _1572) (-1, _1573) 0 ]", "BLACKBOX::RANGE [(_1573, 32)] []", "EXPR [ (1, _1550, _1558) (1, _1559, _1560) (-1, _1574) 0 ]", @@ -2280,13 +2280,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1573) (-1, _1580) 0 ]", "EXPR [ (1, _1550, _1580) (-1, _1581) 0 ]", "BLACKBOX::RANGE [(_1581, 32)] []", - "EXPR [ (1, _1581) (-1, _1582) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1581) (-1, _1582) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1550, _1582) (-1, _1583) 0 ]", "BLACKBOX::RANGE [(_1583, 32)] []", - "EXPR [ (1, _1583) (-1, _1584) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1583) (-1, _1584) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1550, _1584) (-1, _1585) 0 ]", "BLACKBOX::RANGE [(_1585, 32)] []", - "EXPR [ (1, _1585) (-1, _1586) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1585) (-1, _1586) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1550, _1586) (-1, _1587) 0 ]", "BLACKBOX::RANGE [(_1587, 32)] []", "EXPR [ (1, _1550, _1573) (1, _1559, _1574) (-1, _1588) 0 ]", @@ -2299,13 +2299,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1587) (-1, _1594) 0 ]", "EXPR [ (1, _1550, _1594) (-1, _1595) 0 ]", "BLACKBOX::RANGE [(_1595, 32)] []", - "EXPR [ (1, _1595) (-1, _1596) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1595) (-1, _1596) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1550, _1596) (-1, _1597) 0 ]", "BLACKBOX::RANGE [(_1597, 32)] []", - "EXPR [ (1, _1597) (-1, _1598) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1597) (-1, _1598) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1550, _1598) (-1, _1599) 0 ]", "BLACKBOX::RANGE [(_1599, 32)] []", - "EXPR [ (1, _1599) (-1, _1600) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1599) (-1, _1600) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1550, _1600) (-1, _1601) 0 ]", "BLACKBOX::RANGE [(_1601, 32)] []", "EXPR [ (1, _1550, _1587) (1, _1559, _1588) (-1, _1602) 0 ]", @@ -2318,22 +2318,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 27 })], outputs: [Simple(Witness(1608))]", "EXPR [ (-1, _0, _1608) (27, _1608) (1, _1609) -1 ]", "EXPR [ (-1, _0, _1609) (27, _1609) 0 ]", - "EXPR [ (1, _1550, _1601) (-1, _2470) 0 ]", - "EXPR [ (1, _1559, _1602) (-1, _2471) 0 ]", - "EXPR [ (-1, _1610) (1, _1994) (1, _2470) (1, _2471) 0 ]", + "EXPR [ (1, _1550, _1601) (-1, _2389) 0 ]", + "EXPR [ (1, _1559, _1602) (-1, _2390) 0 ]", + "EXPR [ (-1, _1610) (1, _1913) (1, _2389) (1, _2390) 0 ]", "EXPR [ (1, _1609, _1610) (-1, _1611) 0 ]", "BLACKBOX::RANGE [(_1611, 32)] []", - "EXPR [ (1, _1611) (-1, _1612) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1611) (-1, _1612) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1609, _1612) (-1, _1613) 0 ]", "BLACKBOX::RANGE [(_1613, 32)] []", - "EXPR [ (1, _1613) (-1, _1614) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1613) (-1, _1614) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1609, _1614) (-1, _1615) 0 ]", "BLACKBOX::RANGE [(_1615, 32)] []", - "EXPR [ (1, _1615) (-1, _1616) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1615) (-1, _1616) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1609, _1616) (-1, _1617) 0 ]", "BLACKBOX::RANGE [(_1617, 32)] []", "EXPR [ (-1, _1609) (-1, _1618) 1 ]", - "EXPR [ (-1, _1619) (1, _2470) (1, _2471) 0 ]", + "EXPR [ (-1, _1619) (1, _2389) (1, _2390) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1617))], q_c: -4864 })], outputs: [Simple(Witness(1620))]", "EXPR [ (1, _1617, _1620) (-4864, _1620) (1, _1621) -1 ]", "EXPR [ (1, _1617, _1621) (-4864, _1621) 0 ]", @@ -2343,13 +2343,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1617) (-1, _1625) 0 ]", "EXPR [ (1, _1609, _1625) (-1, _1626) 0 ]", "BLACKBOX::RANGE [(_1626, 32)] []", - "EXPR [ (1, _1626) (-1, _1627) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1626) (-1, _1627) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1609, _1627) (-1, _1628) 0 ]", "BLACKBOX::RANGE [(_1628, 32)] []", - "EXPR [ (1, _1628) (-1, _1629) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1628) (-1, _1629) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1609, _1629) (-1, _1630) 0 ]", "BLACKBOX::RANGE [(_1630, 32)] []", - "EXPR [ (1, _1630) (-1, _1631) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1630) (-1, _1631) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1609, _1631) (-1, _1632) 0 ]", "BLACKBOX::RANGE [(_1632, 32)] []", "EXPR [ (1, _1609, _1617) (1, _1618, _1619) (-1, _1633) 0 ]", @@ -2362,13 +2362,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1632) (-1, _1639) 0 ]", "EXPR [ (1, _1609, _1639) (-1, _1640) 0 ]", "BLACKBOX::RANGE [(_1640, 32)] []", - "EXPR [ (1, _1640) (-1, _1641) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1640) (-1, _1641) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1609, _1641) (-1, _1642) 0 ]", "BLACKBOX::RANGE [(_1642, 32)] []", - "EXPR [ (1, _1642) (-1, _1643) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1642) (-1, _1643) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1609, _1643) (-1, _1644) 0 ]", "BLACKBOX::RANGE [(_1644, 32)] []", - "EXPR [ (1, _1644) (-1, _1645) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1644) (-1, _1645) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1609, _1645) (-1, _1646) 0 ]", "BLACKBOX::RANGE [(_1646, 32)] []", "EXPR [ (1, _1609, _1632) (1, _1618, _1633) (-1, _1647) 0 ]", @@ -2381,13 +2381,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1646) (-1, _1653) 0 ]", "EXPR [ (1, _1609, _1653) (-1, _1654) 0 ]", "BLACKBOX::RANGE [(_1654, 32)] []", - "EXPR [ (1, _1654) (-1, _1655) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1654) (-1, _1655) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1609, _1655) (-1, _1656) 0 ]", "BLACKBOX::RANGE [(_1656, 32)] []", - "EXPR [ (1, _1656) (-1, _1657) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1656) (-1, _1657) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1609, _1657) (-1, _1658) 0 ]", "BLACKBOX::RANGE [(_1658, 32)] []", - "EXPR [ (1, _1658) (-1, _1659) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1658) (-1, _1659) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1609, _1659) (-1, _1660) 0 ]", "BLACKBOX::RANGE [(_1660, 32)] []", "EXPR [ (1, _1609, _1646) (1, _1618, _1647) (-1, _1661) 0 ]", @@ -2400,22 +2400,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 28 })], outputs: [Simple(Witness(1667))]", "EXPR [ (-1, _0, _1667) (28, _1667) (1, _1668) -1 ]", "EXPR [ (-1, _0, _1668) (28, _1668) 0 ]", - "EXPR [ (1, _1609, _1660) (-1, _2486) 0 ]", - "EXPR [ (1, _1618, _1661) (-1, _2487) 0 ]", - "EXPR [ (-1, _1669) (1, _1994) (1, _2486) (1, _2487) 0 ]", + "EXPR [ (1, _1609, _1660) (-1, _2405) 0 ]", + "EXPR [ (1, _1618, _1661) (-1, _2406) 0 ]", + "EXPR [ (-1, _1669) (1, _1913) (1, _2405) (1, _2406) 0 ]", "EXPR [ (1, _1668, _1669) (-1, _1670) 0 ]", "BLACKBOX::RANGE [(_1670, 32)] []", - "EXPR [ (1, _1670) (-1, _1671) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1670) (-1, _1671) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1668, _1671) (-1, _1672) 0 ]", "BLACKBOX::RANGE [(_1672, 32)] []", - "EXPR [ (1, _1672) (-1, _1673) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1672) (-1, _1673) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1668, _1673) (-1, _1674) 0 ]", "BLACKBOX::RANGE [(_1674, 32)] []", - "EXPR [ (1, _1674) (-1, _1675) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1674) (-1, _1675) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1668, _1675) (-1, _1676) 0 ]", "BLACKBOX::RANGE [(_1676, 32)] []", "EXPR [ (-1, _1668) (-1, _1677) 1 ]", - "EXPR [ (-1, _1678) (1, _2486) (1, _2487) 0 ]", + "EXPR [ (-1, _1678) (1, _2405) (1, _2406) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1676))], q_c: -4864 })], outputs: [Simple(Witness(1679))]", "EXPR [ (1, _1676, _1679) (-4864, _1679) (1, _1680) -1 ]", "EXPR [ (1, _1676, _1680) (-4864, _1680) 0 ]", @@ -2425,13 +2425,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1676) (-1, _1684) 0 ]", "EXPR [ (1, _1668, _1684) (-1, _1685) 0 ]", "BLACKBOX::RANGE [(_1685, 32)] []", - "EXPR [ (1, _1685) (-1, _1686) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1685) (-1, _1686) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1668, _1686) (-1, _1687) 0 ]", "BLACKBOX::RANGE [(_1687, 32)] []", - "EXPR [ (1, _1687) (-1, _1688) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1687) (-1, _1688) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1668, _1688) (-1, _1689) 0 ]", "BLACKBOX::RANGE [(_1689, 32)] []", - "EXPR [ (1, _1689) (-1, _1690) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1689) (-1, _1690) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1668, _1690) (-1, _1691) 0 ]", "BLACKBOX::RANGE [(_1691, 32)] []", "EXPR [ (1, _1668, _1676) (1, _1677, _1678) (-1, _1692) 0 ]", @@ -2444,13 +2444,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1691) (-1, _1698) 0 ]", "EXPR [ (1, _1668, _1698) (-1, _1699) 0 ]", "BLACKBOX::RANGE [(_1699, 32)] []", - "EXPR [ (1, _1699) (-1, _1700) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1699) (-1, _1700) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1668, _1700) (-1, _1701) 0 ]", "BLACKBOX::RANGE [(_1701, 32)] []", - "EXPR [ (1, _1701) (-1, _1702) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1701) (-1, _1702) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1668, _1702) (-1, _1703) 0 ]", "BLACKBOX::RANGE [(_1703, 32)] []", - "EXPR [ (1, _1703) (-1, _1704) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1703) (-1, _1704) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1668, _1704) (-1, _1705) 0 ]", "BLACKBOX::RANGE [(_1705, 32)] []", "EXPR [ (1, _1668, _1691) (1, _1677, _1692) (-1, _1706) 0 ]", @@ -2463,13 +2463,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1705) (-1, _1712) 0 ]", "EXPR [ (1, _1668, _1712) (-1, _1713) 0 ]", "BLACKBOX::RANGE [(_1713, 32)] []", - "EXPR [ (1, _1713) (-1, _1714) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1713) (-1, _1714) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1668, _1714) (-1, _1715) 0 ]", "BLACKBOX::RANGE [(_1715, 32)] []", - "EXPR [ (1, _1715) (-1, _1716) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1715) (-1, _1716) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1668, _1716) (-1, _1717) 0 ]", "BLACKBOX::RANGE [(_1717, 32)] []", - "EXPR [ (1, _1717) (-1, _1718) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1717) (-1, _1718) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1668, _1718) (-1, _1719) 0 ]", "BLACKBOX::RANGE [(_1719, 32)] []", "EXPR [ (1, _1668, _1705) (1, _1677, _1706) (-1, _1720) 0 ]", @@ -2482,22 +2482,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 29 })], outputs: [Simple(Witness(1726))]", "EXPR [ (-1, _0, _1726) (29, _1726) (1, _1727) -1 ]", "EXPR [ (-1, _0, _1727) (29, _1727) 0 ]", - "EXPR [ (1, _1668, _1719) (-1, _2502) 0 ]", - "EXPR [ (1, _1677, _1720) (-1, _2503) 0 ]", - "EXPR [ (-1, _1728) (1, _1994) (1, _2502) (1, _2503) 0 ]", + "EXPR [ (1, _1668, _1719) (-1, _2421) 0 ]", + "EXPR [ (1, _1677, _1720) (-1, _2422) 0 ]", + "EXPR [ (-1, _1728) (1, _1913) (1, _2421) (1, _2422) 0 ]", "EXPR [ (1, _1727, _1728) (-1, _1729) 0 ]", "BLACKBOX::RANGE [(_1729, 32)] []", - "EXPR [ (1, _1729) (-1, _1730) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1729) (-1, _1730) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1727, _1730) (-1, _1731) 0 ]", "BLACKBOX::RANGE [(_1731, 32)] []", - "EXPR [ (1, _1731) (-1, _1732) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1731) (-1, _1732) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1727, _1732) (-1, _1733) 0 ]", "BLACKBOX::RANGE [(_1733, 32)] []", - "EXPR [ (1, _1733) (-1, _1734) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1733) (-1, _1734) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1727, _1734) (-1, _1735) 0 ]", "BLACKBOX::RANGE [(_1735, 32)] []", "EXPR [ (-1, _1727) (-1, _1736) 1 ]", - "EXPR [ (-1, _1737) (1, _2502) (1, _2503) 0 ]", + "EXPR [ (-1, _1737) (1, _2421) (1, _2422) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1735))], q_c: -4864 })], outputs: [Simple(Witness(1738))]", "EXPR [ (1, _1735, _1738) (-4864, _1738) (1, _1739) -1 ]", "EXPR [ (1, _1735, _1739) (-4864, _1739) 0 ]", @@ -2507,13 +2507,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1735) (-1, _1743) 0 ]", "EXPR [ (1, _1727, _1743) (-1, _1744) 0 ]", "BLACKBOX::RANGE [(_1744, 32)] []", - "EXPR [ (1, _1744) (-1, _1745) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1744) (-1, _1745) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1727, _1745) (-1, _1746) 0 ]", "BLACKBOX::RANGE [(_1746, 32)] []", - "EXPR [ (1, _1746) (-1, _1747) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1746) (-1, _1747) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1727, _1747) (-1, _1748) 0 ]", "BLACKBOX::RANGE [(_1748, 32)] []", - "EXPR [ (1, _1748) (-1, _1749) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1748) (-1, _1749) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1727, _1749) (-1, _1750) 0 ]", "BLACKBOX::RANGE [(_1750, 32)] []", "EXPR [ (1, _1727, _1735) (1, _1736, _1737) (-1, _1751) 0 ]", @@ -2527,13 +2527,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1750) (-1, _1758) 0 ]", "EXPR [ (1, _1727, _1758) (-1, _1759) 0 ]", "BLACKBOX::RANGE [(_1759, 32)] []", - "EXPR [ (1, _1759) (-1, _1760) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1759) (-1, _1760) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1727, _1760) (-1, _1761) 0 ]", "BLACKBOX::RANGE [(_1761, 32)] []", - "EXPR [ (1, _1761) (-1, _1762) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1761) (-1, _1762) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1727, _1762) (-1, _1763) 0 ]", "BLACKBOX::RANGE [(_1763, 32)] []", - "EXPR [ (1, _1763) (-1, _1764) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1763) (-1, _1764) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1727, _1764) (-1, _1765) 0 ]", "BLACKBOX::RANGE [(_1765, 32)] []", "EXPR [ (1, _1727, _1750) (1, _1736, _1751) (-1, _1766) 0 ]", @@ -2545,295 +2545,180 @@ expression: artifact "EXPR [ (1, _1750, _1754) (1, _1755, _1756) (-1, _1771) 0 ]", "EXPR [ (32, _1727) (-1, _1772) 0 ]", "BLACKBOX::RANGE [(_1772, 5)] []", - "EXPR [ (1, _4, _43) (1, _1765) (-1, _1773) 0 ]", - "EXPR [ (1, _1727, _1773) (-1, _1774) 0 ]", - "BLACKBOX::RANGE [(_1774, 32)] []", - "EXPR [ (1, _1774) (-1, _1775) (1, _2026) (1, _2055) 0 ]", - "EXPR [ (1, _1727, _1775) (-1, _1776) 0 ]", - "BLACKBOX::RANGE [(_1776, 32)] []", - "EXPR [ (1, _1776) (-1, _1777) (1, _2056) (1, _2083) 0 ]", - "EXPR [ (1, _1727, _1777) (-1, _1778) 0 ]", - "BLACKBOX::RANGE [(_1778, 32)] []", - "EXPR [ (1, _1778) (-1, _1779) (1, _2084) (1, _2103) 0 ]", - "EXPR [ (1, _1727, _1779) (-1, _1780) 0 ]", - "BLACKBOX::RANGE [(_1780, 32)] []", - "EXPR [ (1, _1727, _1765) (1, _1736, _1766) (-1, _1781) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1780))], q_c: -4864 })], outputs: [Simple(Witness(1782))]", - "EXPR [ (1, _1780, _1782) (-4864, _1782) (1, _1783) -1 ]", - "EXPR [ (1, _1780, _1783) (-4864, _1783) 0 ]", - "EXPR [ (1, _1727, _1783) (-1, _1784) 0 ]", - "EXPR [ (-1, _1727, _1783) (-1, _1785) 1 ]", - "EXPR [ (1, _1765, _1769) (1, _1770, _1771) (-1, _1786) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 30 })], outputs: [Simple(Witness(1787))]", - "EXPR [ (-1, _0, _1787) (30, _1787) (1, _1788) -1 ]", - "EXPR [ (-1, _0, _1788) (30, _1788) 0 ]", - "EXPR [ (1, _1727, _1780) (-1, _2518) 0 ]", - "EXPR [ (1, _1736, _1781) (-1, _2519) 0 ]", - "EXPR [ (-1, _1789) (1, _1994) (1, _2518) (1, _2519) 0 ]", - "EXPR [ (1, _1788, _1789) (-1, _1790) 0 ]", - "BLACKBOX::RANGE [(_1790, 32)] []", - "EXPR [ (1, _1790) (-1, _1791) (1, _2026) (1, _2055) 0 ]", - "EXPR [ (1, _1788, _1791) (-1, _1792) 0 ]", - "BLACKBOX::RANGE [(_1792, 32)] []", - "EXPR [ (1, _1792) (-1, _1793) (1, _2056) (1, _2083) 0 ]", - "EXPR [ (1, _1788, _1793) (-1, _1794) 0 ]", - "BLACKBOX::RANGE [(_1794, 32)] []", - "EXPR [ (1, _1794) (-1, _1795) (1, _2084) (1, _2103) 0 ]", - "EXPR [ (1, _1788, _1795) (-1, _1796) 0 ]", - "BLACKBOX::RANGE [(_1796, 32)] []", - "EXPR [ (-1, _1788) (-1, _1797) 1 ]", - "EXPR [ (-1, _1798) (1, _2518) (1, _2519) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1796))], q_c: -4864 })], outputs: [Simple(Witness(1799))]", - "EXPR [ (1, _1796, _1799) (-4864, _1799) (1, _1800) -1 ]", - "EXPR [ (1, _1796, _1800) (-4864, _1800) 0 ]", - "EXPR [ (1, _1788, _1800) (-1, _1801) 0 ]", - "EXPR [ (-1, _1788, _1800) (-1, _1802) 1 ]", - "EXPR [ (1, _1780, _1784) (1, _1785, _1786) (-1, _1803) 0 ]", - "EXPR [ (1, _67, _1727) (1, _1736, _1757) (-1, _1804) 0 ]", - "EXPR [ (1, _4, _43) (1, _1796) (-1, _1805) 0 ]", - "EXPR [ (1, _1788, _1805) (-1, _1806) 0 ]", - "BLACKBOX::RANGE [(_1806, 32)] []", - "EXPR [ (1, _1806) (-1, _1807) (1, _2026) (1, _2055) 0 ]", - "EXPR [ (1, _1788, _1807) (-1, _1808) 0 ]", - "BLACKBOX::RANGE [(_1808, 32)] []", - "EXPR [ (1, _1808) (-1, _1809) (1, _2056) (1, _2083) 0 ]", - "EXPR [ (1, _1788, _1809) (-1, _1810) 0 ]", - "BLACKBOX::RANGE [(_1810, 32)] []", - "EXPR [ (1, _1810) (-1, _1811) (1, _2084) (1, _2103) 0 ]", - "EXPR [ (1, _1788, _1811) (-1, _1812) 0 ]", - "BLACKBOX::RANGE [(_1812, 32)] []", - "EXPR [ (1, _1788, _1796) (1, _1797, _1798) (-1, _1813) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1812))], q_c: -4864 })], outputs: [Simple(Witness(1814))]", - "EXPR [ (1, _1812, _1814) (-4864, _1814) (1, _1815) -1 ]", - "EXPR [ (1, _1812, _1815) (-4864, _1815) 0 ]", - "EXPR [ (1, _1788, _1815) (-1, _1816) 0 ]", - "EXPR [ (-1, _1788, _1815) (-1, _1817) 1 ]", - "EXPR [ (1, _1796, _1801) (1, _1802, _1803) (-1, _1818) 0 ]", - "EXPR [ (32, _1788) (-1, _1819) 0 ]", - "BLACKBOX::RANGE [(_1819, 5)] []", - "EXPR [ (1, _4, _43) (1, _1812) (-1, _1820) 0 ]", - "EXPR [ (1, _1788, _1820) (-1, _1821) 0 ]", + "EXPR [ (1, _1727, _1765) (1, _1736, _1766) (-1, _1773) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 30 })], outputs: [Simple(Witness(1774))]", + "EXPR [ (-1, _0, _1774) (30, _1774) (1, _1775) -1 ]", + "EXPR [ (-1, _0, _1775) (30, _1775) 0 ]", + "EXPR [ (1, _1736, _1773) (-1, _1776) (1, _1913) 0 ]", + "EXPR [ (1, _1775, _1776) (-1, _1777) 0 ]", + "BLACKBOX::RANGE [(_1777, 32)] []", + "EXPR [ (1, _1777) (-1, _1778) (1, _1945) (1, _1974) 0 ]", + "EXPR [ (1, _1775, _1778) (-1, _1779) 0 ]", + "BLACKBOX::RANGE [(_1779, 32)] []", + "EXPR [ (1, _1779) (-1, _1780) (1, _1975) (1, _2002) 0 ]", + "EXPR [ (1, _1775, _1780) (-1, _1781) 0 ]", + "BLACKBOX::RANGE [(_1781, 32)] []", + "EXPR [ (1, _1781) (-1, _1782) (1, _2003) (1, _2022) 0 ]", + "EXPR [ (1, _1775, _1782) (-1, _1783) 0 ]", + "BLACKBOX::RANGE [(_1783, 32)] []", + "EXPR [ (-1, _1775) (-1, _1784) 1 ]", + "EXPR [ (1, _1736, _1773) (-1, _1785) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1783))], q_c: -4864 })], outputs: [Simple(Witness(1786))]", + "EXPR [ (1, _1783, _1786) (-4864, _1786) (1, _1787) -1 ]", + "EXPR [ (1, _1783, _1787) (-4864, _1787) 0 ]", + "EXPR [ (1, _1775, _1787) (-1, _1788) 0 ]", + "EXPR [ (-1, _1775, _1787) (-1, _1789) 1 ]", + "EXPR [ (1, _1765, _1769) (1, _1770, _1771) (-1, _1790) 0 ]", + "EXPR [ (1, _67, _1727) (1, _1736, _1757) (-1, _1791) 0 ]", + "EXPR [ (1, _4, _43) (1, _1783) (-1, _1792) 0 ]", + "EXPR [ (1, _1775, _1792) (-1, _1793) 0 ]", + "BLACKBOX::RANGE [(_1793, 32)] []", + "EXPR [ (1, _1793) (-1, _1794) (1, _1945) (1, _1974) 0 ]", + "EXPR [ (1, _1775, _1794) (-1, _1795) 0 ]", + "BLACKBOX::RANGE [(_1795, 32)] []", + "EXPR [ (1, _1795) (-1, _1796) (1, _1975) (1, _2002) 0 ]", + "EXPR [ (1, _1775, _1796) (-1, _1797) 0 ]", + "BLACKBOX::RANGE [(_1797, 32)] []", + "EXPR [ (1, _1797) (-1, _1798) (1, _2003) (1, _2022) 0 ]", + "EXPR [ (1, _1775, _1798) (-1, _1799) 0 ]", + "BLACKBOX::RANGE [(_1799, 32)] []", + "EXPR [ (1, _1775, _1783) (1, _1784, _1785) (-1, _1800) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1799))], q_c: -4864 })], outputs: [Simple(Witness(1801))]", + "EXPR [ (1, _1799, _1801) (-4864, _1801) (1, _1802) -1 ]", + "EXPR [ (1, _1799, _1802) (-4864, _1802) 0 ]", + "EXPR [ (1, _1775, _1802) (-1, _1803) 0 ]", + "EXPR [ (-1, _1775, _1802) (-1, _1804) 1 ]", + "EXPR [ (1, _1783, _1788) (1, _1789, _1790) (-1, _1805) 0 ]", + "EXPR [ (32, _1775) (-1, _1806) 0 ]", + "BLACKBOX::RANGE [(_1806, 5)] []", + "EXPR [ (1, _1775, _1799) (1, _1784, _1800) (-1, _1807) 0 ]", + "EXPR [ (33, _1775) (-1, _1808) 0 ]", + "BLACKBOX::RANGE [(_1808, 5)] []", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 31 })], outputs: [Simple(Witness(1809))]", + "EXPR [ (-1, _0, _1809) (31, _1809) (1, _1810) -1 ]", + "EXPR [ (-1, _0, _1810) (31, _1810) 0 ]", + "EXPR [ (1, _1799, _1803) (1, _1804, _1805) (-1, _1811) 0 ]", + "EXPR [ (-1, _1810) (-1, _1812) 1 ]", + "EXPR [ (1, _57, _1775) (1, _1784, _1791) (-1, _1813) 0 ]", + "EXPR [ (1, _1784, _1807) (-1, _1814) (1, _1913) 0 ]", + "EXPR [ (1, _1810, _1814) (-1, _1815) 0 ]", + "BLACKBOX::RANGE [(_1815, 32)] []", + "EXPR [ (1, _1815) (-1, _1816) (1, _1945) (1, _1974) 0 ]", + "EXPR [ (1, _1810, _1816) (-1, _1817) 0 ]", + "BLACKBOX::RANGE [(_1817, 32)] []", + "EXPR [ (1, _1817) (-1, _1818) (1, _1975) (1, _2002) 0 ]", + "EXPR [ (1, _1810, _1818) (-1, _1819) 0 ]", + "BLACKBOX::RANGE [(_1819, 32)] []", + "EXPR [ (1, _1819) (-1, _1820) (1, _2003) (1, _2022) 0 ]", + "EXPR [ (1, _1810, _1820) (-1, _1821) 0 ]", "BLACKBOX::RANGE [(_1821, 32)] []", - "EXPR [ (1, _1821) (-1, _1822) (1, _2026) (1, _2055) 0 ]", - "EXPR [ (1, _1788, _1822) (-1, _1823) 0 ]", - "BLACKBOX::RANGE [(_1823, 32)] []", - "EXPR [ (1, _1823) (-1, _1824) (1, _2056) (1, _2083) 0 ]", - "EXPR [ (1, _1788, _1824) (-1, _1825) 0 ]", - "BLACKBOX::RANGE [(_1825, 32)] []", - "EXPR [ (1, _1825) (-1, _1826) (1, _2084) (1, _2103) 0 ]", - "EXPR [ (1, _1788, _1826) (-1, _1827) 0 ]", - "BLACKBOX::RANGE [(_1827, 32)] []", - "EXPR [ (1, _1788, _1812) (1, _1797, _1813) (-1, _1828) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1827))], q_c: -4864 })], outputs: [Simple(Witness(1829))]", - "EXPR [ (1, _1827, _1829) (-4864, _1829) (1, _1830) -1 ]", - "EXPR [ (1, _1827, _1830) (-4864, _1830) 0 ]", - "EXPR [ (1, _1788, _1830) (-1, _1831) 0 ]", - "EXPR [ (-1, _1788, _1830) (-1, _1832) 1 ]", - "EXPR [ (1, _1812, _1816) (1, _1817, _1818) (-1, _1833) 0 ]", - "EXPR [ (33, _1788) (-1, _1834) 0 ]", - "BLACKBOX::RANGE [(_1834, 5)] []", - "EXPR [ (1, _4, _43) (1, _1827) (-1, _1835) 0 ]", - "EXPR [ (1, _1788, _1835) (-1, _1836) 0 ]", - "BLACKBOX::RANGE [(_1836, 32)] []", - "EXPR [ (1, _1836) (-1, _1837) (1, _2026) (1, _2055) 0 ]", - "EXPR [ (1, _1788, _1837) (-1, _1838) 0 ]", - "BLACKBOX::RANGE [(_1838, 32)] []", - "EXPR [ (1, _1838) (-1, _1839) (1, _2056) (1, _2083) 0 ]", - "EXPR [ (1, _1788, _1839) (-1, _1840) 0 ]", - "BLACKBOX::RANGE [(_1840, 32)] []", - "EXPR [ (1, _1840) (-1, _1841) (1, _2084) (1, _2103) 0 ]", - "EXPR [ (1, _1788, _1841) (-1, _1842) 0 ]", - "BLACKBOX::RANGE [(_1842, 32)] []", - "EXPR [ (1, _1788, _1827) (1, _1797, _1828) (-1, _1843) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1842))], q_c: -4864 })], outputs: [Simple(Witness(1844))]", - "EXPR [ (1, _1842, _1844) (-4864, _1844) (1, _1845) -1 ]", - "EXPR [ (1, _1842, _1845) (-4864, _1845) 0 ]", - "EXPR [ (1, _1788, _1845) (-1, _1846) 0 ]", - "EXPR [ (-1, _1788, _1845) (-1, _1847) 1 ]", - "EXPR [ (1, _1827, _1831) (1, _1832, _1833) (-1, _1848) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 31 })], outputs: [Simple(Witness(1849))]", - "EXPR [ (-1, _0, _1849) (31, _1849) (1, _1850) -1 ]", - "EXPR [ (-1, _0, _1850) (31, _1850) 0 ]", - "EXPR [ (1, _1842, _1846) (1, _1847, _1848) (-1, _1851) 0 ]", - "EXPR [ (-1, _1850) (-1, _1852) 1 ]", - "EXPR [ (1, _57, _1788) (1, _1797, _1804) (-1, _1853) 0 ]", - "EXPR [ (1, _1788, _1842) (-1, _2540) 0 ]", - "EXPR [ (1, _1797, _1843) (-1, _2541) 0 ]", - "EXPR [ (-1, _1854) (1, _1994) (1, _2540) (1, _2541) 0 ]", - "EXPR [ (1, _1850, _1854) (-1, _1855) 0 ]", - "BLACKBOX::RANGE [(_1855, 32)] []", - "EXPR [ (1, _1855) (-1, _1856) (1, _2026) (1, _2055) 0 ]", - "EXPR [ (1, _1850, _1856) (-1, _1857) 0 ]", - "BLACKBOX::RANGE [(_1857, 32)] []", - "EXPR [ (1, _1857) (-1, _1858) (1, _2056) (1, _2083) 0 ]", - "EXPR [ (1, _1850, _1858) (-1, _1859) 0 ]", - "BLACKBOX::RANGE [(_1859, 32)] []", - "EXPR [ (1, _1859) (-1, _1860) (1, _2084) (1, _2103) 0 ]", - "EXPR [ (1, _1850, _1860) (-1, _1861) 0 ]", - "BLACKBOX::RANGE [(_1861, 32)] []", - "EXPR [ (-1, _1862) (1, _2540) (1, _2541) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1861))], q_c: -4864 })], outputs: [Simple(Witness(1863))]", - "EXPR [ (1, _1861, _1863) (-4864, _1863) (1, _1864) -1 ]", - "EXPR [ (1, _1861, _1864) (-4864, _1864) 0 ]", - "EXPR [ (1, _1850, _1864) (-1, _1865) 0 ]", - "EXPR [ (-1, _1850, _1864) (-1, _1866) 1 ]", - "EXPR [ (32, _1850) (-1, _1867) 0 ]", - "BLACKBOX::RANGE [(_1867, 5)] []", - "EXPR [ (1, _4, _43) (1, _1861) (-1, _1868) 0 ]", - "EXPR [ (1, _1850, _1868) (-1, _1869) 0 ]", + "EXPR [ (1, _1784, _1807) (-1, _1822) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1821))], q_c: -4864 })], outputs: [Simple(Witness(1823))]", + "EXPR [ (1, _1821, _1823) (-4864, _1823) (1, _1824) -1 ]", + "EXPR [ (1, _1821, _1824) (-4864, _1824) 0 ]", + "EXPR [ (1, _1810, _1824) (-1, _1825) 0 ]", + "EXPR [ (-1, _1810, _1824) (-1, _1826) 1 ]", + "EXPR [ (32, _1810) (-1, _1827) 0 ]", + "BLACKBOX::RANGE [(_1827, 5)] []", + "EXPR [ (1, _1810, _1821) (1, _1812, _1822) (-1, _1828) 0 ]", + "EXPR [ (33, _1810) (-1, _1829) 0 ]", + "BLACKBOX::RANGE [(_1829, 5)] []", + "EXPR [ (34, _1810) (-1, _1830) 0 ]", + "BLACKBOX::RANGE [(_1830, 5)] []", + "EXPR [ (1, _1810, _1811) (1, _1812, _1813) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(1, Witness(1812), Witness(1828))], linear_combinations: [], q_c: -13 })], outputs: [Simple(Witness(1831))]", + "EXPR [ (1, _1812, _1828) (-1, _1832) -13 ]", + "EXPR [ (1, _1831, _1832) -1 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 })], outputs: [Simple(Witness(1833))]", + "EXPR [ (1, _0, _1833) (1, _1834) -1 ]", + "EXPR [ (1, _0, _1834) 0 ]", + "EXPR [ (1, _0) 0 ]", + "EXPR [ (-1, _1834) 1 ]", + "EXPR [ (-1, _77, _1834) (1, _77) (3, _1834) (-1, _1835) 0 ]", + "EXPR [ (1, _1834, _1835) -3 ]", + "BLACKBOX::BLAKE3 [(_5, 8), (_6, 8), (_7, 8), (_8, 8), (_9, 8)] [_1836, _1837, _1838, _1839, _1840, _1841, _1842, _1843, _1844, _1845, _1846, _1847, _1848, _1849, _1850, _1851, _1852, _1853, _1854, _1855, _1856, _1857, _1858, _1859, _1860, _1861, _1862, _1863, _1864, _1865, _1866, _1867]", + "EXPR [ (1, _1834, _1836) (-1, _10) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(1, Witness(1834), Witness(67))], linear_combinations: [], q_c: 4294967293 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 4294967296 })], outputs: [Simple(Witness(1868)), Simple(Witness(1869))]", + "BLACKBOX::RANGE [(_1868, 1)] []", "BLACKBOX::RANGE [(_1869, 32)] []", - "EXPR [ (1, _1869) (-1, _1870) (1, _2026) (1, _2055) 0 ]", - "EXPR [ (1, _1850, _1870) (-1, _1871) 0 ]", - "BLACKBOX::RANGE [(_1871, 32)] []", - "EXPR [ (1, _1871) (-1, _1872) (1, _2056) (1, _2083) 0 ]", - "EXPR [ (1, _1850, _1872) (-1, _1873) 0 ]", + "EXPR [ (1, _67, _1834) (-4294967296, _1868) (-1, _1869) 4294967293 ]", + "EXPR [ (-1, _1868) (-1, _1870) 1 ]", + "EXPR [ (1, _67, _1834) (-1, _1871) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-1, Witness(1870), Witness(1871))], linear_combinations: [(1, Witness(57)), (-3, Witness(1868))], q_c: 4294967296 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 4294967296 })], outputs: [Simple(Witness(1872)), Simple(Witness(1873))]", + "BLACKBOX::RANGE [(_1872, 1)] []", "BLACKBOX::RANGE [(_1873, 32)] []", - "EXPR [ (1, _1873) (-1, _1874) (1, _2084) (1, _2103) 0 ]", - "EXPR [ (1, _1850, _1874) (-1, _1875) 0 ]", - "BLACKBOX::RANGE [(_1875, 32)] []", - "EXPR [ (1, _1850, _1861) (1, _1852, _1862) (-1, _1876) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1875))], q_c: -4864 })], outputs: [Simple(Witness(1877))]", - "EXPR [ (1, _1875, _1877) (-4864, _1877) (1, _1878) -1 ]", - "EXPR [ (1, _1875, _1878) (-4864, _1878) 0 ]", - "EXPR [ (1, _1850, _1878) (-1, _1879) 0 ]", - "EXPR [ (-1, _1850, _1878) (-1, _1880) 1 ]", - "EXPR [ (1, _1851, _1866) (1, _1861, _1865) (-1, _1881) 0 ]", - "EXPR [ (33, _1850) (-1, _1882) 0 ]", - "BLACKBOX::RANGE [(_1882, 5)] []", - "EXPR [ (1, _4, _43) (1, _1875) (-1, _1883) 0 ]", - "EXPR [ (1, _1850, _1883) (-1, _1884) 0 ]", - "BLACKBOX::RANGE [(_1884, 32)] []", - "EXPR [ (1, _1884) (-1, _1885) (1, _2026) (1, _2055) 0 ]", - "EXPR [ (1, _1850, _1885) (-1, _1886) 0 ]", + "EXPR [ (-1, _1870, _1871) (1, _57) (-3, _1868) (-4294967296, _1872) (-1, _1873) 4294967296 ]", + "EXPR [ (1, _1870, _1871) (3, _1868) (-1, _1874) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-1, Witness(1868), Witness(1871)), (1, Witness(1872), Witness(57)), (-1, Witness(1872), Witness(1874))], linear_combinations: [(-3, Witness(1870)), (1, Witness(1874))], q_c: 4294967296 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 4294967296 })], outputs: [Simple(Witness(1875)), Simple(Witness(1876))]", + "BLACKBOX::RANGE [(_1875, 1)] []", + "BLACKBOX::RANGE [(_1876, 32)] []", + "EXPR [ (1, _57, _1872) (-1, _2457) 0 ]", + "EXPR [ (-1, _1872, _1874) (-1, _2459) 0 ]", + "EXPR [ (-1, _1868, _1871) (-3, _1870) (1, _1874) (-4294967296, _1875) (-1, _1876) (1, _2457) (1, _2459) 4294967296 ]", + "EXPR [ (-1, _1875) (-1, _1877) 1 ]", + "EXPR [ (1, _1874) (-1, _1878) (1, _2457) (1, _2459) 0 ]", + "EXPR [ (1, _1868, _1871) (3, _1870) (-1, _1879) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(1, Witness(1825), Witness(1821)), (1, Witness(1826), Witness(1811)), (1, Witness(1872), Witness(57)), (-1, Witness(1872), Witness(1874))], linear_combinations: [(-1, Witness(57))], q_c: 4294967296 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 4294967296 })], outputs: [Simple(Witness(1880)), Simple(Witness(1881))]", + "BLACKBOX::RANGE [(_1880, 1)] []", + "BLACKBOX::RANGE [(_1881, 32)] []", + "EXPR [ (1, _1811, _1826) (-1, _2462) 0 ]", + "EXPR [ (1, _1821, _1825) (-1, _2463) 0 ]", + "EXPR [ (-1, _57) (-4294967296, _1880) (-1, _1881) (1, _2457) (1, _2459) (1, _2462) (1, _2463) 4294967296 ]", + "EXPR [ (-1, _1880) (-1, _1882) 1 ]", + "EXPR [ (-1, _1883) (1, _2462) (1, _2463) 0 ]", + "EXPR [ (1, _57) (-1, _1884) (-1, _2457) (-1, _2459) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-1, Witness(1875), Witness(1879)), (-1, Witness(1877), Witness(1878)), (1, Witness(1880), Witness(1883)), (1, Witness(1882), Witness(1884))], linear_combinations: [], q_c: 4294967296 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 4294967296 })], outputs: [Simple(Witness(1885)), Simple(Witness(1886))]", + "BLACKBOX::RANGE [(_1885, 1)] []", "BLACKBOX::RANGE [(_1886, 32)] []", - "EXPR [ (1, _1886) (-1, _1887) (1, _2056) (1, _2083) 0 ]", - "EXPR [ (1, _1850, _1887) (-1, _1888) 0 ]", - "BLACKBOX::RANGE [(_1888, 32)] []", - "EXPR [ (1, _1888) (-1, _1889) (1, _2084) (1, _2103) 0 ]", - "EXPR [ (1, _1850, _1889) (-1, _1890) 0 ]", - "BLACKBOX::RANGE [(_1890, 32)] []", - "EXPR [ (1, _1850, _1875) (1, _1852, _1876) (-1, _1891) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1890))], q_c: -4864 })], outputs: [Simple(Witness(1892))]", - "EXPR [ (1, _1890, _1892) (-4864, _1892) (1, _1893) -1 ]", - "EXPR [ (1, _1890, _1893) (-4864, _1893) 0 ]", - "EXPR [ (1, _1850, _1893) (-1, _1894) 0 ]", - "EXPR [ (-1, _1850, _1893) (-1, _1895) 1 ]", - "EXPR [ (1, _1875, _1879) (1, _1880, _1881) (-1, _1896) 0 ]", - "EXPR [ (34, _1850) (-1, _1897) 0 ]", - "BLACKBOX::RANGE [(_1897, 5)] []", - "EXPR [ (1, _4, _43) (1, _1890) (-1, _1898) 0 ]", - "EXPR [ (1, _1850, _1898) (-1, _1899) 0 ]", - "BLACKBOX::RANGE [(_1899, 32)] []", - "EXPR [ (1, _1899) (-1, _1900) (1, _2026) (1, _2055) 0 ]", - "EXPR [ (1, _1850, _1900) (-1, _1901) 0 ]", - "BLACKBOX::RANGE [(_1901, 32)] []", - "EXPR [ (1, _1901) (-1, _1902) (1, _2056) (1, _2083) 0 ]", - "EXPR [ (1, _1850, _1902) (-1, _1903) 0 ]", - "BLACKBOX::RANGE [(_1903, 32)] []", - "EXPR [ (1, _1903) (-1, _1904) (1, _2084) (1, _2103) 0 ]", - "EXPR [ (1, _1850, _1904) (-1, _1905) 0 ]", - "BLACKBOX::RANGE [(_1905, 32)] []", - "EXPR [ (1, _1850, _1890) (1, _1852, _1891) (-1, _1906) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1905))], q_c: -4864 })], outputs: [Simple(Witness(1907))]", - "EXPR [ (1, _1905, _1907) (-4864, _1907) (1, _1908) -1 ]", - "EXPR [ (1, _1905, _1908) (-4864, _1908) 0 ]", - "EXPR [ (1, _1850, _1908) (-1, _1909) 0 ]", - "EXPR [ (-1, _1850, _1908) (-1, _1910) 1 ]", - "EXPR [ (1, _1890, _1894) (1, _1895, _1896) (-1, _1911) 0 ]", - "EXPR [ (1, _1850, _1851) (1, _1852, _1853) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(1, Witness(1850), Witness(1905)), (1, Witness(1852), Witness(1906))], linear_combinations: [], q_c: -13 })], outputs: [Simple(Witness(1912))]", - "EXPR [ (1, _1850, _1905) (1, _1852, _1906) (-1, _1913) -13 ]", - "EXPR [ (1, _1912, _1913) -1 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 })], outputs: [Simple(Witness(1914))]", - "EXPR [ (1, _0, _1914) (1, _1915) -1 ]", - "EXPR [ (1, _0, _1915) 0 ]", - "EXPR [ (1, _0) 0 ]", - "EXPR [ (-1, _1915) 1 ]", - "EXPR [ (-1, _77, _1915) (1, _77) (3, _1915) (-1, _1916) 0 ]", - "EXPR [ (1, _1915, _1916) -3 ]", - "BLACKBOX::BLAKE3 [(_5, 8), (_6, 8), (_7, 8), (_8, 8), (_9, 8)] [_1917, _1918, _1919, _1920, _1921, _1922, _1923, _1924, _1925, _1926, _1927, _1928, _1929, _1930, _1931, _1932, _1933, _1934, _1935, _1936, _1937, _1938, _1939, _1940, _1941, _1942, _1943, _1944, _1945, _1946, _1947, _1948]", - "EXPR [ (1, _1915, _1917) (-1, _10) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(1, Witness(1915), Witness(67))], linear_combinations: [], q_c: 4294967293 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 4294967296 })], outputs: [Simple(Witness(1949)), Simple(Witness(1950))]", - "BLACKBOX::RANGE [(_1949, 1)] []", - "BLACKBOX::RANGE [(_1950, 32)] []", - "EXPR [ (1, _67, _1915) (-4294967296, _1949) (-1, _1950) 4294967293 ]", - "EXPR [ (-1, _1949) (-1, _1951) 1 ]", - "EXPR [ (1, _67, _1915) (-1, _1952) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-1, Witness(1951), Witness(1952))], linear_combinations: [(1, Witness(57)), (-3, Witness(1949))], q_c: 4294967296 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 4294967296 })], outputs: [Simple(Witness(1953)), Simple(Witness(1954))]", - "BLACKBOX::RANGE [(_1953, 1)] []", - "BLACKBOX::RANGE [(_1954, 32)] []", - "EXPR [ (-1, _1951, _1952) (1, _57) (-3, _1949) (-4294967296, _1953) (-1, _1954) 4294967296 ]", - "EXPR [ (1, _1951, _1952) (3, _1949) (-1, _1955) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-1, Witness(1949), Witness(1952)), (1, Witness(1953), Witness(57)), (-1, Witness(1953), Witness(1955))], linear_combinations: [(-3, Witness(1951)), (1, Witness(1955))], q_c: 4294967296 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 4294967296 })], outputs: [Simple(Witness(1956)), Simple(Witness(1957))]", - "BLACKBOX::RANGE [(_1956, 1)] []", - "BLACKBOX::RANGE [(_1957, 32)] []", - "EXPR [ (1, _57, _1953) (-1, _2560) 0 ]", - "EXPR [ (-1, _1953, _1955) (-1, _2562) 0 ]", - "EXPR [ (-1, _1949, _1952) (-3, _1951) (1, _1955) (-4294967296, _1956) (-1, _1957) (1, _2560) (1, _2562) 4294967296 ]", - "EXPR [ (-1, _1956) (-1, _1958) 1 ]", - "EXPR [ (1, _1955) (-1, _1959) (1, _2560) (1, _2562) 0 ]", - "EXPR [ (1, _1949, _1952) (3, _1951) (-1, _1960) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(1, Witness(1909), Witness(1905)), (1, Witness(1910), Witness(1911)), (1, Witness(1953), Witness(57)), (-1, Witness(1953), Witness(1955))], linear_combinations: [(-1, Witness(57))], q_c: 4294967296 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 4294967296 })], outputs: [Simple(Witness(1961)), Simple(Witness(1962))]", - "BLACKBOX::RANGE [(_1961, 1)] []", - "BLACKBOX::RANGE [(_1962, 32)] []", - "EXPR [ (1, _1905, _1909) (-1, _2565) 0 ]", - "EXPR [ (1, _1910, _1911) (-1, _2566) 0 ]", - "EXPR [ (-1, _57) (-4294967296, _1961) (-1, _1962) (1, _2560) (1, _2562) (1, _2565) (1, _2566) 4294967296 ]", - "EXPR [ (-1, _1961) (-1, _1963) 1 ]", - "EXPR [ (-1, _1964) (1, _2565) (1, _2566) 0 ]", - "EXPR [ (1, _57) (-1, _1965) (-1, _2560) (-1, _2562) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-1, Witness(1956), Witness(1960)), (-1, Witness(1958), Witness(1959)), (1, Witness(1961), Witness(1964)), (1, Witness(1963), Witness(1965))], linear_combinations: [], q_c: 4294967296 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 4294967296 })], outputs: [Simple(Witness(1966)), Simple(Witness(1967))]", - "BLACKBOX::RANGE [(_1966, 1)] []", - "BLACKBOX::RANGE [(_1967, 32)] []", - "EXPR [ (-1, _1956, _1960) (-1, _2569) 0 ]", - "EXPR [ (-1, _1958, _1959) (-1, _2570) 0 ]", - "EXPR [ (1, _1961, _1964) (-1, _2571) 0 ]", - "EXPR [ (1, _1963, _1965) (-1, _2572) 0 ]", - "EXPR [ (-4294967296, _1966) (-1, _1967) (1, _2569) (1, _2570) (1, _2571) (1, _2572) 4294967296 ]", - "EXPR [ (-1, _1966) (-1, _1968) 1 ]", - "EXPR [ (-1, _1969) (1, _2571) (1, _2572) 0 ]", - "EXPR [ (-1, _1970) (-1, _2569) (-1, _2570) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-1, Witness(1956), Witness(1959)), (-1, Witness(1958), Witness(1960)), (1, Witness(1966), Witness(1969)), (1, Witness(1968), Witness(1970))], linear_combinations: [], q_c: 4294967296 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 4294967296 })], outputs: [Simple(Witness(1971)), Simple(Witness(1972))]", - "BLACKBOX::RANGE [(_1971, 1)] []", - "BLACKBOX::RANGE [(_1972, 32)] []", - "EXPR [ (-1, _1956, _1959) (-1, _2574) 0 ]", - "EXPR [ (-1, _1958, _1960) (-1, _2575) 0 ]", - "EXPR [ (1, _1966, _1969) (-1, _2576) 0 ]", - "EXPR [ (1, _1968, _1970) (-1, _2577) 0 ]", - "EXPR [ (-4294967296, _1971) (-1, _1972) (1, _2574) (1, _2575) (1, _2576) (1, _2577) 4294967296 ]", - "EXPR [ (-1, _1971) (-1, _1973) 1 ]", - "EXPR [ (-1, _1974) (1, _2576) (1, _2577) 0 ]", - "EXPR [ (-1, _1975) (-1, _2574) (-1, _2575) 0 ]", - "EXPR [ (1, _1961, _1965) (1, _1963, _1964) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(12, Witness(1915))], q_c: 0 })], outputs: [Simple(Witness(1976))]", - "EXPR [ (12, _1915, _1976) (1, _1977) -1 ]", - "EXPR [ (12, _1915, _1977) 0 ]", - "EXPR [ (-1, _1977) (-1, _1978) 1 ]", - "EXPR [ (2, _1915, _1915) (-1, _1979) 0 ]", - "EXPR [ (1, _1978, _1979) (3, _1977) -2 ]", - "EXPR [ (1, _1966, _1970) (1, _1968, _1969) (-1, _1980) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1980))], q_c: 0 })], outputs: [Simple(Witness(1981))]", - "EXPR [ (1, _1980, _1981) (1, _1982) -1 ]", - "EXPR [ (1, _1980, _1982) 0 ]", - "EXPR [ (1, _1971, _1975) (1, _1973, _1974) (-1, _1983) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1983))], q_c: 0 })], outputs: [Simple(Witness(1984))]", - "EXPR [ (1, _1983, _1984) (1, _1985) -1 ]", - "EXPR [ (1, _1983, _1985) 0 ]", - "EXPR [ (-1, _1985) (-1, _1986) 1 ]", - "EXPR [ (-2, _1977, _1982) (2, _1977) (3, _1982) (-1, _1987) 0 ]", - "EXPR [ (1, _1971, _1974) (1, _1973, _1975) (-1, _1988) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1988))], q_c: 0 })], outputs: [Simple(Witness(1989))]", - "EXPR [ (1, _1988, _1989) (1, _1990) -1 ]", - "EXPR [ (1, _1988, _1990) 0 ]", - "EXPR [ (-1, _1990) (-1, _1991) 1 ]", - "EXPR [ (1, _1986, _1987) (4, _1985) (-1, _1992) 0 ]", - "EXPR [ (1, _1991, _1992) (5, _1990) 0 ]", + "EXPR [ (-1, _1875, _1879) (-1, _2466) 0 ]", + "EXPR [ (-1, _1877, _1878) (-1, _2467) 0 ]", + "EXPR [ (1, _1880, _1883) (-1, _2468) 0 ]", + "EXPR [ (1, _1882, _1884) (-1, _2469) 0 ]", + "EXPR [ (-4294967296, _1885) (-1, _1886) (1, _2466) (1, _2467) (1, _2468) (1, _2469) 4294967296 ]", + "EXPR [ (-1, _1885) (-1, _1887) 1 ]", + "EXPR [ (-1, _1888) (1, _2468) (1, _2469) 0 ]", + "EXPR [ (-1, _1889) (-1, _2466) (-1, _2467) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-1, Witness(1875), Witness(1878)), (-1, Witness(1877), Witness(1879)), (1, Witness(1885), Witness(1888)), (1, Witness(1887), Witness(1889))], linear_combinations: [], q_c: 4294967296 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 4294967296 })], outputs: [Simple(Witness(1890)), Simple(Witness(1891))]", + "BLACKBOX::RANGE [(_1890, 1)] []", + "BLACKBOX::RANGE [(_1891, 32)] []", + "EXPR [ (-1, _1875, _1878) (-1, _2471) 0 ]", + "EXPR [ (-1, _1877, _1879) (-1, _2472) 0 ]", + "EXPR [ (1, _1885, _1888) (-1, _2473) 0 ]", + "EXPR [ (1, _1887, _1889) (-1, _2474) 0 ]", + "EXPR [ (-4294967296, _1890) (-1, _1891) (1, _2471) (1, _2472) (1, _2473) (1, _2474) 4294967296 ]", + "EXPR [ (-1, _1890) (-1, _1892) 1 ]", + "EXPR [ (-1, _1893) (1, _2473) (1, _2474) 0 ]", + "EXPR [ (-1, _1894) (-1, _2471) (-1, _2472) 0 ]", + "EXPR [ (1, _1880, _1884) (1, _1882, _1883) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(12, Witness(1834))], q_c: 0 })], outputs: [Simple(Witness(1895))]", + "EXPR [ (12, _1834, _1895) (1, _1896) -1 ]", + "EXPR [ (12, _1834, _1896) 0 ]", + "EXPR [ (-1, _1896) (-1, _1897) 1 ]", + "EXPR [ (2, _1834, _1834) (-1, _1898) 0 ]", + "EXPR [ (1, _1897, _1898) (3, _1896) -2 ]", + "EXPR [ (1, _1885, _1889) (1, _1887, _1888) (-1, _1899) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1899))], q_c: 0 })], outputs: [Simple(Witness(1900))]", + "EXPR [ (1, _1899, _1900) (1, _1901) -1 ]", + "EXPR [ (1, _1899, _1901) 0 ]", + "EXPR [ (1, _1890, _1894) (1, _1892, _1893) (-1, _1902) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1902))], q_c: 0 })], outputs: [Simple(Witness(1903))]", + "EXPR [ (1, _1902, _1903) (1, _1904) -1 ]", + "EXPR [ (1, _1902, _1904) 0 ]", + "EXPR [ (-1, _1904) (-1, _1905) 1 ]", + "EXPR [ (-2, _1896, _1901) (2, _1896) (3, _1901) (-1, _1906) 0 ]", + "EXPR [ (1, _1890, _1893) (1, _1892, _1894) (-1, _1907) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1907))], q_c: 0 })], outputs: [Simple(Witness(1908))]", + "EXPR [ (1, _1907, _1908) (1, _1909) -1 ]", + "EXPR [ (1, _1907, _1909) 0 ]", + "EXPR [ (-1, _1909) (-1, _1910) 1 ]", + "EXPR [ (1, _1905, _1906) (4, _1904) (-1, _1911) 0 ]", + "EXPR [ (1, _1910, _1911) (5, _1909) 0 ]", "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) } }]", "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\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 type H = H;\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 u8 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 u16 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 u32 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 u64 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", 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 328a2e85ff7..c52417fad1f 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 @@ -70,7 +70,7 @@ expression: artifact }, "bytecode": [ "func 0", - "current witness index : _2577", + "current witness index : _2474", "private parameters indices : [_0, _1, _2, _3, _4, _5, _6, _7, _8, _9]", "public parameters indices : [_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41]", "return value indices : []", @@ -119,9 +119,9 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 0 })], outputs: [Simple(Witness(42))]", "EXPR [ (-1, _0, _42) (1, _43) -1 ]", "EXPR [ (-1, _0, _43) 0 ]", - "EXPR [ (1, _0, _43) (-1, _1993) 0 ]", - "EXPR [ (1, _4, _43) (-1, _1994) 0 ]", - "EXPR [ (-1, _44) (1, _1993) (1, _1994) 0 ]", + "EXPR [ (1, _0, _43) (-1, _1912) 0 ]", + "EXPR [ (1, _4, _43) (-1, _1913) 0 ]", + "EXPR [ (-1, _44) (1, _1912) (1, _1913) 0 ]", "BLACKBOX::RANGE [(_44, 32)] []", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(44))], q_c: -4864 })], outputs: [Simple(Witness(45))]", "EXPR [ (1, _44, _45) (-4864, _45) (1, _46) -1 ]", @@ -130,8 +130,8 @@ expression: artifact "MEM (id: 0, read at: EXPR [ (1, _47) 0 ], value: EXPR [ (1, _48) 0 ]) ", "EXPR [ (1, _43, _46) (-1, _49) 0 ]", "INIT (id: 3, len: 4, witnesses: [_1, _2, _3, _4])", - "EXPR [ (1, _44, _49) (-1, _1995) 0 ]", - "EXPR [ (-1, _48, _49) (1, _48) (-1, _50) (1, _1995) 0 ]", + "EXPR [ (1, _44, _49) (-1, _1914) 0 ]", + "EXPR [ (-1, _48, _49) (1, _48) (-1, _50) (1, _1914) 0 ]", "MEM (id: 3, write EXPR [ (1, _50) 0 ] at: EXPR [ (1, _47) 0 ]) ", "EXPR [ (-1, _51) 0 ]", "MEM (id: 3, read at: EXPR [ (1, _51) 0 ], value: EXPR [ (1, _52) 0 ]) ", @@ -140,30 +140,30 @@ expression: artifact "EXPR [ (-1, _55) 2 ]", "MEM (id: 3, read at: EXPR [ (1, _55) 0 ], value: EXPR [ (1, _56) 0 ]) ", "EXPR [ (-1, _3, _49) (1, _49, _56) (1, _3) (-1, _57) 0 ]", - "EXPR [ (1, _43, _44) (-1, _1999) 0 ]", - "EXPR [ (-1, _58) (1, _1994) (1, _1999) 0 ]", + "EXPR [ (1, _43, _44) (-1, _1918) 0 ]", + "EXPR [ (-1, _58) (1, _1913) (1, _1918) 0 ]", "BLACKBOX::RANGE [(_58, 32)] []", - "EXPR [ (1, _43, _57) (-1, _2000) 0 ]", - "EXPR [ (1, _43, _58) (-1, _59) (1, _2000) 0 ]", + "EXPR [ (1, _43, _57) (-1, _1919) 0 ]", + "EXPR [ (1, _43, _58) (-1, _59) (1, _1919) 0 ]", "BLACKBOX::RANGE [(_59, 32)] []", "EXPR [ (-1, _43) (-1, _60) 1 ]", - "EXPR [ (1, _0) (-1, _61) (-1, _1993) (1, _1999) 0 ]", + "EXPR [ (1, _0) (-1, _61) (-1, _1912) (1, _1918) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(59))], q_c: -4864 })], outputs: [Simple(Witness(62))]", "EXPR [ (1, _59, _62) (-4864, _62) (1, _63) -1 ]", "EXPR [ (1, _59, _63) (-4864, _63) 0 ]", "EXPR [ (1, _43, _63) (-1, _64) 0 ]", "EXPR [ (-1, _43, _63) (-1, _65) 1 ]", - "EXPR [ (-1, _4, _49) (1, _4) (-1, _66) (1, _1995) 0 ]", + "EXPR [ (-1, _4, _49) (1, _4) (-1, _66) (1, _1914) 0 ]", "EXPR [ (-1, _2, _49) (1, _49, _54) (1, _2) (-1, _67) 0 ]", - "EXPR [ (1, _43, _59) (-1, _2005) 0 ]", - "EXPR [ (-1, _68) (1, _1994) (1, _2005) 0 ]", + "EXPR [ (1, _43, _59) (-1, _1924) 0 ]", + "EXPR [ (-1, _68) (1, _1913) (1, _1924) 0 ]", "BLACKBOX::RANGE [(_68, 32)] []", - "EXPR [ (1, _43, _68) (-1, _69) (1, _2000) 0 ]", + "EXPR [ (1, _43, _68) (-1, _69) (1, _1919) 0 ]", "BLACKBOX::RANGE [(_69, 32)] []", - "EXPR [ (1, _43, _67) (-1, _2007) 0 ]", - "EXPR [ (1, _43, _69) (-1, _70) (1, _2007) 0 ]", + "EXPR [ (1, _43, _67) (-1, _1926) 0 ]", + "EXPR [ (1, _43, _69) (-1, _70) (1, _1926) 0 ]", "BLACKBOX::RANGE [(_70, 32)] []", - "EXPR [ (1, _60, _61) (-1, _71) (1, _2005) 0 ]", + "EXPR [ (1, _60, _61) (-1, _71) (1, _1924) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(70))], q_c: -4864 })], outputs: [Simple(Witness(72))]", "EXPR [ (1, _70, _72) (-4864, _72) (1, _73) -1 ]", "EXPR [ (1, _70, _73) (-4864, _73) 0 ]", @@ -171,16 +171,16 @@ expression: artifact "EXPR [ (-1, _43, _73) (-1, _75) 1 ]", "EXPR [ (1, _59, _64) (1, _65, _66) (-1, _76) 0 ]", "EXPR [ (-1, _1, _49) (1, _49, _52) (1, _1) (-1, _77) 0 ]", - "EXPR [ (1, _43, _70) (-1, _2014) 0 ]", - "EXPR [ (-1, _78) (1, _1994) (1, _2014) 0 ]", + "EXPR [ (1, _43, _70) (-1, _1933) 0 ]", + "EXPR [ (-1, _78) (1, _1913) (1, _1933) 0 ]", "BLACKBOX::RANGE [(_78, 32)] []", - "EXPR [ (1, _43, _78) (-1, _79) (1, _2000) 0 ]", + "EXPR [ (1, _43, _78) (-1, _79) (1, _1919) 0 ]", "BLACKBOX::RANGE [(_79, 32)] []", - "EXPR [ (1, _43, _79) (-1, _80) (1, _2007) 0 ]", + "EXPR [ (1, _43, _79) (-1, _80) (1, _1926) 0 ]", "BLACKBOX::RANGE [(_80, 32)] []", "EXPR [ (1, _43, _77) (1, _43, _80) (-1, _81) 0 ]", "BLACKBOX::RANGE [(_81, 32)] []", - "EXPR [ (1, _60, _71) (-1, _82) (1, _2014) 0 ]", + "EXPR [ (1, _60, _71) (-1, _82) (1, _1933) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(81))], q_c: -4864 })], outputs: [Simple(Witness(83))]", "EXPR [ (1, _81, _83) (-4864, _83) (1, _84) -1 ]", "EXPR [ (1, _81, _84) (-4864, _84) 0 ]", @@ -193,13 +193,13 @@ expression: artifact "EXPR [ (1, _81, _85) (1, _86, _87) (-1, _90) 0 ]", "EXPR [ (-1, _89) (-1, _91) 1 ]", "EXPR [ (1, _43, _57) (-1, _92) 0 ]", - "EXPR [ (1, _43, _81) (-1, _2024) 0 ]", - "EXPR [ (1, _60, _82) (-1, _2025) 0 ]", - "EXPR [ (-1, _93) (1, _1994) (1, _2024) (1, _2025) 0 ]", + "EXPR [ (1, _43, _81) (-1, _1943) 0 ]", + "EXPR [ (1, _60, _82) (-1, _1944) 0 ]", + "EXPR [ (-1, _93) (1, _1913) (1, _1943) (1, _1944) 0 ]", "EXPR [ (1, _89, _93) (-1, _94) 0 ]", "BLACKBOX::RANGE [(_94, 32)] []", - "EXPR [ (1, _89, _90) (-1, _2026) 0 ]", - "EXPR [ (1, _89, _94) (-1, _95) (1, _2026) 0 ]", + "EXPR [ (1, _89, _90) (-1, _1945) 0 ]", + "EXPR [ (1, _89, _94) (-1, _95) (1, _1945) 0 ]", "BLACKBOX::RANGE [(_95, 32)] []", "EXPR [ (1, _43, _67) (1, _95) (-1, _96) 0 ]", "EXPR [ (1, _89, _96) (-1, _97) 0 ]", @@ -207,7 +207,7 @@ expression: artifact "EXPR [ (1, _43, _77) (1, _97) (-1, _98) 0 ]", "EXPR [ (1, _89, _98) (-1, _99) 0 ]", "BLACKBOX::RANGE [(_99, 32)] []", - "EXPR [ (-1, _100) (1, _2024) (1, _2025) 0 ]", + "EXPR [ (-1, _100) (1, _1943) (1, _1944) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(99))], q_c: -4864 })], outputs: [Simple(Witness(101))]", "EXPR [ (1, _99, _101) (-4864, _101) (1, _102) -1 ]", "EXPR [ (1, _99, _102) (-4864, _102) 0 ]", @@ -217,10 +217,10 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _99) (-1, _106) 0 ]", "EXPR [ (1, _89, _106) (-1, _107) 0 ]", "BLACKBOX::RANGE [(_107, 32)] []", - "EXPR [ (1, _89, _107) (-1, _108) (1, _2026) 0 ]", + "EXPR [ (1, _89, _107) (-1, _108) (1, _1945) 0 ]", "BLACKBOX::RANGE [(_108, 32)] []", - "EXPR [ (1, _57, _89) (-1, _2029) 0 ]", - "EXPR [ (1, _89, _108) (-1, _109) (1, _2029) 0 ]", + "EXPR [ (1, _57, _89) (-1, _1948) 0 ]", + "EXPR [ (1, _89, _108) (-1, _109) (1, _1948) 0 ]", "BLACKBOX::RANGE [(_109, 32)] []", "EXPR [ (1, _43, _77) (1, _109) (-1, _110) 0 ]", "EXPR [ (1, _89, _110) (-1, _111) 0 ]", @@ -236,12 +236,12 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _111) (-1, _119) 0 ]", "EXPR [ (1, _89, _119) (-1, _120) 0 ]", "BLACKBOX::RANGE [(_120, 32)] []", - "EXPR [ (1, _89, _120) (-1, _121) (1, _2026) 0 ]", + "EXPR [ (1, _89, _120) (-1, _121) (1, _1945) 0 ]", "BLACKBOX::RANGE [(_121, 32)] []", - "EXPR [ (1, _89, _121) (-1, _122) (1, _2029) 0 ]", + "EXPR [ (1, _89, _121) (-1, _122) (1, _1948) 0 ]", "BLACKBOX::RANGE [(_122, 32)] []", - "EXPR [ (1, _67, _89) (-1, _2037) 0 ]", - "EXPR [ (1, _89, _122) (-1, _123) (1, _2037) 0 ]", + "EXPR [ (1, _67, _89) (-1, _1956) 0 ]", + "EXPR [ (1, _89, _122) (-1, _123) (1, _1956) 0 ]", "BLACKBOX::RANGE [(_123, 32)] []", "EXPR [ (1, _89, _111) (1, _91, _112) (-1, _124) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(123))], q_c: -4864 })], outputs: [Simple(Witness(125))]", @@ -253,11 +253,11 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _123) (-1, _130) 0 ]", "EXPR [ (1, _89, _130) (-1, _131) 0 ]", "BLACKBOX::RANGE [(_131, 32)] []", - "EXPR [ (1, _89, _131) (-1, _132) (1, _2026) 0 ]", + "EXPR [ (1, _89, _131) (-1, _132) (1, _1945) 0 ]", "BLACKBOX::RANGE [(_132, 32)] []", - "EXPR [ (1, _89, _132) (-1, _133) (1, _2029) 0 ]", + "EXPR [ (1, _89, _132) (-1, _133) (1, _1948) 0 ]", "BLACKBOX::RANGE [(_133, 32)] []", - "EXPR [ (1, _89, _133) (-1, _134) (1, _2037) 0 ]", + "EXPR [ (1, _89, _133) (-1, _134) (1, _1956) 0 ]", "BLACKBOX::RANGE [(_134, 32)] []", "EXPR [ (1, _89, _123) (1, _91, _124) (-1, _135) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(134))], q_c: -4864 })], outputs: [Simple(Witness(136))]", @@ -271,40 +271,40 @@ expression: artifact "EXPR [ (-1, _0, _142) (2, _142) 0 ]", "EXPR [ (1, _134, _138) (1, _139, _140) (-1, _143) 0 ]", "EXPR [ (-1, _142) (-1, _144) 1 ]", - "EXPR [ (1, _91, _105) (-1, _145) (1, _2029) 0 ]", - "EXPR [ (1, _89, _134) (-1, _2053) 0 ]", - "EXPR [ (1, _91, _135) (-1, _2054) 0 ]", - "EXPR [ (-1, _146) (1, _1994) (1, _2053) (1, _2054) 0 ]", + "EXPR [ (1, _91, _105) (-1, _145) (1, _1948) 0 ]", + "EXPR [ (1, _89, _134) (-1, _1972) 0 ]", + "EXPR [ (1, _91, _135) (-1, _1973) 0 ]", + "EXPR [ (-1, _146) (1, _1913) (1, _1972) (1, _1973) 0 ]", "EXPR [ (1, _142, _146) (-1, _147) 0 ]", "BLACKBOX::RANGE [(_147, 32)] []", - "EXPR [ (1, _91, _92) (-1, _2055) 0 ]", - "EXPR [ (1, _147) (-1, _148) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _91, _92) (-1, _1974) 0 ]", + "EXPR [ (1, _147) (-1, _148) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _142, _148) (-1, _149) 0 ]", "BLACKBOX::RANGE [(_149, 32)] []", - "EXPR [ (1, _142, _143) (-1, _2056) 0 ]", - "EXPR [ (1, _142, _149) (-1, _150) (1, _2056) 0 ]", + "EXPR [ (1, _142, _143) (-1, _1975) 0 ]", + "EXPR [ (1, _142, _149) (-1, _150) (1, _1975) 0 ]", "BLACKBOX::RANGE [(_150, 32)] []", - "EXPR [ (1, _91, _118) (-1, _2058) 0 ]", - "EXPR [ (1, _150) (-1, _151) (1, _2037) (1, _2058) 0 ]", + "EXPR [ (1, _91, _118) (-1, _1977) 0 ]", + "EXPR [ (1, _150) (-1, _151) (1, _1956) (1, _1977) 0 ]", "EXPR [ (1, _142, _151) (-1, _152) 0 ]", "BLACKBOX::RANGE [(_152, 32)] []", - "EXPR [ (-1, _153) (1, _2053) (1, _2054) 0 ]", + "EXPR [ (-1, _153) (1, _1972) (1, _1973) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(152))], q_c: -4864 })], outputs: [Simple(Witness(154))]", "EXPR [ (1, _152, _154) (-4864, _154) (1, _155) -1 ]", "EXPR [ (1, _152, _155) (-4864, _155) 0 ]", "EXPR [ (1, _142, _155) (-1, _156) 0 ]", "EXPR [ (-1, _142, _155) (-1, _157) 1 ]", - "EXPR [ (-1, _158) (1, _2037) (1, _2058) 0 ]", + "EXPR [ (-1, _158) (1, _1956) (1, _1977) 0 ]", "EXPR [ (1, _4, _43) (1, _152) (-1, _159) 0 ]", "EXPR [ (1, _142, _159) (-1, _160) 0 ]", "BLACKBOX::RANGE [(_160, 32)] []", - "EXPR [ (1, _160) (-1, _161) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _160) (-1, _161) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _142, _161) (-1, _162) 0 ]", "BLACKBOX::RANGE [(_162, 32)] []", - "EXPR [ (1, _142, _162) (-1, _163) (1, _2056) 0 ]", + "EXPR [ (1, _142, _162) (-1, _163) (1, _1975) 0 ]", "BLACKBOX::RANGE [(_163, 32)] []", - "EXPR [ (1, _57, _142) (-1, _2060) 0 ]", - "EXPR [ (1, _142, _163) (-1, _164) (1, _2060) 0 ]", + "EXPR [ (1, _57, _142) (-1, _1979) 0 ]", + "EXPR [ (1, _142, _163) (-1, _164) (1, _1979) 0 ]", "BLACKBOX::RANGE [(_164, 32)] []", "EXPR [ (1, _142, _152) (1, _144, _153) (-1, _165) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(164))], q_c: -4864 })], outputs: [Simple(Witness(166))]", @@ -316,12 +316,12 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _164) (-1, _171) 0 ]", "EXPR [ (1, _142, _171) (-1, _172) 0 ]", "BLACKBOX::RANGE [(_172, 32)] []", - "EXPR [ (1, _172) (-1, _173) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _172) (-1, _173) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _142, _173) (-1, _174) 0 ]", "BLACKBOX::RANGE [(_174, 32)] []", - "EXPR [ (1, _142, _174) (-1, _175) (1, _2056) 0 ]", + "EXPR [ (1, _142, _174) (-1, _175) (1, _1975) 0 ]", "BLACKBOX::RANGE [(_175, 32)] []", - "EXPR [ (1, _142, _175) (-1, _176) (1, _2060) 0 ]", + "EXPR [ (1, _142, _175) (-1, _176) (1, _1979) 0 ]", "BLACKBOX::RANGE [(_176, 32)] []", "EXPR [ (1, _142, _164) (1, _144, _165) (-1, _177) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(176))], q_c: -4864 })], outputs: [Simple(Witness(178))]", @@ -333,12 +333,12 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _176) (-1, _183) 0 ]", "EXPR [ (1, _142, _183) (-1, _184) 0 ]", "BLACKBOX::RANGE [(_184, 32)] []", - "EXPR [ (1, _184) (-1, _185) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _184) (-1, _185) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _142, _185) (-1, _186) 0 ]", "BLACKBOX::RANGE [(_186, 32)] []", - "EXPR [ (1, _142, _186) (-1, _187) (1, _2056) 0 ]", + "EXPR [ (1, _142, _186) (-1, _187) (1, _1975) 0 ]", "BLACKBOX::RANGE [(_187, 32)] []", - "EXPR [ (1, _142, _187) (-1, _188) (1, _2060) 0 ]", + "EXPR [ (1, _142, _187) (-1, _188) (1, _1979) 0 ]", "BLACKBOX::RANGE [(_188, 32)] []", "EXPR [ (1, _142, _176) (1, _144, _177) (-1, _189) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(188))], q_c: -4864 })], outputs: [Simple(Witness(190))]", @@ -352,23 +352,23 @@ expression: artifact "EXPR [ (-1, _0, _196) (3, _196) 0 ]", "EXPR [ (1, _188, _192) (1, _193, _194) (-1, _197) 0 ]", "EXPR [ (-1, _196) (-1, _198) 1 ]", - "EXPR [ (1, _144, _158) (-1, _199) (1, _2060) 0 ]", - "EXPR [ (1, _142, _188) (-1, _2081) 0 ]", - "EXPR [ (1, _144, _189) (-1, _2082) 0 ]", - "EXPR [ (-1, _200) (1, _1994) (1, _2081) (1, _2082) 0 ]", + "EXPR [ (1, _144, _158) (-1, _199) (1, _1979) 0 ]", + "EXPR [ (1, _142, _188) (-1, _2000) 0 ]", + "EXPR [ (1, _144, _189) (-1, _2001) 0 ]", + "EXPR [ (-1, _200) (1, _1913) (1, _2000) (1, _2001) 0 ]", "EXPR [ (1, _196, _200) (-1, _201) 0 ]", "BLACKBOX::RANGE [(_201, 32)] []", - "EXPR [ (1, _201) (-1, _202) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _201) (-1, _202) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _196, _202) (-1, _203) 0 ]", "BLACKBOX::RANGE [(_203, 32)] []", - "EXPR [ (1, _144, _145) (-1, _2083) 0 ]", - "EXPR [ (1, _203) (-1, _204) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _144, _145) (-1, _2002) 0 ]", + "EXPR [ (1, _203) (-1, _204) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _196, _204) (-1, _205) 0 ]", "BLACKBOX::RANGE [(_205, 32)] []", - "EXPR [ (1, _196, _197) (-1, _2084) 0 ]", - "EXPR [ (1, _196, _205) (-1, _206) (1, _2084) 0 ]", + "EXPR [ (1, _196, _197) (-1, _2003) 0 ]", + "EXPR [ (1, _196, _205) (-1, _206) (1, _2003) 0 ]", "BLACKBOX::RANGE [(_206, 32)] []", - "EXPR [ (-1, _207) (1, _2081) (1, _2082) 0 ]", + "EXPR [ (-1, _207) (1, _2000) (1, _2001) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(206))], q_c: -4864 })], outputs: [Simple(Witness(208))]", "EXPR [ (1, _206, _208) (-4864, _208) (1, _209) -1 ]", "EXPR [ (1, _206, _209) (-4864, _209) 0 ]", @@ -377,13 +377,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _206) (-1, _212) 0 ]", "EXPR [ (1, _196, _212) (-1, _213) 0 ]", "BLACKBOX::RANGE [(_213, 32)] []", - "EXPR [ (1, _213) (-1, _214) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _213) (-1, _214) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _196, _214) (-1, _215) 0 ]", "BLACKBOX::RANGE [(_215, 32)] []", - "EXPR [ (1, _215) (-1, _216) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _215) (-1, _216) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _196, _216) (-1, _217) 0 ]", "BLACKBOX::RANGE [(_217, 32)] []", - "EXPR [ (1, _196, _217) (-1, _218) (1, _2084) 0 ]", + "EXPR [ (1, _196, _217) (-1, _218) (1, _2003) 0 ]", "BLACKBOX::RANGE [(_218, 32)] []", "EXPR [ (1, _196, _206) (1, _198, _207) (-1, _219) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(218))], q_c: -4864 })], outputs: [Simple(Witness(220))]", @@ -395,13 +395,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _218) (-1, _225) 0 ]", "EXPR [ (1, _196, _225) (-1, _226) 0 ]", "BLACKBOX::RANGE [(_226, 32)] []", - "EXPR [ (1, _226) (-1, _227) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _226) (-1, _227) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _196, _227) (-1, _228) 0 ]", "BLACKBOX::RANGE [(_228, 32)] []", - "EXPR [ (1, _228) (-1, _229) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _228) (-1, _229) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _196, _229) (-1, _230) 0 ]", "BLACKBOX::RANGE [(_230, 32)] []", - "EXPR [ (1, _196, _230) (-1, _231) (1, _2084) 0 ]", + "EXPR [ (1, _196, _230) (-1, _231) (1, _2003) 0 ]", "BLACKBOX::RANGE [(_231, 32)] []", "EXPR [ (1, _196, _218) (1, _198, _219) (-1, _232) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(231))], q_c: -4864 })], outputs: [Simple(Witness(233))]", @@ -413,13 +413,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _231) (-1, _238) 0 ]", "EXPR [ (1, _196, _238) (-1, _239) 0 ]", "BLACKBOX::RANGE [(_239, 32)] []", - "EXPR [ (1, _239) (-1, _240) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _239) (-1, _240) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _196, _240) (-1, _241) 0 ]", "BLACKBOX::RANGE [(_241, 32)] []", - "EXPR [ (1, _241) (-1, _242) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _241) (-1, _242) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _196, _242) (-1, _243) 0 ]", "BLACKBOX::RANGE [(_243, 32)] []", - "EXPR [ (1, _196, _243) (-1, _244) (1, _2084) 0 ]", + "EXPR [ (1, _196, _243) (-1, _244) (1, _2003) 0 ]", "BLACKBOX::RANGE [(_244, 32)] []", "EXPR [ (1, _196, _231) (1, _198, _232) (-1, _245) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(244))], q_c: -4864 })], outputs: [Simple(Witness(246))]", @@ -431,23 +431,23 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 4 })], outputs: [Simple(Witness(251))]", "EXPR [ (-1, _0, _251) (4, _251) (1, _252) -1 ]", "EXPR [ (-1, _0, _252) (4, _252) 0 ]", - "EXPR [ (1, _196, _244) (-1, _2101) 0 ]", - "EXPR [ (1, _198, _245) (-1, _2102) 0 ]", - "EXPR [ (-1, _253) (1, _1994) (1, _2101) (1, _2102) 0 ]", + "EXPR [ (1, _196, _244) (-1, _2020) 0 ]", + "EXPR [ (1, _198, _245) (-1, _2021) 0 ]", + "EXPR [ (-1, _253) (1, _1913) (1, _2020) (1, _2021) 0 ]", "EXPR [ (1, _252, _253) (-1, _254) 0 ]", "BLACKBOX::RANGE [(_254, 32)] []", - "EXPR [ (1, _254) (-1, _255) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _254) (-1, _255) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _252, _255) (-1, _256) 0 ]", "BLACKBOX::RANGE [(_256, 32)] []", - "EXPR [ (1, _256) (-1, _257) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _256) (-1, _257) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _252, _257) (-1, _258) 0 ]", "BLACKBOX::RANGE [(_258, 32)] []", - "EXPR [ (1, _198, _199) (-1, _2103) 0 ]", - "EXPR [ (1, _258) (-1, _259) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _198, _199) (-1, _2022) 0 ]", + "EXPR [ (1, _258) (-1, _259) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _252, _259) (-1, _260) 0 ]", "BLACKBOX::RANGE [(_260, 32)] []", "EXPR [ (-1, _252) (-1, _261) 1 ]", - "EXPR [ (-1, _262) (1, _2101) (1, _2102) 0 ]", + "EXPR [ (-1, _262) (1, _2020) (1, _2021) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(260))], q_c: -4864 })], outputs: [Simple(Witness(263))]", "EXPR [ (1, _260, _263) (-4864, _263) (1, _264) -1 ]", "EXPR [ (1, _260, _264) (-4864, _264) 0 ]", @@ -457,13 +457,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _260) (-1, _268) 0 ]", "EXPR [ (1, _252, _268) (-1, _269) 0 ]", "BLACKBOX::RANGE [(_269, 32)] []", - "EXPR [ (1, _269) (-1, _270) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _269) (-1, _270) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _252, _270) (-1, _271) 0 ]", "BLACKBOX::RANGE [(_271, 32)] []", - "EXPR [ (1, _271) (-1, _272) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _271) (-1, _272) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _252, _272) (-1, _273) 0 ]", "BLACKBOX::RANGE [(_273, 32)] []", - "EXPR [ (1, _273) (-1, _274) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _273) (-1, _274) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _252, _274) (-1, _275) 0 ]", "BLACKBOX::RANGE [(_275, 32)] []", "EXPR [ (1, _252, _260) (1, _261, _262) (-1, _276) 0 ]", @@ -476,13 +476,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _275) (-1, _282) 0 ]", "EXPR [ (1, _252, _282) (-1, _283) 0 ]", "BLACKBOX::RANGE [(_283, 32)] []", - "EXPR [ (1, _283) (-1, _284) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _283) (-1, _284) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _252, _284) (-1, _285) 0 ]", "BLACKBOX::RANGE [(_285, 32)] []", - "EXPR [ (1, _285) (-1, _286) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _285) (-1, _286) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _252, _286) (-1, _287) 0 ]", "BLACKBOX::RANGE [(_287, 32)] []", - "EXPR [ (1, _287) (-1, _288) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _287) (-1, _288) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _252, _288) (-1, _289) 0 ]", "BLACKBOX::RANGE [(_289, 32)] []", "EXPR [ (1, _252, _275) (1, _261, _276) (-1, _290) 0 ]", @@ -495,13 +495,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _289) (-1, _296) 0 ]", "EXPR [ (1, _252, _296) (-1, _297) 0 ]", "BLACKBOX::RANGE [(_297, 32)] []", - "EXPR [ (1, _297) (-1, _298) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _297) (-1, _298) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _252, _298) (-1, _299) 0 ]", "BLACKBOX::RANGE [(_299, 32)] []", - "EXPR [ (1, _299) (-1, _300) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _299) (-1, _300) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _252, _300) (-1, _301) 0 ]", "BLACKBOX::RANGE [(_301, 32)] []", - "EXPR [ (1, _301) (-1, _302) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _301) (-1, _302) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _252, _302) (-1, _303) 0 ]", "BLACKBOX::RANGE [(_303, 32)] []", "EXPR [ (1, _252, _289) (1, _261, _290) (-1, _304) 0 ]", @@ -514,22 +514,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 5 })], outputs: [Simple(Witness(310))]", "EXPR [ (-1, _0, _310) (5, _310) (1, _311) -1 ]", "EXPR [ (-1, _0, _311) (5, _311) 0 ]", - "EXPR [ (1, _252, _303) (-1, _2118) 0 ]", - "EXPR [ (1, _261, _304) (-1, _2119) 0 ]", - "EXPR [ (-1, _312) (1, _1994) (1, _2118) (1, _2119) 0 ]", + "EXPR [ (1, _252, _303) (-1, _2037) 0 ]", + "EXPR [ (1, _261, _304) (-1, _2038) 0 ]", + "EXPR [ (-1, _312) (1, _1913) (1, _2037) (1, _2038) 0 ]", "EXPR [ (1, _311, _312) (-1, _313) 0 ]", "BLACKBOX::RANGE [(_313, 32)] []", - "EXPR [ (1, _313) (-1, _314) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _313) (-1, _314) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _311, _314) (-1, _315) 0 ]", "BLACKBOX::RANGE [(_315, 32)] []", - "EXPR [ (1, _315) (-1, _316) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _315) (-1, _316) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _311, _316) (-1, _317) 0 ]", "BLACKBOX::RANGE [(_317, 32)] []", - "EXPR [ (1, _317) (-1, _318) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _317) (-1, _318) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _311, _318) (-1, _319) 0 ]", "BLACKBOX::RANGE [(_319, 32)] []", "EXPR [ (-1, _311) (-1, _320) 1 ]", - "EXPR [ (-1, _321) (1, _2118) (1, _2119) 0 ]", + "EXPR [ (-1, _321) (1, _2037) (1, _2038) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(319))], q_c: -4864 })], outputs: [Simple(Witness(322))]", "EXPR [ (1, _319, _322) (-4864, _322) (1, _323) -1 ]", "EXPR [ (1, _319, _323) (-4864, _323) 0 ]", @@ -539,13 +539,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _319) (-1, _327) 0 ]", "EXPR [ (1, _311, _327) (-1, _328) 0 ]", "BLACKBOX::RANGE [(_328, 32)] []", - "EXPR [ (1, _328) (-1, _329) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _328) (-1, _329) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _311, _329) (-1, _330) 0 ]", "BLACKBOX::RANGE [(_330, 32)] []", - "EXPR [ (1, _330) (-1, _331) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _330) (-1, _331) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _311, _331) (-1, _332) 0 ]", "BLACKBOX::RANGE [(_332, 32)] []", - "EXPR [ (1, _332) (-1, _333) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _332) (-1, _333) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _311, _333) (-1, _334) 0 ]", "BLACKBOX::RANGE [(_334, 32)] []", "EXPR [ (1, _311, _319) (1, _320, _321) (-1, _335) 0 ]", @@ -558,13 +558,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _334) (-1, _341) 0 ]", "EXPR [ (1, _311, _341) (-1, _342) 0 ]", "BLACKBOX::RANGE [(_342, 32)] []", - "EXPR [ (1, _342) (-1, _343) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _342) (-1, _343) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _311, _343) (-1, _344) 0 ]", "BLACKBOX::RANGE [(_344, 32)] []", - "EXPR [ (1, _344) (-1, _345) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _344) (-1, _345) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _311, _345) (-1, _346) 0 ]", "BLACKBOX::RANGE [(_346, 32)] []", - "EXPR [ (1, _346) (-1, _347) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _346) (-1, _347) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _311, _347) (-1, _348) 0 ]", "BLACKBOX::RANGE [(_348, 32)] []", "EXPR [ (1, _311, _334) (1, _320, _335) (-1, _349) 0 ]", @@ -577,13 +577,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _348) (-1, _355) 0 ]", "EXPR [ (1, _311, _355) (-1, _356) 0 ]", "BLACKBOX::RANGE [(_356, 32)] []", - "EXPR [ (1, _356) (-1, _357) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _356) (-1, _357) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _311, _357) (-1, _358) 0 ]", "BLACKBOX::RANGE [(_358, 32)] []", - "EXPR [ (1, _358) (-1, _359) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _358) (-1, _359) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _311, _359) (-1, _360) 0 ]", "BLACKBOX::RANGE [(_360, 32)] []", - "EXPR [ (1, _360) (-1, _361) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _360) (-1, _361) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _311, _361) (-1, _362) 0 ]", "BLACKBOX::RANGE [(_362, 32)] []", "EXPR [ (1, _311, _348) (1, _320, _349) (-1, _363) 0 ]", @@ -596,22 +596,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 6 })], outputs: [Simple(Witness(369))]", "EXPR [ (-1, _0, _369) (6, _369) (1, _370) -1 ]", "EXPR [ (-1, _0, _370) (6, _370) 0 ]", - "EXPR [ (1, _311, _362) (-1, _2134) 0 ]", - "EXPR [ (1, _320, _363) (-1, _2135) 0 ]", - "EXPR [ (-1, _371) (1, _1994) (1, _2134) (1, _2135) 0 ]", + "EXPR [ (1, _311, _362) (-1, _2053) 0 ]", + "EXPR [ (1, _320, _363) (-1, _2054) 0 ]", + "EXPR [ (-1, _371) (1, _1913) (1, _2053) (1, _2054) 0 ]", "EXPR [ (1, _370, _371) (-1, _372) 0 ]", "BLACKBOX::RANGE [(_372, 32)] []", - "EXPR [ (1, _372) (-1, _373) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _372) (-1, _373) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _370, _373) (-1, _374) 0 ]", "BLACKBOX::RANGE [(_374, 32)] []", - "EXPR [ (1, _374) (-1, _375) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _374) (-1, _375) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _370, _375) (-1, _376) 0 ]", "BLACKBOX::RANGE [(_376, 32)] []", - "EXPR [ (1, _376) (-1, _377) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _376) (-1, _377) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _370, _377) (-1, _378) 0 ]", "BLACKBOX::RANGE [(_378, 32)] []", "EXPR [ (-1, _370) (-1, _379) 1 ]", - "EXPR [ (-1, _380) (1, _2134) (1, _2135) 0 ]", + "EXPR [ (-1, _380) (1, _2053) (1, _2054) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(378))], q_c: -4864 })], outputs: [Simple(Witness(381))]", "EXPR [ (1, _378, _381) (-4864, _381) (1, _382) -1 ]", "EXPR [ (1, _378, _382) (-4864, _382) 0 ]", @@ -621,13 +621,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _378) (-1, _386) 0 ]", "EXPR [ (1, _370, _386) (-1, _387) 0 ]", "BLACKBOX::RANGE [(_387, 32)] []", - "EXPR [ (1, _387) (-1, _388) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _387) (-1, _388) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _370, _388) (-1, _389) 0 ]", "BLACKBOX::RANGE [(_389, 32)] []", - "EXPR [ (1, _389) (-1, _390) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _389) (-1, _390) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _370, _390) (-1, _391) 0 ]", "BLACKBOX::RANGE [(_391, 32)] []", - "EXPR [ (1, _391) (-1, _392) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _391) (-1, _392) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _370, _392) (-1, _393) 0 ]", "BLACKBOX::RANGE [(_393, 32)] []", "EXPR [ (1, _370, _378) (1, _379, _380) (-1, _394) 0 ]", @@ -640,13 +640,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _393) (-1, _400) 0 ]", "EXPR [ (1, _370, _400) (-1, _401) 0 ]", "BLACKBOX::RANGE [(_401, 32)] []", - "EXPR [ (1, _401) (-1, _402) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _401) (-1, _402) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _370, _402) (-1, _403) 0 ]", "BLACKBOX::RANGE [(_403, 32)] []", - "EXPR [ (1, _403) (-1, _404) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _403) (-1, _404) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _370, _404) (-1, _405) 0 ]", "BLACKBOX::RANGE [(_405, 32)] []", - "EXPR [ (1, _405) (-1, _406) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _405) (-1, _406) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _370, _406) (-1, _407) 0 ]", "BLACKBOX::RANGE [(_407, 32)] []", "EXPR [ (1, _370, _393) (1, _379, _394) (-1, _408) 0 ]", @@ -659,13 +659,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _407) (-1, _414) 0 ]", "EXPR [ (1, _370, _414) (-1, _415) 0 ]", "BLACKBOX::RANGE [(_415, 32)] []", - "EXPR [ (1, _415) (-1, _416) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _415) (-1, _416) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _370, _416) (-1, _417) 0 ]", "BLACKBOX::RANGE [(_417, 32)] []", - "EXPR [ (1, _417) (-1, _418) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _417) (-1, _418) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _370, _418) (-1, _419) 0 ]", "BLACKBOX::RANGE [(_419, 32)] []", - "EXPR [ (1, _419) (-1, _420) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _419) (-1, _420) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _370, _420) (-1, _421) 0 ]", "BLACKBOX::RANGE [(_421, 32)] []", "EXPR [ (1, _370, _407) (1, _379, _408) (-1, _422) 0 ]", @@ -678,22 +678,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 7 })], outputs: [Simple(Witness(428))]", "EXPR [ (-1, _0, _428) (7, _428) (1, _429) -1 ]", "EXPR [ (-1, _0, _429) (7, _429) 0 ]", - "EXPR [ (1, _370, _421) (-1, _2150) 0 ]", - "EXPR [ (1, _379, _422) (-1, _2151) 0 ]", - "EXPR [ (-1, _430) (1, _1994) (1, _2150) (1, _2151) 0 ]", + "EXPR [ (1, _370, _421) (-1, _2069) 0 ]", + "EXPR [ (1, _379, _422) (-1, _2070) 0 ]", + "EXPR [ (-1, _430) (1, _1913) (1, _2069) (1, _2070) 0 ]", "EXPR [ (1, _429, _430) (-1, _431) 0 ]", "BLACKBOX::RANGE [(_431, 32)] []", - "EXPR [ (1, _431) (-1, _432) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _431) (-1, _432) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _429, _432) (-1, _433) 0 ]", "BLACKBOX::RANGE [(_433, 32)] []", - "EXPR [ (1, _433) (-1, _434) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _433) (-1, _434) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _429, _434) (-1, _435) 0 ]", "BLACKBOX::RANGE [(_435, 32)] []", - "EXPR [ (1, _435) (-1, _436) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _435) (-1, _436) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _429, _436) (-1, _437) 0 ]", "BLACKBOX::RANGE [(_437, 32)] []", "EXPR [ (-1, _429) (-1, _438) 1 ]", - "EXPR [ (-1, _439) (1, _2150) (1, _2151) 0 ]", + "EXPR [ (-1, _439) (1, _2069) (1, _2070) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(437))], q_c: -4864 })], outputs: [Simple(Witness(440))]", "EXPR [ (1, _437, _440) (-4864, _440) (1, _441) -1 ]", "EXPR [ (1, _437, _441) (-4864, _441) 0 ]", @@ -703,13 +703,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _437) (-1, _445) 0 ]", "EXPR [ (1, _429, _445) (-1, _446) 0 ]", "BLACKBOX::RANGE [(_446, 32)] []", - "EXPR [ (1, _446) (-1, _447) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _446) (-1, _447) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _429, _447) (-1, _448) 0 ]", "BLACKBOX::RANGE [(_448, 32)] []", - "EXPR [ (1, _448) (-1, _449) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _448) (-1, _449) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _429, _449) (-1, _450) 0 ]", "BLACKBOX::RANGE [(_450, 32)] []", - "EXPR [ (1, _450) (-1, _451) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _450) (-1, _451) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _429, _451) (-1, _452) 0 ]", "BLACKBOX::RANGE [(_452, 32)] []", "EXPR [ (1, _429, _437) (1, _438, _439) (-1, _453) 0 ]", @@ -722,13 +722,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _452) (-1, _459) 0 ]", "EXPR [ (1, _429, _459) (-1, _460) 0 ]", "BLACKBOX::RANGE [(_460, 32)] []", - "EXPR [ (1, _460) (-1, _461) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _460) (-1, _461) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _429, _461) (-1, _462) 0 ]", "BLACKBOX::RANGE [(_462, 32)] []", - "EXPR [ (1, _462) (-1, _463) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _462) (-1, _463) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _429, _463) (-1, _464) 0 ]", "BLACKBOX::RANGE [(_464, 32)] []", - "EXPR [ (1, _464) (-1, _465) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _464) (-1, _465) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _429, _465) (-1, _466) 0 ]", "BLACKBOX::RANGE [(_466, 32)] []", "EXPR [ (1, _429, _452) (1, _438, _453) (-1, _467) 0 ]", @@ -741,13 +741,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _466) (-1, _473) 0 ]", "EXPR [ (1, _429, _473) (-1, _474) 0 ]", "BLACKBOX::RANGE [(_474, 32)] []", - "EXPR [ (1, _474) (-1, _475) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _474) (-1, _475) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _429, _475) (-1, _476) 0 ]", "BLACKBOX::RANGE [(_476, 32)] []", - "EXPR [ (1, _476) (-1, _477) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _476) (-1, _477) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _429, _477) (-1, _478) 0 ]", "BLACKBOX::RANGE [(_478, 32)] []", - "EXPR [ (1, _478) (-1, _479) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _478) (-1, _479) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _429, _479) (-1, _480) 0 ]", "BLACKBOX::RANGE [(_480, 32)] []", "EXPR [ (1, _429, _466) (1, _438, _467) (-1, _481) 0 ]", @@ -760,22 +760,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 8 })], outputs: [Simple(Witness(487))]", "EXPR [ (-1, _0, _487) (8, _487) (1, _488) -1 ]", "EXPR [ (-1, _0, _488) (8, _488) 0 ]", - "EXPR [ (1, _429, _480) (-1, _2166) 0 ]", - "EXPR [ (1, _438, _481) (-1, _2167) 0 ]", - "EXPR [ (-1, _489) (1, _1994) (1, _2166) (1, _2167) 0 ]", + "EXPR [ (1, _429, _480) (-1, _2085) 0 ]", + "EXPR [ (1, _438, _481) (-1, _2086) 0 ]", + "EXPR [ (-1, _489) (1, _1913) (1, _2085) (1, _2086) 0 ]", "EXPR [ (1, _488, _489) (-1, _490) 0 ]", "BLACKBOX::RANGE [(_490, 32)] []", - "EXPR [ (1, _490) (-1, _491) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _490) (-1, _491) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _488, _491) (-1, _492) 0 ]", "BLACKBOX::RANGE [(_492, 32)] []", - "EXPR [ (1, _492) (-1, _493) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _492) (-1, _493) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _488, _493) (-1, _494) 0 ]", "BLACKBOX::RANGE [(_494, 32)] []", - "EXPR [ (1, _494) (-1, _495) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _494) (-1, _495) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _488, _495) (-1, _496) 0 ]", "BLACKBOX::RANGE [(_496, 32)] []", "EXPR [ (-1, _488) (-1, _497) 1 ]", - "EXPR [ (-1, _498) (1, _2166) (1, _2167) 0 ]", + "EXPR [ (-1, _498) (1, _2085) (1, _2086) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(496))], q_c: -4864 })], outputs: [Simple(Witness(499))]", "EXPR [ (1, _496, _499) (-4864, _499) (1, _500) -1 ]", "EXPR [ (1, _496, _500) (-4864, _500) 0 ]", @@ -785,13 +785,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _496) (-1, _504) 0 ]", "EXPR [ (1, _488, _504) (-1, _505) 0 ]", "BLACKBOX::RANGE [(_505, 32)] []", - "EXPR [ (1, _505) (-1, _506) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _505) (-1, _506) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _488, _506) (-1, _507) 0 ]", "BLACKBOX::RANGE [(_507, 32)] []", - "EXPR [ (1, _507) (-1, _508) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _507) (-1, _508) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _488, _508) (-1, _509) 0 ]", "BLACKBOX::RANGE [(_509, 32)] []", - "EXPR [ (1, _509) (-1, _510) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _509) (-1, _510) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _488, _510) (-1, _511) 0 ]", "BLACKBOX::RANGE [(_511, 32)] []", "EXPR [ (1, _488, _496) (1, _497, _498) (-1, _512) 0 ]", @@ -804,13 +804,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _511) (-1, _518) 0 ]", "EXPR [ (1, _488, _518) (-1, _519) 0 ]", "BLACKBOX::RANGE [(_519, 32)] []", - "EXPR [ (1, _519) (-1, _520) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _519) (-1, _520) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _488, _520) (-1, _521) 0 ]", "BLACKBOX::RANGE [(_521, 32)] []", - "EXPR [ (1, _521) (-1, _522) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _521) (-1, _522) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _488, _522) (-1, _523) 0 ]", "BLACKBOX::RANGE [(_523, 32)] []", - "EXPR [ (1, _523) (-1, _524) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _523) (-1, _524) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _488, _524) (-1, _525) 0 ]", "BLACKBOX::RANGE [(_525, 32)] []", "EXPR [ (1, _488, _511) (1, _497, _512) (-1, _526) 0 ]", @@ -823,13 +823,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _525) (-1, _532) 0 ]", "EXPR [ (1, _488, _532) (-1, _533) 0 ]", "BLACKBOX::RANGE [(_533, 32)] []", - "EXPR [ (1, _533) (-1, _534) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _533) (-1, _534) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _488, _534) (-1, _535) 0 ]", "BLACKBOX::RANGE [(_535, 32)] []", - "EXPR [ (1, _535) (-1, _536) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _535) (-1, _536) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _488, _536) (-1, _537) 0 ]", "BLACKBOX::RANGE [(_537, 32)] []", - "EXPR [ (1, _537) (-1, _538) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _537) (-1, _538) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _488, _538) (-1, _539) 0 ]", "BLACKBOX::RANGE [(_539, 32)] []", "EXPR [ (1, _488, _525) (1, _497, _526) (-1, _540) 0 ]", @@ -842,22 +842,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 9 })], outputs: [Simple(Witness(546))]", "EXPR [ (-1, _0, _546) (9, _546) (1, _547) -1 ]", "EXPR [ (-1, _0, _547) (9, _547) 0 ]", - "EXPR [ (1, _488, _539) (-1, _2182) 0 ]", - "EXPR [ (1, _497, _540) (-1, _2183) 0 ]", - "EXPR [ (-1, _548) (1, _1994) (1, _2182) (1, _2183) 0 ]", + "EXPR [ (1, _488, _539) (-1, _2101) 0 ]", + "EXPR [ (1, _497, _540) (-1, _2102) 0 ]", + "EXPR [ (-1, _548) (1, _1913) (1, _2101) (1, _2102) 0 ]", "EXPR [ (1, _547, _548) (-1, _549) 0 ]", "BLACKBOX::RANGE [(_549, 32)] []", - "EXPR [ (1, _549) (-1, _550) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _549) (-1, _550) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _547, _550) (-1, _551) 0 ]", "BLACKBOX::RANGE [(_551, 32)] []", - "EXPR [ (1, _551) (-1, _552) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _551) (-1, _552) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _547, _552) (-1, _553) 0 ]", "BLACKBOX::RANGE [(_553, 32)] []", - "EXPR [ (1, _553) (-1, _554) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _553) (-1, _554) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _547, _554) (-1, _555) 0 ]", "BLACKBOX::RANGE [(_555, 32)] []", "EXPR [ (-1, _547) (-1, _556) 1 ]", - "EXPR [ (-1, _557) (1, _2182) (1, _2183) 0 ]", + "EXPR [ (-1, _557) (1, _2101) (1, _2102) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(555))], q_c: -4864 })], outputs: [Simple(Witness(558))]", "EXPR [ (1, _555, _558) (-4864, _558) (1, _559) -1 ]", "EXPR [ (1, _555, _559) (-4864, _559) 0 ]", @@ -867,13 +867,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _555) (-1, _563) 0 ]", "EXPR [ (1, _547, _563) (-1, _564) 0 ]", "BLACKBOX::RANGE [(_564, 32)] []", - "EXPR [ (1, _564) (-1, _565) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _564) (-1, _565) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _547, _565) (-1, _566) 0 ]", "BLACKBOX::RANGE [(_566, 32)] []", - "EXPR [ (1, _566) (-1, _567) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _566) (-1, _567) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _547, _567) (-1, _568) 0 ]", "BLACKBOX::RANGE [(_568, 32)] []", - "EXPR [ (1, _568) (-1, _569) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _568) (-1, _569) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _547, _569) (-1, _570) 0 ]", "BLACKBOX::RANGE [(_570, 32)] []", "EXPR [ (1, _547, _555) (1, _556, _557) (-1, _571) 0 ]", @@ -886,13 +886,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _570) (-1, _577) 0 ]", "EXPR [ (1, _547, _577) (-1, _578) 0 ]", "BLACKBOX::RANGE [(_578, 32)] []", - "EXPR [ (1, _578) (-1, _579) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _578) (-1, _579) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _547, _579) (-1, _580) 0 ]", "BLACKBOX::RANGE [(_580, 32)] []", - "EXPR [ (1, _580) (-1, _581) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _580) (-1, _581) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _547, _581) (-1, _582) 0 ]", "BLACKBOX::RANGE [(_582, 32)] []", - "EXPR [ (1, _582) (-1, _583) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _582) (-1, _583) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _547, _583) (-1, _584) 0 ]", "BLACKBOX::RANGE [(_584, 32)] []", "EXPR [ (1, _547, _570) (1, _556, _571) (-1, _585) 0 ]", @@ -905,13 +905,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _584) (-1, _591) 0 ]", "EXPR [ (1, _547, _591) (-1, _592) 0 ]", "BLACKBOX::RANGE [(_592, 32)] []", - "EXPR [ (1, _592) (-1, _593) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _592) (-1, _593) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _547, _593) (-1, _594) 0 ]", "BLACKBOX::RANGE [(_594, 32)] []", - "EXPR [ (1, _594) (-1, _595) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _594) (-1, _595) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _547, _595) (-1, _596) 0 ]", "BLACKBOX::RANGE [(_596, 32)] []", - "EXPR [ (1, _596) (-1, _597) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _596) (-1, _597) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _547, _597) (-1, _598) 0 ]", "BLACKBOX::RANGE [(_598, 32)] []", "EXPR [ (1, _547, _584) (1, _556, _585) (-1, _599) 0 ]", @@ -924,22 +924,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 10 })], outputs: [Simple(Witness(605))]", "EXPR [ (-1, _0, _605) (10, _605) (1, _606) -1 ]", "EXPR [ (-1, _0, _606) (10, _606) 0 ]", - "EXPR [ (1, _547, _598) (-1, _2198) 0 ]", - "EXPR [ (1, _556, _599) (-1, _2199) 0 ]", - "EXPR [ (-1, _607) (1, _1994) (1, _2198) (1, _2199) 0 ]", + "EXPR [ (1, _547, _598) (-1, _2117) 0 ]", + "EXPR [ (1, _556, _599) (-1, _2118) 0 ]", + "EXPR [ (-1, _607) (1, _1913) (1, _2117) (1, _2118) 0 ]", "EXPR [ (1, _606, _607) (-1, _608) 0 ]", "BLACKBOX::RANGE [(_608, 32)] []", - "EXPR [ (1, _608) (-1, _609) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _608) (-1, _609) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _606, _609) (-1, _610) 0 ]", "BLACKBOX::RANGE [(_610, 32)] []", - "EXPR [ (1, _610) (-1, _611) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _610) (-1, _611) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _606, _611) (-1, _612) 0 ]", "BLACKBOX::RANGE [(_612, 32)] []", - "EXPR [ (1, _612) (-1, _613) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _612) (-1, _613) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _606, _613) (-1, _614) 0 ]", "BLACKBOX::RANGE [(_614, 32)] []", "EXPR [ (-1, _606) (-1, _615) 1 ]", - "EXPR [ (-1, _616) (1, _2198) (1, _2199) 0 ]", + "EXPR [ (-1, _616) (1, _2117) (1, _2118) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(614))], q_c: -4864 })], outputs: [Simple(Witness(617))]", "EXPR [ (1, _614, _617) (-4864, _617) (1, _618) -1 ]", "EXPR [ (1, _614, _618) (-4864, _618) 0 ]", @@ -949,13 +949,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _614) (-1, _622) 0 ]", "EXPR [ (1, _606, _622) (-1, _623) 0 ]", "BLACKBOX::RANGE [(_623, 32)] []", - "EXPR [ (1, _623) (-1, _624) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _623) (-1, _624) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _606, _624) (-1, _625) 0 ]", "BLACKBOX::RANGE [(_625, 32)] []", - "EXPR [ (1, _625) (-1, _626) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _625) (-1, _626) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _606, _626) (-1, _627) 0 ]", "BLACKBOX::RANGE [(_627, 32)] []", - "EXPR [ (1, _627) (-1, _628) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _627) (-1, _628) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _606, _628) (-1, _629) 0 ]", "BLACKBOX::RANGE [(_629, 32)] []", "EXPR [ (1, _606, _614) (1, _615, _616) (-1, _630) 0 ]", @@ -968,13 +968,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _629) (-1, _636) 0 ]", "EXPR [ (1, _606, _636) (-1, _637) 0 ]", "BLACKBOX::RANGE [(_637, 32)] []", - "EXPR [ (1, _637) (-1, _638) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _637) (-1, _638) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _606, _638) (-1, _639) 0 ]", "BLACKBOX::RANGE [(_639, 32)] []", - "EXPR [ (1, _639) (-1, _640) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _639) (-1, _640) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _606, _640) (-1, _641) 0 ]", "BLACKBOX::RANGE [(_641, 32)] []", - "EXPR [ (1, _641) (-1, _642) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _641) (-1, _642) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _606, _642) (-1, _643) 0 ]", "BLACKBOX::RANGE [(_643, 32)] []", "EXPR [ (1, _606, _629) (1, _615, _630) (-1, _644) 0 ]", @@ -987,13 +987,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _643) (-1, _650) 0 ]", "EXPR [ (1, _606, _650) (-1, _651) 0 ]", "BLACKBOX::RANGE [(_651, 32)] []", - "EXPR [ (1, _651) (-1, _652) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _651) (-1, _652) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _606, _652) (-1, _653) 0 ]", "BLACKBOX::RANGE [(_653, 32)] []", - "EXPR [ (1, _653) (-1, _654) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _653) (-1, _654) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _606, _654) (-1, _655) 0 ]", "BLACKBOX::RANGE [(_655, 32)] []", - "EXPR [ (1, _655) (-1, _656) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _655) (-1, _656) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _606, _656) (-1, _657) 0 ]", "BLACKBOX::RANGE [(_657, 32)] []", "EXPR [ (1, _606, _643) (1, _615, _644) (-1, _658) 0 ]", @@ -1006,22 +1006,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 11 })], outputs: [Simple(Witness(664))]", "EXPR [ (-1, _0, _664) (11, _664) (1, _665) -1 ]", "EXPR [ (-1, _0, _665) (11, _665) 0 ]", - "EXPR [ (1, _606, _657) (-1, _2214) 0 ]", - "EXPR [ (1, _615, _658) (-1, _2215) 0 ]", - "EXPR [ (-1, _666) (1, _1994) (1, _2214) (1, _2215) 0 ]", + "EXPR [ (1, _606, _657) (-1, _2133) 0 ]", + "EXPR [ (1, _615, _658) (-1, _2134) 0 ]", + "EXPR [ (-1, _666) (1, _1913) (1, _2133) (1, _2134) 0 ]", "EXPR [ (1, _665, _666) (-1, _667) 0 ]", "BLACKBOX::RANGE [(_667, 32)] []", - "EXPR [ (1, _667) (-1, _668) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _667) (-1, _668) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _665, _668) (-1, _669) 0 ]", "BLACKBOX::RANGE [(_669, 32)] []", - "EXPR [ (1, _669) (-1, _670) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _669) (-1, _670) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _665, _670) (-1, _671) 0 ]", "BLACKBOX::RANGE [(_671, 32)] []", - "EXPR [ (1, _671) (-1, _672) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _671) (-1, _672) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _665, _672) (-1, _673) 0 ]", "BLACKBOX::RANGE [(_673, 32)] []", "EXPR [ (-1, _665) (-1, _674) 1 ]", - "EXPR [ (-1, _675) (1, _2214) (1, _2215) 0 ]", + "EXPR [ (-1, _675) (1, _2133) (1, _2134) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(673))], q_c: -4864 })], outputs: [Simple(Witness(676))]", "EXPR [ (1, _673, _676) (-4864, _676) (1, _677) -1 ]", "EXPR [ (1, _673, _677) (-4864, _677) 0 ]", @@ -1031,13 +1031,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _673) (-1, _681) 0 ]", "EXPR [ (1, _665, _681) (-1, _682) 0 ]", "BLACKBOX::RANGE [(_682, 32)] []", - "EXPR [ (1, _682) (-1, _683) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _682) (-1, _683) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _665, _683) (-1, _684) 0 ]", "BLACKBOX::RANGE [(_684, 32)] []", - "EXPR [ (1, _684) (-1, _685) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _684) (-1, _685) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _665, _685) (-1, _686) 0 ]", "BLACKBOX::RANGE [(_686, 32)] []", - "EXPR [ (1, _686) (-1, _687) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _686) (-1, _687) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _665, _687) (-1, _688) 0 ]", "BLACKBOX::RANGE [(_688, 32)] []", "EXPR [ (1, _665, _673) (1, _674, _675) (-1, _689) 0 ]", @@ -1050,13 +1050,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _688) (-1, _695) 0 ]", "EXPR [ (1, _665, _695) (-1, _696) 0 ]", "BLACKBOX::RANGE [(_696, 32)] []", - "EXPR [ (1, _696) (-1, _697) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _696) (-1, _697) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _665, _697) (-1, _698) 0 ]", "BLACKBOX::RANGE [(_698, 32)] []", - "EXPR [ (1, _698) (-1, _699) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _698) (-1, _699) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _665, _699) (-1, _700) 0 ]", "BLACKBOX::RANGE [(_700, 32)] []", - "EXPR [ (1, _700) (-1, _701) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _700) (-1, _701) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _665, _701) (-1, _702) 0 ]", "BLACKBOX::RANGE [(_702, 32)] []", "EXPR [ (1, _665, _688) (1, _674, _689) (-1, _703) 0 ]", @@ -1069,13 +1069,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _702) (-1, _709) 0 ]", "EXPR [ (1, _665, _709) (-1, _710) 0 ]", "BLACKBOX::RANGE [(_710, 32)] []", - "EXPR [ (1, _710) (-1, _711) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _710) (-1, _711) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _665, _711) (-1, _712) 0 ]", "BLACKBOX::RANGE [(_712, 32)] []", - "EXPR [ (1, _712) (-1, _713) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _712) (-1, _713) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _665, _713) (-1, _714) 0 ]", "BLACKBOX::RANGE [(_714, 32)] []", - "EXPR [ (1, _714) (-1, _715) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _714) (-1, _715) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _665, _715) (-1, _716) 0 ]", "BLACKBOX::RANGE [(_716, 32)] []", "EXPR [ (1, _665, _702) (1, _674, _703) (-1, _717) 0 ]", @@ -1088,22 +1088,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 12 })], outputs: [Simple(Witness(723))]", "EXPR [ (-1, _0, _723) (12, _723) (1, _724) -1 ]", "EXPR [ (-1, _0, _724) (12, _724) 0 ]", - "EXPR [ (1, _665, _716) (-1, _2230) 0 ]", - "EXPR [ (1, _674, _717) (-1, _2231) 0 ]", - "EXPR [ (-1, _725) (1, _1994) (1, _2230) (1, _2231) 0 ]", + "EXPR [ (1, _665, _716) (-1, _2149) 0 ]", + "EXPR [ (1, _674, _717) (-1, _2150) 0 ]", + "EXPR [ (-1, _725) (1, _1913) (1, _2149) (1, _2150) 0 ]", "EXPR [ (1, _724, _725) (-1, _726) 0 ]", "BLACKBOX::RANGE [(_726, 32)] []", - "EXPR [ (1, _726) (-1, _727) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _726) (-1, _727) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _724, _727) (-1, _728) 0 ]", "BLACKBOX::RANGE [(_728, 32)] []", - "EXPR [ (1, _728) (-1, _729) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _728) (-1, _729) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _724, _729) (-1, _730) 0 ]", "BLACKBOX::RANGE [(_730, 32)] []", - "EXPR [ (1, _730) (-1, _731) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _730) (-1, _731) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _724, _731) (-1, _732) 0 ]", "BLACKBOX::RANGE [(_732, 32)] []", "EXPR [ (-1, _724) (-1, _733) 1 ]", - "EXPR [ (-1, _734) (1, _2230) (1, _2231) 0 ]", + "EXPR [ (-1, _734) (1, _2149) (1, _2150) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(732))], q_c: -4864 })], outputs: [Simple(Witness(735))]", "EXPR [ (1, _732, _735) (-4864, _735) (1, _736) -1 ]", "EXPR [ (1, _732, _736) (-4864, _736) 0 ]", @@ -1113,13 +1113,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _732) (-1, _740) 0 ]", "EXPR [ (1, _724, _740) (-1, _741) 0 ]", "BLACKBOX::RANGE [(_741, 32)] []", - "EXPR [ (1, _741) (-1, _742) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _741) (-1, _742) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _724, _742) (-1, _743) 0 ]", "BLACKBOX::RANGE [(_743, 32)] []", - "EXPR [ (1, _743) (-1, _744) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _743) (-1, _744) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _724, _744) (-1, _745) 0 ]", "BLACKBOX::RANGE [(_745, 32)] []", - "EXPR [ (1, _745) (-1, _746) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _745) (-1, _746) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _724, _746) (-1, _747) 0 ]", "BLACKBOX::RANGE [(_747, 32)] []", "EXPR [ (1, _724, _732) (1, _733, _734) (-1, _748) 0 ]", @@ -1132,13 +1132,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _747) (-1, _754) 0 ]", "EXPR [ (1, _724, _754) (-1, _755) 0 ]", "BLACKBOX::RANGE [(_755, 32)] []", - "EXPR [ (1, _755) (-1, _756) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _755) (-1, _756) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _724, _756) (-1, _757) 0 ]", "BLACKBOX::RANGE [(_757, 32)] []", - "EXPR [ (1, _757) (-1, _758) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _757) (-1, _758) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _724, _758) (-1, _759) 0 ]", "BLACKBOX::RANGE [(_759, 32)] []", - "EXPR [ (1, _759) (-1, _760) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _759) (-1, _760) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _724, _760) (-1, _761) 0 ]", "BLACKBOX::RANGE [(_761, 32)] []", "EXPR [ (1, _724, _747) (1, _733, _748) (-1, _762) 0 ]", @@ -1151,13 +1151,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _761) (-1, _768) 0 ]", "EXPR [ (1, _724, _768) (-1, _769) 0 ]", "BLACKBOX::RANGE [(_769, 32)] []", - "EXPR [ (1, _769) (-1, _770) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _769) (-1, _770) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _724, _770) (-1, _771) 0 ]", "BLACKBOX::RANGE [(_771, 32)] []", - "EXPR [ (1, _771) (-1, _772) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _771) (-1, _772) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _724, _772) (-1, _773) 0 ]", "BLACKBOX::RANGE [(_773, 32)] []", - "EXPR [ (1, _773) (-1, _774) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _773) (-1, _774) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _724, _774) (-1, _775) 0 ]", "BLACKBOX::RANGE [(_775, 32)] []", "EXPR [ (1, _724, _761) (1, _733, _762) (-1, _776) 0 ]", @@ -1170,22 +1170,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 13 })], outputs: [Simple(Witness(782))]", "EXPR [ (-1, _0, _782) (13, _782) (1, _783) -1 ]", "EXPR [ (-1, _0, _783) (13, _783) 0 ]", - "EXPR [ (1, _724, _775) (-1, _2246) 0 ]", - "EXPR [ (1, _733, _776) (-1, _2247) 0 ]", - "EXPR [ (-1, _784) (1, _1994) (1, _2246) (1, _2247) 0 ]", + "EXPR [ (1, _724, _775) (-1, _2165) 0 ]", + "EXPR [ (1, _733, _776) (-1, _2166) 0 ]", + "EXPR [ (-1, _784) (1, _1913) (1, _2165) (1, _2166) 0 ]", "EXPR [ (1, _783, _784) (-1, _785) 0 ]", "BLACKBOX::RANGE [(_785, 32)] []", - "EXPR [ (1, _785) (-1, _786) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _785) (-1, _786) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _783, _786) (-1, _787) 0 ]", "BLACKBOX::RANGE [(_787, 32)] []", - "EXPR [ (1, _787) (-1, _788) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _787) (-1, _788) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _783, _788) (-1, _789) 0 ]", "BLACKBOX::RANGE [(_789, 32)] []", - "EXPR [ (1, _789) (-1, _790) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _789) (-1, _790) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _783, _790) (-1, _791) 0 ]", "BLACKBOX::RANGE [(_791, 32)] []", "EXPR [ (-1, _783) (-1, _792) 1 ]", - "EXPR [ (-1, _793) (1, _2246) (1, _2247) 0 ]", + "EXPR [ (-1, _793) (1, _2165) (1, _2166) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(791))], q_c: -4864 })], outputs: [Simple(Witness(794))]", "EXPR [ (1, _791, _794) (-4864, _794) (1, _795) -1 ]", "EXPR [ (1, _791, _795) (-4864, _795) 0 ]", @@ -1195,13 +1195,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _791) (-1, _799) 0 ]", "EXPR [ (1, _783, _799) (-1, _800) 0 ]", "BLACKBOX::RANGE [(_800, 32)] []", - "EXPR [ (1, _800) (-1, _801) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _800) (-1, _801) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _783, _801) (-1, _802) 0 ]", "BLACKBOX::RANGE [(_802, 32)] []", - "EXPR [ (1, _802) (-1, _803) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _802) (-1, _803) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _783, _803) (-1, _804) 0 ]", "BLACKBOX::RANGE [(_804, 32)] []", - "EXPR [ (1, _804) (-1, _805) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _804) (-1, _805) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _783, _805) (-1, _806) 0 ]", "BLACKBOX::RANGE [(_806, 32)] []", "EXPR [ (1, _783, _791) (1, _792, _793) (-1, _807) 0 ]", @@ -1214,13 +1214,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _806) (-1, _813) 0 ]", "EXPR [ (1, _783, _813) (-1, _814) 0 ]", "BLACKBOX::RANGE [(_814, 32)] []", - "EXPR [ (1, _814) (-1, _815) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _814) (-1, _815) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _783, _815) (-1, _816) 0 ]", "BLACKBOX::RANGE [(_816, 32)] []", - "EXPR [ (1, _816) (-1, _817) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _816) (-1, _817) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _783, _817) (-1, _818) 0 ]", "BLACKBOX::RANGE [(_818, 32)] []", - "EXPR [ (1, _818) (-1, _819) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _818) (-1, _819) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _783, _819) (-1, _820) 0 ]", "BLACKBOX::RANGE [(_820, 32)] []", "EXPR [ (1, _783, _806) (1, _792, _807) (-1, _821) 0 ]", @@ -1233,13 +1233,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _820) (-1, _827) 0 ]", "EXPR [ (1, _783, _827) (-1, _828) 0 ]", "BLACKBOX::RANGE [(_828, 32)] []", - "EXPR [ (1, _828) (-1, _829) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _828) (-1, _829) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _783, _829) (-1, _830) 0 ]", "BLACKBOX::RANGE [(_830, 32)] []", - "EXPR [ (1, _830) (-1, _831) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _830) (-1, _831) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _783, _831) (-1, _832) 0 ]", "BLACKBOX::RANGE [(_832, 32)] []", - "EXPR [ (1, _832) (-1, _833) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _832) (-1, _833) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _783, _833) (-1, _834) 0 ]", "BLACKBOX::RANGE [(_834, 32)] []", "EXPR [ (1, _783, _820) (1, _792, _821) (-1, _835) 0 ]", @@ -1252,22 +1252,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 14 })], outputs: [Simple(Witness(841))]", "EXPR [ (-1, _0, _841) (14, _841) (1, _842) -1 ]", "EXPR [ (-1, _0, _842) (14, _842) 0 ]", - "EXPR [ (1, _783, _834) (-1, _2262) 0 ]", - "EXPR [ (1, _792, _835) (-1, _2263) 0 ]", - "EXPR [ (-1, _843) (1, _1994) (1, _2262) (1, _2263) 0 ]", + "EXPR [ (1, _783, _834) (-1, _2181) 0 ]", + "EXPR [ (1, _792, _835) (-1, _2182) 0 ]", + "EXPR [ (-1, _843) (1, _1913) (1, _2181) (1, _2182) 0 ]", "EXPR [ (1, _842, _843) (-1, _844) 0 ]", "BLACKBOX::RANGE [(_844, 32)] []", - "EXPR [ (1, _844) (-1, _845) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _844) (-1, _845) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _842, _845) (-1, _846) 0 ]", "BLACKBOX::RANGE [(_846, 32)] []", - "EXPR [ (1, _846) (-1, _847) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _846) (-1, _847) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _842, _847) (-1, _848) 0 ]", "BLACKBOX::RANGE [(_848, 32)] []", - "EXPR [ (1, _848) (-1, _849) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _848) (-1, _849) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _842, _849) (-1, _850) 0 ]", "BLACKBOX::RANGE [(_850, 32)] []", "EXPR [ (-1, _842) (-1, _851) 1 ]", - "EXPR [ (-1, _852) (1, _2262) (1, _2263) 0 ]", + "EXPR [ (-1, _852) (1, _2181) (1, _2182) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(850))], q_c: -4864 })], outputs: [Simple(Witness(853))]", "EXPR [ (1, _850, _853) (-4864, _853) (1, _854) -1 ]", "EXPR [ (1, _850, _854) (-4864, _854) 0 ]", @@ -1277,13 +1277,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _850) (-1, _858) 0 ]", "EXPR [ (1, _842, _858) (-1, _859) 0 ]", "BLACKBOX::RANGE [(_859, 32)] []", - "EXPR [ (1, _859) (-1, _860) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _859) (-1, _860) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _842, _860) (-1, _861) 0 ]", "BLACKBOX::RANGE [(_861, 32)] []", - "EXPR [ (1, _861) (-1, _862) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _861) (-1, _862) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _842, _862) (-1, _863) 0 ]", "BLACKBOX::RANGE [(_863, 32)] []", - "EXPR [ (1, _863) (-1, _864) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _863) (-1, _864) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _842, _864) (-1, _865) 0 ]", "BLACKBOX::RANGE [(_865, 32)] []", "EXPR [ (1, _842, _850) (1, _851, _852) (-1, _866) 0 ]", @@ -1296,13 +1296,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _865) (-1, _872) 0 ]", "EXPR [ (1, _842, _872) (-1, _873) 0 ]", "BLACKBOX::RANGE [(_873, 32)] []", - "EXPR [ (1, _873) (-1, _874) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _873) (-1, _874) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _842, _874) (-1, _875) 0 ]", "BLACKBOX::RANGE [(_875, 32)] []", - "EXPR [ (1, _875) (-1, _876) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _875) (-1, _876) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _842, _876) (-1, _877) 0 ]", "BLACKBOX::RANGE [(_877, 32)] []", - "EXPR [ (1, _877) (-1, _878) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _877) (-1, _878) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _842, _878) (-1, _879) 0 ]", "BLACKBOX::RANGE [(_879, 32)] []", "EXPR [ (1, _842, _865) (1, _851, _866) (-1, _880) 0 ]", @@ -1315,13 +1315,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _879) (-1, _886) 0 ]", "EXPR [ (1, _842, _886) (-1, _887) 0 ]", "BLACKBOX::RANGE [(_887, 32)] []", - "EXPR [ (1, _887) (-1, _888) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _887) (-1, _888) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _842, _888) (-1, _889) 0 ]", "BLACKBOX::RANGE [(_889, 32)] []", - "EXPR [ (1, _889) (-1, _890) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _889) (-1, _890) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _842, _890) (-1, _891) 0 ]", "BLACKBOX::RANGE [(_891, 32)] []", - "EXPR [ (1, _891) (-1, _892) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _891) (-1, _892) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _842, _892) (-1, _893) 0 ]", "BLACKBOX::RANGE [(_893, 32)] []", "EXPR [ (1, _842, _879) (1, _851, _880) (-1, _894) 0 ]", @@ -1334,22 +1334,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 15 })], outputs: [Simple(Witness(900))]", "EXPR [ (-1, _0, _900) (15, _900) (1, _901) -1 ]", "EXPR [ (-1, _0, _901) (15, _901) 0 ]", - "EXPR [ (1, _842, _893) (-1, _2278) 0 ]", - "EXPR [ (1, _851, _894) (-1, _2279) 0 ]", - "EXPR [ (-1, _902) (1, _1994) (1, _2278) (1, _2279) 0 ]", + "EXPR [ (1, _842, _893) (-1, _2197) 0 ]", + "EXPR [ (1, _851, _894) (-1, _2198) 0 ]", + "EXPR [ (-1, _902) (1, _1913) (1, _2197) (1, _2198) 0 ]", "EXPR [ (1, _901, _902) (-1, _903) 0 ]", "BLACKBOX::RANGE [(_903, 32)] []", - "EXPR [ (1, _903) (-1, _904) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _903) (-1, _904) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _901, _904) (-1, _905) 0 ]", "BLACKBOX::RANGE [(_905, 32)] []", - "EXPR [ (1, _905) (-1, _906) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _905) (-1, _906) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _901, _906) (-1, _907) 0 ]", "BLACKBOX::RANGE [(_907, 32)] []", - "EXPR [ (1, _907) (-1, _908) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _907) (-1, _908) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _901, _908) (-1, _909) 0 ]", "BLACKBOX::RANGE [(_909, 32)] []", "EXPR [ (-1, _901) (-1, _910) 1 ]", - "EXPR [ (-1, _911) (1, _2278) (1, _2279) 0 ]", + "EXPR [ (-1, _911) (1, _2197) (1, _2198) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(909))], q_c: -4864 })], outputs: [Simple(Witness(912))]", "EXPR [ (1, _909, _912) (-4864, _912) (1, _913) -1 ]", "EXPR [ (1, _909, _913) (-4864, _913) 0 ]", @@ -1359,13 +1359,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _909) (-1, _917) 0 ]", "EXPR [ (1, _901, _917) (-1, _918) 0 ]", "BLACKBOX::RANGE [(_918, 32)] []", - "EXPR [ (1, _918) (-1, _919) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _918) (-1, _919) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _901, _919) (-1, _920) 0 ]", "BLACKBOX::RANGE [(_920, 32)] []", - "EXPR [ (1, _920) (-1, _921) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _920) (-1, _921) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _901, _921) (-1, _922) 0 ]", "BLACKBOX::RANGE [(_922, 32)] []", - "EXPR [ (1, _922) (-1, _923) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _922) (-1, _923) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _901, _923) (-1, _924) 0 ]", "BLACKBOX::RANGE [(_924, 32)] []", "EXPR [ (1, _901, _909) (1, _910, _911) (-1, _925) 0 ]", @@ -1378,13 +1378,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _924) (-1, _931) 0 ]", "EXPR [ (1, _901, _931) (-1, _932) 0 ]", "BLACKBOX::RANGE [(_932, 32)] []", - "EXPR [ (1, _932) (-1, _933) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _932) (-1, _933) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _901, _933) (-1, _934) 0 ]", "BLACKBOX::RANGE [(_934, 32)] []", - "EXPR [ (1, _934) (-1, _935) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _934) (-1, _935) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _901, _935) (-1, _936) 0 ]", "BLACKBOX::RANGE [(_936, 32)] []", - "EXPR [ (1, _936) (-1, _937) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _936) (-1, _937) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _901, _937) (-1, _938) 0 ]", "BLACKBOX::RANGE [(_938, 32)] []", "EXPR [ (1, _901, _924) (1, _910, _925) (-1, _939) 0 ]", @@ -1397,13 +1397,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _938) (-1, _945) 0 ]", "EXPR [ (1, _901, _945) (-1, _946) 0 ]", "BLACKBOX::RANGE [(_946, 32)] []", - "EXPR [ (1, _946) (-1, _947) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _946) (-1, _947) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _901, _947) (-1, _948) 0 ]", "BLACKBOX::RANGE [(_948, 32)] []", - "EXPR [ (1, _948) (-1, _949) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _948) (-1, _949) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _901, _949) (-1, _950) 0 ]", "BLACKBOX::RANGE [(_950, 32)] []", - "EXPR [ (1, _950) (-1, _951) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _950) (-1, _951) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _901, _951) (-1, _952) 0 ]", "BLACKBOX::RANGE [(_952, 32)] []", "EXPR [ (1, _901, _938) (1, _910, _939) (-1, _953) 0 ]", @@ -1416,22 +1416,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 16 })], outputs: [Simple(Witness(959))]", "EXPR [ (-1, _0, _959) (16, _959) (1, _960) -1 ]", "EXPR [ (-1, _0, _960) (16, _960) 0 ]", - "EXPR [ (1, _901, _952) (-1, _2294) 0 ]", - "EXPR [ (1, _910, _953) (-1, _2295) 0 ]", - "EXPR [ (-1, _961) (1, _1994) (1, _2294) (1, _2295) 0 ]", + "EXPR [ (1, _901, _952) (-1, _2213) 0 ]", + "EXPR [ (1, _910, _953) (-1, _2214) 0 ]", + "EXPR [ (-1, _961) (1, _1913) (1, _2213) (1, _2214) 0 ]", "EXPR [ (1, _960, _961) (-1, _962) 0 ]", "BLACKBOX::RANGE [(_962, 32)] []", - "EXPR [ (1, _962) (-1, _963) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _962) (-1, _963) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _960, _963) (-1, _964) 0 ]", "BLACKBOX::RANGE [(_964, 32)] []", - "EXPR [ (1, _964) (-1, _965) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _964) (-1, _965) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _960, _965) (-1, _966) 0 ]", "BLACKBOX::RANGE [(_966, 32)] []", - "EXPR [ (1, _966) (-1, _967) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _966) (-1, _967) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _960, _967) (-1, _968) 0 ]", "BLACKBOX::RANGE [(_968, 32)] []", "EXPR [ (-1, _960) (-1, _969) 1 ]", - "EXPR [ (-1, _970) (1, _2294) (1, _2295) 0 ]", + "EXPR [ (-1, _970) (1, _2213) (1, _2214) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(968))], q_c: -4864 })], outputs: [Simple(Witness(971))]", "EXPR [ (1, _968, _971) (-4864, _971) (1, _972) -1 ]", "EXPR [ (1, _968, _972) (-4864, _972) 0 ]", @@ -1441,13 +1441,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _968) (-1, _976) 0 ]", "EXPR [ (1, _960, _976) (-1, _977) 0 ]", "BLACKBOX::RANGE [(_977, 32)] []", - "EXPR [ (1, _977) (-1, _978) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _977) (-1, _978) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _960, _978) (-1, _979) 0 ]", "BLACKBOX::RANGE [(_979, 32)] []", - "EXPR [ (1, _979) (-1, _980) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _979) (-1, _980) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _960, _980) (-1, _981) 0 ]", "BLACKBOX::RANGE [(_981, 32)] []", - "EXPR [ (1, _981) (-1, _982) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _981) (-1, _982) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _960, _982) (-1, _983) 0 ]", "BLACKBOX::RANGE [(_983, 32)] []", "EXPR [ (1, _960, _968) (1, _969, _970) (-1, _984) 0 ]", @@ -1460,13 +1460,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _983) (-1, _990) 0 ]", "EXPR [ (1, _960, _990) (-1, _991) 0 ]", "BLACKBOX::RANGE [(_991, 32)] []", - "EXPR [ (1, _991) (-1, _992) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _991) (-1, _992) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _960, _992) (-1, _993) 0 ]", "BLACKBOX::RANGE [(_993, 32)] []", - "EXPR [ (1, _993) (-1, _994) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _993) (-1, _994) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _960, _994) (-1, _995) 0 ]", "BLACKBOX::RANGE [(_995, 32)] []", - "EXPR [ (1, _995) (-1, _996) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _995) (-1, _996) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _960, _996) (-1, _997) 0 ]", "BLACKBOX::RANGE [(_997, 32)] []", "EXPR [ (1, _960, _983) (1, _969, _984) (-1, _998) 0 ]", @@ -1479,13 +1479,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _997) (-1, _1004) 0 ]", "EXPR [ (1, _960, _1004) (-1, _1005) 0 ]", "BLACKBOX::RANGE [(_1005, 32)] []", - "EXPR [ (1, _1005) (-1, _1006) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1005) (-1, _1006) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _960, _1006) (-1, _1007) 0 ]", "BLACKBOX::RANGE [(_1007, 32)] []", - "EXPR [ (1, _1007) (-1, _1008) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1007) (-1, _1008) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _960, _1008) (-1, _1009) 0 ]", "BLACKBOX::RANGE [(_1009, 32)] []", - "EXPR [ (1, _1009) (-1, _1010) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1009) (-1, _1010) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _960, _1010) (-1, _1011) 0 ]", "BLACKBOX::RANGE [(_1011, 32)] []", "EXPR [ (1, _960, _997) (1, _969, _998) (-1, _1012) 0 ]", @@ -1498,22 +1498,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 17 })], outputs: [Simple(Witness(1018))]", "EXPR [ (-1, _0, _1018) (17, _1018) (1, _1019) -1 ]", "EXPR [ (-1, _0, _1019) (17, _1019) 0 ]", - "EXPR [ (1, _960, _1011) (-1, _2310) 0 ]", - "EXPR [ (1, _969, _1012) (-1, _2311) 0 ]", - "EXPR [ (-1, _1020) (1, _1994) (1, _2310) (1, _2311) 0 ]", + "EXPR [ (1, _960, _1011) (-1, _2229) 0 ]", + "EXPR [ (1, _969, _1012) (-1, _2230) 0 ]", + "EXPR [ (-1, _1020) (1, _1913) (1, _2229) (1, _2230) 0 ]", "EXPR [ (1, _1019, _1020) (-1, _1021) 0 ]", "BLACKBOX::RANGE [(_1021, 32)] []", - "EXPR [ (1, _1021) (-1, _1022) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1021) (-1, _1022) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1019, _1022) (-1, _1023) 0 ]", "BLACKBOX::RANGE [(_1023, 32)] []", - "EXPR [ (1, _1023) (-1, _1024) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1023) (-1, _1024) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1019, _1024) (-1, _1025) 0 ]", "BLACKBOX::RANGE [(_1025, 32)] []", - "EXPR [ (1, _1025) (-1, _1026) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1025) (-1, _1026) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1019, _1026) (-1, _1027) 0 ]", "BLACKBOX::RANGE [(_1027, 32)] []", "EXPR [ (-1, _1019) (-1, _1028) 1 ]", - "EXPR [ (-1, _1029) (1, _2310) (1, _2311) 0 ]", + "EXPR [ (-1, _1029) (1, _2229) (1, _2230) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1027))], q_c: -4864 })], outputs: [Simple(Witness(1030))]", "EXPR [ (1, _1027, _1030) (-4864, _1030) (1, _1031) -1 ]", "EXPR [ (1, _1027, _1031) (-4864, _1031) 0 ]", @@ -1523,13 +1523,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1027) (-1, _1035) 0 ]", "EXPR [ (1, _1019, _1035) (-1, _1036) 0 ]", "BLACKBOX::RANGE [(_1036, 32)] []", - "EXPR [ (1, _1036) (-1, _1037) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1036) (-1, _1037) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1019, _1037) (-1, _1038) 0 ]", "BLACKBOX::RANGE [(_1038, 32)] []", - "EXPR [ (1, _1038) (-1, _1039) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1038) (-1, _1039) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1019, _1039) (-1, _1040) 0 ]", "BLACKBOX::RANGE [(_1040, 32)] []", - "EXPR [ (1, _1040) (-1, _1041) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1040) (-1, _1041) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1019, _1041) (-1, _1042) 0 ]", "BLACKBOX::RANGE [(_1042, 32)] []", "EXPR [ (1, _1019, _1027) (1, _1028, _1029) (-1, _1043) 0 ]", @@ -1542,13 +1542,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1042) (-1, _1049) 0 ]", "EXPR [ (1, _1019, _1049) (-1, _1050) 0 ]", "BLACKBOX::RANGE [(_1050, 32)] []", - "EXPR [ (1, _1050) (-1, _1051) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1050) (-1, _1051) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1019, _1051) (-1, _1052) 0 ]", "BLACKBOX::RANGE [(_1052, 32)] []", - "EXPR [ (1, _1052) (-1, _1053) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1052) (-1, _1053) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1019, _1053) (-1, _1054) 0 ]", "BLACKBOX::RANGE [(_1054, 32)] []", - "EXPR [ (1, _1054) (-1, _1055) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1054) (-1, _1055) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1019, _1055) (-1, _1056) 0 ]", "BLACKBOX::RANGE [(_1056, 32)] []", "EXPR [ (1, _1019, _1042) (1, _1028, _1043) (-1, _1057) 0 ]", @@ -1561,13 +1561,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1056) (-1, _1063) 0 ]", "EXPR [ (1, _1019, _1063) (-1, _1064) 0 ]", "BLACKBOX::RANGE [(_1064, 32)] []", - "EXPR [ (1, _1064) (-1, _1065) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1064) (-1, _1065) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1019, _1065) (-1, _1066) 0 ]", "BLACKBOX::RANGE [(_1066, 32)] []", - "EXPR [ (1, _1066) (-1, _1067) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1066) (-1, _1067) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1019, _1067) (-1, _1068) 0 ]", "BLACKBOX::RANGE [(_1068, 32)] []", - "EXPR [ (1, _1068) (-1, _1069) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1068) (-1, _1069) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1019, _1069) (-1, _1070) 0 ]", "BLACKBOX::RANGE [(_1070, 32)] []", "EXPR [ (1, _1019, _1056) (1, _1028, _1057) (-1, _1071) 0 ]", @@ -1580,22 +1580,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 18 })], outputs: [Simple(Witness(1077))]", "EXPR [ (-1, _0, _1077) (18, _1077) (1, _1078) -1 ]", "EXPR [ (-1, _0, _1078) (18, _1078) 0 ]", - "EXPR [ (1, _1019, _1070) (-1, _2326) 0 ]", - "EXPR [ (1, _1028, _1071) (-1, _2327) 0 ]", - "EXPR [ (-1, _1079) (1, _1994) (1, _2326) (1, _2327) 0 ]", + "EXPR [ (1, _1019, _1070) (-1, _2245) 0 ]", + "EXPR [ (1, _1028, _1071) (-1, _2246) 0 ]", + "EXPR [ (-1, _1079) (1, _1913) (1, _2245) (1, _2246) 0 ]", "EXPR [ (1, _1078, _1079) (-1, _1080) 0 ]", "BLACKBOX::RANGE [(_1080, 32)] []", - "EXPR [ (1, _1080) (-1, _1081) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1080) (-1, _1081) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1078, _1081) (-1, _1082) 0 ]", "BLACKBOX::RANGE [(_1082, 32)] []", - "EXPR [ (1, _1082) (-1, _1083) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1082) (-1, _1083) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1078, _1083) (-1, _1084) 0 ]", "BLACKBOX::RANGE [(_1084, 32)] []", - "EXPR [ (1, _1084) (-1, _1085) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1084) (-1, _1085) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1078, _1085) (-1, _1086) 0 ]", "BLACKBOX::RANGE [(_1086, 32)] []", "EXPR [ (-1, _1078) (-1, _1087) 1 ]", - "EXPR [ (-1, _1088) (1, _2326) (1, _2327) 0 ]", + "EXPR [ (-1, _1088) (1, _2245) (1, _2246) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1086))], q_c: -4864 })], outputs: [Simple(Witness(1089))]", "EXPR [ (1, _1086, _1089) (-4864, _1089) (1, _1090) -1 ]", "EXPR [ (1, _1086, _1090) (-4864, _1090) 0 ]", @@ -1605,13 +1605,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1086) (-1, _1094) 0 ]", "EXPR [ (1, _1078, _1094) (-1, _1095) 0 ]", "BLACKBOX::RANGE [(_1095, 32)] []", - "EXPR [ (1, _1095) (-1, _1096) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1095) (-1, _1096) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1078, _1096) (-1, _1097) 0 ]", "BLACKBOX::RANGE [(_1097, 32)] []", - "EXPR [ (1, _1097) (-1, _1098) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1097) (-1, _1098) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1078, _1098) (-1, _1099) 0 ]", "BLACKBOX::RANGE [(_1099, 32)] []", - "EXPR [ (1, _1099) (-1, _1100) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1099) (-1, _1100) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1078, _1100) (-1, _1101) 0 ]", "BLACKBOX::RANGE [(_1101, 32)] []", "EXPR [ (1, _1078, _1086) (1, _1087, _1088) (-1, _1102) 0 ]", @@ -1624,13 +1624,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1101) (-1, _1108) 0 ]", "EXPR [ (1, _1078, _1108) (-1, _1109) 0 ]", "BLACKBOX::RANGE [(_1109, 32)] []", - "EXPR [ (1, _1109) (-1, _1110) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1109) (-1, _1110) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1078, _1110) (-1, _1111) 0 ]", "BLACKBOX::RANGE [(_1111, 32)] []", - "EXPR [ (1, _1111) (-1, _1112) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1111) (-1, _1112) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1078, _1112) (-1, _1113) 0 ]", "BLACKBOX::RANGE [(_1113, 32)] []", - "EXPR [ (1, _1113) (-1, _1114) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1113) (-1, _1114) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1078, _1114) (-1, _1115) 0 ]", "BLACKBOX::RANGE [(_1115, 32)] []", "EXPR [ (1, _1078, _1101) (1, _1087, _1102) (-1, _1116) 0 ]", @@ -1643,13 +1643,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1115) (-1, _1122) 0 ]", "EXPR [ (1, _1078, _1122) (-1, _1123) 0 ]", "BLACKBOX::RANGE [(_1123, 32)] []", - "EXPR [ (1, _1123) (-1, _1124) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1123) (-1, _1124) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1078, _1124) (-1, _1125) 0 ]", "BLACKBOX::RANGE [(_1125, 32)] []", - "EXPR [ (1, _1125) (-1, _1126) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1125) (-1, _1126) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1078, _1126) (-1, _1127) 0 ]", "BLACKBOX::RANGE [(_1127, 32)] []", - "EXPR [ (1, _1127) (-1, _1128) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1127) (-1, _1128) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1078, _1128) (-1, _1129) 0 ]", "BLACKBOX::RANGE [(_1129, 32)] []", "EXPR [ (1, _1078, _1115) (1, _1087, _1116) (-1, _1130) 0 ]", @@ -1662,22 +1662,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 19 })], outputs: [Simple(Witness(1136))]", "EXPR [ (-1, _0, _1136) (19, _1136) (1, _1137) -1 ]", "EXPR [ (-1, _0, _1137) (19, _1137) 0 ]", - "EXPR [ (1, _1078, _1129) (-1, _2342) 0 ]", - "EXPR [ (1, _1087, _1130) (-1, _2343) 0 ]", - "EXPR [ (-1, _1138) (1, _1994) (1, _2342) (1, _2343) 0 ]", + "EXPR [ (1, _1078, _1129) (-1, _2261) 0 ]", + "EXPR [ (1, _1087, _1130) (-1, _2262) 0 ]", + "EXPR [ (-1, _1138) (1, _1913) (1, _2261) (1, _2262) 0 ]", "EXPR [ (1, _1137, _1138) (-1, _1139) 0 ]", "BLACKBOX::RANGE [(_1139, 32)] []", - "EXPR [ (1, _1139) (-1, _1140) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1139) (-1, _1140) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1137, _1140) (-1, _1141) 0 ]", "BLACKBOX::RANGE [(_1141, 32)] []", - "EXPR [ (1, _1141) (-1, _1142) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1141) (-1, _1142) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1137, _1142) (-1, _1143) 0 ]", "BLACKBOX::RANGE [(_1143, 32)] []", - "EXPR [ (1, _1143) (-1, _1144) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1143) (-1, _1144) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1137, _1144) (-1, _1145) 0 ]", "BLACKBOX::RANGE [(_1145, 32)] []", "EXPR [ (-1, _1137) (-1, _1146) 1 ]", - "EXPR [ (-1, _1147) (1, _2342) (1, _2343) 0 ]", + "EXPR [ (-1, _1147) (1, _2261) (1, _2262) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1145))], q_c: -4864 })], outputs: [Simple(Witness(1148))]", "EXPR [ (1, _1145, _1148) (-4864, _1148) (1, _1149) -1 ]", "EXPR [ (1, _1145, _1149) (-4864, _1149) 0 ]", @@ -1687,13 +1687,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1145) (-1, _1153) 0 ]", "EXPR [ (1, _1137, _1153) (-1, _1154) 0 ]", "BLACKBOX::RANGE [(_1154, 32)] []", - "EXPR [ (1, _1154) (-1, _1155) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1154) (-1, _1155) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1137, _1155) (-1, _1156) 0 ]", "BLACKBOX::RANGE [(_1156, 32)] []", - "EXPR [ (1, _1156) (-1, _1157) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1156) (-1, _1157) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1137, _1157) (-1, _1158) 0 ]", "BLACKBOX::RANGE [(_1158, 32)] []", - "EXPR [ (1, _1158) (-1, _1159) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1158) (-1, _1159) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1137, _1159) (-1, _1160) 0 ]", "BLACKBOX::RANGE [(_1160, 32)] []", "EXPR [ (1, _1137, _1145) (1, _1146, _1147) (-1, _1161) 0 ]", @@ -1706,13 +1706,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1160) (-1, _1167) 0 ]", "EXPR [ (1, _1137, _1167) (-1, _1168) 0 ]", "BLACKBOX::RANGE [(_1168, 32)] []", - "EXPR [ (1, _1168) (-1, _1169) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1168) (-1, _1169) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1137, _1169) (-1, _1170) 0 ]", "BLACKBOX::RANGE [(_1170, 32)] []", - "EXPR [ (1, _1170) (-1, _1171) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1170) (-1, _1171) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1137, _1171) (-1, _1172) 0 ]", "BLACKBOX::RANGE [(_1172, 32)] []", - "EXPR [ (1, _1172) (-1, _1173) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1172) (-1, _1173) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1137, _1173) (-1, _1174) 0 ]", "BLACKBOX::RANGE [(_1174, 32)] []", "EXPR [ (1, _1137, _1160) (1, _1146, _1161) (-1, _1175) 0 ]", @@ -1725,13 +1725,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1174) (-1, _1181) 0 ]", "EXPR [ (1, _1137, _1181) (-1, _1182) 0 ]", "BLACKBOX::RANGE [(_1182, 32)] []", - "EXPR [ (1, _1182) (-1, _1183) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1182) (-1, _1183) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1137, _1183) (-1, _1184) 0 ]", "BLACKBOX::RANGE [(_1184, 32)] []", - "EXPR [ (1, _1184) (-1, _1185) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1184) (-1, _1185) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1137, _1185) (-1, _1186) 0 ]", "BLACKBOX::RANGE [(_1186, 32)] []", - "EXPR [ (1, _1186) (-1, _1187) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1186) (-1, _1187) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1137, _1187) (-1, _1188) 0 ]", "BLACKBOX::RANGE [(_1188, 32)] []", "EXPR [ (1, _1137, _1174) (1, _1146, _1175) (-1, _1189) 0 ]", @@ -1744,22 +1744,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 20 })], outputs: [Simple(Witness(1195))]", "EXPR [ (-1, _0, _1195) (20, _1195) (1, _1196) -1 ]", "EXPR [ (-1, _0, _1196) (20, _1196) 0 ]", - "EXPR [ (1, _1137, _1188) (-1, _2358) 0 ]", - "EXPR [ (1, _1146, _1189) (-1, _2359) 0 ]", - "EXPR [ (-1, _1197) (1, _1994) (1, _2358) (1, _2359) 0 ]", + "EXPR [ (1, _1137, _1188) (-1, _2277) 0 ]", + "EXPR [ (1, _1146, _1189) (-1, _2278) 0 ]", + "EXPR [ (-1, _1197) (1, _1913) (1, _2277) (1, _2278) 0 ]", "EXPR [ (1, _1196, _1197) (-1, _1198) 0 ]", "BLACKBOX::RANGE [(_1198, 32)] []", - "EXPR [ (1, _1198) (-1, _1199) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1198) (-1, _1199) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1196, _1199) (-1, _1200) 0 ]", "BLACKBOX::RANGE [(_1200, 32)] []", - "EXPR [ (1, _1200) (-1, _1201) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1200) (-1, _1201) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1196, _1201) (-1, _1202) 0 ]", "BLACKBOX::RANGE [(_1202, 32)] []", - "EXPR [ (1, _1202) (-1, _1203) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1202) (-1, _1203) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1196, _1203) (-1, _1204) 0 ]", "BLACKBOX::RANGE [(_1204, 32)] []", "EXPR [ (-1, _1196) (-1, _1205) 1 ]", - "EXPR [ (-1, _1206) (1, _2358) (1, _2359) 0 ]", + "EXPR [ (-1, _1206) (1, _2277) (1, _2278) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1204))], q_c: -4864 })], outputs: [Simple(Witness(1207))]", "EXPR [ (1, _1204, _1207) (-4864, _1207) (1, _1208) -1 ]", "EXPR [ (1, _1204, _1208) (-4864, _1208) 0 ]", @@ -1769,13 +1769,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1204) (-1, _1212) 0 ]", "EXPR [ (1, _1196, _1212) (-1, _1213) 0 ]", "BLACKBOX::RANGE [(_1213, 32)] []", - "EXPR [ (1, _1213) (-1, _1214) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1213) (-1, _1214) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1196, _1214) (-1, _1215) 0 ]", "BLACKBOX::RANGE [(_1215, 32)] []", - "EXPR [ (1, _1215) (-1, _1216) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1215) (-1, _1216) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1196, _1216) (-1, _1217) 0 ]", "BLACKBOX::RANGE [(_1217, 32)] []", - "EXPR [ (1, _1217) (-1, _1218) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1217) (-1, _1218) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1196, _1218) (-1, _1219) 0 ]", "BLACKBOX::RANGE [(_1219, 32)] []", "EXPR [ (1, _1196, _1204) (1, _1205, _1206) (-1, _1220) 0 ]", @@ -1788,13 +1788,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1219) (-1, _1226) 0 ]", "EXPR [ (1, _1196, _1226) (-1, _1227) 0 ]", "BLACKBOX::RANGE [(_1227, 32)] []", - "EXPR [ (1, _1227) (-1, _1228) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1227) (-1, _1228) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1196, _1228) (-1, _1229) 0 ]", "BLACKBOX::RANGE [(_1229, 32)] []", - "EXPR [ (1, _1229) (-1, _1230) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1229) (-1, _1230) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1196, _1230) (-1, _1231) 0 ]", "BLACKBOX::RANGE [(_1231, 32)] []", - "EXPR [ (1, _1231) (-1, _1232) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1231) (-1, _1232) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1196, _1232) (-1, _1233) 0 ]", "BLACKBOX::RANGE [(_1233, 32)] []", "EXPR [ (1, _1196, _1219) (1, _1205, _1220) (-1, _1234) 0 ]", @@ -1807,13 +1807,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1233) (-1, _1240) 0 ]", "EXPR [ (1, _1196, _1240) (-1, _1241) 0 ]", "BLACKBOX::RANGE [(_1241, 32)] []", - "EXPR [ (1, _1241) (-1, _1242) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1241) (-1, _1242) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1196, _1242) (-1, _1243) 0 ]", "BLACKBOX::RANGE [(_1243, 32)] []", - "EXPR [ (1, _1243) (-1, _1244) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1243) (-1, _1244) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1196, _1244) (-1, _1245) 0 ]", "BLACKBOX::RANGE [(_1245, 32)] []", - "EXPR [ (1, _1245) (-1, _1246) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1245) (-1, _1246) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1196, _1246) (-1, _1247) 0 ]", "BLACKBOX::RANGE [(_1247, 32)] []", "EXPR [ (1, _1196, _1233) (1, _1205, _1234) (-1, _1248) 0 ]", @@ -1826,22 +1826,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 21 })], outputs: [Simple(Witness(1254))]", "EXPR [ (-1, _0, _1254) (21, _1254) (1, _1255) -1 ]", "EXPR [ (-1, _0, _1255) (21, _1255) 0 ]", - "EXPR [ (1, _1196, _1247) (-1, _2374) 0 ]", - "EXPR [ (1, _1205, _1248) (-1, _2375) 0 ]", - "EXPR [ (-1, _1256) (1, _1994) (1, _2374) (1, _2375) 0 ]", + "EXPR [ (1, _1196, _1247) (-1, _2293) 0 ]", + "EXPR [ (1, _1205, _1248) (-1, _2294) 0 ]", + "EXPR [ (-1, _1256) (1, _1913) (1, _2293) (1, _2294) 0 ]", "EXPR [ (1, _1255, _1256) (-1, _1257) 0 ]", "BLACKBOX::RANGE [(_1257, 32)] []", - "EXPR [ (1, _1257) (-1, _1258) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1257) (-1, _1258) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1255, _1258) (-1, _1259) 0 ]", "BLACKBOX::RANGE [(_1259, 32)] []", - "EXPR [ (1, _1259) (-1, _1260) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1259) (-1, _1260) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1255, _1260) (-1, _1261) 0 ]", "BLACKBOX::RANGE [(_1261, 32)] []", - "EXPR [ (1, _1261) (-1, _1262) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1261) (-1, _1262) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1255, _1262) (-1, _1263) 0 ]", "BLACKBOX::RANGE [(_1263, 32)] []", "EXPR [ (-1, _1255) (-1, _1264) 1 ]", - "EXPR [ (-1, _1265) (1, _2374) (1, _2375) 0 ]", + "EXPR [ (-1, _1265) (1, _2293) (1, _2294) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1263))], q_c: -4864 })], outputs: [Simple(Witness(1266))]", "EXPR [ (1, _1263, _1266) (-4864, _1266) (1, _1267) -1 ]", "EXPR [ (1, _1263, _1267) (-4864, _1267) 0 ]", @@ -1851,13 +1851,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1263) (-1, _1271) 0 ]", "EXPR [ (1, _1255, _1271) (-1, _1272) 0 ]", "BLACKBOX::RANGE [(_1272, 32)] []", - "EXPR [ (1, _1272) (-1, _1273) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1272) (-1, _1273) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1255, _1273) (-1, _1274) 0 ]", "BLACKBOX::RANGE [(_1274, 32)] []", - "EXPR [ (1, _1274) (-1, _1275) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1274) (-1, _1275) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1255, _1275) (-1, _1276) 0 ]", "BLACKBOX::RANGE [(_1276, 32)] []", - "EXPR [ (1, _1276) (-1, _1277) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1276) (-1, _1277) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1255, _1277) (-1, _1278) 0 ]", "BLACKBOX::RANGE [(_1278, 32)] []", "EXPR [ (1, _1255, _1263) (1, _1264, _1265) (-1, _1279) 0 ]", @@ -1870,13 +1870,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1278) (-1, _1285) 0 ]", "EXPR [ (1, _1255, _1285) (-1, _1286) 0 ]", "BLACKBOX::RANGE [(_1286, 32)] []", - "EXPR [ (1, _1286) (-1, _1287) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1286) (-1, _1287) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1255, _1287) (-1, _1288) 0 ]", "BLACKBOX::RANGE [(_1288, 32)] []", - "EXPR [ (1, _1288) (-1, _1289) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1288) (-1, _1289) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1255, _1289) (-1, _1290) 0 ]", "BLACKBOX::RANGE [(_1290, 32)] []", - "EXPR [ (1, _1290) (-1, _1291) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1290) (-1, _1291) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1255, _1291) (-1, _1292) 0 ]", "BLACKBOX::RANGE [(_1292, 32)] []", "EXPR [ (1, _1255, _1278) (1, _1264, _1279) (-1, _1293) 0 ]", @@ -1889,13 +1889,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1292) (-1, _1299) 0 ]", "EXPR [ (1, _1255, _1299) (-1, _1300) 0 ]", "BLACKBOX::RANGE [(_1300, 32)] []", - "EXPR [ (1, _1300) (-1, _1301) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1300) (-1, _1301) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1255, _1301) (-1, _1302) 0 ]", "BLACKBOX::RANGE [(_1302, 32)] []", - "EXPR [ (1, _1302) (-1, _1303) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1302) (-1, _1303) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1255, _1303) (-1, _1304) 0 ]", "BLACKBOX::RANGE [(_1304, 32)] []", - "EXPR [ (1, _1304) (-1, _1305) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1304) (-1, _1305) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1255, _1305) (-1, _1306) 0 ]", "BLACKBOX::RANGE [(_1306, 32)] []", "EXPR [ (1, _1255, _1292) (1, _1264, _1293) (-1, _1307) 0 ]", @@ -1908,22 +1908,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 22 })], outputs: [Simple(Witness(1313))]", "EXPR [ (-1, _0, _1313) (22, _1313) (1, _1314) -1 ]", "EXPR [ (-1, _0, _1314) (22, _1314) 0 ]", - "EXPR [ (1, _1255, _1306) (-1, _2390) 0 ]", - "EXPR [ (1, _1264, _1307) (-1, _2391) 0 ]", - "EXPR [ (-1, _1315) (1, _1994) (1, _2390) (1, _2391) 0 ]", + "EXPR [ (1, _1255, _1306) (-1, _2309) 0 ]", + "EXPR [ (1, _1264, _1307) (-1, _2310) 0 ]", + "EXPR [ (-1, _1315) (1, _1913) (1, _2309) (1, _2310) 0 ]", "EXPR [ (1, _1314, _1315) (-1, _1316) 0 ]", "BLACKBOX::RANGE [(_1316, 32)] []", - "EXPR [ (1, _1316) (-1, _1317) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1316) (-1, _1317) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1314, _1317) (-1, _1318) 0 ]", "BLACKBOX::RANGE [(_1318, 32)] []", - "EXPR [ (1, _1318) (-1, _1319) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1318) (-1, _1319) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1314, _1319) (-1, _1320) 0 ]", "BLACKBOX::RANGE [(_1320, 32)] []", - "EXPR [ (1, _1320) (-1, _1321) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1320) (-1, _1321) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1314, _1321) (-1, _1322) 0 ]", "BLACKBOX::RANGE [(_1322, 32)] []", "EXPR [ (-1, _1314) (-1, _1323) 1 ]", - "EXPR [ (-1, _1324) (1, _2390) (1, _2391) 0 ]", + "EXPR [ (-1, _1324) (1, _2309) (1, _2310) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1322))], q_c: -4864 })], outputs: [Simple(Witness(1325))]", "EXPR [ (1, _1322, _1325) (-4864, _1325) (1, _1326) -1 ]", "EXPR [ (1, _1322, _1326) (-4864, _1326) 0 ]", @@ -1933,13 +1933,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1322) (-1, _1330) 0 ]", "EXPR [ (1, _1314, _1330) (-1, _1331) 0 ]", "BLACKBOX::RANGE [(_1331, 32)] []", - "EXPR [ (1, _1331) (-1, _1332) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1331) (-1, _1332) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1314, _1332) (-1, _1333) 0 ]", "BLACKBOX::RANGE [(_1333, 32)] []", - "EXPR [ (1, _1333) (-1, _1334) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1333) (-1, _1334) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1314, _1334) (-1, _1335) 0 ]", "BLACKBOX::RANGE [(_1335, 32)] []", - "EXPR [ (1, _1335) (-1, _1336) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1335) (-1, _1336) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1314, _1336) (-1, _1337) 0 ]", "BLACKBOX::RANGE [(_1337, 32)] []", "EXPR [ (1, _1314, _1322) (1, _1323, _1324) (-1, _1338) 0 ]", @@ -1952,13 +1952,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1337) (-1, _1344) 0 ]", "EXPR [ (1, _1314, _1344) (-1, _1345) 0 ]", "BLACKBOX::RANGE [(_1345, 32)] []", - "EXPR [ (1, _1345) (-1, _1346) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1345) (-1, _1346) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1314, _1346) (-1, _1347) 0 ]", "BLACKBOX::RANGE [(_1347, 32)] []", - "EXPR [ (1, _1347) (-1, _1348) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1347) (-1, _1348) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1314, _1348) (-1, _1349) 0 ]", "BLACKBOX::RANGE [(_1349, 32)] []", - "EXPR [ (1, _1349) (-1, _1350) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1349) (-1, _1350) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1314, _1350) (-1, _1351) 0 ]", "BLACKBOX::RANGE [(_1351, 32)] []", "EXPR [ (1, _1314, _1337) (1, _1323, _1338) (-1, _1352) 0 ]", @@ -1971,13 +1971,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1351) (-1, _1358) 0 ]", "EXPR [ (1, _1314, _1358) (-1, _1359) 0 ]", "BLACKBOX::RANGE [(_1359, 32)] []", - "EXPR [ (1, _1359) (-1, _1360) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1359) (-1, _1360) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1314, _1360) (-1, _1361) 0 ]", "BLACKBOX::RANGE [(_1361, 32)] []", - "EXPR [ (1, _1361) (-1, _1362) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1361) (-1, _1362) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1314, _1362) (-1, _1363) 0 ]", "BLACKBOX::RANGE [(_1363, 32)] []", - "EXPR [ (1, _1363) (-1, _1364) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1363) (-1, _1364) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1314, _1364) (-1, _1365) 0 ]", "BLACKBOX::RANGE [(_1365, 32)] []", "EXPR [ (1, _1314, _1351) (1, _1323, _1352) (-1, _1366) 0 ]", @@ -1990,22 +1990,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 23 })], outputs: [Simple(Witness(1372))]", "EXPR [ (-1, _0, _1372) (23, _1372) (1, _1373) -1 ]", "EXPR [ (-1, _0, _1373) (23, _1373) 0 ]", - "EXPR [ (1, _1314, _1365) (-1, _2406) 0 ]", - "EXPR [ (1, _1323, _1366) (-1, _2407) 0 ]", - "EXPR [ (-1, _1374) (1, _1994) (1, _2406) (1, _2407) 0 ]", + "EXPR [ (1, _1314, _1365) (-1, _2325) 0 ]", + "EXPR [ (1, _1323, _1366) (-1, _2326) 0 ]", + "EXPR [ (-1, _1374) (1, _1913) (1, _2325) (1, _2326) 0 ]", "EXPR [ (1, _1373, _1374) (-1, _1375) 0 ]", "BLACKBOX::RANGE [(_1375, 32)] []", - "EXPR [ (1, _1375) (-1, _1376) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1375) (-1, _1376) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1373, _1376) (-1, _1377) 0 ]", "BLACKBOX::RANGE [(_1377, 32)] []", - "EXPR [ (1, _1377) (-1, _1378) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1377) (-1, _1378) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1373, _1378) (-1, _1379) 0 ]", "BLACKBOX::RANGE [(_1379, 32)] []", - "EXPR [ (1, _1379) (-1, _1380) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1379) (-1, _1380) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1373, _1380) (-1, _1381) 0 ]", "BLACKBOX::RANGE [(_1381, 32)] []", "EXPR [ (-1, _1373) (-1, _1382) 1 ]", - "EXPR [ (-1, _1383) (1, _2406) (1, _2407) 0 ]", + "EXPR [ (-1, _1383) (1, _2325) (1, _2326) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1381))], q_c: -4864 })], outputs: [Simple(Witness(1384))]", "EXPR [ (1, _1381, _1384) (-4864, _1384) (1, _1385) -1 ]", "EXPR [ (1, _1381, _1385) (-4864, _1385) 0 ]", @@ -2015,13 +2015,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1381) (-1, _1389) 0 ]", "EXPR [ (1, _1373, _1389) (-1, _1390) 0 ]", "BLACKBOX::RANGE [(_1390, 32)] []", - "EXPR [ (1, _1390) (-1, _1391) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1390) (-1, _1391) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1373, _1391) (-1, _1392) 0 ]", "BLACKBOX::RANGE [(_1392, 32)] []", - "EXPR [ (1, _1392) (-1, _1393) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1392) (-1, _1393) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1373, _1393) (-1, _1394) 0 ]", "BLACKBOX::RANGE [(_1394, 32)] []", - "EXPR [ (1, _1394) (-1, _1395) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1394) (-1, _1395) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1373, _1395) (-1, _1396) 0 ]", "BLACKBOX::RANGE [(_1396, 32)] []", "EXPR [ (1, _1373, _1381) (1, _1382, _1383) (-1, _1397) 0 ]", @@ -2034,13 +2034,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1396) (-1, _1403) 0 ]", "EXPR [ (1, _1373, _1403) (-1, _1404) 0 ]", "BLACKBOX::RANGE [(_1404, 32)] []", - "EXPR [ (1, _1404) (-1, _1405) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1404) (-1, _1405) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1373, _1405) (-1, _1406) 0 ]", "BLACKBOX::RANGE [(_1406, 32)] []", - "EXPR [ (1, _1406) (-1, _1407) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1406) (-1, _1407) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1373, _1407) (-1, _1408) 0 ]", "BLACKBOX::RANGE [(_1408, 32)] []", - "EXPR [ (1, _1408) (-1, _1409) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1408) (-1, _1409) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1373, _1409) (-1, _1410) 0 ]", "BLACKBOX::RANGE [(_1410, 32)] []", "EXPR [ (1, _1373, _1396) (1, _1382, _1397) (-1, _1411) 0 ]", @@ -2053,13 +2053,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1410) (-1, _1417) 0 ]", "EXPR [ (1, _1373, _1417) (-1, _1418) 0 ]", "BLACKBOX::RANGE [(_1418, 32)] []", - "EXPR [ (1, _1418) (-1, _1419) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1418) (-1, _1419) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1373, _1419) (-1, _1420) 0 ]", "BLACKBOX::RANGE [(_1420, 32)] []", - "EXPR [ (1, _1420) (-1, _1421) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1420) (-1, _1421) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1373, _1421) (-1, _1422) 0 ]", "BLACKBOX::RANGE [(_1422, 32)] []", - "EXPR [ (1, _1422) (-1, _1423) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1422) (-1, _1423) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1373, _1423) (-1, _1424) 0 ]", "BLACKBOX::RANGE [(_1424, 32)] []", "EXPR [ (1, _1373, _1410) (1, _1382, _1411) (-1, _1425) 0 ]", @@ -2072,22 +2072,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 24 })], outputs: [Simple(Witness(1431))]", "EXPR [ (-1, _0, _1431) (24, _1431) (1, _1432) -1 ]", "EXPR [ (-1, _0, _1432) (24, _1432) 0 ]", - "EXPR [ (1, _1373, _1424) (-1, _2422) 0 ]", - "EXPR [ (1, _1382, _1425) (-1, _2423) 0 ]", - "EXPR [ (-1, _1433) (1, _1994) (1, _2422) (1, _2423) 0 ]", + "EXPR [ (1, _1373, _1424) (-1, _2341) 0 ]", + "EXPR [ (1, _1382, _1425) (-1, _2342) 0 ]", + "EXPR [ (-1, _1433) (1, _1913) (1, _2341) (1, _2342) 0 ]", "EXPR [ (1, _1432, _1433) (-1, _1434) 0 ]", "BLACKBOX::RANGE [(_1434, 32)] []", - "EXPR [ (1, _1434) (-1, _1435) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1434) (-1, _1435) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1432, _1435) (-1, _1436) 0 ]", "BLACKBOX::RANGE [(_1436, 32)] []", - "EXPR [ (1, _1436) (-1, _1437) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1436) (-1, _1437) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1432, _1437) (-1, _1438) 0 ]", "BLACKBOX::RANGE [(_1438, 32)] []", - "EXPR [ (1, _1438) (-1, _1439) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1438) (-1, _1439) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1432, _1439) (-1, _1440) 0 ]", "BLACKBOX::RANGE [(_1440, 32)] []", "EXPR [ (-1, _1432) (-1, _1441) 1 ]", - "EXPR [ (-1, _1442) (1, _2422) (1, _2423) 0 ]", + "EXPR [ (-1, _1442) (1, _2341) (1, _2342) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1440))], q_c: -4864 })], outputs: [Simple(Witness(1443))]", "EXPR [ (1, _1440, _1443) (-4864, _1443) (1, _1444) -1 ]", "EXPR [ (1, _1440, _1444) (-4864, _1444) 0 ]", @@ -2097,13 +2097,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1440) (-1, _1448) 0 ]", "EXPR [ (1, _1432, _1448) (-1, _1449) 0 ]", "BLACKBOX::RANGE [(_1449, 32)] []", - "EXPR [ (1, _1449) (-1, _1450) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1449) (-1, _1450) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1432, _1450) (-1, _1451) 0 ]", "BLACKBOX::RANGE [(_1451, 32)] []", - "EXPR [ (1, _1451) (-1, _1452) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1451) (-1, _1452) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1432, _1452) (-1, _1453) 0 ]", "BLACKBOX::RANGE [(_1453, 32)] []", - "EXPR [ (1, _1453) (-1, _1454) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1453) (-1, _1454) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1432, _1454) (-1, _1455) 0 ]", "BLACKBOX::RANGE [(_1455, 32)] []", "EXPR [ (1, _1432, _1440) (1, _1441, _1442) (-1, _1456) 0 ]", @@ -2116,13 +2116,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1455) (-1, _1462) 0 ]", "EXPR [ (1, _1432, _1462) (-1, _1463) 0 ]", "BLACKBOX::RANGE [(_1463, 32)] []", - "EXPR [ (1, _1463) (-1, _1464) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1463) (-1, _1464) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1432, _1464) (-1, _1465) 0 ]", "BLACKBOX::RANGE [(_1465, 32)] []", - "EXPR [ (1, _1465) (-1, _1466) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1465) (-1, _1466) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1432, _1466) (-1, _1467) 0 ]", "BLACKBOX::RANGE [(_1467, 32)] []", - "EXPR [ (1, _1467) (-1, _1468) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1467) (-1, _1468) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1432, _1468) (-1, _1469) 0 ]", "BLACKBOX::RANGE [(_1469, 32)] []", "EXPR [ (1, _1432, _1455) (1, _1441, _1456) (-1, _1470) 0 ]", @@ -2135,13 +2135,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1469) (-1, _1476) 0 ]", "EXPR [ (1, _1432, _1476) (-1, _1477) 0 ]", "BLACKBOX::RANGE [(_1477, 32)] []", - "EXPR [ (1, _1477) (-1, _1478) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1477) (-1, _1478) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1432, _1478) (-1, _1479) 0 ]", "BLACKBOX::RANGE [(_1479, 32)] []", - "EXPR [ (1, _1479) (-1, _1480) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1479) (-1, _1480) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1432, _1480) (-1, _1481) 0 ]", "BLACKBOX::RANGE [(_1481, 32)] []", - "EXPR [ (1, _1481) (-1, _1482) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1481) (-1, _1482) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1432, _1482) (-1, _1483) 0 ]", "BLACKBOX::RANGE [(_1483, 32)] []", "EXPR [ (1, _1432, _1469) (1, _1441, _1470) (-1, _1484) 0 ]", @@ -2154,22 +2154,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 25 })], outputs: [Simple(Witness(1490))]", "EXPR [ (-1, _0, _1490) (25, _1490) (1, _1491) -1 ]", "EXPR [ (-1, _0, _1491) (25, _1491) 0 ]", - "EXPR [ (1, _1432, _1483) (-1, _2438) 0 ]", - "EXPR [ (1, _1441, _1484) (-1, _2439) 0 ]", - "EXPR [ (-1, _1492) (1, _1994) (1, _2438) (1, _2439) 0 ]", + "EXPR [ (1, _1432, _1483) (-1, _2357) 0 ]", + "EXPR [ (1, _1441, _1484) (-1, _2358) 0 ]", + "EXPR [ (-1, _1492) (1, _1913) (1, _2357) (1, _2358) 0 ]", "EXPR [ (1, _1491, _1492) (-1, _1493) 0 ]", "BLACKBOX::RANGE [(_1493, 32)] []", - "EXPR [ (1, _1493) (-1, _1494) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1493) (-1, _1494) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1491, _1494) (-1, _1495) 0 ]", "BLACKBOX::RANGE [(_1495, 32)] []", - "EXPR [ (1, _1495) (-1, _1496) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1495) (-1, _1496) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1491, _1496) (-1, _1497) 0 ]", "BLACKBOX::RANGE [(_1497, 32)] []", - "EXPR [ (1, _1497) (-1, _1498) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1497) (-1, _1498) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1491, _1498) (-1, _1499) 0 ]", "BLACKBOX::RANGE [(_1499, 32)] []", "EXPR [ (-1, _1491) (-1, _1500) 1 ]", - "EXPR [ (-1, _1501) (1, _2438) (1, _2439) 0 ]", + "EXPR [ (-1, _1501) (1, _2357) (1, _2358) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1499))], q_c: -4864 })], outputs: [Simple(Witness(1502))]", "EXPR [ (1, _1499, _1502) (-4864, _1502) (1, _1503) -1 ]", "EXPR [ (1, _1499, _1503) (-4864, _1503) 0 ]", @@ -2179,13 +2179,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1499) (-1, _1507) 0 ]", "EXPR [ (1, _1491, _1507) (-1, _1508) 0 ]", "BLACKBOX::RANGE [(_1508, 32)] []", - "EXPR [ (1, _1508) (-1, _1509) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1508) (-1, _1509) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1491, _1509) (-1, _1510) 0 ]", "BLACKBOX::RANGE [(_1510, 32)] []", - "EXPR [ (1, _1510) (-1, _1511) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1510) (-1, _1511) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1491, _1511) (-1, _1512) 0 ]", "BLACKBOX::RANGE [(_1512, 32)] []", - "EXPR [ (1, _1512) (-1, _1513) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1512) (-1, _1513) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1491, _1513) (-1, _1514) 0 ]", "BLACKBOX::RANGE [(_1514, 32)] []", "EXPR [ (1, _1491, _1499) (1, _1500, _1501) (-1, _1515) 0 ]", @@ -2198,13 +2198,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1514) (-1, _1521) 0 ]", "EXPR [ (1, _1491, _1521) (-1, _1522) 0 ]", "BLACKBOX::RANGE [(_1522, 32)] []", - "EXPR [ (1, _1522) (-1, _1523) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1522) (-1, _1523) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1491, _1523) (-1, _1524) 0 ]", "BLACKBOX::RANGE [(_1524, 32)] []", - "EXPR [ (1, _1524) (-1, _1525) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1524) (-1, _1525) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1491, _1525) (-1, _1526) 0 ]", "BLACKBOX::RANGE [(_1526, 32)] []", - "EXPR [ (1, _1526) (-1, _1527) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1526) (-1, _1527) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1491, _1527) (-1, _1528) 0 ]", "BLACKBOX::RANGE [(_1528, 32)] []", "EXPR [ (1, _1491, _1514) (1, _1500, _1515) (-1, _1529) 0 ]", @@ -2217,13 +2217,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1528) (-1, _1535) 0 ]", "EXPR [ (1, _1491, _1535) (-1, _1536) 0 ]", "BLACKBOX::RANGE [(_1536, 32)] []", - "EXPR [ (1, _1536) (-1, _1537) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1536) (-1, _1537) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1491, _1537) (-1, _1538) 0 ]", "BLACKBOX::RANGE [(_1538, 32)] []", - "EXPR [ (1, _1538) (-1, _1539) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1538) (-1, _1539) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1491, _1539) (-1, _1540) 0 ]", "BLACKBOX::RANGE [(_1540, 32)] []", - "EXPR [ (1, _1540) (-1, _1541) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1540) (-1, _1541) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1491, _1541) (-1, _1542) 0 ]", "BLACKBOX::RANGE [(_1542, 32)] []", "EXPR [ (1, _1491, _1528) (1, _1500, _1529) (-1, _1543) 0 ]", @@ -2236,22 +2236,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 26 })], outputs: [Simple(Witness(1549))]", "EXPR [ (-1, _0, _1549) (26, _1549) (1, _1550) -1 ]", "EXPR [ (-1, _0, _1550) (26, _1550) 0 ]", - "EXPR [ (1, _1491, _1542) (-1, _2454) 0 ]", - "EXPR [ (1, _1500, _1543) (-1, _2455) 0 ]", - "EXPR [ (-1, _1551) (1, _1994) (1, _2454) (1, _2455) 0 ]", + "EXPR [ (1, _1491, _1542) (-1, _2373) 0 ]", + "EXPR [ (1, _1500, _1543) (-1, _2374) 0 ]", + "EXPR [ (-1, _1551) (1, _1913) (1, _2373) (1, _2374) 0 ]", "EXPR [ (1, _1550, _1551) (-1, _1552) 0 ]", "BLACKBOX::RANGE [(_1552, 32)] []", - "EXPR [ (1, _1552) (-1, _1553) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1552) (-1, _1553) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1550, _1553) (-1, _1554) 0 ]", "BLACKBOX::RANGE [(_1554, 32)] []", - "EXPR [ (1, _1554) (-1, _1555) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1554) (-1, _1555) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1550, _1555) (-1, _1556) 0 ]", "BLACKBOX::RANGE [(_1556, 32)] []", - "EXPR [ (1, _1556) (-1, _1557) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1556) (-1, _1557) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1550, _1557) (-1, _1558) 0 ]", "BLACKBOX::RANGE [(_1558, 32)] []", "EXPR [ (-1, _1550) (-1, _1559) 1 ]", - "EXPR [ (-1, _1560) (1, _2454) (1, _2455) 0 ]", + "EXPR [ (-1, _1560) (1, _2373) (1, _2374) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1558))], q_c: -4864 })], outputs: [Simple(Witness(1561))]", "EXPR [ (1, _1558, _1561) (-4864, _1561) (1, _1562) -1 ]", "EXPR [ (1, _1558, _1562) (-4864, _1562) 0 ]", @@ -2261,13 +2261,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1558) (-1, _1566) 0 ]", "EXPR [ (1, _1550, _1566) (-1, _1567) 0 ]", "BLACKBOX::RANGE [(_1567, 32)] []", - "EXPR [ (1, _1567) (-1, _1568) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1567) (-1, _1568) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1550, _1568) (-1, _1569) 0 ]", "BLACKBOX::RANGE [(_1569, 32)] []", - "EXPR [ (1, _1569) (-1, _1570) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1569) (-1, _1570) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1550, _1570) (-1, _1571) 0 ]", "BLACKBOX::RANGE [(_1571, 32)] []", - "EXPR [ (1, _1571) (-1, _1572) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1571) (-1, _1572) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1550, _1572) (-1, _1573) 0 ]", "BLACKBOX::RANGE [(_1573, 32)] []", "EXPR [ (1, _1550, _1558) (1, _1559, _1560) (-1, _1574) 0 ]", @@ -2280,13 +2280,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1573) (-1, _1580) 0 ]", "EXPR [ (1, _1550, _1580) (-1, _1581) 0 ]", "BLACKBOX::RANGE [(_1581, 32)] []", - "EXPR [ (1, _1581) (-1, _1582) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1581) (-1, _1582) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1550, _1582) (-1, _1583) 0 ]", "BLACKBOX::RANGE [(_1583, 32)] []", - "EXPR [ (1, _1583) (-1, _1584) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1583) (-1, _1584) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1550, _1584) (-1, _1585) 0 ]", "BLACKBOX::RANGE [(_1585, 32)] []", - "EXPR [ (1, _1585) (-1, _1586) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1585) (-1, _1586) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1550, _1586) (-1, _1587) 0 ]", "BLACKBOX::RANGE [(_1587, 32)] []", "EXPR [ (1, _1550, _1573) (1, _1559, _1574) (-1, _1588) 0 ]", @@ -2299,13 +2299,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1587) (-1, _1594) 0 ]", "EXPR [ (1, _1550, _1594) (-1, _1595) 0 ]", "BLACKBOX::RANGE [(_1595, 32)] []", - "EXPR [ (1, _1595) (-1, _1596) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1595) (-1, _1596) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1550, _1596) (-1, _1597) 0 ]", "BLACKBOX::RANGE [(_1597, 32)] []", - "EXPR [ (1, _1597) (-1, _1598) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1597) (-1, _1598) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1550, _1598) (-1, _1599) 0 ]", "BLACKBOX::RANGE [(_1599, 32)] []", - "EXPR [ (1, _1599) (-1, _1600) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1599) (-1, _1600) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1550, _1600) (-1, _1601) 0 ]", "BLACKBOX::RANGE [(_1601, 32)] []", "EXPR [ (1, _1550, _1587) (1, _1559, _1588) (-1, _1602) 0 ]", @@ -2318,22 +2318,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 27 })], outputs: [Simple(Witness(1608))]", "EXPR [ (-1, _0, _1608) (27, _1608) (1, _1609) -1 ]", "EXPR [ (-1, _0, _1609) (27, _1609) 0 ]", - "EXPR [ (1, _1550, _1601) (-1, _2470) 0 ]", - "EXPR [ (1, _1559, _1602) (-1, _2471) 0 ]", - "EXPR [ (-1, _1610) (1, _1994) (1, _2470) (1, _2471) 0 ]", + "EXPR [ (1, _1550, _1601) (-1, _2389) 0 ]", + "EXPR [ (1, _1559, _1602) (-1, _2390) 0 ]", + "EXPR [ (-1, _1610) (1, _1913) (1, _2389) (1, _2390) 0 ]", "EXPR [ (1, _1609, _1610) (-1, _1611) 0 ]", "BLACKBOX::RANGE [(_1611, 32)] []", - "EXPR [ (1, _1611) (-1, _1612) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1611) (-1, _1612) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1609, _1612) (-1, _1613) 0 ]", "BLACKBOX::RANGE [(_1613, 32)] []", - "EXPR [ (1, _1613) (-1, _1614) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1613) (-1, _1614) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1609, _1614) (-1, _1615) 0 ]", "BLACKBOX::RANGE [(_1615, 32)] []", - "EXPR [ (1, _1615) (-1, _1616) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1615) (-1, _1616) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1609, _1616) (-1, _1617) 0 ]", "BLACKBOX::RANGE [(_1617, 32)] []", "EXPR [ (-1, _1609) (-1, _1618) 1 ]", - "EXPR [ (-1, _1619) (1, _2470) (1, _2471) 0 ]", + "EXPR [ (-1, _1619) (1, _2389) (1, _2390) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1617))], q_c: -4864 })], outputs: [Simple(Witness(1620))]", "EXPR [ (1, _1617, _1620) (-4864, _1620) (1, _1621) -1 ]", "EXPR [ (1, _1617, _1621) (-4864, _1621) 0 ]", @@ -2343,13 +2343,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1617) (-1, _1625) 0 ]", "EXPR [ (1, _1609, _1625) (-1, _1626) 0 ]", "BLACKBOX::RANGE [(_1626, 32)] []", - "EXPR [ (1, _1626) (-1, _1627) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1626) (-1, _1627) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1609, _1627) (-1, _1628) 0 ]", "BLACKBOX::RANGE [(_1628, 32)] []", - "EXPR [ (1, _1628) (-1, _1629) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1628) (-1, _1629) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1609, _1629) (-1, _1630) 0 ]", "BLACKBOX::RANGE [(_1630, 32)] []", - "EXPR [ (1, _1630) (-1, _1631) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1630) (-1, _1631) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1609, _1631) (-1, _1632) 0 ]", "BLACKBOX::RANGE [(_1632, 32)] []", "EXPR [ (1, _1609, _1617) (1, _1618, _1619) (-1, _1633) 0 ]", @@ -2362,13 +2362,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1632) (-1, _1639) 0 ]", "EXPR [ (1, _1609, _1639) (-1, _1640) 0 ]", "BLACKBOX::RANGE [(_1640, 32)] []", - "EXPR [ (1, _1640) (-1, _1641) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1640) (-1, _1641) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1609, _1641) (-1, _1642) 0 ]", "BLACKBOX::RANGE [(_1642, 32)] []", - "EXPR [ (1, _1642) (-1, _1643) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1642) (-1, _1643) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1609, _1643) (-1, _1644) 0 ]", "BLACKBOX::RANGE [(_1644, 32)] []", - "EXPR [ (1, _1644) (-1, _1645) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1644) (-1, _1645) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1609, _1645) (-1, _1646) 0 ]", "BLACKBOX::RANGE [(_1646, 32)] []", "EXPR [ (1, _1609, _1632) (1, _1618, _1633) (-1, _1647) 0 ]", @@ -2381,13 +2381,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1646) (-1, _1653) 0 ]", "EXPR [ (1, _1609, _1653) (-1, _1654) 0 ]", "BLACKBOX::RANGE [(_1654, 32)] []", - "EXPR [ (1, _1654) (-1, _1655) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1654) (-1, _1655) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1609, _1655) (-1, _1656) 0 ]", "BLACKBOX::RANGE [(_1656, 32)] []", - "EXPR [ (1, _1656) (-1, _1657) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1656) (-1, _1657) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1609, _1657) (-1, _1658) 0 ]", "BLACKBOX::RANGE [(_1658, 32)] []", - "EXPR [ (1, _1658) (-1, _1659) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1658) (-1, _1659) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1609, _1659) (-1, _1660) 0 ]", "BLACKBOX::RANGE [(_1660, 32)] []", "EXPR [ (1, _1609, _1646) (1, _1618, _1647) (-1, _1661) 0 ]", @@ -2400,22 +2400,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 28 })], outputs: [Simple(Witness(1667))]", "EXPR [ (-1, _0, _1667) (28, _1667) (1, _1668) -1 ]", "EXPR [ (-1, _0, _1668) (28, _1668) 0 ]", - "EXPR [ (1, _1609, _1660) (-1, _2486) 0 ]", - "EXPR [ (1, _1618, _1661) (-1, _2487) 0 ]", - "EXPR [ (-1, _1669) (1, _1994) (1, _2486) (1, _2487) 0 ]", + "EXPR [ (1, _1609, _1660) (-1, _2405) 0 ]", + "EXPR [ (1, _1618, _1661) (-1, _2406) 0 ]", + "EXPR [ (-1, _1669) (1, _1913) (1, _2405) (1, _2406) 0 ]", "EXPR [ (1, _1668, _1669) (-1, _1670) 0 ]", "BLACKBOX::RANGE [(_1670, 32)] []", - "EXPR [ (1, _1670) (-1, _1671) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1670) (-1, _1671) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1668, _1671) (-1, _1672) 0 ]", "BLACKBOX::RANGE [(_1672, 32)] []", - "EXPR [ (1, _1672) (-1, _1673) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1672) (-1, _1673) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1668, _1673) (-1, _1674) 0 ]", "BLACKBOX::RANGE [(_1674, 32)] []", - "EXPR [ (1, _1674) (-1, _1675) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1674) (-1, _1675) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1668, _1675) (-1, _1676) 0 ]", "BLACKBOX::RANGE [(_1676, 32)] []", "EXPR [ (-1, _1668) (-1, _1677) 1 ]", - "EXPR [ (-1, _1678) (1, _2486) (1, _2487) 0 ]", + "EXPR [ (-1, _1678) (1, _2405) (1, _2406) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1676))], q_c: -4864 })], outputs: [Simple(Witness(1679))]", "EXPR [ (1, _1676, _1679) (-4864, _1679) (1, _1680) -1 ]", "EXPR [ (1, _1676, _1680) (-4864, _1680) 0 ]", @@ -2425,13 +2425,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1676) (-1, _1684) 0 ]", "EXPR [ (1, _1668, _1684) (-1, _1685) 0 ]", "BLACKBOX::RANGE [(_1685, 32)] []", - "EXPR [ (1, _1685) (-1, _1686) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1685) (-1, _1686) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1668, _1686) (-1, _1687) 0 ]", "BLACKBOX::RANGE [(_1687, 32)] []", - "EXPR [ (1, _1687) (-1, _1688) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1687) (-1, _1688) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1668, _1688) (-1, _1689) 0 ]", "BLACKBOX::RANGE [(_1689, 32)] []", - "EXPR [ (1, _1689) (-1, _1690) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1689) (-1, _1690) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1668, _1690) (-1, _1691) 0 ]", "BLACKBOX::RANGE [(_1691, 32)] []", "EXPR [ (1, _1668, _1676) (1, _1677, _1678) (-1, _1692) 0 ]", @@ -2444,13 +2444,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1691) (-1, _1698) 0 ]", "EXPR [ (1, _1668, _1698) (-1, _1699) 0 ]", "BLACKBOX::RANGE [(_1699, 32)] []", - "EXPR [ (1, _1699) (-1, _1700) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1699) (-1, _1700) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1668, _1700) (-1, _1701) 0 ]", "BLACKBOX::RANGE [(_1701, 32)] []", - "EXPR [ (1, _1701) (-1, _1702) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1701) (-1, _1702) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1668, _1702) (-1, _1703) 0 ]", "BLACKBOX::RANGE [(_1703, 32)] []", - "EXPR [ (1, _1703) (-1, _1704) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1703) (-1, _1704) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1668, _1704) (-1, _1705) 0 ]", "BLACKBOX::RANGE [(_1705, 32)] []", "EXPR [ (1, _1668, _1691) (1, _1677, _1692) (-1, _1706) 0 ]", @@ -2463,13 +2463,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1705) (-1, _1712) 0 ]", "EXPR [ (1, _1668, _1712) (-1, _1713) 0 ]", "BLACKBOX::RANGE [(_1713, 32)] []", - "EXPR [ (1, _1713) (-1, _1714) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1713) (-1, _1714) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1668, _1714) (-1, _1715) 0 ]", "BLACKBOX::RANGE [(_1715, 32)] []", - "EXPR [ (1, _1715) (-1, _1716) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1715) (-1, _1716) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1668, _1716) (-1, _1717) 0 ]", "BLACKBOX::RANGE [(_1717, 32)] []", - "EXPR [ (1, _1717) (-1, _1718) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1717) (-1, _1718) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1668, _1718) (-1, _1719) 0 ]", "BLACKBOX::RANGE [(_1719, 32)] []", "EXPR [ (1, _1668, _1705) (1, _1677, _1706) (-1, _1720) 0 ]", @@ -2482,22 +2482,22 @@ expression: artifact "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 29 })], outputs: [Simple(Witness(1726))]", "EXPR [ (-1, _0, _1726) (29, _1726) (1, _1727) -1 ]", "EXPR [ (-1, _0, _1727) (29, _1727) 0 ]", - "EXPR [ (1, _1668, _1719) (-1, _2502) 0 ]", - "EXPR [ (1, _1677, _1720) (-1, _2503) 0 ]", - "EXPR [ (-1, _1728) (1, _1994) (1, _2502) (1, _2503) 0 ]", + "EXPR [ (1, _1668, _1719) (-1, _2421) 0 ]", + "EXPR [ (1, _1677, _1720) (-1, _2422) 0 ]", + "EXPR [ (-1, _1728) (1, _1913) (1, _2421) (1, _2422) 0 ]", "EXPR [ (1, _1727, _1728) (-1, _1729) 0 ]", "BLACKBOX::RANGE [(_1729, 32)] []", - "EXPR [ (1, _1729) (-1, _1730) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1729) (-1, _1730) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1727, _1730) (-1, _1731) 0 ]", "BLACKBOX::RANGE [(_1731, 32)] []", - "EXPR [ (1, _1731) (-1, _1732) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1731) (-1, _1732) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1727, _1732) (-1, _1733) 0 ]", "BLACKBOX::RANGE [(_1733, 32)] []", - "EXPR [ (1, _1733) (-1, _1734) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1733) (-1, _1734) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1727, _1734) (-1, _1735) 0 ]", "BLACKBOX::RANGE [(_1735, 32)] []", "EXPR [ (-1, _1727) (-1, _1736) 1 ]", - "EXPR [ (-1, _1737) (1, _2502) (1, _2503) 0 ]", + "EXPR [ (-1, _1737) (1, _2421) (1, _2422) 0 ]", "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1735))], q_c: -4864 })], outputs: [Simple(Witness(1738))]", "EXPR [ (1, _1735, _1738) (-4864, _1738) (1, _1739) -1 ]", "EXPR [ (1, _1735, _1739) (-4864, _1739) 0 ]", @@ -2507,13 +2507,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1735) (-1, _1743) 0 ]", "EXPR [ (1, _1727, _1743) (-1, _1744) 0 ]", "BLACKBOX::RANGE [(_1744, 32)] []", - "EXPR [ (1, _1744) (-1, _1745) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1744) (-1, _1745) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1727, _1745) (-1, _1746) 0 ]", "BLACKBOX::RANGE [(_1746, 32)] []", - "EXPR [ (1, _1746) (-1, _1747) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1746) (-1, _1747) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1727, _1747) (-1, _1748) 0 ]", "BLACKBOX::RANGE [(_1748, 32)] []", - "EXPR [ (1, _1748) (-1, _1749) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1748) (-1, _1749) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1727, _1749) (-1, _1750) 0 ]", "BLACKBOX::RANGE [(_1750, 32)] []", "EXPR [ (1, _1727, _1735) (1, _1736, _1737) (-1, _1751) 0 ]", @@ -2527,13 +2527,13 @@ expression: artifact "EXPR [ (1, _4, _43) (1, _1750) (-1, _1758) 0 ]", "EXPR [ (1, _1727, _1758) (-1, _1759) 0 ]", "BLACKBOX::RANGE [(_1759, 32)] []", - "EXPR [ (1, _1759) (-1, _1760) (1, _2026) (1, _2055) 0 ]", + "EXPR [ (1, _1759) (-1, _1760) (1, _1945) (1, _1974) 0 ]", "EXPR [ (1, _1727, _1760) (-1, _1761) 0 ]", "BLACKBOX::RANGE [(_1761, 32)] []", - "EXPR [ (1, _1761) (-1, _1762) (1, _2056) (1, _2083) 0 ]", + "EXPR [ (1, _1761) (-1, _1762) (1, _1975) (1, _2002) 0 ]", "EXPR [ (1, _1727, _1762) (-1, _1763) 0 ]", "BLACKBOX::RANGE [(_1763, 32)] []", - "EXPR [ (1, _1763) (-1, _1764) (1, _2084) (1, _2103) 0 ]", + "EXPR [ (1, _1763) (-1, _1764) (1, _2003) (1, _2022) 0 ]", "EXPR [ (1, _1727, _1764) (-1, _1765) 0 ]", "BLACKBOX::RANGE [(_1765, 32)] []", "EXPR [ (1, _1727, _1750) (1, _1736, _1751) (-1, _1766) 0 ]", @@ -2545,295 +2545,180 @@ expression: artifact "EXPR [ (1, _1750, _1754) (1, _1755, _1756) (-1, _1771) 0 ]", "EXPR [ (32, _1727) (-1, _1772) 0 ]", "BLACKBOX::RANGE [(_1772, 5)] []", - "EXPR [ (1, _4, _43) (1, _1765) (-1, _1773) 0 ]", - "EXPR [ (1, _1727, _1773) (-1, _1774) 0 ]", - "BLACKBOX::RANGE [(_1774, 32)] []", - "EXPR [ (1, _1774) (-1, _1775) (1, _2026) (1, _2055) 0 ]", - "EXPR [ (1, _1727, _1775) (-1, _1776) 0 ]", - "BLACKBOX::RANGE [(_1776, 32)] []", - "EXPR [ (1, _1776) (-1, _1777) (1, _2056) (1, _2083) 0 ]", - "EXPR [ (1, _1727, _1777) (-1, _1778) 0 ]", - "BLACKBOX::RANGE [(_1778, 32)] []", - "EXPR [ (1, _1778) (-1, _1779) (1, _2084) (1, _2103) 0 ]", - "EXPR [ (1, _1727, _1779) (-1, _1780) 0 ]", - "BLACKBOX::RANGE [(_1780, 32)] []", - "EXPR [ (1, _1727, _1765) (1, _1736, _1766) (-1, _1781) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1780))], q_c: -4864 })], outputs: [Simple(Witness(1782))]", - "EXPR [ (1, _1780, _1782) (-4864, _1782) (1, _1783) -1 ]", - "EXPR [ (1, _1780, _1783) (-4864, _1783) 0 ]", - "EXPR [ (1, _1727, _1783) (-1, _1784) 0 ]", - "EXPR [ (-1, _1727, _1783) (-1, _1785) 1 ]", - "EXPR [ (1, _1765, _1769) (1, _1770, _1771) (-1, _1786) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 30 })], outputs: [Simple(Witness(1787))]", - "EXPR [ (-1, _0, _1787) (30, _1787) (1, _1788) -1 ]", - "EXPR [ (-1, _0, _1788) (30, _1788) 0 ]", - "EXPR [ (1, _1727, _1780) (-1, _2518) 0 ]", - "EXPR [ (1, _1736, _1781) (-1, _2519) 0 ]", - "EXPR [ (-1, _1789) (1, _1994) (1, _2518) (1, _2519) 0 ]", - "EXPR [ (1, _1788, _1789) (-1, _1790) 0 ]", - "BLACKBOX::RANGE [(_1790, 32)] []", - "EXPR [ (1, _1790) (-1, _1791) (1, _2026) (1, _2055) 0 ]", - "EXPR [ (1, _1788, _1791) (-1, _1792) 0 ]", - "BLACKBOX::RANGE [(_1792, 32)] []", - "EXPR [ (1, _1792) (-1, _1793) (1, _2056) (1, _2083) 0 ]", - "EXPR [ (1, _1788, _1793) (-1, _1794) 0 ]", - "BLACKBOX::RANGE [(_1794, 32)] []", - "EXPR [ (1, _1794) (-1, _1795) (1, _2084) (1, _2103) 0 ]", - "EXPR [ (1, _1788, _1795) (-1, _1796) 0 ]", - "BLACKBOX::RANGE [(_1796, 32)] []", - "EXPR [ (-1, _1788) (-1, _1797) 1 ]", - "EXPR [ (-1, _1798) (1, _2518) (1, _2519) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1796))], q_c: -4864 })], outputs: [Simple(Witness(1799))]", - "EXPR [ (1, _1796, _1799) (-4864, _1799) (1, _1800) -1 ]", - "EXPR [ (1, _1796, _1800) (-4864, _1800) 0 ]", - "EXPR [ (1, _1788, _1800) (-1, _1801) 0 ]", - "EXPR [ (-1, _1788, _1800) (-1, _1802) 1 ]", - "EXPR [ (1, _1780, _1784) (1, _1785, _1786) (-1, _1803) 0 ]", - "EXPR [ (1, _67, _1727) (1, _1736, _1757) (-1, _1804) 0 ]", - "EXPR [ (1, _4, _43) (1, _1796) (-1, _1805) 0 ]", - "EXPR [ (1, _1788, _1805) (-1, _1806) 0 ]", - "BLACKBOX::RANGE [(_1806, 32)] []", - "EXPR [ (1, _1806) (-1, _1807) (1, _2026) (1, _2055) 0 ]", - "EXPR [ (1, _1788, _1807) (-1, _1808) 0 ]", - "BLACKBOX::RANGE [(_1808, 32)] []", - "EXPR [ (1, _1808) (-1, _1809) (1, _2056) (1, _2083) 0 ]", - "EXPR [ (1, _1788, _1809) (-1, _1810) 0 ]", - "BLACKBOX::RANGE [(_1810, 32)] []", - "EXPR [ (1, _1810) (-1, _1811) (1, _2084) (1, _2103) 0 ]", - "EXPR [ (1, _1788, _1811) (-1, _1812) 0 ]", - "BLACKBOX::RANGE [(_1812, 32)] []", - "EXPR [ (1, _1788, _1796) (1, _1797, _1798) (-1, _1813) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1812))], q_c: -4864 })], outputs: [Simple(Witness(1814))]", - "EXPR [ (1, _1812, _1814) (-4864, _1814) (1, _1815) -1 ]", - "EXPR [ (1, _1812, _1815) (-4864, _1815) 0 ]", - "EXPR [ (1, _1788, _1815) (-1, _1816) 0 ]", - "EXPR [ (-1, _1788, _1815) (-1, _1817) 1 ]", - "EXPR [ (1, _1796, _1801) (1, _1802, _1803) (-1, _1818) 0 ]", - "EXPR [ (32, _1788) (-1, _1819) 0 ]", - "BLACKBOX::RANGE [(_1819, 5)] []", - "EXPR [ (1, _4, _43) (1, _1812) (-1, _1820) 0 ]", - "EXPR [ (1, _1788, _1820) (-1, _1821) 0 ]", + "EXPR [ (1, _1727, _1765) (1, _1736, _1766) (-1, _1773) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 30 })], outputs: [Simple(Witness(1774))]", + "EXPR [ (-1, _0, _1774) (30, _1774) (1, _1775) -1 ]", + "EXPR [ (-1, _0, _1775) (30, _1775) 0 ]", + "EXPR [ (1, _1736, _1773) (-1, _1776) (1, _1913) 0 ]", + "EXPR [ (1, _1775, _1776) (-1, _1777) 0 ]", + "BLACKBOX::RANGE [(_1777, 32)] []", + "EXPR [ (1, _1777) (-1, _1778) (1, _1945) (1, _1974) 0 ]", + "EXPR [ (1, _1775, _1778) (-1, _1779) 0 ]", + "BLACKBOX::RANGE [(_1779, 32)] []", + "EXPR [ (1, _1779) (-1, _1780) (1, _1975) (1, _2002) 0 ]", + "EXPR [ (1, _1775, _1780) (-1, _1781) 0 ]", + "BLACKBOX::RANGE [(_1781, 32)] []", + "EXPR [ (1, _1781) (-1, _1782) (1, _2003) (1, _2022) 0 ]", + "EXPR [ (1, _1775, _1782) (-1, _1783) 0 ]", + "BLACKBOX::RANGE [(_1783, 32)] []", + "EXPR [ (-1, _1775) (-1, _1784) 1 ]", + "EXPR [ (1, _1736, _1773) (-1, _1785) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1783))], q_c: -4864 })], outputs: [Simple(Witness(1786))]", + "EXPR [ (1, _1783, _1786) (-4864, _1786) (1, _1787) -1 ]", + "EXPR [ (1, _1783, _1787) (-4864, _1787) 0 ]", + "EXPR [ (1, _1775, _1787) (-1, _1788) 0 ]", + "EXPR [ (-1, _1775, _1787) (-1, _1789) 1 ]", + "EXPR [ (1, _1765, _1769) (1, _1770, _1771) (-1, _1790) 0 ]", + "EXPR [ (1, _67, _1727) (1, _1736, _1757) (-1, _1791) 0 ]", + "EXPR [ (1, _4, _43) (1, _1783) (-1, _1792) 0 ]", + "EXPR [ (1, _1775, _1792) (-1, _1793) 0 ]", + "BLACKBOX::RANGE [(_1793, 32)] []", + "EXPR [ (1, _1793) (-1, _1794) (1, _1945) (1, _1974) 0 ]", + "EXPR [ (1, _1775, _1794) (-1, _1795) 0 ]", + "BLACKBOX::RANGE [(_1795, 32)] []", + "EXPR [ (1, _1795) (-1, _1796) (1, _1975) (1, _2002) 0 ]", + "EXPR [ (1, _1775, _1796) (-1, _1797) 0 ]", + "BLACKBOX::RANGE [(_1797, 32)] []", + "EXPR [ (1, _1797) (-1, _1798) (1, _2003) (1, _2022) 0 ]", + "EXPR [ (1, _1775, _1798) (-1, _1799) 0 ]", + "BLACKBOX::RANGE [(_1799, 32)] []", + "EXPR [ (1, _1775, _1783) (1, _1784, _1785) (-1, _1800) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1799))], q_c: -4864 })], outputs: [Simple(Witness(1801))]", + "EXPR [ (1, _1799, _1801) (-4864, _1801) (1, _1802) -1 ]", + "EXPR [ (1, _1799, _1802) (-4864, _1802) 0 ]", + "EXPR [ (1, _1775, _1802) (-1, _1803) 0 ]", + "EXPR [ (-1, _1775, _1802) (-1, _1804) 1 ]", + "EXPR [ (1, _1783, _1788) (1, _1789, _1790) (-1, _1805) 0 ]", + "EXPR [ (32, _1775) (-1, _1806) 0 ]", + "BLACKBOX::RANGE [(_1806, 5)] []", + "EXPR [ (1, _1775, _1799) (1, _1784, _1800) (-1, _1807) 0 ]", + "EXPR [ (33, _1775) (-1, _1808) 0 ]", + "BLACKBOX::RANGE [(_1808, 5)] []", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 31 })], outputs: [Simple(Witness(1809))]", + "EXPR [ (-1, _0, _1809) (31, _1809) (1, _1810) -1 ]", + "EXPR [ (-1, _0, _1810) (31, _1810) 0 ]", + "EXPR [ (1, _1799, _1803) (1, _1804, _1805) (-1, _1811) 0 ]", + "EXPR [ (-1, _1810) (-1, _1812) 1 ]", + "EXPR [ (1, _57, _1775) (1, _1784, _1791) (-1, _1813) 0 ]", + "EXPR [ (1, _1784, _1807) (-1, _1814) (1, _1913) 0 ]", + "EXPR [ (1, _1810, _1814) (-1, _1815) 0 ]", + "BLACKBOX::RANGE [(_1815, 32)] []", + "EXPR [ (1, _1815) (-1, _1816) (1, _1945) (1, _1974) 0 ]", + "EXPR [ (1, _1810, _1816) (-1, _1817) 0 ]", + "BLACKBOX::RANGE [(_1817, 32)] []", + "EXPR [ (1, _1817) (-1, _1818) (1, _1975) (1, _2002) 0 ]", + "EXPR [ (1, _1810, _1818) (-1, _1819) 0 ]", + "BLACKBOX::RANGE [(_1819, 32)] []", + "EXPR [ (1, _1819) (-1, _1820) (1, _2003) (1, _2022) 0 ]", + "EXPR [ (1, _1810, _1820) (-1, _1821) 0 ]", "BLACKBOX::RANGE [(_1821, 32)] []", - "EXPR [ (1, _1821) (-1, _1822) (1, _2026) (1, _2055) 0 ]", - "EXPR [ (1, _1788, _1822) (-1, _1823) 0 ]", - "BLACKBOX::RANGE [(_1823, 32)] []", - "EXPR [ (1, _1823) (-1, _1824) (1, _2056) (1, _2083) 0 ]", - "EXPR [ (1, _1788, _1824) (-1, _1825) 0 ]", - "BLACKBOX::RANGE [(_1825, 32)] []", - "EXPR [ (1, _1825) (-1, _1826) (1, _2084) (1, _2103) 0 ]", - "EXPR [ (1, _1788, _1826) (-1, _1827) 0 ]", - "BLACKBOX::RANGE [(_1827, 32)] []", - "EXPR [ (1, _1788, _1812) (1, _1797, _1813) (-1, _1828) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1827))], q_c: -4864 })], outputs: [Simple(Witness(1829))]", - "EXPR [ (1, _1827, _1829) (-4864, _1829) (1, _1830) -1 ]", - "EXPR [ (1, _1827, _1830) (-4864, _1830) 0 ]", - "EXPR [ (1, _1788, _1830) (-1, _1831) 0 ]", - "EXPR [ (-1, _1788, _1830) (-1, _1832) 1 ]", - "EXPR [ (1, _1812, _1816) (1, _1817, _1818) (-1, _1833) 0 ]", - "EXPR [ (33, _1788) (-1, _1834) 0 ]", - "BLACKBOX::RANGE [(_1834, 5)] []", - "EXPR [ (1, _4, _43) (1, _1827) (-1, _1835) 0 ]", - "EXPR [ (1, _1788, _1835) (-1, _1836) 0 ]", - "BLACKBOX::RANGE [(_1836, 32)] []", - "EXPR [ (1, _1836) (-1, _1837) (1, _2026) (1, _2055) 0 ]", - "EXPR [ (1, _1788, _1837) (-1, _1838) 0 ]", - "BLACKBOX::RANGE [(_1838, 32)] []", - "EXPR [ (1, _1838) (-1, _1839) (1, _2056) (1, _2083) 0 ]", - "EXPR [ (1, _1788, _1839) (-1, _1840) 0 ]", - "BLACKBOX::RANGE [(_1840, 32)] []", - "EXPR [ (1, _1840) (-1, _1841) (1, _2084) (1, _2103) 0 ]", - "EXPR [ (1, _1788, _1841) (-1, _1842) 0 ]", - "BLACKBOX::RANGE [(_1842, 32)] []", - "EXPR [ (1, _1788, _1827) (1, _1797, _1828) (-1, _1843) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1842))], q_c: -4864 })], outputs: [Simple(Witness(1844))]", - "EXPR [ (1, _1842, _1844) (-4864, _1844) (1, _1845) -1 ]", - "EXPR [ (1, _1842, _1845) (-4864, _1845) 0 ]", - "EXPR [ (1, _1788, _1845) (-1, _1846) 0 ]", - "EXPR [ (-1, _1788, _1845) (-1, _1847) 1 ]", - "EXPR [ (1, _1827, _1831) (1, _1832, _1833) (-1, _1848) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(-1, Witness(0))], q_c: 31 })], outputs: [Simple(Witness(1849))]", - "EXPR [ (-1, _0, _1849) (31, _1849) (1, _1850) -1 ]", - "EXPR [ (-1, _0, _1850) (31, _1850) 0 ]", - "EXPR [ (1, _1842, _1846) (1, _1847, _1848) (-1, _1851) 0 ]", - "EXPR [ (-1, _1850) (-1, _1852) 1 ]", - "EXPR [ (1, _57, _1788) (1, _1797, _1804) (-1, _1853) 0 ]", - "EXPR [ (1, _1788, _1842) (-1, _2540) 0 ]", - "EXPR [ (1, _1797, _1843) (-1, _2541) 0 ]", - "EXPR [ (-1, _1854) (1, _1994) (1, _2540) (1, _2541) 0 ]", - "EXPR [ (1, _1850, _1854) (-1, _1855) 0 ]", - "BLACKBOX::RANGE [(_1855, 32)] []", - "EXPR [ (1, _1855) (-1, _1856) (1, _2026) (1, _2055) 0 ]", - "EXPR [ (1, _1850, _1856) (-1, _1857) 0 ]", - "BLACKBOX::RANGE [(_1857, 32)] []", - "EXPR [ (1, _1857) (-1, _1858) (1, _2056) (1, _2083) 0 ]", - "EXPR [ (1, _1850, _1858) (-1, _1859) 0 ]", - "BLACKBOX::RANGE [(_1859, 32)] []", - "EXPR [ (1, _1859) (-1, _1860) (1, _2084) (1, _2103) 0 ]", - "EXPR [ (1, _1850, _1860) (-1, _1861) 0 ]", - "BLACKBOX::RANGE [(_1861, 32)] []", - "EXPR [ (-1, _1862) (1, _2540) (1, _2541) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1861))], q_c: -4864 })], outputs: [Simple(Witness(1863))]", - "EXPR [ (1, _1861, _1863) (-4864, _1863) (1, _1864) -1 ]", - "EXPR [ (1, _1861, _1864) (-4864, _1864) 0 ]", - "EXPR [ (1, _1850, _1864) (-1, _1865) 0 ]", - "EXPR [ (-1, _1850, _1864) (-1, _1866) 1 ]", - "EXPR [ (32, _1850) (-1, _1867) 0 ]", - "BLACKBOX::RANGE [(_1867, 5)] []", - "EXPR [ (1, _4, _43) (1, _1861) (-1, _1868) 0 ]", - "EXPR [ (1, _1850, _1868) (-1, _1869) 0 ]", + "EXPR [ (1, _1784, _1807) (-1, _1822) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1821))], q_c: -4864 })], outputs: [Simple(Witness(1823))]", + "EXPR [ (1, _1821, _1823) (-4864, _1823) (1, _1824) -1 ]", + "EXPR [ (1, _1821, _1824) (-4864, _1824) 0 ]", + "EXPR [ (1, _1810, _1824) (-1, _1825) 0 ]", + "EXPR [ (-1, _1810, _1824) (-1, _1826) 1 ]", + "EXPR [ (32, _1810) (-1, _1827) 0 ]", + "BLACKBOX::RANGE [(_1827, 5)] []", + "EXPR [ (1, _1810, _1821) (1, _1812, _1822) (-1, _1828) 0 ]", + "EXPR [ (33, _1810) (-1, _1829) 0 ]", + "BLACKBOX::RANGE [(_1829, 5)] []", + "EXPR [ (34, _1810) (-1, _1830) 0 ]", + "BLACKBOX::RANGE [(_1830, 5)] []", + "EXPR [ (1, _1810, _1811) (1, _1812, _1813) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(1, Witness(1812), Witness(1828))], linear_combinations: [], q_c: -13 })], outputs: [Simple(Witness(1831))]", + "EXPR [ (1, _1812, _1828) (-1, _1832) -13 ]", + "EXPR [ (1, _1831, _1832) -1 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 })], outputs: [Simple(Witness(1833))]", + "EXPR [ (1, _0, _1833) (1, _1834) -1 ]", + "EXPR [ (1, _0, _1834) 0 ]", + "EXPR [ (1, _0) 0 ]", + "EXPR [ (-1, _1834) 1 ]", + "EXPR [ (-1, _77, _1834) (1, _77) (3, _1834) (-1, _1835) 0 ]", + "EXPR [ (1, _1834, _1835) -3 ]", + "BLACKBOX::BLAKE3 [(_5, 8), (_6, 8), (_7, 8), (_8, 8), (_9, 8)] [_1836, _1837, _1838, _1839, _1840, _1841, _1842, _1843, _1844, _1845, _1846, _1847, _1848, _1849, _1850, _1851, _1852, _1853, _1854, _1855, _1856, _1857, _1858, _1859, _1860, _1861, _1862, _1863, _1864, _1865, _1866, _1867]", + "EXPR [ (1, _1834, _1836) (-1, _10) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(1, Witness(1834), Witness(67))], linear_combinations: [], q_c: 4294967293 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 4294967296 })], outputs: [Simple(Witness(1868)), Simple(Witness(1869))]", + "BLACKBOX::RANGE [(_1868, 1)] []", "BLACKBOX::RANGE [(_1869, 32)] []", - "EXPR [ (1, _1869) (-1, _1870) (1, _2026) (1, _2055) 0 ]", - "EXPR [ (1, _1850, _1870) (-1, _1871) 0 ]", - "BLACKBOX::RANGE [(_1871, 32)] []", - "EXPR [ (1, _1871) (-1, _1872) (1, _2056) (1, _2083) 0 ]", - "EXPR [ (1, _1850, _1872) (-1, _1873) 0 ]", + "EXPR [ (1, _67, _1834) (-4294967296, _1868) (-1, _1869) 4294967293 ]", + "EXPR [ (-1, _1868) (-1, _1870) 1 ]", + "EXPR [ (1, _67, _1834) (-1, _1871) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-1, Witness(1870), Witness(1871))], linear_combinations: [(1, Witness(57)), (-3, Witness(1868))], q_c: 4294967296 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 4294967296 })], outputs: [Simple(Witness(1872)), Simple(Witness(1873))]", + "BLACKBOX::RANGE [(_1872, 1)] []", "BLACKBOX::RANGE [(_1873, 32)] []", - "EXPR [ (1, _1873) (-1, _1874) (1, _2084) (1, _2103) 0 ]", - "EXPR [ (1, _1850, _1874) (-1, _1875) 0 ]", - "BLACKBOX::RANGE [(_1875, 32)] []", - "EXPR [ (1, _1850, _1861) (1, _1852, _1862) (-1, _1876) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1875))], q_c: -4864 })], outputs: [Simple(Witness(1877))]", - "EXPR [ (1, _1875, _1877) (-4864, _1877) (1, _1878) -1 ]", - "EXPR [ (1, _1875, _1878) (-4864, _1878) 0 ]", - "EXPR [ (1, _1850, _1878) (-1, _1879) 0 ]", - "EXPR [ (-1, _1850, _1878) (-1, _1880) 1 ]", - "EXPR [ (1, _1851, _1866) (1, _1861, _1865) (-1, _1881) 0 ]", - "EXPR [ (33, _1850) (-1, _1882) 0 ]", - "BLACKBOX::RANGE [(_1882, 5)] []", - "EXPR [ (1, _4, _43) (1, _1875) (-1, _1883) 0 ]", - "EXPR [ (1, _1850, _1883) (-1, _1884) 0 ]", - "BLACKBOX::RANGE [(_1884, 32)] []", - "EXPR [ (1, _1884) (-1, _1885) (1, _2026) (1, _2055) 0 ]", - "EXPR [ (1, _1850, _1885) (-1, _1886) 0 ]", + "EXPR [ (-1, _1870, _1871) (1, _57) (-3, _1868) (-4294967296, _1872) (-1, _1873) 4294967296 ]", + "EXPR [ (1, _1870, _1871) (3, _1868) (-1, _1874) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-1, Witness(1868), Witness(1871)), (1, Witness(1872), Witness(57)), (-1, Witness(1872), Witness(1874))], linear_combinations: [(-3, Witness(1870)), (1, Witness(1874))], q_c: 4294967296 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 4294967296 })], outputs: [Simple(Witness(1875)), Simple(Witness(1876))]", + "BLACKBOX::RANGE [(_1875, 1)] []", + "BLACKBOX::RANGE [(_1876, 32)] []", + "EXPR [ (1, _57, _1872) (-1, _2457) 0 ]", + "EXPR [ (-1, _1872, _1874) (-1, _2459) 0 ]", + "EXPR [ (-1, _1868, _1871) (-3, _1870) (1, _1874) (-4294967296, _1875) (-1, _1876) (1, _2457) (1, _2459) 4294967296 ]", + "EXPR [ (-1, _1875) (-1, _1877) 1 ]", + "EXPR [ (1, _1874) (-1, _1878) (1, _2457) (1, _2459) 0 ]", + "EXPR [ (1, _1868, _1871) (3, _1870) (-1, _1879) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(1, Witness(1825), Witness(1821)), (1, Witness(1826), Witness(1811)), (1, Witness(1872), Witness(57)), (-1, Witness(1872), Witness(1874))], linear_combinations: [(-1, Witness(57))], q_c: 4294967296 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 4294967296 })], outputs: [Simple(Witness(1880)), Simple(Witness(1881))]", + "BLACKBOX::RANGE [(_1880, 1)] []", + "BLACKBOX::RANGE [(_1881, 32)] []", + "EXPR [ (1, _1811, _1826) (-1, _2462) 0 ]", + "EXPR [ (1, _1821, _1825) (-1, _2463) 0 ]", + "EXPR [ (-1, _57) (-4294967296, _1880) (-1, _1881) (1, _2457) (1, _2459) (1, _2462) (1, _2463) 4294967296 ]", + "EXPR [ (-1, _1880) (-1, _1882) 1 ]", + "EXPR [ (-1, _1883) (1, _2462) (1, _2463) 0 ]", + "EXPR [ (1, _57) (-1, _1884) (-1, _2457) (-1, _2459) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-1, Witness(1875), Witness(1879)), (-1, Witness(1877), Witness(1878)), (1, Witness(1880), Witness(1883)), (1, Witness(1882), Witness(1884))], linear_combinations: [], q_c: 4294967296 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 4294967296 })], outputs: [Simple(Witness(1885)), Simple(Witness(1886))]", + "BLACKBOX::RANGE [(_1885, 1)] []", "BLACKBOX::RANGE [(_1886, 32)] []", - "EXPR [ (1, _1886) (-1, _1887) (1, _2056) (1, _2083) 0 ]", - "EXPR [ (1, _1850, _1887) (-1, _1888) 0 ]", - "BLACKBOX::RANGE [(_1888, 32)] []", - "EXPR [ (1, _1888) (-1, _1889) (1, _2084) (1, _2103) 0 ]", - "EXPR [ (1, _1850, _1889) (-1, _1890) 0 ]", - "BLACKBOX::RANGE [(_1890, 32)] []", - "EXPR [ (1, _1850, _1875) (1, _1852, _1876) (-1, _1891) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1890))], q_c: -4864 })], outputs: [Simple(Witness(1892))]", - "EXPR [ (1, _1890, _1892) (-4864, _1892) (1, _1893) -1 ]", - "EXPR [ (1, _1890, _1893) (-4864, _1893) 0 ]", - "EXPR [ (1, _1850, _1893) (-1, _1894) 0 ]", - "EXPR [ (-1, _1850, _1893) (-1, _1895) 1 ]", - "EXPR [ (1, _1875, _1879) (1, _1880, _1881) (-1, _1896) 0 ]", - "EXPR [ (34, _1850) (-1, _1897) 0 ]", - "BLACKBOX::RANGE [(_1897, 5)] []", - "EXPR [ (1, _4, _43) (1, _1890) (-1, _1898) 0 ]", - "EXPR [ (1, _1850, _1898) (-1, _1899) 0 ]", - "BLACKBOX::RANGE [(_1899, 32)] []", - "EXPR [ (1, _1899) (-1, _1900) (1, _2026) (1, _2055) 0 ]", - "EXPR [ (1, _1850, _1900) (-1, _1901) 0 ]", - "BLACKBOX::RANGE [(_1901, 32)] []", - "EXPR [ (1, _1901) (-1, _1902) (1, _2056) (1, _2083) 0 ]", - "EXPR [ (1, _1850, _1902) (-1, _1903) 0 ]", - "BLACKBOX::RANGE [(_1903, 32)] []", - "EXPR [ (1, _1903) (-1, _1904) (1, _2084) (1, _2103) 0 ]", - "EXPR [ (1, _1850, _1904) (-1, _1905) 0 ]", - "BLACKBOX::RANGE [(_1905, 32)] []", - "EXPR [ (1, _1850, _1890) (1, _1852, _1891) (-1, _1906) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1905))], q_c: -4864 })], outputs: [Simple(Witness(1907))]", - "EXPR [ (1, _1905, _1907) (-4864, _1907) (1, _1908) -1 ]", - "EXPR [ (1, _1905, _1908) (-4864, _1908) 0 ]", - "EXPR [ (1, _1850, _1908) (-1, _1909) 0 ]", - "EXPR [ (-1, _1850, _1908) (-1, _1910) 1 ]", - "EXPR [ (1, _1890, _1894) (1, _1895, _1896) (-1, _1911) 0 ]", - "EXPR [ (1, _1850, _1851) (1, _1852, _1853) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [(1, Witness(1850), Witness(1905)), (1, Witness(1852), Witness(1906))], linear_combinations: [], q_c: -13 })], outputs: [Simple(Witness(1912))]", - "EXPR [ (1, _1850, _1905) (1, _1852, _1906) (-1, _1913) -13 ]", - "EXPR [ (1, _1912, _1913) -1 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 })], outputs: [Simple(Witness(1914))]", - "EXPR [ (1, _0, _1914) (1, _1915) -1 ]", - "EXPR [ (1, _0, _1915) 0 ]", - "EXPR [ (1, _0) 0 ]", - "EXPR [ (-1, _1915) 1 ]", - "EXPR [ (-1, _77, _1915) (1, _77) (3, _1915) (-1, _1916) 0 ]", - "EXPR [ (1, _1915, _1916) -3 ]", - "BLACKBOX::BLAKE3 [(_5, 8), (_6, 8), (_7, 8), (_8, 8), (_9, 8)] [_1917, _1918, _1919, _1920, _1921, _1922, _1923, _1924, _1925, _1926, _1927, _1928, _1929, _1930, _1931, _1932, _1933, _1934, _1935, _1936, _1937, _1938, _1939, _1940, _1941, _1942, _1943, _1944, _1945, _1946, _1947, _1948]", - "EXPR [ (1, _1915, _1917) (-1, _10) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(1, Witness(1915), Witness(67))], linear_combinations: [], q_c: 4294967293 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 4294967296 })], outputs: [Simple(Witness(1949)), Simple(Witness(1950))]", - "BLACKBOX::RANGE [(_1949, 1)] []", - "BLACKBOX::RANGE [(_1950, 32)] []", - "EXPR [ (1, _67, _1915) (-4294967296, _1949) (-1, _1950) 4294967293 ]", - "EXPR [ (-1, _1949) (-1, _1951) 1 ]", - "EXPR [ (1, _67, _1915) (-1, _1952) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-1, Witness(1951), Witness(1952))], linear_combinations: [(1, Witness(57)), (-3, Witness(1949))], q_c: 4294967296 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 4294967296 })], outputs: [Simple(Witness(1953)), Simple(Witness(1954))]", - "BLACKBOX::RANGE [(_1953, 1)] []", - "BLACKBOX::RANGE [(_1954, 32)] []", - "EXPR [ (-1, _1951, _1952) (1, _57) (-3, _1949) (-4294967296, _1953) (-1, _1954) 4294967296 ]", - "EXPR [ (1, _1951, _1952) (3, _1949) (-1, _1955) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-1, Witness(1949), Witness(1952)), (1, Witness(1953), Witness(57)), (-1, Witness(1953), Witness(1955))], linear_combinations: [(-3, Witness(1951)), (1, Witness(1955))], q_c: 4294967296 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 4294967296 })], outputs: [Simple(Witness(1956)), Simple(Witness(1957))]", - "BLACKBOX::RANGE [(_1956, 1)] []", - "BLACKBOX::RANGE [(_1957, 32)] []", - "EXPR [ (1, _57, _1953) (-1, _2560) 0 ]", - "EXPR [ (-1, _1953, _1955) (-1, _2562) 0 ]", - "EXPR [ (-1, _1949, _1952) (-3, _1951) (1, _1955) (-4294967296, _1956) (-1, _1957) (1, _2560) (1, _2562) 4294967296 ]", - "EXPR [ (-1, _1956) (-1, _1958) 1 ]", - "EXPR [ (1, _1955) (-1, _1959) (1, _2560) (1, _2562) 0 ]", - "EXPR [ (1, _1949, _1952) (3, _1951) (-1, _1960) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(1, Witness(1909), Witness(1905)), (1, Witness(1910), Witness(1911)), (1, Witness(1953), Witness(57)), (-1, Witness(1953), Witness(1955))], linear_combinations: [(-1, Witness(57))], q_c: 4294967296 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 4294967296 })], outputs: [Simple(Witness(1961)), Simple(Witness(1962))]", - "BLACKBOX::RANGE [(_1961, 1)] []", - "BLACKBOX::RANGE [(_1962, 32)] []", - "EXPR [ (1, _1905, _1909) (-1, _2565) 0 ]", - "EXPR [ (1, _1910, _1911) (-1, _2566) 0 ]", - "EXPR [ (-1, _57) (-4294967296, _1961) (-1, _1962) (1, _2560) (1, _2562) (1, _2565) (1, _2566) 4294967296 ]", - "EXPR [ (-1, _1961) (-1, _1963) 1 ]", - "EXPR [ (-1, _1964) (1, _2565) (1, _2566) 0 ]", - "EXPR [ (1, _57) (-1, _1965) (-1, _2560) (-1, _2562) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-1, Witness(1956), Witness(1960)), (-1, Witness(1958), Witness(1959)), (1, Witness(1961), Witness(1964)), (1, Witness(1963), Witness(1965))], linear_combinations: [], q_c: 4294967296 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 4294967296 })], outputs: [Simple(Witness(1966)), Simple(Witness(1967))]", - "BLACKBOX::RANGE [(_1966, 1)] []", - "BLACKBOX::RANGE [(_1967, 32)] []", - "EXPR [ (-1, _1956, _1960) (-1, _2569) 0 ]", - "EXPR [ (-1, _1958, _1959) (-1, _2570) 0 ]", - "EXPR [ (1, _1961, _1964) (-1, _2571) 0 ]", - "EXPR [ (1, _1963, _1965) (-1, _2572) 0 ]", - "EXPR [ (-4294967296, _1966) (-1, _1967) (1, _2569) (1, _2570) (1, _2571) (1, _2572) 4294967296 ]", - "EXPR [ (-1, _1966) (-1, _1968) 1 ]", - "EXPR [ (-1, _1969) (1, _2571) (1, _2572) 0 ]", - "EXPR [ (-1, _1970) (-1, _2569) (-1, _2570) 0 ]", - "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-1, Witness(1956), Witness(1959)), (-1, Witness(1958), Witness(1960)), (1, Witness(1966), Witness(1969)), (1, Witness(1968), Witness(1970))], linear_combinations: [], q_c: 4294967296 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 4294967296 })], outputs: [Simple(Witness(1971)), Simple(Witness(1972))]", - "BLACKBOX::RANGE [(_1971, 1)] []", - "BLACKBOX::RANGE [(_1972, 32)] []", - "EXPR [ (-1, _1956, _1959) (-1, _2574) 0 ]", - "EXPR [ (-1, _1958, _1960) (-1, _2575) 0 ]", - "EXPR [ (1, _1966, _1969) (-1, _2576) 0 ]", - "EXPR [ (1, _1968, _1970) (-1, _2577) 0 ]", - "EXPR [ (-4294967296, _1971) (-1, _1972) (1, _2574) (1, _2575) (1, _2576) (1, _2577) 4294967296 ]", - "EXPR [ (-1, _1971) (-1, _1973) 1 ]", - "EXPR [ (-1, _1974) (1, _2576) (1, _2577) 0 ]", - "EXPR [ (-1, _1975) (-1, _2574) (-1, _2575) 0 ]", - "EXPR [ (1, _1961, _1965) (1, _1963, _1964) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(12, Witness(1915))], q_c: 0 })], outputs: [Simple(Witness(1976))]", - "EXPR [ (12, _1915, _1976) (1, _1977) -1 ]", - "EXPR [ (12, _1915, _1977) 0 ]", - "EXPR [ (-1, _1977) (-1, _1978) 1 ]", - "EXPR [ (2, _1915, _1915) (-1, _1979) 0 ]", - "EXPR [ (1, _1978, _1979) (3, _1977) -2 ]", - "EXPR [ (1, _1966, _1970) (1, _1968, _1969) (-1, _1980) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1980))], q_c: 0 })], outputs: [Simple(Witness(1981))]", - "EXPR [ (1, _1980, _1981) (1, _1982) -1 ]", - "EXPR [ (1, _1980, _1982) 0 ]", - "EXPR [ (1, _1971, _1975) (1, _1973, _1974) (-1, _1983) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1983))], q_c: 0 })], outputs: [Simple(Witness(1984))]", - "EXPR [ (1, _1983, _1984) (1, _1985) -1 ]", - "EXPR [ (1, _1983, _1985) 0 ]", - "EXPR [ (-1, _1985) (-1, _1986) 1 ]", - "EXPR [ (-2, _1977, _1982) (2, _1977) (3, _1982) (-1, _1987) 0 ]", - "EXPR [ (1, _1971, _1974) (1, _1973, _1975) (-1, _1988) 0 ]", - "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1988))], q_c: 0 })], outputs: [Simple(Witness(1989))]", - "EXPR [ (1, _1988, _1989) (1, _1990) -1 ]", - "EXPR [ (1, _1988, _1990) 0 ]", - "EXPR [ (-1, _1990) (-1, _1991) 1 ]", - "EXPR [ (1, _1986, _1987) (4, _1985) (-1, _1992) 0 ]", - "EXPR [ (1, _1991, _1992) (5, _1990) 0 ]", + "EXPR [ (-1, _1875, _1879) (-1, _2466) 0 ]", + "EXPR [ (-1, _1877, _1878) (-1, _2467) 0 ]", + "EXPR [ (1, _1880, _1883) (-1, _2468) 0 ]", + "EXPR [ (1, _1882, _1884) (-1, _2469) 0 ]", + "EXPR [ (-4294967296, _1885) (-1, _1886) (1, _2466) (1, _2467) (1, _2468) (1, _2469) 4294967296 ]", + "EXPR [ (-1, _1885) (-1, _1887) 1 ]", + "EXPR [ (-1, _1888) (1, _2468) (1, _2469) 0 ]", + "EXPR [ (-1, _1889) (-1, _2466) (-1, _2467) 0 ]", + "BRILLIG CALL func 1: inputs: [Single(Expression { mul_terms: [(-1, Witness(1875), Witness(1878)), (-1, Witness(1877), Witness(1879)), (1, Witness(1885), Witness(1888)), (1, Witness(1887), Witness(1889))], linear_combinations: [], q_c: 4294967296 }), Single(Expression { mul_terms: [], linear_combinations: [], q_c: 4294967296 })], outputs: [Simple(Witness(1890)), Simple(Witness(1891))]", + "BLACKBOX::RANGE [(_1890, 1)] []", + "BLACKBOX::RANGE [(_1891, 32)] []", + "EXPR [ (-1, _1875, _1878) (-1, _2471) 0 ]", + "EXPR [ (-1, _1877, _1879) (-1, _2472) 0 ]", + "EXPR [ (1, _1885, _1888) (-1, _2473) 0 ]", + "EXPR [ (1, _1887, _1889) (-1, _2474) 0 ]", + "EXPR [ (-4294967296, _1890) (-1, _1891) (1, _2471) (1, _2472) (1, _2473) (1, _2474) 4294967296 ]", + "EXPR [ (-1, _1890) (-1, _1892) 1 ]", + "EXPR [ (-1, _1893) (1, _2473) (1, _2474) 0 ]", + "EXPR [ (-1, _1894) (-1, _2471) (-1, _2472) 0 ]", + "EXPR [ (1, _1880, _1884) (1, _1882, _1883) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(12, Witness(1834))], q_c: 0 })], outputs: [Simple(Witness(1895))]", + "EXPR [ (12, _1834, _1895) (1, _1896) -1 ]", + "EXPR [ (12, _1834, _1896) 0 ]", + "EXPR [ (-1, _1896) (-1, _1897) 1 ]", + "EXPR [ (2, _1834, _1834) (-1, _1898) 0 ]", + "EXPR [ (1, _1897, _1898) (3, _1896) -2 ]", + "EXPR [ (1, _1885, _1889) (1, _1887, _1888) (-1, _1899) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1899))], q_c: 0 })], outputs: [Simple(Witness(1900))]", + "EXPR [ (1, _1899, _1900) (1, _1901) -1 ]", + "EXPR [ (1, _1899, _1901) 0 ]", + "EXPR [ (1, _1890, _1894) (1, _1892, _1893) (-1, _1902) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1902))], q_c: 0 })], outputs: [Simple(Witness(1903))]", + "EXPR [ (1, _1902, _1903) (1, _1904) -1 ]", + "EXPR [ (1, _1902, _1904) 0 ]", + "EXPR [ (-1, _1904) (-1, _1905) 1 ]", + "EXPR [ (-2, _1896, _1901) (2, _1896) (3, _1901) (-1, _1906) 0 ]", + "EXPR [ (1, _1890, _1893) (1, _1892, _1894) (-1, _1907) 0 ]", + "BRILLIG CALL func 0: inputs: [Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(1907))], q_c: 0 })], outputs: [Simple(Witness(1908))]", + "EXPR [ (1, _1907, _1908) (1, _1909) -1 ]", + "EXPR [ (1, _1907, _1909) 0 ]", + "EXPR [ (-1, _1909) (-1, _1910) 1 ]", + "EXPR [ (1, _1905, _1906) (4, _1904) (-1, _1911) 0 ]", + "EXPR [ (1, _1910, _1911) (5, _1909) 0 ]", "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) } }]", "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\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 type H = H;\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 u8 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 u16 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 u32 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 u64 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", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_9193/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_9193/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index 6135024db13..ffb77361653 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_9193/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_9193/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -17,10 +17,6 @@ expression: artifact ], "return_type": null, "error_types": { - "12639702852095440652": { - "error_kind": "string", - "string": "Index out of bounds, array has size 0" - }, "14225679739041873922": { "error_kind": "string", "string": "Index out of bounds" @@ -35,7 +31,7 @@ expression: artifact "return value indices : []", "EXPR [ (-1, _0) 0 ]" ], - "debug_symbols": "nZHbCsIwDIbfJde7qCfUvYrI6LpsFEJbslaQsXc3G1YnKMiucvjz/YFkgAbr1FXWtb6H8jJAzZbIdhV5o6P1TrrDWEAuq8iI0oKFLlTQjC5C6RJRATdNaR7qg3ZzjJpFVQWgaySKYWsJp2ws3rT6je4yu9u84MP/9DHTpzX0PtPnNbT6Tl+l0sbyx6VBQbkdJzO2uiZ8Xr9NziyeEe8hK/ldgb3BJjFOdrMmCx4=", + "debug_symbols": "dY/RCoMwDEX/Jc99cIyx4a+MIbVGCYS0xHYwxH9fFN3cw57S5Pbc5E7QYVuGhqSPI9T3CVolZhoajsFnimLTaXawt01WRBvBQTcqeUXJUEthdvD0XNZPY/Ky1uzV1MoBSmfVDHtiXF6z+9LVf/R83djz7QNfjH5Y5wPpz71QQX2aFzMl3zJuGfoi4RApv9Ku7KGTxoBdUVzsVs0WvAE=", "file_map": { "50": { "source": "fn main(a: bool) {\n if a { 1 / [][0]; };\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_9193/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_9193/execute__tests__force_brillig_false_inliner_0.snap index 6135024db13..ffb77361653 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_9193/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_9193/execute__tests__force_brillig_false_inliner_0.snap @@ -17,10 +17,6 @@ expression: artifact ], "return_type": null, "error_types": { - "12639702852095440652": { - "error_kind": "string", - "string": "Index out of bounds, array has size 0" - }, "14225679739041873922": { "error_kind": "string", "string": "Index out of bounds" @@ -35,7 +31,7 @@ expression: artifact "return value indices : []", "EXPR [ (-1, _0) 0 ]" ], - "debug_symbols": "nZHbCsIwDIbfJde7qCfUvYrI6LpsFEJbslaQsXc3G1YnKMiucvjz/YFkgAbr1FXWtb6H8jJAzZbIdhV5o6P1TrrDWEAuq8iI0oKFLlTQjC5C6RJRATdNaR7qg3ZzjJpFVQWgaySKYWsJp2ws3rT6je4yu9u84MP/9DHTpzX0PtPnNbT6Tl+l0sbyx6VBQbkdJzO2uiZ8Xr9NziyeEe8hK/ldgb3BJjFOdrMmCx4=", + "debug_symbols": "dY/RCoMwDEX/Jc99cIyx4a+MIbVGCYS0xHYwxH9fFN3cw57S5Pbc5E7QYVuGhqSPI9T3CVolZhoajsFnimLTaXawt01WRBvBQTcqeUXJUEthdvD0XNZPY/Ky1uzV1MoBSmfVDHtiXF6z+9LVf/R83djz7QNfjH5Y5wPpz71QQX2aFzMl3zJuGfoi4RApv9Ku7KGTxoBdUVzsVs0WvAE=", "file_map": { "50": { "source": "fn main(a: bool) {\n if a { 1 / [][0]; };\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_9193/execute__tests__force_brillig_false_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_9193/execute__tests__force_brillig_false_inliner_9223372036854775807.snap index 6135024db13..ffb77361653 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_9193/execute__tests__force_brillig_false_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_9193/execute__tests__force_brillig_false_inliner_9223372036854775807.snap @@ -17,10 +17,6 @@ expression: artifact ], "return_type": null, "error_types": { - "12639702852095440652": { - "error_kind": "string", - "string": "Index out of bounds, array has size 0" - }, "14225679739041873922": { "error_kind": "string", "string": "Index out of bounds" @@ -35,7 +31,7 @@ expression: artifact "return value indices : []", "EXPR [ (-1, _0) 0 ]" ], - "debug_symbols": "nZHbCsIwDIbfJde7qCfUvYrI6LpsFEJbslaQsXc3G1YnKMiucvjz/YFkgAbr1FXWtb6H8jJAzZbIdhV5o6P1TrrDWEAuq8iI0oKFLlTQjC5C6RJRATdNaR7qg3ZzjJpFVQWgaySKYWsJp2ws3rT6je4yu9u84MP/9DHTpzX0PtPnNbT6Tl+l0sbyx6VBQbkdJzO2uiZ8Xr9NziyeEe8hK/ldgb3BJjFOdrMmCx4=", + "debug_symbols": "dY/RCoMwDEX/Jc99cIyx4a+MIbVGCYS0xHYwxH9fFN3cw57S5Pbc5E7QYVuGhqSPI9T3CVolZhoajsFnimLTaXawt01WRBvBQTcqeUXJUEthdvD0XNZPY/Ky1uzV1MoBSmfVDHtiXF6z+9LVf/R83djz7QNfjH5Y5wPpz71QQX2aFzMl3zJuGfoi4RApv9Ku7KGTxoBdUVzsVs0WvAE=", "file_map": { "50": { "source": "fn main(a: bool) {\n if a { 1 / [][0]; };\n}\n",