ETH Price: $3,273.43 (+1.69%)

Contract

0x3be7Df8dB39996a837041bb8Ee0dAdf60F767038
 

Overview

ETH Balance

10 ETH

Eth Value

$32,734.26 (@ $3,273.43/ETH)

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Add Light Client...204349652024-08-01 16:43:23162 days ago1722530603IN
0x3be7Df8d...60F767038
0 ETH0.0055905326.45167476
Add Light Client...155141832022-09-11 10:02:18852 days ago1662890538IN
0x3be7Df8d...60F767038
0 ETH0.010006016.79425794
Add Light Client...155132042022-09-11 6:01:58852 days ago1662876118IN
0x3be7Df8d...60F767038
0 ETH0.010624936.38562818
Add Light Client...155121902022-09-11 2:00:14852 days ago1662861614IN
0x3be7Df8d...60F767038
0 ETH0.011080337.24834256
Add Light Client...155111812022-09-10 21:59:18853 days ago1662847158IN
0x3be7Df8d...60F767038
0 ETH0.0549531124.63367022
Add Light Client...155101002022-09-10 17:45:57853 days ago1662831957IN
0x3be7Df8d...60F767038
0 ETH0.0231149115.82189127
Add Light Client...155091022022-09-10 13:44:59853 days ago1662817499IN
0x3be7Df8d...60F767038
0 ETH0.013935748.5591463
Add Light Client...155081142022-09-10 9:44:34853 days ago1662803074IN
0x3be7Df8d...60F767038
0 ETH0.013403378.60512132
Add Light Client...155071232022-09-10 5:44:07853 days ago1662788647IN
0x3be7Df8d...60F767038
0 ETH0.0265238711.58634939
Add Light Client...155060332022-09-10 1:30:02853 days ago1662773402IN
0x3be7Df8d...60F767038
0 ETH0.0226982914.69654173
Add Light Client...155050452022-09-09 21:29:24854 days ago1662758964IN
0x3be7Df8d...60F767038
0 ETH0.0254856916.25071773
Add Light Client...155039842022-09-09 17:29:12854 days ago1662744552IN
0x3be7Df8d...60F767038
0 ETH0.0553756734.90927516
Add Light Client...155029892022-09-09 13:28:30854 days ago1662730110IN
0x3be7Df8d...60F767038
0 ETH0.1152587754.56326174
Add Light Client...155020082022-09-09 9:27:30854 days ago1662715650IN
0x3be7Df8d...60F767038
0 ETH0.031033220.25287025
Add Light Client...155009952022-09-09 5:26:46854 days ago1662701206IN
0x3be7Df8d...60F767038
0 ETH0.0318093919.83205917
Add Light Client...154999392022-09-09 1:25:34854 days ago1662686734IN
0x3be7Df8d...60F767038
0 ETH0.0206736212.54539307
Add Light Client...154989152022-09-08 21:25:01855 days ago1662672301IN
0x3be7Df8d...60F767038
0 ETH0.0626530527.90189125
Add Light Client...154978702022-09-08 17:24:25855 days ago1662657865IN
0x3be7Df8d...60F767038
0 ETH0.25579376160.68820348
Add Light Client...154968162022-09-08 13:23:49855 days ago1662643429IN
0x3be7Df8d...60F767038
0 ETH0.0478309528.96144566
Add Light Client...154957552022-09-08 9:19:24855 days ago1662628764IN
0x3be7Df8d...60F767038
0 ETH0.01224518.24268354
Add Light Client...154947162022-09-08 5:18:43855 days ago1662614323IN
0x3be7Df8d...60F767038
0 ETH0.0272528512.6020118
Add Light Client...154936492022-09-08 1:17:56855 days ago1662599876IN
0x3be7Df8d...60F767038
0 ETH0.0640207939.61408594
Add Light Client...154925962022-09-07 21:16:26856 days ago1662585386IN
0x3be7Df8d...60F767038
0 ETH0.0379580524.20175548
Add Light Client...154915522022-09-07 17:15:23856 days ago1662570923IN
0x3be7Df8d...60F767038
0 ETH0.0453367529.46520368
Add Light Client...154904982022-09-07 13:15:03856 days ago1662556503IN
0x3be7Df8d...60F767038
0 ETH0.0332354914.45110681
View all transactions

Latest 5 internal transactions

Advanced mode:
Parent Transaction Hash Block
From
To
153787452022-08-20 16:49:50874 days ago1661014190
0x3be7Df8d...60F767038
2.5 ETH
153787412022-08-20 16:49:19874 days ago1661014159
0x3be7Df8d...60F767038
5 ETH
146898212022-05-01 4:24:03985 days ago1651379043
0x3be7Df8d...60F767038
2.5 ETH
146898072022-05-01 4:21:00985 days ago1651378860
0x3be7Df8d...60F767038
5 ETH
146897482022-05-01 4:10:47985 days ago1651378247
0x3be7Df8d...60F767038
5 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
NearBridge

Compiler Version
v0.8.3+commit.8d00100c

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity Multiple files format)

File 1 of 7: NearBridge.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity ^0.8;

import "./AdminControlled.sol";
import "./INearBridge.sol";
import "./NearDecoder.sol";
import "./Ed25519.sol";

contract NearBridge is INearBridge, AdminControlled {
    using Borsh for Borsh.Data;
    using NearDecoder for Borsh.Data;

    // Assumed to be even and to not exceed 256.
    uint constant MAX_BLOCK_PRODUCERS = 100;

    struct Epoch {
        bytes32 epochId;
        uint numBPs;
        bytes32[MAX_BLOCK_PRODUCERS] keys;
        bytes32[MAX_BLOCK_PRODUCERS / 2] packedStakes;
        uint256 stakeThreshold;
    }

    // Whether the contract was initialized.
    bool public initialized;
    uint256 public lockEthAmount;
    // lockDuration and replaceDuration shouldn't be extremely big, so adding them to an uint64 timestamp should not overflow uint256.
    uint256 public lockDuration;
    // replaceDuration is in nanoseconds, because it is a difference between NEAR timestamps.
    uint256 public replaceDuration;
    Ed25519 immutable edwards;

    Epoch[3] epochs;
    uint curEpoch;
    uint64 curHeight;

    // The most recently added block. May still be in its challenge period, so should not be trusted.
    uint64 untrustedHeight;
    uint256 untrustedTimestamp;
    bool untrustedNextEpoch;
    bytes32 untrustedHash;
    bytes32 untrustedMerkleRoot;
    bytes32 untrustedNextHash;
    uint256 untrustedSignatureSet;
    NearDecoder.Signature[MAX_BLOCK_PRODUCERS] untrustedSignatures;

    // Address of the account which submitted the last block.
    address lastSubmitter;
    // End of challenge period. If zero, untrusted* fields and lastSubmitter are not meaningful.
    uint public lastValidAt;

    mapping(uint64 => bytes32) blockHashes_;
    mapping(uint64 => bytes32) blockMerkleRoots_;
    mapping(address => uint256) public override balanceOf;

    constructor(
        Ed25519 ed,
        uint256 lockEthAmount_,
        uint256 lockDuration_,
        uint256 replaceDuration_,
        address admin_,
        uint256 pausedFlags_
    ) AdminControlled(admin_, pausedFlags_) {
        require(replaceDuration_ > lockDuration_ * 1000000000);
        edwards = ed;
        lockEthAmount = lockEthAmount_;
        lockDuration = lockDuration_;
        replaceDuration = replaceDuration_;
    }

    uint constant UNPAUSE_ALL = 0;
    uint constant PAUSED_DEPOSIT = 1;
    uint constant PAUSED_WITHDRAW = 2;
    uint constant PAUSED_ADD_BLOCK = 4;
    uint constant PAUSED_CHALLENGE = 8;
    uint constant PAUSED_VERIFY = 16;

    function deposit() public payable override pausable(PAUSED_DEPOSIT) {
        require(msg.value == lockEthAmount && balanceOf[msg.sender] == 0);
        balanceOf[msg.sender] = msg.value;
    }

    function withdraw() public override pausable(PAUSED_WITHDRAW) {
        require(msg.sender != lastSubmitter || block.timestamp >= lastValidAt);
        uint amount = balanceOf[msg.sender];
        require(amount != 0);
        balanceOf[msg.sender] = 0;
        payable(msg.sender).transfer(amount);
    }

    function challenge(address payable receiver, uint signatureIndex) public override pausable(PAUSED_CHALLENGE) {
        require(block.timestamp < lastValidAt, "No block can be challenged at this time");
        require(!checkBlockProducerSignatureInHead(signatureIndex), "Can't challenge valid signature");

        balanceOf[lastSubmitter] = balanceOf[lastSubmitter] - lockEthAmount;
        receiver.transfer(lockEthAmount / 2);
        lastValidAt = 0;
    }

    function checkBlockProducerSignatureInHead(uint signatureIndex) public view override returns (bool) {
        // Shifting by a number >= 256 returns zero.
        require((untrustedSignatureSet & (1 << signatureIndex)) != 0, "No such signature");
        unchecked {
            Epoch storage untrustedEpoch = epochs[untrustedNextEpoch ? (curEpoch + 1) % 3 : curEpoch];
            NearDecoder.Signature storage signature = untrustedSignatures[signatureIndex];
            bytes memory message = abi.encodePacked(
                uint8(0),
                untrustedNextHash,
                Utils.swapBytes8(untrustedHeight + 2),
                bytes23(0)
            );
            (bytes32 arg1, bytes9 arg2) = abi.decode(message, (bytes32, bytes9));
            return edwards.check(untrustedEpoch.keys[signatureIndex], signature.r, signature.s, arg1, arg2);
        }
    }

    // The first part of initialization -- setting the validators of the current epoch.
    function initWithValidators(bytes memory data) public override onlyAdmin {
        require(!initialized && epochs[0].numBPs == 0, "Wrong initialization stage");

        Borsh.Data memory borsh = Borsh.from(data);
        NearDecoder.BlockProducer[] memory initialValidators = borsh.decodeBlockProducers();
        borsh.done();

        setBlockProducers(initialValidators, epochs[0]);
    }

    // The second part of the initialization -- setting the current head.
    function initWithBlock(bytes memory data) public override onlyAdmin {
        require(!initialized && epochs[0].numBPs != 0, "Wrong initialization stage");
        initialized = true;

        Borsh.Data memory borsh = Borsh.from(data);
        NearDecoder.LightClientBlock memory nearBlock = borsh.decodeLightClientBlock();
        borsh.done();

        require(nearBlock.next_bps.some, "Initialization block must contain next_bps");

        curHeight = nearBlock.inner_lite.height;
        epochs[0].epochId = nearBlock.inner_lite.epoch_id;
        epochs[1].epochId = nearBlock.inner_lite.next_epoch_id;
        blockHashes_[nearBlock.inner_lite.height] = nearBlock.hash;
        blockMerkleRoots_[nearBlock.inner_lite.height] = nearBlock.inner_lite.block_merkle_root;
        setBlockProducers(nearBlock.next_bps.blockProducers, epochs[1]);
    }

    struct BridgeState {
        uint currentHeight; // Height of the current confirmed block
        // If there is currently no unconfirmed block, the last three fields are zero.
        uint nextTimestamp; // Timestamp of the current unconfirmed block
        uint nextValidAt; // Timestamp when the current unconfirmed block will be confirmed
        uint numBlockProducers; // Number of block producers for the current unconfirmed block
    }

    function bridgeState() public view returns (BridgeState memory res) {
        if (block.timestamp < lastValidAt) {
            res.currentHeight = curHeight;
            res.nextTimestamp = untrustedTimestamp;
            res.nextValidAt = lastValidAt;
            unchecked {
                res.numBlockProducers = epochs[untrustedNextEpoch ? (curEpoch + 1) % 3 : curEpoch].numBPs;
            }
        } else {
            res.currentHeight = lastValidAt == 0 ? curHeight : untrustedHeight;
        }
    }

    function addLightClientBlock(bytes memory data) public override pausable(PAUSED_ADD_BLOCK) {
        require(initialized, "Contract is not initialized");
        require(balanceOf[msg.sender] >= lockEthAmount, "Balance is not enough");

        Borsh.Data memory borsh = Borsh.from(data);
        NearDecoder.LightClientBlock memory nearBlock = borsh.decodeLightClientBlock();
        borsh.done();

        unchecked {
            // Commit the previous block, or make sure that it is OK to replace it.
            if (block.timestamp < lastValidAt) {
                require(
                    nearBlock.inner_lite.timestamp >= untrustedTimestamp + replaceDuration,
                    "Can only replace with a sufficiently newer block"
                );
            } else if (lastValidAt != 0) {
                curHeight = untrustedHeight;
                if (untrustedNextEpoch) {
                    curEpoch = (curEpoch + 1) % 3;
                }
                lastValidAt = 0;

                blockHashes_[curHeight] = untrustedHash;
                blockMerkleRoots_[curHeight] = untrustedMerkleRoot;
            }

            // Check that the new block's height is greater than the current one's.
            require(nearBlock.inner_lite.height > curHeight, "New block must have higher height");

            // Check that the new block is from the same epoch as the current one, or from the next one.
            bool fromNextEpoch;
            if (nearBlock.inner_lite.epoch_id == epochs[curEpoch].epochId) {
                fromNextEpoch = false;
            } else if (nearBlock.inner_lite.epoch_id == epochs[(curEpoch + 1) % 3].epochId) {
                fromNextEpoch = true;
            } else {
                revert("Epoch id of the block is not valid");
            }

            // Check that the new block is signed by more than 2/3 of the validators.
            Epoch storage thisEpoch = epochs[fromNextEpoch ? (curEpoch + 1) % 3 : curEpoch];
            // Last block in the epoch might contain extra approvals that light client can ignore.
            require(nearBlock.approvals_after_next.length >= thisEpoch.numBPs, "Approval list is too short");
            // The sum of uint128 values cannot overflow.
            uint256 votedFor = 0;
            for ((uint i, uint cnt) = (0, thisEpoch.numBPs); i != cnt; ++i) {
                bytes32 stakes = thisEpoch.packedStakes[i >> 1];
                if (nearBlock.approvals_after_next[i].some) {
                    votedFor += uint128(bytes16(stakes));
                }
                if (++i == cnt) {
                    break;
                }
                if (nearBlock.approvals_after_next[i].some) {
                    votedFor += uint128(uint256(stakes));
                }
            }
            require(votedFor > thisEpoch.stakeThreshold, "Too few approvals");

            // If the block is from the next epoch, make sure that next_bps is supplied and has a correct hash.
            if (fromNextEpoch) {
                require(nearBlock.next_bps.some, "Next next_bps should not be None");
                require(
                    nearBlock.next_bps.hash == nearBlock.inner_lite.next_bp_hash,
                    "Hash of block producers does not match"
                );
            }

            untrustedHeight = nearBlock.inner_lite.height;
            untrustedTimestamp = nearBlock.inner_lite.timestamp;
            untrustedHash = nearBlock.hash;
            untrustedMerkleRoot = nearBlock.inner_lite.block_merkle_root;
            untrustedNextHash = nearBlock.next_hash;

            uint256 signatureSet = 0;
            for ((uint i, uint cnt) = (0, thisEpoch.numBPs); i < cnt; i++) {
                NearDecoder.OptionalSignature memory approval = nearBlock.approvals_after_next[i];
                if (approval.some) {
                    signatureSet |= 1 << i;
                    untrustedSignatures[i] = approval.signature;
                }
            }
            untrustedSignatureSet = signatureSet;
            untrustedNextEpoch = fromNextEpoch;
            if (fromNextEpoch) {
                Epoch storage nextEpoch = epochs[(curEpoch + 2) % 3];
                nextEpoch.epochId = nearBlock.inner_lite.next_epoch_id;
                setBlockProducers(nearBlock.next_bps.blockProducers, nextEpoch);
            }
            lastSubmitter = msg.sender;
            lastValidAt = block.timestamp + lockDuration;
        }
    }

    function setBlockProducers(NearDecoder.BlockProducer[] memory src, Epoch storage epoch) internal {
        uint cnt = src.length;
        require(cnt <= MAX_BLOCK_PRODUCERS, "It is not expected having that many block producers for the provided block");
        epoch.numBPs = cnt;
        unchecked {
            for (uint i = 0; i < cnt; i++) {
                epoch.keys[i] = src[i].publicKey.k;
            }
            uint256 totalStake = 0; // Sum of uint128, can't be too big.
            for (uint i = 0; i != cnt; ++i) {
                uint128 stake1 = src[i].stake;
                totalStake += stake1;
                if (++i == cnt) {
                    epoch.packedStakes[i >> 1] = bytes32(bytes16(stake1));
                    break;
                }
                uint128 stake2 = src[i].stake;
                totalStake += stake2;
                epoch.packedStakes[i >> 1] = bytes32(uint256(bytes32(bytes16(stake1))) + stake2);
            }
            epoch.stakeThreshold = (totalStake * 2) / 3;
        }
    }

    function blockHashes(uint64 height) public view override pausable(PAUSED_VERIFY) returns (bytes32 res) {
        res = blockHashes_[height];
        if (res == 0 && block.timestamp >= lastValidAt && lastValidAt != 0 && height == untrustedHeight) {
            res = untrustedHash;
        }
    }

    function blockMerkleRoots(uint64 height) public view override pausable(PAUSED_VERIFY) returns (bytes32 res) {
        res = blockMerkleRoots_[height];
        if (res == 0 && block.timestamp >= lastValidAt && lastValidAt != 0 && height == untrustedHeight) {
            res = untrustedMerkleRoot;
        }
    }
}

File 2 of 7: AdminControlled.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity ^0.8;

contract AdminControlled {
    address public admin;
    uint public paused;

    constructor(address _admin, uint flags) {
        admin = _admin;
        paused = flags;
    }

    modifier onlyAdmin {
        require(msg.sender == admin);
        _;
    }

    modifier pausable(uint flag) {
        require((paused & flag) == 0 || msg.sender == admin);
        _;
    }

    function adminPause(uint flags) public onlyAdmin {
        paused = flags;
    }

    function adminSstore(uint key, uint value) public onlyAdmin {
        assembly {
            sstore(key, value)
        }
    }

    function adminSstoreWithMask(
        uint key,
        uint value,
        uint mask
    ) public onlyAdmin {
        assembly {
            let oldval := sload(key)
            sstore(key, xor(and(xor(value, oldval), mask), oldval))
        }
    }

    function adminSendEth(address payable destination, uint amount) public onlyAdmin {
        destination.transfer(amount);
    }

    function adminReceiveEth() public payable onlyAdmin {}

    function adminDelegatecall(address target, bytes memory data) public payable onlyAdmin returns (bytes memory) {
        (bool success, bytes memory rdata) = target.delegatecall(data);
        require(success);
        return rdata;
    }
}

File 3 of 7: Borsh.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity ^0.8;

import "./Utils.sol";

library Borsh {
    using Borsh for Data;

    struct Data {
        uint ptr;
        uint end;
    }

    function from(bytes memory data) internal pure returns (Data memory res) {
        uint ptr;
        assembly {
            ptr := data
        }
        unchecked {
            res.ptr = ptr + 32;
            res.end = res.ptr + Utils.readMemory(ptr);
        }
    }

    // This function assumes that length is reasonably small, so that data.ptr + length will not overflow. In the current code, length is always less than 2^32.
    function requireSpace(Data memory data, uint length) internal pure {
        unchecked {
            require(data.ptr + length <= data.end, "Parse error: unexpected EOI");
        }
    }

    function read(Data memory data, uint length) internal pure returns (bytes32 res) {
        data.requireSpace(length);
        res = bytes32(Utils.readMemory(data.ptr));
        unchecked {
            data.ptr += length;
        }
        return res;
    }

    function done(Data memory data) internal pure {
        require(data.ptr == data.end, "Parse error: EOI expected");
    }

    // Same considerations as for requireSpace.
    function peekKeccak256(Data memory data, uint length) internal pure returns (bytes32) {
        data.requireSpace(length);
        return Utils.keccak256Raw(data.ptr, length);
    }

    // Same considerations as for requireSpace.
    function peekSha256(Data memory data, uint length) internal view returns (bytes32) {
        data.requireSpace(length);
        return Utils.sha256Raw(data.ptr, length);
    }

    function decodeU8(Data memory data) internal pure returns (uint8) {
        return uint8(bytes1(data.read(1)));
    }

    function decodeU16(Data memory data) internal pure returns (uint16) {
        return Utils.swapBytes2(uint16(bytes2(data.read(2))));
    }

    function decodeU32(Data memory data) internal pure returns (uint32) {
        return Utils.swapBytes4(uint32(bytes4(data.read(4))));
    }

    function decodeU64(Data memory data) internal pure returns (uint64) {
        return Utils.swapBytes8(uint64(bytes8(data.read(8))));
    }

    function decodeU128(Data memory data) internal pure returns (uint128) {
        return Utils.swapBytes16(uint128(bytes16(data.read(16))));
    }

    function decodeU256(Data memory data) internal pure returns (uint256) {
        return Utils.swapBytes32(uint256(data.read(32)));
    }

    function decodeBytes20(Data memory data) internal pure returns (bytes20) {
        return bytes20(data.read(20));
    }

    function decodeBytes32(Data memory data) internal pure returns (bytes32) {
        return data.read(32);
    }

    function decodeBool(Data memory data) internal pure returns (bool) {
        uint8 res = data.decodeU8();
        require(res <= 1, "Parse error: invalid bool");
        return res != 0;
    }

    function skipBytes(Data memory data) internal pure {
        uint length = data.decodeU32();
        data.requireSpace(length);
        unchecked {
            data.ptr += length;
        }
    }

    function decodeBytes(Data memory data) internal pure returns (bytes memory res) {
        uint length = data.decodeU32();
        data.requireSpace(length);
        res = Utils.memoryToBytes(data.ptr, length);
        unchecked {
            data.ptr += length;
        }
    }
}

File 4 of 7: Ed25519.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity ^0.8;

