diff --git a/packages/protocol/contracts/L1/libs/LibProving.sol b/packages/protocol/contracts/L1/libs/LibProving.sol index e80af17e8e..1b18817482 100644 --- a/packages/protocol/contracts/L1/libs/LibProving.sol +++ b/packages/protocol/contracts/L1/libs/LibProving.sol @@ -215,14 +215,6 @@ library LibProving { if (!skipZKPVerification) { for (uint256 i; i < config.zkProofsPerBlock; ++i) { - bytes32 instance = keccak256( - abi.encode( - blockHash, - evidence.prover, - evidence.meta.txListHash - ) - ); - if ( !proofVerifier.verifyZKP({ verifierId: string( @@ -234,7 +226,7 @@ library LibProving { ) ), zkproof: evidence.proofs[i], - instance: instance + instance: _getInstance(evidence) }) ) revert L1_ZKP(); } @@ -459,4 +451,24 @@ library LibProving { header.mixHash != meta.mixHash ) revert L1_META_MISMATCH(); } + + function _getInstance( + Evidence memory evidence + ) internal pure returns (bytes32 instance) { + bytes[] memory headerRLPItemsList = LibBlockHeader + .getBlockHeaderRLPItemsList(evidence.header); + bytes[] memory instanceRLPItemsList = new bytes[]( + headerRLPItemsList.length + 2 + ); + + for (uint256 i; i < headerRLPItemsList.length; ++i) { + instanceRLPItemsList[i] = headerRLPItemsList[i]; + } + instanceRLPItemsList[headerRLPItemsList.length] = LibRLPWriter + .writeAddress(evidence.prover); + instanceRLPItemsList[headerRLPItemsList.length + 1] = LibRLPWriter + .writeHash(evidence.meta.txListHash); + + instance = keccak256(LibRLPWriter.writeList(instanceRLPItemsList)); + } } diff --git a/packages/protocol/contracts/libs/LibBlockHeader.sol b/packages/protocol/contracts/libs/LibBlockHeader.sol index 78b4ff6515..0fccc415e7 100644 --- a/packages/protocol/contracts/libs/LibBlockHeader.sol +++ b/packages/protocol/contracts/libs/LibBlockHeader.sol @@ -34,7 +34,15 @@ library LibBlockHeader { function hashBlockHeader( BlockHeader memory header ) internal pure returns (bytes32) { - bytes[] memory list; + bytes memory rlpHeader = LibRLPWriter.writeList( + getBlockHeaderRLPItemsList(header) + ); + return keccak256(rlpHeader); + } + + function getBlockHeaderRLPItemsList( + BlockHeader memory header + ) internal pure returns (bytes[] memory list) { if (header.baseFeePerGas == 0) { // non-EIP11559 transaction list = new bytes[](15); @@ -63,9 +71,6 @@ library LibBlockHeader { // non-EIP11559 transaction list[15] = LibRLPWriter.writeUint(header.baseFeePerGas); } - - bytes memory rlpHeader = LibRLPWriter.writeList(list); - return keccak256(rlpHeader); } function isPartiallyValidForTaiko( diff --git a/packages/protocol/contracts/libs/LibZKP.sol b/packages/protocol/contracts/libs/LibZKP.sol index 7f97c885d5..24d8f36758 100644 --- a/packages/protocol/contracts/libs/LibZKP.sol +++ b/packages/protocol/contracts/libs/LibZKP.sol @@ -16,9 +16,14 @@ library LibZKP { bytes calldata zkproof, bytes32 instance ) internal view returns (bool verified) { - // TODO(david):public input is assembled in client software - // for testing purposes right now, move this part of logic - // here in this contract. - (verified, ) = plonkVerifier.staticcall(zkproof); + (verified, ) = plonkVerifier.staticcall( + bytes.concat( + bytes16(0), + bytes16(instance), // left 16 bytes of the given instance + bytes16(0), + bytes16(uint128(uint256(instance))), // right 16 bytes of the given instance + zkproof + ) + ); } } diff --git a/packages/protocol/contracts/libs/yul/PlonkVerifier.yulp b/packages/protocol/contracts/libs/yul/PlonkVerifier.yulp deleted file mode 100644 index bf9b565451..0000000000 --- a/packages/protocol/contracts/libs/yul/PlonkVerifier.yulp +++ /dev/null @@ -1,1627 +0,0 @@ -// Code generated - DO NOT EDIT. -// SPDX-License-Identifier: MIT -// _____ _ _ _ _ -// |_ _|_ _(_) |_____ | | __ _| |__ ___ -// | |/ _` | | / / _ \ | |__/ _` | '_ (_-< -// |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ - -object "plonk_verifier" { - code { - function allocate(size) -> ptr { - ptr := mload(0x40) - if eq(ptr, 0) { ptr := 0x60 } - mstore(0x40, add(ptr, size)) - } - let size := datasize("Runtime") - let offset := allocate(size) - datacopy(offset, dataoffset("Runtime"), size) - return(offset, size) - } - object "Runtime" { - code { - let success:bool := true - let f_p := 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47 - let f_q := 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001 - function validate_ec_point(x, y) -> valid:bool { - { - let x_lt_p:bool := lt(x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) - let y_lt_p:bool := lt(y, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) - valid := and(x_lt_p, y_lt_p) - } - { - let x_is_zero:bool := eq(x, 0) - let y_is_zero:bool := eq(y, 0) - let x_or_y_is_zero:bool := or(x_is_zero, y_is_zero) - let x_and_y_is_not_zero:bool := not(x_or_y_is_zero) - valid := and(x_and_y_is_not_zero, valid) - } - { - let y_square := mulmod(y, y, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) - let x_square := mulmod(x, x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) - let x_cube := mulmod(x_square, x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) - let x_cube_plus_3 := addmod(x_cube, 3, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) - let y_square_eq_x_cube_plus_3:bool := eq(x_cube_plus_3, y_square) - valid := and(y_square_eq_x_cube_plus_3, valid) - } - } - mstore(0x20, mod(calldataload(0x0), f_q)) - mstore(0x40, mod(calldataload(0x20), f_q)) - mstore(0x60, mod(calldataload(0x40), f_q)) - mstore(0x80, mod(calldataload(0x60), f_q)) - mstore(0xa0, mod(calldataload(0x80), f_q)) - mstore(0x0, 11568943549258518004006755376380433677357566576321358651994428576969508458818) - - { - let x := calldataload(0xa0) - mstore(0xc0, x) - let y := calldataload(0xc0) - mstore(0xe0, y) - success := and(validate_ec_point(x, y), success) - } - - { - let x := calldataload(0xe0) - mstore(0x100, x) - let y := calldataload(0x100) - mstore(0x120, y) - success := and(validate_ec_point(x, y), success) - } - - { - let x := calldataload(0x120) - mstore(0x140, x) - let y := calldataload(0x140) - mstore(0x160, y) - success := and(validate_ec_point(x, y), success) - } - - { - let x := calldataload(0x160) - mstore(0x180, x) - let y := calldataload(0x180) - mstore(0x1a0, y) - success := and(validate_ec_point(x, y), success) - } - - { - let x := calldataload(0x1a0) - mstore(0x1c0, x) - let y := calldataload(0x1c0) - mstore(0x1e0, y) - success := and(validate_ec_point(x, y), success) - } - - { - let x := calldataload(0x1e0) - mstore(0x200, x) - let y := calldataload(0x200) - mstore(0x220, y) - success := and(validate_ec_point(x, y), success) - } - - { - let x := calldataload(0x220) - mstore(0x240, x) - let y := calldataload(0x240) - mstore(0x260, y) - success := and(validate_ec_point(x, y), success) - } - - { - let x := calldataload(0x260) - mstore(0x280, x) - let y := calldataload(0x280) - mstore(0x2a0, y) - success := and(validate_ec_point(x, y), success) - } - - { - let x := calldataload(0x2a0) - mstore(0x2c0, x) - let y := calldataload(0x2c0) - mstore(0x2e0, y) - success := and(validate_ec_point(x, y), success) - } - - { - let x := calldataload(0x2e0) - mstore(0x300, x) - let y := calldataload(0x300) - mstore(0x320, y) - success := and(validate_ec_point(x, y), success) - } - - { - let x := calldataload(0x320) - mstore(0x340, x) - let y := calldataload(0x340) - mstore(0x360, y) - success := and(validate_ec_point(x, y), success) - } - - { - let x := calldataload(0x360) - mstore(0x380, x) - let y := calldataload(0x380) - mstore(0x3a0, y) - success := and(validate_ec_point(x, y), success) - } - - { - let x := calldataload(0x3a0) - mstore(0x3c0, x) - let y := calldataload(0x3c0) - mstore(0x3e0, y) - success := and(validate_ec_point(x, y), success) - } - mstore(0x400, keccak256(0x0, 1024)) - { - let hash := mload(0x400) - mstore(0x420, mod(hash, f_q)) - mstore(0x440, hash) - } - mstore8(1120, 1) - mstore(0x460, keccak256(0x440, 33)) - { - let hash := mload(0x460) - mstore(0x480, mod(hash, f_q)) - mstore(0x4a0, hash) - } - - { - let x := calldataload(0x3e0) - mstore(0x4c0, x) - let y := calldataload(0x400) - mstore(0x4e0, y) - success := and(validate_ec_point(x, y), success) - } - mstore(0x500, keccak256(0x4a0, 96)) - { - let hash := mload(0x500) - mstore(0x520, mod(hash, f_q)) - mstore(0x540, hash) - } - - { - let x := calldataload(0x420) - mstore(0x560, x) - let y := calldataload(0x440) - mstore(0x580, y) - success := and(validate_ec_point(x, y), success) - } - - { - let x := calldataload(0x460) - mstore(0x5a0, x) - let y := calldataload(0x480) - mstore(0x5c0, y) - success := and(validate_ec_point(x, y), success) - } - - { - let x := calldataload(0x4a0) - mstore(0x5e0, x) - let y := calldataload(0x4c0) - mstore(0x600, y) - success := and(validate_ec_point(x, y), success) - } - - { - let x := calldataload(0x4e0) - mstore(0x620, x) - let y := calldataload(0x500) - mstore(0x640, y) - success := and(validate_ec_point(x, y), success) - } - mstore(0x660, keccak256(0x540, 288)) - { - let hash := mload(0x660) - mstore(0x680, mod(hash, f_q)) - mstore(0x6a0, hash) - } - mstore8(1728, 1) - mstore(0x6c0, keccak256(0x6a0, 33)) - { - let hash := mload(0x6c0) - mstore(0x6e0, mod(hash, f_q)) - mstore(0x700, hash) - } - - { - let x := calldataload(0x520) - mstore(0x720, x) - let y := calldataload(0x540) - mstore(0x740, y) - success := and(validate_ec_point(x, y), success) - } - - { - let x := calldataload(0x560) - mstore(0x760, x) - let y := calldataload(0x580) - mstore(0x780, y) - success := and(validate_ec_point(x, y), success) - } - - { - let x := calldataload(0x5a0) - mstore(0x7a0, x) - let y := calldataload(0x5c0) - mstore(0x7c0, y) - success := and(validate_ec_point(x, y), success) - } - - { - let x := calldataload(0x5e0) - mstore(0x7e0, x) - let y := calldataload(0x600) - mstore(0x800, y) - success := and(validate_ec_point(x, y), success) - } - mstore(0x820, keccak256(0x700, 288)) - { - let hash := mload(0x820) - mstore(0x840, mod(hash, f_q)) - mstore(0x860, hash) - } - - { - let x := calldataload(0x620) - mstore(0x880, x) - let y := calldataload(0x640) - mstore(0x8a0, y) - success := and(validate_ec_point(x, y), success) - } - - { - let x := calldataload(0x660) - mstore(0x8c0, x) - let y := calldataload(0x680) - mstore(0x8e0, y) - success := and(validate_ec_point(x, y), success) - } - - { - let x := calldataload(0x6a0) - mstore(0x900, x) - let y := calldataload(0x6c0) - mstore(0x920, y) - success := and(validate_ec_point(x, y), success) - } - - { - let x := calldataload(0x6e0) - mstore(0x940, x) - let y := calldataload(0x700) - mstore(0x960, y) - success := and(validate_ec_point(x, y), success) - } - - { - let x := calldataload(0x720) - mstore(0x980, x) - let y := calldataload(0x740) - mstore(0x9a0, y) - success := and(validate_ec_point(x, y), success) - } - - { - let x := calldataload(0x760) - mstore(0x9c0, x) - let y := calldataload(0x780) - mstore(0x9e0, y) - success := and(validate_ec_point(x, y), success) - } - - { - let x := calldataload(0x7a0) - mstore(0xa00, x) - let y := calldataload(0x7c0) - mstore(0xa20, y) - success := and(validate_ec_point(x, y), success) - } - - { - let x := calldataload(0x7e0) - mstore(0xa40, x) - let y := calldataload(0x800) - mstore(0xa60, y) - success := and(validate_ec_point(x, y), success) - } - mstore(0xa80, keccak256(0x860, 544)) - { - let hash := mload(0xa80) - mstore(0xaa0, mod(hash, f_q)) - mstore(0xac0, hash) - } - mstore(0xae0, mod(calldataload(0x820), f_q)) - mstore(0xb00, mod(calldataload(0x840), f_q)) - mstore(0xb20, mod(calldataload(0x860), f_q)) - mstore(0xb40, mod(calldataload(0x880), f_q)) - mstore(0xb60, mod(calldataload(0x8a0), f_q)) - mstore(0xb80, mod(calldataload(0x8c0), f_q)) - mstore(0xba0, mod(calldataload(0x8e0), f_q)) - mstore(0xbc0, mod(calldataload(0x900), f_q)) - mstore(0xbe0, mod(calldataload(0x920), f_q)) - mstore(0xc00, mod(calldataload(0x940), f_q)) - mstore(0xc20, mod(calldataload(0x960), f_q)) - mstore(0xc40, mod(calldataload(0x980), f_q)) - mstore(0xc60, mod(calldataload(0x9a0), f_q)) - mstore(0xc80, mod(calldataload(0x9c0), f_q)) - mstore(0xca0, mod(calldataload(0x9e0), f_q)) - mstore(0xcc0, mod(calldataload(0xa00), f_q)) - mstore(0xce0, mod(calldataload(0xa20), f_q)) - mstore(0xd00, mod(calldataload(0xa40), f_q)) - mstore(0xd20, mod(calldataload(0xa60), f_q)) - mstore(0xd40, mod(calldataload(0xa80), f_q)) - mstore(0xd60, mod(calldataload(0xaa0), f_q)) - mstore(0xd80, mod(calldataload(0xac0), f_q)) - mstore(0xda0, mod(calldataload(0xae0), f_q)) - mstore(0xdc0, mod(calldataload(0xb00), f_q)) - mstore(0xde0, mod(calldataload(0xb20), f_q)) - mstore(0xe00, mod(calldataload(0xb40), f_q)) - mstore(0xe20, mod(calldataload(0xb60), f_q)) - mstore(0xe40, mod(calldataload(0xb80), f_q)) - mstore(0xe60, mod(calldataload(0xba0), f_q)) - mstore(0xe80, mod(calldataload(0xbc0), f_q)) - mstore(0xea0, mod(calldataload(0xbe0), f_q)) - mstore(0xec0, mod(calldataload(0xc00), f_q)) - mstore(0xee0, mod(calldataload(0xc20), f_q)) - mstore(0xf00, mod(calldataload(0xc40), f_q)) - mstore(0xf20, mod(calldataload(0xc60), f_q)) - mstore(0xf40, mod(calldataload(0xc80), f_q)) - mstore(0xf60, mod(calldataload(0xca0), f_q)) - mstore(0xf80, mod(calldataload(0xcc0), f_q)) - mstore(0xfa0, mod(calldataload(0xce0), f_q)) - mstore(0xfc0, mod(calldataload(0xd00), f_q)) - mstore(0xfe0, mod(calldataload(0xd20), f_q)) - mstore(0x1000, mod(calldataload(0xd40), f_q)) - mstore(0x1020, mod(calldataload(0xd60), f_q)) - mstore(0x1040, mod(calldataload(0xd80), f_q)) - mstore(0x1060, mod(calldataload(0xda0), f_q)) - mstore(0x1080, mod(calldataload(0xdc0), f_q)) - mstore(0x10a0, mod(calldataload(0xde0), f_q)) - mstore(0x10c0, keccak256(0xac0, 1536)) - { - let hash := mload(0x10c0) - mstore(0x10e0, mod(hash, f_q)) - mstore(0x1100, hash) - } - - { - let x := calldataload(0xe00) - mstore(0x1120, x) - let y := calldataload(0xe20) - mstore(0x1140, y) - success := and(validate_ec_point(x, y), success) - } - - { - let x := calldataload(0xe40) - mstore(0x1160, x) - let y := calldataload(0xe60) - mstore(0x1180, y) - success := and(validate_ec_point(x, y), success) - } - - { - let x := calldataload(0xe80) - mstore(0x11a0, x) - let y := calldataload(0xea0) - mstore(0x11c0, y) - success := and(validate_ec_point(x, y), success) - } - - { - let x := calldataload(0xec0) - mstore(0x11e0, x) - let y := calldataload(0xee0) - mstore(0x1200, y) - success := and(validate_ec_point(x, y), success) - } - - { - let x := calldataload(0xf00) - mstore(0x1220, x) - let y := calldataload(0xf20) - mstore(0x1240, y) - success := and(validate_ec_point(x, y), success) - } - - { - let x := calldataload(0xf40) - mstore(0x1260, x) - let y := calldataload(0xf60) - mstore(0x1280, y) - success := and(validate_ec_point(x, y), success) - } - mstore(0x12a0, keccak256(0x1100, 416)) - { - let hash := mload(0x12a0) - mstore(0x12c0, mod(hash, f_q)) - mstore(0x12e0, hash) - } - mstore(0x1300, mulmod(mload(0xaa0), mload(0xaa0), f_q)) - mstore(0x1320, mulmod(mload(0x1300), mload(0x1300), f_q)) - mstore(0x1340, mulmod(mload(0x1320), mload(0x1320), f_q)) - mstore(0x1360, mulmod(mload(0x1340), mload(0x1340), f_q)) - mstore(0x1380, mulmod(mload(0x1360), mload(0x1360), f_q)) - mstore(0x13a0, mulmod(mload(0x1380), mload(0x1380), f_q)) - mstore(0x13c0, mulmod(mload(0x13a0), mload(0x13a0), f_q)) - mstore(0x13e0, mulmod(mload(0x13c0), mload(0x13c0), f_q)) - mstore(0x1400, mulmod(mload(0x13e0), mload(0x13e0), f_q)) - mstore(0x1420, mulmod(mload(0x1400), mload(0x1400), f_q)) - mstore(0x1440, mulmod(mload(0x1420), mload(0x1420), f_q)) - mstore(0x1460, mulmod(mload(0x1440), mload(0x1440), f_q)) - mstore(0x1480, mulmod(mload(0x1460), mload(0x1460), f_q)) - mstore(0x14a0, mulmod(mload(0x1480), mload(0x1480), f_q)) - mstore(0x14c0, mulmod(mload(0x14a0), mload(0x14a0), f_q)) - mstore(0x14e0, mulmod(mload(0x14c0), mload(0x14c0), f_q)) - mstore(0x1500, mulmod(mload(0x14e0), mload(0x14e0), f_q)) - mstore(0x1520, mulmod(mload(0x1500), mload(0x1500), f_q)) - mstore(0x1540, mulmod(mload(0x1520), mload(0x1520), f_q)) - mstore(0x1560, mulmod(mload(0x1540), mload(0x1540), f_q)) - mstore(0x1580, mulmod(mload(0x1560), mload(0x1560), f_q)) - mstore(0x15a0, addmod(mload(0x1580), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q)) - mstore(0x15c0, mulmod(mload(0x15a0), 21888232434711746154598842647110004286396165347431605739555851272621938401409, f_q)) - mstore(0x15e0, mulmod(mload(0x15c0), 20975929243409798062839949658616274858986091382510192949221301676705706354487, f_q)) - mstore(0x1600, addmod(mload(0xaa0), 912313628429477159406456086641000229562273017905841394476902509870102141130, f_q)) - mstore(0x1620, mulmod(mload(0x15c0), 495188420091111145957709789221178673495499187437761988132837836548330853701, f_q)) - mstore(0x1640, addmod(mload(0xaa0), 21393054451748164076288695956036096415052865212978272355565366350027477641916, f_q)) - mstore(0x1660, mulmod(mload(0x15c0), 16064522944768515290584536219762686197737451920702130080538975732575755569557, f_q)) - mstore(0x1680, addmod(mload(0xaa0), 5823719927070759931661869525494588890810912479713904263159228454000052926060, f_q)) - mstore(0x16a0, mulmod(mload(0x15c0), 14686510910986211321976396297238126901237973400949744736326777596334651355305, f_q)) - mstore(0x16c0, addmod(mload(0xaa0), 7201731960853063900270009448019148187310390999466289607371426590241157140312, f_q)) - mstore(0x16e0, mulmod(mload(0x15c0), 10939663269433627367777756708678102241564365262857670666700619874077960926249, f_q)) - mstore(0x1700, addmod(mload(0xaa0), 10948579602405647854468649036579172846983999137558363676997584312497847569368, f_q)) - mstore(0x1720, mulmod(mload(0x15c0), 15402826414547299628414612080036060696555554914079673875872749760617770134879, f_q)) - mstore(0x1740, addmod(mload(0xaa0), 6485416457291975593831793665221214391992809486336360467825454425958038360738, f_q)) - mstore(0x1760, mulmod(mload(0x15c0), 2785514556381676080176937710880804108647911392478702105860685610379369825016, f_q)) - mstore(0x1780, addmod(mload(0xaa0), 19102728315457599142069468034376470979900453007937332237837518576196438670601, f_q)) - mstore(0x17a0, mulmod(mload(0x15c0), 1, f_q)) - mstore(0x17c0, addmod(mload(0xaa0), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q)) - mstore(0x17e0, mulmod(mload(0x15c0), 1426404432721484388505361748317961535523355871255605456897797744433766488507, f_q)) - mstore(0x1800, addmod(mload(0xaa0), 20461838439117790833741043996939313553025008529160428886800406442142042007110, f_q)) - mstore(0x1820, mulmod(mload(0x15c0), 19032961837237948602743626455740240236231119053033140765040043513661803148152, f_q)) - mstore(0x1840, addmod(mload(0xaa0), 2855281034601326619502779289517034852317245347382893578658160672914005347465, f_q)) - mstore(0x1860, mulmod(mload(0x15c0), 3766081621734395783232337525162072736827576297943013392955872170138036189193, f_q)) - mstore(0x1880, addmod(mload(0xaa0), 18122161250104879439014068220095202351720788102473020950742332016437772306424, f_q)) - mstore(0x18a0, mulmod(mload(0x15c0), 5854133144571823792863860130267644613802765696134002830362054821530146160770, f_q)) - mstore(0x18c0, addmod(mload(0xaa0), 16034109727267451429382545614989630474745598704282031513336149365045662334847, f_q)) - { - let prod := mload(0x1600) - - prod := mulmod(mload(0x1640), prod, f_q) - mstore(0x18e0, prod) - - prod := mulmod(mload(0x1680), prod, f_q) - mstore(0x1900, prod) - - prod := mulmod(mload(0x16c0), prod, f_q) - mstore(0x1920, prod) - - prod := mulmod(mload(0x1700), prod, f_q) - mstore(0x1940, prod) - - prod := mulmod(mload(0x1740), prod, f_q) - mstore(0x1960, prod) - - prod := mulmod(mload(0x1780), prod, f_q) - mstore(0x1980, prod) - - prod := mulmod(mload(0x17c0), prod, f_q) - mstore(0x19a0, prod) - - prod := mulmod(mload(0x1800), prod, f_q) - mstore(0x19c0, prod) - - prod := mulmod(mload(0x1840), prod, f_q) - mstore(0x19e0, prod) - - prod := mulmod(mload(0x1880), prod, f_q) - mstore(0x1a00, prod) - - prod := mulmod(mload(0x18c0), prod, f_q) - mstore(0x1a20, prod) - - prod := mulmod(mload(0x15a0), prod, f_q) - mstore(0x1a40, prod) - - } - mstore(0x1a80, 32) - mstore(0x1aa0, 32) - mstore(0x1ac0, 32) - mstore(0x1ae0, mload(0x1a40)) - mstore(0x1b00, 21888242871839275222246405745257275088548364400416034343698204186575808495615) - mstore(0x1b20, 21888242871839275222246405745257275088548364400416034343698204186575808495617) - success := and(eq(staticcall(gas(), 0x5, 0x1a80, 0xc0, 0x1a60, 0x20), 1), success) - { - - let inv := mload(0x1a60) - let v - - v := mload(0x15a0) - mstore(5536, mulmod(mload(0x1a20), inv, f_q)) - inv := mulmod(v, inv, f_q) - - v := mload(0x18c0) - mstore(6336, mulmod(mload(0x1a00), inv, f_q)) - inv := mulmod(v, inv, f_q) - - v := mload(0x1880) - mstore(6272, mulmod(mload(0x19e0), inv, f_q)) - inv := mulmod(v, inv, f_q) - - v := mload(0x1840) - mstore(6208, mulmod(mload(0x19c0), inv, f_q)) - inv := mulmod(v, inv, f_q) - - v := mload(0x1800) - mstore(6144, mulmod(mload(0x19a0), inv, f_q)) - inv := mulmod(v, inv, f_q) - - v := mload(0x17c0) - mstore(6080, mulmod(mload(0x1980), inv, f_q)) - inv := mulmod(v, inv, f_q) - - v := mload(0x1780) - mstore(6016, mulmod(mload(0x1960), inv, f_q)) - inv := mulmod(v, inv, f_q) - - v := mload(0x1740) - mstore(5952, mulmod(mload(0x1940), inv, f_q)) - inv := mulmod(v, inv, f_q) - - v := mload(0x1700) - mstore(5888, mulmod(mload(0x1920), inv, f_q)) - inv := mulmod(v, inv, f_q) - - v := mload(0x16c0) - mstore(5824, mulmod(mload(0x1900), inv, f_q)) - inv := mulmod(v, inv, f_q) - - v := mload(0x1680) - mstore(5760, mulmod(mload(0x18e0), inv, f_q)) - inv := mulmod(v, inv, f_q) - - v := mload(0x1640) - mstore(5696, mulmod(mload(0x1600), inv, f_q)) - inv := mulmod(v, inv, f_q) - mstore(0x1600, inv) - - } - mstore(0x1b40, mulmod(mload(0x15e0), mload(0x1600), f_q)) - mstore(0x1b60, mulmod(mload(0x1620), mload(0x1640), f_q)) - mstore(0x1b80, mulmod(mload(0x1660), mload(0x1680), f_q)) - mstore(0x1ba0, mulmod(mload(0x16a0), mload(0x16c0), f_q)) - mstore(0x1bc0, mulmod(mload(0x16e0), mload(0x1700), f_q)) - mstore(0x1be0, mulmod(mload(0x1720), mload(0x1740), f_q)) - mstore(0x1c00, mulmod(mload(0x1760), mload(0x1780), f_q)) - mstore(0x1c20, mulmod(mload(0x17a0), mload(0x17c0), f_q)) - mstore(0x1c40, mulmod(mload(0x17e0), mload(0x1800), f_q)) - mstore(0x1c60, mulmod(mload(0x1820), mload(0x1840), f_q)) - mstore(0x1c80, mulmod(mload(0x1860), mload(0x1880), f_q)) - mstore(0x1ca0, mulmod(mload(0x18a0), mload(0x18c0), f_q)) - { - let result := mulmod(mload(0x1c20), mload(0x20), f_q) - result := addmod(mulmod(mload(0x1c40), mload(0x40), f_q), result, f_q) - result := addmod(mulmod(mload(0x1c60), mload(0x60), f_q), result, f_q) - result := addmod(mulmod(mload(0x1c80), mload(0x80), f_q), result, f_q) - result := addmod(mulmod(mload(0x1ca0), mload(0xa0), f_q), result, f_q) - mstore(7360, result) - } - mstore(0x1ce0, mulmod(mload(0xb20), mload(0xb40), f_q)) - mstore(0x1d00, addmod(mload(0x1ce0), mload(0xae0), f_q)) - mstore(0x1d20, addmod(mload(0x1d00), sub(f_q, mload(0xb00)), f_q)) - mstore(0x1d40, mulmod(mload(0x1d20), mload(0xe80), f_q)) - mstore(0x1d60, mulmod(mload(0x840), mload(0x1d40), f_q)) - mstore(0x1d80, addmod(1, sub(f_q, mload(0xe60)), f_q)) - mstore(0x1da0, mulmod(mload(0x1d80), mload(0xe60), f_q)) - mstore(0x1dc0, addmod(mload(0xae0), sub(f_q, mload(0xb00)), f_q)) - mstore(0x1de0, mulmod(mload(0x1dc0), mload(0x1da0), f_q)) - mstore(0x1e00, addmod(mload(0x1d60), mload(0x1de0), f_q)) - mstore(0x1e20, mulmod(mload(0x840), mload(0x1e00), f_q)) - mstore(0x1e40, addmod(mload(0xb20), sub(f_q, mload(0xb60)), f_q)) - mstore(0x1e60, mulmod(mload(0x1e40), mload(0xe80), f_q)) - mstore(0x1e80, addmod(mload(0x1e20), mload(0x1e60), f_q)) - mstore(0x1ea0, mulmod(mload(0x840), mload(0x1e80), f_q)) - mstore(0x1ec0, addmod(2, sub(f_q, mload(0xe60)), f_q)) - mstore(0x1ee0, mulmod(mload(0x1ec0), mload(0xe60), f_q)) - mstore(0x1f00, addmod(mload(0xb80), sub(f_q, mload(0xae0)), f_q)) - mstore(0x1f20, mulmod(mload(0x1f00), mload(0x1ee0), f_q)) - mstore(0x1f40, addmod(mload(0x1ea0), mload(0x1f20), f_q)) - mstore(0x1f60, mulmod(mload(0x840), mload(0x1f40), f_q)) - mstore(0x1f80, addmod(mload(0xba0), sub(f_q, mload(0xbc0)), f_q)) - mstore(0x1fa0, mulmod(mload(0x1f80), mload(0xe00), f_q)) - mstore(0x1fc0, addmod(mload(0x1f60), mload(0x1fa0), f_q)) - mstore(0x1fe0, mulmod(mload(0x840), mload(0x1fc0), f_q)) - mstore(0x2000, addmod(mload(0xbe0), sub(f_q, mload(0xc00)), f_q)) - mstore(0x2020, mulmod(mload(0x2000), mload(0xe00), f_q)) - mstore(0x2040, addmod(mload(0x1fe0), mload(0x2020), f_q)) - mstore(0x2060, mulmod(mload(0x840), mload(0x2040), f_q)) - mstore(0x2080, addmod(1, sub(f_q, mload(0xe00)), f_q)) - mstore(0x20a0, mulmod(mload(0x2080), 1, f_q)) - mstore(0x20c0, addmod(1, sub(f_q, mload(0xe20)), f_q)) - mstore(0x20e0, mulmod(mload(0x20c0), mload(0x20a0), f_q)) - mstore(0x2100, addmod(1, sub(f_q, mload(0x20e0)), f_q)) - mstore(0x2120, addmod(mload(0xc20), sub(f_q, mload(0xc40)), f_q)) - mstore(0x2140, mulmod(mload(0x2120), mload(0x2100), f_q)) - mstore(0x2160, addmod(mload(0x2060), mload(0x2140), f_q)) - mstore(0x2180, mulmod(mload(0x840), mload(0x2160), f_q)) - mstore(0x21a0, mulmod(mload(0xba0), mload(0xe20), f_q)) - mstore(0x21c0, mulmod(mload(0xc60), mload(0xba0), f_q)) - mstore(0x21e0, addmod(1, sub(f_q, mload(0x21c0)), f_q)) - mstore(0x2200, mulmod(mload(0x21e0), mload(0x21a0), f_q)) - mstore(0x2220, addmod(mload(0x2180), mload(0x2200), f_q)) - mstore(0x2240, mulmod(mload(0x840), mload(0x2220), f_q)) - mstore(0x2260, mulmod(mload(0xc20), mload(0x2100), f_q)) - mstore(0x2280, mulmod(mload(0xc80), mload(0xc20), f_q)) - mstore(0x22a0, addmod(1, sub(f_q, mload(0x2280)), f_q)) - mstore(0x22c0, mulmod(mload(0x22a0), mload(0x2260), f_q)) - mstore(0x22e0, addmod(mload(0x2240), mload(0x22c0), f_q)) - mstore(0x2300, mulmod(mload(0x840), mload(0x22e0), f_q)) - mstore(0x2320, addmod(mload(0xcc0), sub(f_q, mload(0xba0)), f_q)) - mstore(0x2340, mulmod(mload(0x2320), mload(0xe20), f_q)) - mstore(0x2360, mulmod(mload(0xca0), mload(0x2320), f_q)) - mstore(0x2380, addmod(1, sub(f_q, mload(0x2360)), f_q)) - mstore(0x23a0, mulmod(mload(0x2380), mload(0x2340), f_q)) - mstore(0x23c0, addmod(mload(0x2300), mload(0x23a0), f_q)) - mstore(0x23e0, mulmod(mload(0x840), mload(0x23c0), f_q)) - mstore(0x2400, mulmod(mload(0xbe0), mload(0x21e0), f_q)) - mstore(0x2420, mulmod(mload(0x2400), mload(0xe20), f_q)) - mstore(0x2440, addmod(mload(0x23e0), mload(0x2420), f_q)) - mstore(0x2460, mulmod(mload(0x840), mload(0x2440), f_q)) - mstore(0x2480, mulmod(mload(0xcc0), mload(0x21e0), f_q)) - mstore(0x24a0, mulmod(mload(0x2480), mload(0xe20), f_q)) - mstore(0x24c0, addmod(mload(0x2460), mload(0x24a0), f_q)) - mstore(0x24e0, mulmod(mload(0x840), mload(0x24c0), f_q)) - mstore(0x2500, mulmod(mload(0xda0), mload(0x21e0), f_q)) - mstore(0x2520, mulmod(mload(0x2500), mload(0xe20), f_q)) - mstore(0x2540, addmod(mload(0x24e0), mload(0x2520), f_q)) - mstore(0x2560, mulmod(mload(0x840), mload(0x2540), f_q)) - mstore(0x2580, mulmod(mload(0xd60), mload(0x21e0), f_q)) - mstore(0x25a0, mulmod(mload(0x2580), mload(0xe20), f_q)) - mstore(0x25c0, addmod(mload(0x2560), mload(0x25a0), f_q)) - mstore(0x25e0, mulmod(mload(0x840), mload(0x25c0), f_q)) - mstore(0x2600, addmod(1, sub(f_q, mload(0x21e0)), f_q)) - mstore(0x2620, mulmod(mload(0x2600), mload(0xe20), f_q)) - mstore(0x2640, addmod(mload(0xd00), sub(f_q, mload(0xbe0)), f_q)) - mstore(0x2660, addmod(mload(0x2640), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q)) - mstore(0x2680, mulmod(mload(0x2660), mload(0x2380), f_q)) - mstore(0x26a0, mulmod(mload(0x2680), mload(0x2620), f_q)) - mstore(0x26c0, addmod(mload(0x25e0), mload(0x26a0), f_q)) - mstore(0x26e0, mulmod(mload(0x840), mload(0x26c0), f_q)) - mstore(0x2700, mulmod(mload(0xd00), mload(0x2320), f_q)) - mstore(0x2720, mulmod(mload(0x2700), mload(0x2620), f_q)) - mstore(0x2740, addmod(mload(0x26e0), mload(0x2720), f_q)) - mstore(0x2760, mulmod(mload(0x840), mload(0x2740), f_q)) - mstore(0x2780, addmod(mload(0xd80), sub(f_q, mload(0xd60)), f_q)) - mstore(0x27a0, mulmod(mload(0xd40), mload(0xd20), f_q)) - mstore(0x27c0, addmod(1, sub(f_q, mload(0x27a0)), f_q)) - mstore(0x27e0, mulmod(mload(0x27c0), 4, f_q)) - mstore(0x2800, mulmod(mload(0x27a0), 16, f_q)) - mstore(0x2820, addmod(mload(0x27e0), mload(0x2800), f_q)) - mstore(0x2840, addmod(mload(0x2780), sub(f_q, mload(0x2820)), f_q)) - mstore(0x2860, mulmod(mload(0x2840), mload(0x2380), f_q)) - mstore(0x2880, mulmod(mload(0x2860), mload(0x2620), f_q)) - mstore(0x28a0, addmod(mload(0x2760), mload(0x2880), f_q)) - mstore(0x28c0, mulmod(mload(0x840), mload(0x28a0), f_q)) - mstore(0x28e0, mulmod(mload(0xce0), mload(0xcc0), f_q)) - mstore(0x2900, mulmod(mload(0x2320), mload(0x28e0), f_q)) - mstore(0x2920, addmod(mload(0xd80), sub(f_q, mload(0x2820)), f_q)) - mstore(0x2940, mulmod(mload(0x2920), mload(0x2900), f_q)) - mstore(0x2960, mulmod(mload(0x2940), mload(0x2620), f_q)) - mstore(0x2980, addmod(mload(0x28c0), mload(0x2960), f_q)) - mstore(0x29a0, mulmod(mload(0x840), mload(0x2980), f_q)) - mstore(0x29c0, mulmod(mload(0xda0), mload(0x2380), f_q)) - mstore(0x29e0, mulmod(mload(0x29c0), mload(0x2620), f_q)) - mstore(0x2a00, addmod(mload(0x29a0), mload(0x29e0), f_q)) - mstore(0x2a20, mulmod(mload(0x840), mload(0x2a00), f_q)) - mstore(0x2a40, addmod(mload(0xda0), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q)) - mstore(0x2a60, mulmod(mload(0x2a40), mload(0x2320), f_q)) - mstore(0x2a80, mulmod(mload(0x2a60), mload(0x2620), f_q)) - mstore(0x2aa0, addmod(mload(0x2a20), mload(0x2a80), f_q)) - mstore(0x2ac0, mulmod(mload(0x840), mload(0x2aa0), f_q)) - mstore(0x2ae0, mulmod(mload(0x2600), mload(0xe40), f_q)) - mstore(0x2b00, addmod(mload(0xbe0), 21888242871839275222246405745257275088548364400416034343698204186575808495617, f_q)) - mstore(0x2b20, mulmod(mload(0x2b00), mload(0x2ae0), f_q)) - mstore(0x2b40, addmod(mload(0x2ac0), mload(0x2b20), f_q)) - mstore(0x2b60, mulmod(mload(0x840), mload(0x2b40), f_q)) - mstore(0x2b80, mulmod(mload(0x22a0), 4, f_q)) - mstore(0x2ba0, addmod(1, sub(f_q, mload(0x22a0)), f_q)) - mstore(0x2bc0, mulmod(mload(0x2ba0), 16, f_q)) - mstore(0x2be0, addmod(mload(0x2b80), mload(0x2bc0), f_q)) - mstore(0x2c00, addmod(mload(0xd60), sub(f_q, mload(0x2be0)), f_q)) - mstore(0x2c20, mulmod(mload(0x2c00), mload(0x2ae0), f_q)) - mstore(0x2c40, addmod(mload(0x2b60), mload(0x2c20), f_q)) - mstore(0x2c60, mulmod(mload(0x840), mload(0x2c40), f_q)) - mstore(0x2c80, addmod(mload(0xde0), 21888242871839275222246405745257275088548364400416034343698204186575808495609, f_q)) - mstore(0x2ca0, mulmod(mload(0x2c80), mload(0xe00), f_q)) - mstore(0x2cc0, mulmod(mload(0xc60), mload(0x2c80), f_q)) - mstore(0x2ce0, addmod(1, sub(f_q, mload(0x2cc0)), f_q)) - mstore(0x2d00, mulmod(mload(0x2ce0), mload(0x2ca0), f_q)) - mstore(0x2d20, addmod(mload(0x2c60), mload(0x2d00), f_q)) - mstore(0x2d40, mulmod(mload(0x840), mload(0x2d20), f_q)) - mstore(0x2d60, mulmod(mload(0x2ce0), mload(0xe00), f_q)) - mstore(0x2d80, mulmod(mload(0x22a0), mload(0x2d60), f_q)) - mstore(0x2da0, mulmod(mload(0xd20), mload(0x2d80), f_q)) - mstore(0x2dc0, addmod(mload(0x2d40), mload(0x2da0), f_q)) - mstore(0x2de0, mulmod(mload(0x840), mload(0x2dc0), f_q)) - mstore(0x2e00, addmod(1, sub(f_q, mload(0xf40)), f_q)) - mstore(0x2e20, mulmod(mload(0x2e00), mload(0x1c20), f_q)) - mstore(0x2e40, addmod(mload(0x2de0), mload(0x2e20), f_q)) - mstore(0x2e60, mulmod(mload(0x840), mload(0x2e40), f_q)) - mstore(0x2e80, mulmod(mload(0xf40), mload(0xf40), f_q)) - mstore(0x2ea0, addmod(mload(0x2e80), sub(f_q, mload(0xf40)), f_q)) - mstore(0x2ec0, mulmod(mload(0x2ea0), mload(0x1b40), f_q)) - mstore(0x2ee0, addmod(mload(0x2e60), mload(0x2ec0), f_q)) - mstore(0x2f00, mulmod(mload(0x840), mload(0x2ee0), f_q)) - mstore(0x2f20, addmod(1, sub(f_q, mload(0x1b40)), f_q)) - mstore(0x2f40, addmod(mload(0x1b60), mload(0x1b80), f_q)) - mstore(0x2f60, addmod(mload(0x2f40), mload(0x1ba0), f_q)) - mstore(0x2f80, addmod(mload(0x2f60), mload(0x1bc0), f_q)) - mstore(0x2fa0, addmod(mload(0x2f80), mload(0x1be0), f_q)) - mstore(0x2fc0, addmod(mload(0x2fa0), mload(0x1c00), f_q)) - mstore(0x2fe0, addmod(mload(0x2f20), sub(f_q, mload(0x2fc0)), f_q)) - mstore(0x3000, mulmod(mload(0xec0), mload(0x680), f_q)) - mstore(0x3020, addmod(mload(0xae0), mload(0x3000), f_q)) - mstore(0x3040, addmod(mload(0x3020), mload(0x6e0), f_q)) - mstore(0x3060, mulmod(mload(0xee0), mload(0x680), f_q)) - mstore(0x3080, addmod(mload(0xb00), mload(0x3060), f_q)) - mstore(0x30a0, addmod(mload(0x3080), mload(0x6e0), f_q)) - mstore(0x30c0, mulmod(mload(0x30a0), mload(0x3040), f_q)) - mstore(0x30e0, mulmod(mload(0xf00), mload(0x680), f_q)) - mstore(0x3100, addmod(mload(0xb20), mload(0x30e0), f_q)) - mstore(0x3120, addmod(mload(0x3100), mload(0x6e0), f_q)) - mstore(0x3140, mulmod(mload(0x3120), mload(0x30c0), f_q)) - mstore(0x3160, mulmod(mload(0xf20), mload(0x680), f_q)) - mstore(0x3180, addmod(mload(0x1cc0), mload(0x3160), f_q)) - mstore(0x31a0, addmod(mload(0x3180), mload(0x6e0), f_q)) - mstore(0x31c0, mulmod(mload(0x31a0), mload(0x3140), f_q)) - mstore(0x31e0, mulmod(mload(0x31c0), mload(0xf60), f_q)) - mstore(0x3200, mulmod(1, mload(0x680), f_q)) - mstore(0x3220, mulmod(mload(0xaa0), mload(0x3200), f_q)) - mstore(0x3240, addmod(mload(0xae0), mload(0x3220), f_q)) - mstore(0x3260, addmod(mload(0x3240), mload(0x6e0), f_q)) - mstore(0x3280, mulmod(4131629893567559867359510883348571134090853742863529169391034518566172092834, mload(0x680), f_q)) - mstore(0x32a0, mulmod(mload(0xaa0), mload(0x3280), f_q)) - mstore(0x32c0, addmod(mload(0xb00), mload(0x32a0), f_q)) - mstore(0x32e0, addmod(mload(0x32c0), mload(0x6e0), f_q)) - mstore(0x3300, mulmod(mload(0x32e0), mload(0x3260), f_q)) - mstore(0x3320, mulmod(8910878055287538404433155982483128285667088683464058436815641868457422632747, mload(0x680), f_q)) - mstore(0x3340, mulmod(mload(0xaa0), mload(0x3320), f_q)) - mstore(0x3360, addmod(mload(0xb20), mload(0x3340), f_q)) - mstore(0x3380, addmod(mload(0x3360), mload(0x6e0), f_q)) - mstore(0x33a0, mulmod(mload(0x3380), mload(0x3300), f_q)) - mstore(0x33c0, mulmod(11166246659983828508719468090013646171463329086121580628794302409516816350802, mload(0x680), f_q)) - mstore(0x33e0, mulmod(mload(0xaa0), mload(0x33c0), f_q)) - mstore(0x3400, addmod(mload(0x1cc0), mload(0x33e0), f_q)) - mstore(0x3420, addmod(mload(0x3400), mload(0x6e0), f_q)) - mstore(0x3440, mulmod(mload(0x3420), mload(0x33a0), f_q)) - mstore(0x3460, mulmod(mload(0x3440), mload(0xf40), f_q)) - mstore(0x3480, addmod(mload(0x31e0), sub(f_q, mload(0x3460)), f_q)) - mstore(0x34a0, mulmod(mload(0x3480), mload(0x2fe0), f_q)) - mstore(0x34c0, addmod(mload(0x2f00), mload(0x34a0), f_q)) - mstore(0x34e0, mulmod(mload(0x840), mload(0x34c0), f_q)) - mstore(0x3500, addmod(1, sub(f_q, mload(0xf80)), f_q)) - mstore(0x3520, mulmod(mload(0x3500), mload(0x1c20), f_q)) - mstore(0x3540, addmod(mload(0x34e0), mload(0x3520), f_q)) - mstore(0x3560, mulmod(mload(0x840), mload(0x3540), f_q)) - mstore(0x3580, mulmod(mload(0xf80), mload(0xf80), f_q)) - mstore(0x35a0, addmod(mload(0x3580), sub(f_q, mload(0xf80)), f_q)) - mstore(0x35c0, mulmod(mload(0x35a0), mload(0x1b40), f_q)) - mstore(0x35e0, addmod(mload(0x3560), mload(0x35c0), f_q)) - mstore(0x3600, mulmod(mload(0x840), mload(0x35e0), f_q)) - mstore(0x3620, addmod(mload(0xfc0), mload(0x680), f_q)) - mstore(0x3640, mulmod(mload(0x3620), mload(0xfa0), f_q)) - mstore(0x3660, addmod(mload(0x1000), mload(0x6e0), f_q)) - mstore(0x3680, mulmod(mload(0x3660), mload(0x3640), f_q)) - mstore(0x36a0, addmod(mload(0x2320), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q)) - mstore(0x36c0, mulmod(mload(0x28e0), mload(0x36a0), f_q)) - mstore(0x36e0, mulmod(mload(0x2360), mload(0x36c0), f_q)) - mstore(0x3700, addmod(mload(0x36e0), mload(0x680), f_q)) - mstore(0x3720, mulmod(mload(0x3700), mload(0xf80), f_q)) - mstore(0x3740, addmod(mload(0xdc0), mload(0x6e0), f_q)) - mstore(0x3760, mulmod(mload(0x3740), mload(0x3720), f_q)) - mstore(0x3780, addmod(mload(0x3680), sub(f_q, mload(0x3760)), f_q)) - mstore(0x37a0, mulmod(mload(0x3780), mload(0x2fe0), f_q)) - mstore(0x37c0, addmod(mload(0x3600), mload(0x37a0), f_q)) - mstore(0x37e0, mulmod(mload(0x840), mload(0x37c0), f_q)) - mstore(0x3800, addmod(mload(0xfc0), sub(f_q, mload(0x1000)), f_q)) - mstore(0x3820, mulmod(mload(0x3800), mload(0x1c20), f_q)) - mstore(0x3840, addmod(mload(0x37e0), mload(0x3820), f_q)) - mstore(0x3860, mulmod(mload(0x840), mload(0x3840), f_q)) - mstore(0x3880, mulmod(mload(0x3800), mload(0x2fe0), f_q)) - mstore(0x38a0, addmod(mload(0xfc0), sub(f_q, mload(0xfe0)), f_q)) - mstore(0x38c0, mulmod(mload(0x38a0), mload(0x3880), f_q)) - mstore(0x38e0, addmod(mload(0x3860), mload(0x38c0), f_q)) - mstore(0x3900, mulmod(mload(0x840), mload(0x38e0), f_q)) - mstore(0x3920, addmod(1, sub(f_q, mload(0x1020)), f_q)) - mstore(0x3940, mulmod(mload(0x3920), mload(0x1c20), f_q)) - mstore(0x3960, addmod(mload(0x3900), mload(0x3940), f_q)) - mstore(0x3980, mulmod(mload(0x840), mload(0x3960), f_q)) - mstore(0x39a0, mulmod(mload(0x1020), mload(0x1020), f_q)) - mstore(0x39c0, addmod(mload(0x39a0), sub(f_q, mload(0x1020)), f_q)) - mstore(0x39e0, mulmod(mload(0x39c0), mload(0x1b40), f_q)) - mstore(0x3a00, addmod(mload(0x3980), mload(0x39e0), f_q)) - mstore(0x3a20, mulmod(mload(0x840), mload(0x3a00), f_q)) - mstore(0x3a40, addmod(mload(0x1060), mload(0x680), f_q)) - mstore(0x3a60, mulmod(mload(0x3a40), mload(0x1040), f_q)) - mstore(0x3a80, addmod(mload(0x10a0), mload(0x6e0), f_q)) - mstore(0x3aa0, mulmod(mload(0x3a80), mload(0x3a60), f_q)) - mstore(0x3ac0, mulmod(mload(0x2ba0), mload(0xe00), f_q)) - mstore(0x3ae0, mulmod(mload(0x2ce0), mload(0x3ac0), f_q)) - mstore(0x3b00, mulmod(mload(0xba0), mload(0x3ae0), f_q)) - mstore(0x3b20, mulmod(mload(0x520), mload(0x3b00), f_q)) - mstore(0x3b40, mulmod(1, mload(0x3ae0), f_q)) - mstore(0x3b60, addmod(mload(0x3b20), mload(0x3b40), f_q)) - mstore(0x3b80, mulmod(mload(0x520), mload(0x3b60), f_q)) - mstore(0x3ba0, mulmod(mload(0xd20), mload(0x3ae0), f_q)) - mstore(0x3bc0, addmod(mload(0x3b80), mload(0x3ba0), f_q)) - mstore(0x3be0, addmod(mload(0x3bc0), mload(0x680), f_q)) - mstore(0x3c00, mulmod(mload(0x3be0), mload(0x1020), f_q)) - mstore(0x3c20, mulmod(mload(0x520), mload(0xba0), f_q)) - mstore(0x3c40, addmod(mload(0x3c20), mload(0xda0), f_q)) - mstore(0x3c60, mulmod(mload(0x520), mload(0x3c40), f_q)) - mstore(0x3c80, addmod(mload(0x3c60), mload(0xd60), f_q)) - mstore(0x3ca0, addmod(mload(0x3c80), mload(0x6e0), f_q)) - mstore(0x3cc0, mulmod(mload(0x3ca0), mload(0x3c00), f_q)) - mstore(0x3ce0, addmod(mload(0x3aa0), sub(f_q, mload(0x3cc0)), f_q)) - mstore(0x3d00, mulmod(mload(0x3ce0), mload(0x2fe0), f_q)) - mstore(0x3d20, addmod(mload(0x3a20), mload(0x3d00), f_q)) - mstore(0x3d40, mulmod(mload(0x840), mload(0x3d20), f_q)) - mstore(0x3d60, addmod(mload(0x1060), sub(f_q, mload(0x10a0)), f_q)) - mstore(0x3d80, mulmod(mload(0x3d60), mload(0x1c20), f_q)) - mstore(0x3da0, addmod(mload(0x3d40), mload(0x3d80), f_q)) - mstore(0x3dc0, mulmod(mload(0x840), mload(0x3da0), f_q)) - mstore(0x3de0, mulmod(mload(0x3d60), mload(0x2fe0), f_q)) - mstore(0x3e00, addmod(mload(0x1060), sub(f_q, mload(0x1080)), f_q)) - mstore(0x3e20, mulmod(mload(0x3e00), mload(0x3de0), f_q)) - mstore(0x3e40, addmod(mload(0x3dc0), mload(0x3e20), f_q)) - mstore(0x3e60, mulmod(mload(0x1580), mload(0x1580), f_q)) - mstore(0x3e80, mulmod(mload(0x3e60), mload(0x1580), f_q)) - mstore(0x3ea0, mulmod(mload(0x3e80), mload(0x1580), f_q)) - mstore(0x3ec0, mulmod(mload(0x3ea0), mload(0x1580), f_q)) - mstore(0x3ee0, mulmod(mload(0x3ec0), mload(0x1580), f_q)) - mstore(0x3f00, mulmod(mload(0x3ee0), mload(0x1580), f_q)) - mstore(0x3f20, mulmod(mload(0x3f00), mload(0x1580), f_q)) - mstore(0x3f40, mulmod(1, mload(0x1580), f_q)) - mstore(0x3f60, mulmod(1, mload(0x3e60), f_q)) - mstore(0x3f80, mulmod(1, mload(0x3e80), f_q)) - mstore(0x3fa0, mulmod(1, mload(0x3ea0), f_q)) - mstore(0x3fc0, mulmod(1, mload(0x3ec0), f_q)) - mstore(0x3fe0, mulmod(1, mload(0x3ee0), f_q)) - mstore(0x4000, mulmod(1, mload(0x3f00), f_q)) - mstore(0x4020, mulmod(mload(0x3e40), mload(0x15a0), f_q)) - mstore(0x4040, mulmod(mload(0x12c0), mload(0x12c0), f_q)) - mstore(0x4060, mulmod(mload(0x4040), mload(0x12c0), f_q)) - mstore(0x4080, mulmod(mload(0x4060), mload(0x12c0), f_q)) - mstore(0x40a0, mulmod(mload(0x4080), mload(0x12c0), f_q)) - mstore(0x40c0, mulmod(mload(0x40a0), mload(0x12c0), f_q)) - mstore(0x40e0, mulmod(mload(0x10e0), mload(0x10e0), f_q)) - mstore(0x4100, mulmod(mload(0x40e0), mload(0x10e0), f_q)) - mstore(0x4120, mulmod(mload(0x4100), mload(0x10e0), f_q)) - mstore(0x4140, mulmod(mload(0x4120), mload(0x10e0), f_q)) - mstore(0x4160, mulmod(mload(0x4140), mload(0x10e0), f_q)) - mstore(0x4180, mulmod(mload(0x4160), mload(0x10e0), f_q)) - mstore(0x41a0, mulmod(mload(0x4180), mload(0x10e0), f_q)) - mstore(0x41c0, mulmod(mload(0x41a0), mload(0x10e0), f_q)) - mstore(0x41e0, mulmod(mload(0x41c0), mload(0x10e0), f_q)) - mstore(0x4200, mulmod(mload(0x41e0), mload(0x10e0), f_q)) - mstore(0x4220, mulmod(mload(0x4200), mload(0x10e0), f_q)) - mstore(0x4240, mulmod(mload(0x4220), mload(0x10e0), f_q)) - mstore(0x4260, mulmod(mload(0x4240), mload(0x10e0), f_q)) - mstore(0x4280, mulmod(mload(0x4260), mload(0x10e0), f_q)) - mstore(0x42a0, mulmod(mload(0x4280), mload(0x10e0), f_q)) - mstore(0x42c0, mulmod(mload(0x42a0), mload(0x10e0), f_q)) - mstore(0x42e0, mulmod(mload(0x42c0), mload(0x10e0), f_q)) - mstore(0x4300, mulmod(mload(0x42e0), mload(0x10e0), f_q)) - mstore(0x4320, mulmod(mload(0x4300), mload(0x10e0), f_q)) - mstore(0x4340, mulmod(mload(0x4320), mload(0x10e0), f_q)) - mstore(0x4360, mulmod(mload(0x4340), mload(0x10e0), f_q)) - mstore(0x4380, mulmod(mload(0x4360), mload(0x10e0), f_q)) - mstore(0x43a0, mulmod(mload(0x4380), mload(0x10e0), f_q)) - mstore(0x43c0, mulmod(mload(0x43a0), mload(0x10e0), f_q)) - mstore(0x43e0, mulmod(mload(0x43c0), mload(0x10e0), f_q)) - mstore(0x4400, mulmod(mload(0x43e0), mload(0x10e0), f_q)) - mstore(0x4420, mulmod(mload(0x4400), mload(0x10e0), f_q)) - mstore(0x4440, mulmod(mload(0x4420), mload(0x10e0), f_q)) - mstore(0x4460, mulmod(mload(0x4440), mload(0x10e0), f_q)) - mstore(0x4480, mulmod(mload(0x4460), mload(0x10e0), f_q)) - mstore(0x44a0, mulmod(mload(0x4480), mload(0x10e0), f_q)) - mstore(0x44c0, mulmod(sub(f_q, mload(0xae0)), 1, f_q)) - mstore(0x44e0, mulmod(sub(f_q, mload(0xb00)), mload(0x10e0), f_q)) - mstore(0x4500, mulmod(1, mload(0x10e0), f_q)) - mstore(0x4520, addmod(mload(0x44c0), mload(0x44e0), f_q)) - mstore(0x4540, mulmod(sub(f_q, mload(0xb20)), mload(0x40e0), f_q)) - mstore(0x4560, mulmod(1, mload(0x40e0), f_q)) - mstore(0x4580, addmod(mload(0x4520), mload(0x4540), f_q)) - mstore(0x45a0, mulmod(sub(f_q, mload(0xb80)), mload(0x4100), f_q)) - mstore(0x45c0, mulmod(1, mload(0x4100), f_q)) - mstore(0x45e0, addmod(mload(0x4580), mload(0x45a0), f_q)) - mstore(0x4600, mulmod(sub(f_q, mload(0xba0)), mload(0x4120), f_q)) - mstore(0x4620, mulmod(1, mload(0x4120), f_q)) - mstore(0x4640, addmod(mload(0x45e0), mload(0x4600), f_q)) - mstore(0x4660, mulmod(sub(f_q, mload(0xbe0)), mload(0x4140), f_q)) - mstore(0x4680, mulmod(1, mload(0x4140), f_q)) - mstore(0x46a0, addmod(mload(0x4640), mload(0x4660), f_q)) - mstore(0x46c0, mulmod(sub(f_q, mload(0xc20)), mload(0x4160), f_q)) - mstore(0x46e0, mulmod(1, mload(0x4160), f_q)) - mstore(0x4700, addmod(mload(0x46a0), mload(0x46c0), f_q)) - mstore(0x4720, mulmod(sub(f_q, mload(0xc60)), mload(0x4180), f_q)) - mstore(0x4740, mulmod(1, mload(0x4180), f_q)) - mstore(0x4760, addmod(mload(0x4700), mload(0x4720), f_q)) - mstore(0x4780, mulmod(sub(f_q, mload(0xc80)), mload(0x41a0), f_q)) - mstore(0x47a0, mulmod(1, mload(0x41a0), f_q)) - mstore(0x47c0, addmod(mload(0x4760), mload(0x4780), f_q)) - mstore(0x47e0, mulmod(sub(f_q, mload(0xca0)), mload(0x41c0), f_q)) - mstore(0x4800, mulmod(1, mload(0x41c0), f_q)) - mstore(0x4820, addmod(mload(0x47c0), mload(0x47e0), f_q)) - mstore(0x4840, mulmod(sub(f_q, mload(0xd60)), mload(0x41e0), f_q)) - mstore(0x4860, mulmod(1, mload(0x41e0), f_q)) - mstore(0x4880, addmod(mload(0x4820), mload(0x4840), f_q)) - mstore(0x48a0, mulmod(sub(f_q, mload(0xda0)), mload(0x4200), f_q)) - mstore(0x48c0, mulmod(1, mload(0x4200), f_q)) - mstore(0x48e0, addmod(mload(0x4880), mload(0x48a0), f_q)) - mstore(0x4900, mulmod(sub(f_q, mload(0xf40)), mload(0x4220), f_q)) - mstore(0x4920, mulmod(1, mload(0x4220), f_q)) - mstore(0x4940, addmod(mload(0x48e0), mload(0x4900), f_q)) - mstore(0x4960, mulmod(sub(f_q, mload(0xf80)), mload(0x4240), f_q)) - mstore(0x4980, mulmod(1, mload(0x4240), f_q)) - mstore(0x49a0, addmod(mload(0x4940), mload(0x4960), f_q)) - mstore(0x49c0, mulmod(sub(f_q, mload(0xfc0)), mload(0x4260), f_q)) - mstore(0x49e0, mulmod(1, mload(0x4260), f_q)) - mstore(0x4a00, addmod(mload(0x49a0), mload(0x49c0), f_q)) - mstore(0x4a20, mulmod(sub(f_q, mload(0x1000)), mload(0x4280), f_q)) - mstore(0x4a40, mulmod(1, mload(0x4280), f_q)) - mstore(0x4a60, addmod(mload(0x4a00), mload(0x4a20), f_q)) - mstore(0x4a80, mulmod(sub(f_q, mload(0x1020)), mload(0x42a0), f_q)) - mstore(0x4aa0, mulmod(1, mload(0x42a0), f_q)) - mstore(0x4ac0, addmod(mload(0x4a60), mload(0x4a80), f_q)) - mstore(0x4ae0, mulmod(sub(f_q, mload(0x1060)), mload(0x42c0), f_q)) - mstore(0x4b00, mulmod(1, mload(0x42c0), f_q)) - mstore(0x4b20, addmod(mload(0x4ac0), mload(0x4ae0), f_q)) - mstore(0x4b40, mulmod(sub(f_q, mload(0x10a0)), mload(0x42e0), f_q)) - mstore(0x4b60, mulmod(1, mload(0x42e0), f_q)) - mstore(0x4b80, addmod(mload(0x4b20), mload(0x4b40), f_q)) - mstore(0x4ba0, mulmod(sub(f_q, mload(0xdc0)), mload(0x4300), f_q)) - mstore(0x4bc0, mulmod(1, mload(0x4300), f_q)) - mstore(0x4be0, addmod(mload(0x4b80), mload(0x4ba0), f_q)) - mstore(0x4c00, mulmod(sub(f_q, mload(0xde0)), mload(0x4320), f_q)) - mstore(0x4c20, mulmod(1, mload(0x4320), f_q)) - mstore(0x4c40, addmod(mload(0x4be0), mload(0x4c00), f_q)) - mstore(0x4c60, mulmod(sub(f_q, mload(0xe00)), mload(0x4340), f_q)) - mstore(0x4c80, mulmod(1, mload(0x4340), f_q)) - mstore(0x4ca0, addmod(mload(0x4c40), mload(0x4c60), f_q)) - mstore(0x4cc0, mulmod(sub(f_q, mload(0xe20)), mload(0x4360), f_q)) - mstore(0x4ce0, mulmod(1, mload(0x4360), f_q)) - mstore(0x4d00, addmod(mload(0x4ca0), mload(0x4cc0), f_q)) - mstore(0x4d20, mulmod(sub(f_q, mload(0xe40)), mload(0x4380), f_q)) - mstore(0x4d40, mulmod(1, mload(0x4380), f_q)) - mstore(0x4d60, addmod(mload(0x4d00), mload(0x4d20), f_q)) - mstore(0x4d80, mulmod(sub(f_q, mload(0xe60)), mload(0x43a0), f_q)) - mstore(0x4da0, mulmod(1, mload(0x43a0), f_q)) - mstore(0x4dc0, addmod(mload(0x4d60), mload(0x4d80), f_q)) - mstore(0x4de0, mulmod(sub(f_q, mload(0xe80)), mload(0x43c0), f_q)) - mstore(0x4e00, mulmod(1, mload(0x43c0), f_q)) - mstore(0x4e20, addmod(mload(0x4dc0), mload(0x4de0), f_q)) - mstore(0x4e40, mulmod(sub(f_q, mload(0xec0)), mload(0x43e0), f_q)) - mstore(0x4e60, mulmod(1, mload(0x43e0), f_q)) - mstore(0x4e80, addmod(mload(0x4e20), mload(0x4e40), f_q)) - mstore(0x4ea0, mulmod(sub(f_q, mload(0xee0)), mload(0x4400), f_q)) - mstore(0x4ec0, mulmod(1, mload(0x4400), f_q)) - mstore(0x4ee0, addmod(mload(0x4e80), mload(0x4ea0), f_q)) - mstore(0x4f00, mulmod(sub(f_q, mload(0xf00)), mload(0x4420), f_q)) - mstore(0x4f20, mulmod(1, mload(0x4420), f_q)) - mstore(0x4f40, addmod(mload(0x4ee0), mload(0x4f00), f_q)) - mstore(0x4f60, mulmod(sub(f_q, mload(0xf20)), mload(0x4440), f_q)) - mstore(0x4f80, mulmod(1, mload(0x4440), f_q)) - mstore(0x4fa0, addmod(mload(0x4f40), mload(0x4f60), f_q)) - mstore(0x4fc0, mulmod(sub(f_q, mload(0x4020)), mload(0x4460), f_q)) - mstore(0x4fe0, mulmod(1, mload(0x4460), f_q)) - mstore(0x5000, mulmod(mload(0x3f40), mload(0x4460), f_q)) - mstore(0x5020, mulmod(mload(0x3f60), mload(0x4460), f_q)) - mstore(0x5040, mulmod(mload(0x3f80), mload(0x4460), f_q)) - mstore(0x5060, mulmod(mload(0x3fa0), mload(0x4460), f_q)) - mstore(0x5080, mulmod(mload(0x3fc0), mload(0x4460), f_q)) - mstore(0x50a0, mulmod(mload(0x3fe0), mload(0x4460), f_q)) - mstore(0x50c0, mulmod(mload(0x4000), mload(0x4460), f_q)) - mstore(0x50e0, addmod(mload(0x4fa0), mload(0x4fc0), f_q)) - mstore(0x5100, mulmod(sub(f_q, mload(0xea0)), mload(0x4480), f_q)) - mstore(0x5120, mulmod(1, mload(0x4480), f_q)) - mstore(0x5140, addmod(mload(0x50e0), mload(0x5100), f_q)) - mstore(0x5160, mulmod(mload(0x5140), 1, f_q)) - mstore(0x5180, mulmod(mload(0x4500), 1, f_q)) - mstore(0x51a0, mulmod(mload(0x4560), 1, f_q)) - mstore(0x51c0, mulmod(mload(0x45c0), 1, f_q)) - mstore(0x51e0, mulmod(mload(0x4620), 1, f_q)) - mstore(0x5200, mulmod(mload(0x4680), 1, f_q)) - mstore(0x5220, mulmod(mload(0x46e0), 1, f_q)) - mstore(0x5240, mulmod(mload(0x4740), 1, f_q)) - mstore(0x5260, mulmod(mload(0x47a0), 1, f_q)) - mstore(0x5280, mulmod(mload(0x4800), 1, f_q)) - mstore(0x52a0, mulmod(mload(0x4860), 1, f_q)) - mstore(0x52c0, mulmod(mload(0x48c0), 1, f_q)) - mstore(0x52e0, mulmod(mload(0x4920), 1, f_q)) - mstore(0x5300, mulmod(mload(0x4980), 1, f_q)) - mstore(0x5320, mulmod(mload(0x49e0), 1, f_q)) - mstore(0x5340, mulmod(mload(0x4a40), 1, f_q)) - mstore(0x5360, mulmod(mload(0x4aa0), 1, f_q)) - mstore(0x5380, mulmod(mload(0x4b00), 1, f_q)) - mstore(0x53a0, mulmod(mload(0x4b60), 1, f_q)) - mstore(0x53c0, mulmod(mload(0x4bc0), 1, f_q)) - mstore(0x53e0, mulmod(mload(0x4c20), 1, f_q)) - mstore(0x5400, mulmod(mload(0x4c80), 1, f_q)) - mstore(0x5420, mulmod(mload(0x4ce0), 1, f_q)) - mstore(0x5440, mulmod(mload(0x4d40), 1, f_q)) - mstore(0x5460, mulmod(mload(0x4da0), 1, f_q)) - mstore(0x5480, mulmod(mload(0x4e00), 1, f_q)) - mstore(0x54a0, mulmod(mload(0x4e60), 1, f_q)) - mstore(0x54c0, mulmod(mload(0x4ec0), 1, f_q)) - mstore(0x54e0, mulmod(mload(0x4f20), 1, f_q)) - mstore(0x5500, mulmod(mload(0x4f80), 1, f_q)) - mstore(0x5520, mulmod(mload(0x4fe0), 1, f_q)) - mstore(0x5540, mulmod(mload(0x5000), 1, f_q)) - mstore(0x5560, mulmod(mload(0x5020), 1, f_q)) - mstore(0x5580, mulmod(mload(0x5040), 1, f_q)) - mstore(0x55a0, mulmod(mload(0x5060), 1, f_q)) - mstore(0x55c0, mulmod(mload(0x5080), 1, f_q)) - mstore(0x55e0, mulmod(mload(0x50a0), 1, f_q)) - mstore(0x5600, mulmod(mload(0x50c0), 1, f_q)) - mstore(0x5620, mulmod(mload(0x5120), 1, f_q)) - mstore(0x5640, mulmod(sub(f_q, mload(0xb40)), 1, f_q)) - mstore(0x5660, mulmod(sub(f_q, mload(0xb60)), mload(0x10e0), f_q)) - mstore(0x5680, addmod(mload(0x5640), mload(0x5660), f_q)) - mstore(0x56a0, mulmod(sub(f_q, mload(0xcc0)), mload(0x40e0), f_q)) - mstore(0x56c0, addmod(mload(0x5680), mload(0x56a0), f_q)) - mstore(0x56e0, mulmod(sub(f_q, mload(0xce0)), mload(0x4100), f_q)) - mstore(0x5700, addmod(mload(0x56c0), mload(0x56e0), f_q)) - mstore(0x5720, mulmod(sub(f_q, mload(0xd00)), mload(0x4120), f_q)) - mstore(0x5740, addmod(mload(0x5700), mload(0x5720), f_q)) - mstore(0x5760, mulmod(sub(f_q, mload(0xd20)), mload(0x4140), f_q)) - mstore(0x5780, addmod(mload(0x5740), mload(0x5760), f_q)) - mstore(0x57a0, mulmod(sub(f_q, mload(0xd40)), mload(0x4160), f_q)) - mstore(0x57c0, addmod(mload(0x5780), mload(0x57a0), f_q)) - mstore(0x57e0, mulmod(sub(f_q, mload(0xd80)), mload(0x4180), f_q)) - mstore(0x5800, addmod(mload(0x57c0), mload(0x57e0), f_q)) - mstore(0x5820, mulmod(sub(f_q, mload(0xf60)), mload(0x41a0), f_q)) - mstore(0x5840, addmod(mload(0x5800), mload(0x5820), f_q)) - mstore(0x5860, mulmod(sub(f_q, mload(0xfa0)), mload(0x41c0), f_q)) - mstore(0x5880, addmod(mload(0x5840), mload(0x5860), f_q)) - mstore(0x58a0, mulmod(sub(f_q, mload(0x1040)), mload(0x41e0), f_q)) - mstore(0x58c0, addmod(mload(0x5880), mload(0x58a0), f_q)) - mstore(0x58e0, mulmod(mload(0x58c0), mload(0x12c0), f_q)) - mstore(0x5900, mulmod(1, mload(0x12c0), f_q)) - mstore(0x5920, mulmod(mload(0x4500), mload(0x12c0), f_q)) - mstore(0x5940, mulmod(mload(0x4560), mload(0x12c0), f_q)) - mstore(0x5960, mulmod(mload(0x45c0), mload(0x12c0), f_q)) - mstore(0x5980, mulmod(mload(0x4620), mload(0x12c0), f_q)) - mstore(0x59a0, mulmod(mload(0x4680), mload(0x12c0), f_q)) - mstore(0x59c0, mulmod(mload(0x46e0), mload(0x12c0), f_q)) - mstore(0x59e0, mulmod(mload(0x4740), mload(0x12c0), f_q)) - mstore(0x5a00, mulmod(mload(0x47a0), mload(0x12c0), f_q)) - mstore(0x5a20, mulmod(mload(0x4800), mload(0x12c0), f_q)) - mstore(0x5a40, mulmod(mload(0x4860), mload(0x12c0), f_q)) - mstore(0x5a60, addmod(mload(0x5160), mload(0x58e0), f_q)) - mstore(0x5a80, addmod(mload(0x5180), mload(0x5900), f_q)) - mstore(0x5aa0, addmod(mload(0x51a0), mload(0x5920), f_q)) - mstore(0x5ac0, addmod(mload(0x51e0), mload(0x5940), f_q)) - mstore(0x5ae0, addmod(mload(0x5240), mload(0x5960), f_q)) - mstore(0x5b00, addmod(mload(0x5200), mload(0x5980), f_q)) - mstore(0x5b20, addmod(mload(0x5220), mload(0x59a0), f_q)) - mstore(0x5b40, addmod(mload(0x5260), mload(0x59c0), f_q)) - mstore(0x5b60, addmod(mload(0x52a0), mload(0x59e0), f_q)) - mstore(0x5b80, addmod(mload(0x52e0), mload(0x5a00), f_q)) - mstore(0x5ba0, addmod(mload(0x5300), mload(0x5a20), f_q)) - mstore(0x5bc0, addmod(mload(0x5360), mload(0x5a40), f_q)) - mstore(0x5be0, mulmod(sub(f_q, mload(0xbc0)), 1, f_q)) - mstore(0x5c00, mulmod(mload(0x5be0), mload(0x4040), f_q)) - mstore(0x5c20, mulmod(1, mload(0x4040), f_q)) - mstore(0x5c40, addmod(mload(0x5a60), mload(0x5c00), f_q)) - mstore(0x5c60, addmod(1, mload(0x5c20), f_q)) - mstore(0x5c80, mulmod(sub(f_q, mload(0xc00)), 1, f_q)) - mstore(0x5ca0, mulmod(mload(0x5c80), mload(0x4060), f_q)) - mstore(0x5cc0, mulmod(1, mload(0x4060), f_q)) - mstore(0x5ce0, addmod(mload(0x5c40), mload(0x5ca0), f_q)) - mstore(0x5d00, addmod(mload(0x5c60), mload(0x5cc0), f_q)) - mstore(0x5d20, mulmod(sub(f_q, mload(0xc40)), 1, f_q)) - mstore(0x5d40, mulmod(mload(0x5d20), mload(0x4080), f_q)) - mstore(0x5d60, mulmod(1, mload(0x4080), f_q)) - mstore(0x5d80, addmod(mload(0x5ce0), mload(0x5d40), f_q)) - mstore(0x5da0, addmod(mload(0x5d00), mload(0x5d60), f_q)) - mstore(0x5dc0, mulmod(sub(f_q, mload(0xfe0)), 1, f_q)) - mstore(0x5de0, mulmod(sub(f_q, mload(0x1080)), mload(0x10e0), f_q)) - mstore(0x5e00, addmod(mload(0x5dc0), mload(0x5de0), f_q)) - mstore(0x5e20, mulmod(mload(0x5e00), mload(0x40a0), f_q)) - mstore(0x5e40, mulmod(1, mload(0x40a0), f_q)) - mstore(0x5e60, mulmod(mload(0x4500), mload(0x40a0), f_q)) - mstore(0x5e80, addmod(mload(0x5d80), mload(0x5e20), f_q)) - mstore(0x5ea0, addmod(mload(0x5320), mload(0x5e40), f_q)) - mstore(0x5ec0, addmod(mload(0x5380), mload(0x5e60), f_q)) - mstore(0x5ee0, mulmod(1, mload(0xaa0), f_q)) - mstore(0x5f00, mulmod(1, mload(0x5ee0), f_q)) - mstore(0x5f20, mulmod(1426404432721484388505361748317961535523355871255605456897797744433766488507, mload(0xaa0), f_q)) - mstore(0x5f40, mulmod(mload(0x5900), mload(0x5f20), f_q)) - mstore(0x5f60, mulmod(9006377677104126645890996367423897105324004107057077789747582042159340961781, mload(0xaa0), f_q)) - mstore(0x5f80, mulmod(mload(0x5c20), mload(0x5f60), f_q)) - mstore(0x5fa0, mulmod(18769651408976934958286309932310414541151443913375694970737140453570733585773, mload(0xaa0), f_q)) - mstore(0x5fc0, mulmod(mload(0x5cc0), mload(0x5fa0), f_q)) - mstore(0x5fe0, mulmod(14067402467204121486302766047808497429914586165841890684531964769691379435525, mload(0xaa0), f_q)) - mstore(0x6000, mulmod(mload(0x5d60), mload(0x5fe0), f_q)) - mstore(0x6020, mulmod(2785514556381676080176937710880804108647911392478702105860685610379369825016, mload(0xaa0), f_q)) - mstore(0x6040, mulmod(mload(0x5e40), mload(0x6020), f_q)) - mstore(0x6060, 0x0000000000000000000000000000000000000000000000000000000000000001) - mstore(0x6080, 0x0000000000000000000000000000000000000000000000000000000000000002) - mstore(0x60a0, mload(0x5e80)) - success := and(eq(staticcall(gas(), 0x7, 0x6060, 0x60, 0x6060, 0x40), 1), success) - mstore(0x60c0, mload(0x340)) - mstore(0x60e0, mload(0x360)) - mstore(0x6100, mload(0x5da0)) - success := and(eq(staticcall(gas(), 0x7, 0x60c0, 0x60, 0x60c0, 0x40), 1), success) - mstore(0x6120, mload(0x6060)) - mstore(0x6140, mload(0x6080)) - mstore(0x6160, mload(0x60c0)) - mstore(0x6180, mload(0x60e0)) - success := and(eq(staticcall(gas(), 0x6, 0x6120, 0x80, 0x6120, 0x40), 1), success) - mstore(0x61a0, mload(0x380)) - mstore(0x61c0, mload(0x3a0)) - mstore(0x61e0, mload(0x5a80)) - success := and(eq(staticcall(gas(), 0x7, 0x61a0, 0x60, 0x61a0, 0x40), 1), success) - mstore(0x6200, mload(0x6120)) - mstore(0x6220, mload(0x6140)) - mstore(0x6240, mload(0x61a0)) - mstore(0x6260, mload(0x61c0)) - success := and(eq(staticcall(gas(), 0x6, 0x6200, 0x80, 0x6200, 0x40), 1), success) - mstore(0x6280, mload(0x3c0)) - mstore(0x62a0, mload(0x3e0)) - mstore(0x62c0, mload(0x5aa0)) - success := and(eq(staticcall(gas(), 0x7, 0x6280, 0x60, 0x6280, 0x40), 1), success) - mstore(0x62e0, mload(0x6200)) - mstore(0x6300, mload(0x6220)) - mstore(0x6320, mload(0x6280)) - mstore(0x6340, mload(0x62a0)) - success := and(eq(staticcall(gas(), 0x6, 0x62e0, 0x80, 0x62e0, 0x40), 1), success) - mstore(0x6360, mload(0x140)) - mstore(0x6380, mload(0x160)) - mstore(0x63a0, mload(0x51c0)) - success := and(eq(staticcall(gas(), 0x7, 0x6360, 0x60, 0x6360, 0x40), 1), success) - mstore(0x63c0, mload(0x62e0)) - mstore(0x63e0, mload(0x6300)) - mstore(0x6400, mload(0x6360)) - mstore(0x6420, mload(0x6380)) - success := and(eq(staticcall(gas(), 0x6, 0x63c0, 0x80, 0x63c0, 0x40), 1), success) - mstore(0x6440, mload(0x180)) - mstore(0x6460, mload(0x1a0)) - mstore(0x6480, mload(0x5ac0)) - success := and(eq(staticcall(gas(), 0x7, 0x6440, 0x60, 0x6440, 0x40), 1), success) - mstore(0x64a0, mload(0x63c0)) - mstore(0x64c0, mload(0x63e0)) - mstore(0x64e0, mload(0x6440)) - mstore(0x6500, mload(0x6460)) - success := and(eq(staticcall(gas(), 0x6, 0x64a0, 0x80, 0x64a0, 0x40), 1), success) - mstore(0x6520, mload(0x1c0)) - mstore(0x6540, mload(0x1e0)) - mstore(0x6560, mload(0x5b00)) - success := and(eq(staticcall(gas(), 0x7, 0x6520, 0x60, 0x6520, 0x40), 1), success) - mstore(0x6580, mload(0x64a0)) - mstore(0x65a0, mload(0x64c0)) - mstore(0x65c0, mload(0x6520)) - mstore(0x65e0, mload(0x6540)) - success := and(eq(staticcall(gas(), 0x6, 0x6580, 0x80, 0x6580, 0x40), 1), success) - mstore(0x6600, mload(0x4c0)) - mstore(0x6620, mload(0x4e0)) - mstore(0x6640, mload(0x5b20)) - success := and(eq(staticcall(gas(), 0x7, 0x6600, 0x60, 0x6600, 0x40), 1), success) - mstore(0x6660, mload(0x6580)) - mstore(0x6680, mload(0x65a0)) - mstore(0x66a0, mload(0x6600)) - mstore(0x66c0, mload(0x6620)) - success := and(eq(staticcall(gas(), 0x6, 0x6660, 0x80, 0x6660, 0x40), 1), success) - mstore(0x66e0, mload(0x200)) - mstore(0x6700, mload(0x220)) - mstore(0x6720, mload(0x5ae0)) - success := and(eq(staticcall(gas(), 0x7, 0x66e0, 0x60, 0x66e0, 0x40), 1), success) - mstore(0x6740, mload(0x6660)) - mstore(0x6760, mload(0x6680)) - mstore(0x6780, mload(0x66e0)) - mstore(0x67a0, mload(0x6700)) - success := and(eq(staticcall(gas(), 0x6, 0x6740, 0x80, 0x6740, 0x40), 1), success) - mstore(0x67c0, mload(0x240)) - mstore(0x67e0, mload(0x260)) - mstore(0x6800, mload(0x5b40)) - success := and(eq(staticcall(gas(), 0x7, 0x67c0, 0x60, 0x67c0, 0x40), 1), success) - mstore(0x6820, mload(0x6740)) - mstore(0x6840, mload(0x6760)) - mstore(0x6860, mload(0x67c0)) - mstore(0x6880, mload(0x67e0)) - success := and(eq(staticcall(gas(), 0x6, 0x6820, 0x80, 0x6820, 0x40), 1), success) - mstore(0x68a0, mload(0x280)) - mstore(0x68c0, mload(0x2a0)) - mstore(0x68e0, mload(0x5280)) - success := and(eq(staticcall(gas(), 0x7, 0x68a0, 0x60, 0x68a0, 0x40), 1), success) - mstore(0x6900, mload(0x6820)) - mstore(0x6920, mload(0x6840)) - mstore(0x6940, mload(0x68a0)) - mstore(0x6960, mload(0x68c0)) - success := and(eq(staticcall(gas(), 0x6, 0x6900, 0x80, 0x6900, 0x40), 1), success) - mstore(0x6980, mload(0x2c0)) - mstore(0x69a0, mload(0x2e0)) - mstore(0x69c0, mload(0x5b60)) - success := and(eq(staticcall(gas(), 0x7, 0x6980, 0x60, 0x6980, 0x40), 1), success) - mstore(0x69e0, mload(0x6900)) - mstore(0x6a00, mload(0x6920)) - mstore(0x6a20, mload(0x6980)) - mstore(0x6a40, mload(0x69a0)) - success := and(eq(staticcall(gas(), 0x6, 0x69e0, 0x80, 0x69e0, 0x40), 1), success) - mstore(0x6a60, mload(0x300)) - mstore(0x6a80, mload(0x320)) - mstore(0x6aa0, mload(0x52c0)) - success := and(eq(staticcall(gas(), 0x7, 0x6a60, 0x60, 0x6a60, 0x40), 1), success) - mstore(0x6ac0, mload(0x69e0)) - mstore(0x6ae0, mload(0x6a00)) - mstore(0x6b00, mload(0x6a60)) - mstore(0x6b20, mload(0x6a80)) - success := and(eq(staticcall(gas(), 0x6, 0x6ac0, 0x80, 0x6ac0, 0x40), 1), success) - mstore(0x6b40, mload(0x720)) - mstore(0x6b60, mload(0x740)) - mstore(0x6b80, mload(0x5b80)) - success := and(eq(staticcall(gas(), 0x7, 0x6b40, 0x60, 0x6b40, 0x40), 1), success) - mstore(0x6ba0, mload(0x6ac0)) - mstore(0x6bc0, mload(0x6ae0)) - mstore(0x6be0, mload(0x6b40)) - mstore(0x6c00, mload(0x6b60)) - success := and(eq(staticcall(gas(), 0x6, 0x6ba0, 0x80, 0x6ba0, 0x40), 1), success) - mstore(0x6c20, mload(0x760)) - mstore(0x6c40, mload(0x780)) - mstore(0x6c60, mload(0x5ba0)) - success := and(eq(staticcall(gas(), 0x7, 0x6c20, 0x60, 0x6c20, 0x40), 1), success) - mstore(0x6c80, mload(0x6ba0)) - mstore(0x6ca0, mload(0x6bc0)) - mstore(0x6cc0, mload(0x6c20)) - mstore(0x6ce0, mload(0x6c40)) - success := and(eq(staticcall(gas(), 0x6, 0x6c80, 0x80, 0x6c80, 0x40), 1), success) - mstore(0x6d00, mload(0x560)) - mstore(0x6d20, mload(0x580)) - mstore(0x6d40, mload(0x5ea0)) - success := and(eq(staticcall(gas(), 0x7, 0x6d00, 0x60, 0x6d00, 0x40), 1), success) - mstore(0x6d60, mload(0x6c80)) - mstore(0x6d80, mload(0x6ca0)) - mstore(0x6da0, mload(0x6d00)) - mstore(0x6dc0, mload(0x6d20)) - success := and(eq(staticcall(gas(), 0x6, 0x6d60, 0x80, 0x6d60, 0x40), 1), success) - mstore(0x6de0, mload(0x5a0)) - mstore(0x6e00, mload(0x5c0)) - mstore(0x6e20, mload(0x5340)) - success := and(eq(staticcall(gas(), 0x7, 0x6de0, 0x60, 0x6de0, 0x40), 1), success) - mstore(0x6e40, mload(0x6d60)) - mstore(0x6e60, mload(0x6d80)) - mstore(0x6e80, mload(0x6de0)) - mstore(0x6ea0, mload(0x6e00)) - success := and(eq(staticcall(gas(), 0x6, 0x6e40, 0x80, 0x6e40, 0x40), 1), success) - mstore(0x6ec0, mload(0x7a0)) - mstore(0x6ee0, mload(0x7c0)) - mstore(0x6f00, mload(0x5bc0)) - success := and(eq(staticcall(gas(), 0x7, 0x6ec0, 0x60, 0x6ec0, 0x40), 1), success) - mstore(0x6f20, mload(0x6e40)) - mstore(0x6f40, mload(0x6e60)) - mstore(0x6f60, mload(0x6ec0)) - mstore(0x6f80, mload(0x6ee0)) - success := and(eq(staticcall(gas(), 0x6, 0x6f20, 0x80, 0x6f20, 0x40), 1), success) - mstore(0x6fa0, mload(0x5e0)) - mstore(0x6fc0, mload(0x600)) - mstore(0x6fe0, mload(0x5ec0)) - success := and(eq(staticcall(gas(), 0x7, 0x6fa0, 0x60, 0x6fa0, 0x40), 1), success) - mstore(0x7000, mload(0x6f20)) - mstore(0x7020, mload(0x6f40)) - mstore(0x7040, mload(0x6fa0)) - mstore(0x7060, mload(0x6fc0)) - success := and(eq(staticcall(gas(), 0x6, 0x7000, 0x80, 0x7000, 0x40), 1), success) - mstore(0x7080, mload(0x620)) - mstore(0x70a0, mload(0x640)) - mstore(0x70c0, mload(0x53a0)) - success := and(eq(staticcall(gas(), 0x7, 0x7080, 0x60, 0x7080, 0x40), 1), success) - mstore(0x70e0, mload(0x7000)) - mstore(0x7100, mload(0x7020)) - mstore(0x7120, mload(0x7080)) - mstore(0x7140, mload(0x70a0)) - success := and(eq(staticcall(gas(), 0x6, 0x70e0, 0x80, 0x70e0, 0x40), 1), success) - mstore(0x7160, 0x24df3a8ab6d23ed7008fbc06251e90863a4315ffc6c1cb8709eaaa3cf263faa5) - mstore(0x7180, 0x1095bd5aa580d4456d7475fd0544191c4db8c131f5edbdb8526406874a2256fe) - mstore(0x71a0, mload(0x53c0)) - success := and(eq(staticcall(gas(), 0x7, 0x7160, 0x60, 0x7160, 0x40), 1), success) - mstore(0x71c0, mload(0x70e0)) - mstore(0x71e0, mload(0x7100)) - mstore(0x7200, mload(0x7160)) - mstore(0x7220, mload(0x7180)) - success := and(eq(staticcall(gas(), 0x6, 0x71c0, 0x80, 0x71c0, 0x40), 1), success) - mstore(0x7240, 0x11e06a0924bc91df420cc28907921d96d30e06732532056355b159bfab487599) - mstore(0x7260, 0x0146dba1ad065c26ee3890d2e260e0a486b77a7024b700a0c4d2f42546526a92) - mstore(0x7280, mload(0x53e0)) - success := and(eq(staticcall(gas(), 0x7, 0x7240, 0x60, 0x7240, 0x40), 1), success) - mstore(0x72a0, mload(0x71c0)) - mstore(0x72c0, mload(0x71e0)) - mstore(0x72e0, mload(0x7240)) - mstore(0x7300, mload(0x7260)) - success := and(eq(staticcall(gas(), 0x6, 0x72a0, 0x80, 0x72a0, 0x40), 1), success) - mstore(0x7320, 0x2939459d1b84dfbd52b2e2b64f0a9e34a92f902561cfefa96e9c34dd7d24c5ed) - mstore(0x7340, 0x0863a7b24ba92c51042ec70c09561f56de7508951df59c9b2405868b3fb1e398) - mstore(0x7360, mload(0x5400)) - success := and(eq(staticcall(gas(), 0x7, 0x7320, 0x60, 0x7320, 0x40), 1), success) - mstore(0x7380, mload(0x72a0)) - mstore(0x73a0, mload(0x72c0)) - mstore(0x73c0, mload(0x7320)) - mstore(0x73e0, mload(0x7340)) - success := and(eq(staticcall(gas(), 0x6, 0x7380, 0x80, 0x7380, 0x40), 1), success) - mstore(0x7400, 0x2689485a8adaae5d72519b79d073c50281c6c6f2edb50dfc43381e6685b4ed48) - mstore(0x7420, 0x010475e5addbb2801fe3e12bff0c16cd59dcbc00612e487225531caf1fe73384) - mstore(0x7440, mload(0x5420)) - success := and(eq(staticcall(gas(), 0x7, 0x7400, 0x60, 0x7400, 0x40), 1), success) - mstore(0x7460, mload(0x7380)) - mstore(0x7480, mload(0x73a0)) - mstore(0x74a0, mload(0x7400)) - mstore(0x74c0, mload(0x7420)) - success := and(eq(staticcall(gas(), 0x6, 0x7460, 0x80, 0x7460, 0x40), 1), success) - mstore(0x74e0, 0x0c25af76635e4d86530f59602968f73c64d4e9321da480a656f8fdd45cc8f53d) - mstore(0x7500, 0x10a7b87fb011847118106b7ce456d3d82fbe5034bdb61ab81502d1eaa3c45fa3) - mstore(0x7520, mload(0x5440)) - success := and(eq(staticcall(gas(), 0x7, 0x74e0, 0x60, 0x74e0, 0x40), 1), success) - mstore(0x7540, mload(0x7460)) - mstore(0x7560, mload(0x7480)) - mstore(0x7580, mload(0x74e0)) - mstore(0x75a0, mload(0x7500)) - success := and(eq(staticcall(gas(), 0x6, 0x7540, 0x80, 0x7540, 0x40), 1), success) - mstore(0x75c0, 0x1da4d5f14edc872371c52c1c162a0c072bb7ec1dbbbe39ba8829dae031ccdb41) - mstore(0x75e0, 0x0b6e1dc1fe60239ed770f9595c733082777582cbfbccad71b2dbfc0cc271130d) - mstore(0x7600, mload(0x5460)) - success := and(eq(staticcall(gas(), 0x7, 0x75c0, 0x60, 0x75c0, 0x40), 1), success) - mstore(0x7620, mload(0x7540)) - mstore(0x7640, mload(0x7560)) - mstore(0x7660, mload(0x75c0)) - mstore(0x7680, mload(0x75e0)) - success := and(eq(staticcall(gas(), 0x6, 0x7620, 0x80, 0x7620, 0x40), 1), success) - mstore(0x76a0, 0x03c4f9bc94be2784bee9bbc645150ce1a747111cd4d8c86a6ba5872db514566b) - mstore(0x76c0, 0x0e92420076ca4212e17e10a8d09a40ad7203108c12142eae3c7e0820145bcb34) - mstore(0x76e0, mload(0x5480)) - success := and(eq(staticcall(gas(), 0x7, 0x76a0, 0x60, 0x76a0, 0x40), 1), success) - mstore(0x7700, mload(0x7620)) - mstore(0x7720, mload(0x7640)) - mstore(0x7740, mload(0x76a0)) - mstore(0x7760, mload(0x76c0)) - success := and(eq(staticcall(gas(), 0x6, 0x7700, 0x80, 0x7700, 0x40), 1), success) - mstore(0x7780, 0x2beb5c5065bb0090c21172606d4c4a17f8aba887cc35da572017f68fff0e2daa) - mstore(0x77a0, 0x044c2c7666c79f7117180457a5fce10b23a7954745d3c6af2852913ccf7ccc5f) - mstore(0x77c0, mload(0x54a0)) - success := and(eq(staticcall(gas(), 0x7, 0x7780, 0x60, 0x7780, 0x40), 1), success) - mstore(0x77e0, mload(0x7700)) - mstore(0x7800, mload(0x7720)) - mstore(0x7820, mload(0x7780)) - mstore(0x7840, mload(0x77a0)) - success := and(eq(staticcall(gas(), 0x6, 0x77e0, 0x80, 0x77e0, 0x40), 1), success) - mstore(0x7860, 0x05c183434fc3a650d28f4fa95ddf0aef925ed36337ba3dea6fb7e33f2314344d) - mstore(0x7880, 0x1221a2bc16fb1cdb5a8b7115e4d01309e4359cedbb63ca2ddce40870ad49d9eb) - mstore(0x78a0, mload(0x54c0)) - success := and(eq(staticcall(gas(), 0x7, 0x7860, 0x60, 0x7860, 0x40), 1), success) - mstore(0x78c0, mload(0x77e0)) - mstore(0x78e0, mload(0x7800)) - mstore(0x7900, mload(0x7860)) - mstore(0x7920, mload(0x7880)) - success := and(eq(staticcall(gas(), 0x6, 0x78c0, 0x80, 0x78c0, 0x40), 1), success) - mstore(0x7940, 0x12209b4185f5db7676fc98326c71e416945a641cd92ce00aa1ac5804e64519ba) - mstore(0x7960, 0x0e4ce8068964b434965e5f2ada90c054808c74f79cd3cda02c0df09a8b8a01dc) - mstore(0x7980, mload(0x54e0)) - success := and(eq(staticcall(gas(), 0x7, 0x7940, 0x60, 0x7940, 0x40), 1), success) - mstore(0x79a0, mload(0x78c0)) - mstore(0x79c0, mload(0x78e0)) - mstore(0x79e0, mload(0x7940)) - mstore(0x7a00, mload(0x7960)) - success := and(eq(staticcall(gas(), 0x6, 0x79a0, 0x80, 0x79a0, 0x40), 1), success) - mstore(0x7a20, 0x074bc27bd8025b72b9154c9d6ecf604e62e9b29af9e285e7c92a7c5de2cd68eb) - mstore(0x7a40, 0x0e135b6f45a74901de4a3ed12a4c514d57d5727ed8ba2423c3dfc82867bb7b93) - mstore(0x7a60, mload(0x5500)) - success := and(eq(staticcall(gas(), 0x7, 0x7a20, 0x60, 0x7a20, 0x40), 1), success) - mstore(0x7a80, mload(0x79a0)) - mstore(0x7aa0, mload(0x79c0)) - mstore(0x7ac0, mload(0x7a20)) - mstore(0x7ae0, mload(0x7a40)) - success := and(eq(staticcall(gas(), 0x6, 0x7a80, 0x80, 0x7a80, 0x40), 1), success) - mstore(0x7b00, mload(0x880)) - mstore(0x7b20, mload(0x8a0)) - mstore(0x7b40, mload(0x5520)) - success := and(eq(staticcall(gas(), 0x7, 0x7b00, 0x60, 0x7b00, 0x40), 1), success) - mstore(0x7b60, mload(0x7a80)) - mstore(0x7b80, mload(0x7aa0)) - mstore(0x7ba0, mload(0x7b00)) - mstore(0x7bc0, mload(0x7b20)) - success := and(eq(staticcall(gas(), 0x6, 0x7b60, 0x80, 0x7b60, 0x40), 1), success) - mstore(0x7be0, mload(0x8c0)) - mstore(0x7c00, mload(0x8e0)) - mstore(0x7c20, mload(0x5540)) - success := and(eq(staticcall(gas(), 0x7, 0x7be0, 0x60, 0x7be0, 0x40), 1), success) - mstore(0x7c40, mload(0x7b60)) - mstore(0x7c60, mload(0x7b80)) - mstore(0x7c80, mload(0x7be0)) - mstore(0x7ca0, mload(0x7c00)) - success := and(eq(staticcall(gas(), 0x6, 0x7c40, 0x80, 0x7c40, 0x40), 1), success) - mstore(0x7cc0, mload(0x900)) - mstore(0x7ce0, mload(0x920)) - mstore(0x7d00, mload(0x5560)) - success := and(eq(staticcall(gas(), 0x7, 0x7cc0, 0x60, 0x7cc0, 0x40), 1), success) - mstore(0x7d20, mload(0x7c40)) - mstore(0x7d40, mload(0x7c60)) - mstore(0x7d60, mload(0x7cc0)) - mstore(0x7d80, mload(0x7ce0)) - success := and(eq(staticcall(gas(), 0x6, 0x7d20, 0x80, 0x7d20, 0x40), 1), success) - mstore(0x7da0, mload(0x940)) - mstore(0x7dc0, mload(0x960)) - mstore(0x7de0, mload(0x5580)) - success := and(eq(staticcall(gas(), 0x7, 0x7da0, 0x60, 0x7da0, 0x40), 1), success) - mstore(0x7e00, mload(0x7d20)) - mstore(0x7e20, mload(0x7d40)) - mstore(0x7e40, mload(0x7da0)) - mstore(0x7e60, mload(0x7dc0)) - success := and(eq(staticcall(gas(), 0x6, 0x7e00, 0x80, 0x7e00, 0x40), 1), success) - mstore(0x7e80, mload(0x980)) - mstore(0x7ea0, mload(0x9a0)) - mstore(0x7ec0, mload(0x55a0)) - success := and(eq(staticcall(gas(), 0x7, 0x7e80, 0x60, 0x7e80, 0x40), 1), success) - mstore(0x7ee0, mload(0x7e00)) - mstore(0x7f00, mload(0x7e20)) - mstore(0x7f20, mload(0x7e80)) - mstore(0x7f40, mload(0x7ea0)) - success := and(eq(staticcall(gas(), 0x6, 0x7ee0, 0x80, 0x7ee0, 0x40), 1), success) - mstore(0x7f60, mload(0x9c0)) - mstore(0x7f80, mload(0x9e0)) - mstore(0x7fa0, mload(0x55c0)) - success := and(eq(staticcall(gas(), 0x7, 0x7f60, 0x60, 0x7f60, 0x40), 1), success) - mstore(0x7fc0, mload(0x7ee0)) - mstore(0x7fe0, mload(0x7f00)) - mstore(0x8000, mload(0x7f60)) - mstore(0x8020, mload(0x7f80)) - success := and(eq(staticcall(gas(), 0x6, 0x7fc0, 0x80, 0x7fc0, 0x40), 1), success) - mstore(0x8040, mload(0xa00)) - mstore(0x8060, mload(0xa20)) - mstore(0x8080, mload(0x55e0)) - success := and(eq(staticcall(gas(), 0x7, 0x8040, 0x60, 0x8040, 0x40), 1), success) - mstore(0x80a0, mload(0x7fc0)) - mstore(0x80c0, mload(0x7fe0)) - mstore(0x80e0, mload(0x8040)) - mstore(0x8100, mload(0x8060)) - success := and(eq(staticcall(gas(), 0x6, 0x80a0, 0x80, 0x80a0, 0x40), 1), success) - mstore(0x8120, mload(0xa40)) - mstore(0x8140, mload(0xa60)) - mstore(0x8160, mload(0x5600)) - success := and(eq(staticcall(gas(), 0x7, 0x8120, 0x60, 0x8120, 0x40), 1), success) - mstore(0x8180, mload(0x80a0)) - mstore(0x81a0, mload(0x80c0)) - mstore(0x81c0, mload(0x8120)) - mstore(0x81e0, mload(0x8140)) - success := and(eq(staticcall(gas(), 0x6, 0x8180, 0x80, 0x8180, 0x40), 1), success) - mstore(0x8200, mload(0x7e0)) - mstore(0x8220, mload(0x800)) - mstore(0x8240, mload(0x5620)) - success := and(eq(staticcall(gas(), 0x7, 0x8200, 0x60, 0x8200, 0x40), 1), success) - mstore(0x8260, mload(0x8180)) - mstore(0x8280, mload(0x81a0)) - mstore(0x82a0, mload(0x8200)) - mstore(0x82c0, mload(0x8220)) - success := and(eq(staticcall(gas(), 0x6, 0x8260, 0x80, 0x8260, 0x40), 1), success) - mstore(0x82e0, mload(0x1120)) - mstore(0x8300, mload(0x1140)) - mstore(0x8320, mload(0x5f00)) - success := and(eq(staticcall(gas(), 0x7, 0x82e0, 0x60, 0x82e0, 0x40), 1), success) - mstore(0x8340, mload(0x8260)) - mstore(0x8360, mload(0x8280)) - mstore(0x8380, mload(0x82e0)) - mstore(0x83a0, mload(0x8300)) - success := and(eq(staticcall(gas(), 0x6, 0x8340, 0x80, 0x8340, 0x40), 1), success) - mstore(0x83c0, mload(0x1160)) - mstore(0x83e0, mload(0x1180)) - mstore(0x8400, mload(0x5f40)) - success := and(eq(staticcall(gas(), 0x7, 0x83c0, 0x60, 0x83c0, 0x40), 1), success) - mstore(0x8420, mload(0x8340)) - mstore(0x8440, mload(0x8360)) - mstore(0x8460, mload(0x83c0)) - mstore(0x8480, mload(0x83e0)) - success := and(eq(staticcall(gas(), 0x6, 0x8420, 0x80, 0x8420, 0x40), 1), success) - mstore(0x84a0, mload(0x11a0)) - mstore(0x84c0, mload(0x11c0)) - mstore(0x84e0, mload(0x5f80)) - success := and(eq(staticcall(gas(), 0x7, 0x84a0, 0x60, 0x84a0, 0x40), 1), success) - mstore(0x8500, mload(0x8420)) - mstore(0x8520, mload(0x8440)) - mstore(0x8540, mload(0x84a0)) - mstore(0x8560, mload(0x84c0)) - success := and(eq(staticcall(gas(), 0x6, 0x8500, 0x80, 0x8500, 0x40), 1), success) - mstore(0x8580, mload(0x11e0)) - mstore(0x85a0, mload(0x1200)) - mstore(0x85c0, mload(0x5fc0)) - success := and(eq(staticcall(gas(), 0x7, 0x8580, 0x60, 0x8580, 0x40), 1), success) - mstore(0x85e0, mload(0x8500)) - mstore(0x8600, mload(0x8520)) - mstore(0x8620, mload(0x8580)) - mstore(0x8640, mload(0x85a0)) - success := and(eq(staticcall(gas(), 0x6, 0x85e0, 0x80, 0x85e0, 0x40), 1), success) - mstore(0x8660, mload(0x1220)) - mstore(0x8680, mload(0x1240)) - mstore(0x86a0, mload(0x6000)) - success := and(eq(staticcall(gas(), 0x7, 0x8660, 0x60, 0x8660, 0x40), 1), success) - mstore(0x86c0, mload(0x85e0)) - mstore(0x86e0, mload(0x8600)) - mstore(0x8700, mload(0x8660)) - mstore(0x8720, mload(0x8680)) - success := and(eq(staticcall(gas(), 0x6, 0x86c0, 0x80, 0x86c0, 0x40), 1), success) - mstore(0x8740, mload(0x1260)) - mstore(0x8760, mload(0x1280)) - mstore(0x8780, mload(0x6040)) - success := and(eq(staticcall(gas(), 0x7, 0x8740, 0x60, 0x8740, 0x40), 1), success) - mstore(0x87a0, mload(0x86c0)) - mstore(0x87c0, mload(0x86e0)) - mstore(0x87e0, mload(0x8740)) - mstore(0x8800, mload(0x8760)) - success := and(eq(staticcall(gas(), 0x6, 0x87a0, 0x80, 0x87a0, 0x40), 1), success) - mstore(0x8820, mload(0x1160)) - mstore(0x8840, mload(0x1180)) - mstore(0x8860, mload(0x5900)) - success := and(eq(staticcall(gas(), 0x7, 0x8820, 0x60, 0x8820, 0x40), 1), success) - mstore(0x8880, mload(0x1120)) - mstore(0x88a0, mload(0x1140)) - mstore(0x88c0, mload(0x8820)) - mstore(0x88e0, mload(0x8840)) - success := and(eq(staticcall(gas(), 0x6, 0x8880, 0x80, 0x8880, 0x40), 1), success) - mstore(0x8900, mload(0x11a0)) - mstore(0x8920, mload(0x11c0)) - mstore(0x8940, mload(0x5c20)) - success := and(eq(staticcall(gas(), 0x7, 0x8900, 0x60, 0x8900, 0x40), 1), success) - mstore(0x8960, mload(0x8880)) - mstore(0x8980, mload(0x88a0)) - mstore(0x89a0, mload(0x8900)) - mstore(0x89c0, mload(0x8920)) - success := and(eq(staticcall(gas(), 0x6, 0x8960, 0x80, 0x8960, 0x40), 1), success) - mstore(0x89e0, mload(0x11e0)) - mstore(0x8a00, mload(0x1200)) - mstore(0x8a20, mload(0x5cc0)) - success := and(eq(staticcall(gas(), 0x7, 0x89e0, 0x60, 0x89e0, 0x40), 1), success) - mstore(0x8a40, mload(0x8960)) - mstore(0x8a60, mload(0x8980)) - mstore(0x8a80, mload(0x89e0)) - mstore(0x8aa0, mload(0x8a00)) - success := and(eq(staticcall(gas(), 0x6, 0x8a40, 0x80, 0x8a40, 0x40), 1), success) - mstore(0x8ac0, mload(0x1220)) - mstore(0x8ae0, mload(0x1240)) - mstore(0x8b00, mload(0x5d60)) - success := and(eq(staticcall(gas(), 0x7, 0x8ac0, 0x60, 0x8ac0, 0x40), 1), success) - mstore(0x8b20, mload(0x8a40)) - mstore(0x8b40, mload(0x8a60)) - mstore(0x8b60, mload(0x8ac0)) - mstore(0x8b80, mload(0x8ae0)) - success := and(eq(staticcall(gas(), 0x6, 0x8b20, 0x80, 0x8b20, 0x40), 1), success) - mstore(0x8ba0, mload(0x1260)) - mstore(0x8bc0, mload(0x1280)) - mstore(0x8be0, mload(0x5e40)) - success := and(eq(staticcall(gas(), 0x7, 0x8ba0, 0x60, 0x8ba0, 0x40), 1), success) - mstore(0x8c00, mload(0x8b20)) - mstore(0x8c20, mload(0x8b40)) - mstore(0x8c40, mload(0x8ba0)) - mstore(0x8c60, mload(0x8bc0)) - success := and(eq(staticcall(gas(), 0x6, 0x8c00, 0x80, 0x8c00, 0x40), 1), success) - mstore(0x8c80, mload(0x87a0)) - mstore(0x8ca0, mload(0x87c0)) - mstore(0x8cc0, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) - mstore(0x8ce0, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed) - mstore(0x8d00, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b) - mstore(0x8d20, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa) - mstore(0x8d40, mload(0x8c00)) - mstore(0x8d60, mload(0x8c20)) - mstore(0x8d80, 0x03fecfd23d328341e7c37d832729014de9a532c74fa1e734832b9364afe54ff6) - mstore(0x8da0, 0x1c409140357e6291196cff0168ffabc3272b2b7ff408e5e22698c7097abd3c8e) - mstore(0x8dc0, 0x26664eede2dc90d92950867bfd69fbb8e099bf8ad87665e7ae1b61ced474f8bb) - mstore(0x8de0, 0x2b3f914b211ba74b0bb752fd46788410c534dff9de694623b784dbddd2f43858) - success := and(eq(staticcall(gas(), 0x8, 0x8c80, 0x180, 0x8c80, 0x20), 1), success) - success := and(eq(mload(0x8c80), 1), success) - - if not(success) { revert(0, 0) } - return(0, 0) - - } - } -} diff --git a/packages/protocol/contracts/libs/yul/PlonkVerifier_10_txs.yulp b/packages/protocol/contracts/libs/yul/PlonkVerifier_10_txs.yulp new file mode 100644 index 0000000000..edb031b0c5 --- /dev/null +++ b/packages/protocol/contracts/libs/yul/PlonkVerifier_10_txs.yulp @@ -0,0 +1,2150 @@ +// Code generated - DO NOT EDIT. +// SPDX-License-Identifier: MIT +// _____ _ _ _ _ +// |_ _|_ _(_) |_____ | | __ _| |__ ___ +// | |/ _` | | / / _ \ | |__/ _` | '_ (_-< +// |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ + +object "plonk_verifier" { + code { + function allocate(size) -> ptr { + ptr := mload(0x40) + if eq(ptr, 0) { ptr := 0x60 } + mstore(0x40, add(ptr, size)) + } + let size := datasize("Runtime") + let offset := allocate(size) + datacopy(offset, dataoffset("Runtime"), size) + return(offset, size) + } + object "Runtime" { + code { + let success:bool := true + let f_p := 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47 + let f_q := 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001 + function validate_ec_point(x, y) -> valid:bool { + { + let x_lt_p:bool := lt(x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) + let y_lt_p:bool := lt(y, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) + valid := and(x_lt_p, y_lt_p) + } + { + let x_is_zero:bool := eq(x, 0) + let y_is_zero:bool := eq(y, 0) + let x_or_y_is_zero:bool := or(x_is_zero, y_is_zero) + let x_and_y_is_not_zero:bool := not(x_or_y_is_zero) + valid := and(x_and_y_is_not_zero, valid) + } + { + let y_square := mulmod(y, y, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) + let x_square := mulmod(x, x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) + let x_cube := mulmod(x_square, x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) + let x_cube_plus_3 := addmod(x_cube, 3, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) + let y_square_eq_x_cube_plus_3:bool := eq(x_cube_plus_3, y_square) + valid := and(y_square_eq_x_cube_plus_3, valid) + } + } + mstore(0x20, mod(calldataload(0x0), f_q)) +mstore(0x40, mod(calldataload(0x20), f_q)) +mstore(0x0, 3067907949222900551913553498849892226635280613088758012043891418197569392443) + +{ + let x := calldataload(0x40) + mstore(0x60, x) + let y := calldataload(0x60) + mstore(0x80, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x80) + mstore(0xa0, x) + let y := calldataload(0xa0) + mstore(0xc0, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0xc0) + mstore(0xe0, x) + let y := calldataload(0xe0) + mstore(0x100, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x100) + mstore(0x120, x) + let y := calldataload(0x120) + mstore(0x140, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x140) + mstore(0x160, x) + let y := calldataload(0x160) + mstore(0x180, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x180) + mstore(0x1a0, x) + let y := calldataload(0x1a0) + mstore(0x1c0, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x1c0) + mstore(0x1e0, x) + let y := calldataload(0x1e0) + mstore(0x200, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x200) + mstore(0x220, x) + let y := calldataload(0x220) + mstore(0x240, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x240) + mstore(0x260, x) + let y := calldataload(0x260) + mstore(0x280, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x280) + mstore(0x2a0, x) + let y := calldataload(0x2a0) + mstore(0x2c0, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x2c0) + mstore(0x2e0, x) + let y := calldataload(0x2e0) + mstore(0x300, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x300) + mstore(0x320, x) + let y := calldataload(0x320) + mstore(0x340, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x340) + mstore(0x360, x) + let y := calldataload(0x360) + mstore(0x380, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x380) + mstore(0x3a0, x) + let y := calldataload(0x3a0) + mstore(0x3c0, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x3c0) + mstore(0x3e0, x) + let y := calldataload(0x3e0) + mstore(0x400, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x400) + mstore(0x420, x) + let y := calldataload(0x420) + mstore(0x440, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x440) + mstore(0x460, x) + let y := calldataload(0x460) + mstore(0x480, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x480) + mstore(0x4a0, x) + let y := calldataload(0x4a0) + mstore(0x4c0, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x4c0) + mstore(0x4e0, x) + let y := calldataload(0x4e0) + mstore(0x500, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x500) + mstore(0x520, x) + let y := calldataload(0x520) + mstore(0x540, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x540) + mstore(0x560, x) + let y := calldataload(0x560) + mstore(0x580, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x580) + mstore(0x5a0, x) + let y := calldataload(0x5a0) + mstore(0x5c0, y) + success := and(validate_ec_point(x, y), success) +} +mstore(0x5e0, keccak256(0x0, 1504)) +{ + let hash := mload(0x5e0) + mstore(0x600, mod(hash, f_q)) + mstore(0x620, hash) +} + +{ + let x := calldataload(0x5c0) + mstore(0x640, x) + let y := calldataload(0x5e0) + mstore(0x660, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x600) + mstore(0x680, x) + let y := calldataload(0x620) + mstore(0x6a0, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x640) + mstore(0x6c0, x) + let y := calldataload(0x660) + mstore(0x6e0, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x680) + mstore(0x700, x) + let y := calldataload(0x6a0) + mstore(0x720, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x6c0) + mstore(0x740, x) + let y := calldataload(0x6e0) + mstore(0x760, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x700) + mstore(0x780, x) + let y := calldataload(0x720) + mstore(0x7a0, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x740) + mstore(0x7c0, x) + let y := calldataload(0x760) + mstore(0x7e0, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x780) + mstore(0x800, x) + let y := calldataload(0x7a0) + mstore(0x820, y) + success := and(validate_ec_point(x, y), success) +} +mstore(0x840, keccak256(0x620, 544)) +{ + let hash := mload(0x840) + mstore(0x860, mod(hash, f_q)) + mstore(0x880, hash) +} +mstore8(2208, 1) +mstore(0x8a0, keccak256(0x880, 33)) +{ + let hash := mload(0x8a0) + mstore(0x8c0, mod(hash, f_q)) + mstore(0x8e0, hash) +} + +{ + let x := calldataload(0x7c0) + mstore(0x900, x) + let y := calldataload(0x7e0) + mstore(0x920, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x800) + mstore(0x940, x) + let y := calldataload(0x820) + mstore(0x960, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x840) + mstore(0x980, x) + let y := calldataload(0x860) + mstore(0x9a0, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x880) + mstore(0x9c0, x) + let y := calldataload(0x8a0) + mstore(0x9e0, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x8c0) + mstore(0xa00, x) + let y := calldataload(0x8e0) + mstore(0xa20, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x900) + mstore(0xa40, x) + let y := calldataload(0x920) + mstore(0xa60, y) + success := and(validate_ec_point(x, y), success) +} +mstore(0xa80, keccak256(0x8e0, 416)) +{ + let hash := mload(0xa80) + mstore(0xaa0, mod(hash, f_q)) + mstore(0xac0, hash) +} + +{ + let x := calldataload(0x940) + mstore(0xae0, x) + let y := calldataload(0x960) + mstore(0xb00, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x980) + mstore(0xb20, x) + let y := calldataload(0x9a0) + mstore(0xb40, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x9c0) + mstore(0xb60, x) + let y := calldataload(0x9e0) + mstore(0xb80, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0xa00) + mstore(0xba0, x) + let y := calldataload(0xa20) + mstore(0xbc0, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0xa40) + mstore(0xbe0, x) + let y := calldataload(0xa60) + mstore(0xc00, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0xa80) + mstore(0xc20, x) + let y := calldataload(0xaa0) + mstore(0xc40, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0xac0) + mstore(0xc60, x) + let y := calldataload(0xae0) + mstore(0xc80, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0xb00) + mstore(0xca0, x) + let y := calldataload(0xb20) + mstore(0xcc0, y) + success := and(validate_ec_point(x, y), success) +} +mstore(0xce0, keccak256(0xac0, 544)) +{ + let hash := mload(0xce0) + mstore(0xd00, mod(hash, f_q)) + mstore(0xd20, hash) +} +mstore(0xd40, mod(calldataload(0xb40), f_q)) +mstore(0xd60, mod(calldataload(0xb60), f_q)) +mstore(0xd80, mod(calldataload(0xb80), f_q)) +mstore(0xda0, mod(calldataload(0xba0), f_q)) +mstore(0xdc0, mod(calldataload(0xbc0), f_q)) +mstore(0xde0, mod(calldataload(0xbe0), f_q)) +mstore(0xe00, mod(calldataload(0xc00), f_q)) +mstore(0xe20, mod(calldataload(0xc20), f_q)) +mstore(0xe40, mod(calldataload(0xc40), f_q)) +mstore(0xe60, mod(calldataload(0xc60), f_q)) +mstore(0xe80, mod(calldataload(0xc80), f_q)) +mstore(0xea0, mod(calldataload(0xca0), f_q)) +mstore(0xec0, mod(calldataload(0xcc0), f_q)) +mstore(0xee0, mod(calldataload(0xce0), f_q)) +mstore(0xf00, mod(calldataload(0xd00), f_q)) +mstore(0xf20, mod(calldataload(0xd20), f_q)) +mstore(0xf40, mod(calldataload(0xd40), f_q)) +mstore(0xf60, mod(calldataload(0xd60), f_q)) +mstore(0xf80, mod(calldataload(0xd80), f_q)) +mstore(0xfa0, mod(calldataload(0xda0), f_q)) +mstore(0xfc0, mod(calldataload(0xdc0), f_q)) +mstore(0xfe0, mod(calldataload(0xde0), f_q)) +mstore(0x1000, mod(calldataload(0xe00), f_q)) +mstore(0x1020, mod(calldataload(0xe20), f_q)) +mstore(0x1040, mod(calldataload(0xe40), f_q)) +mstore(0x1060, mod(calldataload(0xe60), f_q)) +mstore(0x1080, mod(calldataload(0xe80), f_q)) +mstore(0x10a0, mod(calldataload(0xea0), f_q)) +mstore(0x10c0, mod(calldataload(0xec0), f_q)) +mstore(0x10e0, mod(calldataload(0xee0), f_q)) +mstore(0x1100, mod(calldataload(0xf00), f_q)) +mstore(0x1120, mod(calldataload(0xf20), f_q)) +mstore(0x1140, mod(calldataload(0xf40), f_q)) +mstore(0x1160, mod(calldataload(0xf60), f_q)) +mstore(0x1180, mod(calldataload(0xf80), f_q)) +mstore(0x11a0, mod(calldataload(0xfa0), f_q)) +mstore(0x11c0, mod(calldataload(0xfc0), f_q)) +mstore(0x11e0, mod(calldataload(0xfe0), f_q)) +mstore(0x1200, mod(calldataload(0x1000), f_q)) +mstore(0x1220, mod(calldataload(0x1020), f_q)) +mstore(0x1240, mod(calldataload(0x1040), f_q)) +mstore(0x1260, mod(calldataload(0x1060), f_q)) +mstore(0x1280, mod(calldataload(0x1080), f_q)) +mstore(0x12a0, mod(calldataload(0x10a0), f_q)) +mstore(0x12c0, mod(calldataload(0x10c0), f_q)) +mstore(0x12e0, mod(calldataload(0x10e0), f_q)) +mstore(0x1300, mod(calldataload(0x1100), f_q)) +mstore(0x1320, mod(calldataload(0x1120), f_q)) +mstore(0x1340, mod(calldataload(0x1140), f_q)) +mstore(0x1360, mod(calldataload(0x1160), f_q)) +mstore(0x1380, mod(calldataload(0x1180), f_q)) +mstore(0x13a0, mod(calldataload(0x11a0), f_q)) +mstore(0x13c0, mod(calldataload(0x11c0), f_q)) +mstore(0x13e0, mod(calldataload(0x11e0), f_q)) +mstore(0x1400, mod(calldataload(0x1200), f_q)) +mstore(0x1420, mod(calldataload(0x1220), f_q)) +mstore(0x1440, mod(calldataload(0x1240), f_q)) +mstore(0x1460, mod(calldataload(0x1260), f_q)) +mstore(0x1480, mod(calldataload(0x1280), f_q)) +mstore(0x14a0, mod(calldataload(0x12a0), f_q)) +mstore(0x14c0, mod(calldataload(0x12c0), f_q)) +mstore(0x14e0, mod(calldataload(0x12e0), f_q)) +mstore(0x1500, mod(calldataload(0x1300), f_q)) +mstore(0x1520, mod(calldataload(0x1320), f_q)) +mstore(0x1540, mod(calldataload(0x1340), f_q)) +mstore(0x1560, mod(calldataload(0x1360), f_q)) +mstore(0x1580, mod(calldataload(0x1380), f_q)) +mstore(0x15a0, mod(calldataload(0x13a0), f_q)) +mstore(0x15c0, mod(calldataload(0x13c0), f_q)) +mstore(0x15e0, mod(calldataload(0x13e0), f_q)) +mstore(0x1600, mod(calldataload(0x1400), f_q)) +mstore(0x1620, keccak256(0xd20, 2304)) +{ + let hash := mload(0x1620) + mstore(0x1640, mod(hash, f_q)) + mstore(0x1660, hash) +} + +{ + let x := calldataload(0x1420) + mstore(0x1680, x) + let y := calldataload(0x1440) + mstore(0x16a0, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x1460) + mstore(0x16c0, x) + let y := calldataload(0x1480) + mstore(0x16e0, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x14a0) + mstore(0x1700, x) + let y := calldataload(0x14c0) + mstore(0x1720, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x14e0) + mstore(0x1740, x) + let y := calldataload(0x1500) + mstore(0x1760, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x1520) + mstore(0x1780, x) + let y := calldataload(0x1540) + mstore(0x17a0, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x1560) + mstore(0x17c0, x) + let y := calldataload(0x1580) + mstore(0x17e0, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x15a0) + mstore(0x1800, x) + let y := calldataload(0x15c0) + mstore(0x1820, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x15e0) + mstore(0x1840, x) + let y := calldataload(0x1600) + mstore(0x1860, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x1620) + mstore(0x1880, x) + let y := calldataload(0x1640) + mstore(0x18a0, y) + success := and(validate_ec_point(x, y), success) +} +mstore(0x18c0, keccak256(0x1660, 608)) +{ + let hash := mload(0x18c0) + mstore(0x18e0, mod(hash, f_q)) + mstore(0x1900, hash) +} +mstore(0x1920, mulmod(mload(0xd00), mload(0xd00), f_q)) +mstore(0x1940, mulmod(mload(0x1920), mload(0x1920), f_q)) +mstore(0x1960, mulmod(mload(0x1940), mload(0x1940), f_q)) +mstore(0x1980, mulmod(mload(0x1960), mload(0x1960), f_q)) +mstore(0x19a0, mulmod(mload(0x1980), mload(0x1980), f_q)) +mstore(0x19c0, mulmod(mload(0x19a0), mload(0x19a0), f_q)) +mstore(0x19e0, mulmod(mload(0x19c0), mload(0x19c0), f_q)) +mstore(0x1a00, mulmod(mload(0x19e0), mload(0x19e0), f_q)) +mstore(0x1a20, mulmod(mload(0x1a00), mload(0x1a00), f_q)) +mstore(0x1a40, mulmod(mload(0x1a20), mload(0x1a20), f_q)) +mstore(0x1a60, mulmod(mload(0x1a40), mload(0x1a40), f_q)) +mstore(0x1a80, mulmod(mload(0x1a60), mload(0x1a60), f_q)) +mstore(0x1aa0, mulmod(mload(0x1a80), mload(0x1a80), f_q)) +mstore(0x1ac0, mulmod(mload(0x1aa0), mload(0x1aa0), f_q)) +mstore(0x1ae0, mulmod(mload(0x1ac0), mload(0x1ac0), f_q)) +mstore(0x1b00, mulmod(mload(0x1ae0), mload(0x1ae0), f_q)) +mstore(0x1b20, mulmod(mload(0x1b00), mload(0x1b00), f_q)) +mstore(0x1b40, mulmod(mload(0x1b20), mload(0x1b20), f_q)) +mstore(0x1b60, mulmod(mload(0x1b40), mload(0x1b40), f_q)) +mstore(0x1b80, addmod(mload(0x1b60), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q)) +mstore(0x1ba0, mulmod(mload(0x1b80), 21888201123329158951656153352668191879939568188478319927128792530760328118785, f_q)) +mstore(0x1bc0, mulmod(mload(0x1ba0), 5857228514216831962358810454360739186987616060007133076514874820078026801648, f_q)) +mstore(0x1be0, addmod(mload(0xd00), 16031014357622443259887595290896535901560748340408901267183329366497781693969, f_q)) +mstore(0x1c00, mulmod(mload(0x1ba0), 4271593564993779667957423108416500495810680728882871252433682238116462818576, f_q)) +mstore(0x1c20, addmod(mload(0xd00), 17616649306845495554288982636840774592737683671533163091264521948459345677041, f_q)) +mstore(0x1c40, mulmod(mload(0x1ba0), 15837174511167031493871940795515473313759957271874477857633393696392913897559, f_q)) +mstore(0x1c60, addmod(mload(0xd00), 6051068360672243728374464949741801774788407128541556486064810490182894598058, f_q)) +mstore(0x1c80, mulmod(mload(0x1ba0), 1769632609887742868080915468068339302011836563132608883078842147442873613232, f_q)) +mstore(0x1ca0, addmod(mload(0xd00), 20118610261951532354165490277188935786536527837283425460619362039132934882385, f_q)) +mstore(0x1cc0, mulmod(mload(0x1ba0), 11402394834529375719535454173347509224290498423785625657829583372803806900475, f_q)) +mstore(0x1ce0, addmod(mload(0xd00), 10485848037309899502710951571909765864257865976630408685868620813772001595142, f_q)) +mstore(0x1d00, mulmod(mload(0x1ba0), 13315224328250071823986980334210714047804323884995968263773489477577155309695, f_q)) +mstore(0x1d20, addmod(mload(0xd00), 8573018543589203398259425411046561040744040515420066079924714708998653185922, f_q)) +mstore(0x1d40, mulmod(mload(0x1ba0), 6363119021782681274480715230122258277189830284152385293217720612674619714422, f_q)) +mstore(0x1d60, addmod(mload(0xd00), 15525123850056593947765690515135016811358534116263649050480483573901188781195, f_q)) +mstore(0x1d80, mulmod(mload(0x1ba0), 14686510910986211321976396297238126901237973400949744736326777596334651355305, f_q)) +mstore(0x1da0, addmod(mload(0xd00), 7201731960853063900270009448019148187310390999466289607371426590241157140312, f_q)) +mstore(0x1dc0, mulmod(mload(0x1ba0), 1, f_q)) +mstore(0x1de0, addmod(mload(0xd00), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q)) +mstore(0x1e00, mulmod(mload(0x1ba0), 5854133144571823792863860130267644613802765696134002830362054821530146160770, f_q)) +mstore(0x1e20, addmod(mload(0xd00), 16034109727267451429382545614989630474745598704282031513336149365045662334847, f_q)) +{ + let prod := mload(0x1be0) + + prod := mulmod(mload(0x1c20), prod, f_q) + mstore(0x1e40, prod) + + prod := mulmod(mload(0x1c60), prod, f_q) + mstore(0x1e60, prod) + + prod := mulmod(mload(0x1ca0), prod, f_q) + mstore(0x1e80, prod) + + prod := mulmod(mload(0x1ce0), prod, f_q) + mstore(0x1ea0, prod) + + prod := mulmod(mload(0x1d20), prod, f_q) + mstore(0x1ec0, prod) + + prod := mulmod(mload(0x1d60), prod, f_q) + mstore(0x1ee0, prod) + + prod := mulmod(mload(0x1da0), prod, f_q) + mstore(0x1f00, prod) + + prod := mulmod(mload(0x1de0), prod, f_q) + mstore(0x1f20, prod) + + prod := mulmod(mload(0x1e20), prod, f_q) + mstore(0x1f40, prod) + + prod := mulmod(mload(0x1b80), prod, f_q) + mstore(0x1f60, prod) + +} +mstore(0x1fa0, 32) +mstore(0x1fc0, 32) +mstore(0x1fe0, 32) +mstore(0x2000, mload(0x1f60)) +mstore(0x2020, 21888242871839275222246405745257275088548364400416034343698204186575808495615) +mstore(0x2040, 21888242871839275222246405745257275088548364400416034343698204186575808495617) +success := and(eq(staticcall(gas(), 0x5, 0x1fa0, 0xc0, 0x1f80, 0x20), 1), success) +{ + + let inv := mload(0x1f80) + let v + + v := mload(0x1b80) + mstore(7040, mulmod(mload(0x1f40), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1e20) + mstore(7712, mulmod(mload(0x1f20), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1de0) + mstore(7648, mulmod(mload(0x1f00), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1da0) + mstore(7584, mulmod(mload(0x1ee0), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1d60) + mstore(7520, mulmod(mload(0x1ec0), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1d20) + mstore(7456, mulmod(mload(0x1ea0), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1ce0) + mstore(7392, mulmod(mload(0x1e80), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1ca0) + mstore(7328, mulmod(mload(0x1e60), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1c60) + mstore(7264, mulmod(mload(0x1e40), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1c20) + mstore(7200, mulmod(mload(0x1be0), inv, f_q)) + inv := mulmod(v, inv, f_q) + mstore(0x1be0, inv) + +} +mstore(0x2060, mulmod(mload(0x1bc0), mload(0x1be0), f_q)) +mstore(0x2080, mulmod(mload(0x1c00), mload(0x1c20), f_q)) +mstore(0x20a0, mulmod(mload(0x1c40), mload(0x1c60), f_q)) +mstore(0x20c0, mulmod(mload(0x1c80), mload(0x1ca0), f_q)) +mstore(0x20e0, mulmod(mload(0x1cc0), mload(0x1ce0), f_q)) +mstore(0x2100, mulmod(mload(0x1d00), mload(0x1d20), f_q)) +mstore(0x2120, mulmod(mload(0x1d40), mload(0x1d60), f_q)) +mstore(0x2140, mulmod(mload(0x1d80), mload(0x1da0), f_q)) +mstore(0x2160, mulmod(mload(0x1dc0), mload(0x1de0), f_q)) +mstore(0x2180, mulmod(mload(0x1e00), mload(0x1e20), f_q)) +{ + let result := mulmod(mload(0x2160), mload(0x20), f_q) +result := addmod(mulmod(mload(0x2180), mload(0x40), f_q), result, f_q) +mstore(8608, result) +} +mstore(0x21c0, mulmod(100, mload(0xd60), f_q)) +mstore(0x21e0, addmod(mload(0x21c0), mload(0xdc0), f_q)) +mstore(0x2200, addmod(mload(0xda0), sub(f_q, mload(0x21e0)), f_q)) +mstore(0x2220, mulmod(mload(0x2200), mload(0x1280), f_q)) +mstore(0x2240, mulmod(mload(0xaa0), mload(0x2220), f_q)) +mstore(0x2260, addmod(mload(0xd60), sub(f_q, mload(0xd40)), f_q)) +mstore(0x2280, mulmod(mload(0x2260), mload(0x1260), f_q)) +mstore(0x22a0, addmod(mload(0x2240), mload(0x2280), f_q)) +mstore(0x22c0, mulmod(mload(0xaa0), mload(0x22a0), f_q)) +mstore(0x22e0, addmod(mload(0xf60), sub(f_q, mload(0xd40)), f_q)) +mstore(0x2300, mulmod(mload(0x22e0), mload(0x12a0), f_q)) +mstore(0x2320, addmod(mload(0x22c0), mload(0x2300), f_q)) +mstore(0x2340, mulmod(mload(0xaa0), mload(0x2320), f_q)) +mstore(0x2360, addmod(mload(0xf80), sub(f_q, mload(0xfa0)), f_q)) +mstore(0x2380, mulmod(mload(0x2360), mload(0x11e0), f_q)) +mstore(0x23a0, addmod(mload(0x2340), mload(0x2380), f_q)) +mstore(0x23c0, mulmod(mload(0xaa0), mload(0x23a0), f_q)) +mstore(0x23e0, addmod(mload(0xfc0), sub(f_q, mload(0xfe0)), f_q)) +mstore(0x2400, mulmod(mload(0x23e0), mload(0x11e0), f_q)) +mstore(0x2420, addmod(mload(0x23c0), mload(0x2400), f_q)) +mstore(0x2440, mulmod(mload(0xaa0), mload(0x2420), f_q)) +mstore(0x2460, addmod(1, sub(f_q, mload(0x11e0)), f_q)) +mstore(0x2480, mulmod(mload(0x2460), 1, f_q)) +mstore(0x24a0, addmod(1, sub(f_q, mload(0x1200)), f_q)) +mstore(0x24c0, mulmod(mload(0x24a0), mload(0x2480), f_q)) +mstore(0x24e0, addmod(1, sub(f_q, mload(0x24c0)), f_q)) +mstore(0x2500, addmod(mload(0x1000), sub(f_q, mload(0x1020)), f_q)) +mstore(0x2520, mulmod(mload(0x2500), mload(0x24e0), f_q)) +mstore(0x2540, addmod(mload(0x2440), mload(0x2520), f_q)) +mstore(0x2560, mulmod(mload(0xaa0), mload(0x2540), f_q)) +mstore(0x2580, mulmod(mload(0xf80), mload(0x1200), f_q)) +mstore(0x25a0, mulmod(mload(0x1040), mload(0xf80), f_q)) +mstore(0x25c0, addmod(1, sub(f_q, mload(0x25a0)), f_q)) +mstore(0x25e0, mulmod(mload(0x25c0), mload(0x2580), f_q)) +mstore(0x2600, addmod(mload(0x2560), mload(0x25e0), f_q)) +mstore(0x2620, mulmod(mload(0xaa0), mload(0x2600), f_q)) +mstore(0x2640, mulmod(mload(0x1000), mload(0x24e0), f_q)) +mstore(0x2660, mulmod(mload(0x1060), mload(0x1000), f_q)) +mstore(0x2680, addmod(1, sub(f_q, mload(0x2660)), f_q)) +mstore(0x26a0, mulmod(mload(0x2680), mload(0x2640), f_q)) +mstore(0x26c0, addmod(mload(0x2620), mload(0x26a0), f_q)) +mstore(0x26e0, mulmod(mload(0xaa0), mload(0x26c0), f_q)) +mstore(0x2700, addmod(mload(0x10a0), sub(f_q, mload(0xf80)), f_q)) +mstore(0x2720, mulmod(mload(0x2700), mload(0x1200), f_q)) +mstore(0x2740, mulmod(mload(0x1080), mload(0x2700), f_q)) +mstore(0x2760, addmod(1, sub(f_q, mload(0x2740)), f_q)) +mstore(0x2780, mulmod(mload(0x2760), mload(0x2720), f_q)) +mstore(0x27a0, addmod(mload(0x26e0), mload(0x2780), f_q)) +mstore(0x27c0, mulmod(mload(0xaa0), mload(0x27a0), f_q)) +mstore(0x27e0, mulmod(mload(0xfc0), mload(0x25c0), f_q)) +mstore(0x2800, mulmod(mload(0x27e0), mload(0x1200), f_q)) +mstore(0x2820, addmod(mload(0x27c0), mload(0x2800), f_q)) +mstore(0x2840, mulmod(mload(0xaa0), mload(0x2820), f_q)) +mstore(0x2860, mulmod(mload(0x10a0), mload(0x25c0), f_q)) +mstore(0x2880, mulmod(mload(0x2860), mload(0x1200), f_q)) +mstore(0x28a0, addmod(mload(0x2840), mload(0x2880), f_q)) +mstore(0x28c0, mulmod(mload(0xaa0), mload(0x28a0), f_q)) +mstore(0x28e0, mulmod(mload(0x1180), mload(0x25c0), f_q)) +mstore(0x2900, mulmod(mload(0x28e0), mload(0x1200), f_q)) +mstore(0x2920, addmod(mload(0x28c0), mload(0x2900), f_q)) +mstore(0x2940, mulmod(mload(0xaa0), mload(0x2920), f_q)) +mstore(0x2960, mulmod(mload(0x1140), mload(0x25c0), f_q)) +mstore(0x2980, mulmod(mload(0x2960), mload(0x1200), f_q)) +mstore(0x29a0, addmod(mload(0x2940), mload(0x2980), f_q)) +mstore(0x29c0, mulmod(mload(0xaa0), mload(0x29a0), f_q)) +mstore(0x29e0, addmod(1, sub(f_q, mload(0x25c0)), f_q)) +mstore(0x2a00, mulmod(mload(0x29e0), mload(0x1200), f_q)) +mstore(0x2a20, addmod(mload(0x10e0), sub(f_q, mload(0xfc0)), f_q)) +mstore(0x2a40, addmod(mload(0x2a20), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q)) +mstore(0x2a60, mulmod(mload(0x2a40), mload(0x2760), f_q)) +mstore(0x2a80, mulmod(mload(0x2a60), mload(0x2a00), f_q)) +mstore(0x2aa0, addmod(mload(0x29c0), mload(0x2a80), f_q)) +mstore(0x2ac0, mulmod(mload(0xaa0), mload(0x2aa0), f_q)) +mstore(0x2ae0, mulmod(mload(0x10e0), mload(0x2700), f_q)) +mstore(0x2b00, mulmod(mload(0x2ae0), mload(0x2a00), f_q)) +mstore(0x2b20, addmod(mload(0x2ac0), mload(0x2b00), f_q)) +mstore(0x2b40, mulmod(mload(0xaa0), mload(0x2b20), f_q)) +mstore(0x2b60, addmod(mload(0x1160), sub(f_q, mload(0x1140)), f_q)) +mstore(0x2b80, mulmod(mload(0x1120), mload(0x1100), f_q)) +mstore(0x2ba0, addmod(1, sub(f_q, mload(0x2b80)), f_q)) +mstore(0x2bc0, mulmod(mload(0x2ba0), 4, f_q)) +mstore(0x2be0, mulmod(mload(0x2b80), 16, f_q)) +mstore(0x2c00, addmod(mload(0x2bc0), mload(0x2be0), f_q)) +mstore(0x2c20, addmod(mload(0x2b60), sub(f_q, mload(0x2c00)), f_q)) +mstore(0x2c40, mulmod(mload(0x2c20), mload(0x2760), f_q)) +mstore(0x2c60, mulmod(mload(0x2c40), mload(0x2a00), f_q)) +mstore(0x2c80, addmod(mload(0x2b40), mload(0x2c60), f_q)) +mstore(0x2ca0, mulmod(mload(0xaa0), mload(0x2c80), f_q)) +mstore(0x2cc0, mulmod(mload(0x10c0), mload(0x10a0), f_q)) +mstore(0x2ce0, mulmod(mload(0x2700), mload(0x2cc0), f_q)) +mstore(0x2d00, addmod(mload(0x1160), sub(f_q, mload(0x2c00)), f_q)) +mstore(0x2d20, mulmod(mload(0x2d00), mload(0x2ce0), f_q)) +mstore(0x2d40, mulmod(mload(0x2d20), mload(0x2a00), f_q)) +mstore(0x2d60, addmod(mload(0x2ca0), mload(0x2d40), f_q)) +mstore(0x2d80, mulmod(mload(0xaa0), mload(0x2d60), f_q)) +mstore(0x2da0, mulmod(mload(0x1180), mload(0x2760), f_q)) +mstore(0x2dc0, mulmod(mload(0x2da0), mload(0x2a00), f_q)) +mstore(0x2de0, addmod(mload(0x2d80), mload(0x2dc0), f_q)) +mstore(0x2e00, mulmod(mload(0xaa0), mload(0x2de0), f_q)) +mstore(0x2e20, addmod(mload(0x1180), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q)) +mstore(0x2e40, mulmod(mload(0x2e20), mload(0x2700), f_q)) +mstore(0x2e60, mulmod(mload(0x2e40), mload(0x2a00), f_q)) +mstore(0x2e80, addmod(mload(0x2e00), mload(0x2e60), f_q)) +mstore(0x2ea0, mulmod(mload(0xaa0), mload(0x2e80), f_q)) +mstore(0x2ec0, mulmod(mload(0x29e0), mload(0x1220), f_q)) +mstore(0x2ee0, addmod(mload(0xfc0), 21888242871839275222246405745257275088548364400416034343698204186575808495617, f_q)) +mstore(0x2f00, mulmod(mload(0x2ee0), mload(0x2ec0), f_q)) +mstore(0x2f20, addmod(mload(0x2ea0), mload(0x2f00), f_q)) +mstore(0x2f40, mulmod(mload(0xaa0), mload(0x2f20), f_q)) +mstore(0x2f60, mulmod(mload(0x2680), 4, f_q)) +mstore(0x2f80, addmod(1, sub(f_q, mload(0x2680)), f_q)) +mstore(0x2fa0, mulmod(mload(0x2f80), 16, f_q)) +mstore(0x2fc0, addmod(mload(0x2f60), mload(0x2fa0), f_q)) +mstore(0x2fe0, addmod(mload(0x1140), sub(f_q, mload(0x2fc0)), f_q)) +mstore(0x3000, mulmod(mload(0x2fe0), mload(0x2ec0), f_q)) +mstore(0x3020, addmod(mload(0x2f40), mload(0x3000), f_q)) +mstore(0x3040, mulmod(mload(0xaa0), mload(0x3020), f_q)) +mstore(0x3060, addmod(mload(0x11c0), 21888242871839275222246405745257275088548364400416034343698204186575808495609, f_q)) +mstore(0x3080, mulmod(mload(0x3060), mload(0x11e0), f_q)) +mstore(0x30a0, mulmod(mload(0x1040), mload(0x3060), f_q)) +mstore(0x30c0, addmod(1, sub(f_q, mload(0x30a0)), f_q)) +mstore(0x30e0, mulmod(mload(0x30c0), mload(0x3080), f_q)) +mstore(0x3100, addmod(mload(0x3040), mload(0x30e0), f_q)) +mstore(0x3120, mulmod(mload(0xaa0), mload(0x3100), f_q)) +mstore(0x3140, mulmod(mload(0x30c0), mload(0x11e0), f_q)) +mstore(0x3160, mulmod(mload(0x2680), mload(0x3140), f_q)) +mstore(0x3180, mulmod(mload(0x1100), mload(0x3160), f_q)) +mstore(0x31a0, addmod(mload(0x3120), mload(0x3180), f_q)) +mstore(0x31c0, mulmod(mload(0xaa0), mload(0x31a0), f_q)) +mstore(0x31e0, addmod(1, sub(f_q, mload(0x1360)), f_q)) +mstore(0x3200, mulmod(mload(0x31e0), mload(0x2160), f_q)) +mstore(0x3220, addmod(mload(0x31c0), mload(0x3200), f_q)) +mstore(0x3240, mulmod(mload(0xaa0), mload(0x3220), f_q)) +mstore(0x3260, mulmod(mload(0x1360), mload(0x1360), f_q)) +mstore(0x3280, addmod(mload(0x3260), sub(f_q, mload(0x1360)), f_q)) +mstore(0x32a0, mulmod(mload(0x3280), mload(0x2060), f_q)) +mstore(0x32c0, addmod(mload(0x3240), mload(0x32a0), f_q)) +mstore(0x32e0, mulmod(mload(0xaa0), mload(0x32c0), f_q)) +mstore(0x3300, addmod(1, sub(f_q, mload(0x2060)), f_q)) +mstore(0x3320, addmod(mload(0x2080), mload(0x20a0), f_q)) +mstore(0x3340, addmod(mload(0x3320), mload(0x20c0), f_q)) +mstore(0x3360, addmod(mload(0x3340), mload(0x20e0), f_q)) +mstore(0x3380, addmod(mload(0x3360), mload(0x2100), f_q)) +mstore(0x33a0, addmod(mload(0x3380), mload(0x2120), f_q)) +mstore(0x33c0, addmod(mload(0x33a0), mload(0x2140), f_q)) +mstore(0x33e0, addmod(mload(0x3300), sub(f_q, mload(0x33c0)), f_q)) +mstore(0x3400, mulmod(mload(0x12e0), mload(0x860), f_q)) +mstore(0x3420, addmod(mload(0xd40), mload(0x3400), f_q)) +mstore(0x3440, addmod(mload(0x3420), mload(0x8c0), f_q)) +mstore(0x3460, mulmod(mload(0x1300), mload(0x860), f_q)) +mstore(0x3480, addmod(mload(0xd60), mload(0x3460), f_q)) +mstore(0x34a0, addmod(mload(0x3480), mload(0x8c0), f_q)) +mstore(0x34c0, mulmod(mload(0x34a0), mload(0x3440), f_q)) +mstore(0x34e0, mulmod(mload(0x1320), mload(0x860), f_q)) +mstore(0x3500, addmod(mload(0xd80), mload(0x34e0), f_q)) +mstore(0x3520, addmod(mload(0x3500), mload(0x8c0), f_q)) +mstore(0x3540, mulmod(mload(0x3520), mload(0x34c0), f_q)) +mstore(0x3560, mulmod(mload(0x1340), mload(0x860), f_q)) +mstore(0x3580, addmod(mload(0x21a0), mload(0x3560), f_q)) +mstore(0x35a0, addmod(mload(0x3580), mload(0x8c0), f_q)) +mstore(0x35c0, mulmod(mload(0x35a0), mload(0x3540), f_q)) +mstore(0x35e0, mulmod(mload(0x35c0), mload(0x1380), f_q)) +mstore(0x3600, mulmod(1, mload(0x860), f_q)) +mstore(0x3620, mulmod(mload(0xd00), mload(0x3600), f_q)) +mstore(0x3640, addmod(mload(0xd40), mload(0x3620), f_q)) +mstore(0x3660, addmod(mload(0x3640), mload(0x8c0), f_q)) +mstore(0x3680, mulmod(4131629893567559867359510883348571134090853742863529169391034518566172092834, mload(0x860), f_q)) +mstore(0x36a0, mulmod(mload(0xd00), mload(0x3680), f_q)) +mstore(0x36c0, addmod(mload(0xd60), mload(0x36a0), f_q)) +mstore(0x36e0, addmod(mload(0x36c0), mload(0x8c0), f_q)) +mstore(0x3700, mulmod(mload(0x36e0), mload(0x3660), f_q)) +mstore(0x3720, mulmod(8910878055287538404433155982483128285667088683464058436815641868457422632747, mload(0x860), f_q)) +mstore(0x3740, mulmod(mload(0xd00), mload(0x3720), f_q)) +mstore(0x3760, addmod(mload(0xd80), mload(0x3740), f_q)) +mstore(0x3780, addmod(mload(0x3760), mload(0x8c0), f_q)) +mstore(0x37a0, mulmod(mload(0x3780), mload(0x3700), f_q)) +mstore(0x37c0, mulmod(11166246659983828508719468090013646171463329086121580628794302409516816350802, mload(0x860), f_q)) +mstore(0x37e0, mulmod(mload(0xd00), mload(0x37c0), f_q)) +mstore(0x3800, addmod(mload(0x21a0), mload(0x37e0), f_q)) +mstore(0x3820, addmod(mload(0x3800), mload(0x8c0), f_q)) +mstore(0x3840, mulmod(mload(0x3820), mload(0x37a0), f_q)) +mstore(0x3860, mulmod(mload(0x3840), mload(0x1360), f_q)) +mstore(0x3880, addmod(mload(0x35e0), sub(f_q, mload(0x3860)), f_q)) +mstore(0x38a0, mulmod(mload(0x3880), mload(0x33e0), f_q)) +mstore(0x38c0, addmod(mload(0x32e0), mload(0x38a0), f_q)) +mstore(0x38e0, mulmod(mload(0xaa0), mload(0x38c0), f_q)) +mstore(0x3900, addmod(1, sub(f_q, mload(0x13a0)), f_q)) +mstore(0x3920, mulmod(mload(0x3900), mload(0x2160), f_q)) +mstore(0x3940, addmod(mload(0x38e0), mload(0x3920), f_q)) +mstore(0x3960, mulmod(mload(0xaa0), mload(0x3940), f_q)) +mstore(0x3980, mulmod(mload(0x13a0), mload(0x13a0), f_q)) +mstore(0x39a0, addmod(mload(0x3980), sub(f_q, mload(0x13a0)), f_q)) +mstore(0x39c0, mulmod(mload(0x39a0), mload(0x2060), f_q)) +mstore(0x39e0, addmod(mload(0x3960), mload(0x39c0), f_q)) +mstore(0x3a00, mulmod(mload(0xaa0), mload(0x39e0), f_q)) +mstore(0x3a20, addmod(mload(0x13e0), mload(0x860), f_q)) +mstore(0x3a40, mulmod(mload(0x3a20), mload(0x13c0), f_q)) +mstore(0x3a60, addmod(mload(0x1420), mload(0x8c0), f_q)) +mstore(0x3a80, mulmod(mload(0x3a60), mload(0x3a40), f_q)) +mstore(0x3aa0, mulmod(mload(0xd80), mload(0x1240), f_q)) +mstore(0x3ac0, mulmod(mload(0x600), mload(0x3aa0), f_q)) +mstore(0x3ae0, mulmod(mload(0xde0), mload(0x1240), f_q)) +mstore(0x3b00, addmod(mload(0x3ac0), mload(0x3ae0), f_q)) +mstore(0x3b20, mulmod(mload(0x600), mload(0x3b00), f_q)) +mstore(0x3b40, mulmod(mload(0xe00), mload(0x1240), f_q)) +mstore(0x3b60, addmod(mload(0x3b20), mload(0x3b40), f_q)) +mstore(0x3b80, addmod(mload(0x3b60), mload(0x860), f_q)) +mstore(0x3ba0, mulmod(mload(0x3b80), mload(0x13a0), f_q)) +mstore(0x3bc0, mulmod(mload(0x600), mload(0xe20), f_q)) +mstore(0x3be0, addmod(mload(0x3bc0), mload(0xe40), f_q)) +mstore(0x3c00, mulmod(mload(0x600), mload(0x3be0), f_q)) +mstore(0x3c20, addmod(mload(0x3c00), mload(0xe60), f_q)) +mstore(0x3c40, addmod(mload(0x3c20), mload(0x8c0), f_q)) +mstore(0x3c60, mulmod(mload(0x3c40), mload(0x3ba0), f_q)) +mstore(0x3c80, addmod(mload(0x3a80), sub(f_q, mload(0x3c60)), f_q)) +mstore(0x3ca0, mulmod(mload(0x3c80), mload(0x33e0), f_q)) +mstore(0x3cc0, addmod(mload(0x3a00), mload(0x3ca0), f_q)) +mstore(0x3ce0, mulmod(mload(0xaa0), mload(0x3cc0), f_q)) +mstore(0x3d00, addmod(mload(0x13e0), sub(f_q, mload(0x1420)), f_q)) +mstore(0x3d20, mulmod(mload(0x3d00), mload(0x2160), f_q)) +mstore(0x3d40, addmod(mload(0x3ce0), mload(0x3d20), f_q)) +mstore(0x3d60, mulmod(mload(0xaa0), mload(0x3d40), f_q)) +mstore(0x3d80, mulmod(mload(0x3d00), mload(0x33e0), f_q)) +mstore(0x3da0, addmod(mload(0x13e0), sub(f_q, mload(0x1400)), f_q)) +mstore(0x3dc0, mulmod(mload(0x3da0), mload(0x3d80), f_q)) +mstore(0x3de0, addmod(mload(0x3d60), mload(0x3dc0), f_q)) +mstore(0x3e00, mulmod(mload(0xaa0), mload(0x3de0), f_q)) +mstore(0x3e20, addmod(1, sub(f_q, mload(0x1440)), f_q)) +mstore(0x3e40, mulmod(mload(0x3e20), mload(0x2160), f_q)) +mstore(0x3e60, addmod(mload(0x3e00), mload(0x3e40), f_q)) +mstore(0x3e80, mulmod(mload(0xaa0), mload(0x3e60), f_q)) +mstore(0x3ea0, mulmod(mload(0x1440), mload(0x1440), f_q)) +mstore(0x3ec0, addmod(mload(0x3ea0), sub(f_q, mload(0x1440)), f_q)) +mstore(0x3ee0, mulmod(mload(0x3ec0), mload(0x2060), f_q)) +mstore(0x3f00, addmod(mload(0x3e80), mload(0x3ee0), f_q)) +mstore(0x3f20, mulmod(mload(0xaa0), mload(0x3f00), f_q)) +mstore(0x3f40, addmod(mload(0x1480), mload(0x860), f_q)) +mstore(0x3f60, mulmod(mload(0x3f40), mload(0x1460), f_q)) +mstore(0x3f80, addmod(mload(0x14c0), mload(0x8c0), f_q)) +mstore(0x3fa0, mulmod(mload(0x3f80), mload(0x3f60), f_q)) +mstore(0x3fc0, mulmod(mload(0x600), mload(0x1240), f_q)) +mstore(0x3fe0, addmod(mload(0x3fc0), mload(0x3ae0), f_q)) +mstore(0x4000, mulmod(mload(0x600), mload(0x3fe0), f_q)) +mstore(0x4020, addmod(mload(0x4000), mload(0x3b40), f_q)) +mstore(0x4040, mulmod(mload(0x600), mload(0x4020), f_q)) +mstore(0x4060, mulmod(mload(0xe80), mload(0x1240), f_q)) +mstore(0x4080, addmod(mload(0x4040), mload(0x4060), f_q)) +mstore(0x40a0, mulmod(mload(0x600), mload(0x4080), f_q)) +mstore(0x40c0, mulmod(mload(0xea0), mload(0x1240), f_q)) +mstore(0x40e0, addmod(mload(0x40a0), mload(0x40c0), f_q)) +mstore(0x4100, addmod(mload(0x40e0), mload(0x860), f_q)) +mstore(0x4120, mulmod(mload(0x4100), mload(0x1440), f_q)) +mstore(0x4140, mulmod(mload(0x600), mload(0xec0), f_q)) +mstore(0x4160, addmod(mload(0x4140), mload(0xee0), f_q)) +mstore(0x4180, mulmod(mload(0x600), mload(0x4160), f_q)) +mstore(0x41a0, addmod(mload(0x4180), mload(0xf00), f_q)) +mstore(0x41c0, mulmod(mload(0x600), mload(0x41a0), f_q)) +mstore(0x41e0, addmod(mload(0x41c0), mload(0xf20), f_q)) +mstore(0x4200, mulmod(mload(0x600), mload(0x41e0), f_q)) +mstore(0x4220, addmod(mload(0x4200), mload(0xf40), f_q)) +mstore(0x4240, addmod(mload(0x4220), mload(0x8c0), f_q)) +mstore(0x4260, mulmod(mload(0x4240), mload(0x4120), f_q)) +mstore(0x4280, addmod(mload(0x3fa0), sub(f_q, mload(0x4260)), f_q)) +mstore(0x42a0, mulmod(mload(0x4280), mload(0x33e0), f_q)) +mstore(0x42c0, addmod(mload(0x3f20), mload(0x42a0), f_q)) +mstore(0x42e0, mulmod(mload(0xaa0), mload(0x42c0), f_q)) +mstore(0x4300, addmod(mload(0x1480), sub(f_q, mload(0x14c0)), f_q)) +mstore(0x4320, mulmod(mload(0x4300), mload(0x2160), f_q)) +mstore(0x4340, addmod(mload(0x42e0), mload(0x4320), f_q)) +mstore(0x4360, mulmod(mload(0xaa0), mload(0x4340), f_q)) +mstore(0x4380, mulmod(mload(0x4300), mload(0x33e0), f_q)) +mstore(0x43a0, addmod(mload(0x1480), sub(f_q, mload(0x14a0)), f_q)) +mstore(0x43c0, mulmod(mload(0x43a0), mload(0x4380), f_q)) +mstore(0x43e0, addmod(mload(0x4360), mload(0x43c0), f_q)) +mstore(0x4400, mulmod(mload(0xaa0), mload(0x43e0), f_q)) +mstore(0x4420, addmod(1, sub(f_q, mload(0x14e0)), f_q)) +mstore(0x4440, mulmod(mload(0x4420), mload(0x2160), f_q)) +mstore(0x4460, addmod(mload(0x4400), mload(0x4440), f_q)) +mstore(0x4480, mulmod(mload(0xaa0), mload(0x4460), f_q)) +mstore(0x44a0, mulmod(mload(0x14e0), mload(0x14e0), f_q)) +mstore(0x44c0, addmod(mload(0x44a0), sub(f_q, mload(0x14e0)), f_q)) +mstore(0x44e0, mulmod(mload(0x44c0), mload(0x2060), f_q)) +mstore(0x4500, addmod(mload(0x4480), mload(0x44e0), f_q)) +mstore(0x4520, mulmod(mload(0xaa0), mload(0x4500), f_q)) +mstore(0x4540, addmod(mload(0x1520), mload(0x860), f_q)) +mstore(0x4560, mulmod(mload(0x4540), mload(0x1500), f_q)) +mstore(0x4580, addmod(mload(0x1560), mload(0x8c0), f_q)) +mstore(0x45a0, mulmod(mload(0x4580), mload(0x4560), f_q)) +mstore(0x45c0, addmod(mload(0x2700), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q)) +mstore(0x45e0, mulmod(mload(0x2cc0), mload(0x45c0), f_q)) +mstore(0x4600, mulmod(mload(0x2740), mload(0x45e0), f_q)) +mstore(0x4620, addmod(mload(0x4600), mload(0x860), f_q)) +mstore(0x4640, mulmod(mload(0x4620), mload(0x14e0), f_q)) +mstore(0x4660, addmod(mload(0x11a0), mload(0x8c0), f_q)) +mstore(0x4680, mulmod(mload(0x4660), mload(0x4640), f_q)) +mstore(0x46a0, addmod(mload(0x45a0), sub(f_q, mload(0x4680)), f_q)) +mstore(0x46c0, mulmod(mload(0x46a0), mload(0x33e0), f_q)) +mstore(0x46e0, addmod(mload(0x4520), mload(0x46c0), f_q)) +mstore(0x4700, mulmod(mload(0xaa0), mload(0x46e0), f_q)) +mstore(0x4720, addmod(mload(0x1520), sub(f_q, mload(0x1560)), f_q)) +mstore(0x4740, mulmod(mload(0x4720), mload(0x2160), f_q)) +mstore(0x4760, addmod(mload(0x4700), mload(0x4740), f_q)) +mstore(0x4780, mulmod(mload(0xaa0), mload(0x4760), f_q)) +mstore(0x47a0, mulmod(mload(0x4720), mload(0x33e0), f_q)) +mstore(0x47c0, addmod(mload(0x1520), sub(f_q, mload(0x1540)), f_q)) +mstore(0x47e0, mulmod(mload(0x47c0), mload(0x47a0), f_q)) +mstore(0x4800, addmod(mload(0x4780), mload(0x47e0), f_q)) +mstore(0x4820, mulmod(mload(0xaa0), mload(0x4800), f_q)) +mstore(0x4840, addmod(1, sub(f_q, mload(0x1580)), f_q)) +mstore(0x4860, mulmod(mload(0x4840), mload(0x2160), f_q)) +mstore(0x4880, addmod(mload(0x4820), mload(0x4860), f_q)) +mstore(0x48a0, mulmod(mload(0xaa0), mload(0x4880), f_q)) +mstore(0x48c0, mulmod(mload(0x1580), mload(0x1580), f_q)) +mstore(0x48e0, addmod(mload(0x48c0), sub(f_q, mload(0x1580)), f_q)) +mstore(0x4900, mulmod(mload(0x48e0), mload(0x2060), f_q)) +mstore(0x4920, addmod(mload(0x48a0), mload(0x4900), f_q)) +mstore(0x4940, mulmod(mload(0xaa0), mload(0x4920), f_q)) +mstore(0x4960, addmod(mload(0x15c0), mload(0x860), f_q)) +mstore(0x4980, mulmod(mload(0x4960), mload(0x15a0), f_q)) +mstore(0x49a0, addmod(mload(0x1600), mload(0x8c0), f_q)) +mstore(0x49c0, mulmod(mload(0x49a0), mload(0x4980), f_q)) +mstore(0x49e0, mulmod(mload(0x2f80), mload(0x11e0), f_q)) +mstore(0x4a00, mulmod(mload(0x30c0), mload(0x49e0), f_q)) +mstore(0x4a20, mulmod(mload(0xf80), mload(0x4a00), f_q)) +mstore(0x4a40, mulmod(mload(0x600), mload(0x4a20), f_q)) +mstore(0x4a60, mulmod(1, mload(0x4a00), f_q)) +mstore(0x4a80, addmod(mload(0x4a40), mload(0x4a60), f_q)) +mstore(0x4aa0, mulmod(mload(0x600), mload(0x4a80), f_q)) +mstore(0x4ac0, mulmod(mload(0x1100), mload(0x4a00), f_q)) +mstore(0x4ae0, addmod(mload(0x4aa0), mload(0x4ac0), f_q)) +mstore(0x4b00, addmod(mload(0x4ae0), mload(0x860), f_q)) +mstore(0x4b20, mulmod(mload(0x4b00), mload(0x1580), f_q)) +mstore(0x4b40, mulmod(mload(0x600), mload(0xf80), f_q)) +mstore(0x4b60, addmod(mload(0x4b40), mload(0x1180), f_q)) +mstore(0x4b80, mulmod(mload(0x600), mload(0x4b60), f_q)) +mstore(0x4ba0, addmod(mload(0x4b80), mload(0x1140), f_q)) +mstore(0x4bc0, addmod(mload(0x4ba0), mload(0x8c0), f_q)) +mstore(0x4be0, mulmod(mload(0x4bc0), mload(0x4b20), f_q)) +mstore(0x4c00, addmod(mload(0x49c0), sub(f_q, mload(0x4be0)), f_q)) +mstore(0x4c20, mulmod(mload(0x4c00), mload(0x33e0), f_q)) +mstore(0x4c40, addmod(mload(0x4940), mload(0x4c20), f_q)) +mstore(0x4c60, mulmod(mload(0xaa0), mload(0x4c40), f_q)) +mstore(0x4c80, addmod(mload(0x15c0), sub(f_q, mload(0x1600)), f_q)) +mstore(0x4ca0, mulmod(mload(0x4c80), mload(0x2160), f_q)) +mstore(0x4cc0, addmod(mload(0x4c60), mload(0x4ca0), f_q)) +mstore(0x4ce0, mulmod(mload(0xaa0), mload(0x4cc0), f_q)) +mstore(0x4d00, mulmod(mload(0x4c80), mload(0x33e0), f_q)) +mstore(0x4d20, addmod(mload(0x15c0), sub(f_q, mload(0x15e0)), f_q)) +mstore(0x4d40, mulmod(mload(0x4d20), mload(0x4d00), f_q)) +mstore(0x4d60, addmod(mload(0x4ce0), mload(0x4d40), f_q)) +mstore(0x4d80, mulmod(mload(0x1b60), mload(0x1b60), f_q)) +mstore(0x4da0, mulmod(mload(0x4d80), mload(0x1b60), f_q)) +mstore(0x4dc0, mulmod(mload(0x4da0), mload(0x1b60), f_q)) +mstore(0x4de0, mulmod(mload(0x4dc0), mload(0x1b60), f_q)) +mstore(0x4e00, mulmod(mload(0x4de0), mload(0x1b60), f_q)) +mstore(0x4e20, mulmod(mload(0x4e00), mload(0x1b60), f_q)) +mstore(0x4e40, mulmod(mload(0x4e20), mload(0x1b60), f_q)) +mstore(0x4e60, mulmod(1, mload(0x1b60), f_q)) +mstore(0x4e80, mulmod(1, mload(0x4d80), f_q)) +mstore(0x4ea0, mulmod(1, mload(0x4da0), f_q)) +mstore(0x4ec0, mulmod(1, mload(0x4dc0), f_q)) +mstore(0x4ee0, mulmod(1, mload(0x4de0), f_q)) +mstore(0x4f00, mulmod(1, mload(0x4e00), f_q)) +mstore(0x4f20, mulmod(1, mload(0x4e20), f_q)) +mstore(0x4f40, mulmod(mload(0x4d60), mload(0x1b80), f_q)) +mstore(0x4f60, mulmod(mload(0x18e0), mload(0x18e0), f_q)) +mstore(0x4f80, mulmod(mload(0x4f60), mload(0x18e0), f_q)) +mstore(0x4fa0, mulmod(mload(0x4f80), mload(0x18e0), f_q)) +mstore(0x4fc0, mulmod(mload(0x4fa0), mload(0x18e0), f_q)) +mstore(0x4fe0, mulmod(mload(0x4fc0), mload(0x18e0), f_q)) +mstore(0x5000, mulmod(mload(0x4fe0), mload(0x18e0), f_q)) +mstore(0x5020, mulmod(mload(0x5000), mload(0x18e0), f_q)) +mstore(0x5040, mulmod(mload(0x5020), mload(0x18e0), f_q)) +mstore(0x5060, mulmod(mload(0x1640), mload(0x1640), f_q)) +mstore(0x5080, mulmod(mload(0x5060), mload(0x1640), f_q)) +mstore(0x50a0, mulmod(mload(0x5080), mload(0x1640), f_q)) +mstore(0x50c0, mulmod(mload(0x50a0), mload(0x1640), f_q)) +mstore(0x50e0, mulmod(mload(0x50c0), mload(0x1640), f_q)) +mstore(0x5100, mulmod(mload(0x50e0), mload(0x1640), f_q)) +mstore(0x5120, mulmod(mload(0x5100), mload(0x1640), f_q)) +mstore(0x5140, mulmod(mload(0x5120), mload(0x1640), f_q)) +mstore(0x5160, mulmod(mload(0x5140), mload(0x1640), f_q)) +mstore(0x5180, mulmod(mload(0x5160), mload(0x1640), f_q)) +mstore(0x51a0, mulmod(mload(0x5180), mload(0x1640), f_q)) +mstore(0x51c0, mulmod(mload(0x51a0), mload(0x1640), f_q)) +mstore(0x51e0, mulmod(mload(0x51c0), mload(0x1640), f_q)) +mstore(0x5200, mulmod(mload(0x51e0), mload(0x1640), f_q)) +mstore(0x5220, mulmod(mload(0x5200), mload(0x1640), f_q)) +mstore(0x5240, mulmod(mload(0x5220), mload(0x1640), f_q)) +mstore(0x5260, mulmod(mload(0x5240), mload(0x1640), f_q)) +mstore(0x5280, mulmod(mload(0x5260), mload(0x1640), f_q)) +mstore(0x52a0, mulmod(mload(0x5280), mload(0x1640), f_q)) +mstore(0x52c0, mulmod(mload(0x52a0), mload(0x1640), f_q)) +mstore(0x52e0, mulmod(mload(0x52c0), mload(0x1640), f_q)) +mstore(0x5300, mulmod(mload(0x52e0), mload(0x1640), f_q)) +mstore(0x5320, mulmod(mload(0x5300), mload(0x1640), f_q)) +mstore(0x5340, mulmod(mload(0x5320), mload(0x1640), f_q)) +mstore(0x5360, mulmod(mload(0x5340), mload(0x1640), f_q)) +mstore(0x5380, mulmod(mload(0x5360), mload(0x1640), f_q)) +mstore(0x53a0, mulmod(mload(0x5380), mload(0x1640), f_q)) +mstore(0x53c0, mulmod(mload(0x53a0), mload(0x1640), f_q)) +mstore(0x53e0, mulmod(mload(0x53c0), mload(0x1640), f_q)) +mstore(0x5400, mulmod(mload(0x53e0), mload(0x1640), f_q)) +mstore(0x5420, mulmod(mload(0x5400), mload(0x1640), f_q)) +mstore(0x5440, mulmod(mload(0x5420), mload(0x1640), f_q)) +mstore(0x5460, mulmod(mload(0x5440), mload(0x1640), f_q)) +mstore(0x5480, mulmod(mload(0x5460), mload(0x1640), f_q)) +mstore(0x54a0, mulmod(mload(0x5480), mload(0x1640), f_q)) +mstore(0x54c0, mulmod(mload(0x54a0), mload(0x1640), f_q)) +mstore(0x54e0, mulmod(mload(0x54c0), mload(0x1640), f_q)) +mstore(0x5500, mulmod(mload(0x54e0), mload(0x1640), f_q)) +mstore(0x5520, mulmod(mload(0x5500), mload(0x1640), f_q)) +mstore(0x5540, mulmod(mload(0x5520), mload(0x1640), f_q)) +mstore(0x5560, mulmod(mload(0x5540), mload(0x1640), f_q)) +mstore(0x5580, mulmod(mload(0x5560), mload(0x1640), f_q)) +mstore(0x55a0, mulmod(mload(0x5580), mload(0x1640), f_q)) +mstore(0x55c0, mulmod(mload(0x55a0), mload(0x1640), f_q)) +mstore(0x55e0, mulmod(mload(0x55c0), mload(0x1640), f_q)) +mstore(0x5600, mulmod(mload(0x55e0), mload(0x1640), f_q)) +mstore(0x5620, mulmod(mload(0x5600), mload(0x1640), f_q)) +mstore(0x5640, mulmod(sub(f_q, mload(0xd40)), 1, f_q)) +mstore(0x5660, mulmod(sub(f_q, mload(0xd60)), mload(0x1640), f_q)) +mstore(0x5680, mulmod(1, mload(0x1640), f_q)) +mstore(0x56a0, addmod(mload(0x5640), mload(0x5660), f_q)) +mstore(0x56c0, mulmod(sub(f_q, mload(0xd80)), mload(0x5060), f_q)) +mstore(0x56e0, mulmod(1, mload(0x5060), f_q)) +mstore(0x5700, addmod(mload(0x56a0), mload(0x56c0), f_q)) +mstore(0x5720, mulmod(sub(f_q, mload(0xe20)), mload(0x5080), f_q)) +mstore(0x5740, mulmod(1, mload(0x5080), f_q)) +mstore(0x5760, addmod(mload(0x5700), mload(0x5720), f_q)) +mstore(0x5780, mulmod(sub(f_q, mload(0xe40)), mload(0x50a0), f_q)) +mstore(0x57a0, mulmod(1, mload(0x50a0), f_q)) +mstore(0x57c0, addmod(mload(0x5760), mload(0x5780), f_q)) +mstore(0x57e0, mulmod(sub(f_q, mload(0xe60)), mload(0x50c0), f_q)) +mstore(0x5800, mulmod(1, mload(0x50c0), f_q)) +mstore(0x5820, addmod(mload(0x57c0), mload(0x57e0), f_q)) +mstore(0x5840, mulmod(sub(f_q, mload(0xec0)), mload(0x50e0), f_q)) +mstore(0x5860, mulmod(1, mload(0x50e0), f_q)) +mstore(0x5880, addmod(mload(0x5820), mload(0x5840), f_q)) +mstore(0x58a0, mulmod(sub(f_q, mload(0xee0)), mload(0x5100), f_q)) +mstore(0x58c0, mulmod(1, mload(0x5100), f_q)) +mstore(0x58e0, addmod(mload(0x5880), mload(0x58a0), f_q)) +mstore(0x5900, mulmod(sub(f_q, mload(0xf00)), mload(0x5120), f_q)) +mstore(0x5920, mulmod(1, mload(0x5120), f_q)) +mstore(0x5940, addmod(mload(0x58e0), mload(0x5900), f_q)) +mstore(0x5960, mulmod(sub(f_q, mload(0xf20)), mload(0x5140), f_q)) +mstore(0x5980, mulmod(1, mload(0x5140), f_q)) +mstore(0x59a0, addmod(mload(0x5940), mload(0x5960), f_q)) +mstore(0x59c0, mulmod(sub(f_q, mload(0xf40)), mload(0x5160), f_q)) +mstore(0x59e0, mulmod(1, mload(0x5160), f_q)) +mstore(0x5a00, addmod(mload(0x59a0), mload(0x59c0), f_q)) +mstore(0x5a20, mulmod(sub(f_q, mload(0xf60)), mload(0x5180), f_q)) +mstore(0x5a40, mulmod(1, mload(0x5180), f_q)) +mstore(0x5a60, addmod(mload(0x5a00), mload(0x5a20), f_q)) +mstore(0x5a80, mulmod(sub(f_q, mload(0xf80)), mload(0x51a0), f_q)) +mstore(0x5aa0, mulmod(1, mload(0x51a0), f_q)) +mstore(0x5ac0, addmod(mload(0x5a60), mload(0x5a80), f_q)) +mstore(0x5ae0, mulmod(sub(f_q, mload(0xfc0)), mload(0x51c0), f_q)) +mstore(0x5b00, mulmod(1, mload(0x51c0), f_q)) +mstore(0x5b20, addmod(mload(0x5ac0), mload(0x5ae0), f_q)) +mstore(0x5b40, mulmod(sub(f_q, mload(0x1000)), mload(0x51e0), f_q)) +mstore(0x5b60, mulmod(1, mload(0x51e0), f_q)) +mstore(0x5b80, addmod(mload(0x5b20), mload(0x5b40), f_q)) +mstore(0x5ba0, mulmod(sub(f_q, mload(0x1040)), mload(0x5200), f_q)) +mstore(0x5bc0, mulmod(1, mload(0x5200), f_q)) +mstore(0x5be0, addmod(mload(0x5b80), mload(0x5ba0), f_q)) +mstore(0x5c00, mulmod(sub(f_q, mload(0x1060)), mload(0x5220), f_q)) +mstore(0x5c20, mulmod(1, mload(0x5220), f_q)) +mstore(0x5c40, addmod(mload(0x5be0), mload(0x5c00), f_q)) +mstore(0x5c60, mulmod(sub(f_q, mload(0x1080)), mload(0x5240), f_q)) +mstore(0x5c80, mulmod(1, mload(0x5240), f_q)) +mstore(0x5ca0, addmod(mload(0x5c40), mload(0x5c60), f_q)) +mstore(0x5cc0, mulmod(sub(f_q, mload(0x1140)), mload(0x5260), f_q)) +mstore(0x5ce0, mulmod(1, mload(0x5260), f_q)) +mstore(0x5d00, addmod(mload(0x5ca0), mload(0x5cc0), f_q)) +mstore(0x5d20, mulmod(sub(f_q, mload(0x1180)), mload(0x5280), f_q)) +mstore(0x5d40, mulmod(1, mload(0x5280), f_q)) +mstore(0x5d60, addmod(mload(0x5d00), mload(0x5d20), f_q)) +mstore(0x5d80, mulmod(sub(f_q, mload(0x1360)), mload(0x52a0), f_q)) +mstore(0x5da0, mulmod(1, mload(0x52a0), f_q)) +mstore(0x5dc0, addmod(mload(0x5d60), mload(0x5d80), f_q)) +mstore(0x5de0, mulmod(sub(f_q, mload(0x13a0)), mload(0x52c0), f_q)) +mstore(0x5e00, mulmod(1, mload(0x52c0), f_q)) +mstore(0x5e20, addmod(mload(0x5dc0), mload(0x5de0), f_q)) +mstore(0x5e40, mulmod(sub(f_q, mload(0x13e0)), mload(0x52e0), f_q)) +mstore(0x5e60, mulmod(1, mload(0x52e0), f_q)) +mstore(0x5e80, addmod(mload(0x5e20), mload(0x5e40), f_q)) +mstore(0x5ea0, mulmod(sub(f_q, mload(0x1420)), mload(0x5300), f_q)) +mstore(0x5ec0, mulmod(1, mload(0x5300), f_q)) +mstore(0x5ee0, addmod(mload(0x5e80), mload(0x5ea0), f_q)) +mstore(0x5f00, mulmod(sub(f_q, mload(0x1440)), mload(0x5320), f_q)) +mstore(0x5f20, mulmod(1, mload(0x5320), f_q)) +mstore(0x5f40, addmod(mload(0x5ee0), mload(0x5f00), f_q)) +mstore(0x5f60, mulmod(sub(f_q, mload(0x1480)), mload(0x5340), f_q)) +mstore(0x5f80, mulmod(1, mload(0x5340), f_q)) +mstore(0x5fa0, addmod(mload(0x5f40), mload(0x5f60), f_q)) +mstore(0x5fc0, mulmod(sub(f_q, mload(0x14c0)), mload(0x5360), f_q)) +mstore(0x5fe0, mulmod(1, mload(0x5360), f_q)) +mstore(0x6000, addmod(mload(0x5fa0), mload(0x5fc0), f_q)) +mstore(0x6020, mulmod(sub(f_q, mload(0x14e0)), mload(0x5380), f_q)) +mstore(0x6040, mulmod(1, mload(0x5380), f_q)) +mstore(0x6060, addmod(mload(0x6000), mload(0x6020), f_q)) +mstore(0x6080, mulmod(sub(f_q, mload(0x1520)), mload(0x53a0), f_q)) +mstore(0x60a0, mulmod(1, mload(0x53a0), f_q)) +mstore(0x60c0, addmod(mload(0x6060), mload(0x6080), f_q)) +mstore(0x60e0, mulmod(sub(f_q, mload(0x1560)), mload(0x53c0), f_q)) +mstore(0x6100, mulmod(1, mload(0x53c0), f_q)) +mstore(0x6120, addmod(mload(0x60c0), mload(0x60e0), f_q)) +mstore(0x6140, mulmod(sub(f_q, mload(0x1580)), mload(0x53e0), f_q)) +mstore(0x6160, mulmod(1, mload(0x53e0), f_q)) +mstore(0x6180, addmod(mload(0x6120), mload(0x6140), f_q)) +mstore(0x61a0, mulmod(sub(f_q, mload(0x15c0)), mload(0x5400), f_q)) +mstore(0x61c0, mulmod(1, mload(0x5400), f_q)) +mstore(0x61e0, addmod(mload(0x6180), mload(0x61a0), f_q)) +mstore(0x6200, mulmod(sub(f_q, mload(0x1600)), mload(0x5420), f_q)) +mstore(0x6220, mulmod(1, mload(0x5420), f_q)) +mstore(0x6240, addmod(mload(0x61e0), mload(0x6200), f_q)) +mstore(0x6260, mulmod(sub(f_q, mload(0x11a0)), mload(0x5440), f_q)) +mstore(0x6280, mulmod(1, mload(0x5440), f_q)) +mstore(0x62a0, addmod(mload(0x6240), mload(0x6260), f_q)) +mstore(0x62c0, mulmod(sub(f_q, mload(0x11c0)), mload(0x5460), f_q)) +mstore(0x62e0, mulmod(1, mload(0x5460), f_q)) +mstore(0x6300, addmod(mload(0x62a0), mload(0x62c0), f_q)) +mstore(0x6320, mulmod(sub(f_q, mload(0x11e0)), mload(0x5480), f_q)) +mstore(0x6340, mulmod(1, mload(0x5480), f_q)) +mstore(0x6360, addmod(mload(0x6300), mload(0x6320), f_q)) +mstore(0x6380, mulmod(sub(f_q, mload(0x1200)), mload(0x54a0), f_q)) +mstore(0x63a0, mulmod(1, mload(0x54a0), f_q)) +mstore(0x63c0, addmod(mload(0x6360), mload(0x6380), f_q)) +mstore(0x63e0, mulmod(sub(f_q, mload(0x1220)), mload(0x54c0), f_q)) +mstore(0x6400, mulmod(1, mload(0x54c0), f_q)) +mstore(0x6420, addmod(mload(0x63c0), mload(0x63e0), f_q)) +mstore(0x6440, mulmod(sub(f_q, mload(0x1240)), mload(0x54e0), f_q)) +mstore(0x6460, mulmod(1, mload(0x54e0), f_q)) +mstore(0x6480, addmod(mload(0x6420), mload(0x6440), f_q)) +mstore(0x64a0, mulmod(sub(f_q, mload(0x1260)), mload(0x5500), f_q)) +mstore(0x64c0, mulmod(1, mload(0x5500), f_q)) +mstore(0x64e0, addmod(mload(0x6480), mload(0x64a0), f_q)) +mstore(0x6500, mulmod(sub(f_q, mload(0x1280)), mload(0x5520), f_q)) +mstore(0x6520, mulmod(1, mload(0x5520), f_q)) +mstore(0x6540, addmod(mload(0x64e0), mload(0x6500), f_q)) +mstore(0x6560, mulmod(sub(f_q, mload(0x12a0)), mload(0x5540), f_q)) +mstore(0x6580, mulmod(1, mload(0x5540), f_q)) +mstore(0x65a0, addmod(mload(0x6540), mload(0x6560), f_q)) +mstore(0x65c0, mulmod(sub(f_q, mload(0x12e0)), mload(0x5560), f_q)) +mstore(0x65e0, mulmod(1, mload(0x5560), f_q)) +mstore(0x6600, addmod(mload(0x65a0), mload(0x65c0), f_q)) +mstore(0x6620, mulmod(sub(f_q, mload(0x1300)), mload(0x5580), f_q)) +mstore(0x6640, mulmod(1, mload(0x5580), f_q)) +mstore(0x6660, addmod(mload(0x6600), mload(0x6620), f_q)) +mstore(0x6680, mulmod(sub(f_q, mload(0x1320)), mload(0x55a0), f_q)) +mstore(0x66a0, mulmod(1, mload(0x55a0), f_q)) +mstore(0x66c0, addmod(mload(0x6660), mload(0x6680), f_q)) +mstore(0x66e0, mulmod(sub(f_q, mload(0x1340)), mload(0x55c0), f_q)) +mstore(0x6700, mulmod(1, mload(0x55c0), f_q)) +mstore(0x6720, addmod(mload(0x66c0), mload(0x66e0), f_q)) +mstore(0x6740, mulmod(sub(f_q, mload(0x4f40)), mload(0x55e0), f_q)) +mstore(0x6760, mulmod(1, mload(0x55e0), f_q)) +mstore(0x6780, mulmod(mload(0x4e60), mload(0x55e0), f_q)) +mstore(0x67a0, mulmod(mload(0x4e80), mload(0x55e0), f_q)) +mstore(0x67c0, mulmod(mload(0x4ea0), mload(0x55e0), f_q)) +mstore(0x67e0, mulmod(mload(0x4ec0), mload(0x55e0), f_q)) +mstore(0x6800, mulmod(mload(0x4ee0), mload(0x55e0), f_q)) +mstore(0x6820, mulmod(mload(0x4f00), mload(0x55e0), f_q)) +mstore(0x6840, mulmod(mload(0x4f20), mload(0x55e0), f_q)) +mstore(0x6860, addmod(mload(0x6720), mload(0x6740), f_q)) +mstore(0x6880, mulmod(sub(f_q, mload(0x12c0)), mload(0x5600), f_q)) +mstore(0x68a0, mulmod(1, mload(0x5600), f_q)) +mstore(0x68c0, addmod(mload(0x6860), mload(0x6880), f_q)) +mstore(0x68e0, mulmod(mload(0x68c0), 1, f_q)) +mstore(0x6900, mulmod(mload(0x5680), 1, f_q)) +mstore(0x6920, mulmod(mload(0x56e0), 1, f_q)) +mstore(0x6940, mulmod(mload(0x5740), 1, f_q)) +mstore(0x6960, mulmod(mload(0x57a0), 1, f_q)) +mstore(0x6980, mulmod(mload(0x5800), 1, f_q)) +mstore(0x69a0, mulmod(mload(0x5860), 1, f_q)) +mstore(0x69c0, mulmod(mload(0x58c0), 1, f_q)) +mstore(0x69e0, mulmod(mload(0x5920), 1, f_q)) +mstore(0x6a00, mulmod(mload(0x5980), 1, f_q)) +mstore(0x6a20, mulmod(mload(0x59e0), 1, f_q)) +mstore(0x6a40, mulmod(mload(0x5a40), 1, f_q)) +mstore(0x6a60, mulmod(mload(0x5aa0), 1, f_q)) +mstore(0x6a80, mulmod(mload(0x5b00), 1, f_q)) +mstore(0x6aa0, mulmod(mload(0x5b60), 1, f_q)) +mstore(0x6ac0, mulmod(mload(0x5bc0), 1, f_q)) +mstore(0x6ae0, mulmod(mload(0x5c20), 1, f_q)) +mstore(0x6b00, mulmod(mload(0x5c80), 1, f_q)) +mstore(0x6b20, mulmod(mload(0x5ce0), 1, f_q)) +mstore(0x6b40, mulmod(mload(0x5d40), 1, f_q)) +mstore(0x6b60, mulmod(mload(0x5da0), 1, f_q)) +mstore(0x6b80, mulmod(mload(0x5e00), 1, f_q)) +mstore(0x6ba0, mulmod(mload(0x5e60), 1, f_q)) +mstore(0x6bc0, mulmod(mload(0x5ec0), 1, f_q)) +mstore(0x6be0, mulmod(mload(0x5f20), 1, f_q)) +mstore(0x6c00, mulmod(mload(0x5f80), 1, f_q)) +mstore(0x6c20, mulmod(mload(0x5fe0), 1, f_q)) +mstore(0x6c40, mulmod(mload(0x6040), 1, f_q)) +mstore(0x6c60, mulmod(mload(0x60a0), 1, f_q)) +mstore(0x6c80, mulmod(mload(0x6100), 1, f_q)) +mstore(0x6ca0, mulmod(mload(0x6160), 1, f_q)) +mstore(0x6cc0, mulmod(mload(0x61c0), 1, f_q)) +mstore(0x6ce0, mulmod(mload(0x6220), 1, f_q)) +mstore(0x6d00, mulmod(mload(0x6280), 1, f_q)) +mstore(0x6d20, mulmod(mload(0x62e0), 1, f_q)) +mstore(0x6d40, mulmod(mload(0x6340), 1, f_q)) +mstore(0x6d60, mulmod(mload(0x63a0), 1, f_q)) +mstore(0x6d80, mulmod(mload(0x6400), 1, f_q)) +mstore(0x6da0, mulmod(mload(0x6460), 1, f_q)) +mstore(0x6dc0, mulmod(mload(0x64c0), 1, f_q)) +mstore(0x6de0, mulmod(mload(0x6520), 1, f_q)) +mstore(0x6e00, mulmod(mload(0x6580), 1, f_q)) +mstore(0x6e20, mulmod(mload(0x65e0), 1, f_q)) +mstore(0x6e40, mulmod(mload(0x6640), 1, f_q)) +mstore(0x6e60, mulmod(mload(0x66a0), 1, f_q)) +mstore(0x6e80, mulmod(mload(0x6700), 1, f_q)) +mstore(0x6ea0, mulmod(mload(0x6760), 1, f_q)) +mstore(0x6ec0, mulmod(mload(0x6780), 1, f_q)) +mstore(0x6ee0, mulmod(mload(0x67a0), 1, f_q)) +mstore(0x6f00, mulmod(mload(0x67c0), 1, f_q)) +mstore(0x6f20, mulmod(mload(0x67e0), 1, f_q)) +mstore(0x6f40, mulmod(mload(0x6800), 1, f_q)) +mstore(0x6f60, mulmod(mload(0x6820), 1, f_q)) +mstore(0x6f80, mulmod(mload(0x6840), 1, f_q)) +mstore(0x6fa0, mulmod(mload(0x68a0), 1, f_q)) +mstore(0x6fc0, mulmod(sub(f_q, mload(0xda0)), 1, f_q)) +mstore(0x6fe0, mulmod(sub(f_q, mload(0xdc0)), mload(0x1640), f_q)) +mstore(0x7000, addmod(mload(0x6fc0), mload(0x6fe0), f_q)) +mstore(0x7020, mulmod(sub(f_q, mload(0xde0)), mload(0x5060), f_q)) +mstore(0x7040, addmod(mload(0x7000), mload(0x7020), f_q)) +mstore(0x7060, mulmod(sub(f_q, mload(0x10a0)), mload(0x5080), f_q)) +mstore(0x7080, addmod(mload(0x7040), mload(0x7060), f_q)) +mstore(0x70a0, mulmod(sub(f_q, mload(0x10c0)), mload(0x50a0), f_q)) +mstore(0x70c0, addmod(mload(0x7080), mload(0x70a0), f_q)) +mstore(0x70e0, mulmod(sub(f_q, mload(0x10e0)), mload(0x50c0), f_q)) +mstore(0x7100, addmod(mload(0x70c0), mload(0x70e0), f_q)) +mstore(0x7120, mulmod(sub(f_q, mload(0x1100)), mload(0x50e0), f_q)) +mstore(0x7140, addmod(mload(0x7100), mload(0x7120), f_q)) +mstore(0x7160, mulmod(sub(f_q, mload(0x1120)), mload(0x5100), f_q)) +mstore(0x7180, addmod(mload(0x7140), mload(0x7160), f_q)) +mstore(0x71a0, mulmod(sub(f_q, mload(0x1160)), mload(0x5120), f_q)) +mstore(0x71c0, addmod(mload(0x7180), mload(0x71a0), f_q)) +mstore(0x71e0, mulmod(sub(f_q, mload(0x1380)), mload(0x5140), f_q)) +mstore(0x7200, addmod(mload(0x71c0), mload(0x71e0), f_q)) +mstore(0x7220, mulmod(sub(f_q, mload(0x13c0)), mload(0x5160), f_q)) +mstore(0x7240, addmod(mload(0x7200), mload(0x7220), f_q)) +mstore(0x7260, mulmod(sub(f_q, mload(0x1460)), mload(0x5180), f_q)) +mstore(0x7280, addmod(mload(0x7240), mload(0x7260), f_q)) +mstore(0x72a0, mulmod(sub(f_q, mload(0x1500)), mload(0x51a0), f_q)) +mstore(0x72c0, addmod(mload(0x7280), mload(0x72a0), f_q)) +mstore(0x72e0, mulmod(sub(f_q, mload(0x15a0)), mload(0x51c0), f_q)) +mstore(0x7300, addmod(mload(0x72c0), mload(0x72e0), f_q)) +mstore(0x7320, mulmod(mload(0x7300), mload(0x18e0), f_q)) +mstore(0x7340, mulmod(1, mload(0x18e0), f_q)) +mstore(0x7360, mulmod(mload(0x5680), mload(0x18e0), f_q)) +mstore(0x7380, mulmod(mload(0x56e0), mload(0x18e0), f_q)) +mstore(0x73a0, mulmod(mload(0x5740), mload(0x18e0), f_q)) +mstore(0x73c0, mulmod(mload(0x57a0), mload(0x18e0), f_q)) +mstore(0x73e0, mulmod(mload(0x5800), mload(0x18e0), f_q)) +mstore(0x7400, mulmod(mload(0x5860), mload(0x18e0), f_q)) +mstore(0x7420, mulmod(mload(0x58c0), mload(0x18e0), f_q)) +mstore(0x7440, mulmod(mload(0x5920), mload(0x18e0), f_q)) +mstore(0x7460, mulmod(mload(0x5980), mload(0x18e0), f_q)) +mstore(0x7480, mulmod(mload(0x59e0), mload(0x18e0), f_q)) +mstore(0x74a0, mulmod(mload(0x5a40), mload(0x18e0), f_q)) +mstore(0x74c0, mulmod(mload(0x5aa0), mload(0x18e0), f_q)) +mstore(0x74e0, mulmod(mload(0x5b00), mload(0x18e0), f_q)) +mstore(0x7500, addmod(mload(0x68e0), mload(0x7320), f_q)) +mstore(0x7520, addmod(mload(0x6900), mload(0x7340), f_q)) +mstore(0x7540, addmod(1, mload(0x7360), f_q)) +mstore(0x7560, addmod(mload(0x6920), mload(0x7380), f_q)) +mstore(0x7580, addmod(mload(0x6a60), mload(0x73a0), f_q)) +mstore(0x75a0, addmod(mload(0x6ac0), mload(0x73c0), f_q)) +mstore(0x75c0, addmod(mload(0x6a80), mload(0x73e0), f_q)) +mstore(0x75e0, addmod(mload(0x6aa0), mload(0x7400), f_q)) +mstore(0x7600, addmod(mload(0x6ae0), mload(0x7420), f_q)) +mstore(0x7620, addmod(mload(0x6b20), mload(0x7440), f_q)) +mstore(0x7640, addmod(mload(0x6b60), mload(0x7460), f_q)) +mstore(0x7660, addmod(mload(0x6b80), mload(0x7480), f_q)) +mstore(0x7680, addmod(mload(0x6be0), mload(0x74a0), f_q)) +mstore(0x76a0, addmod(mload(0x6c40), mload(0x74c0), f_q)) +mstore(0x76c0, addmod(mload(0x6ca0), mload(0x74e0), f_q)) +mstore(0x76e0, mulmod(sub(f_q, mload(0xe00)), 1, f_q)) +mstore(0x7700, mulmod(mload(0x76e0), mload(0x4f60), f_q)) +mstore(0x7720, mulmod(1, mload(0x4f60), f_q)) +mstore(0x7740, addmod(mload(0x7500), mload(0x7700), f_q)) +mstore(0x7760, addmod(mload(0x7560), mload(0x7720), f_q)) +mstore(0x7780, mulmod(sub(f_q, mload(0xe80)), 1, f_q)) +mstore(0x77a0, mulmod(mload(0x7780), mload(0x4f80), f_q)) +mstore(0x77c0, mulmod(1, mload(0x4f80), f_q)) +mstore(0x77e0, addmod(mload(0x7740), mload(0x77a0), f_q)) +mstore(0x7800, addmod(mload(0x7760), mload(0x77c0), f_q)) +mstore(0x7820, mulmod(sub(f_q, mload(0xea0)), 1, f_q)) +mstore(0x7840, mulmod(mload(0x7820), mload(0x4fa0), f_q)) +mstore(0x7860, mulmod(1, mload(0x4fa0), f_q)) +mstore(0x7880, addmod(mload(0x77e0), mload(0x7840), f_q)) +mstore(0x78a0, addmod(mload(0x7800), mload(0x7860), f_q)) +mstore(0x78c0, mulmod(sub(f_q, mload(0xfa0)), 1, f_q)) +mstore(0x78e0, mulmod(mload(0x78c0), mload(0x4fc0), f_q)) +mstore(0x7900, mulmod(1, mload(0x4fc0), f_q)) +mstore(0x7920, addmod(mload(0x7880), mload(0x78e0), f_q)) +mstore(0x7940, addmod(mload(0x7540), mload(0x7900), f_q)) +mstore(0x7960, mulmod(sub(f_q, mload(0xfe0)), 1, f_q)) +mstore(0x7980, mulmod(mload(0x7960), mload(0x4fe0), f_q)) +mstore(0x79a0, mulmod(1, mload(0x4fe0), f_q)) +mstore(0x79c0, addmod(mload(0x7920), mload(0x7980), f_q)) +mstore(0x79e0, addmod(mload(0x7940), mload(0x79a0), f_q)) +mstore(0x7a00, mulmod(sub(f_q, mload(0x1020)), 1, f_q)) +mstore(0x7a20, mulmod(mload(0x7a00), mload(0x5000), f_q)) +mstore(0x7a40, mulmod(1, mload(0x5000), f_q)) +mstore(0x7a60, addmod(mload(0x79c0), mload(0x7a20), f_q)) +mstore(0x7a80, addmod(mload(0x79e0), mload(0x7a40), f_q)) +mstore(0x7aa0, mulmod(sub(f_q, mload(0x1400)), 1, f_q)) +mstore(0x7ac0, mulmod(sub(f_q, mload(0x14a0)), mload(0x1640), f_q)) +mstore(0x7ae0, addmod(mload(0x7aa0), mload(0x7ac0), f_q)) +mstore(0x7b00, mulmod(sub(f_q, mload(0x1540)), mload(0x5060), f_q)) +mstore(0x7b20, addmod(mload(0x7ae0), mload(0x7b00), f_q)) +mstore(0x7b40, mulmod(sub(f_q, mload(0x15e0)), mload(0x5080), f_q)) +mstore(0x7b60, addmod(mload(0x7b20), mload(0x7b40), f_q)) +mstore(0x7b80, mulmod(mload(0x7b60), mload(0x5020), f_q)) +mstore(0x7ba0, mulmod(1, mload(0x5020), f_q)) +mstore(0x7bc0, mulmod(mload(0x5680), mload(0x5020), f_q)) +mstore(0x7be0, mulmod(mload(0x56e0), mload(0x5020), f_q)) +mstore(0x7c00, mulmod(mload(0x5740), mload(0x5020), f_q)) +mstore(0x7c20, addmod(mload(0x7a60), mload(0x7b80), f_q)) +mstore(0x7c40, addmod(mload(0x6ba0), mload(0x7ba0), f_q)) +mstore(0x7c60, addmod(mload(0x6c00), mload(0x7bc0), f_q)) +mstore(0x7c80, addmod(mload(0x6c60), mload(0x7be0), f_q)) +mstore(0x7ca0, addmod(mload(0x6cc0), mload(0x7c00), f_q)) +mstore(0x7cc0, mulmod(1, mload(0xd00), f_q)) +mstore(0x7ce0, mulmod(1, mload(0x7cc0), f_q)) +mstore(0x7d00, mulmod(5854133144571823792863860130267644613802765696134002830362054821530146160770, mload(0xd00), f_q)) +mstore(0x7d20, mulmod(mload(0x7340), mload(0x7d00), f_q)) +mstore(0x7d40, mulmod(6955697244493336113861667751840378876927906302623587437721024018233754910398, mload(0xd00), f_q)) +mstore(0x7d60, mulmod(mload(0x7720), mload(0x7d40), f_q)) +mstore(0x7d80, mulmod(4509404676247677387317362072810231899718070082381452255950861037254608304934, mload(0xd00), f_q)) +mstore(0x7da0, mulmod(mload(0x77c0), mload(0x7d80), f_q)) +mstore(0x7dc0, mulmod(21846745818185811051373434299876022191132089169516983080959277716660228899818, mload(0xd00), f_q)) +mstore(0x7de0, mulmod(mload(0x7860), mload(0x7dc0), f_q)) +mstore(0x7e00, mulmod(8877266404940214415654576321892803630461347951291096939968465064977275431263, mload(0xd00), f_q)) +mstore(0x7e20, mulmod(mload(0x7900), mload(0x7e00), f_q)) +mstore(0x7e40, mulmod(8765642468355445424523558798083949802380067705644394949994811932677694839789, mload(0xd00), f_q)) +mstore(0x7e60, mulmod(mload(0x79a0), mload(0x7e40), f_q)) +mstore(0x7e80, mulmod(14070214124243589832357188763702158600178457751487525150667331468210176066934, mload(0xd00), f_q)) +mstore(0x7ea0, mulmod(mload(0x7a40), mload(0x7e80), f_q)) +mstore(0x7ec0, mulmod(14686510910986211321976396297238126901237973400949744736326777596334651355305, mload(0xd00), f_q)) +mstore(0x7ee0, mulmod(mload(0x7ba0), mload(0x7ec0), f_q)) +mstore(0x7f00, 0x0000000000000000000000000000000000000000000000000000000000000001) + mstore(0x7f20, 0x0000000000000000000000000000000000000000000000000000000000000002) +mstore(0x7f40, mload(0x7c20)) +success := and(eq(staticcall(gas(), 0x7, 0x7f00, 0x60, 0x7f00, 0x40), 1), success) +mstore(0x7f60, mload(0x360)) + mstore(0x7f80, mload(0x380)) +mstore(0x7fa0, mload(0x7a80)) +success := and(eq(staticcall(gas(), 0x7, 0x7f60, 0x60, 0x7f60, 0x40), 1), success) +mstore(0x7fc0, mload(0x7f00)) + mstore(0x7fe0, mload(0x7f20)) +mstore(0x8000, mload(0x7f60)) + mstore(0x8020, mload(0x7f80)) +success := and(eq(staticcall(gas(), 0x6, 0x7fc0, 0x80, 0x7fc0, 0x40), 1), success) +mstore(0x8040, mload(0x3a0)) + mstore(0x8060, mload(0x3c0)) +mstore(0x8080, mload(0x7520)) +success := and(eq(staticcall(gas(), 0x7, 0x8040, 0x60, 0x8040, 0x40), 1), success) +mstore(0x80a0, mload(0x7fc0)) + mstore(0x80c0, mload(0x7fe0)) +mstore(0x80e0, mload(0x8040)) + mstore(0x8100, mload(0x8060)) +success := and(eq(staticcall(gas(), 0x6, 0x80a0, 0x80, 0x80a0, 0x40), 1), success) +mstore(0x8120, mload(0x3e0)) + mstore(0x8140, mload(0x400)) +mstore(0x8160, mload(0x78a0)) +success := and(eq(staticcall(gas(), 0x7, 0x8120, 0x60, 0x8120, 0x40), 1), success) +mstore(0x8180, mload(0x80a0)) + mstore(0x81a0, mload(0x80c0)) +mstore(0x81c0, mload(0x8120)) + mstore(0x81e0, mload(0x8140)) +success := and(eq(staticcall(gas(), 0x6, 0x8180, 0x80, 0x8180, 0x40), 1), success) +mstore(0x8200, mload(0x1a0)) + mstore(0x8220, mload(0x1c0)) +mstore(0x8240, mload(0x6940)) +success := and(eq(staticcall(gas(), 0x7, 0x8200, 0x60, 0x8200, 0x40), 1), success) +mstore(0x8260, mload(0x8180)) + mstore(0x8280, mload(0x81a0)) +mstore(0x82a0, mload(0x8200)) + mstore(0x82c0, mload(0x8220)) +success := and(eq(staticcall(gas(), 0x6, 0x8260, 0x80, 0x8260, 0x40), 1), success) +mstore(0x82e0, mload(0x1e0)) + mstore(0x8300, mload(0x200)) +mstore(0x8320, mload(0x6960)) +success := and(eq(staticcall(gas(), 0x7, 0x82e0, 0x60, 0x82e0, 0x40), 1), success) +mstore(0x8340, mload(0x8260)) + mstore(0x8360, mload(0x8280)) +mstore(0x8380, mload(0x82e0)) + mstore(0x83a0, mload(0x8300)) +success := and(eq(staticcall(gas(), 0x6, 0x8340, 0x80, 0x8340, 0x40), 1), success) +mstore(0x83c0, mload(0x220)) + mstore(0x83e0, mload(0x240)) +mstore(0x8400, mload(0x6980)) +success := and(eq(staticcall(gas(), 0x7, 0x83c0, 0x60, 0x83c0, 0x40), 1), success) +mstore(0x8420, mload(0x8340)) + mstore(0x8440, mload(0x8360)) +mstore(0x8460, mload(0x83c0)) + mstore(0x8480, mload(0x83e0)) +success := and(eq(staticcall(gas(), 0x6, 0x8420, 0x80, 0x8420, 0x40), 1), success) +mstore(0x84a0, mload(0x260)) + mstore(0x84c0, mload(0x280)) +mstore(0x84e0, mload(0x69a0)) +success := and(eq(staticcall(gas(), 0x7, 0x84a0, 0x60, 0x84a0, 0x40), 1), success) +mstore(0x8500, mload(0x8420)) + mstore(0x8520, mload(0x8440)) +mstore(0x8540, mload(0x84a0)) + mstore(0x8560, mload(0x84c0)) +success := and(eq(staticcall(gas(), 0x6, 0x8500, 0x80, 0x8500, 0x40), 1), success) +mstore(0x8580, mload(0x5a0)) + mstore(0x85a0, mload(0x5c0)) +mstore(0x85c0, mload(0x69c0)) +success := and(eq(staticcall(gas(), 0x7, 0x8580, 0x60, 0x8580, 0x40), 1), success) +mstore(0x85e0, mload(0x8500)) + mstore(0x8600, mload(0x8520)) +mstore(0x8620, mload(0x8580)) + mstore(0x8640, mload(0x85a0)) +success := and(eq(staticcall(gas(), 0x6, 0x85e0, 0x80, 0x85e0, 0x40), 1), success) +mstore(0x8660, mload(0x2a0)) + mstore(0x8680, mload(0x2c0)) +mstore(0x86a0, mload(0x69e0)) +success := and(eq(staticcall(gas(), 0x7, 0x8660, 0x60, 0x8660, 0x40), 1), success) +mstore(0x86c0, mload(0x85e0)) + mstore(0x86e0, mload(0x8600)) +mstore(0x8700, mload(0x8660)) + mstore(0x8720, mload(0x8680)) +success := and(eq(staticcall(gas(), 0x6, 0x86c0, 0x80, 0x86c0, 0x40), 1), success) +mstore(0x8740, mload(0x2e0)) + mstore(0x8760, mload(0x300)) +mstore(0x8780, mload(0x6a00)) +success := and(eq(staticcall(gas(), 0x7, 0x8740, 0x60, 0x8740, 0x40), 1), success) +mstore(0x87a0, mload(0x86c0)) + mstore(0x87c0, mload(0x86e0)) +mstore(0x87e0, mload(0x8740)) + mstore(0x8800, mload(0x8760)) +success := and(eq(staticcall(gas(), 0x6, 0x87a0, 0x80, 0x87a0, 0x40), 1), success) +mstore(0x8820, mload(0x320)) + mstore(0x8840, mload(0x340)) +mstore(0x8860, mload(0x6a20)) +success := and(eq(staticcall(gas(), 0x7, 0x8820, 0x60, 0x8820, 0x40), 1), success) +mstore(0x8880, mload(0x87a0)) + mstore(0x88a0, mload(0x87c0)) +mstore(0x88c0, mload(0x8820)) + mstore(0x88e0, mload(0x8840)) +success := and(eq(staticcall(gas(), 0x6, 0x8880, 0x80, 0x8880, 0x40), 1), success) +mstore(0x8900, mload(0xe0)) + mstore(0x8920, mload(0x100)) +mstore(0x8940, mload(0x6a40)) +success := and(eq(staticcall(gas(), 0x7, 0x8900, 0x60, 0x8900, 0x40), 1), success) +mstore(0x8960, mload(0x8880)) + mstore(0x8980, mload(0x88a0)) +mstore(0x89a0, mload(0x8900)) + mstore(0x89c0, mload(0x8920)) +success := and(eq(staticcall(gas(), 0x6, 0x8960, 0x80, 0x8960, 0x40), 1), success) +mstore(0x89e0, mload(0x120)) + mstore(0x8a00, mload(0x140)) +mstore(0x8a20, mload(0x7580)) +success := and(eq(staticcall(gas(), 0x7, 0x89e0, 0x60, 0x89e0, 0x40), 1), success) +mstore(0x8a40, mload(0x8960)) + mstore(0x8a60, mload(0x8980)) +mstore(0x8a80, mload(0x89e0)) + mstore(0x8aa0, mload(0x8a00)) +success := and(eq(staticcall(gas(), 0x6, 0x8a40, 0x80, 0x8a40, 0x40), 1), success) +mstore(0x8ac0, mload(0x160)) + mstore(0x8ae0, mload(0x180)) +mstore(0x8b00, mload(0x75c0)) +success := and(eq(staticcall(gas(), 0x7, 0x8ac0, 0x60, 0x8ac0, 0x40), 1), success) +mstore(0x8b20, mload(0x8a40)) + mstore(0x8b40, mload(0x8a60)) +mstore(0x8b60, mload(0x8ac0)) + mstore(0x8b80, mload(0x8ae0)) +success := and(eq(staticcall(gas(), 0x6, 0x8b20, 0x80, 0x8b20, 0x40), 1), success) +mstore(0x8ba0, mload(0x560)) + mstore(0x8bc0, mload(0x580)) +mstore(0x8be0, mload(0x75e0)) +success := and(eq(staticcall(gas(), 0x7, 0x8ba0, 0x60, 0x8ba0, 0x40), 1), success) +mstore(0x8c00, mload(0x8b20)) + mstore(0x8c20, mload(0x8b40)) +mstore(0x8c40, mload(0x8ba0)) + mstore(0x8c60, mload(0x8bc0)) +success := and(eq(staticcall(gas(), 0x6, 0x8c00, 0x80, 0x8c00, 0x40), 1), success) +mstore(0x8c80, mload(0x420)) + mstore(0x8ca0, mload(0x440)) +mstore(0x8cc0, mload(0x75a0)) +success := and(eq(staticcall(gas(), 0x7, 0x8c80, 0x60, 0x8c80, 0x40), 1), success) +mstore(0x8ce0, mload(0x8c00)) + mstore(0x8d00, mload(0x8c20)) +mstore(0x8d20, mload(0x8c80)) + mstore(0x8d40, mload(0x8ca0)) +success := and(eq(staticcall(gas(), 0x6, 0x8ce0, 0x80, 0x8ce0, 0x40), 1), success) +mstore(0x8d60, mload(0x460)) + mstore(0x8d80, mload(0x480)) +mstore(0x8da0, mload(0x7600)) +success := and(eq(staticcall(gas(), 0x7, 0x8d60, 0x60, 0x8d60, 0x40), 1), success) +mstore(0x8dc0, mload(0x8ce0)) + mstore(0x8de0, mload(0x8d00)) +mstore(0x8e00, mload(0x8d60)) + mstore(0x8e20, mload(0x8d80)) +success := and(eq(staticcall(gas(), 0x6, 0x8dc0, 0x80, 0x8dc0, 0x40), 1), success) +mstore(0x8e40, mload(0x4a0)) + mstore(0x8e60, mload(0x4c0)) +mstore(0x8e80, mload(0x6b00)) +success := and(eq(staticcall(gas(), 0x7, 0x8e40, 0x60, 0x8e40, 0x40), 1), success) +mstore(0x8ea0, mload(0x8dc0)) + mstore(0x8ec0, mload(0x8de0)) +mstore(0x8ee0, mload(0x8e40)) + mstore(0x8f00, mload(0x8e60)) +success := and(eq(staticcall(gas(), 0x6, 0x8ea0, 0x80, 0x8ea0, 0x40), 1), success) +mstore(0x8f20, mload(0x4e0)) + mstore(0x8f40, mload(0x500)) +mstore(0x8f60, mload(0x7620)) +success := and(eq(staticcall(gas(), 0x7, 0x8f20, 0x60, 0x8f20, 0x40), 1), success) +mstore(0x8f80, mload(0x8ea0)) + mstore(0x8fa0, mload(0x8ec0)) +mstore(0x8fc0, mload(0x8f20)) + mstore(0x8fe0, mload(0x8f40)) +success := and(eq(staticcall(gas(), 0x6, 0x8f80, 0x80, 0x8f80, 0x40), 1), success) +mstore(0x9000, mload(0x520)) + mstore(0x9020, mload(0x540)) +mstore(0x9040, mload(0x6b40)) +success := and(eq(staticcall(gas(), 0x7, 0x9000, 0x60, 0x9000, 0x40), 1), success) +mstore(0x9060, mload(0x8f80)) + mstore(0x9080, mload(0x8fa0)) +mstore(0x90a0, mload(0x9000)) + mstore(0x90c0, mload(0x9020)) +success := and(eq(staticcall(gas(), 0x6, 0x9060, 0x80, 0x9060, 0x40), 1), success) +mstore(0x90e0, mload(0x900)) + mstore(0x9100, mload(0x920)) +mstore(0x9120, mload(0x7640)) +success := and(eq(staticcall(gas(), 0x7, 0x90e0, 0x60, 0x90e0, 0x40), 1), success) +mstore(0x9140, mload(0x9060)) + mstore(0x9160, mload(0x9080)) +mstore(0x9180, mload(0x90e0)) + mstore(0x91a0, mload(0x9100)) +success := and(eq(staticcall(gas(), 0x6, 0x9140, 0x80, 0x9140, 0x40), 1), success) +mstore(0x91c0, mload(0x940)) + mstore(0x91e0, mload(0x960)) +mstore(0x9200, mload(0x7660)) +success := and(eq(staticcall(gas(), 0x7, 0x91c0, 0x60, 0x91c0, 0x40), 1), success) +mstore(0x9220, mload(0x9140)) + mstore(0x9240, mload(0x9160)) +mstore(0x9260, mload(0x91c0)) + mstore(0x9280, mload(0x91e0)) +success := and(eq(staticcall(gas(), 0x6, 0x9220, 0x80, 0x9220, 0x40), 1), success) +mstore(0x92a0, mload(0x640)) + mstore(0x92c0, mload(0x660)) +mstore(0x92e0, mload(0x7c40)) +success := and(eq(staticcall(gas(), 0x7, 0x92a0, 0x60, 0x92a0, 0x40), 1), success) +mstore(0x9300, mload(0x9220)) + mstore(0x9320, mload(0x9240)) +mstore(0x9340, mload(0x92a0)) + mstore(0x9360, mload(0x92c0)) +success := and(eq(staticcall(gas(), 0x6, 0x9300, 0x80, 0x9300, 0x40), 1), success) +mstore(0x9380, mload(0x680)) + mstore(0x93a0, mload(0x6a0)) +mstore(0x93c0, mload(0x6bc0)) +success := and(eq(staticcall(gas(), 0x7, 0x9380, 0x60, 0x9380, 0x40), 1), success) +mstore(0x93e0, mload(0x9300)) + mstore(0x9400, mload(0x9320)) +mstore(0x9420, mload(0x9380)) + mstore(0x9440, mload(0x93a0)) +success := and(eq(staticcall(gas(), 0x6, 0x93e0, 0x80, 0x93e0, 0x40), 1), success) +mstore(0x9460, mload(0x980)) + mstore(0x9480, mload(0x9a0)) +mstore(0x94a0, mload(0x7680)) +success := and(eq(staticcall(gas(), 0x7, 0x9460, 0x60, 0x9460, 0x40), 1), success) +mstore(0x94c0, mload(0x93e0)) + mstore(0x94e0, mload(0x9400)) +mstore(0x9500, mload(0x9460)) + mstore(0x9520, mload(0x9480)) +success := and(eq(staticcall(gas(), 0x6, 0x94c0, 0x80, 0x94c0, 0x40), 1), success) +mstore(0x9540, mload(0x6c0)) + mstore(0x9560, mload(0x6e0)) +mstore(0x9580, mload(0x7c60)) +success := and(eq(staticcall(gas(), 0x7, 0x9540, 0x60, 0x9540, 0x40), 1), success) +mstore(0x95a0, mload(0x94c0)) + mstore(0x95c0, mload(0x94e0)) +mstore(0x95e0, mload(0x9540)) + mstore(0x9600, mload(0x9560)) +success := and(eq(staticcall(gas(), 0x6, 0x95a0, 0x80, 0x95a0, 0x40), 1), success) +mstore(0x9620, mload(0x700)) + mstore(0x9640, mload(0x720)) +mstore(0x9660, mload(0x6c20)) +success := and(eq(staticcall(gas(), 0x7, 0x9620, 0x60, 0x9620, 0x40), 1), success) +mstore(0x9680, mload(0x95a0)) + mstore(0x96a0, mload(0x95c0)) +mstore(0x96c0, mload(0x9620)) + mstore(0x96e0, mload(0x9640)) +success := and(eq(staticcall(gas(), 0x6, 0x9680, 0x80, 0x9680, 0x40), 1), success) +mstore(0x9700, mload(0x9c0)) + mstore(0x9720, mload(0x9e0)) +mstore(0x9740, mload(0x76a0)) +success := and(eq(staticcall(gas(), 0x7, 0x9700, 0x60, 0x9700, 0x40), 1), success) +mstore(0x9760, mload(0x9680)) + mstore(0x9780, mload(0x96a0)) +mstore(0x97a0, mload(0x9700)) + mstore(0x97c0, mload(0x9720)) +success := and(eq(staticcall(gas(), 0x6, 0x9760, 0x80, 0x9760, 0x40), 1), success) +mstore(0x97e0, mload(0x740)) + mstore(0x9800, mload(0x760)) +mstore(0x9820, mload(0x7c80)) +success := and(eq(staticcall(gas(), 0x7, 0x97e0, 0x60, 0x97e0, 0x40), 1), success) +mstore(0x9840, mload(0x9760)) + mstore(0x9860, mload(0x9780)) +mstore(0x9880, mload(0x97e0)) + mstore(0x98a0, mload(0x9800)) +success := and(eq(staticcall(gas(), 0x6, 0x9840, 0x80, 0x9840, 0x40), 1), success) +mstore(0x98c0, mload(0x780)) + mstore(0x98e0, mload(0x7a0)) +mstore(0x9900, mload(0x6c80)) +success := and(eq(staticcall(gas(), 0x7, 0x98c0, 0x60, 0x98c0, 0x40), 1), success) +mstore(0x9920, mload(0x9840)) + mstore(0x9940, mload(0x9860)) +mstore(0x9960, mload(0x98c0)) + mstore(0x9980, mload(0x98e0)) +success := and(eq(staticcall(gas(), 0x6, 0x9920, 0x80, 0x9920, 0x40), 1), success) +mstore(0x99a0, mload(0xa00)) + mstore(0x99c0, mload(0xa20)) +mstore(0x99e0, mload(0x76c0)) +success := and(eq(staticcall(gas(), 0x7, 0x99a0, 0x60, 0x99a0, 0x40), 1), success) +mstore(0x9a00, mload(0x9920)) + mstore(0x9a20, mload(0x9940)) +mstore(0x9a40, mload(0x99a0)) + mstore(0x9a60, mload(0x99c0)) +success := and(eq(staticcall(gas(), 0x6, 0x9a00, 0x80, 0x9a00, 0x40), 1), success) +mstore(0x9a80, mload(0x7c0)) + mstore(0x9aa0, mload(0x7e0)) +mstore(0x9ac0, mload(0x7ca0)) +success := and(eq(staticcall(gas(), 0x7, 0x9a80, 0x60, 0x9a80, 0x40), 1), success) +mstore(0x9ae0, mload(0x9a00)) + mstore(0x9b00, mload(0x9a20)) +mstore(0x9b20, mload(0x9a80)) + mstore(0x9b40, mload(0x9aa0)) +success := and(eq(staticcall(gas(), 0x6, 0x9ae0, 0x80, 0x9ae0, 0x40), 1), success) +mstore(0x9b60, mload(0x800)) + mstore(0x9b80, mload(0x820)) +mstore(0x9ba0, mload(0x6ce0)) +success := and(eq(staticcall(gas(), 0x7, 0x9b60, 0x60, 0x9b60, 0x40), 1), success) +mstore(0x9bc0, mload(0x9ae0)) + mstore(0x9be0, mload(0x9b00)) +mstore(0x9c00, mload(0x9b60)) + mstore(0x9c20, mload(0x9b80)) +success := and(eq(staticcall(gas(), 0x6, 0x9bc0, 0x80, 0x9bc0, 0x40), 1), success) +mstore(0x9c40, 0x24142897d89fae71ddba98fbfd32aeb5ca58035fe36a2ce8ba1f220c04bfd2ed) + mstore(0x9c60, 0x2f6c0d7716b92b04ec8c8915af38d26e334e48b1cf0244c3f69a6e2fd0b66c14) +mstore(0x9c80, mload(0x6d00)) +success := and(eq(staticcall(gas(), 0x7, 0x9c40, 0x60, 0x9c40, 0x40), 1), success) +mstore(0x9ca0, mload(0x9bc0)) + mstore(0x9cc0, mload(0x9be0)) +mstore(0x9ce0, mload(0x9c40)) + mstore(0x9d00, mload(0x9c60)) +success := and(eq(staticcall(gas(), 0x6, 0x9ca0, 0x80, 0x9ca0, 0x40), 1), success) +mstore(0x9d20, 0x02a8c8f304367570fb6ff09717c0c3489fd6fa0b18a43ec30f1738e23e44b7af) + mstore(0x9d40, 0x1630014e120ce66dc277145e1fa4508b450008e8b4761ff2095958af4594a8e0) +mstore(0x9d60, mload(0x6d20)) +success := and(eq(staticcall(gas(), 0x7, 0x9d20, 0x60, 0x9d20, 0x40), 1), success) +mstore(0x9d80, mload(0x9ca0)) + mstore(0x9da0, mload(0x9cc0)) +mstore(0x9dc0, mload(0x9d20)) + mstore(0x9de0, mload(0x9d40)) +success := and(eq(staticcall(gas(), 0x6, 0x9d80, 0x80, 0x9d80, 0x40), 1), success) +mstore(0x9e00, 0x1586c9888eeb27905be7f2344fe943d4b708c53a9ae1d6d659371ab13c5db842) + mstore(0x9e20, 0x03f3a8dab706905925bc52be8ecd37937b87c3688765969fa811fd6b8454b963) +mstore(0x9e40, mload(0x6d40)) +success := and(eq(staticcall(gas(), 0x7, 0x9e00, 0x60, 0x9e00, 0x40), 1), success) +mstore(0x9e60, mload(0x9d80)) + mstore(0x9e80, mload(0x9da0)) +mstore(0x9ea0, mload(0x9e00)) + mstore(0x9ec0, mload(0x9e20)) +success := and(eq(staticcall(gas(), 0x6, 0x9e60, 0x80, 0x9e60, 0x40), 1), success) +mstore(0x9ee0, 0x06f43427764dc375d3827fa2765b7efb195c96c4e3a9f115913dbaef4b4605cd) + mstore(0x9f00, 0x214843cd8458f8b31330ffbda93d2fb8e8c92e3fc96f64e23f797f30fc9202ef) +mstore(0x9f20, mload(0x6d60)) +success := and(eq(staticcall(gas(), 0x7, 0x9ee0, 0x60, 0x9ee0, 0x40), 1), success) +mstore(0x9f40, mload(0x9e60)) + mstore(0x9f60, mload(0x9e80)) +mstore(0x9f80, mload(0x9ee0)) + mstore(0x9fa0, mload(0x9f00)) +success := and(eq(staticcall(gas(), 0x6, 0x9f40, 0x80, 0x9f40, 0x40), 1), success) +mstore(0x9fc0, 0x299e17546931ab9afbbf988216d73c1a0b7a886302299f9e756bcbb3ef8d4b77) + mstore(0x9fe0, 0x07d5b69d3b18c011b16d9f747f716fd5502b343c14f6d20b2d1f56a9ec95dc6d) +mstore(0xa000, mload(0x6d80)) +success := and(eq(staticcall(gas(), 0x7, 0x9fc0, 0x60, 0x9fc0, 0x40), 1), success) +mstore(0xa020, mload(0x9f40)) + mstore(0xa040, mload(0x9f60)) +mstore(0xa060, mload(0x9fc0)) + mstore(0xa080, mload(0x9fe0)) +success := and(eq(staticcall(gas(), 0x6, 0xa020, 0x80, 0xa020, 0x40), 1), success) +mstore(0xa0a0, 0x00cf7441bfe23c289dc0ead64c4f446ff2f7056705f726048e4ce251f2b872db) + mstore(0xa0c0, 0x119e90dae672089175b8e619f66554864963becad6c98b6f076a44a58643b5be) +mstore(0xa0e0, mload(0x6da0)) +success := and(eq(staticcall(gas(), 0x7, 0xa0a0, 0x60, 0xa0a0, 0x40), 1), success) +mstore(0xa100, mload(0xa020)) + mstore(0xa120, mload(0xa040)) +mstore(0xa140, mload(0xa0a0)) + mstore(0xa160, mload(0xa0c0)) +success := and(eq(staticcall(gas(), 0x6, 0xa100, 0x80, 0xa100, 0x40), 1), success) +mstore(0xa180, 0x2855a61969e646e3ab0bf81a6fda391ae85d43675daf5c833d418a79566801ab) + mstore(0xa1a0, 0x1b5edecaff84a5748dca041b2f5be5f00aafc0b587f6abf9c978a861e85ae0cd) +mstore(0xa1c0, mload(0x6dc0)) +success := and(eq(staticcall(gas(), 0x7, 0xa180, 0x60, 0xa180, 0x40), 1), success) +mstore(0xa1e0, mload(0xa100)) + mstore(0xa200, mload(0xa120)) +mstore(0xa220, mload(0xa180)) + mstore(0xa240, mload(0xa1a0)) +success := and(eq(staticcall(gas(), 0x6, 0xa1e0, 0x80, 0xa1e0, 0x40), 1), success) +mstore(0xa260, 0x145f584377bc6ae8b501aef339707488d83d7c7264ade6443aa8b129435f0f03) + mstore(0xa280, 0x22054ed9c7da14500ca4c0a0ef50875365f86adf74ec5fb33318f06d13900962) +mstore(0xa2a0, mload(0x6de0)) +success := and(eq(staticcall(gas(), 0x7, 0xa260, 0x60, 0xa260, 0x40), 1), success) +mstore(0xa2c0, mload(0xa1e0)) + mstore(0xa2e0, mload(0xa200)) +mstore(0xa300, mload(0xa260)) + mstore(0xa320, mload(0xa280)) +success := and(eq(staticcall(gas(), 0x6, 0xa2c0, 0x80, 0xa2c0, 0x40), 1), success) +mstore(0xa340, 0x008640f80880ee80d0a45a44184c03295c8461d1319a92d492aa9a9c5a06f906) + mstore(0xa360, 0x0dc16d263c5e24f8fdb0f31f0a19ab259be0581a35e068a9272e50f9dae6e1a4) +mstore(0xa380, mload(0x6e00)) +success := and(eq(staticcall(gas(), 0x7, 0xa340, 0x60, 0xa340, 0x40), 1), success) +mstore(0xa3a0, mload(0xa2c0)) + mstore(0xa3c0, mload(0xa2e0)) +mstore(0xa3e0, mload(0xa340)) + mstore(0xa400, mload(0xa360)) +success := and(eq(staticcall(gas(), 0x6, 0xa3a0, 0x80, 0xa3a0, 0x40), 1), success) +mstore(0xa420, 0x2b71958e4c46b43dac5a9e114648ce015d0ae18e0b554f5d652e2a2e46f8b719) + mstore(0xa440, 0x16eb2b964c384d0f73302c33c058864839e2edb805d2ab9420242d7867f06b2a) +mstore(0xa460, mload(0x6e20)) +success := and(eq(staticcall(gas(), 0x7, 0xa420, 0x60, 0xa420, 0x40), 1), success) +mstore(0xa480, mload(0xa3a0)) + mstore(0xa4a0, mload(0xa3c0)) +mstore(0xa4c0, mload(0xa420)) + mstore(0xa4e0, mload(0xa440)) +success := and(eq(staticcall(gas(), 0x6, 0xa480, 0x80, 0xa480, 0x40), 1), success) +mstore(0xa500, 0x2997a9015537f4e44a8e7633288a56fa1cc3521310d0156103346589ab214e99) + mstore(0xa520, 0x20cd7e98721ea1e2b93799024a840f0071612a5baa0e9ccab52c9b366bfcb96a) +mstore(0xa540, mload(0x6e40)) +success := and(eq(staticcall(gas(), 0x7, 0xa500, 0x60, 0xa500, 0x40), 1), success) +mstore(0xa560, mload(0xa480)) + mstore(0xa580, mload(0xa4a0)) +mstore(0xa5a0, mload(0xa500)) + mstore(0xa5c0, mload(0xa520)) +success := and(eq(staticcall(gas(), 0x6, 0xa560, 0x80, 0xa560, 0x40), 1), success) +mstore(0xa5e0, 0x206a6e4cef8214fe6edae0fb548fcf252de1ee7883f3541e2c44ebace7064016) + mstore(0xa600, 0x1d4041518e0e652ecabc0d5dcb503a30ffc2410def694377db33f4f0d9a69eca) +mstore(0xa620, mload(0x6e60)) +success := and(eq(staticcall(gas(), 0x7, 0xa5e0, 0x60, 0xa5e0, 0x40), 1), success) +mstore(0xa640, mload(0xa560)) + mstore(0xa660, mload(0xa580)) +mstore(0xa680, mload(0xa5e0)) + mstore(0xa6a0, mload(0xa600)) +success := and(eq(staticcall(gas(), 0x6, 0xa640, 0x80, 0xa640, 0x40), 1), success) +mstore(0xa6c0, 0x129fb70a315e163344ed2808166e062289b5b90479420fde806c5ce2446560a3) + mstore(0xa6e0, 0x29f4eb812d6e1f999b96f899870af8e76fd9d06d0d76a1e6f8fb7810b23b64c6) +mstore(0xa700, mload(0x6e80)) +success := and(eq(staticcall(gas(), 0x7, 0xa6c0, 0x60, 0xa6c0, 0x40), 1), success) +mstore(0xa720, mload(0xa640)) + mstore(0xa740, mload(0xa660)) +mstore(0xa760, mload(0xa6c0)) + mstore(0xa780, mload(0xa6e0)) +success := and(eq(staticcall(gas(), 0x6, 0xa720, 0x80, 0xa720, 0x40), 1), success) +mstore(0xa7a0, mload(0xae0)) + mstore(0xa7c0, mload(0xb00)) +mstore(0xa7e0, mload(0x6ea0)) +success := and(eq(staticcall(gas(), 0x7, 0xa7a0, 0x60, 0xa7a0, 0x40), 1), success) +mstore(0xa800, mload(0xa720)) + mstore(0xa820, mload(0xa740)) +mstore(0xa840, mload(0xa7a0)) + mstore(0xa860, mload(0xa7c0)) +success := and(eq(staticcall(gas(), 0x6, 0xa800, 0x80, 0xa800, 0x40), 1), success) +mstore(0xa880, mload(0xb20)) + mstore(0xa8a0, mload(0xb40)) +mstore(0xa8c0, mload(0x6ec0)) +success := and(eq(staticcall(gas(), 0x7, 0xa880, 0x60, 0xa880, 0x40), 1), success) +mstore(0xa8e0, mload(0xa800)) + mstore(0xa900, mload(0xa820)) +mstore(0xa920, mload(0xa880)) + mstore(0xa940, mload(0xa8a0)) +success := and(eq(staticcall(gas(), 0x6, 0xa8e0, 0x80, 0xa8e0, 0x40), 1), success) +mstore(0xa960, mload(0xb60)) + mstore(0xa980, mload(0xb80)) +mstore(0xa9a0, mload(0x6ee0)) +success := and(eq(staticcall(gas(), 0x7, 0xa960, 0x60, 0xa960, 0x40), 1), success) +mstore(0xa9c0, mload(0xa8e0)) + mstore(0xa9e0, mload(0xa900)) +mstore(0xaa00, mload(0xa960)) + mstore(0xaa20, mload(0xa980)) +success := and(eq(staticcall(gas(), 0x6, 0xa9c0, 0x80, 0xa9c0, 0x40), 1), success) +mstore(0xaa40, mload(0xba0)) + mstore(0xaa60, mload(0xbc0)) +mstore(0xaa80, mload(0x6f00)) +success := and(eq(staticcall(gas(), 0x7, 0xaa40, 0x60, 0xaa40, 0x40), 1), success) +mstore(0xaaa0, mload(0xa9c0)) + mstore(0xaac0, mload(0xa9e0)) +mstore(0xaae0, mload(0xaa40)) + mstore(0xab00, mload(0xaa60)) +success := and(eq(staticcall(gas(), 0x6, 0xaaa0, 0x80, 0xaaa0, 0x40), 1), success) +mstore(0xab20, mload(0xbe0)) + mstore(0xab40, mload(0xc00)) +mstore(0xab60, mload(0x6f20)) +success := and(eq(staticcall(gas(), 0x7, 0xab20, 0x60, 0xab20, 0x40), 1), success) +mstore(0xab80, mload(0xaaa0)) + mstore(0xaba0, mload(0xaac0)) +mstore(0xabc0, mload(0xab20)) + mstore(0xabe0, mload(0xab40)) +success := and(eq(staticcall(gas(), 0x6, 0xab80, 0x80, 0xab80, 0x40), 1), success) +mstore(0xac00, mload(0xc20)) + mstore(0xac20, mload(0xc40)) +mstore(0xac40, mload(0x6f40)) +success := and(eq(staticcall(gas(), 0x7, 0xac00, 0x60, 0xac00, 0x40), 1), success) +mstore(0xac60, mload(0xab80)) + mstore(0xac80, mload(0xaba0)) +mstore(0xaca0, mload(0xac00)) + mstore(0xacc0, mload(0xac20)) +success := and(eq(staticcall(gas(), 0x6, 0xac60, 0x80, 0xac60, 0x40), 1), success) +mstore(0xace0, mload(0xc60)) + mstore(0xad00, mload(0xc80)) +mstore(0xad20, mload(0x6f60)) +success := and(eq(staticcall(gas(), 0x7, 0xace0, 0x60, 0xace0, 0x40), 1), success) +mstore(0xad40, mload(0xac60)) + mstore(0xad60, mload(0xac80)) +mstore(0xad80, mload(0xace0)) + mstore(0xada0, mload(0xad00)) +success := and(eq(staticcall(gas(), 0x6, 0xad40, 0x80, 0xad40, 0x40), 1), success) +mstore(0xadc0, mload(0xca0)) + mstore(0xade0, mload(0xcc0)) +mstore(0xae00, mload(0x6f80)) +success := and(eq(staticcall(gas(), 0x7, 0xadc0, 0x60, 0xadc0, 0x40), 1), success) +mstore(0xae20, mload(0xad40)) + mstore(0xae40, mload(0xad60)) +mstore(0xae60, mload(0xadc0)) + mstore(0xae80, mload(0xade0)) +success := and(eq(staticcall(gas(), 0x6, 0xae20, 0x80, 0xae20, 0x40), 1), success) +mstore(0xaea0, mload(0xa40)) + mstore(0xaec0, mload(0xa60)) +mstore(0xaee0, mload(0x6fa0)) +success := and(eq(staticcall(gas(), 0x7, 0xaea0, 0x60, 0xaea0, 0x40), 1), success) +mstore(0xaf00, mload(0xae20)) + mstore(0xaf20, mload(0xae40)) +mstore(0xaf40, mload(0xaea0)) + mstore(0xaf60, mload(0xaec0)) +success := and(eq(staticcall(gas(), 0x6, 0xaf00, 0x80, 0xaf00, 0x40), 1), success) +mstore(0xaf80, mload(0x1680)) + mstore(0xafa0, mload(0x16a0)) +mstore(0xafc0, mload(0x7ce0)) +success := and(eq(staticcall(gas(), 0x7, 0xaf80, 0x60, 0xaf80, 0x40), 1), success) +mstore(0xafe0, mload(0xaf00)) + mstore(0xb000, mload(0xaf20)) +mstore(0xb020, mload(0xaf80)) + mstore(0xb040, mload(0xafa0)) +success := and(eq(staticcall(gas(), 0x6, 0xafe0, 0x80, 0xafe0, 0x40), 1), success) +mstore(0xb060, mload(0x16c0)) + mstore(0xb080, mload(0x16e0)) +mstore(0xb0a0, mload(0x7d20)) +success := and(eq(staticcall(gas(), 0x7, 0xb060, 0x60, 0xb060, 0x40), 1), success) +mstore(0xb0c0, mload(0xafe0)) + mstore(0xb0e0, mload(0xb000)) +mstore(0xb100, mload(0xb060)) + mstore(0xb120, mload(0xb080)) +success := and(eq(staticcall(gas(), 0x6, 0xb0c0, 0x80, 0xb0c0, 0x40), 1), success) +mstore(0xb140, mload(0x1700)) + mstore(0xb160, mload(0x1720)) +mstore(0xb180, mload(0x7d60)) +success := and(eq(staticcall(gas(), 0x7, 0xb140, 0x60, 0xb140, 0x40), 1), success) +mstore(0xb1a0, mload(0xb0c0)) + mstore(0xb1c0, mload(0xb0e0)) +mstore(0xb1e0, mload(0xb140)) + mstore(0xb200, mload(0xb160)) +success := and(eq(staticcall(gas(), 0x6, 0xb1a0, 0x80, 0xb1a0, 0x40), 1), success) +mstore(0xb220, mload(0x1740)) + mstore(0xb240, mload(0x1760)) +mstore(0xb260, mload(0x7da0)) +success := and(eq(staticcall(gas(), 0x7, 0xb220, 0x60, 0xb220, 0x40), 1), success) +mstore(0xb280, mload(0xb1a0)) + mstore(0xb2a0, mload(0xb1c0)) +mstore(0xb2c0, mload(0xb220)) + mstore(0xb2e0, mload(0xb240)) +success := and(eq(staticcall(gas(), 0x6, 0xb280, 0x80, 0xb280, 0x40), 1), success) +mstore(0xb300, mload(0x1780)) + mstore(0xb320, mload(0x17a0)) +mstore(0xb340, mload(0x7de0)) +success := and(eq(staticcall(gas(), 0x7, 0xb300, 0x60, 0xb300, 0x40), 1), success) +mstore(0xb360, mload(0xb280)) + mstore(0xb380, mload(0xb2a0)) +mstore(0xb3a0, mload(0xb300)) + mstore(0xb3c0, mload(0xb320)) +success := and(eq(staticcall(gas(), 0x6, 0xb360, 0x80, 0xb360, 0x40), 1), success) +mstore(0xb3e0, mload(0x17c0)) + mstore(0xb400, mload(0x17e0)) +mstore(0xb420, mload(0x7e20)) +success := and(eq(staticcall(gas(), 0x7, 0xb3e0, 0x60, 0xb3e0, 0x40), 1), success) +mstore(0xb440, mload(0xb360)) + mstore(0xb460, mload(0xb380)) +mstore(0xb480, mload(0xb3e0)) + mstore(0xb4a0, mload(0xb400)) +success := and(eq(staticcall(gas(), 0x6, 0xb440, 0x80, 0xb440, 0x40), 1), success) +mstore(0xb4c0, mload(0x1800)) + mstore(0xb4e0, mload(0x1820)) +mstore(0xb500, mload(0x7e60)) +success := and(eq(staticcall(gas(), 0x7, 0xb4c0, 0x60, 0xb4c0, 0x40), 1), success) +mstore(0xb520, mload(0xb440)) + mstore(0xb540, mload(0xb460)) +mstore(0xb560, mload(0xb4c0)) + mstore(0xb580, mload(0xb4e0)) +success := and(eq(staticcall(gas(), 0x6, 0xb520, 0x80, 0xb520, 0x40), 1), success) +mstore(0xb5a0, mload(0x1840)) + mstore(0xb5c0, mload(0x1860)) +mstore(0xb5e0, mload(0x7ea0)) +success := and(eq(staticcall(gas(), 0x7, 0xb5a0, 0x60, 0xb5a0, 0x40), 1), success) +mstore(0xb600, mload(0xb520)) + mstore(0xb620, mload(0xb540)) +mstore(0xb640, mload(0xb5a0)) + mstore(0xb660, mload(0xb5c0)) +success := and(eq(staticcall(gas(), 0x6, 0xb600, 0x80, 0xb600, 0x40), 1), success) +mstore(0xb680, mload(0x1880)) + mstore(0xb6a0, mload(0x18a0)) +mstore(0xb6c0, mload(0x7ee0)) +success := and(eq(staticcall(gas(), 0x7, 0xb680, 0x60, 0xb680, 0x40), 1), success) +mstore(0xb6e0, mload(0xb600)) + mstore(0xb700, mload(0xb620)) +mstore(0xb720, mload(0xb680)) + mstore(0xb740, mload(0xb6a0)) +success := and(eq(staticcall(gas(), 0x6, 0xb6e0, 0x80, 0xb6e0, 0x40), 1), success) +mstore(0xb760, mload(0x16c0)) + mstore(0xb780, mload(0x16e0)) +mstore(0xb7a0, mload(0x7340)) +success := and(eq(staticcall(gas(), 0x7, 0xb760, 0x60, 0xb760, 0x40), 1), success) +mstore(0xb7c0, mload(0x1680)) + mstore(0xb7e0, mload(0x16a0)) +mstore(0xb800, mload(0xb760)) + mstore(0xb820, mload(0xb780)) +success := and(eq(staticcall(gas(), 0x6, 0xb7c0, 0x80, 0xb7c0, 0x40), 1), success) +mstore(0xb840, mload(0x1700)) + mstore(0xb860, mload(0x1720)) +mstore(0xb880, mload(0x7720)) +success := and(eq(staticcall(gas(), 0x7, 0xb840, 0x60, 0xb840, 0x40), 1), success) +mstore(0xb8a0, mload(0xb7c0)) + mstore(0xb8c0, mload(0xb7e0)) +mstore(0xb8e0, mload(0xb840)) + mstore(0xb900, mload(0xb860)) +success := and(eq(staticcall(gas(), 0x6, 0xb8a0, 0x80, 0xb8a0, 0x40), 1), success) +mstore(0xb920, mload(0x1740)) + mstore(0xb940, mload(0x1760)) +mstore(0xb960, mload(0x77c0)) +success := and(eq(staticcall(gas(), 0x7, 0xb920, 0x60, 0xb920, 0x40), 1), success) +mstore(0xb980, mload(0xb8a0)) + mstore(0xb9a0, mload(0xb8c0)) +mstore(0xb9c0, mload(0xb920)) + mstore(0xb9e0, mload(0xb940)) +success := and(eq(staticcall(gas(), 0x6, 0xb980, 0x80, 0xb980, 0x40), 1), success) +mstore(0xba00, mload(0x1780)) + mstore(0xba20, mload(0x17a0)) +mstore(0xba40, mload(0x7860)) +success := and(eq(staticcall(gas(), 0x7, 0xba00, 0x60, 0xba00, 0x40), 1), success) +mstore(0xba60, mload(0xb980)) + mstore(0xba80, mload(0xb9a0)) +mstore(0xbaa0, mload(0xba00)) + mstore(0xbac0, mload(0xba20)) +success := and(eq(staticcall(gas(), 0x6, 0xba60, 0x80, 0xba60, 0x40), 1), success) +mstore(0xbae0, mload(0x17c0)) + mstore(0xbb00, mload(0x17e0)) +mstore(0xbb20, mload(0x7900)) +success := and(eq(staticcall(gas(), 0x7, 0xbae0, 0x60, 0xbae0, 0x40), 1), success) +mstore(0xbb40, mload(0xba60)) + mstore(0xbb60, mload(0xba80)) +mstore(0xbb80, mload(0xbae0)) + mstore(0xbba0, mload(0xbb00)) +success := and(eq(staticcall(gas(), 0x6, 0xbb40, 0x80, 0xbb40, 0x40), 1), success) +mstore(0xbbc0, mload(0x1800)) + mstore(0xbbe0, mload(0x1820)) +mstore(0xbc00, mload(0x79a0)) +success := and(eq(staticcall(gas(), 0x7, 0xbbc0, 0x60, 0xbbc0, 0x40), 1), success) +mstore(0xbc20, mload(0xbb40)) + mstore(0xbc40, mload(0xbb60)) +mstore(0xbc60, mload(0xbbc0)) + mstore(0xbc80, mload(0xbbe0)) +success := and(eq(staticcall(gas(), 0x6, 0xbc20, 0x80, 0xbc20, 0x40), 1), success) +mstore(0xbca0, mload(0x1840)) + mstore(0xbcc0, mload(0x1860)) +mstore(0xbce0, mload(0x7a40)) +success := and(eq(staticcall(gas(), 0x7, 0xbca0, 0x60, 0xbca0, 0x40), 1), success) +mstore(0xbd00, mload(0xbc20)) + mstore(0xbd20, mload(0xbc40)) +mstore(0xbd40, mload(0xbca0)) + mstore(0xbd60, mload(0xbcc0)) +success := and(eq(staticcall(gas(), 0x6, 0xbd00, 0x80, 0xbd00, 0x40), 1), success) +mstore(0xbd80, mload(0x1880)) + mstore(0xbda0, mload(0x18a0)) +mstore(0xbdc0, mload(0x7ba0)) +success := and(eq(staticcall(gas(), 0x7, 0xbd80, 0x60, 0xbd80, 0x40), 1), success) +mstore(0xbde0, mload(0xbd00)) + mstore(0xbe00, mload(0xbd20)) +mstore(0xbe20, mload(0xbd80)) + mstore(0xbe40, mload(0xbda0)) +success := and(eq(staticcall(gas(), 0x6, 0xbde0, 0x80, 0xbde0, 0x40), 1), success) +mstore(0xbe60, mload(0xb6e0)) + mstore(0xbe80, mload(0xb700)) +mstore(0xbea0, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) + mstore(0xbec0, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed) + mstore(0xbee0, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b) + mstore(0xbf00, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa) +mstore(0xbf20, mload(0xbde0)) + mstore(0xbf40, mload(0xbe00)) +mstore(0xbf60, 0x23154cd76fc1a1456722405944669193fa5bb5dca6bf2d82a753c2bd4a301844) + mstore(0xbf80, 0x08faab3e0053f08c27e98f5f55d9e6828d5bec3ca616b4f8014ba8a57f087bec) + mstore(0xbfa0, 0x2491c974cda41f8748723ea2e5235649e0b01b17471d0152d93be5a0865f3f3e) + mstore(0xbfc0, 0x078a2487b80fcbfd3b4036c306540ec111c685b7842bd153042a4357b30db70a) +success := and(eq(staticcall(gas(), 0x8, 0xbe60, 0x180, 0xbe60, 0x20), 1), success) +success := and(eq(mload(0xbe60), 1), success) + + if not(success) { revert(0, 0) } + return(0, 0) + + } + } +} diff --git a/packages/protocol/contracts/libs/yul/PlonkVerifier_80_txs.yulp b/packages/protocol/contracts/libs/yul/PlonkVerifier_80_txs.yulp new file mode 100644 index 0000000000..db9ab392d1 --- /dev/null +++ b/packages/protocol/contracts/libs/yul/PlonkVerifier_80_txs.yulp @@ -0,0 +1,2152 @@ +// Code generated - DO NOT EDIT. +// SPDX-License-Identifier: MIT +// _____ _ _ _ _ +// |_ _|_ _(_) |_____ | | __ _| |__ ___ +// | |/ _` | | / / _ \ | |__/ _` | '_ (_-< +// |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ + +object "plonk_verifier" { + code { + function allocate(size) -> ptr { + ptr := mload(0x40) + if eq(ptr, 0) { ptr := 0x60 } + mstore(0x40, add(ptr, size)) + } + let size := datasize("Runtime") + let offset := allocate(size) + datacopy(offset, dataoffset("Runtime"), size) + return(offset, size) + } + object "Runtime" { + code { + let success:bool := true + let f_p := 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47 + let f_q := 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001 + function validate_ec_point(x, y) -> valid:bool { + { + let x_lt_p:bool := lt(x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) + let y_lt_p:bool := lt(y, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) + valid := and(x_lt_p, y_lt_p) + } + { + let x_is_zero:bool := eq(x, 0) + let y_is_zero:bool := eq(y, 0) + let x_or_y_is_zero:bool := or(x_is_zero, y_is_zero) + let x_and_y_is_not_zero:bool := not(x_or_y_is_zero) + valid := and(x_and_y_is_not_zero, valid) + } + { + let y_square := mulmod(y, y, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) + let x_square := mulmod(x, x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) + let x_cube := mulmod(x_square, x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) + let x_cube_plus_3 := addmod(x_cube, 3, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) + let y_square_eq_x_cube_plus_3:bool := eq(x_cube_plus_3, y_square) + valid := and(y_square_eq_x_cube_plus_3, valid) + } + } + mstore(0x20, mod(calldataload(0x0), f_q)) +mstore(0x40, mod(calldataload(0x20), f_q)) +mstore(0x0, 7962866457030187900449294305274824544206991306141733224825884861609114901166) + +{ + let x := calldataload(0x40) + mstore(0x60, x) + let y := calldataload(0x60) + mstore(0x80, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x80) + mstore(0xa0, x) + let y := calldataload(0xa0) + mstore(0xc0, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0xc0) + mstore(0xe0, x) + let y := calldataload(0xe0) + mstore(0x100, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x100) + mstore(0x120, x) + let y := calldataload(0x120) + mstore(0x140, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x140) + mstore(0x160, x) + let y := calldataload(0x160) + mstore(0x180, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x180) + mstore(0x1a0, x) + let y := calldataload(0x1a0) + mstore(0x1c0, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x1c0) + mstore(0x1e0, x) + let y := calldataload(0x1e0) + mstore(0x200, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x200) + mstore(0x220, x) + let y := calldataload(0x220) + mstore(0x240, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x240) + mstore(0x260, x) + let y := calldataload(0x260) + mstore(0x280, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x280) + mstore(0x2a0, x) + let y := calldataload(0x2a0) + mstore(0x2c0, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x2c0) + mstore(0x2e0, x) + let y := calldataload(0x2e0) + mstore(0x300, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x300) + mstore(0x320, x) + let y := calldataload(0x320) + mstore(0x340, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x340) + mstore(0x360, x) + let y := calldataload(0x360) + mstore(0x380, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x380) + mstore(0x3a0, x) + let y := calldataload(0x3a0) + mstore(0x3c0, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x3c0) + mstore(0x3e0, x) + let y := calldataload(0x3e0) + mstore(0x400, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x400) + mstore(0x420, x) + let y := calldataload(0x420) + mstore(0x440, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x440) + mstore(0x460, x) + let y := calldataload(0x460) + mstore(0x480, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x480) + mstore(0x4a0, x) + let y := calldataload(0x4a0) + mstore(0x4c0, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x4c0) + mstore(0x4e0, x) + let y := calldataload(0x4e0) + mstore(0x500, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x500) + mstore(0x520, x) + let y := calldataload(0x520) + mstore(0x540, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x540) + mstore(0x560, x) + let y := calldataload(0x560) + mstore(0x580, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x580) + mstore(0x5a0, x) + let y := calldataload(0x5a0) + mstore(0x5c0, y) + success := and(validate_ec_point(x, y), success) +} +mstore(0x5e0, keccak256(0x0, 1504)) +{ + let hash := mload(0x5e0) + mstore(0x600, mod(hash, f_q)) + mstore(0x620, hash) +} + +{ + let x := calldataload(0x5c0) + mstore(0x640, x) + let y := calldataload(0x5e0) + mstore(0x660, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x600) + mstore(0x680, x) + let y := calldataload(0x620) + mstore(0x6a0, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x640) + mstore(0x6c0, x) + let y := calldataload(0x660) + mstore(0x6e0, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x680) + mstore(0x700, x) + let y := calldataload(0x6a0) + mstore(0x720, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x6c0) + mstore(0x740, x) + let y := calldataload(0x6e0) + mstore(0x760, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x700) + mstore(0x780, x) + let y := calldataload(0x720) + mstore(0x7a0, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x740) + mstore(0x7c0, x) + let y := calldataload(0x760) + mstore(0x7e0, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x780) + mstore(0x800, x) + let y := calldataload(0x7a0) + mstore(0x820, y) + success := and(validate_ec_point(x, y), success) +} +mstore(0x840, keccak256(0x620, 544)) +{ + let hash := mload(0x840) + mstore(0x860, mod(hash, f_q)) + mstore(0x880, hash) +} +mstore8(2208, 1) +mstore(0x8a0, keccak256(0x880, 33)) +{ + let hash := mload(0x8a0) + mstore(0x8c0, mod(hash, f_q)) + mstore(0x8e0, hash) +} + +{ + let x := calldataload(0x7c0) + mstore(0x900, x) + let y := calldataload(0x7e0) + mstore(0x920, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x800) + mstore(0x940, x) + let y := calldataload(0x820) + mstore(0x960, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x840) + mstore(0x980, x) + let y := calldataload(0x860) + mstore(0x9a0, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x880) + mstore(0x9c0, x) + let y := calldataload(0x8a0) + mstore(0x9e0, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x8c0) + mstore(0xa00, x) + let y := calldataload(0x8e0) + mstore(0xa20, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x900) + mstore(0xa40, x) + let y := calldataload(0x920) + mstore(0xa60, y) + success := and(validate_ec_point(x, y), success) +} +mstore(0xa80, keccak256(0x8e0, 416)) +{ + let hash := mload(0xa80) + mstore(0xaa0, mod(hash, f_q)) + mstore(0xac0, hash) +} + +{ + let x := calldataload(0x940) + mstore(0xae0, x) + let y := calldataload(0x960) + mstore(0xb00, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x980) + mstore(0xb20, x) + let y := calldataload(0x9a0) + mstore(0xb40, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x9c0) + mstore(0xb60, x) + let y := calldataload(0x9e0) + mstore(0xb80, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0xa00) + mstore(0xba0, x) + let y := calldataload(0xa20) + mstore(0xbc0, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0xa40) + mstore(0xbe0, x) + let y := calldataload(0xa60) + mstore(0xc00, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0xa80) + mstore(0xc20, x) + let y := calldataload(0xaa0) + mstore(0xc40, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0xac0) + mstore(0xc60, x) + let y := calldataload(0xae0) + mstore(0xc80, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0xb00) + mstore(0xca0, x) + let y := calldataload(0xb20) + mstore(0xcc0, y) + success := and(validate_ec_point(x, y), success) +} +mstore(0xce0, keccak256(0xac0, 544)) +{ + let hash := mload(0xce0) + mstore(0xd00, mod(hash, f_q)) + mstore(0xd20, hash) +} +mstore(0xd40, mod(calldataload(0xb40), f_q)) +mstore(0xd60, mod(calldataload(0xb60), f_q)) +mstore(0xd80, mod(calldataload(0xb80), f_q)) +mstore(0xda0, mod(calldataload(0xba0), f_q)) +mstore(0xdc0, mod(calldataload(0xbc0), f_q)) +mstore(0xde0, mod(calldataload(0xbe0), f_q)) +mstore(0xe00, mod(calldataload(0xc00), f_q)) +mstore(0xe20, mod(calldataload(0xc20), f_q)) +mstore(0xe40, mod(calldataload(0xc40), f_q)) +mstore(0xe60, mod(calldataload(0xc60), f_q)) +mstore(0xe80, mod(calldataload(0xc80), f_q)) +mstore(0xea0, mod(calldataload(0xca0), f_q)) +mstore(0xec0, mod(calldataload(0xcc0), f_q)) +mstore(0xee0, mod(calldataload(0xce0), f_q)) +mstore(0xf00, mod(calldataload(0xd00), f_q)) +mstore(0xf20, mod(calldataload(0xd20), f_q)) +mstore(0xf40, mod(calldataload(0xd40), f_q)) +mstore(0xf60, mod(calldataload(0xd60), f_q)) +mstore(0xf80, mod(calldataload(0xd80), f_q)) +mstore(0xfa0, mod(calldataload(0xda0), f_q)) +mstore(0xfc0, mod(calldataload(0xdc0), f_q)) +mstore(0xfe0, mod(calldataload(0xde0), f_q)) +mstore(0x1000, mod(calldataload(0xe00), f_q)) +mstore(0x1020, mod(calldataload(0xe20), f_q)) +mstore(0x1040, mod(calldataload(0xe40), f_q)) +mstore(0x1060, mod(calldataload(0xe60), f_q)) +mstore(0x1080, mod(calldataload(0xe80), f_q)) +mstore(0x10a0, mod(calldataload(0xea0), f_q)) +mstore(0x10c0, mod(calldataload(0xec0), f_q)) +mstore(0x10e0, mod(calldataload(0xee0), f_q)) +mstore(0x1100, mod(calldataload(0xf00), f_q)) +mstore(0x1120, mod(calldataload(0xf20), f_q)) +mstore(0x1140, mod(calldataload(0xf40), f_q)) +mstore(0x1160, mod(calldataload(0xf60), f_q)) +mstore(0x1180, mod(calldataload(0xf80), f_q)) +mstore(0x11a0, mod(calldataload(0xfa0), f_q)) +mstore(0x11c0, mod(calldataload(0xfc0), f_q)) +mstore(0x11e0, mod(calldataload(0xfe0), f_q)) +mstore(0x1200, mod(calldataload(0x1000), f_q)) +mstore(0x1220, mod(calldataload(0x1020), f_q)) +mstore(0x1240, mod(calldataload(0x1040), f_q)) +mstore(0x1260, mod(calldataload(0x1060), f_q)) +mstore(0x1280, mod(calldataload(0x1080), f_q)) +mstore(0x12a0, mod(calldataload(0x10a0), f_q)) +mstore(0x12c0, mod(calldataload(0x10c0), f_q)) +mstore(0x12e0, mod(calldataload(0x10e0), f_q)) +mstore(0x1300, mod(calldataload(0x1100), f_q)) +mstore(0x1320, mod(calldataload(0x1120), f_q)) +mstore(0x1340, mod(calldataload(0x1140), f_q)) +mstore(0x1360, mod(calldataload(0x1160), f_q)) +mstore(0x1380, mod(calldataload(0x1180), f_q)) +mstore(0x13a0, mod(calldataload(0x11a0), f_q)) +mstore(0x13c0, mod(calldataload(0x11c0), f_q)) +mstore(0x13e0, mod(calldataload(0x11e0), f_q)) +mstore(0x1400, mod(calldataload(0x1200), f_q)) +mstore(0x1420, mod(calldataload(0x1220), f_q)) +mstore(0x1440, mod(calldataload(0x1240), f_q)) +mstore(0x1460, mod(calldataload(0x1260), f_q)) +mstore(0x1480, mod(calldataload(0x1280), f_q)) +mstore(0x14a0, mod(calldataload(0x12a0), f_q)) +mstore(0x14c0, mod(calldataload(0x12c0), f_q)) +mstore(0x14e0, mod(calldataload(0x12e0), f_q)) +mstore(0x1500, mod(calldataload(0x1300), f_q)) +mstore(0x1520, mod(calldataload(0x1320), f_q)) +mstore(0x1540, mod(calldataload(0x1340), f_q)) +mstore(0x1560, mod(calldataload(0x1360), f_q)) +mstore(0x1580, mod(calldataload(0x1380), f_q)) +mstore(0x15a0, mod(calldataload(0x13a0), f_q)) +mstore(0x15c0, mod(calldataload(0x13c0), f_q)) +mstore(0x15e0, mod(calldataload(0x13e0), f_q)) +mstore(0x1600, mod(calldataload(0x1400), f_q)) +mstore(0x1620, keccak256(0xd20, 2304)) +{ + let hash := mload(0x1620) + mstore(0x1640, mod(hash, f_q)) + mstore(0x1660, hash) +} + +{ + let x := calldataload(0x1420) + mstore(0x1680, x) + let y := calldataload(0x1440) + mstore(0x16a0, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x1460) + mstore(0x16c0, x) + let y := calldataload(0x1480) + mstore(0x16e0, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x14a0) + mstore(0x1700, x) + let y := calldataload(0x14c0) + mstore(0x1720, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x14e0) + mstore(0x1740, x) + let y := calldataload(0x1500) + mstore(0x1760, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x1520) + mstore(0x1780, x) + let y := calldataload(0x1540) + mstore(0x17a0, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x1560) + mstore(0x17c0, x) + let y := calldataload(0x1580) + mstore(0x17e0, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x15a0) + mstore(0x1800, x) + let y := calldataload(0x15c0) + mstore(0x1820, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x15e0) + mstore(0x1840, x) + let y := calldataload(0x1600) + mstore(0x1860, y) + success := and(validate_ec_point(x, y), success) +} + +{ + let x := calldataload(0x1620) + mstore(0x1880, x) + let y := calldataload(0x1640) + mstore(0x18a0, y) + success := and(validate_ec_point(x, y), success) +} +mstore(0x18c0, keccak256(0x1660, 608)) +{ + let hash := mload(0x18c0) + mstore(0x18e0, mod(hash, f_q)) + mstore(0x1900, hash) +} +mstore(0x1920, mulmod(mload(0xd00), mload(0xd00), f_q)) +mstore(0x1940, mulmod(mload(0x1920), mload(0x1920), f_q)) +mstore(0x1960, mulmod(mload(0x1940), mload(0x1940), f_q)) +mstore(0x1980, mulmod(mload(0x1960), mload(0x1960), f_q)) +mstore(0x19a0, mulmod(mload(0x1980), mload(0x1980), f_q)) +mstore(0x19c0, mulmod(mload(0x19a0), mload(0x19a0), f_q)) +mstore(0x19e0, mulmod(mload(0x19c0), mload(0x19c0), f_q)) +mstore(0x1a00, mulmod(mload(0x19e0), mload(0x19e0), f_q)) +mstore(0x1a20, mulmod(mload(0x1a00), mload(0x1a00), f_q)) +mstore(0x1a40, mulmod(mload(0x1a20), mload(0x1a20), f_q)) +mstore(0x1a60, mulmod(mload(0x1a40), mload(0x1a40), f_q)) +mstore(0x1a80, mulmod(mload(0x1a60), mload(0x1a60), f_q)) +mstore(0x1aa0, mulmod(mload(0x1a80), mload(0x1a80), f_q)) +mstore(0x1ac0, mulmod(mload(0x1aa0), mload(0x1aa0), f_q)) +mstore(0x1ae0, mulmod(mload(0x1ac0), mload(0x1ac0), f_q)) +mstore(0x1b00, mulmod(mload(0x1ae0), mload(0x1ae0), f_q)) +mstore(0x1b20, mulmod(mload(0x1b00), mload(0x1b00), f_q)) +mstore(0x1b40, mulmod(mload(0x1b20), mload(0x1b20), f_q)) +mstore(0x1b60, mulmod(mload(0x1b40), mload(0x1b40), f_q)) +mstore(0x1b80, mulmod(mload(0x1b60), mload(0x1b60), f_q)) +mstore(0x1ba0, mulmod(mload(0x1b80), mload(0x1b80), f_q)) +mstore(0x1bc0, addmod(mload(0x1ba0), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q)) +mstore(0x1be0, mulmod(mload(0x1bc0), 21888232434711746154598842647110004286396165347431605739555851272621938401409, f_q)) +mstore(0x1c00, mulmod(mload(0x1be0), 6363119021782681274480715230122258277189830284152385293217720612674619714422, f_q)) +mstore(0x1c20, addmod(mload(0xd00), 15525123850056593947765690515135016811358534116263649050480483573901188781195, f_q)) +mstore(0x1c40, mulmod(mload(0x1be0), 20975929243409798062839949658616274858986091382510192949221301676705706354487, f_q)) +mstore(0x1c60, addmod(mload(0xd00), 912313628429477159406456086641000229562273017905841394476902509870102141130, f_q)) +mstore(0x1c80, mulmod(mload(0x1be0), 495188420091111145957709789221178673495499187437761988132837836548330853701, f_q)) +mstore(0x1ca0, addmod(mload(0xd00), 21393054451748164076288695956036096415052865212978272355565366350027477641916, f_q)) +mstore(0x1cc0, mulmod(mload(0x1be0), 16064522944768515290584536219762686197737451920702130080538975732575755569557, f_q)) +mstore(0x1ce0, addmod(mload(0xd00), 5823719927070759931661869525494588890810912479713904263159228454000052926060, f_q)) +mstore(0x1d00, mulmod(mload(0x1be0), 14686510910986211321976396297238126901237973400949744736326777596334651355305, f_q)) +mstore(0x1d20, addmod(mload(0xd00), 7201731960853063900270009448019148187310390999466289607371426590241157140312, f_q)) +mstore(0x1d40, mulmod(mload(0x1be0), 10939663269433627367777756708678102241564365262857670666700619874077960926249, f_q)) +mstore(0x1d60, addmod(mload(0xd00), 10948579602405647854468649036579172846983999137558363676997584312497847569368, f_q)) +mstore(0x1d80, mulmod(mload(0x1be0), 15402826414547299628414612080036060696555554914079673875872749760617770134879, f_q)) +mstore(0x1da0, addmod(mload(0xd00), 6485416457291975593831793665221214391992809486336360467825454425958038360738, f_q)) +mstore(0x1dc0, mulmod(mload(0x1be0), 2785514556381676080176937710880804108647911392478702105860685610379369825016, f_q)) +mstore(0x1de0, addmod(mload(0xd00), 19102728315457599142069468034376470979900453007937332237837518576196438670601, f_q)) +mstore(0x1e00, mulmod(mload(0x1be0), 1, f_q)) +mstore(0x1e20, addmod(mload(0xd00), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q)) +mstore(0x1e40, mulmod(mload(0x1be0), 1426404432721484388505361748317961535523355871255605456897797744433766488507, f_q)) +mstore(0x1e60, addmod(mload(0xd00), 20461838439117790833741043996939313553025008529160428886800406442142042007110, f_q)) +{ + let prod := mload(0x1c20) + + prod := mulmod(mload(0x1c60), prod, f_q) + mstore(0x1e80, prod) + + prod := mulmod(mload(0x1ca0), prod, f_q) + mstore(0x1ea0, prod) + + prod := mulmod(mload(0x1ce0), prod, f_q) + mstore(0x1ec0, prod) + + prod := mulmod(mload(0x1d20), prod, f_q) + mstore(0x1ee0, prod) + + prod := mulmod(mload(0x1d60), prod, f_q) + mstore(0x1f00, prod) + + prod := mulmod(mload(0x1da0), prod, f_q) + mstore(0x1f20, prod) + + prod := mulmod(mload(0x1de0), prod, f_q) + mstore(0x1f40, prod) + + prod := mulmod(mload(0x1e20), prod, f_q) + mstore(0x1f60, prod) + + prod := mulmod(mload(0x1e60), prod, f_q) + mstore(0x1f80, prod) + + prod := mulmod(mload(0x1bc0), prod, f_q) + mstore(0x1fa0, prod) + +} +mstore(0x1fe0, 32) +mstore(0x2000, 32) +mstore(0x2020, 32) +mstore(0x2040, mload(0x1fa0)) +mstore(0x2060, 21888242871839275222246405745257275088548364400416034343698204186575808495615) +mstore(0x2080, 21888242871839275222246405745257275088548364400416034343698204186575808495617) +success := and(eq(staticcall(gas(), 0x5, 0x1fe0, 0xc0, 0x1fc0, 0x20), 1), success) +{ + + let inv := mload(0x1fc0) + let v + + v := mload(0x1bc0) + mstore(7104, mulmod(mload(0x1f80), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1e60) + mstore(7776, mulmod(mload(0x1f60), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1e20) + mstore(7712, mulmod(mload(0x1f40), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1de0) + mstore(7648, mulmod(mload(0x1f20), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1da0) + mstore(7584, mulmod(mload(0x1f00), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1d60) + mstore(7520, mulmod(mload(0x1ee0), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1d20) + mstore(7456, mulmod(mload(0x1ec0), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1ce0) + mstore(7392, mulmod(mload(0x1ea0), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1ca0) + mstore(7328, mulmod(mload(0x1e80), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x1c60) + mstore(7264, mulmod(mload(0x1c20), inv, f_q)) + inv := mulmod(v, inv, f_q) + mstore(0x1c20, inv) + +} +mstore(0x20a0, mulmod(mload(0x1c00), mload(0x1c20), f_q)) +mstore(0x20c0, mulmod(mload(0x1c40), mload(0x1c60), f_q)) +mstore(0x20e0, mulmod(mload(0x1c80), mload(0x1ca0), f_q)) +mstore(0x2100, mulmod(mload(0x1cc0), mload(0x1ce0), f_q)) +mstore(0x2120, mulmod(mload(0x1d00), mload(0x1d20), f_q)) +mstore(0x2140, mulmod(mload(0x1d40), mload(0x1d60), f_q)) +mstore(0x2160, mulmod(mload(0x1d80), mload(0x1da0), f_q)) +mstore(0x2180, mulmod(mload(0x1dc0), mload(0x1de0), f_q)) +mstore(0x21a0, mulmod(mload(0x1e00), mload(0x1e20), f_q)) +mstore(0x21c0, mulmod(mload(0x1e40), mload(0x1e60), f_q)) +{ + let result := mulmod(mload(0x21a0), mload(0x20), f_q) +result := addmod(mulmod(mload(0x21c0), mload(0x40), f_q), result, f_q) +mstore(8672, result) +} +mstore(0x2200, mulmod(100, mload(0xd60), f_q)) +mstore(0x2220, addmod(mload(0x2200), mload(0xdc0), f_q)) +mstore(0x2240, addmod(mload(0xda0), sub(f_q, mload(0x2220)), f_q)) +mstore(0x2260, mulmod(mload(0x2240), mload(0x1280), f_q)) +mstore(0x2280, mulmod(mload(0xaa0), mload(0x2260), f_q)) +mstore(0x22a0, addmod(mload(0xd60), sub(f_q, mload(0xd40)), f_q)) +mstore(0x22c0, mulmod(mload(0x22a0), mload(0x1260), f_q)) +mstore(0x22e0, addmod(mload(0x2280), mload(0x22c0), f_q)) +mstore(0x2300, mulmod(mload(0xaa0), mload(0x22e0), f_q)) +mstore(0x2320, addmod(mload(0xf60), sub(f_q, mload(0xd40)), f_q)) +mstore(0x2340, mulmod(mload(0x2320), mload(0x12a0), f_q)) +mstore(0x2360, addmod(mload(0x2300), mload(0x2340), f_q)) +mstore(0x2380, mulmod(mload(0xaa0), mload(0x2360), f_q)) +mstore(0x23a0, addmod(mload(0xf80), sub(f_q, mload(0xfa0)), f_q)) +mstore(0x23c0, mulmod(mload(0x23a0), mload(0x11e0), f_q)) +mstore(0x23e0, addmod(mload(0x2380), mload(0x23c0), f_q)) +mstore(0x2400, mulmod(mload(0xaa0), mload(0x23e0), f_q)) +mstore(0x2420, addmod(mload(0xfc0), sub(f_q, mload(0xfe0)), f_q)) +mstore(0x2440, mulmod(mload(0x2420), mload(0x11e0), f_q)) +mstore(0x2460, addmod(mload(0x2400), mload(0x2440), f_q)) +mstore(0x2480, mulmod(mload(0xaa0), mload(0x2460), f_q)) +mstore(0x24a0, addmod(1, sub(f_q, mload(0x11e0)), f_q)) +mstore(0x24c0, mulmod(mload(0x24a0), 1, f_q)) +mstore(0x24e0, addmod(1, sub(f_q, mload(0x1200)), f_q)) +mstore(0x2500, mulmod(mload(0x24e0), mload(0x24c0), f_q)) +mstore(0x2520, addmod(1, sub(f_q, mload(0x2500)), f_q)) +mstore(0x2540, addmod(mload(0x1000), sub(f_q, mload(0x1020)), f_q)) +mstore(0x2560, mulmod(mload(0x2540), mload(0x2520), f_q)) +mstore(0x2580, addmod(mload(0x2480), mload(0x2560), f_q)) +mstore(0x25a0, mulmod(mload(0xaa0), mload(0x2580), f_q)) +mstore(0x25c0, mulmod(mload(0xf80), mload(0x1200), f_q)) +mstore(0x25e0, mulmod(mload(0x1040), mload(0xf80), f_q)) +mstore(0x2600, addmod(1, sub(f_q, mload(0x25e0)), f_q)) +mstore(0x2620, mulmod(mload(0x2600), mload(0x25c0), f_q)) +mstore(0x2640, addmod(mload(0x25a0), mload(0x2620), f_q)) +mstore(0x2660, mulmod(mload(0xaa0), mload(0x2640), f_q)) +mstore(0x2680, mulmod(mload(0x1000), mload(0x2520), f_q)) +mstore(0x26a0, mulmod(mload(0x1060), mload(0x1000), f_q)) +mstore(0x26c0, addmod(1, sub(f_q, mload(0x26a0)), f_q)) +mstore(0x26e0, mulmod(mload(0x26c0), mload(0x2680), f_q)) +mstore(0x2700, addmod(mload(0x2660), mload(0x26e0), f_q)) +mstore(0x2720, mulmod(mload(0xaa0), mload(0x2700), f_q)) +mstore(0x2740, addmod(mload(0x10a0), sub(f_q, mload(0xf80)), f_q)) +mstore(0x2760, mulmod(mload(0x2740), mload(0x1200), f_q)) +mstore(0x2780, mulmod(mload(0x1080), mload(0x2740), f_q)) +mstore(0x27a0, addmod(1, sub(f_q, mload(0x2780)), f_q)) +mstore(0x27c0, mulmod(mload(0x27a0), mload(0x2760), f_q)) +mstore(0x27e0, addmod(mload(0x2720), mload(0x27c0), f_q)) +mstore(0x2800, mulmod(mload(0xaa0), mload(0x27e0), f_q)) +mstore(0x2820, mulmod(mload(0xfc0), mload(0x2600), f_q)) +mstore(0x2840, mulmod(mload(0x2820), mload(0x1200), f_q)) +mstore(0x2860, addmod(mload(0x2800), mload(0x2840), f_q)) +mstore(0x2880, mulmod(mload(0xaa0), mload(0x2860), f_q)) +mstore(0x28a0, mulmod(mload(0x10a0), mload(0x2600), f_q)) +mstore(0x28c0, mulmod(mload(0x28a0), mload(0x1200), f_q)) +mstore(0x28e0, addmod(mload(0x2880), mload(0x28c0), f_q)) +mstore(0x2900, mulmod(mload(0xaa0), mload(0x28e0), f_q)) +mstore(0x2920, mulmod(mload(0x1180), mload(0x2600), f_q)) +mstore(0x2940, mulmod(mload(0x2920), mload(0x1200), f_q)) +mstore(0x2960, addmod(mload(0x2900), mload(0x2940), f_q)) +mstore(0x2980, mulmod(mload(0xaa0), mload(0x2960), f_q)) +mstore(0x29a0, mulmod(mload(0x1140), mload(0x2600), f_q)) +mstore(0x29c0, mulmod(mload(0x29a0), mload(0x1200), f_q)) +mstore(0x29e0, addmod(mload(0x2980), mload(0x29c0), f_q)) +mstore(0x2a00, mulmod(mload(0xaa0), mload(0x29e0), f_q)) +mstore(0x2a20, addmod(1, sub(f_q, mload(0x2600)), f_q)) +mstore(0x2a40, mulmod(mload(0x2a20), mload(0x1200), f_q)) +mstore(0x2a60, addmod(mload(0x10e0), sub(f_q, mload(0xfc0)), f_q)) +mstore(0x2a80, addmod(mload(0x2a60), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q)) +mstore(0x2aa0, mulmod(mload(0x2a80), mload(0x27a0), f_q)) +mstore(0x2ac0, mulmod(mload(0x2aa0), mload(0x2a40), f_q)) +mstore(0x2ae0, addmod(mload(0x2a00), mload(0x2ac0), f_q)) +mstore(0x2b00, mulmod(mload(0xaa0), mload(0x2ae0), f_q)) +mstore(0x2b20, mulmod(mload(0x10e0), mload(0x2740), f_q)) +mstore(0x2b40, mulmod(mload(0x2b20), mload(0x2a40), f_q)) +mstore(0x2b60, addmod(mload(0x2b00), mload(0x2b40), f_q)) +mstore(0x2b80, mulmod(mload(0xaa0), mload(0x2b60), f_q)) +mstore(0x2ba0, addmod(mload(0x1160), sub(f_q, mload(0x1140)), f_q)) +mstore(0x2bc0, mulmod(mload(0x1120), mload(0x1100), f_q)) +mstore(0x2be0, addmod(1, sub(f_q, mload(0x2bc0)), f_q)) +mstore(0x2c00, mulmod(mload(0x2be0), 4, f_q)) +mstore(0x2c20, mulmod(mload(0x2bc0), 16, f_q)) +mstore(0x2c40, addmod(mload(0x2c00), mload(0x2c20), f_q)) +mstore(0x2c60, addmod(mload(0x2ba0), sub(f_q, mload(0x2c40)), f_q)) +mstore(0x2c80, mulmod(mload(0x2c60), mload(0x27a0), f_q)) +mstore(0x2ca0, mulmod(mload(0x2c80), mload(0x2a40), f_q)) +mstore(0x2cc0, addmod(mload(0x2b80), mload(0x2ca0), f_q)) +mstore(0x2ce0, mulmod(mload(0xaa0), mload(0x2cc0), f_q)) +mstore(0x2d00, mulmod(mload(0x10c0), mload(0x10a0), f_q)) +mstore(0x2d20, mulmod(mload(0x2740), mload(0x2d00), f_q)) +mstore(0x2d40, addmod(mload(0x1160), sub(f_q, mload(0x2c40)), f_q)) +mstore(0x2d60, mulmod(mload(0x2d40), mload(0x2d20), f_q)) +mstore(0x2d80, mulmod(mload(0x2d60), mload(0x2a40), f_q)) +mstore(0x2da0, addmod(mload(0x2ce0), mload(0x2d80), f_q)) +mstore(0x2dc0, mulmod(mload(0xaa0), mload(0x2da0), f_q)) +mstore(0x2de0, mulmod(mload(0x1180), mload(0x27a0), f_q)) +mstore(0x2e00, mulmod(mload(0x2de0), mload(0x2a40), f_q)) +mstore(0x2e20, addmod(mload(0x2dc0), mload(0x2e00), f_q)) +mstore(0x2e40, mulmod(mload(0xaa0), mload(0x2e20), f_q)) +mstore(0x2e60, addmod(mload(0x1180), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q)) +mstore(0x2e80, mulmod(mload(0x2e60), mload(0x2740), f_q)) +mstore(0x2ea0, mulmod(mload(0x2e80), mload(0x2a40), f_q)) +mstore(0x2ec0, addmod(mload(0x2e40), mload(0x2ea0), f_q)) +mstore(0x2ee0, mulmod(mload(0xaa0), mload(0x2ec0), f_q)) +mstore(0x2f00, mulmod(mload(0x2a20), mload(0x1220), f_q)) +mstore(0x2f20, addmod(mload(0xfc0), 21888242871839275222246405745257275088548364400416034343698204186575808495617, f_q)) +mstore(0x2f40, mulmod(mload(0x2f20), mload(0x2f00), f_q)) +mstore(0x2f60, addmod(mload(0x2ee0), mload(0x2f40), f_q)) +mstore(0x2f80, mulmod(mload(0xaa0), mload(0x2f60), f_q)) +mstore(0x2fa0, mulmod(mload(0x26c0), 4, f_q)) +mstore(0x2fc0, addmod(1, sub(f_q, mload(0x26c0)), f_q)) +mstore(0x2fe0, mulmod(mload(0x2fc0), 16, f_q)) +mstore(0x3000, addmod(mload(0x2fa0), mload(0x2fe0), f_q)) +mstore(0x3020, addmod(mload(0x1140), sub(f_q, mload(0x3000)), f_q)) +mstore(0x3040, mulmod(mload(0x3020), mload(0x2f00), f_q)) +mstore(0x3060, addmod(mload(0x2f80), mload(0x3040), f_q)) +mstore(0x3080, mulmod(mload(0xaa0), mload(0x3060), f_q)) +mstore(0x30a0, addmod(mload(0x11c0), 21888242871839275222246405745257275088548364400416034343698204186575808495609, f_q)) +mstore(0x30c0, mulmod(mload(0x30a0), mload(0x11e0), f_q)) +mstore(0x30e0, mulmod(mload(0x1040), mload(0x30a0), f_q)) +mstore(0x3100, addmod(1, sub(f_q, mload(0x30e0)), f_q)) +mstore(0x3120, mulmod(mload(0x3100), mload(0x30c0), f_q)) +mstore(0x3140, addmod(mload(0x3080), mload(0x3120), f_q)) +mstore(0x3160, mulmod(mload(0xaa0), mload(0x3140), f_q)) +mstore(0x3180, mulmod(mload(0x3100), mload(0x11e0), f_q)) +mstore(0x31a0, mulmod(mload(0x26c0), mload(0x3180), f_q)) +mstore(0x31c0, mulmod(mload(0x1100), mload(0x31a0), f_q)) +mstore(0x31e0, addmod(mload(0x3160), mload(0x31c0), f_q)) +mstore(0x3200, mulmod(mload(0xaa0), mload(0x31e0), f_q)) +mstore(0x3220, addmod(1, sub(f_q, mload(0x1360)), f_q)) +mstore(0x3240, mulmod(mload(0x3220), mload(0x21a0), f_q)) +mstore(0x3260, addmod(mload(0x3200), mload(0x3240), f_q)) +mstore(0x3280, mulmod(mload(0xaa0), mload(0x3260), f_q)) +mstore(0x32a0, mulmod(mload(0x1360), mload(0x1360), f_q)) +mstore(0x32c0, addmod(mload(0x32a0), sub(f_q, mload(0x1360)), f_q)) +mstore(0x32e0, mulmod(mload(0x32c0), mload(0x20a0), f_q)) +mstore(0x3300, addmod(mload(0x3280), mload(0x32e0), f_q)) +mstore(0x3320, mulmod(mload(0xaa0), mload(0x3300), f_q)) +mstore(0x3340, addmod(1, sub(f_q, mload(0x20a0)), f_q)) +mstore(0x3360, addmod(mload(0x20c0), mload(0x20e0), f_q)) +mstore(0x3380, addmod(mload(0x3360), mload(0x2100), f_q)) +mstore(0x33a0, addmod(mload(0x3380), mload(0x2120), f_q)) +mstore(0x33c0, addmod(mload(0x33a0), mload(0x2140), f_q)) +mstore(0x33e0, addmod(mload(0x33c0), mload(0x2160), f_q)) +mstore(0x3400, addmod(mload(0x33e0), mload(0x2180), f_q)) +mstore(0x3420, addmod(mload(0x3340), sub(f_q, mload(0x3400)), f_q)) +mstore(0x3440, mulmod(mload(0x12e0), mload(0x860), f_q)) +mstore(0x3460, addmod(mload(0xd40), mload(0x3440), f_q)) +mstore(0x3480, addmod(mload(0x3460), mload(0x8c0), f_q)) +mstore(0x34a0, mulmod(mload(0x1300), mload(0x860), f_q)) +mstore(0x34c0, addmod(mload(0xd60), mload(0x34a0), f_q)) +mstore(0x34e0, addmod(mload(0x34c0), mload(0x8c0), f_q)) +mstore(0x3500, mulmod(mload(0x34e0), mload(0x3480), f_q)) +mstore(0x3520, mulmod(mload(0x1320), mload(0x860), f_q)) +mstore(0x3540, addmod(mload(0xd80), mload(0x3520), f_q)) +mstore(0x3560, addmod(mload(0x3540), mload(0x8c0), f_q)) +mstore(0x3580, mulmod(mload(0x3560), mload(0x3500), f_q)) +mstore(0x35a0, mulmod(mload(0x1340), mload(0x860), f_q)) +mstore(0x35c0, addmod(mload(0x21e0), mload(0x35a0), f_q)) +mstore(0x35e0, addmod(mload(0x35c0), mload(0x8c0), f_q)) +mstore(0x3600, mulmod(mload(0x35e0), mload(0x3580), f_q)) +mstore(0x3620, mulmod(mload(0x3600), mload(0x1380), f_q)) +mstore(0x3640, mulmod(1, mload(0x860), f_q)) +mstore(0x3660, mulmod(mload(0xd00), mload(0x3640), f_q)) +mstore(0x3680, addmod(mload(0xd40), mload(0x3660), f_q)) +mstore(0x36a0, addmod(mload(0x3680), mload(0x8c0), f_q)) +mstore(0x36c0, mulmod(4131629893567559867359510883348571134090853742863529169391034518566172092834, mload(0x860), f_q)) +mstore(0x36e0, mulmod(mload(0xd00), mload(0x36c0), f_q)) +mstore(0x3700, addmod(mload(0xd60), mload(0x36e0), f_q)) +mstore(0x3720, addmod(mload(0x3700), mload(0x8c0), f_q)) +mstore(0x3740, mulmod(mload(0x3720), mload(0x36a0), f_q)) +mstore(0x3760, mulmod(8910878055287538404433155982483128285667088683464058436815641868457422632747, mload(0x860), f_q)) +mstore(0x3780, mulmod(mload(0xd00), mload(0x3760), f_q)) +mstore(0x37a0, addmod(mload(0xd80), mload(0x3780), f_q)) +mstore(0x37c0, addmod(mload(0x37a0), mload(0x8c0), f_q)) +mstore(0x37e0, mulmod(mload(0x37c0), mload(0x3740), f_q)) +mstore(0x3800, mulmod(11166246659983828508719468090013646171463329086121580628794302409516816350802, mload(0x860), f_q)) +mstore(0x3820, mulmod(mload(0xd00), mload(0x3800), f_q)) +mstore(0x3840, addmod(mload(0x21e0), mload(0x3820), f_q)) +mstore(0x3860, addmod(mload(0x3840), mload(0x8c0), f_q)) +mstore(0x3880, mulmod(mload(0x3860), mload(0x37e0), f_q)) +mstore(0x38a0, mulmod(mload(0x3880), mload(0x1360), f_q)) +mstore(0x38c0, addmod(mload(0x3620), sub(f_q, mload(0x38a0)), f_q)) +mstore(0x38e0, mulmod(mload(0x38c0), mload(0x3420), f_q)) +mstore(0x3900, addmod(mload(0x3320), mload(0x38e0), f_q)) +mstore(0x3920, mulmod(mload(0xaa0), mload(0x3900), f_q)) +mstore(0x3940, addmod(1, sub(f_q, mload(0x13a0)), f_q)) +mstore(0x3960, mulmod(mload(0x3940), mload(0x21a0), f_q)) +mstore(0x3980, addmod(mload(0x3920), mload(0x3960), f_q)) +mstore(0x39a0, mulmod(mload(0xaa0), mload(0x3980), f_q)) +mstore(0x39c0, mulmod(mload(0x13a0), mload(0x13a0), f_q)) +mstore(0x39e0, addmod(mload(0x39c0), sub(f_q, mload(0x13a0)), f_q)) +mstore(0x3a00, mulmod(mload(0x39e0), mload(0x20a0), f_q)) +mstore(0x3a20, addmod(mload(0x39a0), mload(0x3a00), f_q)) +mstore(0x3a40, mulmod(mload(0xaa0), mload(0x3a20), f_q)) +mstore(0x3a60, addmod(mload(0x13e0), mload(0x860), f_q)) +mstore(0x3a80, mulmod(mload(0x3a60), mload(0x13c0), f_q)) +mstore(0x3aa0, addmod(mload(0x1420), mload(0x8c0), f_q)) +mstore(0x3ac0, mulmod(mload(0x3aa0), mload(0x3a80), f_q)) +mstore(0x3ae0, mulmod(mload(0xd80), mload(0x1240), f_q)) +mstore(0x3b00, mulmod(mload(0x600), mload(0x3ae0), f_q)) +mstore(0x3b20, mulmod(mload(0xde0), mload(0x1240), f_q)) +mstore(0x3b40, addmod(mload(0x3b00), mload(0x3b20), f_q)) +mstore(0x3b60, mulmod(mload(0x600), mload(0x3b40), f_q)) +mstore(0x3b80, mulmod(mload(0xe00), mload(0x1240), f_q)) +mstore(0x3ba0, addmod(mload(0x3b60), mload(0x3b80), f_q)) +mstore(0x3bc0, addmod(mload(0x3ba0), mload(0x860), f_q)) +mstore(0x3be0, mulmod(mload(0x3bc0), mload(0x13a0), f_q)) +mstore(0x3c00, mulmod(mload(0x600), mload(0xe20), f_q)) +mstore(0x3c20, addmod(mload(0x3c00), mload(0xe40), f_q)) +mstore(0x3c40, mulmod(mload(0x600), mload(0x3c20), f_q)) +mstore(0x3c60, addmod(mload(0x3c40), mload(0xe60), f_q)) +mstore(0x3c80, addmod(mload(0x3c60), mload(0x8c0), f_q)) +mstore(0x3ca0, mulmod(mload(0x3c80), mload(0x3be0), f_q)) +mstore(0x3cc0, addmod(mload(0x3ac0), sub(f_q, mload(0x3ca0)), f_q)) +mstore(0x3ce0, mulmod(mload(0x3cc0), mload(0x3420), f_q)) +mstore(0x3d00, addmod(mload(0x3a40), mload(0x3ce0), f_q)) +mstore(0x3d20, mulmod(mload(0xaa0), mload(0x3d00), f_q)) +mstore(0x3d40, addmod(mload(0x13e0), sub(f_q, mload(0x1420)), f_q)) +mstore(0x3d60, mulmod(mload(0x3d40), mload(0x21a0), f_q)) +mstore(0x3d80, addmod(mload(0x3d20), mload(0x3d60), f_q)) +mstore(0x3da0, mulmod(mload(0xaa0), mload(0x3d80), f_q)) +mstore(0x3dc0, mulmod(mload(0x3d40), mload(0x3420), f_q)) +mstore(0x3de0, addmod(mload(0x13e0), sub(f_q, mload(0x1400)), f_q)) +mstore(0x3e00, mulmod(mload(0x3de0), mload(0x3dc0), f_q)) +mstore(0x3e20, addmod(mload(0x3da0), mload(0x3e00), f_q)) +mstore(0x3e40, mulmod(mload(0xaa0), mload(0x3e20), f_q)) +mstore(0x3e60, addmod(1, sub(f_q, mload(0x1440)), f_q)) +mstore(0x3e80, mulmod(mload(0x3e60), mload(0x21a0), f_q)) +mstore(0x3ea0, addmod(mload(0x3e40), mload(0x3e80), f_q)) +mstore(0x3ec0, mulmod(mload(0xaa0), mload(0x3ea0), f_q)) +mstore(0x3ee0, mulmod(mload(0x1440), mload(0x1440), f_q)) +mstore(0x3f00, addmod(mload(0x3ee0), sub(f_q, mload(0x1440)), f_q)) +mstore(0x3f20, mulmod(mload(0x3f00), mload(0x20a0), f_q)) +mstore(0x3f40, addmod(mload(0x3ec0), mload(0x3f20), f_q)) +mstore(0x3f60, mulmod(mload(0xaa0), mload(0x3f40), f_q)) +mstore(0x3f80, addmod(mload(0x1480), mload(0x860), f_q)) +mstore(0x3fa0, mulmod(mload(0x3f80), mload(0x1460), f_q)) +mstore(0x3fc0, addmod(mload(0x14c0), mload(0x8c0), f_q)) +mstore(0x3fe0, mulmod(mload(0x3fc0), mload(0x3fa0), f_q)) +mstore(0x4000, mulmod(mload(0x600), mload(0x1240), f_q)) +mstore(0x4020, addmod(mload(0x4000), mload(0x3b20), f_q)) +mstore(0x4040, mulmod(mload(0x600), mload(0x4020), f_q)) +mstore(0x4060, addmod(mload(0x4040), mload(0x3b80), f_q)) +mstore(0x4080, mulmod(mload(0x600), mload(0x4060), f_q)) +mstore(0x40a0, mulmod(mload(0xe80), mload(0x1240), f_q)) +mstore(0x40c0, addmod(mload(0x4080), mload(0x40a0), f_q)) +mstore(0x40e0, mulmod(mload(0x600), mload(0x40c0), f_q)) +mstore(0x4100, mulmod(mload(0xea0), mload(0x1240), f_q)) +mstore(0x4120, addmod(mload(0x40e0), mload(0x4100), f_q)) +mstore(0x4140, addmod(mload(0x4120), mload(0x860), f_q)) +mstore(0x4160, mulmod(mload(0x4140), mload(0x1440), f_q)) +mstore(0x4180, mulmod(mload(0x600), mload(0xec0), f_q)) +mstore(0x41a0, addmod(mload(0x4180), mload(0xee0), f_q)) +mstore(0x41c0, mulmod(mload(0x600), mload(0x41a0), f_q)) +mstore(0x41e0, addmod(mload(0x41c0), mload(0xf00), f_q)) +mstore(0x4200, mulmod(mload(0x600), mload(0x41e0), f_q)) +mstore(0x4220, addmod(mload(0x4200), mload(0xf20), f_q)) +mstore(0x4240, mulmod(mload(0x600), mload(0x4220), f_q)) +mstore(0x4260, addmod(mload(0x4240), mload(0xf40), f_q)) +mstore(0x4280, addmod(mload(0x4260), mload(0x8c0), f_q)) +mstore(0x42a0, mulmod(mload(0x4280), mload(0x4160), f_q)) +mstore(0x42c0, addmod(mload(0x3fe0), sub(f_q, mload(0x42a0)), f_q)) +mstore(0x42e0, mulmod(mload(0x42c0), mload(0x3420), f_q)) +mstore(0x4300, addmod(mload(0x3f60), mload(0x42e0), f_q)) +mstore(0x4320, mulmod(mload(0xaa0), mload(0x4300), f_q)) +mstore(0x4340, addmod(mload(0x1480), sub(f_q, mload(0x14c0)), f_q)) +mstore(0x4360, mulmod(mload(0x4340), mload(0x21a0), f_q)) +mstore(0x4380, addmod(mload(0x4320), mload(0x4360), f_q)) +mstore(0x43a0, mulmod(mload(0xaa0), mload(0x4380), f_q)) +mstore(0x43c0, mulmod(mload(0x4340), mload(0x3420), f_q)) +mstore(0x43e0, addmod(mload(0x1480), sub(f_q, mload(0x14a0)), f_q)) +mstore(0x4400, mulmod(mload(0x43e0), mload(0x43c0), f_q)) +mstore(0x4420, addmod(mload(0x43a0), mload(0x4400), f_q)) +mstore(0x4440, mulmod(mload(0xaa0), mload(0x4420), f_q)) +mstore(0x4460, addmod(1, sub(f_q, mload(0x14e0)), f_q)) +mstore(0x4480, mulmod(mload(0x4460), mload(0x21a0), f_q)) +mstore(0x44a0, addmod(mload(0x4440), mload(0x4480), f_q)) +mstore(0x44c0, mulmod(mload(0xaa0), mload(0x44a0), f_q)) +mstore(0x44e0, mulmod(mload(0x14e0), mload(0x14e0), f_q)) +mstore(0x4500, addmod(mload(0x44e0), sub(f_q, mload(0x14e0)), f_q)) +mstore(0x4520, mulmod(mload(0x4500), mload(0x20a0), f_q)) +mstore(0x4540, addmod(mload(0x44c0), mload(0x4520), f_q)) +mstore(0x4560, mulmod(mload(0xaa0), mload(0x4540), f_q)) +mstore(0x4580, addmod(mload(0x1520), mload(0x860), f_q)) +mstore(0x45a0, mulmod(mload(0x4580), mload(0x1500), f_q)) +mstore(0x45c0, addmod(mload(0x1560), mload(0x8c0), f_q)) +mstore(0x45e0, mulmod(mload(0x45c0), mload(0x45a0), f_q)) +mstore(0x4600, addmod(mload(0x2740), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q)) +mstore(0x4620, mulmod(mload(0x2d00), mload(0x4600), f_q)) +mstore(0x4640, mulmod(mload(0x2780), mload(0x4620), f_q)) +mstore(0x4660, addmod(mload(0x4640), mload(0x860), f_q)) +mstore(0x4680, mulmod(mload(0x4660), mload(0x14e0), f_q)) +mstore(0x46a0, addmod(mload(0x11a0), mload(0x8c0), f_q)) +mstore(0x46c0, mulmod(mload(0x46a0), mload(0x4680), f_q)) +mstore(0x46e0, addmod(mload(0x45e0), sub(f_q, mload(0x46c0)), f_q)) +mstore(0x4700, mulmod(mload(0x46e0), mload(0x3420), f_q)) +mstore(0x4720, addmod(mload(0x4560), mload(0x4700), f_q)) +mstore(0x4740, mulmod(mload(0xaa0), mload(0x4720), f_q)) +mstore(0x4760, addmod(mload(0x1520), sub(f_q, mload(0x1560)), f_q)) +mstore(0x4780, mulmod(mload(0x4760), mload(0x21a0), f_q)) +mstore(0x47a0, addmod(mload(0x4740), mload(0x4780), f_q)) +mstore(0x47c0, mulmod(mload(0xaa0), mload(0x47a0), f_q)) +mstore(0x47e0, mulmod(mload(0x4760), mload(0x3420), f_q)) +mstore(0x4800, addmod(mload(0x1520), sub(f_q, mload(0x1540)), f_q)) +mstore(0x4820, mulmod(mload(0x4800), mload(0x47e0), f_q)) +mstore(0x4840, addmod(mload(0x47c0), mload(0x4820), f_q)) +mstore(0x4860, mulmod(mload(0xaa0), mload(0x4840), f_q)) +mstore(0x4880, addmod(1, sub(f_q, mload(0x1580)), f_q)) +mstore(0x48a0, mulmod(mload(0x4880), mload(0x21a0), f_q)) +mstore(0x48c0, addmod(mload(0x4860), mload(0x48a0), f_q)) +mstore(0x48e0, mulmod(mload(0xaa0), mload(0x48c0), f_q)) +mstore(0x4900, mulmod(mload(0x1580), mload(0x1580), f_q)) +mstore(0x4920, addmod(mload(0x4900), sub(f_q, mload(0x1580)), f_q)) +mstore(0x4940, mulmod(mload(0x4920), mload(0x20a0), f_q)) +mstore(0x4960, addmod(mload(0x48e0), mload(0x4940), f_q)) +mstore(0x4980, mulmod(mload(0xaa0), mload(0x4960), f_q)) +mstore(0x49a0, addmod(mload(0x15c0), mload(0x860), f_q)) +mstore(0x49c0, mulmod(mload(0x49a0), mload(0x15a0), f_q)) +mstore(0x49e0, addmod(mload(0x1600), mload(0x8c0), f_q)) +mstore(0x4a00, mulmod(mload(0x49e0), mload(0x49c0), f_q)) +mstore(0x4a20, mulmod(mload(0x2fc0), mload(0x11e0), f_q)) +mstore(0x4a40, mulmod(mload(0x3100), mload(0x4a20), f_q)) +mstore(0x4a60, mulmod(mload(0xf80), mload(0x4a40), f_q)) +mstore(0x4a80, mulmod(mload(0x600), mload(0x4a60), f_q)) +mstore(0x4aa0, mulmod(1, mload(0x4a40), f_q)) +mstore(0x4ac0, addmod(mload(0x4a80), mload(0x4aa0), f_q)) +mstore(0x4ae0, mulmod(mload(0x600), mload(0x4ac0), f_q)) +mstore(0x4b00, mulmod(mload(0x1100), mload(0x4a40), f_q)) +mstore(0x4b20, addmod(mload(0x4ae0), mload(0x4b00), f_q)) +mstore(0x4b40, addmod(mload(0x4b20), mload(0x860), f_q)) +mstore(0x4b60, mulmod(mload(0x4b40), mload(0x1580), f_q)) +mstore(0x4b80, mulmod(mload(0x600), mload(0xf80), f_q)) +mstore(0x4ba0, addmod(mload(0x4b80), mload(0x1180), f_q)) +mstore(0x4bc0, mulmod(mload(0x600), mload(0x4ba0), f_q)) +mstore(0x4be0, addmod(mload(0x4bc0), mload(0x1140), f_q)) +mstore(0x4c00, addmod(mload(0x4be0), mload(0x8c0), f_q)) +mstore(0x4c20, mulmod(mload(0x4c00), mload(0x4b60), f_q)) +mstore(0x4c40, addmod(mload(0x4a00), sub(f_q, mload(0x4c20)), f_q)) +mstore(0x4c60, mulmod(mload(0x4c40), mload(0x3420), f_q)) +mstore(0x4c80, addmod(mload(0x4980), mload(0x4c60), f_q)) +mstore(0x4ca0, mulmod(mload(0xaa0), mload(0x4c80), f_q)) +mstore(0x4cc0, addmod(mload(0x15c0), sub(f_q, mload(0x1600)), f_q)) +mstore(0x4ce0, mulmod(mload(0x4cc0), mload(0x21a0), f_q)) +mstore(0x4d00, addmod(mload(0x4ca0), mload(0x4ce0), f_q)) +mstore(0x4d20, mulmod(mload(0xaa0), mload(0x4d00), f_q)) +mstore(0x4d40, mulmod(mload(0x4cc0), mload(0x3420), f_q)) +mstore(0x4d60, addmod(mload(0x15c0), sub(f_q, mload(0x15e0)), f_q)) +mstore(0x4d80, mulmod(mload(0x4d60), mload(0x4d40), f_q)) +mstore(0x4da0, addmod(mload(0x4d20), mload(0x4d80), f_q)) +mstore(0x4dc0, mulmod(mload(0x1ba0), mload(0x1ba0), f_q)) +mstore(0x4de0, mulmod(mload(0x4dc0), mload(0x1ba0), f_q)) +mstore(0x4e00, mulmod(mload(0x4de0), mload(0x1ba0), f_q)) +mstore(0x4e20, mulmod(mload(0x4e00), mload(0x1ba0), f_q)) +mstore(0x4e40, mulmod(mload(0x4e20), mload(0x1ba0), f_q)) +mstore(0x4e60, mulmod(mload(0x4e40), mload(0x1ba0), f_q)) +mstore(0x4e80, mulmod(mload(0x4e60), mload(0x1ba0), f_q)) +mstore(0x4ea0, mulmod(1, mload(0x1ba0), f_q)) +mstore(0x4ec0, mulmod(1, mload(0x4dc0), f_q)) +mstore(0x4ee0, mulmod(1, mload(0x4de0), f_q)) +mstore(0x4f00, mulmod(1, mload(0x4e00), f_q)) +mstore(0x4f20, mulmod(1, mload(0x4e20), f_q)) +mstore(0x4f40, mulmod(1, mload(0x4e40), f_q)) +mstore(0x4f60, mulmod(1, mload(0x4e60), f_q)) +mstore(0x4f80, mulmod(mload(0x4da0), mload(0x1bc0), f_q)) +mstore(0x4fa0, mulmod(mload(0x18e0), mload(0x18e0), f_q)) +mstore(0x4fc0, mulmod(mload(0x4fa0), mload(0x18e0), f_q)) +mstore(0x4fe0, mulmod(mload(0x4fc0), mload(0x18e0), f_q)) +mstore(0x5000, mulmod(mload(0x4fe0), mload(0x18e0), f_q)) +mstore(0x5020, mulmod(mload(0x5000), mload(0x18e0), f_q)) +mstore(0x5040, mulmod(mload(0x5020), mload(0x18e0), f_q)) +mstore(0x5060, mulmod(mload(0x5040), mload(0x18e0), f_q)) +mstore(0x5080, mulmod(mload(0x5060), mload(0x18e0), f_q)) +mstore(0x50a0, mulmod(mload(0x1640), mload(0x1640), f_q)) +mstore(0x50c0, mulmod(mload(0x50a0), mload(0x1640), f_q)) +mstore(0x50e0, mulmod(mload(0x50c0), mload(0x1640), f_q)) +mstore(0x5100, mulmod(mload(0x50e0), mload(0x1640), f_q)) +mstore(0x5120, mulmod(mload(0x5100), mload(0x1640), f_q)) +mstore(0x5140, mulmod(mload(0x5120), mload(0x1640), f_q)) +mstore(0x5160, mulmod(mload(0x5140), mload(0x1640), f_q)) +mstore(0x5180, mulmod(mload(0x5160), mload(0x1640), f_q)) +mstore(0x51a0, mulmod(mload(0x5180), mload(0x1640), f_q)) +mstore(0x51c0, mulmod(mload(0x51a0), mload(0x1640), f_q)) +mstore(0x51e0, mulmod(mload(0x51c0), mload(0x1640), f_q)) +mstore(0x5200, mulmod(mload(0x51e0), mload(0x1640), f_q)) +mstore(0x5220, mulmod(mload(0x5200), mload(0x1640), f_q)) +mstore(0x5240, mulmod(mload(0x5220), mload(0x1640), f_q)) +mstore(0x5260, mulmod(mload(0x5240), mload(0x1640), f_q)) +mstore(0x5280, mulmod(mload(0x5260), mload(0x1640), f_q)) +mstore(0x52a0, mulmod(mload(0x5280), mload(0x1640), f_q)) +mstore(0x52c0, mulmod(mload(0x52a0), mload(0x1640), f_q)) +mstore(0x52e0, mulmod(mload(0x52c0), mload(0x1640), f_q)) +mstore(0x5300, mulmod(mload(0x52e0), mload(0x1640), f_q)) +mstore(0x5320, mulmod(mload(0x5300), mload(0x1640), f_q)) +mstore(0x5340, mulmod(mload(0x5320), mload(0x1640), f_q)) +mstore(0x5360, mulmod(mload(0x5340), mload(0x1640), f_q)) +mstore(0x5380, mulmod(mload(0x5360), mload(0x1640), f_q)) +mstore(0x53a0, mulmod(mload(0x5380), mload(0x1640), f_q)) +mstore(0x53c0, mulmod(mload(0x53a0), mload(0x1640), f_q)) +mstore(0x53e0, mulmod(mload(0x53c0), mload(0x1640), f_q)) +mstore(0x5400, mulmod(mload(0x53e0), mload(0x1640), f_q)) +mstore(0x5420, mulmod(mload(0x5400), mload(0x1640), f_q)) +mstore(0x5440, mulmod(mload(0x5420), mload(0x1640), f_q)) +mstore(0x5460, mulmod(mload(0x5440), mload(0x1640), f_q)) +mstore(0x5480, mulmod(mload(0x5460), mload(0x1640), f_q)) +mstore(0x54a0, mulmod(mload(0x5480), mload(0x1640), f_q)) +mstore(0x54c0, mulmod(mload(0x54a0), mload(0x1640), f_q)) +mstore(0x54e0, mulmod(mload(0x54c0), mload(0x1640), f_q)) +mstore(0x5500, mulmod(mload(0x54e0), mload(0x1640), f_q)) +mstore(0x5520, mulmod(mload(0x5500), mload(0x1640), f_q)) +mstore(0x5540, mulmod(mload(0x5520), mload(0x1640), f_q)) +mstore(0x5560, mulmod(mload(0x5540), mload(0x1640), f_q)) +mstore(0x5580, mulmod(mload(0x5560), mload(0x1640), f_q)) +mstore(0x55a0, mulmod(mload(0x5580), mload(0x1640), f_q)) +mstore(0x55c0, mulmod(mload(0x55a0), mload(0x1640), f_q)) +mstore(0x55e0, mulmod(mload(0x55c0), mload(0x1640), f_q)) +mstore(0x5600, mulmod(mload(0x55e0), mload(0x1640), f_q)) +mstore(0x5620, mulmod(mload(0x5600), mload(0x1640), f_q)) +mstore(0x5640, mulmod(mload(0x5620), mload(0x1640), f_q)) +mstore(0x5660, mulmod(mload(0x5640), mload(0x1640), f_q)) +mstore(0x5680, mulmod(sub(f_q, mload(0xd40)), 1, f_q)) +mstore(0x56a0, mulmod(sub(f_q, mload(0xd60)), mload(0x1640), f_q)) +mstore(0x56c0, mulmod(1, mload(0x1640), f_q)) +mstore(0x56e0, addmod(mload(0x5680), mload(0x56a0), f_q)) +mstore(0x5700, mulmod(sub(f_q, mload(0xd80)), mload(0x50a0), f_q)) +mstore(0x5720, mulmod(1, mload(0x50a0), f_q)) +mstore(0x5740, addmod(mload(0x56e0), mload(0x5700), f_q)) +mstore(0x5760, mulmod(sub(f_q, mload(0xe20)), mload(0x50c0), f_q)) +mstore(0x5780, mulmod(1, mload(0x50c0), f_q)) +mstore(0x57a0, addmod(mload(0x5740), mload(0x5760), f_q)) +mstore(0x57c0, mulmod(sub(f_q, mload(0xe40)), mload(0x50e0), f_q)) +mstore(0x57e0, mulmod(1, mload(0x50e0), f_q)) +mstore(0x5800, addmod(mload(0x57a0), mload(0x57c0), f_q)) +mstore(0x5820, mulmod(sub(f_q, mload(0xe60)), mload(0x5100), f_q)) +mstore(0x5840, mulmod(1, mload(0x5100), f_q)) +mstore(0x5860, addmod(mload(0x5800), mload(0x5820), f_q)) +mstore(0x5880, mulmod(sub(f_q, mload(0xec0)), mload(0x5120), f_q)) +mstore(0x58a0, mulmod(1, mload(0x5120), f_q)) +mstore(0x58c0, addmod(mload(0x5860), mload(0x5880), f_q)) +mstore(0x58e0, mulmod(sub(f_q, mload(0xee0)), mload(0x5140), f_q)) +mstore(0x5900, mulmod(1, mload(0x5140), f_q)) +mstore(0x5920, addmod(mload(0x58c0), mload(0x58e0), f_q)) +mstore(0x5940, mulmod(sub(f_q, mload(0xf00)), mload(0x5160), f_q)) +mstore(0x5960, mulmod(1, mload(0x5160), f_q)) +mstore(0x5980, addmod(mload(0x5920), mload(0x5940), f_q)) +mstore(0x59a0, mulmod(sub(f_q, mload(0xf20)), mload(0x5180), f_q)) +mstore(0x59c0, mulmod(1, mload(0x5180), f_q)) +mstore(0x59e0, addmod(mload(0x5980), mload(0x59a0), f_q)) +mstore(0x5a00, mulmod(sub(f_q, mload(0xf40)), mload(0x51a0), f_q)) +mstore(0x5a20, mulmod(1, mload(0x51a0), f_q)) +mstore(0x5a40, addmod(mload(0x59e0), mload(0x5a00), f_q)) +mstore(0x5a60, mulmod(sub(f_q, mload(0xf60)), mload(0x51c0), f_q)) +mstore(0x5a80, mulmod(1, mload(0x51c0), f_q)) +mstore(0x5aa0, addmod(mload(0x5a40), mload(0x5a60), f_q)) +mstore(0x5ac0, mulmod(sub(f_q, mload(0xf80)), mload(0x51e0), f_q)) +mstore(0x5ae0, mulmod(1, mload(0x51e0), f_q)) +mstore(0x5b00, addmod(mload(0x5aa0), mload(0x5ac0), f_q)) +mstore(0x5b20, mulmod(sub(f_q, mload(0xfc0)), mload(0x5200), f_q)) +mstore(0x5b40, mulmod(1, mload(0x5200), f_q)) +mstore(0x5b60, addmod(mload(0x5b00), mload(0x5b20), f_q)) +mstore(0x5b80, mulmod(sub(f_q, mload(0x1000)), mload(0x5220), f_q)) +mstore(0x5ba0, mulmod(1, mload(0x5220), f_q)) +mstore(0x5bc0, addmod(mload(0x5b60), mload(0x5b80), f_q)) +mstore(0x5be0, mulmod(sub(f_q, mload(0x1040)), mload(0x5240), f_q)) +mstore(0x5c00, mulmod(1, mload(0x5240), f_q)) +mstore(0x5c20, addmod(mload(0x5bc0), mload(0x5be0), f_q)) +mstore(0x5c40, mulmod(sub(f_q, mload(0x1060)), mload(0x5260), f_q)) +mstore(0x5c60, mulmod(1, mload(0x5260), f_q)) +mstore(0x5c80, addmod(mload(0x5c20), mload(0x5c40), f_q)) +mstore(0x5ca0, mulmod(sub(f_q, mload(0x1080)), mload(0x5280), f_q)) +mstore(0x5cc0, mulmod(1, mload(0x5280), f_q)) +mstore(0x5ce0, addmod(mload(0x5c80), mload(0x5ca0), f_q)) +mstore(0x5d00, mulmod(sub(f_q, mload(0x1140)), mload(0x52a0), f_q)) +mstore(0x5d20, mulmod(1, mload(0x52a0), f_q)) +mstore(0x5d40, addmod(mload(0x5ce0), mload(0x5d00), f_q)) +mstore(0x5d60, mulmod(sub(f_q, mload(0x1180)), mload(0x52c0), f_q)) +mstore(0x5d80, mulmod(1, mload(0x52c0), f_q)) +mstore(0x5da0, addmod(mload(0x5d40), mload(0x5d60), f_q)) +mstore(0x5dc0, mulmod(sub(f_q, mload(0x1360)), mload(0x52e0), f_q)) +mstore(0x5de0, mulmod(1, mload(0x52e0), f_q)) +mstore(0x5e00, addmod(mload(0x5da0), mload(0x5dc0), f_q)) +mstore(0x5e20, mulmod(sub(f_q, mload(0x13a0)), mload(0x5300), f_q)) +mstore(0x5e40, mulmod(1, mload(0x5300), f_q)) +mstore(0x5e60, addmod(mload(0x5e00), mload(0x5e20), f_q)) +mstore(0x5e80, mulmod(sub(f_q, mload(0x13e0)), mload(0x5320), f_q)) +mstore(0x5ea0, mulmod(1, mload(0x5320), f_q)) +mstore(0x5ec0, addmod(mload(0x5e60), mload(0x5e80), f_q)) +mstore(0x5ee0, mulmod(sub(f_q, mload(0x1420)), mload(0x5340), f_q)) +mstore(0x5f00, mulmod(1, mload(0x5340), f_q)) +mstore(0x5f20, addmod(mload(0x5ec0), mload(0x5ee0), f_q)) +mstore(0x5f40, mulmod(sub(f_q, mload(0x1440)), mload(0x5360), f_q)) +mstore(0x5f60, mulmod(1, mload(0x5360), f_q)) +mstore(0x5f80, addmod(mload(0x5f20), mload(0x5f40), f_q)) +mstore(0x5fa0, mulmod(sub(f_q, mload(0x1480)), mload(0x5380), f_q)) +mstore(0x5fc0, mulmod(1, mload(0x5380), f_q)) +mstore(0x5fe0, addmod(mload(0x5f80), mload(0x5fa0), f_q)) +mstore(0x6000, mulmod(sub(f_q, mload(0x14c0)), mload(0x53a0), f_q)) +mstore(0x6020, mulmod(1, mload(0x53a0), f_q)) +mstore(0x6040, addmod(mload(0x5fe0), mload(0x6000), f_q)) +mstore(0x6060, mulmod(sub(f_q, mload(0x14e0)), mload(0x53c0), f_q)) +mstore(0x6080, mulmod(1, mload(0x53c0), f_q)) +mstore(0x60a0, addmod(mload(0x6040), mload(0x6060), f_q)) +mstore(0x60c0, mulmod(sub(f_q, mload(0x1520)), mload(0x53e0), f_q)) +mstore(0x60e0, mulmod(1, mload(0x53e0), f_q)) +mstore(0x6100, addmod(mload(0x60a0), mload(0x60c0), f_q)) +mstore(0x6120, mulmod(sub(f_q, mload(0x1560)), mload(0x5400), f_q)) +mstore(0x6140, mulmod(1, mload(0x5400), f_q)) +mstore(0x6160, addmod(mload(0x6100), mload(0x6120), f_q)) +mstore(0x6180, mulmod(sub(f_q, mload(0x1580)), mload(0x5420), f_q)) +mstore(0x61a0, mulmod(1, mload(0x5420), f_q)) +mstore(0x61c0, addmod(mload(0x6160), mload(0x6180), f_q)) +mstore(0x61e0, mulmod(sub(f_q, mload(0x15c0)), mload(0x5440), f_q)) +mstore(0x6200, mulmod(1, mload(0x5440), f_q)) +mstore(0x6220, addmod(mload(0x61c0), mload(0x61e0), f_q)) +mstore(0x6240, mulmod(sub(f_q, mload(0x1600)), mload(0x5460), f_q)) +mstore(0x6260, mulmod(1, mload(0x5460), f_q)) +mstore(0x6280, addmod(mload(0x6220), mload(0x6240), f_q)) +mstore(0x62a0, mulmod(sub(f_q, mload(0x11a0)), mload(0x5480), f_q)) +mstore(0x62c0, mulmod(1, mload(0x5480), f_q)) +mstore(0x62e0, addmod(mload(0x6280), mload(0x62a0), f_q)) +mstore(0x6300, mulmod(sub(f_q, mload(0x11c0)), mload(0x54a0), f_q)) +mstore(0x6320, mulmod(1, mload(0x54a0), f_q)) +mstore(0x6340, addmod(mload(0x62e0), mload(0x6300), f_q)) +mstore(0x6360, mulmod(sub(f_q, mload(0x11e0)), mload(0x54c0), f_q)) +mstore(0x6380, mulmod(1, mload(0x54c0), f_q)) +mstore(0x63a0, addmod(mload(0x6340), mload(0x6360), f_q)) +mstore(0x63c0, mulmod(sub(f_q, mload(0x1200)), mload(0x54e0), f_q)) +mstore(0x63e0, mulmod(1, mload(0x54e0), f_q)) +mstore(0x6400, addmod(mload(0x63a0), mload(0x63c0), f_q)) +mstore(0x6420, mulmod(sub(f_q, mload(0x1220)), mload(0x5500), f_q)) +mstore(0x6440, mulmod(1, mload(0x5500), f_q)) +mstore(0x6460, addmod(mload(0x6400), mload(0x6420), f_q)) +mstore(0x6480, mulmod(sub(f_q, mload(0x1240)), mload(0x5520), f_q)) +mstore(0x64a0, mulmod(1, mload(0x5520), f_q)) +mstore(0x64c0, addmod(mload(0x6460), mload(0x6480), f_q)) +mstore(0x64e0, mulmod(sub(f_q, mload(0x1260)), mload(0x5540), f_q)) +mstore(0x6500, mulmod(1, mload(0x5540), f_q)) +mstore(0x6520, addmod(mload(0x64c0), mload(0x64e0), f_q)) +mstore(0x6540, mulmod(sub(f_q, mload(0x1280)), mload(0x5560), f_q)) +mstore(0x6560, mulmod(1, mload(0x5560), f_q)) +mstore(0x6580, addmod(mload(0x6520), mload(0x6540), f_q)) +mstore(0x65a0, mulmod(sub(f_q, mload(0x12a0)), mload(0x5580), f_q)) +mstore(0x65c0, mulmod(1, mload(0x5580), f_q)) +mstore(0x65e0, addmod(mload(0x6580), mload(0x65a0), f_q)) +mstore(0x6600, mulmod(sub(f_q, mload(0x12e0)), mload(0x55a0), f_q)) +mstore(0x6620, mulmod(1, mload(0x55a0), f_q)) +mstore(0x6640, addmod(mload(0x65e0), mload(0x6600), f_q)) +mstore(0x6660, mulmod(sub(f_q, mload(0x1300)), mload(0x55c0), f_q)) +mstore(0x6680, mulmod(1, mload(0x55c0), f_q)) +mstore(0x66a0, addmod(mload(0x6640), mload(0x6660), f_q)) +mstore(0x66c0, mulmod(sub(f_q, mload(0x1320)), mload(0x55e0), f_q)) +mstore(0x66e0, mulmod(1, mload(0x55e0), f_q)) +mstore(0x6700, addmod(mload(0x66a0), mload(0x66c0), f_q)) +mstore(0x6720, mulmod(sub(f_q, mload(0x1340)), mload(0x5600), f_q)) +mstore(0x6740, mulmod(1, mload(0x5600), f_q)) +mstore(0x6760, addmod(mload(0x6700), mload(0x6720), f_q)) +mstore(0x6780, mulmod(sub(f_q, mload(0x4f80)), mload(0x5620), f_q)) +mstore(0x67a0, mulmod(1, mload(0x5620), f_q)) +mstore(0x67c0, mulmod(mload(0x4ea0), mload(0x5620), f_q)) +mstore(0x67e0, mulmod(mload(0x4ec0), mload(0x5620), f_q)) +mstore(0x6800, mulmod(mload(0x4ee0), mload(0x5620), f_q)) +mstore(0x6820, mulmod(mload(0x4f00), mload(0x5620), f_q)) +mstore(0x6840, mulmod(mload(0x4f20), mload(0x5620), f_q)) +mstore(0x6860, mulmod(mload(0x4f40), mload(0x5620), f_q)) +mstore(0x6880, mulmod(mload(0x4f60), mload(0x5620), f_q)) +mstore(0x68a0, addmod(mload(0x6760), mload(0x6780), f_q)) +mstore(0x68c0, mulmod(sub(f_q, mload(0x12c0)), mload(0x5640), f_q)) +mstore(0x68e0, mulmod(1, mload(0x5640), f_q)) +mstore(0x6900, addmod(mload(0x68a0), mload(0x68c0), f_q)) +mstore(0x6920, mulmod(mload(0x6900), 1, f_q)) +mstore(0x6940, mulmod(mload(0x56c0), 1, f_q)) +mstore(0x6960, mulmod(mload(0x5720), 1, f_q)) +mstore(0x6980, mulmod(mload(0x5780), 1, f_q)) +mstore(0x69a0, mulmod(mload(0x57e0), 1, f_q)) +mstore(0x69c0, mulmod(mload(0x5840), 1, f_q)) +mstore(0x69e0, mulmod(mload(0x58a0), 1, f_q)) +mstore(0x6a00, mulmod(mload(0x5900), 1, f_q)) +mstore(0x6a20, mulmod(mload(0x5960), 1, f_q)) +mstore(0x6a40, mulmod(mload(0x59c0), 1, f_q)) +mstore(0x6a60, mulmod(mload(0x5a20), 1, f_q)) +mstore(0x6a80, mulmod(mload(0x5a80), 1, f_q)) +mstore(0x6aa0, mulmod(mload(0x5ae0), 1, f_q)) +mstore(0x6ac0, mulmod(mload(0x5b40), 1, f_q)) +mstore(0x6ae0, mulmod(mload(0x5ba0), 1, f_q)) +mstore(0x6b00, mulmod(mload(0x5c00), 1, f_q)) +mstore(0x6b20, mulmod(mload(0x5c60), 1, f_q)) +mstore(0x6b40, mulmod(mload(0x5cc0), 1, f_q)) +mstore(0x6b60, mulmod(mload(0x5d20), 1, f_q)) +mstore(0x6b80, mulmod(mload(0x5d80), 1, f_q)) +mstore(0x6ba0, mulmod(mload(0x5de0), 1, f_q)) +mstore(0x6bc0, mulmod(mload(0x5e40), 1, f_q)) +mstore(0x6be0, mulmod(mload(0x5ea0), 1, f_q)) +mstore(0x6c00, mulmod(mload(0x5f00), 1, f_q)) +mstore(0x6c20, mulmod(mload(0x5f60), 1, f_q)) +mstore(0x6c40, mulmod(mload(0x5fc0), 1, f_q)) +mstore(0x6c60, mulmod(mload(0x6020), 1, f_q)) +mstore(0x6c80, mulmod(mload(0x6080), 1, f_q)) +mstore(0x6ca0, mulmod(mload(0x60e0), 1, f_q)) +mstore(0x6cc0, mulmod(mload(0x6140), 1, f_q)) +mstore(0x6ce0, mulmod(mload(0x61a0), 1, f_q)) +mstore(0x6d00, mulmod(mload(0x6200), 1, f_q)) +mstore(0x6d20, mulmod(mload(0x6260), 1, f_q)) +mstore(0x6d40, mulmod(mload(0x62c0), 1, f_q)) +mstore(0x6d60, mulmod(mload(0x6320), 1, f_q)) +mstore(0x6d80, mulmod(mload(0x6380), 1, f_q)) +mstore(0x6da0, mulmod(mload(0x63e0), 1, f_q)) +mstore(0x6dc0, mulmod(mload(0x6440), 1, f_q)) +mstore(0x6de0, mulmod(mload(0x64a0), 1, f_q)) +mstore(0x6e00, mulmod(mload(0x6500), 1, f_q)) +mstore(0x6e20, mulmod(mload(0x6560), 1, f_q)) +mstore(0x6e40, mulmod(mload(0x65c0), 1, f_q)) +mstore(0x6e60, mulmod(mload(0x6620), 1, f_q)) +mstore(0x6e80, mulmod(mload(0x6680), 1, f_q)) +mstore(0x6ea0, mulmod(mload(0x66e0), 1, f_q)) +mstore(0x6ec0, mulmod(mload(0x6740), 1, f_q)) +mstore(0x6ee0, mulmod(mload(0x67a0), 1, f_q)) +mstore(0x6f00, mulmod(mload(0x67c0), 1, f_q)) +mstore(0x6f20, mulmod(mload(0x67e0), 1, f_q)) +mstore(0x6f40, mulmod(mload(0x6800), 1, f_q)) +mstore(0x6f60, mulmod(mload(0x6820), 1, f_q)) +mstore(0x6f80, mulmod(mload(0x6840), 1, f_q)) +mstore(0x6fa0, mulmod(mload(0x6860), 1, f_q)) +mstore(0x6fc0, mulmod(mload(0x6880), 1, f_q)) +mstore(0x6fe0, mulmod(mload(0x68e0), 1, f_q)) +mstore(0x7000, mulmod(sub(f_q, mload(0xda0)), 1, f_q)) +mstore(0x7020, mulmod(sub(f_q, mload(0xdc0)), mload(0x1640), f_q)) +mstore(0x7040, addmod(mload(0x7000), mload(0x7020), f_q)) +mstore(0x7060, mulmod(sub(f_q, mload(0xde0)), mload(0x50a0), f_q)) +mstore(0x7080, addmod(mload(0x7040), mload(0x7060), f_q)) +mstore(0x70a0, mulmod(sub(f_q, mload(0x10a0)), mload(0x50c0), f_q)) +mstore(0x70c0, addmod(mload(0x7080), mload(0x70a0), f_q)) +mstore(0x70e0, mulmod(sub(f_q, mload(0x10c0)), mload(0x50e0), f_q)) +mstore(0x7100, addmod(mload(0x70c0), mload(0x70e0), f_q)) +mstore(0x7120, mulmod(sub(f_q, mload(0x10e0)), mload(0x5100), f_q)) +mstore(0x7140, addmod(mload(0x7100), mload(0x7120), f_q)) +mstore(0x7160, mulmod(sub(f_q, mload(0x1100)), mload(0x5120), f_q)) +mstore(0x7180, addmod(mload(0x7140), mload(0x7160), f_q)) +mstore(0x71a0, mulmod(sub(f_q, mload(0x1120)), mload(0x5140), f_q)) +mstore(0x71c0, addmod(mload(0x7180), mload(0x71a0), f_q)) +mstore(0x71e0, mulmod(sub(f_q, mload(0x1160)), mload(0x5160), f_q)) +mstore(0x7200, addmod(mload(0x71c0), mload(0x71e0), f_q)) +mstore(0x7220, mulmod(sub(f_q, mload(0x1380)), mload(0x5180), f_q)) +mstore(0x7240, addmod(mload(0x7200), mload(0x7220), f_q)) +mstore(0x7260, mulmod(sub(f_q, mload(0x13c0)), mload(0x51a0), f_q)) +mstore(0x7280, addmod(mload(0x7240), mload(0x7260), f_q)) +mstore(0x72a0, mulmod(sub(f_q, mload(0x1460)), mload(0x51c0), f_q)) +mstore(0x72c0, addmod(mload(0x7280), mload(0x72a0), f_q)) +mstore(0x72e0, mulmod(sub(f_q, mload(0x1500)), mload(0x51e0), f_q)) +mstore(0x7300, addmod(mload(0x72c0), mload(0x72e0), f_q)) +mstore(0x7320, mulmod(sub(f_q, mload(0x15a0)), mload(0x5200), f_q)) +mstore(0x7340, addmod(mload(0x7300), mload(0x7320), f_q)) +mstore(0x7360, mulmod(mload(0x7340), mload(0x18e0), f_q)) +mstore(0x7380, mulmod(1, mload(0x18e0), f_q)) +mstore(0x73a0, mulmod(mload(0x56c0), mload(0x18e0), f_q)) +mstore(0x73c0, mulmod(mload(0x5720), mload(0x18e0), f_q)) +mstore(0x73e0, mulmod(mload(0x5780), mload(0x18e0), f_q)) +mstore(0x7400, mulmod(mload(0x57e0), mload(0x18e0), f_q)) +mstore(0x7420, mulmod(mload(0x5840), mload(0x18e0), f_q)) +mstore(0x7440, mulmod(mload(0x58a0), mload(0x18e0), f_q)) +mstore(0x7460, mulmod(mload(0x5900), mload(0x18e0), f_q)) +mstore(0x7480, mulmod(mload(0x5960), mload(0x18e0), f_q)) +mstore(0x74a0, mulmod(mload(0x59c0), mload(0x18e0), f_q)) +mstore(0x74c0, mulmod(mload(0x5a20), mload(0x18e0), f_q)) +mstore(0x74e0, mulmod(mload(0x5a80), mload(0x18e0), f_q)) +mstore(0x7500, mulmod(mload(0x5ae0), mload(0x18e0), f_q)) +mstore(0x7520, mulmod(mload(0x5b40), mload(0x18e0), f_q)) +mstore(0x7540, addmod(mload(0x6920), mload(0x7360), f_q)) +mstore(0x7560, addmod(mload(0x6940), mload(0x7380), f_q)) +mstore(0x7580, addmod(1, mload(0x73a0), f_q)) +mstore(0x75a0, addmod(mload(0x6960), mload(0x73c0), f_q)) +mstore(0x75c0, addmod(mload(0x6aa0), mload(0x73e0), f_q)) +mstore(0x75e0, addmod(mload(0x6b00), mload(0x7400), f_q)) +mstore(0x7600, addmod(mload(0x6ac0), mload(0x7420), f_q)) +mstore(0x7620, addmod(mload(0x6ae0), mload(0x7440), f_q)) +mstore(0x7640, addmod(mload(0x6b20), mload(0x7460), f_q)) +mstore(0x7660, addmod(mload(0x6b60), mload(0x7480), f_q)) +mstore(0x7680, addmod(mload(0x6ba0), mload(0x74a0), f_q)) +mstore(0x76a0, addmod(mload(0x6bc0), mload(0x74c0), f_q)) +mstore(0x76c0, addmod(mload(0x6c20), mload(0x74e0), f_q)) +mstore(0x76e0, addmod(mload(0x6c80), mload(0x7500), f_q)) +mstore(0x7700, addmod(mload(0x6ce0), mload(0x7520), f_q)) +mstore(0x7720, mulmod(sub(f_q, mload(0xe00)), 1, f_q)) +mstore(0x7740, mulmod(mload(0x7720), mload(0x4fa0), f_q)) +mstore(0x7760, mulmod(1, mload(0x4fa0), f_q)) +mstore(0x7780, addmod(mload(0x7540), mload(0x7740), f_q)) +mstore(0x77a0, addmod(mload(0x75a0), mload(0x7760), f_q)) +mstore(0x77c0, mulmod(sub(f_q, mload(0xe80)), 1, f_q)) +mstore(0x77e0, mulmod(mload(0x77c0), mload(0x4fc0), f_q)) +mstore(0x7800, mulmod(1, mload(0x4fc0), f_q)) +mstore(0x7820, addmod(mload(0x7780), mload(0x77e0), f_q)) +mstore(0x7840, addmod(mload(0x77a0), mload(0x7800), f_q)) +mstore(0x7860, mulmod(sub(f_q, mload(0xea0)), 1, f_q)) +mstore(0x7880, mulmod(mload(0x7860), mload(0x4fe0), f_q)) +mstore(0x78a0, mulmod(1, mload(0x4fe0), f_q)) +mstore(0x78c0, addmod(mload(0x7820), mload(0x7880), f_q)) +mstore(0x78e0, addmod(mload(0x7840), mload(0x78a0), f_q)) +mstore(0x7900, mulmod(sub(f_q, mload(0xfa0)), 1, f_q)) +mstore(0x7920, mulmod(mload(0x7900), mload(0x5000), f_q)) +mstore(0x7940, mulmod(1, mload(0x5000), f_q)) +mstore(0x7960, addmod(mload(0x78c0), mload(0x7920), f_q)) +mstore(0x7980, addmod(mload(0x7580), mload(0x7940), f_q)) +mstore(0x79a0, mulmod(sub(f_q, mload(0xfe0)), 1, f_q)) +mstore(0x79c0, mulmod(mload(0x79a0), mload(0x5020), f_q)) +mstore(0x79e0, mulmod(1, mload(0x5020), f_q)) +mstore(0x7a00, addmod(mload(0x7960), mload(0x79c0), f_q)) +mstore(0x7a20, addmod(mload(0x7980), mload(0x79e0), f_q)) +mstore(0x7a40, mulmod(sub(f_q, mload(0x1020)), 1, f_q)) +mstore(0x7a60, mulmod(mload(0x7a40), mload(0x5040), f_q)) +mstore(0x7a80, mulmod(1, mload(0x5040), f_q)) +mstore(0x7aa0, addmod(mload(0x7a00), mload(0x7a60), f_q)) +mstore(0x7ac0, addmod(mload(0x7a20), mload(0x7a80), f_q)) +mstore(0x7ae0, mulmod(sub(f_q, mload(0x1400)), 1, f_q)) +mstore(0x7b00, mulmod(sub(f_q, mload(0x14a0)), mload(0x1640), f_q)) +mstore(0x7b20, addmod(mload(0x7ae0), mload(0x7b00), f_q)) +mstore(0x7b40, mulmod(sub(f_q, mload(0x1540)), mload(0x50a0), f_q)) +mstore(0x7b60, addmod(mload(0x7b20), mload(0x7b40), f_q)) +mstore(0x7b80, mulmod(sub(f_q, mload(0x15e0)), mload(0x50c0), f_q)) +mstore(0x7ba0, addmod(mload(0x7b60), mload(0x7b80), f_q)) +mstore(0x7bc0, mulmod(mload(0x7ba0), mload(0x5060), f_q)) +mstore(0x7be0, mulmod(1, mload(0x5060), f_q)) +mstore(0x7c00, mulmod(mload(0x56c0), mload(0x5060), f_q)) +mstore(0x7c20, mulmod(mload(0x5720), mload(0x5060), f_q)) +mstore(0x7c40, mulmod(mload(0x5780), mload(0x5060), f_q)) +mstore(0x7c60, addmod(mload(0x7aa0), mload(0x7bc0), f_q)) +mstore(0x7c80, addmod(mload(0x6be0), mload(0x7be0), f_q)) +mstore(0x7ca0, addmod(mload(0x6c40), mload(0x7c00), f_q)) +mstore(0x7cc0, addmod(mload(0x6ca0), mload(0x7c20), f_q)) +mstore(0x7ce0, addmod(mload(0x6d00), mload(0x7c40), f_q)) +mstore(0x7d00, mulmod(1, mload(0xd00), f_q)) +mstore(0x7d20, mulmod(1, mload(0x7d00), f_q)) +mstore(0x7d40, mulmod(1426404432721484388505361748317961535523355871255605456897797744433766488507, mload(0xd00), f_q)) +mstore(0x7d60, mulmod(mload(0x7380), mload(0x7d40), f_q)) +mstore(0x7d80, mulmod(19032961837237948602743626455740240236231119053033140765040043513661803148152, mload(0xd00), f_q)) +mstore(0x7da0, mulmod(mload(0x7760), mload(0x7d80), f_q)) +mstore(0x7dc0, mulmod(3766081621734395783232337525162072736827576297943013392955872170138036189193, mload(0xd00), f_q)) +mstore(0x7de0, mulmod(mload(0x7800), mload(0x7dc0), f_q)) +mstore(0x7e00, mulmod(5854133144571823792863860130267644613802765696134002830362054821530146160770, mload(0xd00), f_q)) +mstore(0x7e20, mulmod(mload(0x78a0), mload(0x7e00), f_q)) +mstore(0x7e40, mulmod(8588489674300949631511896307053586270491349646857464167689052660674263036535, mload(0xd00), f_q)) +mstore(0x7e60, mulmod(mload(0x7940), mload(0x7e40), f_q)) +mstore(0x7e80, mulmod(19893989371398098289746502613728289050597970169348486371640100181577426450122, mload(0xd00), f_q)) +mstore(0x7ea0, mulmod(mload(0x79e0), mload(0x7e80), f_q)) +mstore(0x7ec0, mulmod(7149869611943695910854823759655527116977502121219218232376952774062565458900, mload(0xd00), f_q)) +mstore(0x7ee0, mulmod(mload(0x7a80), mload(0x7ec0), f_q)) +mstore(0x7f00, mulmod(2785514556381676080176937710880804108647911392478702105860685610379369825016, mload(0xd00), f_q)) +mstore(0x7f20, mulmod(mload(0x7be0), mload(0x7f00), f_q)) +mstore(0x7f40, 0x0000000000000000000000000000000000000000000000000000000000000001) + mstore(0x7f60, 0x0000000000000000000000000000000000000000000000000000000000000002) +mstore(0x7f80, mload(0x7c60)) +success := and(eq(staticcall(gas(), 0x7, 0x7f40, 0x60, 0x7f40, 0x40), 1), success) +mstore(0x7fa0, mload(0x360)) + mstore(0x7fc0, mload(0x380)) +mstore(0x7fe0, mload(0x7ac0)) +success := and(eq(staticcall(gas(), 0x7, 0x7fa0, 0x60, 0x7fa0, 0x40), 1), success) +mstore(0x8000, mload(0x7f40)) + mstore(0x8020, mload(0x7f60)) +mstore(0x8040, mload(0x7fa0)) + mstore(0x8060, mload(0x7fc0)) +success := and(eq(staticcall(gas(), 0x6, 0x8000, 0x80, 0x8000, 0x40), 1), success) +mstore(0x8080, mload(0x3a0)) + mstore(0x80a0, mload(0x3c0)) +mstore(0x80c0, mload(0x7560)) +success := and(eq(staticcall(gas(), 0x7, 0x8080, 0x60, 0x8080, 0x40), 1), success) +mstore(0x80e0, mload(0x8000)) + mstore(0x8100, mload(0x8020)) +mstore(0x8120, mload(0x8080)) + mstore(0x8140, mload(0x80a0)) +success := and(eq(staticcall(gas(), 0x6, 0x80e0, 0x80, 0x80e0, 0x40), 1), success) +mstore(0x8160, mload(0x3e0)) + mstore(0x8180, mload(0x400)) +mstore(0x81a0, mload(0x78e0)) +success := and(eq(staticcall(gas(), 0x7, 0x8160, 0x60, 0x8160, 0x40), 1), success) +mstore(0x81c0, mload(0x80e0)) + mstore(0x81e0, mload(0x8100)) +mstore(0x8200, mload(0x8160)) + mstore(0x8220, mload(0x8180)) +success := and(eq(staticcall(gas(), 0x6, 0x81c0, 0x80, 0x81c0, 0x40), 1), success) +mstore(0x8240, mload(0x1a0)) + mstore(0x8260, mload(0x1c0)) +mstore(0x8280, mload(0x6980)) +success := and(eq(staticcall(gas(), 0x7, 0x8240, 0x60, 0x8240, 0x40), 1), success) +mstore(0x82a0, mload(0x81c0)) + mstore(0x82c0, mload(0x81e0)) +mstore(0x82e0, mload(0x8240)) + mstore(0x8300, mload(0x8260)) +success := and(eq(staticcall(gas(), 0x6, 0x82a0, 0x80, 0x82a0, 0x40), 1), success) +mstore(0x8320, mload(0x1e0)) + mstore(0x8340, mload(0x200)) +mstore(0x8360, mload(0x69a0)) +success := and(eq(staticcall(gas(), 0x7, 0x8320, 0x60, 0x8320, 0x40), 1), success) +mstore(0x8380, mload(0x82a0)) + mstore(0x83a0, mload(0x82c0)) +mstore(0x83c0, mload(0x8320)) + mstore(0x83e0, mload(0x8340)) +success := and(eq(staticcall(gas(), 0x6, 0x8380, 0x80, 0x8380, 0x40), 1), success) +mstore(0x8400, mload(0x220)) + mstore(0x8420, mload(0x240)) +mstore(0x8440, mload(0x69c0)) +success := and(eq(staticcall(gas(), 0x7, 0x8400, 0x60, 0x8400, 0x40), 1), success) +mstore(0x8460, mload(0x8380)) + mstore(0x8480, mload(0x83a0)) +mstore(0x84a0, mload(0x8400)) + mstore(0x84c0, mload(0x8420)) +success := and(eq(staticcall(gas(), 0x6, 0x8460, 0x80, 0x8460, 0x40), 1), success) +mstore(0x84e0, mload(0x260)) + mstore(0x8500, mload(0x280)) +mstore(0x8520, mload(0x69e0)) +success := and(eq(staticcall(gas(), 0x7, 0x84e0, 0x60, 0x84e0, 0x40), 1), success) +mstore(0x8540, mload(0x8460)) + mstore(0x8560, mload(0x8480)) +mstore(0x8580, mload(0x84e0)) + mstore(0x85a0, mload(0x8500)) +success := and(eq(staticcall(gas(), 0x6, 0x8540, 0x80, 0x8540, 0x40), 1), success) +mstore(0x85c0, mload(0x5a0)) + mstore(0x85e0, mload(0x5c0)) +mstore(0x8600, mload(0x6a00)) +success := and(eq(staticcall(gas(), 0x7, 0x85c0, 0x60, 0x85c0, 0x40), 1), success) +mstore(0x8620, mload(0x8540)) + mstore(0x8640, mload(0x8560)) +mstore(0x8660, mload(0x85c0)) + mstore(0x8680, mload(0x85e0)) +success := and(eq(staticcall(gas(), 0x6, 0x8620, 0x80, 0x8620, 0x40), 1), success) +mstore(0x86a0, mload(0x2a0)) + mstore(0x86c0, mload(0x2c0)) +mstore(0x86e0, mload(0x6a20)) +success := and(eq(staticcall(gas(), 0x7, 0x86a0, 0x60, 0x86a0, 0x40), 1), success) +mstore(0x8700, mload(0x8620)) + mstore(0x8720, mload(0x8640)) +mstore(0x8740, mload(0x86a0)) + mstore(0x8760, mload(0x86c0)) +success := and(eq(staticcall(gas(), 0x6, 0x8700, 0x80, 0x8700, 0x40), 1), success) +mstore(0x8780, mload(0x2e0)) + mstore(0x87a0, mload(0x300)) +mstore(0x87c0, mload(0x6a40)) +success := and(eq(staticcall(gas(), 0x7, 0x8780, 0x60, 0x8780, 0x40), 1), success) +mstore(0x87e0, mload(0x8700)) + mstore(0x8800, mload(0x8720)) +mstore(0x8820, mload(0x8780)) + mstore(0x8840, mload(0x87a0)) +success := and(eq(staticcall(gas(), 0x6, 0x87e0, 0x80, 0x87e0, 0x40), 1), success) +mstore(0x8860, mload(0x320)) + mstore(0x8880, mload(0x340)) +mstore(0x88a0, mload(0x6a60)) +success := and(eq(staticcall(gas(), 0x7, 0x8860, 0x60, 0x8860, 0x40), 1), success) +mstore(0x88c0, mload(0x87e0)) + mstore(0x88e0, mload(0x8800)) +mstore(0x8900, mload(0x8860)) + mstore(0x8920, mload(0x8880)) +success := and(eq(staticcall(gas(), 0x6, 0x88c0, 0x80, 0x88c0, 0x40), 1), success) +mstore(0x8940, mload(0xe0)) + mstore(0x8960, mload(0x100)) +mstore(0x8980, mload(0x6a80)) +success := and(eq(staticcall(gas(), 0x7, 0x8940, 0x60, 0x8940, 0x40), 1), success) +mstore(0x89a0, mload(0x88c0)) + mstore(0x89c0, mload(0x88e0)) +mstore(0x89e0, mload(0x8940)) + mstore(0x8a00, mload(0x8960)) +success := and(eq(staticcall(gas(), 0x6, 0x89a0, 0x80, 0x89a0, 0x40), 1), success) +mstore(0x8a20, mload(0x120)) + mstore(0x8a40, mload(0x140)) +mstore(0x8a60, mload(0x75c0)) +success := and(eq(staticcall(gas(), 0x7, 0x8a20, 0x60, 0x8a20, 0x40), 1), success) +mstore(0x8a80, mload(0x89a0)) + mstore(0x8aa0, mload(0x89c0)) +mstore(0x8ac0, mload(0x8a20)) + mstore(0x8ae0, mload(0x8a40)) +success := and(eq(staticcall(gas(), 0x6, 0x8a80, 0x80, 0x8a80, 0x40), 1), success) +mstore(0x8b00, mload(0x160)) + mstore(0x8b20, mload(0x180)) +mstore(0x8b40, mload(0x7600)) +success := and(eq(staticcall(gas(), 0x7, 0x8b00, 0x60, 0x8b00, 0x40), 1), success) +mstore(0x8b60, mload(0x8a80)) + mstore(0x8b80, mload(0x8aa0)) +mstore(0x8ba0, mload(0x8b00)) + mstore(0x8bc0, mload(0x8b20)) +success := and(eq(staticcall(gas(), 0x6, 0x8b60, 0x80, 0x8b60, 0x40), 1), success) +mstore(0x8be0, mload(0x560)) + mstore(0x8c00, mload(0x580)) +mstore(0x8c20, mload(0x7620)) +success := and(eq(staticcall(gas(), 0x7, 0x8be0, 0x60, 0x8be0, 0x40), 1), success) +mstore(0x8c40, mload(0x8b60)) + mstore(0x8c60, mload(0x8b80)) +mstore(0x8c80, mload(0x8be0)) + mstore(0x8ca0, mload(0x8c00)) +success := and(eq(staticcall(gas(), 0x6, 0x8c40, 0x80, 0x8c40, 0x40), 1), success) +mstore(0x8cc0, mload(0x420)) + mstore(0x8ce0, mload(0x440)) +mstore(0x8d00, mload(0x75e0)) +success := and(eq(staticcall(gas(), 0x7, 0x8cc0, 0x60, 0x8cc0, 0x40), 1), success) +mstore(0x8d20, mload(0x8c40)) + mstore(0x8d40, mload(0x8c60)) +mstore(0x8d60, mload(0x8cc0)) + mstore(0x8d80, mload(0x8ce0)) +success := and(eq(staticcall(gas(), 0x6, 0x8d20, 0x80, 0x8d20, 0x40), 1), success) +mstore(0x8da0, mload(0x460)) + mstore(0x8dc0, mload(0x480)) +mstore(0x8de0, mload(0x7640)) +success := and(eq(staticcall(gas(), 0x7, 0x8da0, 0x60, 0x8da0, 0x40), 1), success) +mstore(0x8e00, mload(0x8d20)) + mstore(0x8e20, mload(0x8d40)) +mstore(0x8e40, mload(0x8da0)) + mstore(0x8e60, mload(0x8dc0)) +success := and(eq(staticcall(gas(), 0x6, 0x8e00, 0x80, 0x8e00, 0x40), 1), success) +mstore(0x8e80, mload(0x4a0)) + mstore(0x8ea0, mload(0x4c0)) +mstore(0x8ec0, mload(0x6b40)) +success := and(eq(staticcall(gas(), 0x7, 0x8e80, 0x60, 0x8e80, 0x40), 1), success) +mstore(0x8ee0, mload(0x8e00)) + mstore(0x8f00, mload(0x8e20)) +mstore(0x8f20, mload(0x8e80)) + mstore(0x8f40, mload(0x8ea0)) +success := and(eq(staticcall(gas(), 0x6, 0x8ee0, 0x80, 0x8ee0, 0x40), 1), success) +mstore(0x8f60, mload(0x4e0)) + mstore(0x8f80, mload(0x500)) +mstore(0x8fa0, mload(0x7660)) +success := and(eq(staticcall(gas(), 0x7, 0x8f60, 0x60, 0x8f60, 0x40), 1), success) +mstore(0x8fc0, mload(0x8ee0)) + mstore(0x8fe0, mload(0x8f00)) +mstore(0x9000, mload(0x8f60)) + mstore(0x9020, mload(0x8f80)) +success := and(eq(staticcall(gas(), 0x6, 0x8fc0, 0x80, 0x8fc0, 0x40), 1), success) +mstore(0x9040, mload(0x520)) + mstore(0x9060, mload(0x540)) +mstore(0x9080, mload(0x6b80)) +success := and(eq(staticcall(gas(), 0x7, 0x9040, 0x60, 0x9040, 0x40), 1), success) +mstore(0x90a0, mload(0x8fc0)) + mstore(0x90c0, mload(0x8fe0)) +mstore(0x90e0, mload(0x9040)) + mstore(0x9100, mload(0x9060)) +success := and(eq(staticcall(gas(), 0x6, 0x90a0, 0x80, 0x90a0, 0x40), 1), success) +mstore(0x9120, mload(0x900)) + mstore(0x9140, mload(0x920)) +mstore(0x9160, mload(0x7680)) +success := and(eq(staticcall(gas(), 0x7, 0x9120, 0x60, 0x9120, 0x40), 1), success) +mstore(0x9180, mload(0x90a0)) + mstore(0x91a0, mload(0x90c0)) +mstore(0x91c0, mload(0x9120)) + mstore(0x91e0, mload(0x9140)) +success := and(eq(staticcall(gas(), 0x6, 0x9180, 0x80, 0x9180, 0x40), 1), success) +mstore(0x9200, mload(0x940)) + mstore(0x9220, mload(0x960)) +mstore(0x9240, mload(0x76a0)) +success := and(eq(staticcall(gas(), 0x7, 0x9200, 0x60, 0x9200, 0x40), 1), success) +mstore(0x9260, mload(0x9180)) + mstore(0x9280, mload(0x91a0)) +mstore(0x92a0, mload(0x9200)) + mstore(0x92c0, mload(0x9220)) +success := and(eq(staticcall(gas(), 0x6, 0x9260, 0x80, 0x9260, 0x40), 1), success) +mstore(0x92e0, mload(0x640)) + mstore(0x9300, mload(0x660)) +mstore(0x9320, mload(0x7c80)) +success := and(eq(staticcall(gas(), 0x7, 0x92e0, 0x60, 0x92e0, 0x40), 1), success) +mstore(0x9340, mload(0x9260)) + mstore(0x9360, mload(0x9280)) +mstore(0x9380, mload(0x92e0)) + mstore(0x93a0, mload(0x9300)) +success := and(eq(staticcall(gas(), 0x6, 0x9340, 0x80, 0x9340, 0x40), 1), success) +mstore(0x93c0, mload(0x680)) + mstore(0x93e0, mload(0x6a0)) +mstore(0x9400, mload(0x6c00)) +success := and(eq(staticcall(gas(), 0x7, 0x93c0, 0x60, 0x93c0, 0x40), 1), success) +mstore(0x9420, mload(0x9340)) + mstore(0x9440, mload(0x9360)) +mstore(0x9460, mload(0x93c0)) + mstore(0x9480, mload(0x93e0)) +success := and(eq(staticcall(gas(), 0x6, 0x9420, 0x80, 0x9420, 0x40), 1), success) +mstore(0x94a0, mload(0x980)) + mstore(0x94c0, mload(0x9a0)) +mstore(0x94e0, mload(0x76c0)) +success := and(eq(staticcall(gas(), 0x7, 0x94a0, 0x60, 0x94a0, 0x40), 1), success) +mstore(0x9500, mload(0x9420)) + mstore(0x9520, mload(0x9440)) +mstore(0x9540, mload(0x94a0)) + mstore(0x9560, mload(0x94c0)) +success := and(eq(staticcall(gas(), 0x6, 0x9500, 0x80, 0x9500, 0x40), 1), success) +mstore(0x9580, mload(0x6c0)) + mstore(0x95a0, mload(0x6e0)) +mstore(0x95c0, mload(0x7ca0)) +success := and(eq(staticcall(gas(), 0x7, 0x9580, 0x60, 0x9580, 0x40), 1), success) +mstore(0x95e0, mload(0x9500)) + mstore(0x9600, mload(0x9520)) +mstore(0x9620, mload(0x9580)) + mstore(0x9640, mload(0x95a0)) +success := and(eq(staticcall(gas(), 0x6, 0x95e0, 0x80, 0x95e0, 0x40), 1), success) +mstore(0x9660, mload(0x700)) + mstore(0x9680, mload(0x720)) +mstore(0x96a0, mload(0x6c60)) +success := and(eq(staticcall(gas(), 0x7, 0x9660, 0x60, 0x9660, 0x40), 1), success) +mstore(0x96c0, mload(0x95e0)) + mstore(0x96e0, mload(0x9600)) +mstore(0x9700, mload(0x9660)) + mstore(0x9720, mload(0x9680)) +success := and(eq(staticcall(gas(), 0x6, 0x96c0, 0x80, 0x96c0, 0x40), 1), success) +mstore(0x9740, mload(0x9c0)) + mstore(0x9760, mload(0x9e0)) +mstore(0x9780, mload(0x76e0)) +success := and(eq(staticcall(gas(), 0x7, 0x9740, 0x60, 0x9740, 0x40), 1), success) +mstore(0x97a0, mload(0x96c0)) + mstore(0x97c0, mload(0x96e0)) +mstore(0x97e0, mload(0x9740)) + mstore(0x9800, mload(0x9760)) +success := and(eq(staticcall(gas(), 0x6, 0x97a0, 0x80, 0x97a0, 0x40), 1), success) +mstore(0x9820, mload(0x740)) + mstore(0x9840, mload(0x760)) +mstore(0x9860, mload(0x7cc0)) +success := and(eq(staticcall(gas(), 0x7, 0x9820, 0x60, 0x9820, 0x40), 1), success) +mstore(0x9880, mload(0x97a0)) + mstore(0x98a0, mload(0x97c0)) +mstore(0x98c0, mload(0x9820)) + mstore(0x98e0, mload(0x9840)) +success := and(eq(staticcall(gas(), 0x6, 0x9880, 0x80, 0x9880, 0x40), 1), success) +mstore(0x9900, mload(0x780)) + mstore(0x9920, mload(0x7a0)) +mstore(0x9940, mload(0x6cc0)) +success := and(eq(staticcall(gas(), 0x7, 0x9900, 0x60, 0x9900, 0x40), 1), success) +mstore(0x9960, mload(0x9880)) + mstore(0x9980, mload(0x98a0)) +mstore(0x99a0, mload(0x9900)) + mstore(0x99c0, mload(0x9920)) +success := and(eq(staticcall(gas(), 0x6, 0x9960, 0x80, 0x9960, 0x40), 1), success) +mstore(0x99e0, mload(0xa00)) + mstore(0x9a00, mload(0xa20)) +mstore(0x9a20, mload(0x7700)) +success := and(eq(staticcall(gas(), 0x7, 0x99e0, 0x60, 0x99e0, 0x40), 1), success) +mstore(0x9a40, mload(0x9960)) + mstore(0x9a60, mload(0x9980)) +mstore(0x9a80, mload(0x99e0)) + mstore(0x9aa0, mload(0x9a00)) +success := and(eq(staticcall(gas(), 0x6, 0x9a40, 0x80, 0x9a40, 0x40), 1), success) +mstore(0x9ac0, mload(0x7c0)) + mstore(0x9ae0, mload(0x7e0)) +mstore(0x9b00, mload(0x7ce0)) +success := and(eq(staticcall(gas(), 0x7, 0x9ac0, 0x60, 0x9ac0, 0x40), 1), success) +mstore(0x9b20, mload(0x9a40)) + mstore(0x9b40, mload(0x9a60)) +mstore(0x9b60, mload(0x9ac0)) + mstore(0x9b80, mload(0x9ae0)) +success := and(eq(staticcall(gas(), 0x6, 0x9b20, 0x80, 0x9b20, 0x40), 1), success) +mstore(0x9ba0, mload(0x800)) + mstore(0x9bc0, mload(0x820)) +mstore(0x9be0, mload(0x6d20)) +success := and(eq(staticcall(gas(), 0x7, 0x9ba0, 0x60, 0x9ba0, 0x40), 1), success) +mstore(0x9c00, mload(0x9b20)) + mstore(0x9c20, mload(0x9b40)) +mstore(0x9c40, mload(0x9ba0)) + mstore(0x9c60, mload(0x9bc0)) +success := and(eq(staticcall(gas(), 0x6, 0x9c00, 0x80, 0x9c00, 0x40), 1), success) +mstore(0x9c80, 0x24df3a8ab6d23ed7008fbc06251e90863a4315ffc6c1cb8709eaaa3cf263faa5) + mstore(0x9ca0, 0x1095bd5aa580d4456d7475fd0544191c4db8c131f5edbdb8526406874a2256fe) +mstore(0x9cc0, mload(0x6d40)) +success := and(eq(staticcall(gas(), 0x7, 0x9c80, 0x60, 0x9c80, 0x40), 1), success) +mstore(0x9ce0, mload(0x9c00)) + mstore(0x9d00, mload(0x9c20)) +mstore(0x9d20, mload(0x9c80)) + mstore(0x9d40, mload(0x9ca0)) +success := and(eq(staticcall(gas(), 0x6, 0x9ce0, 0x80, 0x9ce0, 0x40), 1), success) +mstore(0x9d60, 0x11e06a0924bc91df420cc28907921d96d30e06732532056355b159bfab487599) + mstore(0x9d80, 0x0146dba1ad065c26ee3890d2e260e0a486b77a7024b700a0c4d2f42546526a92) +mstore(0x9da0, mload(0x6d60)) +success := and(eq(staticcall(gas(), 0x7, 0x9d60, 0x60, 0x9d60, 0x40), 1), success) +mstore(0x9dc0, mload(0x9ce0)) + mstore(0x9de0, mload(0x9d00)) +mstore(0x9e00, mload(0x9d60)) + mstore(0x9e20, mload(0x9d80)) +success := and(eq(staticcall(gas(), 0x6, 0x9dc0, 0x80, 0x9dc0, 0x40), 1), success) +mstore(0x9e40, 0x2939459d1b84dfbd52b2e2b64f0a9e34a92f902561cfefa96e9c34dd7d24c5ed) + mstore(0x9e60, 0x0863a7b24ba92c51042ec70c09561f56de7508951df59c9b2405868b3fb1e398) +mstore(0x9e80, mload(0x6d80)) +success := and(eq(staticcall(gas(), 0x7, 0x9e40, 0x60, 0x9e40, 0x40), 1), success) +mstore(0x9ea0, mload(0x9dc0)) + mstore(0x9ec0, mload(0x9de0)) +mstore(0x9ee0, mload(0x9e40)) + mstore(0x9f00, mload(0x9e60)) +success := and(eq(staticcall(gas(), 0x6, 0x9ea0, 0x80, 0x9ea0, 0x40), 1), success) +mstore(0x9f20, 0x2689485a8adaae5d72519b79d073c50281c6c6f2edb50dfc43381e6685b4ed48) + mstore(0x9f40, 0x010475e5addbb2801fe3e12bff0c16cd59dcbc00612e487225531caf1fe73384) +mstore(0x9f60, mload(0x6da0)) +success := and(eq(staticcall(gas(), 0x7, 0x9f20, 0x60, 0x9f20, 0x40), 1), success) +mstore(0x9f80, mload(0x9ea0)) + mstore(0x9fa0, mload(0x9ec0)) +mstore(0x9fc0, mload(0x9f20)) + mstore(0x9fe0, mload(0x9f40)) +success := and(eq(staticcall(gas(), 0x6, 0x9f80, 0x80, 0x9f80, 0x40), 1), success) +mstore(0xa000, 0x0c25af76635e4d86530f59602968f73c64d4e9321da480a656f8fdd45cc8f53d) + mstore(0xa020, 0x10a7b87fb011847118106b7ce456d3d82fbe5034bdb61ab81502d1eaa3c45fa3) +mstore(0xa040, mload(0x6dc0)) +success := and(eq(staticcall(gas(), 0x7, 0xa000, 0x60, 0xa000, 0x40), 1), success) +mstore(0xa060, mload(0x9f80)) + mstore(0xa080, mload(0x9fa0)) +mstore(0xa0a0, mload(0xa000)) + mstore(0xa0c0, mload(0xa020)) +success := and(eq(staticcall(gas(), 0x6, 0xa060, 0x80, 0xa060, 0x40), 1), success) +mstore(0xa0e0, 0x12e077eb3e8e88c82880144d3f5894779a9584598fdda362831095fa1a6ba204) + mstore(0xa100, 0x2d45ffd9c2d2044b9fc213d2f2dbedacb1aebfff563660e84e5ad8b54cbcb693) +mstore(0xa120, mload(0x6de0)) +success := and(eq(staticcall(gas(), 0x7, 0xa0e0, 0x60, 0xa0e0, 0x40), 1), success) +mstore(0xa140, mload(0xa060)) + mstore(0xa160, mload(0xa080)) +mstore(0xa180, mload(0xa0e0)) + mstore(0xa1a0, mload(0xa100)) +success := and(eq(staticcall(gas(), 0x6, 0xa140, 0x80, 0xa140, 0x40), 1), success) +mstore(0xa1c0, 0x2ccc53a35ecb8b9ba04f018af51c7105dbf1e843ff274293724d92af7e7b9a59) + mstore(0xa1e0, 0x1d0df54f408259311fa21d8b36cba2c62b3abe22df4e17bfe95563c5f879f66c) +mstore(0xa200, mload(0x6e00)) +success := and(eq(staticcall(gas(), 0x7, 0xa1c0, 0x60, 0xa1c0, 0x40), 1), success) +mstore(0xa220, mload(0xa140)) + mstore(0xa240, mload(0xa160)) +mstore(0xa260, mload(0xa1c0)) + mstore(0xa280, mload(0xa1e0)) +success := and(eq(staticcall(gas(), 0x6, 0xa220, 0x80, 0xa220, 0x40), 1), success) +mstore(0xa2a0, 0x25954e178b41c5a5ea51b78529c0347c55f74dbd9567e93f039da48a6c57ce4b) + mstore(0xa2c0, 0x281fcec79eaa4286501f23b19b0ee5862fa76e3d80e45f2ba39855348998421f) +mstore(0xa2e0, mload(0x6e20)) +success := and(eq(staticcall(gas(), 0x7, 0xa2a0, 0x60, 0xa2a0, 0x40), 1), success) +mstore(0xa300, mload(0xa220)) + mstore(0xa320, mload(0xa240)) +mstore(0xa340, mload(0xa2a0)) + mstore(0xa360, mload(0xa2c0)) +success := and(eq(staticcall(gas(), 0x6, 0xa300, 0x80, 0xa300, 0x40), 1), success) +mstore(0xa380, 0x063db634d3b5aa1816c7aed5c6ca94aeec954fae84816926e7a4eb37d46d8b69) + mstore(0xa3a0, 0x305dffb58091ab4782b1acb501c30627debe6f65af453abccb629a9e831f7fd2) +mstore(0xa3c0, mload(0x6e40)) +success := and(eq(staticcall(gas(), 0x7, 0xa380, 0x60, 0xa380, 0x40), 1), success) +mstore(0xa3e0, mload(0xa300)) + mstore(0xa400, mload(0xa320)) +mstore(0xa420, mload(0xa380)) + mstore(0xa440, mload(0xa3a0)) +success := and(eq(staticcall(gas(), 0x6, 0xa3e0, 0x80, 0xa3e0, 0x40), 1), success) +mstore(0xa460, 0x303421f60577d97ad890af5d687598764b4dbc7ebbd38f6f87141ab3d3c0c90d) + mstore(0xa480, 0x0c010206f470a5227883ef66d1812cf0c9e7bde01bec251d43babd9b9a5ece67) +mstore(0xa4a0, mload(0x6e60)) +success := and(eq(staticcall(gas(), 0x7, 0xa460, 0x60, 0xa460, 0x40), 1), success) +mstore(0xa4c0, mload(0xa3e0)) + mstore(0xa4e0, mload(0xa400)) +mstore(0xa500, mload(0xa460)) + mstore(0xa520, mload(0xa480)) +success := and(eq(staticcall(gas(), 0x6, 0xa4c0, 0x80, 0xa4c0, 0x40), 1), success) +mstore(0xa540, 0x0ae9509ede46edc25972404ff41821a9b99feffc9fd2f6f03ee7998ad98b22ae) + mstore(0xa560, 0x17f2a82e6d096af1789755d8b76b086fbf847d30f57ca1e51961bab26f3edfde) +mstore(0xa580, mload(0x6e80)) +success := and(eq(staticcall(gas(), 0x7, 0xa540, 0x60, 0xa540, 0x40), 1), success) +mstore(0xa5a0, mload(0xa4c0)) + mstore(0xa5c0, mload(0xa4e0)) +mstore(0xa5e0, mload(0xa540)) + mstore(0xa600, mload(0xa560)) +success := and(eq(staticcall(gas(), 0x6, 0xa5a0, 0x80, 0xa5a0, 0x40), 1), success) +mstore(0xa620, 0x1fe623708bdb08a3a91c99cbb2300524ddff5900478acc1c92a0ce667bd9bc96) + mstore(0xa640, 0x21f3a33809891f392e8b689bd3e297b9219eb277034f4b5382b17dc48c1f3179) +mstore(0xa660, mload(0x6ea0)) +success := and(eq(staticcall(gas(), 0x7, 0xa620, 0x60, 0xa620, 0x40), 1), success) +mstore(0xa680, mload(0xa5a0)) + mstore(0xa6a0, mload(0xa5c0)) +mstore(0xa6c0, mload(0xa620)) + mstore(0xa6e0, mload(0xa640)) +success := and(eq(staticcall(gas(), 0x6, 0xa680, 0x80, 0xa680, 0x40), 1), success) +mstore(0xa700, 0x2b5c7cd857cd49359078265f9adf88dd66c927e377518c197f93380702b1c3f3) + mstore(0xa720, 0x2fe1222224022cc639252fc4fb6acc20a4602140d123dcf64a7425d4091b1a39) +mstore(0xa740, mload(0x6ec0)) +success := and(eq(staticcall(gas(), 0x7, 0xa700, 0x60, 0xa700, 0x40), 1), success) +mstore(0xa760, mload(0xa680)) + mstore(0xa780, mload(0xa6a0)) +mstore(0xa7a0, mload(0xa700)) + mstore(0xa7c0, mload(0xa720)) +success := and(eq(staticcall(gas(), 0x6, 0xa760, 0x80, 0xa760, 0x40), 1), success) +mstore(0xa7e0, mload(0xae0)) + mstore(0xa800, mload(0xb00)) +mstore(0xa820, mload(0x6ee0)) +success := and(eq(staticcall(gas(), 0x7, 0xa7e0, 0x60, 0xa7e0, 0x40), 1), success) +mstore(0xa840, mload(0xa760)) + mstore(0xa860, mload(0xa780)) +mstore(0xa880, mload(0xa7e0)) + mstore(0xa8a0, mload(0xa800)) +success := and(eq(staticcall(gas(), 0x6, 0xa840, 0x80, 0xa840, 0x40), 1), success) +mstore(0xa8c0, mload(0xb20)) + mstore(0xa8e0, mload(0xb40)) +mstore(0xa900, mload(0x6f00)) +success := and(eq(staticcall(gas(), 0x7, 0xa8c0, 0x60, 0xa8c0, 0x40), 1), success) +mstore(0xa920, mload(0xa840)) + mstore(0xa940, mload(0xa860)) +mstore(0xa960, mload(0xa8c0)) + mstore(0xa980, mload(0xa8e0)) +success := and(eq(staticcall(gas(), 0x6, 0xa920, 0x80, 0xa920, 0x40), 1), success) +mstore(0xa9a0, mload(0xb60)) + mstore(0xa9c0, mload(0xb80)) +mstore(0xa9e0, mload(0x6f20)) +success := and(eq(staticcall(gas(), 0x7, 0xa9a0, 0x60, 0xa9a0, 0x40), 1), success) +mstore(0xaa00, mload(0xa920)) + mstore(0xaa20, mload(0xa940)) +mstore(0xaa40, mload(0xa9a0)) + mstore(0xaa60, mload(0xa9c0)) +success := and(eq(staticcall(gas(), 0x6, 0xaa00, 0x80, 0xaa00, 0x40), 1), success) +mstore(0xaa80, mload(0xba0)) + mstore(0xaaa0, mload(0xbc0)) +mstore(0xaac0, mload(0x6f40)) +success := and(eq(staticcall(gas(), 0x7, 0xaa80, 0x60, 0xaa80, 0x40), 1), success) +mstore(0xaae0, mload(0xaa00)) + mstore(0xab00, mload(0xaa20)) +mstore(0xab20, mload(0xaa80)) + mstore(0xab40, mload(0xaaa0)) +success := and(eq(staticcall(gas(), 0x6, 0xaae0, 0x80, 0xaae0, 0x40), 1), success) +mstore(0xab60, mload(0xbe0)) + mstore(0xab80, mload(0xc00)) +mstore(0xaba0, mload(0x6f60)) +success := and(eq(staticcall(gas(), 0x7, 0xab60, 0x60, 0xab60, 0x40), 1), success) +mstore(0xabc0, mload(0xaae0)) + mstore(0xabe0, mload(0xab00)) +mstore(0xac00, mload(0xab60)) + mstore(0xac20, mload(0xab80)) +success := and(eq(staticcall(gas(), 0x6, 0xabc0, 0x80, 0xabc0, 0x40), 1), success) +mstore(0xac40, mload(0xc20)) + mstore(0xac60, mload(0xc40)) +mstore(0xac80, mload(0x6f80)) +success := and(eq(staticcall(gas(), 0x7, 0xac40, 0x60, 0xac40, 0x40), 1), success) +mstore(0xaca0, mload(0xabc0)) + mstore(0xacc0, mload(0xabe0)) +mstore(0xace0, mload(0xac40)) + mstore(0xad00, mload(0xac60)) +success := and(eq(staticcall(gas(), 0x6, 0xaca0, 0x80, 0xaca0, 0x40), 1), success) +mstore(0xad20, mload(0xc60)) + mstore(0xad40, mload(0xc80)) +mstore(0xad60, mload(0x6fa0)) +success := and(eq(staticcall(gas(), 0x7, 0xad20, 0x60, 0xad20, 0x40), 1), success) +mstore(0xad80, mload(0xaca0)) + mstore(0xada0, mload(0xacc0)) +mstore(0xadc0, mload(0xad20)) + mstore(0xade0, mload(0xad40)) +success := and(eq(staticcall(gas(), 0x6, 0xad80, 0x80, 0xad80, 0x40), 1), success) +mstore(0xae00, mload(0xca0)) + mstore(0xae20, mload(0xcc0)) +mstore(0xae40, mload(0x6fc0)) +success := and(eq(staticcall(gas(), 0x7, 0xae00, 0x60, 0xae00, 0x40), 1), success) +mstore(0xae60, mload(0xad80)) + mstore(0xae80, mload(0xada0)) +mstore(0xaea0, mload(0xae00)) + mstore(0xaec0, mload(0xae20)) +success := and(eq(staticcall(gas(), 0x6, 0xae60, 0x80, 0xae60, 0x40), 1), success) +mstore(0xaee0, mload(0xa40)) + mstore(0xaf00, mload(0xa60)) +mstore(0xaf20, mload(0x6fe0)) +success := and(eq(staticcall(gas(), 0x7, 0xaee0, 0x60, 0xaee0, 0x40), 1), success) +mstore(0xaf40, mload(0xae60)) + mstore(0xaf60, mload(0xae80)) +mstore(0xaf80, mload(0xaee0)) + mstore(0xafa0, mload(0xaf00)) +success := and(eq(staticcall(gas(), 0x6, 0xaf40, 0x80, 0xaf40, 0x40), 1), success) +mstore(0xafc0, mload(0x1680)) + mstore(0xafe0, mload(0x16a0)) +mstore(0xb000, mload(0x7d20)) +success := and(eq(staticcall(gas(), 0x7, 0xafc0, 0x60, 0xafc0, 0x40), 1), success) +mstore(0xb020, mload(0xaf40)) + mstore(0xb040, mload(0xaf60)) +mstore(0xb060, mload(0xafc0)) + mstore(0xb080, mload(0xafe0)) +success := and(eq(staticcall(gas(), 0x6, 0xb020, 0x80, 0xb020, 0x40), 1), success) +mstore(0xb0a0, mload(0x16c0)) + mstore(0xb0c0, mload(0x16e0)) +mstore(0xb0e0, mload(0x7d60)) +success := and(eq(staticcall(gas(), 0x7, 0xb0a0, 0x60, 0xb0a0, 0x40), 1), success) +mstore(0xb100, mload(0xb020)) + mstore(0xb120, mload(0xb040)) +mstore(0xb140, mload(0xb0a0)) + mstore(0xb160, mload(0xb0c0)) +success := and(eq(staticcall(gas(), 0x6, 0xb100, 0x80, 0xb100, 0x40), 1), success) +mstore(0xb180, mload(0x1700)) + mstore(0xb1a0, mload(0x1720)) +mstore(0xb1c0, mload(0x7da0)) +success := and(eq(staticcall(gas(), 0x7, 0xb180, 0x60, 0xb180, 0x40), 1), success) +mstore(0xb1e0, mload(0xb100)) + mstore(0xb200, mload(0xb120)) +mstore(0xb220, mload(0xb180)) + mstore(0xb240, mload(0xb1a0)) +success := and(eq(staticcall(gas(), 0x6, 0xb1e0, 0x80, 0xb1e0, 0x40), 1), success) +mstore(0xb260, mload(0x1740)) + mstore(0xb280, mload(0x1760)) +mstore(0xb2a0, mload(0x7de0)) +success := and(eq(staticcall(gas(), 0x7, 0xb260, 0x60, 0xb260, 0x40), 1), success) +mstore(0xb2c0, mload(0xb1e0)) + mstore(0xb2e0, mload(0xb200)) +mstore(0xb300, mload(0xb260)) + mstore(0xb320, mload(0xb280)) +success := and(eq(staticcall(gas(), 0x6, 0xb2c0, 0x80, 0xb2c0, 0x40), 1), success) +mstore(0xb340, mload(0x1780)) + mstore(0xb360, mload(0x17a0)) +mstore(0xb380, mload(0x7e20)) +success := and(eq(staticcall(gas(), 0x7, 0xb340, 0x60, 0xb340, 0x40), 1), success) +mstore(0xb3a0, mload(0xb2c0)) + mstore(0xb3c0, mload(0xb2e0)) +mstore(0xb3e0, mload(0xb340)) + mstore(0xb400, mload(0xb360)) +success := and(eq(staticcall(gas(), 0x6, 0xb3a0, 0x80, 0xb3a0, 0x40), 1), success) +mstore(0xb420, mload(0x17c0)) + mstore(0xb440, mload(0x17e0)) +mstore(0xb460, mload(0x7e60)) +success := and(eq(staticcall(gas(), 0x7, 0xb420, 0x60, 0xb420, 0x40), 1), success) +mstore(0xb480, mload(0xb3a0)) + mstore(0xb4a0, mload(0xb3c0)) +mstore(0xb4c0, mload(0xb420)) + mstore(0xb4e0, mload(0xb440)) +success := and(eq(staticcall(gas(), 0x6, 0xb480, 0x80, 0xb480, 0x40), 1), success) +mstore(0xb500, mload(0x1800)) + mstore(0xb520, mload(0x1820)) +mstore(0xb540, mload(0x7ea0)) +success := and(eq(staticcall(gas(), 0x7, 0xb500, 0x60, 0xb500, 0x40), 1), success) +mstore(0xb560, mload(0xb480)) + mstore(0xb580, mload(0xb4a0)) +mstore(0xb5a0, mload(0xb500)) + mstore(0xb5c0, mload(0xb520)) +success := and(eq(staticcall(gas(), 0x6, 0xb560, 0x80, 0xb560, 0x40), 1), success) +mstore(0xb5e0, mload(0x1840)) + mstore(0xb600, mload(0x1860)) +mstore(0xb620, mload(0x7ee0)) +success := and(eq(staticcall(gas(), 0x7, 0xb5e0, 0x60, 0xb5e0, 0x40), 1), success) +mstore(0xb640, mload(0xb560)) + mstore(0xb660, mload(0xb580)) +mstore(0xb680, mload(0xb5e0)) + mstore(0xb6a0, mload(0xb600)) +success := and(eq(staticcall(gas(), 0x6, 0xb640, 0x80, 0xb640, 0x40), 1), success) +mstore(0xb6c0, mload(0x1880)) + mstore(0xb6e0, mload(0x18a0)) +mstore(0xb700, mload(0x7f20)) +success := and(eq(staticcall(gas(), 0x7, 0xb6c0, 0x60, 0xb6c0, 0x40), 1), success) +mstore(0xb720, mload(0xb640)) + mstore(0xb740, mload(0xb660)) +mstore(0xb760, mload(0xb6c0)) + mstore(0xb780, mload(0xb6e0)) +success := and(eq(staticcall(gas(), 0x6, 0xb720, 0x80, 0xb720, 0x40), 1), success) +mstore(0xb7a0, mload(0x16c0)) + mstore(0xb7c0, mload(0x16e0)) +mstore(0xb7e0, mload(0x7380)) +success := and(eq(staticcall(gas(), 0x7, 0xb7a0, 0x60, 0xb7a0, 0x40), 1), success) +mstore(0xb800, mload(0x1680)) + mstore(0xb820, mload(0x16a0)) +mstore(0xb840, mload(0xb7a0)) + mstore(0xb860, mload(0xb7c0)) +success := and(eq(staticcall(gas(), 0x6, 0xb800, 0x80, 0xb800, 0x40), 1), success) +mstore(0xb880, mload(0x1700)) + mstore(0xb8a0, mload(0x1720)) +mstore(0xb8c0, mload(0x7760)) +success := and(eq(staticcall(gas(), 0x7, 0xb880, 0x60, 0xb880, 0x40), 1), success) +mstore(0xb8e0, mload(0xb800)) + mstore(0xb900, mload(0xb820)) +mstore(0xb920, mload(0xb880)) + mstore(0xb940, mload(0xb8a0)) +success := and(eq(staticcall(gas(), 0x6, 0xb8e0, 0x80, 0xb8e0, 0x40), 1), success) +mstore(0xb960, mload(0x1740)) + mstore(0xb980, mload(0x1760)) +mstore(0xb9a0, mload(0x7800)) +success := and(eq(staticcall(gas(), 0x7, 0xb960, 0x60, 0xb960, 0x40), 1), success) +mstore(0xb9c0, mload(0xb8e0)) + mstore(0xb9e0, mload(0xb900)) +mstore(0xba00, mload(0xb960)) + mstore(0xba20, mload(0xb980)) +success := and(eq(staticcall(gas(), 0x6, 0xb9c0, 0x80, 0xb9c0, 0x40), 1), success) +mstore(0xba40, mload(0x1780)) + mstore(0xba60, mload(0x17a0)) +mstore(0xba80, mload(0x78a0)) +success := and(eq(staticcall(gas(), 0x7, 0xba40, 0x60, 0xba40, 0x40), 1), success) +mstore(0xbaa0, mload(0xb9c0)) + mstore(0xbac0, mload(0xb9e0)) +mstore(0xbae0, mload(0xba40)) + mstore(0xbb00, mload(0xba60)) +success := and(eq(staticcall(gas(), 0x6, 0xbaa0, 0x80, 0xbaa0, 0x40), 1), success) +mstore(0xbb20, mload(0x17c0)) + mstore(0xbb40, mload(0x17e0)) +mstore(0xbb60, mload(0x7940)) +success := and(eq(staticcall(gas(), 0x7, 0xbb20, 0x60, 0xbb20, 0x40), 1), success) +mstore(0xbb80, mload(0xbaa0)) + mstore(0xbba0, mload(0xbac0)) +mstore(0xbbc0, mload(0xbb20)) + mstore(0xbbe0, mload(0xbb40)) +success := and(eq(staticcall(gas(), 0x6, 0xbb80, 0x80, 0xbb80, 0x40), 1), success) +mstore(0xbc00, mload(0x1800)) + mstore(0xbc20, mload(0x1820)) +mstore(0xbc40, mload(0x79e0)) +success := and(eq(staticcall(gas(), 0x7, 0xbc00, 0x60, 0xbc00, 0x40), 1), success) +mstore(0xbc60, mload(0xbb80)) + mstore(0xbc80, mload(0xbba0)) +mstore(0xbca0, mload(0xbc00)) + mstore(0xbcc0, mload(0xbc20)) +success := and(eq(staticcall(gas(), 0x6, 0xbc60, 0x80, 0xbc60, 0x40), 1), success) +mstore(0xbce0, mload(0x1840)) + mstore(0xbd00, mload(0x1860)) +mstore(0xbd20, mload(0x7a80)) +success := and(eq(staticcall(gas(), 0x7, 0xbce0, 0x60, 0xbce0, 0x40), 1), success) +mstore(0xbd40, mload(0xbc60)) + mstore(0xbd60, mload(0xbc80)) +mstore(0xbd80, mload(0xbce0)) + mstore(0xbda0, mload(0xbd00)) +success := and(eq(staticcall(gas(), 0x6, 0xbd40, 0x80, 0xbd40, 0x40), 1), success) +mstore(0xbdc0, mload(0x1880)) + mstore(0xbde0, mload(0x18a0)) +mstore(0xbe00, mload(0x7be0)) +success := and(eq(staticcall(gas(), 0x7, 0xbdc0, 0x60, 0xbdc0, 0x40), 1), success) +mstore(0xbe20, mload(0xbd40)) + mstore(0xbe40, mload(0xbd60)) +mstore(0xbe60, mload(0xbdc0)) + mstore(0xbe80, mload(0xbde0)) +success := and(eq(staticcall(gas(), 0x6, 0xbe20, 0x80, 0xbe20, 0x40), 1), success) +mstore(0xbea0, mload(0xb720)) + mstore(0xbec0, mload(0xb740)) +mstore(0xbee0, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) + mstore(0xbf00, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed) + mstore(0xbf20, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b) + mstore(0xbf40, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa) +mstore(0xbf60, mload(0xbe20)) + mstore(0xbf80, mload(0xbe40)) +mstore(0xbfa0, 0x03fecfd23d328341e7c37d832729014de9a532c74fa1e734832b9364afe54ff6) + mstore(0xbfc0, 0x1c409140357e6291196cff0168ffabc3272b2b7ff408e5e22698c7097abd3c8e) + mstore(0xbfe0, 0x26664eede2dc90d92950867bfd69fbb8e099bf8ad87665e7ae1b61ced474f8bb) + mstore(0xc000, 0x2b3f914b211ba74b0bb752fd46788410c534dff9de694623b784dbddd2f43858) +success := and(eq(staticcall(gas(), 0x8, 0xbea0, 0x180, 0xbea0, 0x20), 1), success) +success := and(eq(mload(0xbea0), 1), success) + + if not(success) { revert(0, 0) } + return(0, 0) + + } + } +} diff --git a/packages/protocol/contracts/test/libs/TestLibZKP.sol b/packages/protocol/contracts/test/libs/TestLibZKP.sol new file mode 100644 index 0000000000..c9e8cef6ec --- /dev/null +++ b/packages/protocol/contracts/test/libs/TestLibZKP.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +// _____ _ _ _ _ +// |_ _|_ _(_) |_____ | | __ _| |__ ___ +// | |/ _` | | / / _ \ | |__/ _` | '_ (_-< +// |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ + +pragma solidity ^0.8.18; + +import {LibZKP} from "../../libs/LibZKP.sol"; + +contract TestLibZKP { + function verify( + address plonkVerifier, + bytes calldata zkproof, + bytes32 instance + ) public view returns (bool verified) { + return LibZKP.verify(plonkVerifier, zkproof, instance); + } +} diff --git a/packages/protocol/hardhat.config.ts b/packages/protocol/hardhat.config.ts index 6316a26cd5..b4d0fb695c 100644 --- a/packages/protocol/hardhat.config.ts +++ b/packages/protocol/hardhat.config.ts @@ -3,8 +3,8 @@ import "@nomiclabs/hardhat-waffle"; import "@openzeppelin/hardhat-upgrades"; import "@typechain/hardhat"; import "hardhat-abi-exporter"; -import "hardhat-gas-reporter"; import "hardhat-contract-sizer"; +import "hardhat-gas-reporter"; import { HardhatUserConfig } from "hardhat/config"; import "solidity-coverage"; import "solidity-docgen"; diff --git a/packages/protocol/package.json b/packages/protocol/package.json index 8cac766e52..d380064d18 100644 --- a/packages/protocol/package.json +++ b/packages/protocol/package.json @@ -11,7 +11,7 @@ "lint:sol": "pnpm prettier '**/*.sol' --write && pnpm solhint 'contracts/**/*.sol' --fix", "eslint": "pnpm exec eslint --ignore-path .eslintignore --ext .js,.ts .", "eslint:fix": "pnpm exec eslint --ignore-path .eslintignore --ext .js,.ts . --fix", - "test": "pnpm hardhat test --grep '^[^integration]'", + "test": "./scripts/download_solc.sh && pnpm hardhat test --grep '^[^integration]'", "coverage": "pnpm hardhat coverage --solcoverjs ./.solcover.js --show-stack-traces", "test:coverage": "pnpm coverage", "generate:genesis": "ts-node ./utils/generate_genesis/main.ts", diff --git a/packages/protocol/tasks/deploy_L1.ts b/packages/protocol/tasks/deploy_L1.ts index a7641b699e..9f6aecbd76 100644 --- a/packages/protocol/tasks/deploy_L1.ts +++ b/packages/protocol/tasks/deploy_L1.ts @@ -116,10 +116,13 @@ export async function deployContracts(hre: any) { // TaikoToken const TaikoToken = await utils.deployContract(hre, "TaikoToken"); - await utils.waitTx(hre, await TaikoToken.init( - "Test Taiko Token", - "TTKO", - AddressManager.address) + await utils.waitTx( + hre, + await TaikoToken.init( + "Test Taiko Token", + "TTKO", + AddressManager.address + ) ); await utils.waitTx( hre, @@ -208,24 +211,26 @@ export async function deployContracts(hre: any) { ); // PlonkVerifier - const PlonkVerifier = await deployPlonkVerifier(hre); + const PlonkVerifiers = await deployPlonkVerifiers(hre); // Used by ProofVerifier - await utils.waitTx( - hre, - await AddressManager.setAddress( - // string(abi.encodePacked("plonk_verifier_", i)) - `${chainId}.${Buffer.from( - ethers.utils.arrayify( - ethers.utils.solidityPack( - ["string", "uint256", "string", "uint16"], - ["plonk_verifier_", 0, "_", 0] + for (let i = 0; i < PlonkVerifiers.length; i++) { + await utils.waitTx( + hre, + await AddressManager.setAddress( + // string(abi.encodePacked("plonk_verifier_", i)) + `${chainId}.${Buffer.from( + ethers.utils.arrayify( + ethers.utils.solidityPack( + ["string", "uint256", "string", "uint16"], + ["plonk_verifier_", 0, "_", i] + ) ) - ) - ).toString()}`, - PlonkVerifier.address - ) - ); + ).toString()}`, + PlonkVerifiers[i].address + ) + ); + } if (ethers.utils.isAddress(oracleProver)) { await utils.waitTx( @@ -330,12 +335,28 @@ async function deploySignalSerive( return SignalService; } -async function deployPlonkVerifier(hre: any): Promise { - const byteCode = utils.compileYulContract( - "../contracts/libs/yul/PlonkVerifier.yulp" +async function deployPlonkVerifiers(hre: any): Promise { + const PlonkVerifier10TxsByteCode = utils.compileYulContract( + "../contracts/libs/yul/PlonkVerifier_10_txs.yulp" + ); + const PlonkVerifier80TxsByteCode = utils.compileYulContract( + "../contracts/libs/yul/PlonkVerifier_80_txs.yulp" ); - return { - address: await utils.deployBytecode(hre, byteCode, "PlonkVerifier"), - }; + return [ + { + address: await utils.deployBytecode( + hre, + PlonkVerifier10TxsByteCode, + "PlonkVerifier_10_txs" + ), + }, + { + address: await utils.deployBytecode( + hre, + PlonkVerifier80TxsByteCode, + "PlonkVerifier_80_txs" + ), + }, + ]; } diff --git a/packages/protocol/test/data/test_proof.json b/packages/protocol/test/data/test_proof.json new file mode 100644 index 0000000000..e35722dc47 --- /dev/null +++ b/packages/protocol/test/data/test_proof.json @@ -0,0 +1,37 @@ +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "aggregation": { + "duration": 0, + "instance": [], + "k": 0, + "label": "pi-600000-a", + "proof": "0x", + "randomness": "0x" + }, + "circuit": { + "duration": 291422, + "instance": [ + "0xecbb89532da16c6aaba65173df994a0b", + "0xdc43ac5f0c4d96dda954d14935efd6a3" + ], + "k": 19, + "label": "pi-600000", + "proof": "0x2bf20ff78727f38ef16e03bfb3d4895f35cc626f97ede7cc99f48aeff8661fe32015ea8d62ec7a79e01cd398e85867bafdcf55cb6a7121b6fef097f5f5656a5d11ddf336b6879926ea2ae425e91c748a553c9a496cbe2ab556a91689f75ee2b01ad3c43aa774b50a9d8411a9f65be42d6cde781db1a1949a1e886f868917997b0ddf417d2fa8b5fb32dd641ef94ba838efb46de478000cc32c62367ea7f68f341ab25760acb25df78b85ffaf11edcaf986c0ed939c32989df7127129000e0bfb21f302010a7798aecee8552aa1c226cf9908e813008ee2f29e21784a3f32078a0ed17a8070ca28e6fb79356d372926921e08a609bfde3f9416a69da8cbf4faba1958b1d14fc9092e077af4e9c438857aa200afd32dcf7848a217fb187fa9e1bb2b88c35121977f4de6a34c88c2fe4678205292ca22683d073687f77a68070e1e227874e3cddb99c6347c7d47232d2aa51b32076e81b130e96dc0ca2ac7dcef601bfbd31520044ed64796953f3345b49ac812514aa3886a17e8eab324c8940abd220669e9b95d47ddc7774695be89576663bf96b0e6dea37abfbfb4620178b74e124862d1788641479260a68ebba6dbc9cd80e10ef9d7627966db2063222eb2751a9959e70854d3379c63eb3ec8177441f568d79ec82875aa36645f01bd53e10d302a9f8b678d6b09c54d072c7e9d6443a0aa89021ec0748568d3d5b5745c92b11f31c13d11b94f892bb9f96bd2931b66ffa5e22b104c549e7c0d5010e4e70e271d48c0bd6e4be68c920ea77af85d12eb155d9b25703eabbd0ede1909565a55f12f654ccc6771897acdaaf83e3674c7141927ac3a8e9915bf27f033779110c0ba0b635753acf8f53fed904adc20368c93691f8e49cf07e0b6f10a9d8a0bea4f3d259764b0f53960cd7b9a81fa4379d396364814249a5fddcf7efa7d2e68e729550a92392f5c23c73868961d6edfd9fc4f1379c8e34191c372cbebf13c2fa337fd1a0a0068708d0d60db275be717d35676c27cf58b5044adb1d764b8bcd6951a9f1c5c1a2fb96d6cecb1c153fbe082948de02930c0cdb295d8ac4df91ea2d34b442fd18f84509838c84d4ebc980c96be6d0667fc18cd949ac93b5dfb38d712bb2d29fcbac5bb3a620b2b5aadf1a4e2a3c254610dfffe7e216b4a9ecc93a8081b970d13d113582885390dfc9cc4ae10eca93a6c81003305c0a03213293e919e041712192fb8374c269bf5e3cbfd8cfc1fa4408c0a55fd98d8f57926aa9d9772e5b114ffe9e64acbf6e0543d3c55a5140116e8130f3369b0f819a21f5fa24980b11b2f12481042cbff8b2dec629f37fa4a64a4641656629fb11261a66a36e969b74a20753d54c05301075e315bdb0a39fd7665edd8d73fbfa6c4faaf6c66e6c8b1a830453b758b0047d93d9970b49c617dd582fbad0539f9f5eadeeb51e35775f98f2bfb750f3ca68d27197e3d86d4283f5859a6ef7bd66b68991f474e26317dc1df15d4acaa898abf97f2e5c1b4e560336e76ccbe2613d85454a095bbe5ae6b2a1212064ca8776f0f33bd9797c164a92c211167e81c6dc3418d096fecc989ae97d004e2bfa53207b036b5183468f4435e9df40413fd4f3fbb7c0e4080765a68d1e80b262e54ab27cdb4904018a73566c5f3fbf93e637081714ffbd106c3f03f69fb20444983ce2fed71bf96c17049506c3d667ccc7d29dac0a1830187c2f0f130a31166f5e0f55fdd7796be8c989e9c55b87e135356cabdb13314693c4f4cdb3a350524f7494c0b7c9679c651970b2076b58718cf6077b1d5bcd1193708faf3f1812a4811c5965495da8054c9a4a4447f50b08138ea05c6df2bdc444689b78b9a37196917eaed3edc25d1ddc1b60a8041330a4759ee8725c87234374c60b43ab7d8066fe95537bb96857a5357ff97dab62f0e56511d7cb8d3695d919db350eb949002f4fde22120e0e8d3023dbd46a7f0f4e5f84cb59a19c331806f71a381f72da81f27884447fe57e3271ebc651916dced06db9c7a51572c5ce7021eaff9c0bc7c02380abf987c89ba8029744c07e0eeab3a228793e9a69adba4ae42404fb2ce4d2495da393f0d0ac5a0178ca4720e8e6a193e3579a3ef50df7ed8a4b06ca54e33150ae76933a36e9979336b44461efbeaa9de08379687b1dd8ed6656438480d0c0237ca9000cca1bfd6adfdd043364af965aeea9b0571e2debb244e7b632d287011c7ff356c7cce34ad9f5e910280dedd1fae543c3e4405dd47648ae52e8793902beefdab93b509be5c3d84808db2186920e75fb6211f92e965cb901dcdf2ce9c14e21ebcbbc81a57784d0900fac3c31566ded583eb0867eefd75bbf3df363ef01b7932b70e7b068a2656173d241e8f20bb6be3a3a3767111aa6f459f84be961c2337f6e03ed3cc6c847a3683894288b471504cbdc43a78f856801a10a87c77322e36e0ca426ec67ad3a2a3b79bc5cb81928a79a67a0fb46bb967cbab73fd36022f92d920204de61717dde6a85b7bcf57584c11ce54ac92998f856bf042a01c5017345a34999a1048429a6ac79724c62d55446e80fe8fe17c45eee3fbff6d5adb18976d640fa9d0cdc20bed46b5c726df89e442099e0d5a7c7229c3c17dd878671c2794a56de602afc80c531d41f6239868a7f6c2eaf6ee31e765fccd39d9f8f20ca9299f4339b73796bdb401f68953f9b796798756c87db489cf79b7a29c4c6124b6cccd46862b0c28a6f2a03603cb6dfecf6a9b92a01f722b47b50d04963fc12cef50cc58129155b15f279e8bc71a20a663022516cd7c72b9c6cd3782569d150f046473cbb519f5719cd1c8edae7313d9869a20ef43cf2f668cbf98b904e421301b032acb7515be27039f0a02275eacac5600eb1df8d8e48096b31ecce40dbc1a462346830d8dee6311caec0a83aff85a70a0180b999bd3c1b2932596ef3c9524fbf7971c6d9e75ecdbd2ec7943b47d7feec6f26abe42c6aa6bc4f10085843712406bf56c20010ec8dbe8684e174894aa0b6471ef3d3a33ef77887fe5a6b33220a7a1991e56a31e51d2cd82555ccd8f31056d312d9f4c37ba7915a271ca814222616327752f8354ff401a5cf2efcc342752f919a11a0a7a35a1b574ea36637f2c6e14989ad2f7668502cebbd59b3346379d577daf4a0981f0a341d38d9ee58a0463484d31623127c09c6cec446a9ac9a53cb6841ca2a097ceef88e537e209880ffdcfd5033bc3f5a885c271e41ee332366345fa867780beb3c1d5eaa496ea09055c1664fe43a3cee202c7086555143481e8407952aacd465042664e99dc869d1d0641ba576f7351c66c4177418bde4d2e3146083e9362cdba7c0a0ddd2ef8c82b2db81d6fa83b980ab5eabd8a697cdea718c98148d907c2732a3912bfffb59b0a01f361062fc5eb023866f05f6f24277f2b862978b8be3a195787d83b2793092b2060ecd7e35d7ccc5588c367292d227e94b521736a89da3093cc26a45c4f450b64ff3e97f834e2e1303cb0abc9b31704c4b4f99a595e0b32e8632628a1b31f11caf94b127957d16938243e7b9da2c99131bfba20d052f1f741a4e724b4442008cd72dc748b9dd66eb047c4fe9768d0f752aac429c8dede3b8173d7d0e2e4f228985166aa6daa1e3e8bc8cec535cc49fb04cc983eef4b0489ca58d5127b7a4c110fbb8418e62e1086ceeeff2fcda91add54a78321104268324cb978846c129309e5c32019fbd8052926e9945847120ce2bd31a6fde1ad4a333d37c2d948d83b120b6b6d387a0f7fe5f7dfaf3ab3af823d4bb85236ba2d5e8887f5a322190296046eaa65541bce11841715fb8243c61739456c3219755317d0d2d3f84e58dcd115cfbbd8e41b40a6244082c566923dc347ecf89ff8683c7b56dc3af8dde4804f245883c795c063ca8f0e676f70a76e463b325f4754f992c72a18197c4265904822a7e3926f2a0b5e928982620244b3fa5a74a6d77cf3b212dc1cc738487604752fe83dadcc0a47916ef7c4643b82c068b50ccc27589a3d41e86d9b028236e94f24b13227d4df86f3fcb52c583b6feb799268050d2527a6ae8662735dcf14a07c0bc93053770d51f357c745e6c9c1546699eeda30310f3277630a023b5dcfb1a10f4155812cd16cc0048d8844187135ce6a6c90e81c4ecc3e503f26ea92dfe5a817cdd5cbaa3fe8bffacc2f6940eb0c5ba38eb739133532579194d745218102bb088ff27a05e9d5d857b8d131974574fa4a1511b0497e2b332ffe349571d59da52c2225198daa0e27f0e429523c3bd45bbd4d0bddee05003c953e5d22c42ade7f0e3b871be6eaf13236041a6ca2614ea28cb541352aa0eca871a852be7bbabfe30c3173bcbdd8733f8d0df021ee3a454551194d07518f936a2cfef1c0c1196ee50772aea8115ef7e2f2523c18cfb2dae0c60f04d13b7e8d4c8cde37759f5dc5270103f142f7085265670f065353108b482fc711c0ee1279cbc0c85811e3f58bf4199d7b1fdf06e516bd2b85ee9012c2cebf508a4d76779df91a1ab8481765c74c29c2afe960284cf26a0a917979539bc21cd620dab7d35e624a36f9c20baaa6d52ad980d965aed1dfb5495455fb68b41e3ba9ee06521960fe63d4441dbf3b7a352b28baec06f95a8cdcf4aa81ec02a44712a21202439c19409d137f22c115ff871297f0c3eee03f15cf46f9f786d3c7596084b24439d7b95ea61b357c24b967ae204113c1ec8cf103289aaa6b9436da1f572cb1972fe2305b74a88a74ee5353391c3f13a1d0fbc1e674fa13f385b34f7eda4a6ae60eb27aa02fdad51757820b7c0e7b2744e7782fe393581875b14e8d62cd51c6f5621d500f99216d1797dec34522f4baa9ee2ef08fa4338582f8a2ea1109715304d95690ad7141c02d4914b3482dbffd460e1bda19f0b4bcde737c899b5e8b149545611a69a51d121de0f404a62b9c5fe22a7eff88d9dc7625a2b421ea63fc4bd1c3de012179a2a896be077a35108e1b0cf51d88c6e57ab0bd702527959e9805d6f7c6628e337ac905df6bda5713c88ef0c3a2d7a54837f1313ceb899ec6cb96253c24ac94a87f2a0bd90373f81f84f10d4bba42c769ecea87a4bbf854c151772fd97e31bf3e531c8aee6d0dfe01f06fe15736edae5b11ac891cc8b5b847b6b0c7d9e09c5856d755a1d9ab15872e89bca1e7a253e547584b144e517daf9fe4824001d92a7bc355baaa421aa1f92ae543153ca763112d9181802212bd8cb1f7047fe09bff0bf17ad3acff6148d42de1d4b0ecf116b80ead2f02c118b6df97df4f56baf03f5955173f9d68f827ed27ad554f90aff457a8a23280e2be8885d5d3642f0ec59b3a1ec492ae8f4cdd85125ac43e978624cdb90de36025b6ac4e0d83e4735c67858b6afe1c72794b2f8f154e162a34beb4b7fb3bfbc1925cbc903321f47a70f532417d7eacde29cc747d1f7e85b9ebc9881281c08219b47f01dd25a0cabbbf682afdb25fa9e750f9159e120e9e372281d0859ed0b8977cf93eed7ae008b71e7fce7db5ead0d46065e90509dd2e820573d21adc9c48cad23b0b7d0feed2a8300e1e5dc489a61e4cd316ca29f60acd695b5630a10caa7c3d21c151f7e4dc343e98e1753a8e446c554859f02a8614476fea682a8e2ea573bb36dc88d7d8c51e14a11a22834fdd33cd6a077f00b5f8bdfef25b77c6f4985199b3b8dc039f385df28607fcdd45f64d745d5bde0cb5f17221f8335b58db4fd93a1aa6e16d091c66cdc903e4519eb95683c7eff018d47f14e841e216ef87942b3364ce60d94c2eba0a8d4d9909ad4be7e0a866dd0880a33e25c95afb6100f737083a761451047d59b753032e68cb591d1ba5a09d0ab6f9196887dc665035140aec389bfcb7e304dadf6509f4a8e466c8c52c124b1f9002e724d23e13f4bda538a4003a6b719e08075d4aea1a881f9c90fd34b4f22b9983e7ce125798e735db18dc08c49e95e20b685bf2a9ee2d6ea7cc1437e7b1201348d0d498e170c185f96a771a4642f444ec00ccf69fb94869926eb0f539f01be43ab9e8823c746bbf27bbc62081218eb728595fafd0f257bb0267468b4b2111636c36985b5450f724201f3cf862423ff099c177b53624f07a699b831a98ae06d21c2ed3ff85c918c27abb2fbe3266bce49d11de75b54a577ba0f4e1286fbe2523a04d1245a9940cf25efd5d2b4f1d9a38c939b439484964d1458ac5f63a8f0449ec481df725c09691bdd8b4605f2c378f4326055193cd7e0d4e625763da941c71f8ba138c652fc8b1230bb1ffc1d8649e883079d6f72154ee5e91c16b46e11f9de2cb6581ea13027a6445aa0f2dceb24de24e119b421f7718bff774bfd33c15bf1db21b36cd7ab8bcc97cbb2f79126640dfc5926290638e4c1099b7ca9673253fe95dbcfefad83574d6d3bb4934a57152a4dd598178900f8c4283dca089f71e1760d063de4d4e16ba091db51d7bcb31257831b78e74534f2d87fbc534ae09138bbbfa082932956596372c6f57c29cd18daecb33e2e40eff4fb23844b99dfc234258d2105be4f8f95ae781e8e5b105cacdb4bedcf319d548f75f53257041ed08b96961984cef1d11aeb686c928e12b5a2d8315d12fec299f6a47278af96e3a0ef706564615c35891a21d3e4c6ace3863ceb74eb610f6df878743d1126194ee21afc2f5121aed95c8b776bdd74536bee8708410ded1ef78400498c2b842e257214a9e7c186fd8cf719303653d6f0848de33d142161c9116e281efba4714f82c2049a208ab4cd5b9f98a1601b2cb0d4fbb7570938e1d536140d4cc4c05a69c20295367916c381f7f60e3589a2b6e1b9c8bfe57985ec74fd7ce9c8d311b2483dd28f5b53c50c6a1556d6bfc3ec7ad225939a0b0e87fc8ae3cf49c632c6f8d0f3b0e36cf8f44fa705719f1cc74949aa5c97866e2f8abb9a329700c64210cb701932c9f527bc4e2a83637f0eb868c700f66df7e6bde882c686a2832862366a4759c0920569110fa746596834284a02db15179d900454bf2d3a8f912ee1a62a32c071bb89c96cf82a3173caab9901b2ab1d005b21ff8dddf2e4a7c8b4174534648ce1f473f57ce66cb4877561212f1424b7808f47cb267d3a9f7c6122a23f146840529440cf04028b263e2432120acf949234e59b01b1c5edfe36968138f771db95b19bbdf7ac619ccc786132fc38687ab929fe10f7656b9b7f2f0f8ff1c2567e5d4092eeed98d0b457811d6516cf28c935606774c9676cc27d77b7229b13d5c7409064a369b568b597f7dabf1fee789328a6a216ebad1d827bea6f3dc73de73b8f00d2cbf971ea012fdfe667fa3c71827d0831e119023625038e5caeef9244e20e305834cecd12f46e2dfc4e73154ae503b431d62de912fadcd3785203a41d9457d291826033c13ccac3bc3a63425f14953eed324c08f03d2a5722c76ed44712720296c14474d1dab39626f11c0927c17fcab09040481732a9d13b976e8101836181591c892dfb24fd04250fb08bcca8d6649e4a17de62a9066bf74486cf09a1d01287c8535e17d8e466c2ea15ad5c300e1dd7a7d83470629a7e5f7f5151b1251161e1e75cb24c1e6ed7f99ae065b2dbcc5a96429445bbea9917571566a1d0defc601d76fb4390fe028274e98c82c78930ffdb30fb626bef3342d6f35994eb539a210af0e3ae6f3efdc7c5efcd287d7e699e6d1a402246a797d4db46fbbbbbb94cf257d65d7748f905906b74e7da9e8770e313ab08145e1f6b2eb684decf91fcd5a130e726c8d82850c78e1756542d52758a82d06f2839c79e9d13466b0477a0ab12743f4e1d5b347a5bbe7960af573d8ecaa19ecc2f467517a809b958502af98f42114752aa79a8fa137a23516ee6fceec1c2301dedb00ba071acdf7568266efad2a37a8884dbb5f76312429a2e4b0bdbe1131751b730e521b21693e5f0fb788fc21549886936f5608626170146dc1fb531f56ad7155510930cb19b33fdac1962009d7f1a7e779b32593404d855e10fa92b8c5db1daf63c8b36b00b8602f7e5a65", + "randomness": "0x" + }, + "config": { + "block_gas_limit": 625000, + "keccak_padding": 1600000, + "max_bytecode": 139500, + "max_calldata": 697500, + "max_rws": 3161966, + "max_txs": 80, + "min_k": 21, + "min_k_aggregation": 26, + "pad_to": 2097152 + }, + "gas": 21000 + } +} diff --git a/packages/protocol/test/libs/LibZKP.test.ts b/packages/protocol/test/libs/LibZKP.test.ts new file mode 100644 index 0000000000..71b7fe49f5 --- /dev/null +++ b/packages/protocol/test/libs/LibZKP.test.ts @@ -0,0 +1,33 @@ +// eslint-disable-next-line import/no-named-default +import { expect } from "chai"; +import hre, { ethers } from "hardhat"; +import * as utils from "../../tasks/utils"; +const testProof = require("../data/test_proof.json"); + +describe("LibZKP", function () { + let libZKP: any; + let plonkVerifierAddress: any; + before(async function () { + libZKP = await (await ethers.getContractFactory("TestLibZKP")).deploy(); + plonkVerifierAddress = await utils.deployBytecode( + hre, + utils.compileYulContract( + "../contracts/libs/yul/PlonkVerifier_10_txs.yulp" + ), + "PlonkVerifier_10_txs" + ); + }); + + it("should successfully verifiy the given zkp and instance", async function () { + const result = await libZKP.verify( + plonkVerifierAddress, + testProof.result.circuit.proof, + ethers.utils.hexConcat([ + testProof.result.circuit.instance[0], + testProof.result.circuit.instance[1], + ]) + ); + + expect(result).to.be.true; + }); +}); diff --git a/packages/protocol/test/tokenomics/proofReward.test.ts b/packages/protocol/test/tokenomics/proofReward.test.ts index 1ad13bfdf8..6e8103b9f8 100644 --- a/packages/protocol/test/tokenomics/proofReward.test.ts +++ b/packages/protocol/test/tokenomics/proofReward.test.ts @@ -5,16 +5,11 @@ import { TaikoL1 } from "../../typechain"; import { TestTaikoToken } from "../../typechain/TestTaikoToken"; import { pickRandomElement } from "../utils/array"; import blockListener from "../utils/blockListener"; -import { BlockMetadata } from "../utils/block_metadata"; import { initIntegrationFixture } from "../utils/fixture"; import Proposer from "../utils/proposer"; import Prover from "../utils/prover"; import { createAndSeedWallets, seedTko } from "../utils/seed"; -import { - commitProposeProveAndVerify, - sleepUntilBlockIsVerifiable, - verifyBlocks, -} from "../utils/verify"; +import { commitProposeProveAndVerify } from "../utils/verify"; describe("tokenomics: proofReward", function () { let taikoL1: TaikoL1; diff --git a/packages/protocol/test/utils/taikoToken.ts b/packages/protocol/test/utils/taikoToken.ts index 2cdbe7cb20..6c23ede0e9 100644 --- a/packages/protocol/test/utils/taikoToken.ts +++ b/packages/protocol/test/utils/taikoToken.ts @@ -7,7 +7,9 @@ const deployTaikoToken = async ( addressManager: AddressManager, protoBroker: string ) => { - const token = await (await hardhatEthers.getContractFactory("TestTaikoToken")) + const token = await ( + await hardhatEthers.getContractFactory("TestTaikoToken") + ) .connect(signer) .deploy(); await token.init("Taiko Token", "TKO", addressManager.address);