contract Ed25519 {
    // Computes (v^(2^250-1), v^11) mod p
    function pow22501(uint256 v) private pure returns (uint256 p22501, uint256 p11) {
        p11 = mulmod(v, v, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        p22501 = mulmod(p11, p11, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        p22501 = mulmod(
            mulmod(p22501, p22501, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed),
            v,
            0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
        );
        p11 = mulmod(p22501, p11, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        p22501 = mulmod(
            mulmod(p11, p11, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed),
            p22501,
            0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
        );
        uint256 a = mulmod(p22501, p22501, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        p22501 = mulmod(p22501, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(p22501, p22501, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(p22501, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        uint256 b = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        p22501 = mulmod(p22501, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(p22501, p22501, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(p22501, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        b = mulmod(b, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, b, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        a = mulmod(a, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
        p22501 = mulmod(p22501, a, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
    }

    function check(
        bytes32 k,
        bytes32 r,
        bytes32 s,
        bytes32 m1,
        bytes9 m2
    ) public pure returns (bool) {
        unchecked {
            uint256 hh;
            // Step 1: compute SHA-512(R, A, M)
            {
                uint256[5][16] memory kk = [
                    [
                        uint256(0x428a2f98_d728ae22),
                        uint256(0xe49b69c1_9ef14ad2),
                        uint256(0x27b70a85_46d22ffc),
                        uint256(0x19a4c116_b8d2d0c8),
                        uint256(0xca273ece_ea26619c)
                    ],
                    [
                        uint256(0x71374491_23ef65cd),
                        uint256(0xefbe4786_384f25e3),
                        uint256(0x2e1b2138_5c26c926),
                        uint256(0x1e376c08_5141ab53),
                        uint256(0xd186b8c7_21c0c207)
                    ],
                    [
                        uint256(0xb5c0fbcf_ec4d3b2f),
                        uint256(0xfc19dc6_8b8cd5b5),
                        uint256(0x4d2c6dfc_5ac42aed),
                        uint256(0x2748774c_df8eeb99),
                        uint256(0xeada7dd6_cde0eb1e)
                    ],
                    [
                        uint256(0xe9b5dba5_8189dbbc),
                        uint256(0x240ca1cc_77ac9c65),
                        uint256(0x53380d13_9d95b3df),
                        uint256(0x34b0bcb5_e19b48a8),
                        uint256(0xf57d4f7f_ee6ed178)
                    ],
                    [
                        uint256(0x3956c25b_f348b538),
                        uint256(0x2de92c6f_592b0275),
                        uint256(0x650a7354_8baf63de),
                        uint256(0x391c0cb3_c5c95a63),
                        uint256(0x6f067aa_72176fba)
                    ],
                    [
                        uint256(0x59f111f1_b605d019),
                        uint256(0x4a7484aa_6ea6e483),
                        uint256(0x766a0abb_3c77b2a8),
                        uint256(0x4ed8aa4a_e3418acb),
                        uint256(0xa637dc5_a2c898a6)
                    ],
                    [
                        uint256(0x923f82a4_af194f9b),
                        uint256(0x5cb0a9dc_bd41fbd4),
                        uint256(0x81c2c92e_47edaee6),
                        uint256(0x5b9cca4f_7763e373),
                        uint256(0x113f9804_bef90dae)
                    ],
                    [
                        uint256(0xab1c5ed5_da6d8118),
                        uint256(0x76f988da_831153b5),
                        uint256(0x92722c85_1482353b),
                        uint256(0x682e6ff3_d6b2b8a3),
                        uint256(0x1b710b35_131c471b)
                    ],
                    [
                        uint256(0xd807aa98_a3030242),
                        uint256(0x983e5152_ee66dfab),
                        uint256(0xa2bfe8a1_4cf10364),
                        uint256(0x748f82ee_5defb2fc),
                        uint256(0x28db77f5_23047d84)
                    ],
                    [
                        uint256(0x12835b01_45706fbe),
                        uint256(0xa831c66d_2db43210),
                        uint256(0xa81a664b_bc423001),
                        uint256(0x78a5636f_43172f60),
                        uint256(0x32caab7b_40c72493)
                    ],
                    [
                        uint256(0x243185be_4ee4b28c),
                        uint256(0xb00327c8_98fb213f),
                        uint256(0xc24b8b70_d0f89791),
                        uint256(0x84c87814_a1f0ab72),
                        uint256(0x3c9ebe0a_15c9bebc)
                    ],
                    [
                        uint256(0x550c7dc3_d5ffb4e2),
                        uint256(0xbf597fc7_beef0ee4),
                        uint256(0xc76c51a3_0654be30),
                        uint256(0x8cc70208_1a6439ec),
                        uint256(0x431d67c4_9c100d4c)
                    ],
                    [
                        uint256(0x72be5d74_f27b896f),
                        uint256(0xc6e00bf3_3da88fc2),
                        uint256(0xd192e819_d6ef5218),
                        uint256(0x90befffa_23631e28),
                        uint256(0x4cc5d4be_cb3e42b6)
                    ],
                    [
                        uint256(0x80deb1fe_3b1696b1),
                        uint256(0xd5a79147_930aa725),
                        uint256(0xd6990624_5565a910),
                        uint256(0xa4506ceb_de82bde9),
                        uint256(0x597f299c_fc657e2a)
                    ],
                    [
                        uint256(0x9bdc06a7_25c71235),
                        uint256(0x6ca6351_e003826f),
                        uint256(0xf40e3585_5771202a),
                        uint256(0xbef9a3f7_b2c67915),
                        uint256(0x5fcb6fab_3ad6faec)
                    ],
                    [
                        uint256(0xc19bf174_cf692694),
                        uint256(0x14292967_0a0e6e70),
                        uint256(0x106aa070_32bbd1b8),
                        uint256(0xc67178f2_e372532b),
                        uint256(0x6c44198c_4a475817)
                    ]
                ];
                uint256 w0 = (uint256(r) & 0xffffffff_ffffffff_00000000_00000000_00000000_00000000_ffffffff_ffffffff) |
                    ((uint256(r) & 0xffffffff_ffffffff_00000000_00000000_00000000_00000000) >> 64) |
                    ((uint256(r) & 0xffffffff_ffffffff_00000000_00000000) << 64);
                uint256 w1 = (uint256(k) & 0xffffffff_ffffffff_00000000_00000000_00000000_00000000_ffffffff_ffffffff) |
                    ((uint256(k) & 0xffffffff_ffffffff_00000000_00000000_00000000_00000000) >> 64) |
                    ((uint256(k) & 0xffffffff_ffffffff_00000000_00000000) << 64);
                uint256 w2 = (uint256(m1) & 0xffffffff_ffffffff_00000000_00000000_00000000_00000000_ffffffff_ffffffff) |
                    ((uint256(m1) & 0xffffffff_ffffffff_00000000_00000000_00000000_00000000) >> 64) |
                    ((uint256(m1) & 0xffffffff_ffffffff_00000000_00000000) << 64);
                uint256 w3 = (uint256(bytes32(m2)) &
                    0xffffffff_ffffffff_00000000_00000000_00000000_00000000_00000000_00000000) |
                    ((uint256(bytes32(m2)) & 0xffffffff_ffffffff_00000000_00000000_00000000_00000000) >> 64) |
                    0x800000_00000000_00000000_00000348;
                uint256 a = 0x6a09e667_f3bcc908;
                uint256 b = 0xbb67ae85_84caa73b;
                uint256 c = 0x3c6ef372_fe94f82b;
                uint256 d = 0xa54ff53a_5f1d36f1;
                uint256 e = 0x510e527f_ade682d1;
                uint256 f = 0x9b05688c_2b3e6c1f;
                uint256 g = 0x1f83d9ab_fb41bd6b;
                uint256 h = 0x5be0cd19_137e2179;
                for (uint256 i = 0; ; i++) {
                    // Round 16 * i
                    {
                        uint256 temp1;
                        uint256 temp2;
                        e &= 0xffffffff_ffffffff;
                        {
                            uint256 ss = e | (e << 64);
                            uint256 s1 = (ss >> 14) ^ (ss >> 18) ^ (ss >> 41);
                            uint256 ch = (e & (f ^ g)) ^ g;
                            temp1 = h + s1 + ch;
                        }
                        temp1 += kk[0][i];
                        temp1 += w0 >> 192;
                        a &= 0xffffffff_ffffffff;
                        {
                            uint256 ss = a | (a << 64);
                            uint256 s0 = (ss >> 28) ^ (ss >> 34) ^ (ss >> 39);
                            uint256 maj = (a & (b | c)) | (b & c);
                            temp2 = s0 + maj;
                        }
                        h = g;
                        g = f;
                        f = e;
                        e = d + temp1;
                        d = c;
                        c = b;
                        b = a;
                        a = temp1 + temp2;
                    }
                    // Round 16 * i + 1
                    {
                        uint256 temp1;
                        uint256 temp2;
                        e &= 0xffffffff_ffffffff;
                        {
                            uint256 ss = e | (e << 64);
                            uint256 s1 = (ss >> 14) ^ (ss >> 18) ^ (ss >> 41);
                            uint256 ch = (e & (f ^ g)) ^ g;
                            temp1 = h + s1 + ch;
                        }
                        temp1 += kk[1][i];
                        temp1 += w0 >> 64;
                        a &= 0xffffffff_ffffffff;
                        {
                            uint256 ss = a | (a << 64);
                            uint256 s0 = (ss >> 28) ^ (ss >> 34) ^ (ss >> 39);
                            uint256 maj = (a & (b | c)) | (b & c);
                            temp2 = s0 + maj;
                        }
                        h = g;
                        g = f;
                        f = e;
                        e = d + temp1;
                        d = c;
                        c = b;
                        b = a;
                        a = temp1 + temp2;
                    }
                    // Round 16 * i + 2
                    {
                        uint256 temp1;
                        uint256 temp2;
                        e &= 0xffffffff_ffffffff;
                        {
                            uint256 ss = e | (e << 64);
                            uint256 s1 = (ss >> 14) ^ (ss >> 18) ^ (ss >> 41);
                            uint256 ch = (e & (f ^ g)) ^ g;
                            temp1 = h + s1 + ch;
                        }
                        temp1 += kk[2][i];
                        temp1 += w0 >> 128;
                        a &= 0xffffffff_ffffffff;
                        {
                            uint256 ss = a | (a << 64);
                            uint256 s0 = (ss >> 28) ^ (ss >> 34) ^ (ss >> 39);
                            uint256 maj = (a & (b | c)) | (b & c);
                            temp2 = s0 + maj;
                        }
                        h = g;
                        g = f;
                        f = e;
                        e = d + temp1;
                        d = c;
                        c = b;
                        b = a;
                        a = temp1 + temp2;
                    }
                    // Round 16 * i + 3
                    {
                        uint256 temp1;
                        uint256 temp2;
                        e &= 0xffffffff_ffffffff;
                        {
                            uint256 ss = e | (e << 64);
                            uint256 s1 = (ss >> 14) ^ (ss >> 18) ^ (ss >> 41);
                            uint256 ch = (e & (f ^ g)) ^ g;
                            temp1 = h + s1 + ch;
                        }
                        temp1 += kk[3][i];
                        temp1 += w0;
                        a &= 0xffffffff_ffffffff;
                        {
                            uint256 ss = a | (a << 64);
                            uint256 s0 = (ss >> 28) ^ (ss >> 34) ^ (ss >> 39);
                            uint256 maj = (a & (b | c)) | (b & c);
                            temp2 = s0 + maj;
                        }
                        h = g;
                        g = f;
                        f = e;
                        e = d + temp1;
                        d = c;
                        c = b;
                        b = a;
                        a = temp1 + temp2;
                    }
                    // Round 16 * i + 4
                    {
                        uint256 temp1;
                        uint256 temp2;
                        e &= 0xffffffff_ffffffff;
                        {
                            uint256 ss = e | (e << 64);
                            uint256 s1 = (ss >> 14) ^ (ss >> 18) ^ (ss >> 41);
                            uint256 ch = (e & (f ^ g)) ^ g;
                            temp1 = h + s1 + ch;
                        }
                        temp1 += kk[4][i];
                        temp1 += w1 >> 192;
                        a &= 0xffffffff_ffffffff;
                        {
                            uint256 ss = a | (a << 64);
                            uint256 s0 = (ss >> 28) ^ (ss >> 34) ^ (ss >> 39);
                            uint256 maj = (a & (b | c)) | (b & c);
                            temp2 = s0 + maj;
                        }
                        h = g;
                        g = f;
                        f = e;
                        e = d + temp1;
                        d = c;
                        c = b;
                        b = a;
                        a = temp1 + temp2;
                    }
                    // Round 16 * i + 5
                    {
                        uint256 temp1;
                        uint256 temp2;
                        e &= 0xffffffff_ffffffff;
                        {
                            uint256 ss = e | (e << 64);
                            uint256 s1 = (ss >> 14) ^ (ss >> 18) ^ (ss >> 41);
                            uint256 ch = (e & (f ^ g)) ^ g;
                            temp1 = h + s1 + ch;
                        }
                        temp1 += kk[5][i];
                        temp1 += w1 >> 64;
                        a &= 0xffffffff_ffffffff;
                        {
                            uint256 ss = a | (a << 64);
                            uint256 s0 = (ss >> 28) ^ (ss >> 34) ^ (ss >> 39);
                            uint256 maj = (a & (b | c)) | (b & c);
                            temp2 = s0 + maj;
                        }
                        h = g;
                        g = f;
                        f = e;
                        e = d + temp1;
                        d = c;
                        c = b;
                        b = a;
                        a = temp1 + temp2;
                    }
                    // Round 16 * i + 6
                    {
                        uint256 temp1;
                        uint256 temp2;
                        e &= 0xffffffff_ffffffff;
                        {
                            uint256 ss = e | (e << 64);
                            uint256 s1 = (ss >> 14) ^ (ss >> 18) ^ (ss >> 41);
                            uint256 ch = (e & (f ^ g)) ^ g;
                            temp1 = h + s1 + ch;
                        }
                        temp1 += kk[6][i];
                        temp1 += w1 >> 128;
                        a &= 0xffffffff_ffffffff;
                        {
                            uint256 ss = a | (a << 64);
                            uint256 s0 = (ss >> 28) ^ (ss >> 34) ^ (ss >> 39);
                            uint256 maj = (a & (b | c)) | (b & c);
                            temp2 = s0 + maj;
                        }
                        h = g;
                        g = f;
                        f = e;
                        e = d + temp1;
                        d = c;
                        c = b;
                        b = a;
                        a = temp1 + temp2;
                    }
                    // Round 16 * i + 7
                    {
                        uint256 temp1;
                        uint256 temp2;
                        e &= 0xffffffff_ffffffff;
                        {
                            uint256 ss = e | (e << 64);
                            uint256 s1 = (ss >> 14) ^ (ss >> 18) ^ (ss >> 41);
                            uint256 ch = (e & (f ^ g)) ^ g;
                            temp1 = h + s1 + ch;
                        }
                        temp1 += kk[7][i];
                        temp1 += w1;
                        a &= 0xffffffff_ffffffff;
                        {
                            uint256 ss = a | (a << 64);
                            uint256 s0 = (ss >> 28) ^ (ss >> 34) ^ (ss >> 39);
                            uint256 maj = (a & (b | c)) | (b & c);
                            temp2 = s0 + maj;
                        }
                        h = g;
                        g = f;
                        f = e;
                        e = d + temp1;
                        d = c;
                        c = b;
                        b = a;
                        a = temp1 + temp2;
                    }
                    // Round 16 * i + 8
                    {
                        uint256 temp1;
                        uint256 temp2;
                        e &= 0xffffffff_ffffffff;
                        {
                            uint256 ss = e | (e << 64);
                            uint256 s1 = (ss >> 14) ^ (ss >> 18) ^ (ss >> 41);
                            uint256 ch = (e & (f ^ g)) ^ g;
                            temp1 = h + s1 + ch;
                        }
                        temp1 += kk[8][i];
                        temp1 += w2 >> 192;
                        a &= 0xffffffff_ffffffff;
                        {
                            uint256 ss = a | (a << 64);
                            uint256 s0 = (ss >> 28) ^ (ss >> 34) ^ (ss >> 39);
                            uint256 maj = (a & (b | c)) | (b & c);
                            temp2 = s0 + maj;
                        }
                        h = g;
                        g = f;
                        f = e;
                        e = d + temp1;
                        d = c;
                        c = b;
                        b = a;
                        a = temp1 + temp2;
                    }
                    // Round 16 * i + 9
                    {
                        uint256 temp1;
                        uint256 temp2;
                        e &= 0xffffffff_ffffffff;
                        {
                            uint256 ss = e | (e << 64);
                            uint256 s1 = (ss >> 14) ^ (ss >> 18) ^ (ss >> 41);
                            uint256 ch = (e & (f ^ g)) ^ g;
                            temp1 = h + s1 + ch;
                        }
                        temp1 += kk[9][i];
                        temp1 += w2 >> 64;
                        a &= 0xffffffff_ffffffff;
                        {
                            uint256 ss = a | (a << 64);
                            uint256 s0 = (ss >> 28) ^ (ss >> 34) ^ (ss >> 39);
                            uint256 maj = (a & (b | c)) | (b & c);
                            temp2 = s0 + maj;
                        }
                        h = g;
                        g = f;
                        f = e;
                        e = d + temp1;
                        d = c;
                        c = b;
                        b = a;
                        a = temp1 + temp2;
                    }
                    // Round 16 * i + 10
                    {
                        uint256 temp1;
                        uint256 temp2;
                        e &= 0xffffffff_ffffffff;
                        {
                            uint256 ss = e | (e << 64);
                            uint256 s1 = (ss >> 14) ^ (ss >> 18) ^ (ss >> 41);
                            uint256 ch = (e & (f ^ g)) ^ g;
                            temp1 = h + s1 + ch;
                        }
                        temp1 += kk[10][i];
                        temp1 += w2 >> 128;
                        a &= 0xffffffff_ffffffff;
                        {
                            uint256 ss = a | (a << 64);
                            uint256 s0 = (ss >> 28) ^ (ss >> 34) ^ (ss >> 39);
                            uint256 maj = (a & (b | c)) | (b & c);
                            temp2 = s0 + maj;
                        }
                        h = g;
                        g = f;
                        f = e;
                        e = d + temp1;
                        d = c;
                        c = b;
                        b = a;
                        a = temp1 + temp2;
                    }
                    // Round 16 * i + 11
                    {
                        uint256 temp1;
                        uint256 temp2;
                        e &= 0xffffffff_ffffffff;
                        {
                            uint256 ss = e | (e << 64);
                            uint256 s1 = (ss >> 14) ^ (ss >> 18) ^ (ss >> 41);
                            uint256 ch = (e & (f ^ g)) ^ g;
                            temp1 = h + s1 + ch;
                        }
                        temp1 += kk[11][i];
                        temp1 += w2;
                        a &= 0xffffffff_ffffffff;
                        {
                            uint256 ss = a | (a << 64);
                            uint256 s0 = (ss >> 28) ^ (ss >> 34) ^ (ss >> 39);
                            uint256 maj = (a & (b | c)) | (b & c);
                            temp2 = s0 + maj;
                        }
                        h = g;
                        g = f;
                        f = e;
                        e = d + temp1;
                        d = c;
                        c = b;
                        b = a;
                        a = temp1 + temp2;
                    }
                    // Round 16 * i + 12
                    {
                        uint256 temp1;
                        uint256 temp2;
                        e &= 0xffffffff_ffffffff;
                        {
                            uint256 ss = e | (e << 64);
                            uint256 s1 = (ss >> 14) ^ (ss >> 18) ^ (ss >> 41);
                            uint256 ch = (e & (f ^ g)) ^ g;
                            temp1 = h + s1 + ch;
                        }
                        temp1 += kk[12][i];
                        temp1 += w3 >> 192;
                        a &= 0xffffffff_ffffffff;
                        {
                            uint256 ss = a | (a << 64);
                            uint256 s0 = (ss >> 28) ^ (ss >> 34) ^ (ss >> 39);
                            uint256 maj = (a & (b | c)) | (b & c);
                            temp2 = s0 + maj;
                        }
                        h = g;
                        g = f;
                        f = e;
                        e = d + temp1;
                        d = c;
                        c = b;
                        b = a;
                        a = temp1 + temp2;
                    }
                    // Round 16 * i + 13
                    {
                        uint256 temp1;
                        uint256 temp2;
                        e &= 0xffffffff_ffffffff;
                        {
                            uint256 ss = e | (e << 64);
                            uint256 s1 = (ss >> 14) ^ (ss >> 18) ^ (ss >> 41);
                            uint256 ch = (e & (f ^ g)) ^ g;
                            temp1 = h + s1 + ch;
                        }
                        temp1 += kk[13][i];
                        temp1 += w3 >> 64;
                        a &= 0xffffffff_ffffffff;
                        {
                            uint256 ss = a | (a << 64);
                            uint256 s0 = (ss >> 28) ^ (ss >> 34) ^ (ss >> 39);
                            uint256 maj = (a & (b | c)) | (b & c);
                            temp2 = s0 + maj;
                        }
                        h = g;
                        g = f;
                        f = e;
                        e = d + temp1;
                        d = c;
                        c = b;
                        b = a;
                        a = temp1 + temp2;
                    }
                    // Round 16 * i + 14
                    {
                        uint256 temp1;
                        uint256 temp2;
                        e &= 0xffffffff_ffffffff;
                        {
                            uint256 ss = e | (e << 64);
                            uint256 s1 = (ss >> 14) ^ (ss >> 18) ^ (ss >> 41);
                            uint256 ch = (e & (f ^ g)) ^ g;
                            temp1 = h + s1 + ch;
                        }
                        temp1 += kk[14][i];
                        temp1 += w3 >> 128;
                        a &= 0xffffffff_ffffffff;
                        {
                            uint256 ss = a | (a << 64);
                            uint256 s0 = (ss >> 28) ^ (ss >> 34) ^ (ss >> 39);
                            uint256 maj = (a & (b | c)) | (b & c);
                            temp2 = s0 + maj;
                        }
                        h = g;
                        g = f;
                        f = e;
                        e = d + temp1;
                        d = c;
                        c = b;
                        b = a;
                        a = temp1 + temp2;
                    }
                    // Round 16 * i + 15
                    {
                        uint256 temp1;
                        uint256 temp2;
                        e &= 0xffffffff_ffffffff;
                        {
                            uint256 ss = e | (e << 64);
                            uint256 s1 = (ss >> 14) ^ (ss >> 18) ^ (ss >> 41);
                            uint256 ch = (e & (f ^ g)) ^ g;
                            temp1 = h + s1 + ch;
                        }
                        temp1 += kk[15][i];
                        temp1 += w3;
                        a &= 0xffffffff_ffffffff;
                        {
                            uint256 ss = a | (a << 64);
                            uint256 s0 = (ss >> 28) ^ (ss >> 34) ^ (ss >> 39);
                            uint256 maj = (a & (b | c)) | (b & c);
                            temp2 = s0 + maj;
                        }
                        h = g;
                        g = f;
                        f = e;
                        e = d + temp1;
                        d = c;
                        c = b;
                        b = a;
                        a = temp1 + temp2;
                    }
                    if (i == 4) {
                        break;
                    }
                    // Message expansion
                    uint256 t0 = w0;
                    uint256 t1 = w1;
                    {
                        uint256 t2 = w2;
                        uint256 t3 = w3;
                        {
                            uint256 n1 = t0 & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff_00000000_00000000;
                            n1 +=
                                ((t2 & 0xffffffff_ffffffff_00000000_00000000) << 128) |
                                ((t2 & 0xffffffff_ffffffff_00000000_00000000_00000000_00000000) >> 64);
                            {
                                uint256 u1 = ((t0 & 0xffffffff_ffffffff_00000000_00000000) << 64) |
                                    ((t0 & 0xffffffff_ffffffff_00000000_00000000_00000000_00000000) >> 128);
                                uint256 uu1 = u1 | (u1 << 64);
                                n1 +=
                                    ((uu1 << 63) ^ (uu1 << 56) ^ (u1 << 57)) &
                                    0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff_00000000_00000000;
                            }
                            {
                                uint256 v1 = t3 & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff;
                                uint256 vv1 = v1 | (v1 << 64);
                                n1 +=
                                    ((vv1 << 45) ^ (vv1 << 3) ^ (v1 << 58)) &
                                    0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff_00000000_00000000;
                            }
                            n1 &= 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff_00000000_00000000;
                            uint256 n2 = t0 & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff;
                            n2 += ((t2 & 0xffffffff_ffffffff) << 128) | (t3 >> 192);
                            {
                                uint256 u2 = ((t0 & 0xffffffff_ffffffff) << 128) | (t1 >> 192);
                                uint256 uu2 = u2 | (u2 << 64);
                                n2 +=
                                    ((uu2 >> 1) ^ (uu2 >> 8) ^ (u2 >> 7)) &
                                    0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff;
                            }
                            {
                                uint256 vv2 = n1 | (n1 >> 64);
                                n2 +=
                                    ((vv2 >> 19) ^ (vv2 >> 61) ^ (n1 >> 70)) &
                                    0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff;
                            }
                            n2 &= 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff;
                            t0 = n1 | n2;
                        }
                        {
                            uint256 n1 = t1 & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff_00000000_00000000;
                            n1 +=
                                ((t3 & 0xffffffff_ffffffff_00000000_00000000) << 128) |
                                ((t3 & 0xffffffff_ffffffff_00000000_00000000_00000000_00000000) >> 64);
                            {
                                uint256 u1 = ((t1 & 0xffffffff_ffffffff_00000000_00000000) << 64) |
                                    ((t1 & 0xffffffff_ffffffff_00000000_00000000_00000000_00000000) >> 128);
                                uint256 uu1 = u1 | (u1 << 64);
                                n1 +=
                                    ((uu1 << 63) ^ (uu1 << 56) ^ (u1 << 57)) &
                                    0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff_00000000_00000000;
                            }
                            {
                                uint256 v1 = t0 & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff;
                                uint256 vv1 = v1 | (v1 << 64);
                                n1 +=
                                    ((vv1 << 45) ^ (vv1 << 3) ^ (v1 << 58)) &
                                    0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff_00000000_00000000;
                            }
                            n1 &= 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff_00000000_00000000;
                            uint256 n2 = t1 & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff;
                            n2 += ((t3 & 0xffffffff_ffffffff) << 128) | (t0 >> 192);
                            {
                                uint256 u2 = ((t1 & 0xffffffff_ffffffff) << 128) | (t2 >> 192);
                                uint256 uu2 = u2 | (u2 << 64);
                                n2 +=
                                    ((uu2 >> 1) ^ (uu2 >> 8) ^ (u2 >> 7)) &
                                    0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff;
                            }
                            {
                                uint256 vv2 = n1 | (n1 >> 64);
                                n2 +=
                                    ((vv2 >> 19) ^ (vv2 >> 61) ^ (n1 >> 70)) &
                                    0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff;
                            }
                            n2 &= 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff;
                            t1 = n1 | n2;
                        }
                        {
                            uint256 n1 = t2 & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff_00000000_00000000;
                            n1 +=
                                ((t0 & 0xffffffff_ffffffff_00000000_00000000) << 128) |
                                ((t0 & 0xffffffff_ffffffff_00000000_00000000_00000000_00000000) >> 64);
                            {
                                uint256 u1 = ((t2 & 0xffffffff_ffffffff_00000000_00000000) << 64) |
                                    ((t2 & 0xffffffff_ffffffff_00000000_00000000_00000000_00000000) >> 128);
                                uint256 uu1 = u1 | (u1 << 64);
                                n1 +=
                                    ((uu1 << 63) ^ (uu1 << 56) ^ (u1 << 57)) &
                                    0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff_00000000_00000000;
                            }
                            {
                                uint256 v1 = t1 & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff;
                                uint256 vv1 = v1 | (v1 << 64);
                                n1 +=
                                    ((vv1 << 45) ^ (vv1 << 3) ^ (v1 << 58)) &
                                    0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff_00000000_00000000;
                            }
                            n1 &= 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff_00000000_00000000;
                            uint256 n2 = t2 & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff;
                            n2 += ((t0 & 0xffffffff_ffffffff) << 128) | (t1 >> 192);
                            {
                                uint256 u2 = ((t2 & 0xffffffff_ffffffff) << 128) | (t3 >> 192);
                                uint256 uu2 = u2 | (u2 << 64);
                                n2 +=
                                    ((uu2 >> 1) ^ (uu2 >> 8) ^ (u2 >> 7)) &
                                    0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff;
                            }
                            {
                                uint256 vv2 = n1 | (n1 >> 64);
                                n2 +=
                                    ((vv2 >> 19) ^ (vv2 >> 61) ^ (n1 >> 70)) &
                                    0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff;
                            }
                            n2 &= 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff;
                            t2 = n1 | n2;
                        }
                        {
                            uint256 n1 = t3 & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff_00000000_00000000;
                            n1 +=
                                ((t1 & 0xffffffff_ffffffff_00000000_00000000) << 128) |
                                ((t1 & 0xffffffff_ffffffff_00000000_00000000_00000000_00000000) >> 64);
                            {
                                uint256 u1 = ((t3 & 0xffffffff_ffffffff_00000000_00000000) << 64) |
                                    ((t3 & 0xffffffff_ffffffff_00000000_00000000_00000000_00000000) >> 128);
                                uint256 uu1 = u1 | (u1 << 64);
                                n1 +=
                                    ((uu1 << 63) ^ (uu1 << 56) ^ (u1 << 57)) &
                                    0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff_00000000_00000000;
                            }
                            {
                                uint256 v1 = t2 & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff;
                                uint256 vv1 = v1 | (v1 << 64);
                                n1 +=
                                    ((vv1 << 45) ^ (vv1 << 3) ^ (v1 << 58)) &
                                    0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff_00000000_00000000;
                            }
                            n1 &= 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff_00000000_00000000;
                            uint256 n2 = t3 & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff;
                            n2 += ((t1 & 0xffffffff_ffffffff) << 128) | (t2 >> 192);
                            {
                                uint256 u2 = ((t3 & 0xffffffff_ffffffff) << 128) | (t0 >> 192);
                                uint256 uu2 = u2 | (u2 << 64);
                                n2 +=
                                    ((uu2 >> 1) ^ (uu2 >> 8) ^ (u2 >> 7)) &
                                    0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff;
                            }
                            {
                                uint256 vv2 = n1 | (n1 >> 64);
                                n2 +=
                                    ((vv2 >> 19) ^ (vv2 >> 61) ^ (n1 >> 70)) &
                                    0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff;
                            }
                            n2 &= 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff;
                            t3 = n1 | n2;
                        }
                        w3 = t3;
                        w2 = t2;
                    }
                    w1 = t1;
                    w0 = t0;
                }
                uint256 h0 = ((a + 0x6a09e667_f3bcc908) & 0xffffffff_ffffffff) |
                    (((b + 0xbb67ae85_84caa73b) & 0xffffffff_ffffffff) << 64) |
                    (((c + 0x3c6ef372_fe94f82b) & 0xffffffff_ffffffff) << 128) |
                    ((d + 0xa54ff53a_5f1d36f1) << 192);
                h0 =
                    ((h0 & 0xff00ff_00ff00ff_00ff00ff_00ff00ff_00ff00ff_00ff00ff_00ff00ff_00ff00ff) << 8) |
                    ((h0 & 0xff00ff00_ff00ff00_ff00ff00_ff00ff00_ff00ff00_ff00ff00_ff00ff00_ff00ff00) >> 8);
                h0 =
                    ((h0 & 0xffff_0000ffff_0000ffff_0000ffff_0000ffff_0000ffff_0000ffff_0000ffff) << 16) |
                    ((h0 & 0xffff0000_ffff0000_ffff0000_ffff0000_ffff0000_ffff0000_ffff0000_ffff0000) >> 16);
                h0 =
                    ((h0 & 0xffffffff_00000000_ffffffff_00000000_ffffffff_00000000_ffffffff) << 32) |
                    ((h0 & 0xffffffff_00000000_ffffffff_00000000_ffffffff_00000000_ffffffff_00000000) >> 32);
                uint256 h1 = ((e + 0x510e527f_ade682d1) & 0xffffffff_ffffffff) |
                    (((f + 0x9b05688c_2b3e6c1f) & 0xffffffff_ffffffff) << 64) |
                    (((g + 0x1f83d9ab_fb41bd6b) & 0xffffffff_ffffffff) << 128) |
                    ((h + 0x5be0cd19_137e2179) << 192);
                h1 =
                    ((h1 & 0xff00ff_00ff00ff_00ff00ff_00ff00ff_00ff00ff_00ff00ff_00ff00ff_00ff00ff) << 8) |
                    ((h1 & 0xff00ff00_ff00ff00_ff00ff00_ff00ff00_ff00ff00_ff00ff00_ff00ff00_ff00ff00) >> 8);
                h1 =
                    ((h1 & 0xffff_0000ffff_0000ffff_0000ffff_0000ffff_0000ffff_0000ffff_0000ffff) << 16) |
                    ((h1 & 0xffff0000_ffff0000_ffff0000_ffff0000_ffff0000_ffff0000_ffff0000_ffff0000) >> 16);
                h1 =
                    ((h1 & 0xffffffff_00000000_ffffffff_00000000_ffffffff_00000000_ffffffff) << 32) |
                    ((h1 & 0xffffffff_00000000_ffffffff_00000000_ffffffff_00000000_ffffffff_00000000) >> 32);
                hh = addmod(
                    h0,
                    mulmod(
                        h1,
                        0xfffffff_ffffffff_ffffffff_fffffffe_c6ef5bf4_737dcf70_d6ec3174_8d98951d,
                        0x10000000_00000000_00000000_00000000_14def9de_a2f79cd6_5812631a_5cf5d3ed
                    ),
                    0x10000000_00000000_00000000_00000000_14def9de_a2f79cd6_5812631a_5cf5d3ed
                );
            }
            // Step 2: unpack k
            k = bytes32(
                ((uint256(k) & 0xff00ff_00ff00ff_00ff00ff_00ff00ff_00ff00ff_00ff00ff_00ff00ff_00ff00ff) << 8) |
                    ((uint256(k) & 0xff00ff00_ff00ff00_ff00ff00_ff00ff00_ff00ff00_ff00ff00_ff00ff00_ff00ff00) >> 8)
            );
            k = bytes32(
                ((uint256(k) & 0xffff_0000ffff_0000ffff_0000ffff_0000ffff_0000ffff_0000ffff_0000ffff) << 16) |
                    ((uint256(k) & 0xffff0000_ffff0000_ffff0000_ffff0000_ffff0000_ffff0000_ffff0000_ffff0000) >> 16)
            );
            k = bytes32(
                ((uint256(k) & 0xffffffff_00000000_ffffffff_00000000_ffffffff_00000000_ffffffff) << 32) |
                    ((uint256(k) & 0xffffffff_00000000_ffffffff_00000000_ffffffff_00000000_ffffffff_00000000) >> 32)
            );
            k = bytes32(
                ((uint256(k) & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff) << 64) |
                    ((uint256(k) & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff_00000000_00000000) >> 64)
            );
            k = bytes32((uint256(k) << 128) | (uint256(k) >> 128));
            uint256 ky = uint256(k) & 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff;
            uint256 kx;
            {
                uint256 ky2 = mulmod(ky, ky, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
                uint256 u = addmod(
                    ky2,
                    0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffec,
                    0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                );
                uint256 v = mulmod(
                    ky2,
                    0x52036cee_2b6ffe73_8cc74079_7779e898_00700a4d_4141d8ab_75eb4dca_135978a3,
                    0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                ) + 1;
                uint256 t = mulmod(u, v, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
                (kx, ) = pow22501(t);
                kx = mulmod(kx, kx, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
                kx = mulmod(
                    u,
                    mulmod(
                        mulmod(kx, kx, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed),
                        t,
                        0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                    ),
                    0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                );
                t = mulmod(
                    mulmod(kx, kx, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed),
                    v,
                    0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                );
                if (t != u) {
                    if (t != 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed - u) {
                        return false;
                    }
                    kx = mulmod(
                        kx,
                        0x2b832480_4fc1df0b_2b4d0099_3dfbd7a7_2f431806_ad2fe478_c4ee1b27_4a0ea0b0,
                        0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                    );
                }
            }
            if ((kx & 1) != uint256(k) >> 255) {
                kx = 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed - kx;
            }
            // Verify s
            s = bytes32(
                ((uint256(s) & 0xff00ff_00ff00ff_00ff00ff_00ff00ff_00ff00ff_00ff00ff_00ff00ff_00ff00ff) << 8) |
                    ((uint256(s) & 0xff00ff00_ff00ff00_ff00ff00_ff00ff00_ff00ff00_ff00ff00_ff00ff00_ff00ff00) >> 8)
            );
            s = bytes32(
                ((uint256(s) & 0xffff_0000ffff_0000ffff_0000ffff_0000ffff_0000ffff_0000ffff_0000ffff) << 16) |
                    ((uint256(s) & 0xffff0000_ffff0000_ffff0000_ffff0000_ffff0000_ffff0000_ffff0000_ffff0000) >> 16)
            );
            s = bytes32(
                ((uint256(s) & 0xffffffff_00000000_ffffffff_00000000_ffffffff_00000000_ffffffff) << 32) |
                    ((uint256(s) & 0xffffffff_00000000_ffffffff_00000000_ffffffff_00000000_ffffffff_00000000) >> 32)
            );
            s = bytes32(
                ((uint256(s) & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff) << 64) |
                    ((uint256(s) & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff_00000000_00000000) >> 64)
            );
            s = bytes32((uint256(s) << 128) | (uint256(s) >> 128));
            if (uint256(s) >= 0x10000000_00000000_00000000_00000000_14def9de_a2f79cd6_5812631a_5cf5d3ed) {
                return false;
            }
            uint256 vx;
            uint256 vu;
            uint256 vy;
            uint256 vv;
            // Step 3: compute multiples of k
            uint256[8][3][2] memory tables;
            {
                uint256 ks = ky + kx;
                uint256 kd = ky + 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed - kx;
                uint256 k2dt = mulmod(
                    mulmod(kx, ky, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed),
                    0x2406d9dc_56dffce7_198e80f2_eef3d130_00e0149a_8283b156_ebd69b94_26b2f159,
                    0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                );
                uint256 kky = ky;
                uint256 kkx = kx;
                uint256 kku = 1;
                uint256 kkv = 1;
                {
                    uint256 xx = mulmod(
                        kkx,
                        kkv,
                        0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                    );
                    uint256 yy = mulmod(
                        kky,
                        kku,
                        0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                    );
                    uint256 zz = mulmod(
                        kku,
                        kkv,
                        0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                    );
                    uint256 xx2 = mulmod(
                        xx,
                        xx,
                        0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                    );
                    uint256 yy2 = mulmod(
                        yy,
                        yy,
                        0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                    );
                    uint256 xxyy = mulmod(
                        xx,
                        yy,
                        0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                    );
                    uint256 zz2 = mulmod(
                        zz,
                        zz,
                        0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                    );
                    kkx = xxyy + xxyy;
                    kku = yy2 - xx2 + 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed;
                    kky = xx2 + yy2;
                    kkv = addmod(
                        zz2 + zz2,
                        0xffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffda - kku,
                        0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                    );
                }
                {
                    uint256 xx = mulmod(
                        kkx,
                        kkv,
                        0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                    );
                    uint256 yy = mulmod(
                        kky,
                        kku,
                        0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                    );
                    uint256 zz = mulmod(
                        kku,
                        kkv,
                        0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                    );
                    uint256 xx2 = mulmod(
                        xx,
                        xx,
                        0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                    );
                    uint256 yy2 = mulmod(
                        yy,
                        yy,
                        0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                    );
                    uint256 xxyy = mulmod(
                        xx,
                        yy,
                        0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                    );
                    uint256 zz2 = mulmod(
                        zz,
                        zz,
                        0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                    );
                    kkx = xxyy + xxyy;
                    kku = yy2 - xx2 + 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed;
                    kky = xx2 + yy2;
                    kkv = addmod(
                        zz2 + zz2,
                        0xffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffda - kku,
                        0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                    );
                }
                {
                    uint256 xx = mulmod(
                        kkx,
                        kkv,
                        0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                    );
                    uint256 yy = mulmod(
                        kky,
                        kku,
                        0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                    );
                    uint256 zz = mulmod(
                        kku,
                        kkv,
                        0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                    );
                    uint256 xx2 = mulmod(
                        xx,
                        xx,
                        0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                    );
                    uint256 yy2 = mulmod(
                        yy,
                        yy,
                        0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                    );
                    uint256 xxyy = mulmod(
                        xx,
                        yy,
                        0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                    );
                    uint256 zz2 = mulmod(
                        zz,
                        zz,
                        0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                    );
                    kkx = xxyy + xxyy;
                    kku = yy2 - xx2 + 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed;
                    kky = xx2 + yy2;
                    kkv = addmod(
                        zz2 + zz2,
                        0xffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffda - kku,
                        0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                    );
                }
                uint256 cprod = 1;
                uint256[8][3][2] memory tables_ = tables;
                for (uint256 i = 0; ; i++) {
                    uint256 cs;
                    uint256 cd;
                    uint256 ct;
                    uint256 c2z;
                    {
                        uint256 cx = mulmod(
                            kkx,
                            kkv,
                            0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                        );
                        uint256 cy = mulmod(
                            kky,
                            kku,
                            0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                        );
                        uint256 cz = mulmod(
                            kku,
                            kkv,
                            0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                        );
                        ct = mulmod(
                            kkx,
                            kky,
                            0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                        );
                        cs = cy + cx;
                        cd = cy - cx + 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed;
                        c2z = cz + cz;
                    }
                    tables_[1][0][i] = cs;
                    tables_[1][1][i] = cd;
                    tables_[1][2][i] = mulmod(
                        ct,
                        0x2406d9dc_56dffce7_198e80f2_eef3d130_00e0149a_8283b156_ebd69b94_26b2f159,
                        0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                    );
                    tables_[0][0][i] = c2z;
                    tables_[0][1][i] = cprod;
                    cprod = mulmod(
                        cprod,
                        c2z,
                        0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                    );
                    if (i == 7) {
                        break;
                    }
                    uint256 ab = mulmod(
                        cs,
                        ks,
                        0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                    );
                    uint256 aa = mulmod(
                        cd,
                        kd,
                        0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                    );
                    uint256 ac = mulmod(
                        ct,
                        k2dt,
                        0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                    );
                    kkx = ab - aa + 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed;
                    kku = addmod(c2z, ac, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
                    kky = ab + aa;
                    kkv = addmod(
                        c2z,
                        0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed - ac,
                        0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                    );
                }
                uint256 t;
                (cprod, t) = pow22501(cprod);
                cprod = mulmod(cprod, cprod, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
                cprod = mulmod(cprod, cprod, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
                cprod = mulmod(cprod, cprod, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
                cprod = mulmod(cprod, cprod, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
                cprod = mulmod(cprod, cprod, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
                cprod = mulmod(cprod, t, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
                for (uint256 i = 7; ; i--) {
                    uint256 cinv = mulmod(
                        cprod,
                        tables_[0][1][i],
                        0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                    );
                    tables_[1][0][i] = mulmod(
                        tables_[1][0][i],
                        cinv,
                        0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                    );
                    tables_[1][1][i] = mulmod(
                        tables_[1][1][i],
                        cinv,
                        0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                    );
                    tables_[1][2][i] = mulmod(
                        tables_[1][2][i],
                        cinv,
                        0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                    );
                    if (i == 0) {
                        break;
                    }
                    cprod = mulmod(
                        cprod,
                        tables_[0][0][i],
                        0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                    );
                }
                tables_[0] = [
                    [
                        0x43e7ce9d_19ea5d32_9385a44c_321ea161_67c996e3_7dc6070c_97de49e3_7ac61db9,
                        0x40cff344_25d8ec30_a3bb74ba_58cd5854_fa1e3818_6ad0d31e_bc8ae251_ceb2c97e,
                        0x459bd270_46e8dd45_aea7008d_b87a5a8f_79067792_53d64523_58951859_9fdfbf4b,
                        0x69fdd1e2_8c23cc38_94d0c8ff_90e76f6d_5b6e4c2e_620136d0_4dd83c4a_51581ab9,
                        0x54dceb34_13ce5cfa_11196dfc_960b6eda_f4b380c6_d4d23784_19cc0279_ba49c5f3,
                        0x4e24184d_d71a3d77_eef3729f_7f8cf7c1_7224cf40_aa7b9548_b9942f3c_5084ceed,
                        0x5a0e5aab_20262674_ae117576_1cbf5e88_9b52a55f_d7ac5027_c228cebd_c8d2360a,
                        0x26239334_073e9b38_c6285955_6d451c3d_cc8d30e8_4b361174_f488eadd_e2cf17d9
                    ],
                    [
                        0x227e97c9_4c7c0933_d2e0c21a_3447c504_fe9ccf82_e8a05f59_ce881c82_eba0489f,
                        0x226a3e0e_cc4afec6_fd0d2884_13014a9d_bddecf06_c1a2f0bb_702ba77c_613d8209,
                        0x34d7efc8_51d45c5e_71efeb0f_235b7946_91de6228_877569b3_a8d52bf0_58b8a4a0,
                        0x3c1f5fb3_ca7166fc_e1471c9b_752b6d28_c56301ad_7b65e845_1b2c8c55_26726e12,
                        0x6102416c_f02f02ff_5be75275_f55f28db_89b2a9d2_456b860c_e22fc0e5_031f7cc5,
                        0x40adf677_f1bfdae0_57f0fd17_9c126179_18ddaa28_91a6530f_b1a4294f_a8665490,
                        0x61936f3c_41560904_6187b8ba_a978cbc9_b4789336_3ae5a3cc_7d909f36_35ae7f48,
                        0x562a9662_b6ec47f9_e979d473_c02b51e4_42336823_8c58ddb5_2f0e5c6a_180e6410
                    ],
                    [
                        0x3788bdb4_4f8632d4_2d0dbee5_eea1acc6_136cf411_e655624f_55e48902_c3bd5534,
                        0x6190cf2c_2a7b5ad7_69d594a8_2844f23b_4167fa7c_8ac30e51_aa6cfbeb_dcd4b945,
                        0x65f77870_96be9204_123a71f3_ac88a87b_e1513217_737d6a1e_2f3a13a4_3d7e3a9a,
                        0x23af32d_bfa67975_536479a7_a7ce74a0_2142147f_ac048018_7f1f1334_9cda1f2d,
                        0x64fc44b7_fc6841bd_db0ced8b_8b0fe675_9137ef87_ee966512_15fc1dbc_d25c64dc,
                        0x1434aa37_48b701d5_b69df3d7_d340c1fe_3f6b9c1e_fc617484_caadb47e_382f4475,
                        0x457a6da8_c962ef35_f2b21742_3e5844e9_d2353452_7e8ea429_0d24e3dd_f21720c6,
                        0x63b9540c_eb60ccb5_1e4d989d_956e053c_f2511837_efb79089_d2ff4028_4202c53d
                    ]
                ];
            }
            // Step 4: compute s*G - h*A
            {
                uint256 ss = uint256(s) << 3;
                uint256 hhh = hh + 0x80000000_00000000_00000000_00000000_a6f7cef5_17bce6b2_c09318d2_e7ae9f60;
                uint256 vvx = 0;
                uint256 vvu = 1;
                uint256 vvy = 1;
                uint256 vvv = 1;
                for (uint256 i = 252; ; i--) {
                    uint256 bit = 8 << i;
                    if ((ss & bit) != 0) {
                        uint256 ws;
                        uint256 wd;
                        uint256 wz;
                        uint256 wt;
                        {
                            uint256 wx = mulmod(
                                vvx,
                                vvv,
                                0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                            );
                            uint256 wy = mulmod(
                                vvy,
                                vvu,
                                0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                            );
                            ws = wy + wx;
                            wd = wy - wx + 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed;
                            wz = mulmod(
                                vvu,
                                vvv,
                                0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                            );
                            wt = mulmod(
                                vvx,
                                vvy,
                                0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                            );
                        }
                        uint256 j = (ss >> i) & 7;
                        ss &= ~(7 << i);
                        uint256[8][3][2] memory tables_ = tables;
                        uint256 aa = mulmod(
                            wd,
                            tables_[0][1][j],
                            0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                        );
                        uint256 ab = mulmod(
                            ws,
                            tables_[0][0][j],
                            0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                        );
                        uint256 ac = mulmod(
                            wt,
                            tables_[0][2][j],
                            0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                        );
                        vvx = ab - aa + 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed;
                        vvu = wz + ac;
                        vvy = ab + aa;
                        vvv = wz - ac + 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed;
                    }
                    if ((hhh & bit) != 0) {
                        uint256 ws;
                        uint256 wd;
                        uint256 wz;
                        uint256 wt;
                        {
                            uint256 wx = mulmod(
                                vvx,
                                vvv,
                                0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                            );
                            uint256 wy = mulmod(
                                vvy,
                                vvu,
                                0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                            );
                            ws = wy + wx;
                            wd = wy - wx + 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed;
                            wz = mulmod(
                                vvu,
                                vvv,
                                0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                            );
                            wt = mulmod(
                                vvx,
                                vvy,
                                0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                            );
                        }
                        uint256 j = (hhh >> i) & 7;
                        hhh &= ~(7 << i);
                        uint256[8][3][2] memory tables_ = tables;
                        uint256 aa = mulmod(
                            wd,
                            tables_[1][0][j],
                            0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                        );
                        uint256 ab = mulmod(
                            ws,
                            tables_[1][1][j],
                            0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                        );
                        uint256 ac = mulmod(
                            wt,
                            tables_[1][2][j],
                            0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                        );
                        vvx = ab - aa + 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed;
                        vvu = wz - ac + 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed;
                        vvy = ab + aa;
                        vvv = wz + ac;
                    }
                    if (i == 0) {
                        uint256 ws;
                        uint256 wd;
                        uint256 wz;
                        uint256 wt;
                        {
                            uint256 wx = mulmod(
                                vvx,
                                vvv,
                                0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                            );
                            uint256 wy = mulmod(
                                vvy,
                                vvu,
                                0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                            );
                            ws = wy + wx;
                            wd = wy - wx + 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed;
                            wz = mulmod(
                                vvu,
                                vvv,
                                0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                            );
                            wt = mulmod(
                                vvx,
                                vvy,
                                0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                            );
                        }
                        uint256 j = hhh & 7;
                        uint256[8][3][2] memory tables_ = tables;
                        uint256 aa = mulmod(
                            wd,
                            tables_[1][0][j],
                            0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                        );
                        uint256 ab = mulmod(
                            ws,
                            tables_[1][1][j],
                            0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                        );
                        uint256 ac = mulmod(
                            wt,
                            tables_[1][2][j],
                            0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                        );
                        vvx = ab - aa + 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed;
                        vvu = wz - ac + 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed;
                        vvy = ab + aa;
                        vvv = wz + ac;
                        break;
                    }
                    {
                        uint256 xx = mulmod(
                            vvx,
                            vvv,
                            0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                        );
                        uint256 yy = mulmod(
                            vvy,
                            vvu,
                            0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                        );
                        uint256 zz = mulmod(
                            vvu,
                            vvv,
                            0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                        );
                        uint256 xx2 = mulmod(
                            xx,
                            xx,
                            0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                        );
                        uint256 yy2 = mulmod(
                            yy,
                            yy,
                            0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                        );
                        uint256 xxyy = mulmod(
                            xx,
                            yy,
                            0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                        );
                        uint256 zz2 = mulmod(
                            zz,
                            zz,
                            0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                        );
                        vvx = xxyy + xxyy;
                        vvu = yy2 - xx2 + 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed;
                        vvy = xx2 + yy2;
                        vvv = addmod(
                            zz2 + zz2,
                            0xffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffda - vvu,
                            0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
                        );
                    }
                }
                vx = vvx;
                vu = vvu;
                vy = vvy;
                vv = vvv;
            }
            // Step 5: compare the points
            (uint256 vi, uint256 vj) = pow22501(
                mulmod(vu, vv, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed)
            );
            vi = mulmod(vi, vi, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
            vi = mulmod(vi, vi, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
            vi = mulmod(vi, vi, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
            vi = mulmod(vi, vi, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
            vi = mulmod(vi, vi, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
            vi = mulmod(vi, vj, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed);
            vx = mulmod(
                vx,
                mulmod(vi, vv, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed),
                0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
            );
            vy = mulmod(
                vy,
                mulmod(vi, vu, 0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed),
                0x7fffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffff_ffffffed
            );
            bytes32 vr = bytes32(vy | (vx << 255));
            vr = bytes32(
                ((uint256(vr) & 0xff00ff_00ff00ff_00ff00ff_00ff00ff_00ff00ff_00ff00ff_00ff00ff_00ff00ff) << 8) |
                    ((uint256(vr) & 0xff00ff00_ff00ff00_ff00ff00_ff00ff00_ff00ff00_ff00ff00_ff00ff00_ff00ff00) >> 8)
            );
            vr = bytes32(
                ((uint256(vr) & 0xffff_0000ffff_0000ffff_0000ffff_0000ffff_0000ffff_0000ffff_0000ffff) << 16) |
                    ((uint256(vr) & 0xffff0000_ffff0000_ffff0000_ffff0000_ffff0000_ffff0000_ffff0000_ffff0000) >> 16)
            );
            vr = bytes32(
                ((uint256(vr) & 0xffffffff_00000000_ffffffff_00000000_ffffffff_00000000_ffffffff) << 32) |
                    ((uint256(vr) & 0xffffffff_00000000_ffffffff_00000000_ffffffff_00000000_ffffffff_00000000) >> 32)
            );
            vr = bytes32(
                ((uint256(vr) & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff) << 64) |
                    ((uint256(vr) & 0xffffffff_ffffffff_00000000_00000000_ffffffff_ffffffff_00000000_00000000) >> 64)
            );
            vr = bytes32((uint256(vr) << 128) | (uint256(vr) >> 128));
            return vr == r;
        }
    }
}

File 5 of 7: INearBridge.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity ^0.8;

interface INearBridge {
    event BlockHashAdded(uint64 indexed height, bytes32 blockHash);

    event BlockHashReverted(uint64 indexed height, bytes32 blockHash);

    function blockHashes(uint64 blockNumber) external view returns (bytes32);

    function blockMerkleRoots(uint64 blockNumber) external view returns (bytes32);

    function balanceOf(address wallet) external view returns (uint256);

    function deposit() external payable;

    function withdraw() external;

    function initWithValidators(bytes calldata initialValidators) external;

    function initWithBlock(bytes calldata data) external;

    function addLightClientBlock(bytes calldata data) external;

    function challenge(address payable receiver, uint256 signatureIndex) external;

    function checkBlockProducerSignatureInHead(uint256 signatureIndex) external view returns (bool);
}

File 6 of 7: NearDecoder.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity ^0.8;

import "./Borsh.sol";

library NearDecoder {
    using Borsh for Borsh.Data;
    using NearDecoder for Borsh.Data;

    uint8 constant VALIDATOR_V1 = 0;
    uint8 constant VALIDATOR_V2 = 1;

    struct PublicKey {
        bytes32 k;
    }

    function decodePublicKey(Borsh.Data memory data) internal pure returns (PublicKey memory res) {
        require(data.decodeU8() == 0, "Parse error: invalid key type");
        res.k = data.decodeBytes32();
    }

    struct Signature {
        bytes32 r;
        bytes32 s;
    }

    function decodeSignature(Borsh.Data memory data) internal pure returns (Signature memory res) {
        require(data.decodeU8() == 0, "Parse error: invalid signature type");
        res.r = data.decodeBytes32();
        res.s = data.decodeBytes32();
    }

    struct BlockProducer {
        PublicKey publicKey;
        uint128 stake;
        // Flag indicating if this validator proposed to be a chunk-only producer (i.e. cannot become a block producer).
        bool isChunkOnly;
    }

    function decodeBlockProducer(Borsh.Data memory data) internal pure returns (BlockProducer memory res) {
        uint8 validator_version = data.decodeU8();
        data.skipBytes();
        res.publicKey = data.decodePublicKey();
        res.stake = data.decodeU128();
        if (validator_version == VALIDATOR_V2) {
            res.isChunkOnly = data.decodeU8() != 0;
        } else {
            res.isChunkOnly = false;
        }
    }

    function decodeBlockProducers(Borsh.Data memory data) internal pure returns (BlockProducer[] memory res) {
        uint length = data.decodeU32();
        res = new BlockProducer[](length);
        for (uint i = 0; i < length; i++) {
            res[i] = data.decodeBlockProducer();
        }
    }

    struct OptionalBlockProducers {
        bool some;
        BlockProducer[] blockProducers;
        bytes32 hash; // Additional computable element
    }

    function decodeOptionalBlockProducers(Borsh.Data memory data)
        internal
        view
        returns (OptionalBlockProducers memory res)
    {
        res.some = data.decodeBool();
        if (res.some) {
            uint start = data.ptr;
            res.blockProducers = data.decodeBlockProducers();
            res.hash = Utils.sha256Raw(start, data.ptr - start);
        }
    }

    struct OptionalSignature {
        bool some;
        Signature signature;
    }

    function decodeOptionalSignature(Borsh.Data memory data) internal pure returns (OptionalSignature memory res) {
        res.some = data.decodeBool();
        if (res.some) {
            res.signature = data.decodeSignature();
        }
    }

    struct BlockHeaderInnerLite {
        uint64 height; // Height of this block since the genesis block (height 0).
        bytes32 epoch_id; // Epoch start hash of this block's epoch. Used for retrieving validator information
        bytes32 next_epoch_id;
        bytes32 prev_state_root; // Root hash of the state at the previous block.
        bytes32 outcome_root; // Root of the outcomes of transactions and receipts.
        uint64 timestamp; // Timestamp at which the block was built.
        bytes32 next_bp_hash; // Hash of the next epoch block producers set
        bytes32 block_merkle_root;
        bytes32 hash; // Additional computable element
    }

    function decodeBlockHeaderInnerLite(Borsh.Data memory data)
        internal
        view
        returns (BlockHeaderInnerLite memory res)
    {
        res.hash = data.peekSha256(208);
        res.height = data.decodeU64();
        res.epoch_id = data.decodeBytes32();
        res.next_epoch_id = data.decodeBytes32();
        res.prev_state_root = data.decodeBytes32();
        res.outcome_root = data.decodeBytes32();
        res.timestamp = data.decodeU64();
        res.next_bp_hash = data.decodeBytes32();
        res.block_merkle_root = data.decodeBytes32();
    }

    struct LightClientBlock {
        bytes32 prev_block_hash;
        bytes32 next_block_inner_hash;
        BlockHeaderInnerLite inner_lite;
        bytes32 inner_rest_hash;
        OptionalBlockProducers next_bps;
        OptionalSignature[] approvals_after_next;
        bytes32 hash;
        bytes32 next_hash;
    }

    function decodeLightClientBlock(Borsh.Data memory data) internal view returns (LightClientBlock memory res) {
        res.prev_block_hash = data.decodeBytes32();
        res.next_block_inner_hash = data.decodeBytes32();
        res.inner_lite = data.decodeBlockHeaderInnerLite();
        res.inner_rest_hash = data.decodeBytes32();
        res.next_bps = data.decodeOptionalBlockProducers();

        uint length = data.decodeU32();
        res.approvals_after_next = new OptionalSignature[](length);
        for (uint i = 0; i < length; i++) {
            res.approvals_after_next[i] = data.decodeOptionalSignature();
        }

        res.hash = sha256(
            abi.encodePacked(sha256(abi.encodePacked(res.inner_lite.hash, res.inner_rest_hash)), res.prev_block_hash)
        );

        res.next_hash = sha256(abi.encodePacked(res.next_block_inner_hash, res.hash));
    }
}

File 7 of 7: Utils.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity ^0.8;

library Utils {
    function swapBytes2(uint16 v) internal pure returns (uint16) {
        return (v << 8) | (v >> 8);
    }

    function swapBytes4(uint32 v) internal pure returns (uint32) {
        v = ((v & 0x00ff00ff) << 8) | ((v & 0xff00ff00) >> 8);
        return (v << 16) | (v >> 16);
    }

    function swapBytes8(uint64 v) internal pure returns (uint64) {
        v = ((v & 0x00ff00ff00ff00ff) << 8) | ((v & 0xff00ff00ff00ff00) >> 8);
        v = ((v & 0x0000ffff0000ffff) << 16) | ((v & 0xffff0000ffff0000) >> 16);
        return (v << 32) | (v >> 32);
    }

    function swapBytes16(uint128 v) internal pure returns (uint128) {
        v = ((v & 0x00ff00ff00ff00ff00ff00ff00ff00ff) << 8) | ((v & 0xff00ff00ff00ff00ff00ff00ff00ff00) >> 8);
        v = ((v & 0x0000ffff0000ffff0000ffff0000ffff) << 16) | ((v & 0xffff0000ffff0000ffff0000ffff0000) >> 16);
        v = ((v & 0x00000000ffffffff00000000ffffffff) << 32) | ((v & 0xffffffff00000000ffffffff00000000) >> 32);
        return (v << 64) | (v >> 64);
    }

    function swapBytes32(uint256 v) internal pure returns (uint256) {
        v =
            ((v & 0x00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff) << 8) |
            ((v & 0xff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00) >> 8);
        v =
            ((v & 0x0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff) << 16) |
            ((v & 0xffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000) >> 16);
        v =
            ((v & 0x00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff) << 32) |
            ((v & 0xffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000) >> 32);
        v =
            ((v & 0x0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff) << 64) |
            ((v & 0xffffffffffffffff0000000000000000ffffffffffffffff0000000000000000) >> 64);
        return (v << 128) | (v >> 128);
    }

    function readMemory(uint ptr) internal pure returns (uint res) {
        assembly {
            res := mload(ptr)
        }
    }

    function writeMemory(uint ptr, uint value) internal pure {
        assembly {
            mstore(ptr, value)
        }
    }

    function memoryToBytes(uint ptr, uint length) internal pure returns (bytes memory res) {
        if (length != 0) {
            assembly {
                // 0x40 is the address of free memory pointer.
                res := mload(0x40)
                let end := add(
                    res,
                    and(add(length, 63), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)
                )
                // end = res + 32 + 32 * ceil(length / 32).
                mstore(0x40, end)
                mstore(res, length)
                let destPtr := add(res, 32)
                // prettier-ignore
                for { } 1 { } {
                    mstore(destPtr, mload(ptr))
                    destPtr := add(destPtr, 32)
                    if eq(destPtr, end) {
                        break
                    }
                    ptr := add(ptr, 32)
                }
            }
        }
    }

    function keccak256Raw(uint ptr, uint length) internal pure returns (bytes32 res) {
        assembly {
            res := keccak256(ptr, length)
        }
    }

    function sha256Raw(uint ptr, uint length) internal view returns (bytes32 res) {
        assembly {
            // 2 is the address of SHA256 precompiled contract.
            // First 64 bytes of memory can be used as scratch space.
            let ret := staticcall(gas(), 2, ptr, length, 0, 32)
            // If the call to SHA256 precompile ran out of gas, burn any gas that remains.
            // prettier-ignore
            for { } iszero(ret) { } { }
            res := mload(0)
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract Ed25519","name":"ed","type":"address"},{"internalType":"uint256","name":"lockEthAmount_","type":"uint256"},{"internalType":"uint256","name":"lockDuration_","type":"uint256"},{"internalType":"uint256","name":"replaceDuration_","type":"uint256"},{"internalType":"address","name":"admin_","type":"address"},{"internalType":"uint256","name":"pausedFlags_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint64","name":"height","type":"uint64"},{"indexed":false,"internalType":"bytes32","name":"blockHash","type":"bytes32"}],"name":"BlockHashAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint64","name":"height","type":"uint64"},{"indexed":false,"internalType":"bytes32","name":"blockHash","type":"bytes32"}],"name":"BlockHashReverted","type":"event"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"name":"addLightClientBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"adminDelegatecall","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"flags","type":"uint256"}],"name":"adminPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"adminReceiveEth","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address payable","name":"destination","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"adminSendEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"key","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"adminSstore","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"key","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"mask","type":"uint256"}],"name":"adminSstoreWithMask","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"height","type":"uint64"}],"name":"blockHashes","outputs":[{"internalType":"bytes32","name":"res","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"height","type":"uint64"}],"name":"blockMerkleRoots","outputs":[{"internalType":"bytes32","name":"res","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bridgeState","outputs":[{"components":[{"internalType":"uint256","name":"currentHeight","type":"uint256"},{"internalType":"uint256","name":"nextTimestamp","type":"uint256"},{"internalType":"uint256","name":"nextValidAt","type":"uint256"},{"internalType":"uint256","name":"numBlockProducers","type":"uint256"}],"internalType":"struct NearBridge.BridgeState","name":"res","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"receiver","type":"address"},{"internalType":"uint256","name":"signatureIndex","type":"uint256"}],"name":"challenge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"signatureIndex","type":"uint256"}],"name":"checkBlockProducerSignatureInHead","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"name":"initWithBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"name":"initWithValidators","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastValidAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockEthAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"replaceDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040523480156200001157600080fd5b5060405162002b6438038062002b64833981016040819052620000349162000097565b600080546001600160a01b0319166001600160a01b03841617905560018190556200006484633b9aca00620000fb565b83116200007057600080fd5b505060609390931b6001600160601b03191660805260039190915560045560055562000140565b60008060008060008060c08789031215620000b0578182fd5b8651620000bd8162000127565b809650506020870151945060408701519350606087015192506080870151620000e68162000127565b8092505060a087015190509295509295509295565b60008160001904831182151516156200012257634e487b7160e01b81526011600452602481fd5b500290565b6001600160a01b03811681146200013d57600080fd5b50565b60805160601c612a056200015f60003960006115400152612a056000f3fe60806040526004361061018b5760003560e01c80636c4624c3116100d6578063b3bf91e71161007f578063d0e30db011610059578063d0e30db014610449578063f48ab4e014610451578063f851a440146104595761018b565b8063b3bf91e7146103f3578063b8e9744c14610409578063be831a2e146104295761018b565b80637875a55c116100b05780637875a55c1461039d578063a3155fbb146103b3578063acb99828146103d35761018b565b80636c4624c31461032f5780636d2d6ae01461034f57806370a082311461036f5761018b565b806337da8ec5116101385780634466ec2c116101125780634466ec2c146102b1578063530208f2146102f95780635c975abb146103195761018b565b806337da8ec5146102655780633ccfd60b146102855780633e54ce681461029a5761018b565b8063160bc0ba11610169578063160bc0ba146102055780631e703806146102255780632692c59f146102455761018b565b8063045544431461019057806309d7e8e7146101b9578063158ef93e146101db575b600080fd5b34801561019c57600080fd5b506101a660045481565b6040519081526020015b60405180910390f35b3480156101c557600080fd5b506101d96101d43660046127fe565b610491565b005b3480156101e757600080fd5b506002546101f59060ff1681565b60405190151581526020016101b0565b34801561021157600080fd5b506101d96102203660046127fe565b610546565b34801561023157600080fd5b506101a6610240366004612895565b6106e2565b34801561025157600080fd5b506101d9610260366004612831565b610781565b34801561027157600080fd5b506101a6610280366004612895565b61079d565b34801561029157600080fd5b506101d961083a565b3480156102a657600080fd5b506101a66102a25481565b3480156102bd57600080fd5b506102c66108e0565b6040516101b091908151815260208083015190820152604080830151908201526060918201519181019190915260800190565b34801561030557600080fd5b506101d9610314366004612702565b6109f0565b34801561032557600080fd5b506101a660015481565b34801561033b57600080fd5b506101d961034a36600461286a565b610a3d565b34801561035b57600080fd5b506101d961036a3660046127fe565b610a5f565b34801561037b57600080fd5b506101a661038a3660046126e6565b6102a56020526000908152604090205481565b3480156103a957600080fd5b506101a660035481565b3480156103bf57600080fd5b506101f56103ce366004612831565b61130c565b3480156103df57600080fd5b506101d96103ee366004612702565b611661565b3480156103ff57600080fd5b506101a660055481565b61041c61041736600461272d565b6117ee565b6040516101b091906128d9565b34801561043557600080fd5b506101d9610444366004612849565b61187a565b6101d9611895565b6101d96118f8565b34801561046557600080fd5b50600054610479906001600160a01b031681565b6040516001600160a01b0390911681526020016101b0565b6000546001600160a01b031633146104a857600080fd5b60025460ff161580156104bb5750600754155b61050c5760405162461bcd60e51b815260206004820152601a60248201527f57726f6e6720696e697469616c697a6174696f6e20737461676500000000000060448201526064015b60405180910390fd5b600061051782611911565b9050600061052482611942565b905061052f82611a2b565b61054181600660005b60990201611a82565b505050565b6000546001600160a01b0316331461055d57600080fd5b60025460ff16158015610571575060075415155b6105bd5760405162461bcd60e51b815260206004820152601a60248201527f57726f6e6720696e697469616c697a6174696f6e2073746167650000000000006044820152606401610503565b6002805460ff1916600117905560006105d582611911565b905060006105e282611cf2565b90506105ed82611a2b565b6080810151516106655760405162461bcd60e51b815260206004820152602a60248201527f496e697469616c697a6174696f6e20626c6f636b206d75737420636f6e74616960448201527f6e206e6578745f627073000000000000000000000000000000000000000000006064820152608401610503565b6040818101805180516101d2805467ffffffffffffffff191667ffffffffffffffff928316908117909155602080840151600690815593860151609f5560c087015160009283526102a3825286832055935160e0810151905190921681526102a48452939093209290925560808301510151610541916001610538565b6000601080600154166000148061070357506000546001600160a01b031633145b61070c57600080fd5b67ffffffffffffffff831660009081526102a4602052604090205491508115801561073a57506102a2544210155b801561074857506102a25415155b801561076f57506101d25467ffffffffffffffff8481166801000000000000000090920416145b1561077b576101d65491505b50919050565b6000546001600160a01b0316331461079857600080fd5b600155565b600060108060015416600014806107be57506000546001600160a01b031633145b6107c757600080fd5b67ffffffffffffffff831660009081526102a360205260409020549150811580156107f557506102a2544210155b801561080357506102a25415155b801561082a57506101d25467ffffffffffffffff8481166801000000000000000090920416145b1561077b5750506101d554919050565b600280600154166000148061085957506000546001600160a01b031633145b61086257600080fd5b6102a1546001600160a01b03163314158061088057506102a2544210155b61088957600080fd5b3360009081526102a56020526040902054806108a457600080fd5b3360008181526102a560205260408082208290555183156108fc0291849190818181858888f19350505050158015610541573d6000803e3d6000fd5b61090b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6102a2544210156109a9576101d25467ffffffffffffffff1681526101d35460208201526102a25460408201526101d45460069060ff1661094f576101d154610975565b60036101d1546001018161097357634e487b7160e01b600052601260045260246000fd5b065b6003811061099357634e487b7160e01b600052603260045260246000fd5b60990201600101548160600181815250506109ed565b6102a254156109d1576101d25468010000000000000000900467ffffffffffffffff166109e0565b6101d25467ffffffffffffffff165b67ffffffffffffffff1681525b90565b6000546001600160a01b03163314610a0757600080fd5b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610541573d6000803e3d6000fd5b6000546001600160a01b03163314610a5457600080fd5b825491821816189055565b6004806001541660001480610a7e57506000546001600160a01b031633145b610a8757600080fd5b60025460ff16610ad95760405162461bcd60e51b815260206004820152601b60248201527f436f6e7472616374206973206e6f7420696e697469616c697a656400000000006044820152606401610503565b6003543360009081526102a560205260409020541015610b3b5760405162461bcd60e51b815260206004820152601560248201527f42616c616e6365206973206e6f7420656e6f75676800000000000000000000006044820152606401610503565b6000610b4683611911565b90506000610b5382611cf2565b9050610b5e82611a2b565b6102a254421015610bfd576005546101d35401816040015160a0015167ffffffffffffffff161015610bf85760405162461bcd60e51b815260206004820152603060248201527f43616e206f6e6c79207265706c6163652077697468206120737566666963696560448201527f6e746c79206e6577657220626c6f636b000000000000000000000000000000006064820152608401610503565b610cab565b6102a25415610cab576101d2805468010000000000000000810467ffffffffffffffff1667ffffffffffffffff199091161790556101d45460ff1615610c675760036101d15460010181610c6157634e487b7160e01b600052601260045260246000fd5b066101d1555b60006102a28190556101d5546101d2805467ffffffffffffffff90811684526102a360209081526040808620949094556101d654925490911684526102a490529120555b6101d25460408201515167ffffffffffffffff918216911611610d365760405162461bcd60e51b815260206004820152602160248201527f4e657720626c6f636b206d75737420686176652068696768657220686569676860448201527f74000000000000000000000000000000000000000000000000000000000000006064820152608401610503565b600060066101d15460038110610d5c57634e487b7160e01b600052603260045260246000fd5b60990201546040830151602001511415610d7857506000610e47565b600660036101d15460010181610d9e57634e487b7160e01b600052601260045260246000fd5b0660038110610dbd57634e487b7160e01b600052603260045260246000fd5b60990201546040830151602001511415610dd957506001610e47565b60405162461bcd60e51b815260206004820152602260248201527f45706f6368206964206f662074686520626c6f636b206973206e6f742076616c60448201527f69640000000000000000000000000000000000000000000000000000000000006064820152608401610503565b6000600682610e59576101d154610e7f565b60036101d15460010181610e7d57634e487b7160e01b600052601260045260246000fd5b065b60038110610e9d57634e487b7160e01b600052603260045260246000fd5b60990201905080600101548360a00151511015610efc5760405162461bcd60e51b815260206004820152601a60248201527f417070726f76616c206c69737420697320746f6f2073686f72740000000000006044820152606401610503565b600181015460009081905b808214610ff957600084606601600184901c60328110610f3757634e487b7160e01b600052603260045260246000fd5b015490508660a001518381518110610f5f57634e487b7160e01b600052603260045260246000fd5b60200260200101516000015115610f8b578060801c6fffffffffffffffffffffffffffffffff16840193505b81836001019350831415610f9f5750610ff9565b8660a001518381518110610fc357634e487b7160e01b600052603260045260246000fd5b60200260200101516000015115610fed576fffffffffffffffffffffffffffffffff811693909301925b50816001019150610f07565b50508160980154811161104e5760405162461bcd60e51b815260206004820152601160248201527f546f6f2066657720617070726f76616c730000000000000000000000000000006044820152606401610503565b821561112b576080840151516110a65760405162461bcd60e51b815260206004820181905260248201527f4e657874206e6578745f6270732073686f756c64206e6f74206265204e6f6e656044820152606401610503565b836040015160c001518460800151604001511461112b5760405162461bcd60e51b815260206004820152602660248201527f48617368206f6620626c6f636b2070726f64756365727320646f6573206e6f7460448201527f206d6174636800000000000000000000000000000000000000000000000000006064820152608401610503565b604084015180516101d280547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff9384160217905560a0820151166101d35560c08501516101d55560e0908101516101d6558401516101d755600182015460009081905b8082101561123c5760008760a0015183815181106111d057634e487b7160e01b600052603260045260246000fd5b6020026020010151905080600001511561123057826001901b8417935080602001516101d9846064811061121457634e487b7160e01b600052603260045260246000fd5b6002020160008201518160000155602082015181600101559050505b506001909101906111a2565b50506101d88190556101d4805460ff191685158015919091179091556112ce576000600660036101d1546002018161128457634e487b7160e01b600052601260045260246000fd5b06600381106112a357634e487b7160e01b600052603260045260246000fd5b60990201905085604001516040015181600001819055506112cc86608001516020015182611a82565b505b50506102a180547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055505060045442016102a25550505050565b6101d8546000906001831b166113645760405162461bcd60e51b815260206004820152601160248201527f4e6f2073756368207369676e61747572650000000000000000000000000000006044820152606401610503565b6101d45460009060069060ff1661137e576101d1546113a4565b60036101d154600101816113a257634e487b7160e01b600052601260045260246000fd5b065b600381106113c257634e487b7160e01b600052603260045260246000fd5b60990201905060006101d984606481106113ec57634e487b7160e01b600052603260045260246000fd5b6002020190506000806101d7546114a66101d260089054906101000a900467ffffffffffffffff16600201600060088267ff00ff00ff00ff001667ffffffffffffffff16901c60088366ff00ff00ff00ff1667ffffffffffffffff16901b17915060108267ffff0000ffff00001667ffffffffffffffff16901c60108365ffff0000ffff1667ffffffffffffffff16901b17915060208267ffffffffffffffff16901c60208367ffffffffffffffff16901b179050919050565b60405160f89390931b7fff00000000000000000000000000000000000000000000000000000000000000166020840152602183019190915260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660418201526000604982015260600160405160208183030381529060405290506000808280602001905181019061153a91906127b3565b915091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ebd1b95186600201896064811061159057634e487b7160e01b600052603260045260246000fd5b01548654600188015460405160e085901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810193909352602483019190915260448201526064810185905276ffffffffffffffffffffffffffffffffffffffffffffff198416608482015260a40160206040518083038186803b15801561161c57600080fd5b505afa158015611630573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611654919061277b565b955050505050505b919050565b600880600154166000148061168057506000546001600160a01b031633145b61168957600080fd5b6102a25442106117015760405162461bcd60e51b815260206004820152602760248201527f4e6f20626c6f636b2063616e206265206368616c6c656e67656420617420746860448201527f69732074696d65000000000000000000000000000000000000000000000000006064820152608401610503565b61170a8261130c565b156117575760405162461bcd60e51b815260206004820152601f60248201527f43616e2774206368616c6c656e67652076616c6964207369676e6174757265006044820152606401610503565b6003546102a1546001600160a01b031660009081526102a56020526040902054611781919061292c565b6102a1546001600160a01b0390811660009081526102a56020526040902091909155600354908416906108fc906117ba9060029061290c565b6040518115909202916000818181858888f193505050501580156117e2573d6000803e3d6000fd5b505060006102a2555050565b6000546060906001600160a01b0316331461180857600080fd5b600080846001600160a01b03168460405161182391906128bd565b600060405180830381855af49150503d806000811461185e576040519150601f19603f3d011682016040523d82523d6000602084013e611863565b606091505b50915091508161187257600080fd5b949350505050565b6000546001600160a01b0316331461189157600080fd5b9055565b60018054811615806118b157506000546001600160a01b031633145b6118ba57600080fd5b600354341480156118d957503360009081526102a56020526040902054155b6118e257600080fd5b503360009081526102a560205260409020349055565b6000546001600160a01b0316331461190f57600080fd5b565b604080518082019091526000808252602082015260208201815281611934815190565b825101602083015250919050565b6060600061194f8361204b565b63ffffffff1690508067ffffffffffffffff81111561197e57634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156119cf57816020015b604080516080810182526000606082018181528252602080830182905292820152825260001990920191018161199c5790505b50915060005b81811015611a24576119e684612087565b838281518110611a0657634e487b7160e01b600052603260045260246000fd5b60200260200101819052508080611a1c90612973565b9150506119d5565b5050919050565b6020810151815114611a7f5760405162461bcd60e51b815260206004820152601960248201527f5061727365206572726f723a20454f49206578706563746564000000000000006044820152606401610503565b50565b81516064811115611b215760405162461bcd60e51b815260206004820152604a60248201527f4974206973206e6f7420657870656374656420686176696e672074686174206d60448201527f616e7920626c6f636b2070726f64756365727320666f72207468652070726f7660648201527f6964656420626c6f636b00000000000000000000000000000000000000000000608482015260a401610503565b6001820181905560005b81811015611b9057838181518110611b5357634e487b7160e01b600052603260045260246000fd5b60200260200101516000015160000151836002018260648110611b8657634e487b7160e01b600052603260045260246000fd5b0155600101611b2b565b506000805b828114611cdc576000858281518110611bbe57634e487b7160e01b600052603260045260246000fd5b6020026020010151602001519050806fffffffffffffffffffffffffffffffff168301925083826001019250821415611c37578060801b6fffffffffffffffffffffffffffffffff191685606601600184901c60328110611c2f57634e487b7160e01b600052603260045260246000fd5b015550611cdc565b6000868381518110611c5957634e487b7160e01b600052603260045260246000fd5b60209081029190910181015101516fffffffffffffffffffffffffffffffff8116948501949091507fffffffffffffffffffffffffffffffff00000000000000000000000000000000608084901b160160668701600185901c60328110611cd057634e487b7160e01b600052603260045260246000fd5b01555050600101611b95565b5060036002820204836098018190555050505050565b611d9760408051610100808201835260008083526020808401829052845161012081018652828152908101829052808501829052606081018290526080810182905260a0810182905260c0810182905260e0810182905291820152909182019081526000602080830182905260408051606080820183528482529281019290925281810192909252910190815260606020820181905260006040830181905291015290565b611da08261211a565b8152611dab8261211a565b6020820152611db982612127565b6040820152611dc78261211a565b6060820152611dd582612207565b60808201526000611de58361204b565b63ffffffff1690508067ffffffffffffffff811115611e1457634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611e6d57816020015b60408051808201825260008082528251808401909352808352602080840191909152810191909152815260200190600190039081611e325790505b5060a083015260005b81811015611ec957611e878461226b565b8360a001518281518110611eab57634e487b7160e01b600052603260045260246000fd5b60200260200101819052508080611ec190612973565b915050611e76565b50600280836040015161010001518460600151604051602001611ef6929190918252602082015260400190565b60408051601f1981840301815290829052611f10916128bd565b602060405180830381855afa158015611f2d573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190611f50919061279b565b835160408051602081019390935282015260600160408051601f1981840301815290829052611f7e916128bd565b602060405180830381855afa158015611f9b573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190611fbe919061279b565b60c08301819052602080840151604051600293611fe693909101918252602082015260400190565b60408051601f1981840301815290829052612000916128bd565b602060405180830381855afa15801561201d573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190612040919061279b565b60e083015250919050565b600061208161205b8360046122b8565b60d881901c63ff00ff001662ff00ff60e89290921c9190911617601081811b91901c1790565b92915050565b60408051608081018252600060608201818152825260208201819052918101829052906120b3836122d1565b90506120be836122e7565b6120c783612314565b82526120d28361238c565b6fffffffffffffffffffffffffffffffff16602083015260ff81166001141561210d576120fe836122d1565b60ff161515604083015261077b565b6000604083015250919050565b60006120818260206122b8565b6040805161012081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081019190915261217b8260d061243a565b61010082015261218a82612459565b67ffffffffffffffff16815261219f8261211a565b60208201526121ad8261211a565b60408201526121bb8261211a565b60608201526121c98261211a565b60808201526121d782612459565b67ffffffffffffffff1660a08201526121ef8261211a565b60c08201526121fd8261211a565b60e0820152919050565b6040805160608082018352600080835260208301919091529181019190915261222f826124ce565b158015825261165c57815161224383611942565b6020830152825161226090829061225b90829061292c565b61253b565b604083015250919050565b6040805180820182526000808252825180840190935280835260208084019190915281019190915261229c826124ce565b158015825261165c576122ae8261255d565b6020820152919050565b60006122c48383612604565b5081518051910190915290565b60006122de8260016122b8565b60f81c92915050565b60006122f28261204b565b63ffffffff16905061230d818361260490919063ffffffff16565b8151019052565b60408051602081019091526000815261232c826122d1565b60ff161561237c5760405162461bcd60e51b815260206004820152601d60248201527f5061727365206572726f723a20696e76616c6964206b657920747970650000006044820152606401610503565b6123858261211a565b8152919050565b600061208161239c8360106122b8565b6dff000000ff000000ff000000ff00607882901c9081166cff000000ff000000ff000000ff60889390931c92831617601090811b6fff000000ff000000ff000000ff000000929092166eff000000ff000000ff000000ff0000939093169290921790911c17602081811b6fffffffff00000000ffffffff00000000166bffffffff00000000ffffffff9290911c9190911617604081811b91901c1790565b60006124468383612604565b8251612452908361253b565b9392505050565b60006120816124698360086122b8565b66ff000000ff000060c882901c90811667ff000000ff00000060b89390931c92831617601090811c64ff000000ff9290921665ff000000ff00939093169290921790911b17602081811c63ffffffff1691901b6bffffffffffffffff00000000161790565b6000806124da836122d1565b905060018160ff1611156125305760405162461bcd60e51b815260206004820152601960248201527f5061727365206572726f723a20696e76616c696420626f6f6c000000000000006044820152606401610503565b60ff16151592915050565b600060206000838560025afa5b8061255257612548565b505060005192915050565b604080518082019091526000808252602082015261257a826122d1565b60ff16156125f05760405162461bcd60e51b815260206004820152602360248201527f5061727365206572726f723a20696e76616c6964207369676e6174757265207460448201527f79706500000000000000000000000000000000000000000000000000000000006064820152608401610503565b6125f98261211a565b81526122ae8261211a565b602082015182518201111561265b5760405162461bcd60e51b815260206004820152601b60248201527f5061727365206572726f723a20756e657870656374656420454f4900000000006044820152606401610503565b5050565b600082601f83011261266f578081fd5b813567ffffffffffffffff8082111561268a5761268a6129a4565b604051601f8301601f19908116603f011681019082821181831017156126b2576126b26129a4565b816040528381528660208588010111156126ca578485fd5b8360208701602083013792830160200193909352509392505050565b6000602082840312156126f7578081fd5b8135612452816129ba565b60008060408385031215612714578081fd5b823561271f816129ba565b946020939093013593505050565b6000806040838503121561273f578182fd5b823561274a816129ba565b9150602083013567ffffffffffffffff811115612765578182fd5b6127718582860161265f565b9150509250929050565b60006020828403121561278c578081fd5b81518015158114612452578182fd5b6000602082840312156127ac578081fd5b5051919050565b600080604083850312156127c5578182fd5b82519150602083015176ffffffffffffffffffffffffffffffffffffffffffffff19811681146127f3578182fd5b809150509250929050565b60006020828403121561280f578081fd5b813567ffffffffffffffff811115612825578182fd5b6118728482850161265f565b600060208284031215612842578081fd5b5035919050565b6000806040838503121561285b578182fd5b50508035926020909101359150565b60008060006060848603121561287e578081fd5b505081359360208301359350604090920135919050565b6000602082840312156128a6578081fd5b813567ffffffffffffffff81168114612452578182fd5b600082516128cf818460208701612943565b9190910192915050565b60006020825282518060208401526128f8816040850160208701612943565b601f01601f19169190910160400192915050565b60008261292757634e487b7160e01b81526012600452602481fd5b500490565b60008282101561293e5761293e61298e565b500390565b60005b8381101561295e578181015183820152602001612946565b8381111561296d576000848401525b50505050565b60006000198214156129875761298761298e565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611a7f57600080fdfea2646970667358221220c4e6e79813650f87983cecaaecad09dcd9553de5fd09d0482a231f30c6db1fc864736f6c6343000803003300000000000000000000000088f975d5a1153ea92af66e7c4292576a329c04b60000000000000000000000000000000000000000000000004563918244f4000000000000000000000000000000000000000000000000000000000000000038400000000000000000000000000000000000000000000000000000105ef39b2000000000000000000000000000d9cb077700aa4d32d30bda5e99bb171549b5a3820000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061018b5760003560e01c80636c4624c3116100d6578063b3bf91e71161007f578063d0e30db011610059578063d0e30db014610449578063f48ab4e014610451578063f851a440146104595761018b565b8063b3bf91e7146103f3578063b8e9744c14610409578063be831a2e146104295761018b565b80637875a55c116100b05780637875a55c1461039d578063a3155fbb146103b3578063acb99828146103d35761018b565b80636c4624c31461032f5780636d2d6ae01461034f57806370a082311461036f5761018b565b806337da8ec5116101385780634466ec2c116101125780634466ec2c146102b1578063530208f2146102f95780635c975abb146103195761018b565b806337da8ec5146102655780633ccfd60b146102855780633e54ce681461029a5761018b565b8063160bc0ba11610169578063160bc0ba146102055780631e703806146102255780632692c59f146102455761018b565b8063045544431461019057806309d7e8e7146101b9578063158ef93e146101db575b600080fd5b34801561019c57600080fd5b506101a660045481565b6040519081526020015b60405180910390f35b3480156101c557600080fd5b506101d96101d43660046127fe565b610491565b005b3480156101e757600080fd5b506002546101f59060ff1681565b60405190151581526020016101b0565b34801561021157600080fd5b506101d96102203660046127fe565b610546565b34801561023157600080fd5b506101a6610240366004612895565b6106e2565b34801561025157600080fd5b506101d9610260366004612831565b610781565b34801561027157600080fd5b506101a6610280366004612895565b61079d565b34801561029157600080fd5b506101d961083a565b3480156102a657600080fd5b506101a66102a25481565b3480156102bd57600080fd5b506102c66108e0565b6040516101b091908151815260208083015190820152604080830151908201526060918201519181019190915260800190565b34801561030557600080fd5b506101d9610314366004612702565b6109f0565b34801561032557600080fd5b506101a660015481565b34801561033b57600080fd5b506101d961034a36600461286a565b610a3d565b34801561035b57600080fd5b506101d961036a3660046127fe565b610a5f565b34801561037b57600080fd5b506101a661038a3660046126e6565b6102a56020526000908152604090205481565b3480156103a957600080fd5b506101a660035481565b3480156103bf57600080fd5b506101f56103ce366004612831565b61130c565b3480156103df57600080fd5b506101d96103ee366004612702565b611661565b3480156103ff57600080fd5b506101a660055481565b61041c61041736600461272d565b6117ee565b6040516101b091906128d9565b34801561043557600080fd5b506101d9610444366004612849565b61187a565b6101d9611895565b6101d96118f8565b34801561046557600080fd5b50600054610479906001600160a01b031681565b6040516001600160a01b0390911681526020016101b0565b6000546001600160a01b031633146104a857600080fd5b60025460ff161580156104bb5750600754155b61050c5760405162461bcd60e51b815260206004820152601a60248201527f57726f6e6720696e697469616c697a6174696f6e20737461676500000000000060448201526064015b60405180910390fd5b600061051782611911565b9050600061052482611942565b905061052f82611a2b565b61054181600660005b60990201611a82565b505050565b6000546001600160a01b0316331461055d57600080fd5b60025460ff16158015610571575060075415155b6105bd5760405162461bcd60e51b815260206004820152601a60248201527f57726f6e6720696e697469616c697a6174696f6e2073746167650000000000006044820152606401610503565b6002805460ff1916600117905560006105d582611911565b905060006105e282611cf2565b90506105ed82611a2b565b6080810151516106655760405162461bcd60e51b815260206004820152602a60248201527f496e697469616c697a6174696f6e20626c6f636b206d75737420636f6e74616960448201527f6e206e6578745f627073000000000000000000000000000000000000000000006064820152608401610503565b6040818101805180516101d2805467ffffffffffffffff191667ffffffffffffffff928316908117909155602080840151600690815593860151609f5560c087015160009283526102a3825286832055935160e0810151905190921681526102a48452939093209290925560808301510151610541916001610538565b6000601080600154166000148061070357506000546001600160a01b031633145b61070c57600080fd5b67ffffffffffffffff831660009081526102a4602052604090205491508115801561073a57506102a2544210155b801561074857506102a25415155b801561076f57506101d25467ffffffffffffffff8481166801000000000000000090920416145b1561077b576101d65491505b50919050565b6000546001600160a01b0316331461079857600080fd5b600155565b600060108060015416600014806107be57506000546001600160a01b031633145b6107c757600080fd5b67ffffffffffffffff831660009081526102a360205260409020549150811580156107f557506102a2544210155b801561080357506102a25415155b801561082a57506101d25467ffffffffffffffff8481166801000000000000000090920416145b1561077b5750506101d554919050565b600280600154166000148061085957506000546001600160a01b031633145b61086257600080fd5b6102a1546001600160a01b03163314158061088057506102a2544210155b61088957600080fd5b3360009081526102a56020526040902054806108a457600080fd5b3360008181526102a560205260408082208290555183156108fc0291849190818181858888f19350505050158015610541573d6000803e3d6000fd5b61090b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6102a2544210156109a9576101d25467ffffffffffffffff1681526101d35460208201526102a25460408201526101d45460069060ff1661094f576101d154610975565b60036101d1546001018161097357634e487b7160e01b600052601260045260246000fd5b065b6003811061099357634e487b7160e01b600052603260045260246000fd5b60990201600101548160600181815250506109ed565b6102a254156109d1576101d25468010000000000000000900467ffffffffffffffff166109e0565b6101d25467ffffffffffffffff165b67ffffffffffffffff1681525b90565b6000546001600160a01b03163314610a0757600080fd5b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610541573d6000803e3d6000fd5b6000546001600160a01b03163314610a5457600080fd5b825491821816189055565b6004806001541660001480610a7e57506000546001600160a01b031633145b610a8757600080fd5b60025460ff16610ad95760405162461bcd60e51b815260206004820152601b60248201527f436f6e7472616374206973206e6f7420696e697469616c697a656400000000006044820152606401610503565b6003543360009081526102a560205260409020541015610b3b5760405162461bcd60e51b815260206004820152601560248201527f42616c616e6365206973206e6f7420656e6f75676800000000000000000000006044820152606401610503565b6000610b4683611911565b90506000610b5382611cf2565b9050610b5e82611a2b565b6102a254421015610bfd576005546101d35401816040015160a0015167ffffffffffffffff161015610bf85760405162461bcd60e51b815260206004820152603060248201527f43616e206f6e6c79207265706c6163652077697468206120737566666963696560448201527f6e746c79206e6577657220626c6f636b000000000000000000000000000000006064820152608401610503565b610cab565b6102a25415610cab576101d2805468010000000000000000810467ffffffffffffffff1667ffffffffffffffff199091161790556101d45460ff1615610c675760036101d15460010181610c6157634e487b7160e01b600052601260045260246000fd5b066101d1555b60006102a28190556101d5546101d2805467ffffffffffffffff90811684526102a360209081526040808620949094556101d654925490911684526102a490529120555b6101d25460408201515167ffffffffffffffff918216911611610d365760405162461bcd60e51b815260206004820152602160248201527f4e657720626c6f636b206d75737420686176652068696768657220686569676860448201527f74000000000000000000000000000000000000000000000000000000000000006064820152608401610503565b600060066101d15460038110610d5c57634e487b7160e01b600052603260045260246000fd5b60990201546040830151602001511415610d7857506000610e47565b600660036101d15460010181610d9e57634e487b7160e01b600052601260045260246000fd5b0660038110610dbd57634e487b7160e01b600052603260045260246000fd5b60990201546040830151602001511415610dd957506001610e47565b60405162461bcd60e51b815260206004820152602260248201527f45706f6368206964206f662074686520626c6f636b206973206e6f742076616c60448201527f69640000000000000000000000000000000000000000000000000000000000006064820152608401610503565b6000600682610e59576101d154610e7f565b60036101d15460010181610e7d57634e487b7160e01b600052601260045260246000fd5b065b60038110610e9d57634e487b7160e01b600052603260045260246000fd5b60990201905080600101548360a00151511015610efc5760405162461bcd60e51b815260206004820152601a60248201527f417070726f76616c206c69737420697320746f6f2073686f72740000000000006044820152606401610503565b600181015460009081905b808214610ff957600084606601600184901c60328110610f3757634e487b7160e01b600052603260045260246000fd5b015490508660a001518381518110610f5f57634e487b7160e01b600052603260045260246000fd5b60200260200101516000015115610f8b578060801c6fffffffffffffffffffffffffffffffff16840193505b81836001019350831415610f9f5750610ff9565b8660a001518381518110610fc357634e487b7160e01b600052603260045260246000fd5b60200260200101516000015115610fed576fffffffffffffffffffffffffffffffff811693909301925b50816001019150610f07565b50508160980154811161104e5760405162461bcd60e51b815260206004820152601160248201527f546f6f2066657720617070726f76616c730000000000000000000000000000006044820152606401610503565b821561112b576080840151516110a65760405162461bcd60e51b815260206004820181905260248201527f4e657874206e6578745f6270732073686f756c64206e6f74206265204e6f6e656044820152606401610503565b836040015160c001518460800151604001511461112b5760405162461bcd60e51b815260206004820152602660248201527f48617368206f6620626c6f636b2070726f64756365727320646f6573206e6f7460448201527f206d6174636800000000000000000000000000000000000000000000000000006064820152608401610503565b604084015180516101d280547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff9384160217905560a0820151166101d35560c08501516101d55560e0908101516101d6558401516101d755600182015460009081905b8082101561123c5760008760a0015183815181106111d057634e487b7160e01b600052603260045260246000fd5b6020026020010151905080600001511561123057826001901b8417935080602001516101d9846064811061121457634e487b7160e01b600052603260045260246000fd5b6002020160008201518160000155602082015181600101559050505b506001909101906111a2565b50506101d88190556101d4805460ff191685158015919091179091556112ce576000600660036101d1546002018161128457634e487b7160e01b600052601260045260246000fd5b06600381106112a357634e487b7160e01b600052603260045260246000fd5b60990201905085604001516040015181600001819055506112cc86608001516020015182611a82565b505b50506102a180547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055505060045442016102a25550505050565b6101d8546000906001831b166113645760405162461bcd60e51b815260206004820152601160248201527f4e6f2073756368207369676e61747572650000000000000000000000000000006044820152606401610503565b6101d45460009060069060ff1661137e576101d1546113a4565b60036101d154600101816113a257634e487b7160e01b600052601260045260246000fd5b065b600381106113c257634e487b7160e01b600052603260045260246000fd5b60990201905060006101d984606481106113ec57634e487b7160e01b600052603260045260246000fd5b6002020190506000806101d7546114a66101d260089054906101000a900467ffffffffffffffff16600201600060088267ff00ff00ff00ff001667ffffffffffffffff16901c60088366ff00ff00ff00ff1667ffffffffffffffff16901b17915060108267ffff0000ffff00001667ffffffffffffffff16901c60108365ffff0000ffff1667ffffffffffffffff16901b17915060208267ffffffffffffffff16901c60208367ffffffffffffffff16901b179050919050565b60405160f89390931b7fff00000000000000000000000000000000000000000000000000000000000000166020840152602183019190915260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660418201526000604982015260600160405160208183030381529060405290506000808280602001905181019061153a91906127b3565b915091507f00000000000000000000000088f975d5a1153ea92af66e7c4292576a329c04b66001600160a01b031663ebd1b95186600201896064811061159057634e487b7160e01b600052603260045260246000fd5b01548654600188015460405160e085901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810193909352602483019190915260448201526064810185905276ffffffffffffffffffffffffffffffffffffffffffffff198416608482015260a40160206040518083038186803b15801561161c57600080fd5b505afa158015611630573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611654919061277b565b955050505050505b919050565b600880600154166000148061168057506000546001600160a01b031633145b61168957600080fd5b6102a25442106117015760405162461bcd60e51b815260206004820152602760248201527f4e6f20626c6f636b2063616e206265206368616c6c656e67656420617420746860448201527f69732074696d65000000000000000000000000000000000000000000000000006064820152608401610503565b61170a8261130c565b156117575760405162461bcd60e51b815260206004820152601f60248201527f43616e2774206368616c6c656e67652076616c6964207369676e6174757265006044820152606401610503565b6003546102a1546001600160a01b031660009081526102a56020526040902054611781919061292c565b6102a1546001600160a01b0390811660009081526102a56020526040902091909155600354908416906108fc906117ba9060029061290c565b6040518115909202916000818181858888f193505050501580156117e2573d6000803e3d6000fd5b505060006102a2555050565b6000546060906001600160a01b0316331461180857600080fd5b600080846001600160a01b03168460405161182391906128bd565b600060405180830381855af49150503d806000811461185e576040519150601f19603f3d011682016040523d82523d6000602084013e611863565b606091505b50915091508161187257600080fd5b949350505050565b6000546001600160a01b0316331461189157600080fd5b9055565b60018054811615806118b157506000546001600160a01b031633145b6118ba57600080fd5b600354341480156118d957503360009081526102a56020526040902054155b6118e257600080fd5b503360009081526102a560205260409020349055565b6000546001600160a01b0316331461190f57600080fd5b565b604080518082019091526000808252602082015260208201815281611934815190565b825101602083015250919050565b6060600061194f8361204b565b63ffffffff1690508067ffffffffffffffff81111561197e57634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156119cf57816020015b604080516080810182526000606082018181528252602080830182905292820152825260001990920191018161199c5790505b50915060005b81811015611a24576119e684612087565b838281518110611a0657634e487b7160e01b600052603260045260246000fd5b60200260200101819052508080611a1c90612973565b9150506119d5565b5050919050565b6020810151815114611a7f5760405162461bcd60e51b815260206004820152601960248201527f5061727365206572726f723a20454f49206578706563746564000000000000006044820152606401610503565b50565b81516064811115611b215760405162461bcd60e51b815260206004820152604a60248201527f4974206973206e6f7420657870656374656420686176696e672074686174206d60448201527f616e7920626c6f636b2070726f64756365727320666f72207468652070726f7660648201527f6964656420626c6f636b00000000000000000000000000000000000000000000608482015260a401610503565b6001820181905560005b81811015611b9057838181518110611b5357634e487b7160e01b600052603260045260246000fd5b60200260200101516000015160000151836002018260648110611b8657634e487b7160e01b600052603260045260246000fd5b0155600101611b2b565b506000805b828114611cdc576000858281518110611bbe57634e487b7160e01b600052603260045260246000fd5b6020026020010151602001519050806fffffffffffffffffffffffffffffffff168301925083826001019250821415611c37578060801b6fffffffffffffffffffffffffffffffff191685606601600184901c60328110611c2f57634e487b7160e01b600052603260045260246000fd5b015550611cdc565b6000868381518110611c5957634e487b7160e01b600052603260045260246000fd5b60209081029190910181015101516fffffffffffffffffffffffffffffffff8116948501949091507fffffffffffffffffffffffffffffffff00000000000000000000000000000000608084901b160160668701600185901c60328110611cd057634e487b7160e01b600052603260045260246000fd5b01555050600101611b95565b5060036002820204836098018190555050505050565b611d9760408051610100808201835260008083526020808401829052845161012081018652828152908101829052808501829052606081018290526080810182905260a0810182905260c0810182905260e0810182905291820152909182019081526000602080830182905260408051606080820183528482529281019290925281810192909252910190815260606020820181905260006040830181905291015290565b611da08261211a565b8152611dab8261211a565b6020820152611db982612127565b6040820152611dc78261211a565b6060820152611dd582612207565b60808201526000611de58361204b565b63ffffffff1690508067ffffffffffffffff811115611e1457634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611e6d57816020015b60408051808201825260008082528251808401909352808352602080840191909152810191909152815260200190600190039081611e325790505b5060a083015260005b81811015611ec957611e878461226b565b8360a001518281518110611eab57634e487b7160e01b600052603260045260246000fd5b60200260200101819052508080611ec190612973565b915050611e76565b50600280836040015161010001518460600151604051602001611ef6929190918252602082015260400190565b60408051601f1981840301815290829052611f10916128bd565b602060405180830381855afa158015611f2d573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190611f50919061279b565b835160408051602081019390935282015260600160408051601f1981840301815290829052611f7e916128bd565b602060405180830381855afa158015611f9b573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190611fbe919061279b565b60c08301819052602080840151604051600293611fe693909101918252602082015260400190565b60408051601f1981840301815290829052612000916128bd565b602060405180830381855afa15801561201d573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190612040919061279b565b60e083015250919050565b600061208161205b8360046122b8565b60d881901c63ff00ff001662ff00ff60e89290921c9190911617601081811b91901c1790565b92915050565b60408051608081018252600060608201818152825260208201819052918101829052906120b3836122d1565b90506120be836122e7565b6120c783612314565b82526120d28361238c565b6fffffffffffffffffffffffffffffffff16602083015260ff81166001141561210d576120fe836122d1565b60ff161515604083015261077b565b6000604083015250919050565b60006120818260206122b8565b6040805161012081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081019190915261217b8260d061243a565b61010082015261218a82612459565b67ffffffffffffffff16815261219f8261211a565b60208201526121ad8261211a565b60408201526121bb8261211a565b60608201526121c98261211a565b60808201526121d782612459565b67ffffffffffffffff1660a08201526121ef8261211a565b60c08201526121fd8261211a565b60e0820152919050565b6040805160608082018352600080835260208301919091529181019190915261222f826124ce565b158015825261165c57815161224383611942565b6020830152825161226090829061225b90829061292c565b61253b565b604083015250919050565b6040805180820182526000808252825180840190935280835260208084019190915281019190915261229c826124ce565b158015825261165c576122ae8261255d565b6020820152919050565b60006122c48383612604565b5081518051910190915290565b60006122de8260016122b8565b60f81c92915050565b60006122f28261204b565b63ffffffff16905061230d818361260490919063ffffffff16565b8151019052565b60408051602081019091526000815261232c826122d1565b60ff161561237c5760405162461bcd60e51b815260206004820152601d60248201527f5061727365206572726f723a20696e76616c6964206b657920747970650000006044820152606401610503565b6123858261211a565b8152919050565b600061208161239c8360106122b8565b6dff000000ff000000ff000000ff00607882901c9081166cff000000ff000000ff000000ff60889390931c92831617601090811b6fff000000ff000000ff000000ff000000929092166eff000000ff000000ff000000ff0000939093169290921790911c17602081811b6fffffffff00000000ffffffff00000000166bffffffff00000000ffffffff9290911c9190911617604081811b91901c1790565b60006124468383612604565b8251612452908361253b565b9392505050565b60006120816124698360086122b8565b66ff000000ff000060c882901c90811667ff000000ff00000060b89390931c92831617601090811c64ff000000ff9290921665ff000000ff00939093169290921790911b17602081811c63ffffffff1691901b6bffffffffffffffff00000000161790565b6000806124da836122d1565b905060018160ff1611156125305760405162461bcd60e51b815260206004820152601960248201527f5061727365206572726f723a20696e76616c696420626f6f6c000000000000006044820152606401610503565b60ff16151592915050565b600060206000838560025afa5b8061255257612548565b505060005192915050565b604080518082019091526000808252602082015261257a826122d1565b60ff16156125f05760405162461bcd60e51b815260206004820152602360248201527f5061727365206572726f723a20696e76616c6964207369676e6174757265207460448201527f79706500000000000000000000000000000000000000000000000000000000006064820152608401610503565b6125f98261211a565b81526122ae8261211a565b602082015182518201111561265b5760405162461bcd60e51b815260206004820152601b60248201527f5061727365206572726f723a20756e657870656374656420454f4900000000006044820152606401610503565b5050565b600082601f83011261266f578081fd5b813567ffffffffffffffff8082111561268a5761268a6129a4565b604051601f8301601f19908116603f011681019082821181831017156126b2576126b26129a4565b816040528381528660208588010111156126ca578485fd5b8360208701602083013792830160200193909352509392505050565b6000602082840312156126f7578081fd5b8135612452816129ba565b60008060408385031215612714578081fd5b823561271f816129ba565b946020939093013593505050565b6000806040838503121561273f578182fd5b823561274a816129ba565b9150602083013567ffffffffffffffff811115612765578182fd5b6127718582860161265f565b9150509250929050565b60006020828403121561278c578081fd5b81518015158114612452578182fd5b6000602082840312156127ac578081fd5b5051919050565b600080604083850312156127c5578182fd5b82519150602083015176ffffffffffffffffffffffffffffffffffffffffffffff19811681146127f3578182fd5b809150509250929050565b60006020828403121561280f578081fd5b813567ffffffffffffffff811115612825578182fd5b6118728482850161265f565b600060208284031215612842578081fd5b5035919050565b6000806040838503121561285b578182fd5b50508035926020909101359150565b60008060006060848603121561287e578081fd5b505081359360208301359350604090920135919050565b6000602082840312156128a6578081fd5b813567ffffffffffffffff81168114612452578182fd5b600082516128cf818460208701612943565b9190910192915050565b60006020825282518060208401526128f8816040850160208701612943565b601f01601f19169190910160400192915050565b60008261292757634e487b7160e01b81526012600452602481fd5b500490565b60008282101561293e5761293e61298e565b500390565b60005b8381101561295e578181015183820152602001612946565b8381111561296d576000848401525b50505050565b60006000198214156129875761298761298e565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611a7f57600080fdfea2646970667358221220c4e6e79813650f87983cecaaecad09dcd9553de5fd09d0482a231f30c6db1fc864736f6c63430008030033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000088f975d5a1153ea92af66e7c4292576a329c04b60000000000000000000000000000000000000000000000004563918244f4000000000000000000000000000000000000000000000000000000000000000038400000000000000000000000000000000000000000000000000000105ef39b2000000000000000000000000000d9cb077700aa4d32d30bda5e99bb171549b5a3820000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : ed (address): 0x88f975D5A1153Ea92AF66e7c4292576a329c04B6
Arg [1] : lockEthAmount_ (uint256): 5000000000000000000
Arg [2] : lockDuration_ (uint256): 14400
Arg [3] : replaceDuration_ (uint256): 18000000000000
Arg [4] : admin_ (address): 0xD9cB077700AA4D32d30bDA5e99bb171549b5a382
Arg [5] : pausedFlags_ (uint256): 0

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 00000000000000000000000088f975d5a1153ea92af66e7c4292576a329c04b6
Arg [1] : 0000000000000000000000000000000000000000000000004563918244f40000
Arg [2] : 0000000000000000000000000000000000000000000000000000000000003840
Arg [3] : 0000000000000000000000000000000000000000000000000000105ef39b2000
Arg [4] : 000000000000000000000000d9cb077700aa4d32d30bda5e99bb171549b5a382
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

181:12747:4:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;850:27;;;;;;;;;;;;;;;;;;;5876:25:7;;;5864:2;5849:18;850:27:4;;;;;;;;4492:392;;;;;;;;;;-1:-1:-1;4492:392:4;;;;;:::i;:::-;;:::i;:::-;;652:23;;;;;;;;;;-1:-1:-1;652:23:4;;;;;;;;;;;5703:14:7;;5696:22;5678:41;;5666:2;5651:18;652:23:4;5633:92:7;4964:852:4;;;;;;;;;;-1:-1:-1;4964:852:4;;;;;:::i;:::-;;:::i;12614:312::-;;;;;;;;;;-1:-1:-1;12614:312:4;;;;;:::i;:::-;;:::i;447:80:0:-;;;;;;;;;;-1:-1:-1;447:80:0;;;;;:::i;:::-;;:::i;12312:296:4:-;;;;;;;;;;-1:-1:-1;12312:296:4;;;;;:::i;:::-;;:::i;2743:305::-;;;;;;;;;;;;;:::i;1680:23::-;;;;;;;;;;;;;;;;6271:510;;;;;;;;;;;;;:::i;:::-;;;;;;14646:13:7;;14628:32;;14716:4;14704:17;;;14698:24;14676:20;;;14669:54;14779:4;14767:17;;;14761:24;14739:20;;;14732:54;14842:4;14830:17;;;14824:24;14802:20;;;14795:54;;;;14615:3;14600:19;;14582:273;922:126:0;;;;;;;;;;-1:-1:-1;922:126:0;;;;;:::i;:::-;;:::i;125:18::-;;;;;;;;;;;;;;;;666:250;;;;;;;;;;-1:-1:-1;666:250:0;;;;;:::i;:::-;;:::i;6787:4474:4:-;;;;;;;;;;-1:-1:-1;6787:4474:4;;;;;:::i;:::-;;:::i;1805:53::-;;;;;;;;;;-1:-1:-1;1805:53:4;;;;;:::i;:::-;;;;;;;;;;;;;;681:28;;;;;;;;;;;;;;;;3520:878;;;;;;;;;;-1:-1:-1;3520:878:4;;;;;:::i;:::-;;:::i;3054:460::-;;;;;;;;;;-1:-1:-1;3054:460:4;;;;;:::i;:::-;;:::i;977:30::-;;;;;;;;;;;;;;;;1114:237:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;533:127::-;;;;;;;;;;-1:-1:-1;533:127:0;;;;;:::i;:::-;;:::i;2544:193:4:-;;;:::i;1054:54:0:-;;;:::i;99:20::-;;;;;;;;;;-1:-1:-1;99:20:0;;;;-1:-1:-1;;;;;99:20:0;;;;;;-1:-1:-1;;;;;5471:55:7;;;5453:74;;5441:2;5426:18;99:20:0;5408:125:7;4492:392:4;302:5:0;;-1:-1:-1;;;;;302:5:0;288:10;:19;280:28;;;;;;4584:11:4::1;::::0;::::1;;4583:12;:37:::0;::::1;;;-1:-1:-1::0;4599:16:4;;:21;4583:37:::1;4575:76;;;::::0;-1:-1:-1;;;4575:76:4;;7397:2:7;4575:76:4::1;::::0;::::1;7379:21:7::0;7436:2;7416:18;;;7409:30;7475:28;7455:18;;;7448:56;7521:18;;4575:76:4::1;;;;;;;;;4662:23;4688:16;4699:4;4688:10;:16::i;:::-;4662:42;;4714:52;4769:28;:5;:26;:28::i;:::-;4714:83;;4807:12;:5;:10;:12::i;:::-;4830:47;4848:17:::0;4867:6:::1;4874:1;4867:9;;;;4830:17;:47::i;:::-;318:1:0;;4492:392:4::0;:::o;4964:852::-;302:5:0;;-1:-1:-1;;;;;302:5:0;288:10;:19;280:28;;;;;;5051:11:4::1;::::0;::::1;;5050:12;:37:::0;::::1;;;-1:-1:-1::0;5066:16:4;;:21;::::1;5050:37;5042:76;;;::::0;-1:-1:-1;;;5042:76:4;;7397:2:7;5042:76:4::1;::::0;::::1;7379:21:7::0;7436:2;7416:18;;;7409:30;7475:28;7455:18;;;7448:56;7521:18;;5042:76:4::1;7369:176:7::0;5042:76:4::1;5128:11;:18:::0;;-1:-1:-1;;5128:18:4::1;5142:4;5128:18;::::0;;:11:::1;5183:16;5194:4:::0;5183:10:::1;:16::i;:::-;5157:42;;5209:45;5257:30;:5;:28;:30::i;:::-;5209:78;;5297:12;:5;:10;:12::i;:::-;5328:18;::::0;::::1;::::0;:23;5320:78:::1;;;::::0;-1:-1:-1;;;5320:78:4;;10402:2:7;5320:78:4::1;::::0;::::1;10384:21:7::0;10441:2;10421:18;;;10414:30;10480:34;10460:18;;;10453:62;10551:12;10531:18;;;10524:40;10581:19;;5320:78:4::1;10374:232:7::0;5320:78:4::1;5421:20;::::0;;::::1;::::0;;:27;;5409:9:::1;:39:::0;;-1:-1:-1;;5409:39:4::1;;::::0;;::::1;::::0;;::::1;::::0;;;5478:29:::1;::::0;;::::1;::::0;5458:6:::1;:49:::0;;;5537:34;;::::1;::::0;5517:9;:54;5625:14:::1;::::0;::::1;::::0;-1:-1:-1;5581:41:4;;;:12:::1;:41:::0;;;;;:58;5698:20;;:38:::1;::::0;::::1;::::0;5667:27;;5649:46;;::::1;::::0;;:17:::1;:46:::0;;;;;;:87;;;;5764:18:::1;::::0;::::1;::::0;:33:::1;::::0;5746:63:::1;::::0;-1:-1:-1;5799:9:4::1;::::0;12614:312;12709:11;2535:2;389:4:0;380:6;;:13;398:1;379:20;:43;;;-1:-1:-1;417:5:0;;-1:-1:-1;;;;;417:5:0;403:10;:19;379:43;371:52;;;;;;12738:25:4::1;::::0;::::1;;::::0;;;:17:::1;:25;::::0;;;;;;-1:-1:-1;12777:8:4;;:42;::::1;;;;12808:11;;12789:15;:30;;12777:42;:62;;;;-1:-1:-1::0;12823:11:4::1;::::0;:16;::::1;12777:62;:91;;;;-1:-1:-1::0;12853:15:4::1;::::0;::::1;12843:25:::0;;::::1;12853:15:::0;;;::::1;;12843:25;12777:91;12773:147;;;12890:19;;12884:25;;12773:147;12614:312:::0;;;;:::o;447:80:0:-;302:5;;-1:-1:-1;;;;;302:5:0;288:10;:19;280:28;;;;;;506:6:::1;:14:::0;447:80::o;12312:296:4:-;12402:11;2535:2;389:4:0;380:6;;:13;398:1;379:20;:43;;;-1:-1:-1;417:5:0;;-1:-1:-1;;;;;417:5:0;403:10;:19;379:43;371:52;;;;;;12431:20:4::1;::::0;::::1;;::::0;;;:12:::1;:20;::::0;;;;;;-1:-1:-1;12465:8:4;;:42;::::1;;;;12496:11;;12477:15;:30;;12465:42;:62;;;;-1:-1:-1::0;12511:11:4::1;::::0;:16;::::1;12465:62;:91;;;;-1:-1:-1::0;12541:15:4::1;::::0;::::1;12531:25:::0;;::::1;12541:15:::0;;;::::1;;12531:25;12465:91;12461:141;;;-1:-1:-1::0;;12578:13:4::1;::::0;;12312:296;-1:-1:-1;12312:296:4:o;2743:305::-;2418:1;389:4:0;380:6;;:13;398:1;379:20;:43;;;-1:-1:-1;417:5:0;;-1:-1:-1;;;;;417:5:0;403:10;:19;379:43;371:52;;;;;;2837:13:4::1;::::0;-1:-1:-1;;;;;2837:13:4::1;2823:10;:27;;::::0;:61:::1;;;2873:11;;2854:15;:30;;2823:61;2815:70;;;::::0;::::1;;2919:10;2895:11;2909:21:::0;;;:9:::1;:21;::::0;;;;;2948:11;2940:20:::1;;;::::0;::::1;;2980:10;2994:1;2970:21:::0;;;:9:::1;:21;::::0;;;;;:25;;;3005:36;;::::1;;;::::0;3034:6;;3005:36;;2994:1;3005:36;3034:6;2980:10;3005:36;::::1;;;;;;;;;;;;;::::0;::::1;;;;6271:510:::0;6315:22;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6315:22:4;6371:11;;6353:15;:29;6349:426;;;6418:9;;;;6398:29;;6461:18;;6441:17;;;:38;6511:11;;6493:15;;;:29;6595:18;;6588:6;;6595:18;;:50;;6637:8;;6595:50;;;6633:1;6617:8;;6628:1;6617:12;6616:18;;;-1:-1:-1;;;6616:18:4;;;;;;;;;;6595:50;6588:58;;;;;-1:-1:-1;;;6588:58:4;;;;;;;;;;;;:65;;;6564:3;:21;;:89;;;;;6349:426;;;6718:11;;:16;:46;;6749:15;;;;;;;6718:46;;;6737:9;;;;6718:46;6698:66;;;;6349:426;6271:510;:::o;922:126:0:-;302:5;;-1:-1:-1;;;;;302:5:0;288:10;:19;280:28;;;;;;1013::::1;::::0;-1:-1:-1;;;;;1013:20:0;::::1;::::0;:28;::::1;;;::::0;1034:6;;1013:28:::1;::::0;;;1034:6;1013:20;:28;::::1;;;;;;;;;;;;;::::0;::::1;;;;666:250:::0;302:5;;-1:-1:-1;;;;;302:5:0;288:10;:19;280:28;;;;;;822:10;;865:18;;::::1;861:29;857:42;845:55:::0;;666:250::o;6787:4474:4:-;2458:1;389:4:0;380:6;;:13;398:1;379:20;:43;;;-1:-1:-1;417:5:0;;-1:-1:-1;;;;;417:5:0;403:10;:19;379:43;371:52;;;;;;6896:11:4::1;::::0;::::1;;6888:51;;;::::0;-1:-1:-1;;;6888:51:4;;9685:2:7;6888:51:4::1;::::0;::::1;9667:21:7::0;9724:2;9704:18;;;9697:30;9763:29;9743:18;;;9736:57;9810:18;;6888:51:4::1;9657:177:7::0;6888:51:4::1;6982:13;::::0;6967:10:::1;6957:21;::::0;;;:9:::1;:21;::::0;;;;;:38:::1;;6949:72;;;::::0;-1:-1:-1;;;6949:72:4;;13518:2:7;6949:72:4::1;::::0;::::1;13500:21:7::0;13557:2;13537:18;;;13530:30;13596:23;13576:18;;;13569:51;13637:18;;6949:72:4::1;13490:171:7::0;6949:72:4::1;7032:23;7058:16;7069:4;7058:10;:16::i;:::-;7032:42;;7084:45;7132:30;:5;:28;:30::i;:::-;7084:78;;7172:12;:5;:10;:12::i;:::-;7325:11;;7307:15;:29;7303:615;;;7440:15;;7419:18;;:36;7385:9;:20;;;:30;;;:70;;;;7356:189;;;::::0;-1:-1:-1;;;7356:189:4;;12618:2:7;7356:189:4::1;::::0;::::1;12600:21:7::0;12657:2;12637:18;;;12630:30;12696:34;12676:18;;;12669:62;12767:18;12747;;;12740:46;12803:19;;7356:189:4::1;12590:238:7::0;7356:189:4::1;7303:615;;;7570:11;::::0;:16;7566:352:::1;;7618:15;::::0;;;;::::1;;;-1:-1:-1::0;;7606:27:4;;::::1;;::::0;;7655:18:::1;::::0;::::1;;7651:94;;;7725:1;7709:8;;7720:1;7709:12;7708:18;;;-1:-1:-1::0;;;7708:18:4::1;;;;;;;;;;7697:8;:29:::0;7651:94:::1;7776:1;7762:11;:15:::0;;;7822:13:::1;::::0;7809:9:::1;::::0;;::::1;::::0;;::::1;7796:23:::0;;:12:::1;:23;::::0;;;;;;;:39;;;;7884:19:::1;::::0;7871:9;;;;::::1;7853:28:::0;;:17:::1;:28:::0;;;;:50;7566:352:::1;8054:9;::::0;8024:20:::1;::::0;::::1;::::0;:27;8054:9:::1;::::0;;::::1;8024:39:::0;::::1;;8016:85;;;::::0;-1:-1:-1;;;8016:85:4;;13868:2:7;8016:85:4::1;::::0;::::1;13850:21:7::0;13907:2;13887:18;;;13880:30;13946:34;13926:18;;;13919:62;14017:3;13997:18;;;13990:31;14038:19;;8016:85:4::1;13840:223:7::0;8016:85:4::1;8221:18;8290:6;8297:8;;8290:16;;;;;-1:-1:-1::0;;;8290:16:4::1;;;;;;;;;;;;:24:::0;8257:20:::1;::::0;::::1;::::0;:29:::1;;::::0;:57:::1;8253:332;;;-1:-1:-1::0;8350:5:4::1;8253:332;;;8413:6;8437:1;8421:8;;8432:1;8421:12;8420:18;;;-1:-1:-1::0;;;8420:18:4::1;;;;;;;;;;8413:26;;;;;-1:-1:-1::0;;;8413:26:4::1;;;;;;;;;;;;:34:::0;8380:20:::1;::::0;::::1;::::0;:29:::1;;::::0;:67:::1;8376:209;;;-1:-1:-1::0;8483:4:4::1;8376:209;;;8526:44;::::0;-1:-1:-1;;;8526:44:4;;12215:2:7;8526:44:4::1;::::0;::::1;12197:21:7::0;12254:2;12234:18;;;12227:30;12293:34;12273:18;;;12266:62;12364:4;12344:18;;;12337:32;12386:19;;8526:44:4::1;12187:224:7::0;8376:209:4::1;8685:23;8711:6;8718:13;:45;;8755:8;;8718:45;;;8751:1;8735:8;;8746:1;8735:12;8734:18;;;-1:-1:-1::0;;;8734:18:4::1;;;;;;;;;;8718:45;8711:53;;;;;-1:-1:-1::0;;;8711:53:4::1;;;;;;;;;;;;8685:79;;8926:9;:16;;;8885:9;:30;;;:37;:57;;8877:96;;;::::0;-1:-1:-1;;;8877:96:4;;14270:2:7;8877:96:4::1;::::0;::::1;14252:21:7::0;14309:2;14289:18;;;14282:30;14348:28;14328:18;;;14321:56;14394:18;;8877:96:4::1;14242:176:7::0;8877:96:4::1;9109:16;::::0;::::1;::::0;9045::::1;::::0;;;9079:499:::1;9133:3;9128:1;:8;9079:499;;9161:14;9178:9;:22;;9206:1;9201;:6;;9178:30;;;;;-1:-1:-1::0;;;9178:30:4::1;;;;;;;;;;;9161:47;;9230:9;:30;;;9261:1;9230:33;;;;;;-1:-1:-1::0;;;9230:33:4::1;;;;;;;;;;;;;;;:38;;;9226:121;;;9320:6;9304:24;;9292:36;;;;;;9226:121;9375:3;9368;;;;;;:10;9364:62;;;9402:5;;;9364:62;9447:9;:30;;;9478:1;9447:33;;;;;;-1:-1:-1::0;;;9447:33:4::1;;;;;;;;;;;;;;;:38;;;9443:121;;;9509:36;::::0;::::1;::::0;;;::::1;::::0;9443:121:::1;9079:499;9138:3;;;;;9079:499;;;;;9610:9;:24;;;9599:8;:35;9591:65;;;::::0;-1:-1:-1;;;9591:65:4;;11513:2:7;9591:65:4::1;::::0;::::1;11495:21:7::0;11552:2;11532:18;;;11525:30;11591:19;11571:18;;;11564:47;11628:18;;9591:65:4::1;11485:167:7::0;9591:65:4::1;9787:13;9783:307;;;9828:18;::::0;::::1;::::0;:23;9820:68:::1;;;::::0;-1:-1:-1;;;9820:68:4;;10041:2:7;9820:68:4::1;::::0;::::1;10023:21:7::0;;;10060:18;;;10053:30;10119:34;10099:18;;;10092:62;10171:18;;9820:68:4::1;10013:182:7::0;9820:68:4::1;9962:9;:20;;;:33;;;9935:9;:18;;;:23;;;:60;9906:169;;;::::0;-1:-1:-1;;;9906:169:4;;8160:2:7;9906:169:4::1;::::0;::::1;8142:21:7::0;8199:2;8179:18;;;8172:30;8238:34;8218:18;;;8211:62;8309:8;8289:18;;;8282:36;8335:19;;9906:169:4::1;8132:228:7::0;9906:169:4::1;10122:20;::::0;::::1;::::0;:27;;10104:15:::1;:45:::0;;;::::1;::::0;::::1;::::0;;::::1;;;::::0;;10184:30:::1;::::0;::::1;::::0;10163:51:::1;:18;:51:::0;10244:14:::1;::::0;::::1;::::0;10228:13:::1;:30:::0;10294:38:::1;::::0;;::::1;::::0;10272:19:::1;:60:::0;10366:19;::::1;::::0;10346:17:::1;:39:::0;-1:-1:-1;10468:16:4;::::1;::::0;-1:-1:-1;;;;10438:341:4::1;10491:3;10487:1;:7;10438:341;;;10519:45;10567:9;:30;;;10598:1;10567:33;;;;;;-1:-1:-1::0;;;10567:33:4::1;;;;;;;;;;;;;;;10519:81;;10622:8;:13;;;10618:147;;;10680:1;10675;:6;;10659:22;;;;10728:8;:18;;;10703:19;10723:1;10703:22;;;;;-1:-1:-1::0;;;10703:22:4::1;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;;10618:147;-1:-1:-1::0;10496:3:4::1;::::0;;::::1;::::0;10438:341:::1;;;-1:-1:-1::0;;10792:21:4::1;:36:::0;;;10842:18:::1;:34:::0;;-1:-1:-1;;10842:34:4::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;;10890:257:::1;;10927:23;10953:6;10977:1;10961:8;;10972:1;10961:12;10960:18;;;-1:-1:-1::0;;;10960:18:4::1;;;;;;;;;;10953:26;;;;;-1:-1:-1::0;;;10953:26:4::1;;;;;;;;;;;;10927:52;;11017:9;:20;;;:34;;;10997:9;:17;;:54;;;;11069:63;11087:9;:18;;;:33;;;11122:9;11069:17;:63::i;:::-;10890:257;;-1:-1:-1::0;;11160:13:4::1;:26:::0;;;::::1;11176:10;11160:26;::::0;;-1:-1:-1;;11232:12:4::1;::::0;11214:15:::1;:30;11200:11;:44:::0;-1:-1:-1;;;;6787:4474:4:o;3520:878::-;3692:21;;3614:4;;3717:1;:19;;3692:45;3683:82;;;;-1:-1:-1;;;3683:82:4;;10813:2:7;3683:82:4;;;10795:21:7;10852:2;10832:18;;;10825:30;10891:19;10871:18;;;10864:47;10928:18;;3683:82:4;10785:167:7;3683:82:4;3837:18;;3799:28;;3830:6;;3837:18;;:50;;3879:8;;3837:50;;;3875:1;3859:8;;3870:1;3859:12;3858:18;;;-1:-1:-1;;;3858:18:4;;;;;;;;;;3837:50;3830:58;;;;;-1:-1:-1;;;3830:58:4;;;;;;;;;;;;3799:89;;3902:39;3944:19;3964:14;3944:35;;;;;-1:-1:-1;;;3944:35:4;;;;;;;;;;;;3902:77;;3993:20;4056:1;4076:17;;4111:37;4128:15;;;;;;;;;;;4146:1;4128:19;426:6:6;511:1;484;488:18;484:22;483:29;;;;477:1;450;454:18;450:22;449:29;;;;448:65;444:69;;591:2;564:1;568:18;564:22;563:30;;;;556:2;529:1;533:18;529:22;528:30;;;;527:67;523:71;;629:2;624:1;:7;;;;617:2;612:1;:7;;;;611:21;604:28;;373:266;;;;4111:37:4;4016:174;;4961:3:7;4957:16;;;;4975:66;4953:89;4016:174:4;;;4941:102:7;5059:11;;;5052:27;;;;5117:3;5113:16;5131:66;5109:89;5095:12;;;5088:111;-1:-1:-1;5215:12:7;;;5208:60;5284:12;;4016:174:4;;;;;;;;;;;;3993:197;;4205:12;4219:11;4245:7;4234:38;;;;;;;;;;;;:::i;:::-;4204:68;;;;4293:7;-1:-1:-1;;;;;4293:13:4;;4307:14;:19;;4327:14;4307:35;;;;;-1:-1:-1;;;4307:35:4;;;;;;;;;;;4344:11;;4357;;;;4293:88;;;;;;;;;;;;;6169:25:7;;;;6210:18;;;6203:34;;;;6253:18;;;6246:34;6296:18;;;6289:34;;;-1:-1:-1;;6360:79:7;;6339:19;;;6332:108;6141:19;;4293:88:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4286:95;;;;;;;3520:878;;;;:::o;3054:460::-;2498:1;389:4:0;380:6;;:13;398:1;379:20;:43;;;-1:-1:-1;417:5:0;;-1:-1:-1;;;;;417:5:0;403:10;:19;379:43;371:52;;;;;;3199:11:4::1;;3181:15;:29;3173:81;;;::::0;-1:-1:-1;;;3173:81:4;;7752:2:7;3173:81:4::1;::::0;::::1;7734:21:7::0;7791:2;7771:18;;;7764:30;7830:34;7810:18;;;7803:62;7901:9;7881:18;;;7874:37;7928:19;;3173:81:4::1;7724:229:7::0;3173:81:4::1;3273:49;3307:14;3273:33;:49::i;:::-;3272:50;3264:94;;;::::0;-1:-1:-1;;;3264:94:4;;8971:2:7;3264:94:4::1;::::0;::::1;8953:21:7::0;9010:2;8990:18;;;8983:30;9049:33;9029:18;;;9022:61;9100:18;;3264:94:4::1;8943:181:7::0;3264:94:4::1;3423:13;::::0;3406::::1;::::0;-1:-1:-1;;;;;3406:13:4::1;3396:24;::::0;;;:9:::1;:24;::::0;;;;;:40:::1;::::0;3423:13;3396:40:::1;:::i;:::-;3379:13;::::0;-1:-1:-1;;;;;3379:13:4;;::::1;3369:24;::::0;;;:9:::1;:24;::::0;;;;:67;;;;3464:13:::1;::::0;3446:17;;::::1;::::0;:36:::1;::::0;3464:17:::1;::::0;3480:1:::1;::::0;3464:17:::1;:::i;:::-;3446:36;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;3506:1:4::1;3492:11;:15:::0;-1:-1:-1;;3054:460:4:o;1114:237:0:-;302:5;;1210:12;;-1:-1:-1;;;;;302:5:0;288:10;:19;280:28;;;;;;1235:12:::1;1249:18:::0;1271:6:::1;-1:-1:-1::0;;;;;1271:19:0::1;1291:4;1271:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1234:62;;;;1314:7;1306:16;;;::::0;::::1;;1339:5:::0;1114:237;-1:-1:-1;;;;1114:237:0:o;533:127::-;302:5;;-1:-1:-1;;;;;302:5:0;288:10;:19;280:28;;;;;;626:18;;533:127::o;2544:193:4:-;2379:1;380:6:0;;:13;;379:20;;:43;;-1:-1:-1;417:5:0;;-1:-1:-1;;;;;417:5:0;403:10;:19;379:43;371:52;;;;;;2643:13:4::1;;2630:9;:26;:56;;;;-1:-1:-1::0;2670:10:4::1;2660:21;::::0;;;:9:::1;:21;::::0;;;;;:26;2630:56:::1;2622:65;;;::::0;::::1;;-1:-1:-1::0;2707:10:4::1;2697:21;::::0;;;:9:::1;:21;::::0;;;;2721:9:::1;2697:33:::0;;2544:193::o;1054:54:0:-;302:5;;-1:-1:-1;;;;;302:5:0;288:10;:19;280:28;;;;;;1054:54::o;199:268:1:-;-1:-1:-1;;;;;;;;;;;;;;;;;393:2:1;387:8;;377:18;;330:4;429:21;330:4;2119:10:6;;2098:41;429:21:1;419:7;;:31;409:7;;;:41;-1:-1:-1;419:3:1;199:268;-1:-1:-1;199:268:1:o;1535:298:5:-;1612:26;1650:11;1664:16;:4;:14;:16::i;:::-;1650:30;;;;1716:6;1696:27;;;;;;-1:-1:-1;;;1696:27:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;1696:27:5;;-1:-1:-1;;1696:27:5;;;;;;;;;;;;1690:33;;1738:6;1733:94;1754:6;1750:1;:10;1733:94;;;1790:26;:4;:24;:26::i;:::-;1781:3;1785:1;1781:6;;;;;;-1:-1:-1;;;1781:6:5;;;;;;;;;;;;;;:35;;;;1762:3;;;;;:::i;:::-;;;;1733:94;;;;1535:298;;;;:::o;1089:121:1:-;1165:8;;;;1153;;:20;1145:58;;;;-1:-1:-1;;;1145:58:1;;9331:2:7;1145:58:1;;;9313:21:7;9370:2;9350:18;;;9343:30;9409:27;9389:18;;;9382:55;9454:18;;1145:58:1;9303:175:7;1145:58:1;1089:121;:::o;11267:1039:4:-;11385:10;;395:3;11413:26;;;11405:113;;;;-1:-1:-1;;;11405:113:4;;13035:2:7;11405:113:4;;;13017:21:7;13074:2;13054:18;;;13047:30;13113:34;13093:18;;;13086:62;13184:34;13164:18;;;13157:62;13256:12;13235:19;;;13228:41;13286:19;;11405:113:4;13007:304:7;11405:113:4;11528:12;;;:18;;;11585:6;11580:98;11601:3;11597:1;:7;11580:98;;;11645:3;11649:1;11645:6;;;;;;-1:-1:-1;;;11645:6:4;;;;;;;;;;;;;;;:16;;;:18;;;11629:5;:10;;11640:1;11629:13;;;;;-1:-1:-1;;;11629:13:4;;;;;;;;;;:34;11606:3;;11580:98;;;;11691:18;11769:6;11764:469;11786:3;11781:1;:8;11764:469;;11814:14;11831:3;11835:1;11831:6;;;;;;-1:-1:-1;;;11831:6:4;;;;;;;;;;;;;;;:12;;;11814:29;;11875:6;11861:20;;;;;;11910:3;11903;;;;;;:10;11899:137;;;11982:6;11974:15;;11966:24;;;11937:5;:18;;11961:1;11956;:6;;11937:26;;;;;-1:-1:-1;;;11937:26:4;;;;;;;;;;:53;-1:-1:-1;12012:5:4;;11899:137;12053:14;12070:3;12074:1;12070:6;;;;;;-1:-1:-1;;;12070:6:4;;;;;;;;;;;;;;;;;;;;:12;;12100:20;;;;;;;12070:12;;-1:-1:-1;12183:24:4;12191:15;;;;12183:24;12175:42;12138:18;;;12162:1;12157:6;;;12138:26;;;;;-1:-1:-1;;;12138:26:4;;;;;;;;;;:80;-1:-1:-1;;11791:3:4;;11764:469;;;-1:-1:-1;12288:1:4;12283;12270:14;;12269:20;12246:5;:20;;:43;;;;11267:1039;;;;:::o;4292:879:5:-;4371:27;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4371:27:5;4432:20;:4;:18;:20::i;:::-;4410:42;;4490:20;:4;:18;:20::i;:::-;4462:25;;;:48;4537:33;:4;:31;:33::i;:::-;4520:14;;;:50;4602:20;:4;:18;:20::i;:::-;4580:19;;;:42;4647:35;:4;:33;:35::i;:::-;4632:12;;;:50;4693:11;4707:16;:4;:14;:16::i;:::-;4693:30;;;;4784:6;4760:31;;;;;;-1:-1:-1;;;4760:31:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4760:31:5;;;;;;;;;;;;;;;-1:-1:-1;4733:24:5;;;:58;4806:6;4801:119;4822:6;4818:1;:10;4801:119;;;4879:30;:4;:28;:30::i;:::-;4849:3;:24;;;4874:1;4849:27;;;;;;-1:-1:-1;;;4849:27:5;;;;;;;;;;;;;;:60;;;;4830:3;;;;;:::i;:::-;;;;4801:119;;;;4941:135;4978:66;5002:3;:14;;;:19;;;5023:3;:19;;;4985:58;;;;;;;;4360:19:7;;;4404:2;4395:12;;4388:28;4441:2;4432:12;;4350:100;4985:58:5;;;;-1:-1:-1;;4985:58:5;;;;;;;;;;4978:66;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5046:19;;4961:105;;;;;;4360:19:7;;;;4395:12;;4388:28;4432:12;;4961:105:5;;;-1:-1:-1;;4961:105:5;;;;;;;;;;4941:135;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4930:8;;;:146;;;5127:25;;;;;5110:53;;5103:61;;5110:53;;4930:146;;5110:53;4360:19:7;;;4404:2;4395:12;;4388:28;4441:2;4432:12;;4350:100;5110:53:5;;;;-1:-1:-1;;5110:53:5;;;;;;;;;;5103:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5087:13;;;:77;-1:-1:-1;5087:3:5;4292:879;-1:-1:-1;4292:879:5:o;1947:138:1:-;2007:6;2032:46;2063:12;:4;2073:1;2063:9;:12::i;:::-;274:21:6;;;;305:10;274:21;300;;;;;;;;;;273:49;357:2;340:7;;;352;;;339:21;;198:169;2032:46:1;2025:53;1947:138;-1:-1:-1;;1947:138:1:o;1091:438:5:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1229:15:5;:4;:13;:15::i;:::-;1203:41;;1254:16;:4;:14;:16::i;:::-;1296:22;:4;:20;:22::i;:::-;1280:38;;1340:17;:4;:15;:17::i;:::-;1328:29;;:9;;;:29;1371:33;;;255:1;1371:33;1367:156;;;1438:15;:4;:13;:15::i;:::-;:20;;;;1420:15;;;:38;1367:156;;;1507:5;1489:15;;;:23;1091:438;;;;:::o;2651:110:1:-;2715:7;2741:13;:4;2751:2;2741:9;:13::i;3391:572:5:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3556:20:5;:4;3572:3;3556:15;:20::i;:::-;3545:8;;;:31;3599:16;:4;:14;:16::i;:::-;3586:29;;;;3640:20;:4;:18;:20::i;:::-;3625:12;;;:35;3690:20;:4;:18;:20::i;:::-;3670:17;;;:40;3742:20;:4;:18;:20::i;:::-;3720:19;;;:42;3791:20;:4;:18;:20::i;:::-;3772:16;;;:39;3837:16;:4;:14;:16::i;:::-;3821:32;;:13;;;:32;3882:20;:4;:18;:20::i;:::-;3863:16;;;:39;3936:20;:4;:18;:20::i;:::-;3912:21;;;:44;:3;3391:572;-1:-1:-1;3391:572:5:o;1996:389::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;2165:17:5;:4;:15;:17::i;:::-;2154:28;;;;;2192:187;;2233:8;;2276:27;2233:4;2276:25;:27::i;:::-;2255:18;;;:48;2351:8;;2328:40;;2344:5;;2351:16;;2344:5;;2351:16;:::i;:::-;2328:15;:40::i;:::-;2317:8;;;:51;-1:-1:-1;1996:389:5;;;:::o;2477:241::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2608:17:5;:4;:15;:17::i;:::-;2597:28;;;;;2635:77;;2679:22;:4;:20;:22::i;:::-;2663:13;;;:38;2477:241;;;:::o;827:256:1:-;895:11;918:25;:4;936:6;918:17;:25::i;:::-;-1:-1:-1;984:8:1;;2119:10:6;;1028:18:1;;;;;2119:10:6;827:256:1:o;1680:117::-;1739:5;1776:12;:4;1786:1;1776:9;:12::i;:::-;1763:27;;;1680:117;-1:-1:-1;;1680:117:1:o;2965:195::-;3026:11;3040:16;:4;:14;:16::i;:::-;3026:30;;;;3066:25;3084:6;3066:4;:17;;:25;;;;:::i;:::-;3125:18;;;;;2965:195::o;312:211:5:-;-1:-1:-1;;;;;;;;;;;;424:15:5;:4;:13;:15::i;:::-;:20;;;416:62;;;;-1:-1:-1;;;416:62:5;;7039:2:7;416:62:5;;;7021:21:7;7078:2;7058:18;;;7051:30;7117:31;7097:18;;;7090:59;7166:18;;416:62:5;7011:179:7;416:62:5;496:20;:4;:18;:20::i;:::-;488:28;;:3;312:211;-1:-1:-1;312:211:5:o;2235:144:1:-;2296:7;2322:50;2356:13;:4;2366:2;2356:9;:13::i;:::-;836:38:6;724:45;;;;836:38;;;;774:45;;;;;836:38;;;;930:2;835:46;;;887:38;;;;;;;;;;;;;;886:46;;;834:99;1043:2;948:46;;;1004:34;948:46;999;;;;;;;;;947:99;1081:2;1064:7;;;1076;;;1063:21;;645:446;1499:175:1;1573:7;1592:25;:4;1610:6;1592:17;:25::i;:::-;1650:8;;1634:33;;1660:6;1634:15;:33::i;:::-;1627:40;1499:175;-1:-1:-1;;;1499:175:1:o;2091:138::-;2151:6;2176:46;2207:12;:4;2217:1;2207:9;:12::i;:::-;564:22:6;483:29;;;;564:22;;;;449:29;;;;;564:22;;;;591:2;563:30;;;529:22;;;;;;;;;;;;;;528:30;;;527:67;629:2;624:7;;;;;612;;;;;611:21;;373:266;2767:192:1;2828:4;2844:9;2856:15;:4;:13;:15::i;:::-;2844:27;;2896:1;2889:3;:8;;;;2881:46;;;;-1:-1:-1;;;2881:46:1;;11159:2:7;2881:46:1;;;11141:21:7;11198:2;11178:18;;;11171:30;11237:27;11217:18;;;11210:55;11282:18;;2881:46:1;11131:175:7;2881:46:1;2944:8;;;;;2767:192;-1:-1:-1;;2767:192:1:o;3391:502:6:-;3456:11;3684:2;3681:1;3673:6;3668:3;3665:1;3658:5;3647:40;3822:27;3837:3;3822:27;;;;;-1:-1:-1;;3875:1:6;3869:8;;3488:399;-1:-1:-1;;3488:399:6:o;597:255:5:-;-1:-1:-1;;;;;;;;;;;;;;;;;709:15:5;:4;:13;:15::i;:::-;:20;;;701:68;;;;-1:-1:-1;;;701:68:5;;8567:2:7;701:68:5;;;8549:21:7;8606:2;8586:18;;;8579:30;8645:34;8625:18;;;8618:62;8716:5;8696:18;;;8689:33;8739:19;;701:68:5;8539:225:7;701:68:5;787:20;:4;:18;:20::i;:::-;779:28;;825:20;:4;:18;:20::i;634:187:1:-;764:8;;;;743;;:17;;:29;;735:69;;;;-1:-1:-1;;;735:69:1;;11859:2:7;735:69:1;;;11841:21:7;11898:2;11878:18;;;11871:30;11937:29;11917:18;;;11910:57;11984:18;;735:69:1;11831:177:7;735:69:1;634:187;;:::o;14:738:7:-;;109:3;102:4;94:6;90:17;86:27;76:2;;131:5;124;117:20;76:2;171:6;158:20;197:18;234:2;230;227:10;224:2;;;240:18;;:::i;:::-;315:2;309:9;283:2;369:13;;-1:-1:-1;;365:22:7;;;389:2;361:31;357:40;345:53;;;413:18;;;433:22;;;410:46;407:2;;;459:18;;:::i;:::-;499:10;495:2;488:22;534:2;526:6;519:18;580:3;573:4;568:2;560:6;556:15;552:26;549:35;546:2;;;601:5;594;587:20;546:2;669;662:4;654:6;650:17;643:4;635:6;631:17;618:54;692:15;;;709:4;688:26;681:41;;;;-1:-1:-1;696:6:7;66:686;-1:-1:-1;;;66:686:7:o;757:257::-;;869:2;857:9;848:7;844:23;840:32;837:2;;;890:6;882;875:22;837:2;934:9;921:23;953:31;978:5;953:31;:::i;1019:333::-;;;1156:2;1144:9;1135:7;1131:23;1127:32;1124:2;;;1177:6;1169;1162:22;1124:2;1221:9;1208:23;1240:31;1265:5;1240:31;:::i;:::-;1290:5;1342:2;1327:18;;;;1314:32;;-1:-1:-1;;;1114:238:7:o;1357:475::-;;;1495:2;1483:9;1474:7;1470:23;1466:32;1463:2;;;1516:6;1508;1501:22;1463:2;1560:9;1547:23;1579:31;1604:5;1579:31;:::i;:::-;1629:5;-1:-1:-1;1685:2:7;1670:18;;1657:32;1712:18;1701:30;;1698:2;;;1749:6;1741;1734:22;1698:2;1777:49;1818:7;1809:6;1798:9;1794:22;1777:49;:::i;:::-;1767:59;;;1453:379;;;;;:::o;1837:297::-;;1957:2;1945:9;1936:7;1932:23;1928:32;1925:2;;;1978:6;1970;1963:22;1925:2;2015:9;2009:16;2068:5;2061:13;2054:21;2047:5;2044:32;2034:2;;2095:6;2087;2080:22;2139:194;;2262:2;2250:9;2241:7;2237:23;2233:32;2230:2;;;2283:6;2275;2268:22;2230:2;-1:-1:-1;2311:16:7;;2220:113;-1:-1:-1;2220:113:7:o;2338:417::-;;;2477:2;2465:9;2456:7;2452:23;2448:32;2445:2;;;2498:6;2490;2483:22;2445:2;2532:9;2526:16;2516:26;;2585:2;2574:9;2570:18;2564:25;-1:-1:-1;;2622:5:7;2618:78;2611:5;2608:89;2598:2;;2716:6;2708;2701:22;2598:2;2744:5;2734:15;;;2435:320;;;;;:::o;2760:340::-;;2881:2;2869:9;2860:7;2856:23;2852:32;2849:2;;;2902:6;2894;2887:22;2849:2;2947:9;2934:23;2980:18;2972:6;2969:30;2966:2;;;3017:6;3009;3002:22;2966:2;3045:49;3086:7;3077:6;3066:9;3062:22;3045:49;:::i;3105:190::-;;3217:2;3205:9;3196:7;3192:23;3188:32;3185:2;;;3238:6;3230;3223:22;3185:2;-1:-1:-1;3266:23:7;;3175:120;-1:-1:-1;3175:120:7:o;3300:258::-;;;3429:2;3417:9;3408:7;3404:23;3400:32;3397:2;;;3450:6;3442;3435:22;3397:2;-1:-1:-1;;3478:23:7;;;3548:2;3533:18;;;3520:32;;-1:-1:-1;3387:171:7:o;3563:326::-;;;;3709:2;3697:9;3688:7;3684:23;3680:32;3677:2;;;3730:6;3722;3715:22;3677:2;-1:-1:-1;;3758:23:7;;;3828:2;3813:18;;3800:32;;-1:-1:-1;3879:2:7;3864:18;;;3851:32;;3667:222;-1:-1:-1;3667:222:7:o;3894:304::-;;4005:2;3993:9;3984:7;3980:23;3976:32;3973:2;;;4026:6;4018;4011:22;3973:2;4070:9;4057:23;4120:18;4113:5;4109:30;4102:5;4099:41;4089:2;;4159:6;4151;4144:22;4455:274;;4622:6;4616:13;4638:53;4684:6;4679:3;4672:4;4664:6;4660:17;4638:53;:::i;:::-;4707:16;;;;;4592:137;-1:-1:-1;;4592:137:7:o;6451:381::-;;6598:2;6587:9;6580:21;6630:6;6624:13;6673:6;6668:2;6657:9;6653:18;6646:34;6689:66;6748:6;6743:2;6732:9;6728:18;6723:2;6715:6;6711:15;6689:66;:::i;:::-;6816:2;6795:15;-1:-1:-1;;6791:29:7;6776:45;;;;6823:2;6772:54;;6570:262;-1:-1:-1;;6570:262:7:o;15042:274::-;;15108:1;15098:2;;-1:-1:-1;;;15140:1:7;15133:88;15244:4;15241:1;15234:15;15272:4;15269:1;15262:15;15098:2;-1:-1:-1;15301:9:7;;15088:228::o;15321:125::-;;15389:1;15386;15383:8;15380:2;;;15394:18;;:::i;:::-;-1:-1:-1;15431:9:7;;15370:76::o;15451:258::-;15523:1;15533:113;15547:6;15544:1;15541:13;15533:113;;;15623:11;;;15617:18;15604:11;;;15597:39;15569:2;15562:10;15533:113;;;15664:6;15661:1;15658:13;15655:2;;;15699:1;15690:6;15685:3;15681:16;15674:27;15655:2;;15504:205;;;:::o;15714:135::-;;-1:-1:-1;;15774:17:7;;15771:2;;;15794:18;;:::i;:::-;-1:-1:-1;15841:1:7;15830:13;;15761:88::o;15854:184::-;-1:-1:-1;;;15903:1:7;15896:88;16003:4;16000:1;15993:15;16027:4;16024:1;16017:15;16043:184;-1:-1:-1;;;16092:1:7;16085:88;16192:4;16189:1;16182:15;16216:4;16213:1;16206:15;16232:154;-1:-1:-1;;;;;16311:5:7;16307:54;16300:5;16297:65;16287:2;;16376:1;16373;16366:12

Swarm Source

ipfs://c4e6e79813650f87983cecaaecad09dcd9553de5fd09d0482a231f30c6db1fc8

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.