ETH Price: $3,311.20 (+1.24%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Trusted Remo...170011512023-04-08 3:51:47664 days ago1680925907IN
0x1253B256...0ea35CAD9
0 ETH0.0008265620.55119665
Send From170009782023-04-08 3:16:47664 days ago1680923807IN
0x1253B256...0ea35CAD9
0 ETH0.0027063820.62162858
Set Trusted Remo...170003442023-04-08 1:08:35664 days ago1680916115IN
0x1253B256...0ea35CAD9
0 ETH0.0019992221.19305139
Set Min Dst Gas170003332023-04-08 1:06:23664 days ago1680915983IN
0x1253B256...0ea35CAD9
0 ETH0.0009870120.51621124
Set Dst Chain Id...170003272023-04-08 1:05:11664 days ago1680915911IN
0x1253B256...0ea35CAD9
0 ETH0.0009448820.49070805
Set Dst Chain Id...170003232023-04-08 1:04:23664 days ago1680915863IN
0x1253B256...0ea35CAD9
0 ETH0.0010882923.60618237

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MutantSumoProxyONFT

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-04-06
*/

//SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

interface IERC165 {
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

abstract contract Context {
    function _msgSender() internal view virtual returns (address) { return msg.sender; }
    function _msgData() internal view virtual returns (bytes calldata) { return msg.data; }
}

abstract contract Ownable is Context {
    address private _owner;
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    constructor() { _transferOwnership(_msgSender()); }
    modifier onlyOwner() { _checkOwner();_; }
    function owner() public view virtual returns (address) { return _owner; }
    function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); }
    function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); }
    function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); }
    function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); }
}

interface ILayerZeroReceiver {
    function lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) external;
}

interface ILayerZeroUserApplicationConfig {
    function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external;
    function setSendVersion(uint16 _version) external;
    function setReceiveVersion(uint16 _version) external;
    function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external;
}

interface ILayerZeroEndpoint is ILayerZeroUserApplicationConfig {
    function send(uint16 _dstChainId, bytes calldata _destination, bytes calldata _payload, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable;
    function receivePayload(uint16 _srcChainId, bytes calldata _srcAddress, address _dstAddress, uint64 _nonce, uint _gasLimit, bytes calldata _payload) external;
    function getInboundNonce(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (uint64);
    function getOutboundNonce(uint16 _dstChainId, address _srcAddress) external view returns (uint64);
    function estimateFees(uint16 _dstChainId, address _userApplication, bytes calldata _payload, bool _payInZRO, bytes calldata _adapterParam) external view returns (uint nativeFee, uint zroFee);
    function getChainId() external view returns (uint16);
    function retryPayload(uint16 _srcChainId, bytes calldata _srcAddress, bytes calldata _payload) external;
    function hasStoredPayload(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool);
    function getSendLibraryAddress(address _userApplication) external view returns (address);
    function getReceiveLibraryAddress(address _userApplication) external view returns (address);
    function isSendingPayload() external view returns (bool);
    function isReceivingPayload() external view returns (bool);
    function getConfig(uint16 _version, uint16 _chainId, address _userApplication, uint _configType) external view returns (bytes memory);
    function getSendVersion(address _userApplication) external view returns (uint16);
    function getReceiveVersion(address _userApplication) external view returns (uint16);
}

library BytesLib {
    function concat(
        bytes memory _preBytes,
        bytes memory _postBytes
    )
    internal
    pure
    returns (bytes memory)
    {
        bytes memory tempBytes;

        assembly {
            tempBytes := mload(0x40)

            let length := mload(_preBytes)
            mstore(tempBytes, length)
            let mc := add(tempBytes, 0x20)
            let end := add(mc, length)

            for {
                let cc := add(_preBytes, 0x20)
            } lt(mc, end) {
                mc := add(mc, 0x20)
                cc := add(cc, 0x20)
            } {
                mstore(mc, mload(cc))
            }
            length := mload(_postBytes)
            mstore(tempBytes, add(length, mload(tempBytes)))
            mc := end
            end := add(mc, length)

            for {
                let cc := add(_postBytes, 0x20)
            } lt(mc, end) {
                mc := add(mc, 0x20)
                cc := add(cc, 0x20)
            } {
                mstore(mc, mload(cc))
            }

            mstore(0x40, and(
            add(add(end, iszero(add(length, mload(_preBytes)))), 31),
            not(31)
            ))
        }

        return tempBytes;
    }

    function concatStorage(bytes storage _preBytes, bytes memory _postBytes) internal {
        assembly {
            let fslot := sload(_preBytes.slot)
            let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)
            let mlength := mload(_postBytes)
            let newlength := add(slength, mlength)
            switch add(lt(slength, 32), lt(newlength, 32))
            case 2 {
                sstore(
                _preBytes.slot,
                add(
                fslot,
                add(
                mul(
                div(
                mload(add(_postBytes, 0x20)),
                exp(0x100, sub(32, mlength))
                ),
                exp(0x100, sub(32, newlength))
                ),
                mul(mlength, 2)
                )
                )
                )
            }
            case 1 {
                mstore(0x0, _preBytes.slot)
                let sc := add(keccak256(0x0, 0x20), div(slength, 32))
                sstore(_preBytes.slot, add(mul(newlength, 2), 1))

                let submod := sub(32, slength)
                let mc := add(_postBytes, submod)
                let end := add(_postBytes, mlength)
                let mask := sub(exp(0x100, submod), 1)

                sstore(
                sc,
                add(
                and(
                fslot,
                0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
                ),
                and(mload(mc), mask)
                )
                )

                for {
                    mc := add(mc, 0x20)
                    sc := add(sc, 1)
                } lt(mc, end) {
                    sc := add(sc, 1)
                    mc := add(mc, 0x20)
                } {
                    sstore(sc, mload(mc))
                }

                mask := exp(0x100, sub(mc, end))

                sstore(sc, mul(div(mload(mc), mask), mask))
            }
            default {
                mstore(0x0, _preBytes.slot)
                let sc := add(keccak256(0x0, 0x20), div(slength, 32))
                sstore(_preBytes.slot, add(mul(newlength, 2), 1))
                let slengthmod := mod(slength, 32)
                let mlengthmod := mod(mlength, 32)
                let submod := sub(32, slengthmod)
                let mc := add(_postBytes, submod)
                let end := add(_postBytes, mlength)
                let mask := sub(exp(0x100, submod), 1)

                sstore(sc, add(sload(sc), and(mload(mc), mask)))

                for {
                    sc := add(sc, 1)
                    mc := add(mc, 0x20)
                } lt(mc, end) {
                    sc := add(sc, 1)
                    mc := add(mc, 0x20)
                } {
                    sstore(sc, mload(mc))
                }

                mask := exp(0x100, sub(mc, end))

                sstore(sc, mul(div(mload(mc), mask), mask))
            }
        }
    }

    function slice(
        bytes memory _bytes,
        uint256 _start,
        uint256 _length
    )
    internal
    pure
    returns (bytes memory)
    {
        require(_length + 31 >= _length, "slice_overflow");
        require(_bytes.length >= _start + _length, "slice_outOfBounds");

        bytes memory tempBytes;

        assembly {
            switch iszero(_length)
            case 0 {
                tempBytes := mload(0x40)
                let lengthmod := and(_length, 31)
                let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))
                let end := add(mc, _length)

                for {
                    let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)
                } lt(mc, end) {
                    mc := add(mc, 0x20)
                    cc := add(cc, 0x20)
                } {
                    mstore(mc, mload(cc))
                }

                mstore(tempBytes, _length)
                mstore(0x40, and(add(mc, 31), not(31)))
            }
            default {
                tempBytes := mload(0x40)
                mstore(tempBytes, 0)

                mstore(0x40, add(tempBytes, 0x20))
            }
        }

        return tempBytes;
    }

    function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {
        require(_bytes.length >= _start + 20, "toAddress_outOfBounds");
        address tempAddress;

        assembly {
            tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)
        }

        return tempAddress;
    }

    function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {
        require(_bytes.length >= _start + 1 , "toUint8_outOfBounds");
        uint8 tempUint;

        assembly {
            tempUint := mload(add(add(_bytes, 0x1), _start))
        }

        return tempUint;
    }

    function toUint16(bytes memory _bytes, uint256 _start) internal pure returns (uint16) {
        require(_bytes.length >= _start + 2, "toUint16_outOfBounds");
        uint16 tempUint;

        assembly {
            tempUint := mload(add(add(_bytes, 0x2), _start))
        }

        return tempUint;
    }

    function toUint32(bytes memory _bytes, uint256 _start) internal pure returns (uint32) {
        require(_bytes.length >= _start + 4, "toUint32_outOfBounds");
        uint32 tempUint;

        assembly {
            tempUint := mload(add(add(_bytes, 0x4), _start))
        }

        return tempUint;
    }

    function toUint64(bytes memory _bytes, uint256 _start) internal pure returns (uint64) {
        require(_bytes.length >= _start + 8, "toUint64_outOfBounds");
        uint64 tempUint;

        assembly {
            tempUint := mload(add(add(_bytes, 0x8), _start))
        }

        return tempUint;
    }

    function toUint96(bytes memory _bytes, uint256 _start) internal pure returns (uint96) {
        require(_bytes.length >= _start + 12, "toUint96_outOfBounds");
        uint96 tempUint;

        assembly {
            tempUint := mload(add(add(_bytes, 0xc), _start))
        }

        return tempUint;
    }

    function toUint128(bytes memory _bytes, uint256 _start) internal pure returns (uint128) {
        require(_bytes.length >= _start + 16, "toUint128_outOfBounds");
        uint128 tempUint;

        assembly {
            tempUint := mload(add(add(_bytes, 0x10), _start))
        }

        return tempUint;
    }

    function toUint256(bytes memory _bytes, uint256 _start) internal pure returns (uint256) {
        require(_bytes.length >= _start + 32, "toUint256_outOfBounds");
        uint256 tempUint;

        assembly {
            tempUint := mload(add(add(_bytes, 0x20), _start))
        }

        return tempUint;
    }

    function toBytes32(bytes memory _bytes, uint256 _start) internal pure returns (bytes32) {
        require(_bytes.length >= _start + 32, "toBytes32_outOfBounds");
        bytes32 tempBytes32;

        assembly {
            tempBytes32 := mload(add(add(_bytes, 0x20), _start))
        }

        return tempBytes32;
    }

    function equal(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bool) {
        bool success = true;

        assembly {
            let length := mload(_preBytes)

            switch eq(length, mload(_postBytes))
            case 1 {
                let cb := 1

                let mc := add(_preBytes, 0x20)
                let end := add(mc, length)

                for {
                    let cc := add(_postBytes, 0x20)
                } eq(add(lt(mc, end), cb), 2) {
                    mc := add(mc, 0x20)
                    cc := add(cc, 0x20)
                } {
                    if iszero(eq(mload(mc), mload(cc))) {
                        success := 0
                        cb := 0
                    }
                }
            }
            default {
                success := 0
            }
        }

        return success;
    }

    function equalStorage(
        bytes storage _preBytes,
        bytes memory _postBytes
    )
    internal
    view
    returns (bool)
    {
        bool success = true;

        assembly {
            let fslot := sload(_preBytes.slot)
            let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)
            let mlength := mload(_postBytes)

            switch eq(slength, mlength)
            case 1 {
                if iszero(iszero(slength)) {
                    switch lt(slength, 32)
                    case 1 {
                        fslot := mul(div(fslot, 0x100), 0x100)

                        if iszero(eq(fslot, mload(add(_postBytes, 0x20)))) {
                            success := 0
                        }
                    }
                    default {
                        let cb := 1
                        mstore(0x0, _preBytes.slot)
                        let sc := keccak256(0x0, 0x20)

                        let mc := add(_postBytes, 0x20)
                        let end := add(mc, mlength)

                        for {} eq(add(lt(mc, end), cb), 2) {
                            sc := add(sc, 1)
                            mc := add(mc, 0x20)
                        } {
                            if iszero(eq(sload(sc), mload(mc))) {
                                success := 0
                                cb := 0
                            }
                        }
                    }
                }
            }
            default {
                success := 0
            }
        }

        return success;
    }
}

abstract contract LzApp is Ownable, ILayerZeroReceiver, ILayerZeroUserApplicationConfig {
    using BytesLib for bytes;

    ILayerZeroEndpoint public immutable lzEndpoint;
    mapping(uint16 => bytes) public trustedRemoteLookup;
    mapping(uint16 => mapping(uint16 => uint)) public minDstGasLookup;
    address public precrime;

    event SetPrecrime(address precrime);
    event SetTrustedRemote(uint16 _remoteChainId, bytes _path);
    event SetTrustedRemoteAddress(uint16 _remoteChainId, bytes _remoteAddress);
    event SetMinDstGas(uint16 _dstChainId, uint16 _type, uint _minDstGas);

    constructor(address _endpoint) {
        lzEndpoint = ILayerZeroEndpoint(_endpoint);
    }

    function lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) public virtual override {
        require(_msgSender() == address(lzEndpoint), "LzApp: invalid endpoint caller");
        bytes memory trustedRemote = trustedRemoteLookup[_srcChainId];
        require(_srcAddress.length == trustedRemote.length && trustedRemote.length > 0 && keccak256(_srcAddress) == keccak256(trustedRemote), "LzApp: invalid source sending contract");
        _blockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload);
    }

    function _blockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual;

    function _lzSend(uint16 _dstChainId, bytes memory _payload, address payable _refundAddress, address _zroPaymentAddress, bytes memory _adapterParams, uint _nativeFee) internal virtual {
        bytes memory trustedRemote = trustedRemoteLookup[_dstChainId];
        require(trustedRemote.length != 0, "LzApp: destination chain is not a trusted source");
        lzEndpoint.send{value: _nativeFee}(_dstChainId, trustedRemote, _payload, _refundAddress, _zroPaymentAddress, _adapterParams);
    }

    function _checkGasLimit(uint16 _dstChainId, uint16 _type, bytes memory _adapterParams, uint _extraGas) internal view virtual {
        uint providedGasLimit = _getGasLimit(_adapterParams);
        uint minGasLimit = minDstGasLookup[_dstChainId][_type] + _extraGas;
        require(minGasLimit > 0, "LzApp: minGasLimit not set");
        require(providedGasLimit >= minGasLimit, "LzApp: gas limit is too low");
    }

    function _getGasLimit(bytes memory _adapterParams) internal pure virtual returns (uint gasLimit) {
        require(_adapterParams.length >= 34, "LzApp: invalid adapterParams");
        assembly {
            gasLimit := mload(add(_adapterParams, 34))
        }
    }

    function getConfig(uint16 _version, uint16 _chainId, address, uint _configType) external view returns (bytes memory) {
        return lzEndpoint.getConfig(_version, _chainId, address(this), _configType);
    }

    function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external override onlyOwner {
        lzEndpoint.setConfig(_version, _chainId, _configType, _config);
    }

    function setSendVersion(uint16 _version) external override onlyOwner {
        lzEndpoint.setSendVersion(_version);
    }

    function setReceiveVersion(uint16 _version) external override onlyOwner {
        lzEndpoint.setReceiveVersion(_version);
    }

    function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external override onlyOwner {
        lzEndpoint.forceResumeReceive(_srcChainId, _srcAddress);
    }

    function setTrustedRemote(uint16 _srcChainId, bytes calldata _path) external onlyOwner {
        trustedRemoteLookup[_srcChainId] = _path;
        emit SetTrustedRemote(_srcChainId, _path);
    }

    function setTrustedRemoteAddress(uint16 _remoteChainId, bytes calldata _remoteAddress) external onlyOwner {
        trustedRemoteLookup[_remoteChainId] = abi.encodePacked(_remoteAddress, address(this));
        emit SetTrustedRemoteAddress(_remoteChainId, _remoteAddress);
    }

    function getTrustedRemoteAddress(uint16 _remoteChainId) external view returns (bytes memory) {
        bytes memory path = trustedRemoteLookup[_remoteChainId];
        require(path.length != 0, "LzApp: no trusted path record");
        return path.slice(0, path.length - 20);
    }

    function setPrecrime(address _precrime) external onlyOwner {
        precrime = _precrime;
        emit SetPrecrime(_precrime);
    }

    function setMinDstGas(uint16 _dstChainId, uint16 _packetType, uint _minGas) external onlyOwner {
        require(_minGas > 0, "LzApp: invalid minGas");
        minDstGasLookup[_dstChainId][_packetType] = _minGas;
        emit SetMinDstGas(_dstChainId, _packetType, _minGas);
    }

    function isTrustedRemote(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool) {
        bytes memory trustedSource = trustedRemoteLookup[_srcChainId];
        return keccak256(trustedSource) == keccak256(_srcAddress);
    }
}

library ExcessivelySafeCall {
    uint256 constant LOW_28_MASK =
    0x00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff;
    function excessivelySafeCall(
        address _target,
        uint256 _gas,
        uint16 _maxCopy,
        bytes memory _calldata
    ) internal returns (bool, bytes memory) {
        uint256 _toCopy;
        bool _success;
        bytes memory _returnData = new bytes(_maxCopy);
        assembly {
            _success := call(
            _gas,
            _target,
            0,
            add(_calldata, 0x20),
            mload(_calldata),
            0,
            0
            )
            _toCopy := returndatasize()
            if gt(_toCopy, _maxCopy) {
                _toCopy := _maxCopy
            }
            mstore(_returnData, _toCopy)
            returndatacopy(add(_returnData, 0x20), 0, _toCopy)
        }
        return (_success, _returnData);
    }

    function excessivelySafeStaticCall(
        address _target,
        uint256 _gas,
        uint16 _maxCopy,
        bytes memory _calldata
    ) internal view returns (bool, bytes memory) {
        uint256 _toCopy;
        bool _success;
        bytes memory _returnData = new bytes(_maxCopy);
        assembly {
            _success := staticcall(
            _gas,
            _target,
            add(_calldata, 0x20),
            mload(_calldata),
            0,
            0
            )
            _toCopy := returndatasize()
            if gt(_toCopy, _maxCopy) {
                _toCopy := _maxCopy
            }
            mstore(_returnData, _toCopy)
            returndatacopy(add(_returnData, 0x20), 0, _toCopy)
        }
        return (_success, _returnData);
    }

    function swapSelector(bytes4 _newSelector, bytes memory _buf)
    internal
    pure
    {
        require(_buf.length >= 4);
        uint256 _mask = LOW_28_MASK;
        assembly {
            let _word := mload(add(_buf, 0x20))
            _word := and(_word, _mask)
            _word := or(_newSelector, _word)
            mstore(add(_buf, 0x20), _word)
        }
    }
}

interface IONFT721Core is IERC165 {
    event SendToChain(uint16 indexed _dstChainId, address indexed _from, bytes indexed _toAddress, uint[] _tokenIds);
    event ReceiveFromChain(uint16 indexed _srcChainId, bytes indexed _srcAddress, address indexed _toAddress, uint[] _tokenIds);
    event CreditStored(bytes32 _hashedPayload, bytes _payload);
    event CreditCleared(bytes32 _hashedPayload);
    function sendFrom(address _from, uint16 _dstChainId, bytes calldata _toAddress, uint _tokenId, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable;
    function sendBatchFrom(address _from, uint16 _dstChainId, bytes calldata _toAddress, uint[] calldata _tokenIds, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable;
    function estimateSendFee(uint16 _dstChainId, bytes calldata _toAddress, uint _tokenId, bool _useZro, bytes calldata _adapterParams) external view returns (uint nativeFee, uint zroFee);
    function estimateSendBatchFee(uint16 _dstChainId, bytes calldata _toAddress, uint[] calldata _tokenIds, bool _useZro, bytes calldata _adapterParams) external view returns (uint nativeFee, uint zroFee);
}

abstract contract NonblockingLzApp is LzApp {
    using ExcessivelySafeCall for address;
    constructor(address _endpoint) LzApp(_endpoint) {}
    mapping(uint16 => mapping(bytes => mapping(uint64 => bytes32))) public failedMessages;
    event MessageFailed(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes _payload, bytes _reason);
    event RetryMessageSuccess(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes32 _payloadHash);
    function _blockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual override {
        (bool success, bytes memory reason) = address(this).excessivelySafeCall(gasleft(), 150, abi.encodeWithSelector(this.nonblockingLzReceive.selector, _srcChainId, _srcAddress, _nonce, _payload));
        if (!success) {
            _storeFailedMessage(_srcChainId, _srcAddress, _nonce, _payload, reason);
        }
    }
    function _storeFailedMessage(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload, bytes memory _reason) internal virtual {
        failedMessages[_srcChainId][_srcAddress][_nonce] = keccak256(_payload);
        emit MessageFailed(_srcChainId, _srcAddress, _nonce, _payload, _reason);
    }
    function nonblockingLzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) public virtual {
        require(_msgSender() == address(this), "NonblockingLzApp: caller must be LzApp");
        _nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload);
    }
    function _nonblockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual;
    function retryMessage(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) public payable virtual {
        bytes32 payloadHash = failedMessages[_srcChainId][_srcAddress][_nonce];
        require(payloadHash != bytes32(0), "NonblockingLzApp: no stored message");
        require(keccak256(_payload) == payloadHash, "NonblockingLzApp: invalid payload");
        failedMessages[_srcChainId][_srcAddress][_nonce] = bytes32(0);
        _nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload);
        emit RetryMessageSuccess(_srcChainId, _srcAddress, _nonce, payloadHash);
    }
}

abstract contract ERC165 is IERC165 {
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; }
}

interface IERC721 is IERC165 {
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    function balanceOf(address owner) external view returns (uint256 balance);

    function ownerOf(uint256 tokenId) external view returns (address owner);

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function approve(address to, uint256 tokenId) external;

    function setApprovalForAll(address operator, bool _approved) external;

    function getApproved(uint256 tokenId) external view returns (address operator);

    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

interface IERC721Receiver {
    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);
}

library ERC165Checker {
    bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;

    function supportsERC165(address account) internal view returns (bool) {
        return
            supportsERC165InterfaceUnchecked(account, type(IERC165).interfaceId) &&
            !supportsERC165InterfaceUnchecked(account, _INTERFACE_ID_INVALID);
    }

    function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {
        return supportsERC165(account) && supportsERC165InterfaceUnchecked(account, interfaceId);
    }

    function getSupportedInterfaces(address account, bytes4[] memory interfaceIds)
        internal
        view
        returns (bool[] memory)
    {
        bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);
        if (supportsERC165(account)) {
            for (uint256 i = 0; i < interfaceIds.length; i++) {
                interfaceIdsSupported[i] = supportsERC165InterfaceUnchecked(account, interfaceIds[i]);
            }
        }

        return interfaceIdsSupported;
    }

    function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {
        if (!supportsERC165(account)) {
            return false;
        }

        for (uint256 i = 0; i < interfaceIds.length; i++) {
            if (!supportsERC165InterfaceUnchecked(account, interfaceIds[i])) {
                return false;
            }
        }

        return true;
    }

    function supportsERC165InterfaceUnchecked(address account, bytes4 interfaceId) internal view returns (bool) {
        bytes memory encodedParams = abi.encodeWithSelector(IERC165.supportsInterface.selector, interfaceId);
        bool success;
        uint256 returnSize;
        uint256 returnValue;
        assembly {
            success := staticcall(30000, account, add(encodedParams, 0x20), mload(encodedParams), 0x00, 0x20)
            returnSize := returndatasize()
            returnValue := mload(0x00)
        }

        return success && returnSize >= 0x20 && returnValue > 0;
    }
}

abstract contract ONFT721Core is NonblockingLzApp, ERC165, IONFT721Core {
    uint16 public constant FUNCTION_TYPE_SEND = 1;

    struct StoredCredit {
        uint16 srcChainId;
        address toAddress;
        uint256 index;
        bool creditsRemain;
    }

    uint256 public minGasToTransferAndStore;
    mapping(uint16 => uint256) public dstChainIdToBatchLimit;
    mapping(uint16 => uint256) public dstChainIdToTransferGas;
    mapping(bytes32 => StoredCredit) public storedCredits;

    constructor(uint256 _minGasToTransferAndStore, address _lzEndpoint) NonblockingLzApp(_lzEndpoint) {
        require(_minGasToTransferAndStore > 0, "ONFT721: minGasToTransferAndStore must be > 0");
        minGasToTransferAndStore = _minGasToTransferAndStore;
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return interfaceId == type(IONFT721Core).interfaceId || super.supportsInterface(interfaceId);
    }

    function estimateSendFee(uint16 _dstChainId, bytes memory _toAddress, uint _tokenId, bool _useZro, bytes memory _adapterParams) public view virtual override returns (uint nativeFee, uint zroFee) {
        return estimateSendBatchFee(_dstChainId, _toAddress, _toSingletonArray(_tokenId), _useZro, _adapterParams);
    }

    function estimateSendBatchFee(uint16 _dstChainId, bytes memory _toAddress, uint[] memory _tokenIds, bool _useZro, bytes memory _adapterParams) public view virtual override returns (uint nativeFee, uint zroFee) {
        bytes memory payload = abi.encode(_toAddress, _tokenIds);
        return lzEndpoint.estimateFees(_dstChainId, address(this), payload, _useZro, _adapterParams);
    }

    function sendFrom(address _from, uint16 _dstChainId, bytes memory _toAddress, uint _tokenId, address payable _refundAddress, address _zroPaymentAddress, bytes memory _adapterParams) public payable virtual override {
        _send(_from, _dstChainId, _toAddress, _toSingletonArray(_tokenId), _refundAddress, _zroPaymentAddress, _adapterParams);
    }

    function sendBatchFrom(address _from, uint16 _dstChainId, bytes memory _toAddress, uint[] memory _tokenIds, address payable _refundAddress, address _zroPaymentAddress, bytes memory _adapterParams) public payable virtual override {
        _send(_from, _dstChainId, _toAddress, _tokenIds, _refundAddress, _zroPaymentAddress, _adapterParams);
    }

    function _send(address _from, uint16 _dstChainId, bytes memory _toAddress, uint[] memory _tokenIds, address payable _refundAddress, address _zroPaymentAddress, bytes memory _adapterParams) internal virtual {
        require(_tokenIds.length > 0, "LzApp: tokenIds[] is empty");
        require(_tokenIds.length == 1 || _tokenIds.length <= dstChainIdToBatchLimit[_dstChainId], "ONFT721: batch size exceeds dst batch limit");

        for (uint i = 0; i < _tokenIds.length; i++) {
            _debitFrom(_from, _dstChainId, _toAddress, _tokenIds[i]);
        }

        bytes memory payload = abi.encode(_toAddress, _tokenIds);

        _checkGasLimit(_dstChainId, FUNCTION_TYPE_SEND, _adapterParams, dstChainIdToTransferGas[_dstChainId] * _tokenIds.length);
        _lzSend(_dstChainId, payload, _refundAddress, _zroPaymentAddress, _adapterParams, msg.value);
        emit SendToChain(_dstChainId, _from, _toAddress, _tokenIds);
    }

    function _nonblockingLzReceive(
        uint16 _srcChainId,
        bytes memory _srcAddress,
        uint64, /*_nonce*/
        bytes memory _payload
    ) internal virtual override {
        (bytes memory toAddressBytes, uint[] memory tokenIds) = abi.decode(_payload, (bytes, uint[]));

        address toAddress;
        assembly {
            toAddress := mload(add(toAddressBytes, 20))
        }

        uint nextIndex = _creditTill(_srcChainId, toAddress, 0, tokenIds);
        if (nextIndex < tokenIds.length) {
            bytes32 hashedPayload = keccak256(_payload);
            storedCredits[hashedPayload] = StoredCredit(_srcChainId, toAddress, nextIndex, true);
            emit CreditStored(hashedPayload, _payload);
        }

        emit ReceiveFromChain(_srcChainId, _srcAddress, toAddress, tokenIds);
    }

    function clearCredits(bytes memory _payload) external {
        bytes32 hashedPayload = keccak256(_payload);
        require(storedCredits[hashedPayload].creditsRemain, "ONFT721: no credits stored");

        (, uint[] memory tokenIds) = abi.decode(_payload, (bytes, uint[]));

        uint nextIndex = _creditTill(storedCredits[hashedPayload].srcChainId, storedCredits[hashedPayload].toAddress, storedCredits[hashedPayload].index, tokenIds);
        require(nextIndex > storedCredits[hashedPayload].index, "ONFT721: not enough gas to process credit transfer");

        if (nextIndex == tokenIds.length) {
            delete storedCredits[hashedPayload];
            emit CreditCleared(hashedPayload);
        } else {
            storedCredits[hashedPayload] = StoredCredit(storedCredits[hashedPayload].srcChainId, storedCredits[hashedPayload].toAddress, nextIndex, true);
        }
    }

    function _creditTill(uint16 _srcChainId, address _toAddress, uint _startIndex, uint[] memory _tokenIds) internal returns (uint256){
        uint i = _startIndex;
        while (i < _tokenIds.length) {
            if (gasleft() < minGasToTransferAndStore) break;

            _creditTo(_srcChainId, _toAddress, _tokenIds[i]);
            i++;
        }
        return i;
    }

    function setMinGasToTransferAndStore(uint256 _minGasToTransferAndStore) external onlyOwner {
        require(_minGasToTransferAndStore > 0, "ONFT721: minGasToTransferAndStore must be > 0");
        minGasToTransferAndStore = _minGasToTransferAndStore;
    }

    function setDstChainIdToTransferGas(uint16 _dstChainId, uint256 _dstChainIdToTransferGas) external onlyOwner {
        require(_dstChainIdToTransferGas > 0, "ONFT721: dstChainIdToTransferGas must be > 0");
        dstChainIdToTransferGas[_dstChainId] = _dstChainIdToTransferGas;
    }

    function setDstChainIdToBatchLimit(uint16 _dstChainId, uint256 _dstChainIdToBatchLimit) external onlyOwner {
        require(_dstChainIdToBatchLimit > 0, "ONFT721: dstChainIdToBatchLimit must be > 0");
        dstChainIdToBatchLimit[_dstChainId] = _dstChainIdToBatchLimit;
    }

    function _debitFrom(address _from, uint16 _dstChainId, bytes memory _toAddress, uint _tokenId) internal virtual;

    function _creditTo(uint16 _srcChainId, address _toAddress, uint _tokenId) internal virtual;

    function _toSingletonArray(uint element) internal pure returns (uint[] memory) {
        uint[] memory array = new uint[](1);
        array[0] = element;
        return array;
    }
}

contract ProxyONFT721 is ONFT721Core, IERC721Receiver {
    using ERC165Checker for address;

    IERC721 public immutable token;

    constructor(uint256 _minGasToTransfer, address _lzEndpoint, address _proxyToken) ONFT721Core(_minGasToTransfer, _lzEndpoint) {
        require(_proxyToken.supportsInterface(type(IERC721).interfaceId), "ProxyONFT721: invalid ERC721 token");
        token = IERC721(_proxyToken);
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC721Receiver).interfaceId || super.supportsInterface(interfaceId);
    }

    function _debitFrom(address _from, uint16, bytes memory, uint _tokenId) internal virtual override {
        require(_from == _msgSender(), "ProxyONFT721: owner is not send caller");
        token.safeTransferFrom(_from, address(this), _tokenId);
    }

    function _creditTo(uint16, address _toAddress, uint _tokenId) internal virtual override {
        token.safeTransferFrom(address(this), _toAddress, _tokenId);
    }

    function onERC721Received(address _operator, address, uint, bytes memory) public virtual override returns (bytes4) {
        if (_operator != address(this)) return bytes4(0);
        return IERC721Receiver.onERC721Received.selector;
    }
}

contract MutantSumoProxyONFT is ProxyONFT721 {
    constructor(uint256 _minGasToTransfer, address _lzEndpoint, address _proxyToken) ProxyONFT721(_minGasToTransfer, _lzEndpoint, _proxyToken) {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"_minGasToTransfer","type":"uint256"},{"internalType":"address","name":"_lzEndpoint","type":"address"},{"internalType":"address","name":"_proxyToken","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_hashedPayload","type":"bytes32"}],"name":"CreditCleared","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_hashedPayload","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"CreditStored","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"_payload","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"_reason","type":"bytes"}],"name":"MessageFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":true,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":true,"internalType":"address","name":"_toAddress","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"ReceiveFromChain","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes32","name":"_payloadHash","type":"bytes32"}],"name":"RetryMessageSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"bytes","name":"_toAddress","type":"bytes"},{"indexed":false,"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"SendToChain","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"_type","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"_minDstGas","type":"uint256"}],"name":"SetMinDstGas","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"precrime","type":"address"}],"name":"SetPrecrime","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_path","type":"bytes"}],"name":"SetTrustedRemote","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_remoteAddress","type":"bytes"}],"name":"SetTrustedRemoteAddress","type":"event"},{"inputs":[],"name":"FUNCTION_TYPE_SEND","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"clearCredits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"dstChainIdToBatchLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"dstChainIdToTransferGas","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes","name":"_toAddress","type":"bytes"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"bool","name":"_useZro","type":"bool"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"}],"name":"estimateSendBatchFee","outputs":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"zroFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes","name":"_toAddress","type":"bytes"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bool","name":"_useZro","type":"bool"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"}],"name":"estimateSendFee","outputs":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"zroFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"failedMessages","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"forceResumeReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"},{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"_configType","type":"uint256"}],"name":"getConfig","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_remoteChainId","type":"uint16"}],"name":"getTrustedRemoteAddress","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"isTrustedRemote","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lzEndpoint","outputs":[{"internalType":"contract ILayerZeroEndpoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"lzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"","type":"uint16"}],"name":"minDstGasLookup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minGasToTransferAndStore","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"nonblockingLzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"precrime","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"retryMessage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes","name":"_toAddress","type":"bytes"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"address payable","name":"_refundAddress","type":"address"},{"internalType":"address","name":"_zroPaymentAddress","type":"address"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"}],"name":"sendBatchFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes","name":"_toAddress","type":"bytes"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address payable","name":"_refundAddress","type":"address"},{"internalType":"address","name":"_zroPaymentAddress","type":"address"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"}],"name":"sendFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"},{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"_configType","type":"uint256"},{"internalType":"bytes","name":"_config","type":"bytes"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint256","name":"_dstChainIdToBatchLimit","type":"uint256"}],"name":"setDstChainIdToBatchLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint256","name":"_dstChainIdToTransferGas","type":"uint256"}],"name":"setDstChainIdToTransferGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint16","name":"_packetType","type":"uint16"},{"internalType":"uint256","name":"_minGas","type":"uint256"}],"name":"setMinDstGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minGasToTransferAndStore","type":"uint256"}],"name":"setMinGasToTransferAndStore","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_precrime","type":"address"}],"name":"setPrecrime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"}],"name":"setReceiveVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"}],"name":"setSendVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_path","type":"bytes"}],"name":"setTrustedRemote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"internalType":"bytes","name":"_remoteAddress","type":"bytes"}],"name":"setTrustedRemoteAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"storedCredits","outputs":[{"internalType":"uint16","name":"srcChainId","type":"uint16"},{"internalType":"address","name":"toAddress","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"bool","name":"creditsRemain","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"trustedRemoteLookup","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"}]

60c06040523480156200001157600080fd5b50604051620038e2380380620038e28339810160408190526200003491620002ba565b82828282828080620000463362000161565b60601b6001600160601b0319166080525081620000c05760405162461bcd60e51b815260206004820152602d60248201527f4f4e46543732313a206d696e476173546f5472616e73666572416e6453746f7260448201526c065206d757374206265203e203609c1b60648201526084015b60405180910390fd5b50600555620000ec6001600160a01b0382166380ac58cd60e01b620001b1602090811b62001a3d17901c565b620001455760405162461bcd60e51b815260206004820152602260248201527f50726f78794f4e46543732313a20696e76616c69642045524337323120746f6b60448201526132b760f11b6064820152608401620000b7565b60601b6001600160601b03191660a05250620002fb9350505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000620001be83620001d9565b8015620001d25750620001d2838362000212565b9392505050565b6000620001ee826301ffc9a760e01b62000212565b80156200020c57506200020a826001600160e01b031962000212565b155b92915050565b604080516001600160e01b03198316602480830191909152825180830390910181526044909101909152602080820180516001600160e01b03166301ffc9a760e01b178152825160009392849283928392918391908a617530fa92503d9150600051905082801562000285575060208210155b8015620002925750600081115b979650505050505050565b80516001600160a01b0381168114620002b557600080fd5b919050565b600080600060608486031215620002d057600080fd5b83519250620002e2602085016200029d565b9150620002f2604085016200029d565b90509250925092565b60805160601c60a05160601c6135756200036d600039600081816107f10152818161230f015261261701526000818161067d0152818161081601528181610a9001528181610b8c01528181610d000152818161140e01528181611869015281816119ae015261256f01526135756000f3fe6080604052600436106102245760003560e01c80638ffa1f2a11610123578063cbed8b9c116100ab578063f23536411161006f578063f235364114610752578063f2fde38b14610772578063f5ecbdbc14610792578063fa25f9b6146107b2578063fc0c546a146107df57600080fd5b8063cbed8b9c146106bf578063d12473a5146106df578063d1deba1f146106ff578063df2a5b3b14610712578063eb8d72b71461073257600080fd5b8063a6c3d165116100f2578063a6c3d16514610610578063ab3ffb9314610630578063af3fb21c14610643578063b353aaa71461066b578063baf3292d1461069f57600080fd5b80638ffa1f2a14610590578063950c8a74146105b05780639ea5d6b1146105d05780639f38369a146105f057600080fd5b806342d65a8d116101b157806366ad5c8a1161017557806366ad5c8a146104c4578063715018a6146104e45780637533d788146104f95780638cfd8f5c146105265780638da5cb5b1461055e57600080fd5b806342d65a8d146103f157806348288190146104115780634ac3f4ff1461043557806351905636146104625780635b8c41e61461047557600080fd5b806310ddb137116101f857806310ddb137146102c0578063150b7a02146102e057806322a3ecf9146103195780632a205e3d1461039c5780633d8b38f6146103d157600080fd5b80621d35671461022957806301ffc9a71461024b57806307e0db17146102805780630b4cad4c146102a0575b600080fd5b34801561023557600080fd5b50610249610244366004612d17565b610813565b005b34801561025757600080fd5b5061026b610266366004612b57565b610a44565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b5061024961029b366004612caa565b610a6f565b3480156102ac57600080fd5b506102496102bb366004612b3e565b610af8565b3480156102cc57600080fd5b506102496102db366004612caa565b610b6b565b3480156102ec57600080fd5b506103006102fb366004612965565b610bc3565b6040516001600160e01b03199091168152602001610277565b34801561032557600080fd5b5061036d610334366004612b3e565b60086020526000908152604090208054600182015460029092015461ffff821692620100009092046001600160a01b0316919060ff1684565b6040805161ffff90951685526001600160a01b0390931660208501529183015215156060820152608001610277565b3480156103a857600080fd5b506103bc6103b7366004612e53565b610bef565b60408051928352602083019190915201610277565b3480156103dd57600080fd5b5061026b6103ec366004612cc5565b610c15565b3480156103fd57600080fd5b5061024961040c366004612cc5565b610ce1565b34801561041d57600080fd5b5061042760055481565b604051908152602001610277565b34801561044157600080fd5b50610427610450366004612caa565b60066020526000908152604090205481565b610249610470366004612aa1565b610d67565b34801561048157600080fd5b50610427610490366004612eb1565b6004602090815260009384526040808520845180860184018051928152908401958401959095209452929052825290205481565b3480156104d057600080fd5b506102496104df366004612d17565b610d7e565b3480156104f057600080fd5b50610249610e5a565b34801561050557600080fd5b50610519610514366004612caa565b610e6e565b6040516102779190613194565b34801561053257600080fd5b50610427610541366004612f0e565b600260209081526000928352604080842090915290825290205481565b34801561056a57600080fd5b506000546001600160a01b03165b6040516001600160a01b039091168152602001610277565b34801561059c57600080fd5b506102496105ab366004612b81565b610f08565b3480156105bc57600080fd5b50600354610578906001600160a01b031681565b3480156105dc57600080fd5b506102496105eb366004613038565b611157565b3480156105fc57600080fd5b5061051961060b366004612caa565b6111da565b34801561061c57600080fd5b5061024961062b366004612cc5565b6112f1565b61024961063e3660046129d0565b611384565b34801561064f57600080fd5b50610658600181565b60405161ffff9091168152602001610277565b34801561067757600080fd5b506105787f000000000000000000000000000000000000000000000000000000000000000081565b3480156106ab57600080fd5b506102496106ba366004612948565b611393565b3480156106cb57600080fd5b506102496106da366004612fca565b6113ef565b3480156106eb57600080fd5b506102496106fa366004613038565b611484565b61024961070d366004612d17565b611508565b34801561071e57600080fd5b5061024961072d366004612f8e565b61171e565b34801561073e57600080fd5b5061024961074d366004612cc5565b6117d0565b34801561075e57600080fd5b506103bc61076d366004612daa565b61182a565b34801561077e57600080fd5b5061024961078d366004612948565b611904565b34801561079e57600080fd5b506105196107ad366004612f41565b61197d565b3480156107be57600080fd5b506104276107cd366004612caa565b60076020526000908152604090205481565b3480156107eb57600080fd5b506105787f000000000000000000000000000000000000000000000000000000000000000081565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146108905760405162461bcd60e51b815260206004820152601e60248201527f4c7a4170703a20696e76616c696420656e64706f696e742063616c6c6572000060448201526064015b60405180910390fd5b61ffff8616600090815260016020526040812080546108ae90613492565b80601f01602080910402602001604051908101604052809291908181526020018280546108da90613492565b80156109275780601f106108fc57610100808354040283529160200191610927565b820191906000526020600020905b81548152906001019060200180831161090a57829003601f168201915b50505050509050805186869050148015610942575060008151115b801561096a5750805160208201206040516109609088908890613116565b6040518091039020145b6109c55760405162461bcd60e51b815260206004820152602660248201527f4c7a4170703a20696e76616c696420736f757263652073656e64696e6720636f6044820152651b9d1c9858dd60d21b6064820152608401610887565b610a3b8787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8a018190048102820181019092528881528a935091508890889081908401838280828437600092019190915250611a5992505050565b50505050505050565b60006001600160e01b03198216630a85bd0160e11b1480610a695750610a6982611ad2565b92915050565b610a77611b07565b6040516307e0db1760e01b815261ffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906307e0db17906024015b600060405180830381600087803b158015610add57600080fd5b505af1158015610af1573d6000803e3d6000fd5b5050505050565b610b00611b07565b60008111610b665760405162461bcd60e51b815260206004820152602d60248201527f4f4e46543732313a206d696e476173546f5472616e73666572416e6453746f7260448201526c065206d757374206265203e203609c1b6064820152608401610887565b600555565b610b73611b07565b6040516310ddb13760e01b815261ffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906310ddb13790602401610ac3565b60006001600160a01b0385163014610bdd57506000610be7565b50630a85bd0160e11b5b949350505050565b600080610c078787610c0088611b61565b878761182a565b915091509550959350505050565b61ffff831660009081526001602052604081208054829190610c3690613492565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6290613492565b8015610caf5780601f10610c8457610100808354040283529160200191610caf565b820191906000526020600020905b815481529060010190602001808311610c9257829003601f168201915b505050505090508383604051610cc6929190613116565b60405180910390208180519060200120149150509392505050565b610ce9611b07565b6040516342d65a8d60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906342d65a8d90610d3990869086908690600401613220565b600060405180830381600087803b158015610d5357600080fd5b505af1158015610a3b573d6000803e3d6000fd5b610a3b878787610d7688611b61565b878787611bac565b333014610ddc5760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d7573742062656044820152650204c7a4170760d41b6064820152608401610887565b610e528686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f890181900481028201810190925287815289935091508790879081908401838280828437600092019190915250611d9392505050565b505050505050565b610e62611b07565b610e6c6000611eea565b565b60016020526000908152604090208054610e8790613492565b80601f0160208091040260200160405190810160405280929190818152602001828054610eb390613492565b8015610f005780601f10610ed557610100808354040283529160200191610f00565b820191906000526020600020905b815481529060010190602001808311610ee357829003601f168201915b505050505081565b80516020808301919091206000818152600890925260409091206002015460ff16610f755760405162461bcd60e51b815260206004820152601a60248201527f4f4e46543732313a206e6f20637265646974732073746f7265640000000000006044820152606401610887565b600082806020019051810190610f8b9190612be9565b60008481526008602052604081208054600190910154929450909250610fc79161ffff8216916201000090046001600160a01b03169085611f3a565b60008481526008602052604090206001015490915081116110455760405162461bcd60e51b815260206004820152603260248201527f4f4e46543732313a206e6f7420656e6f7567682067617320746f2070726f636560448201527139b99031b932b234ba103a3930b739b332b960711b6064820152608401610887565b81518114156110bd5760008381526008602052604080822080546001600160b01b031916815560018101929092556002909101805460ff19169055517fd7be02b8dd0d27bd0517a9cb4d7469ce27df4313821ae5ec1ff69acc594ba233906110b09085815260200190565b60405180910390a1611151565b60408051608081018252600085815260086020818152848320805461ffff80821687526001600160a01b03620100008084048216868a019081529989018b8152600160608b01818152998f90529790965297519851169096026001600160b01b03199091169690951695909517939093178455915191830191909155516002909101805491151560ff199092169190911790555b50505050565b61115f611b07565b600081116111c35760405162461bcd60e51b815260206004820152602b60248201527f4f4e46543732313a20647374436861696e4964546f42617463684c696d69742060448201526a06d757374206265203e20360ac1b6064820152608401610887565b61ffff909116600090815260066020526040902055565b61ffff81166000908152600160205260408120805460609291906111fd90613492565b80601f016020809104026020016040519081016040528092919081815260200182805461122990613492565b80156112765780601f1061124b57610100808354040283529160200191611276565b820191906000526020600020905b81548152906001019060200180831161125957829003601f168201915b505050505090508051600014156112cf5760405162461bcd60e51b815260206004820152601d60248201527f4c7a4170703a206e6f20747275737465642070617468207265636f72640000006044820152606401610887565b6112ea6000601483516112e2919061344f565b839190611f8c565b9392505050565b6112f9611b07565b81813060405160200161130e93929190613126565b60408051601f1981840301815291815261ffff85166000908152600160209081529190208251611343939192909101906126a2565b507f8c0400cfe2d1199b1a725c78960bcc2a344d869b80590d0f2bd005db15a572ce83838360405161137793929190613220565b60405180910390a1505050565b610a3b87878787878787611bac565b61139b611b07565b600380546001600160a01b0319166001600160a01b0383169081179091556040519081527f5db758e995a17ec1ad84bdef7e8c3293a0bd6179bcce400dff5d4c3d87db726b9060200160405180910390a150565b6113f7611b07565b6040516332fb62e760e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063cbed8b9c9061144b9088908890889088908890600401613370565b600060405180830381600087803b15801561146557600080fd5b505af1158015611479573d6000803e3d6000fd5b505050505050505050565b61148c611b07565b600081116114f15760405162461bcd60e51b815260206004820152602c60248201527f4f4e46543732313a20647374436861696e4964546f5472616e7366657247617360448201526b0206d757374206265203e20360a41b6064820152608401610887565b61ffff909116600090815260076020526040902055565b61ffff8616600090815260046020526040808220905161152b9088908890613116565b90815260408051602092819003830190206001600160401b038716600090815292529020549050806115ab5760405162461bcd60e51b815260206004820152602360248201527f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d65737360448201526261676560e81b6064820152608401610887565b8083836040516115bc929190613116565b60405180910390201461161b5760405162461bcd60e51b815260206004820152602160248201527f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f616044820152601960fa1b6064820152608401610887565b61ffff8716600090815260046020526040808220905161163e9089908990613116565b90815260408051602092819003830181206001600160401b038916600090815290845282902093909355601f880182900482028301820190528682526116d6918991899089908190840183828082843760009201919091525050604080516020601f8a018190048102820181019092528881528a935091508890889081908401838280828437600092019190915250611d9392505050565b7fc264d91f3adc5588250e1551f547752ca0cfa8f6b530d243b9f9f4cab10ea8e5878787878560405161170d95949392919061323e565b60405180910390a150505050505050565b611726611b07565b6000811161176e5760405162461bcd60e51b81526020600482015260156024820152744c7a4170703a20696e76616c6964206d696e47617360581b6044820152606401610887565b61ffff83811660008181526002602090815260408083209487168084529482529182902085905581519283528201929092529081018290527f9d5c7c0b934da8fefa9c7760c98383778a12dfbfc0c3b3106518f43fb9508ac090606001611377565b6117d8611b07565b61ffff831660009081526001602052604090206117f6908383612726565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab83838360405161137793929190613220565b600080600086866040516020016118429291906131a7565b60408051601f198184030181529082905263040a7bb160e41b825291506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906340a7bb10906118a6908b90309086908b908b906004016131cc565b604080518083038186803b1580156118bd57600080fd5b505afa1580156118d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f59190613062565b92509250509550959350505050565b61190c611b07565b6001600160a01b0381166119715760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610887565b61197a81611eea565b50565b604051633d7b2f6f60e21b815261ffff808616600483015284166024820152306044820152606481018290526060907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f5ecbdbc9060840160006040518083038186803b1580156119f857600080fd5b505afa158015611a0c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611a349190810190612bb5565b95945050505050565b6000611a4883612099565b80156112ea57506112ea83836120cc565b600080611abc5a60966366ad5c8a60e01b89898989604051602401611a8194939291906132e0565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915230929190612155565b9150915081610e5257610e5286868686856121df565b60006001600160e01b031982166322bac5d960e01b1480610a6957506301ffc9a760e01b6001600160e01b0319831614610a69565b6000546001600160a01b03163314610e6c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610887565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611b9b57611b9b6134fe565b602090810291909101015292915050565b6000845111611bfd5760405162461bcd60e51b815260206004820152601a60248201527f4c7a4170703a20746f6b656e4964735b5d20697320656d7074790000000000006044820152606401610887565b835160011480611c21575061ffff8616600090815260066020526040902054845111155b611c815760405162461bcd60e51b815260206004820152602b60248201527f4f4e46543732313a2062617463682073697a652065786365656473206473742060448201526a18985d18da081b1a5b5a5d60aa1b6064820152608401610887565b60005b8451811015611cc457611cb2888888888581518110611ca557611ca56134fe565b602002602001015161227c565b80611cbc816134cd565b915050611c84565b5060008585604051602001611cda9291906131a7565b6040516020818303038152906040529050611d1f876001848851600760008d61ffff1661ffff16815260200190815260200160002054611d1a9190613430565b612371565b611d2d878286868634612450565b85604051611d3b919061314c565b6040518091039020886001600160a01b03168861ffff167fe1b87c47fdeb4f9cbadbca9df3af7aba453bb6e501075d0440d88125b711522a88604051611d819190613168565b60405180910390a45050505050505050565b60008082806020019051810190611daa9190612be9565b601482015191935091506000611dc288838386611f3a565b90508251811015611e965784516020808701919091206040805160808101825261ffff808d1682526001600160a01b0380881683870190815283850188815260016060860181815260008981526008909a529887902095518654935190941662010000026001600160b01b03199093169390941692909217178355519082015592516002909301805493151560ff199094169390931790925590517f10e0b70d256bccc84b7027506978bd8b68984a870788b93b479def144c839ad790611e8c908390899061317b565b60405180910390a1505b816001600160a01b031687604051611eae919061314c565b60405180910390208961ffff167f5b821db8a46f8ecbe1941ba2f51cfeea9643268b56631f70d45e2a745d99026586604051611d819190613168565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000825b8251811015611a34576005545a1015611f5657611a34565b611f7a8686858481518110611f6d57611f6d6134fe565b60200260200101516125eb565b80611f84816134cd565b915050611f3e565b606081611f9a81601f613418565b1015611fd95760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b6044820152606401610887565b611fe38284613418565b845110156120275760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b6044820152606401610887565b6060821580156120465760405191506000825260208201604052612090565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561207f578051835260209283019201612067565b5050858452601f01601f1916604052505b50949350505050565b60006120ac826301ffc9a760e01b6120cc565b8015610a6957506120c5826001600160e01b03196120cc565b1592915050565b604080516001600160e01b03198316602480830191909152825180830390910181526044909101909152602080820180516001600160e01b03166301ffc9a760e01b178152825160009392849283928392918391908a617530fa92503d9150600051905082801561213e575060208210155b801561214a5750600081115b979650505050505050565b6000606060008060008661ffff166001600160401b0381111561217a5761217a613514565b6040519080825280601f01601f1916602001820160405280156121a4576020820181803683370190505b50905060008087516020890160008d8df191503d9250868311156121c6578692505b828152826000602083013e909890975095505050505050565b8180519060200120600460008761ffff1661ffff16815260200190815260200160002085604051612210919061314c565b9081526040805191829003602090810183206001600160401b0388166000908152915220919091557fe183f33de2837795525b4792ca4cd60535bd77c53b7e7030060bfcf5734d6b0c9061226d908790879087908790879061331e565b60405180910390a15050505050565b6001600160a01b03841633146122e35760405162461bcd60e51b815260206004820152602660248201527f50726f78794f4e46543732313a206f776e6572206973206e6f742073656e642060448201526531b0b63632b960d11b6064820152608401610887565b604051632142170760e11b81526001600160a01b038581166004830152306024830152604482018390527f000000000000000000000000000000000000000000000000000000000000000016906342842e0e90606401600060405180830381600087803b15801561235357600080fd5b505af1158015612367573d6000803e3d6000fd5b5050505050505050565b600061237c83612646565b61ffff8087166000908152600260209081526040808320938916835292905290812054919250906123ae908490613418565b9050600081116124005760405162461bcd60e51b815260206004820152601a60248201527f4c7a4170703a206d696e4761734c696d6974206e6f74207365740000000000006044820152606401610887565b80821015610e525760405162461bcd60e51b815260206004820152601b60248201527f4c7a4170703a20676173206c696d697420697320746f6f206c6f7700000000006044820152606401610887565b61ffff86166000908152600160205260408120805461246e90613492565b80601f016020809104026020016040519081016040528092919081815260200182805461249a90613492565b80156124e75780601f106124bc576101008083540402835291602001916124e7565b820191906000526020600020905b8154815290600101906020018083116124ca57829003601f168201915b505050505090508051600014156125595760405162461bcd60e51b815260206004820152603060248201527f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060448201526f61207472757374656420736f7572636560801b6064820152608401610887565b60405162c5803160e81b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063c58031009084906125b0908b9086908c908c908c908c90600401613279565b6000604051808303818588803b1580156125c957600080fd5b505af11580156125dd573d6000803e3d6000fd5b505050505050505050505050565b604051632142170760e11b81523060048201526001600160a01b038381166024830152604482018390527f000000000000000000000000000000000000000000000000000000000000000016906342842e0e90606401610d39565b600060228251101561269a5760405162461bcd60e51b815260206004820152601c60248201527f4c7a4170703a20696e76616c69642061646170746572506172616d73000000006044820152606401610887565b506022015190565b8280546126ae90613492565b90600052602060002090601f0160209004810192826126d05760008555612716565b82601f106126e957805160ff1916838001178555612716565b82800160010185558215612716579182015b828111156127165782518255916020019190600101906126fb565b5061272292915061279a565b5090565b82805461273290613492565b90600052602060002090601f0160209004810192826127545760008555612716565b82601f1061276d5782800160ff19823516178555612716565b82800160010185558215612716579182015b8281111561271657823582559160200191906001019061277f565b5b80821115612722576000815560010161279b565b80356127ba8161352a565b919050565b600082601f8301126127d057600080fd5b813560206127e56127e0836133ce565b61339e565b80838252828201915082860187848660051b890101111561280557600080fd5b60005b8581101561282457813584529284019290840190600101612808565b5090979650505050505050565b803580151581146127ba57600080fd5b60008083601f84011261285357600080fd5b5081356001600160401b0381111561286a57600080fd5b60208301915083602082850101111561288257600080fd5b9250929050565b600082601f83011261289a57600080fd5b81356128a86127e0826133f1565b8181528460208386010111156128bd57600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f8301126128eb57600080fd5b81516128f96127e0826133f1565b81815284602083860101111561290e57600080fd5b610be7826020830160208701613466565b803561ffff811681146127ba57600080fd5b80356001600160401b03811681146127ba57600080fd5b60006020828403121561295a57600080fd5b81356112ea8161352a565b6000806000806080858703121561297b57600080fd5b84356129868161352a565b935060208501356129968161352a565b92506040850135915060608501356001600160401b038111156129b857600080fd5b6129c487828801612889565b91505092959194509250565b600080600080600080600060e0888a0312156129eb57600080fd5b87356129f68161352a565b9650612a046020890161291f565b955060408801356001600160401b0380821115612a2057600080fd5b612a2c8b838c01612889565b965060608a0135915080821115612a4257600080fd5b612a4e8b838c016127bf565b955060808a01359150612a608261352a565b819450612a6f60a08b016127af565b935060c08a0135915080821115612a8557600080fd5b50612a928a828b01612889565b91505092959891949750929550565b600080600080600080600060e0888a031215612abc57600080fd5b8735612ac78161352a565b9650612ad56020890161291f565b955060408801356001600160401b0380821115612af157600080fd5b612afd8b838c01612889565b965060608a0135955060808a01359150612b168261352a565b90935060a089013590612b288261352a565b90925060c08901359080821115612a8557600080fd5b600060208284031215612b5057600080fd5b5035919050565b600060208284031215612b6957600080fd5b81356001600160e01b0319811681146112ea57600080fd5b600060208284031215612b9357600080fd5b81356001600160401b03811115612ba957600080fd5b610be784828501612889565b600060208284031215612bc757600080fd5b81516001600160401b03811115612bdd57600080fd5b610be7848285016128da565b60008060408385031215612bfc57600080fd5b82516001600160401b0380821115612c1357600080fd5b612c1f868387016128da565b9350602091508185015181811115612c3657600080fd5b85019050601f81018613612c4957600080fd5b8051612c576127e0826133ce565b80828252848201915084840189868560051b8701011115612c7757600080fd5b600094505b83851015612c9a578051835260019490940193918501918501612c7c565b5080955050505050509250929050565b600060208284031215612cbc57600080fd5b6112ea8261291f565b600080600060408486031215612cda57600080fd5b612ce38461291f565b925060208401356001600160401b03811115612cfe57600080fd5b612d0a86828701612841565b9497909650939450505050565b60008060008060008060808789031215612d3057600080fd5b612d398761291f565b955060208701356001600160401b0380821115612d5557600080fd5b612d618a838b01612841565b9097509550859150612d7560408a01612931565b94506060890135915080821115612d8b57600080fd5b50612d9889828a01612841565b979a9699509497509295939492505050565b600080600080600060a08688031215612dc257600080fd5b612dcb8661291f565b945060208601356001600160401b0380821115612de757600080fd5b612df389838a01612889565b95506040880135915080821115612e0957600080fd5b612e1589838a016127bf565b9450612e2360608901612831565b93506080880135915080821115612e3957600080fd5b50612e4688828901612889565b9150509295509295909350565b600080600080600060a08688031215612e6b57600080fd5b612e748661291f565b945060208601356001600160401b0380821115612e9057600080fd5b612e9c89838a01612889565b955060408801359450612e2360608901612831565b600080600060608486031215612ec657600080fd5b612ecf8461291f565b925060208401356001600160401b03811115612eea57600080fd5b612ef686828701612889565b925050612f0560408501612931565b90509250925092565b60008060408385031215612f2157600080fd5b612f2a8361291f565b9150612f386020840161291f565b90509250929050565b60008060008060808587031215612f5757600080fd5b612f608561291f565b9350612f6e6020860161291f565b92506040850135612f7e8161352a565b9396929550929360600135925050565b600080600060608486031215612fa357600080fd5b612fac8461291f565b9250612fba6020850161291f565b9150604084013590509250925092565b600080600080600060808688031215612fe257600080fd5b612feb8661291f565b9450612ff96020870161291f565b93506040860135925060608601356001600160401b0381111561301b57600080fd5b61302788828901612841565b969995985093965092949392505050565b6000806040838503121561304b57600080fd5b6130548361291f565b946020939093013593505050565b6000806040838503121561307557600080fd5b505080516020909101519092909150565b600081518084526020808501945080840160005b838110156130b65781518752958201959082019060010161309a565b509495945050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60008151808452613102816020860160208601613466565b601f01601f19169290920160200192915050565b8183823760009101908152919050565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b6000825161315e818460208701613466565b9190910192915050565b6020815260006112ea6020830184613086565b828152604060208201526000610be760408301846130ea565b6020815260006112ea60208301846130ea565b6040815260006131ba60408301856130ea565b8281036020840152611a348185613086565b61ffff861681526001600160a01b038516602082015260a0604082018190526000906131fa908301866130ea565b8415156060840152828103608084015261321481856130ea565b98975050505050505050565b61ffff84168152604060208201526000611a346040830184866130c1565b61ffff8616815260806020820152600061325c6080830186886130c1565b6001600160401b0394909416604083015250606001529392505050565b61ffff8716815260c06020820152600061329660c08301886130ea565b82810360408401526132a881886130ea565b6001600160a01b0387811660608601528616608085015283810360a085015290506132d381856130ea565b9998505050505050505050565b61ffff851681526080602082015260006132fd60808301866130ea565b6001600160401b0385166040840152828103606084015261214a81856130ea565b61ffff8616815260a06020820152600061333b60a08301876130ea565b6001600160401b0386166040840152828103606084015261335c81866130ea565b9050828103608084015261321481856130ea565b600061ffff80881683528087166020840152508460408301526080606083015261214a6080830184866130c1565b604051601f8201601f191681016001600160401b03811182821017156133c6576133c6613514565b604052919050565b60006001600160401b038211156133e7576133e7613514565b5060051b60200190565b60006001600160401b0382111561340a5761340a613514565b50601f01601f191660200190565b6000821982111561342b5761342b6134e8565b500190565b600081600019048311821515161561344a5761344a6134e8565b500290565b600082821015613461576134616134e8565b500390565b60005b83811015613481578181015183820152602001613469565b838111156111515750506000910152565b600181811c908216806134a657607f821691505b602082108114156134c757634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156134e1576134e16134e8565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461197a57600080fdfea2646970667358221220d6fa3129040b01b5d1cc9303ea9352737ea4a14e6d53ab030754b1070be8cf7364736f6c6343000807003300000000000000000000000000000000000000000000000000000000000249f000000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675000000000000000000000000ee0e0b6c76d528b07113bb5709b30822de46732b

Deployed Bytecode

0x6080604052600436106102245760003560e01c80638ffa1f2a11610123578063cbed8b9c116100ab578063f23536411161006f578063f235364114610752578063f2fde38b14610772578063f5ecbdbc14610792578063fa25f9b6146107b2578063fc0c546a146107df57600080fd5b8063cbed8b9c146106bf578063d12473a5146106df578063d1deba1f146106ff578063df2a5b3b14610712578063eb8d72b71461073257600080fd5b8063a6c3d165116100f2578063a6c3d16514610610578063ab3ffb9314610630578063af3fb21c14610643578063b353aaa71461066b578063baf3292d1461069f57600080fd5b80638ffa1f2a14610590578063950c8a74146105b05780639ea5d6b1146105d05780639f38369a146105f057600080fd5b806342d65a8d116101b157806366ad5c8a1161017557806366ad5c8a146104c4578063715018a6146104e45780637533d788146104f95780638cfd8f5c146105265780638da5cb5b1461055e57600080fd5b806342d65a8d146103f157806348288190146104115780634ac3f4ff1461043557806351905636146104625780635b8c41e61461047557600080fd5b806310ddb137116101f857806310ddb137146102c0578063150b7a02146102e057806322a3ecf9146103195780632a205e3d1461039c5780633d8b38f6146103d157600080fd5b80621d35671461022957806301ffc9a71461024b57806307e0db17146102805780630b4cad4c146102a0575b600080fd5b34801561023557600080fd5b50610249610244366004612d17565b610813565b005b34801561025757600080fd5b5061026b610266366004612b57565b610a44565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b5061024961029b366004612caa565b610a6f565b3480156102ac57600080fd5b506102496102bb366004612b3e565b610af8565b3480156102cc57600080fd5b506102496102db366004612caa565b610b6b565b3480156102ec57600080fd5b506103006102fb366004612965565b610bc3565b6040516001600160e01b03199091168152602001610277565b34801561032557600080fd5b5061036d610334366004612b3e565b60086020526000908152604090208054600182015460029092015461ffff821692620100009092046001600160a01b0316919060ff1684565b6040805161ffff90951685526001600160a01b0390931660208501529183015215156060820152608001610277565b3480156103a857600080fd5b506103bc6103b7366004612e53565b610bef565b60408051928352602083019190915201610277565b3480156103dd57600080fd5b5061026b6103ec366004612cc5565b610c15565b3480156103fd57600080fd5b5061024961040c366004612cc5565b610ce1565b34801561041d57600080fd5b5061042760055481565b604051908152602001610277565b34801561044157600080fd5b50610427610450366004612caa565b60066020526000908152604090205481565b610249610470366004612aa1565b610d67565b34801561048157600080fd5b50610427610490366004612eb1565b6004602090815260009384526040808520845180860184018051928152908401958401959095209452929052825290205481565b3480156104d057600080fd5b506102496104df366004612d17565b610d7e565b3480156104f057600080fd5b50610249610e5a565b34801561050557600080fd5b50610519610514366004612caa565b610e6e565b6040516102779190613194565b34801561053257600080fd5b50610427610541366004612f0e565b600260209081526000928352604080842090915290825290205481565b34801561056a57600080fd5b506000546001600160a01b03165b6040516001600160a01b039091168152602001610277565b34801561059c57600080fd5b506102496105ab366004612b81565b610f08565b3480156105bc57600080fd5b50600354610578906001600160a01b031681565b3480156105dc57600080fd5b506102496105eb366004613038565b611157565b3480156105fc57600080fd5b5061051961060b366004612caa565b6111da565b34801561061c57600080fd5b5061024961062b366004612cc5565b6112f1565b61024961063e3660046129d0565b611384565b34801561064f57600080fd5b50610658600181565b60405161ffff9091168152602001610277565b34801561067757600080fd5b506105787f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67581565b3480156106ab57600080fd5b506102496106ba366004612948565b611393565b3480156106cb57600080fd5b506102496106da366004612fca565b6113ef565b3480156106eb57600080fd5b506102496106fa366004613038565b611484565b61024961070d366004612d17565b611508565b34801561071e57600080fd5b5061024961072d366004612f8e565b61171e565b34801561073e57600080fd5b5061024961074d366004612cc5565b6117d0565b34801561075e57600080fd5b506103bc61076d366004612daa565b61182a565b34801561077e57600080fd5b5061024961078d366004612948565b611904565b34801561079e57600080fd5b506105196107ad366004612f41565b61197d565b3480156107be57600080fd5b506104276107cd366004612caa565b60076020526000908152604090205481565b3480156107eb57600080fd5b506105787f000000000000000000000000ee0e0b6c76d528b07113bb5709b30822de46732b81565b337f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd6756001600160a01b0316146108905760405162461bcd60e51b815260206004820152601e60248201527f4c7a4170703a20696e76616c696420656e64706f696e742063616c6c6572000060448201526064015b60405180910390fd5b61ffff8616600090815260016020526040812080546108ae90613492565b80601f01602080910402602001604051908101604052809291908181526020018280546108da90613492565b80156109275780601f106108fc57610100808354040283529160200191610927565b820191906000526020600020905b81548152906001019060200180831161090a57829003601f168201915b50505050509050805186869050148015610942575060008151115b801561096a5750805160208201206040516109609088908890613116565b6040518091039020145b6109c55760405162461bcd60e51b815260206004820152602660248201527f4c7a4170703a20696e76616c696420736f757263652073656e64696e6720636f6044820152651b9d1c9858dd60d21b6064820152608401610887565b610a3b8787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8a018190048102820181019092528881528a935091508890889081908401838280828437600092019190915250611a5992505050565b50505050505050565b60006001600160e01b03198216630a85bd0160e11b1480610a695750610a6982611ad2565b92915050565b610a77611b07565b6040516307e0db1760e01b815261ffff821660048201527f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd6756001600160a01b0316906307e0db17906024015b600060405180830381600087803b158015610add57600080fd5b505af1158015610af1573d6000803e3d6000fd5b5050505050565b610b00611b07565b60008111610b665760405162461bcd60e51b815260206004820152602d60248201527f4f4e46543732313a206d696e476173546f5472616e73666572416e6453746f7260448201526c065206d757374206265203e203609c1b6064820152608401610887565b600555565b610b73611b07565b6040516310ddb13760e01b815261ffff821660048201527f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd6756001600160a01b0316906310ddb13790602401610ac3565b60006001600160a01b0385163014610bdd57506000610be7565b50630a85bd0160e11b5b949350505050565b600080610c078787610c0088611b61565b878761182a565b915091509550959350505050565b61ffff831660009081526001602052604081208054829190610c3690613492565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6290613492565b8015610caf5780601f10610c8457610100808354040283529160200191610caf565b820191906000526020600020905b815481529060010190602001808311610c9257829003601f168201915b505050505090508383604051610cc6929190613116565b60405180910390208180519060200120149150509392505050565b610ce9611b07565b6040516342d65a8d60e01b81526001600160a01b037f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67516906342d65a8d90610d3990869086908690600401613220565b600060405180830381600087803b158015610d5357600080fd5b505af1158015610a3b573d6000803e3d6000fd5b610a3b878787610d7688611b61565b878787611bac565b333014610ddc5760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d7573742062656044820152650204c7a4170760d41b6064820152608401610887565b610e528686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f890181900481028201810190925287815289935091508790879081908401838280828437600092019190915250611d9392505050565b505050505050565b610e62611b07565b610e6c6000611eea565b565b60016020526000908152604090208054610e8790613492565b80601f0160208091040260200160405190810160405280929190818152602001828054610eb390613492565b8015610f005780601f10610ed557610100808354040283529160200191610f00565b820191906000526020600020905b815481529060010190602001808311610ee357829003601f168201915b505050505081565b80516020808301919091206000818152600890925260409091206002015460ff16610f755760405162461bcd60e51b815260206004820152601a60248201527f4f4e46543732313a206e6f20637265646974732073746f7265640000000000006044820152606401610887565b600082806020019051810190610f8b9190612be9565b60008481526008602052604081208054600190910154929450909250610fc79161ffff8216916201000090046001600160a01b03169085611f3a565b60008481526008602052604090206001015490915081116110455760405162461bcd60e51b815260206004820152603260248201527f4f4e46543732313a206e6f7420656e6f7567682067617320746f2070726f636560448201527139b99031b932b234ba103a3930b739b332b960711b6064820152608401610887565b81518114156110bd5760008381526008602052604080822080546001600160b01b031916815560018101929092556002909101805460ff19169055517fd7be02b8dd0d27bd0517a9cb4d7469ce27df4313821ae5ec1ff69acc594ba233906110b09085815260200190565b60405180910390a1611151565b60408051608081018252600085815260086020818152848320805461ffff80821687526001600160a01b03620100008084048216868a019081529989018b8152600160608b01818152998f90529790965297519851169096026001600160b01b03199091169690951695909517939093178455915191830191909155516002909101805491151560ff199092169190911790555b50505050565b61115f611b07565b600081116111c35760405162461bcd60e51b815260206004820152602b60248201527f4f4e46543732313a20647374436861696e4964546f42617463684c696d69742060448201526a06d757374206265203e20360ac1b6064820152608401610887565b61ffff909116600090815260066020526040902055565b61ffff81166000908152600160205260408120805460609291906111fd90613492565b80601f016020809104026020016040519081016040528092919081815260200182805461122990613492565b80156112765780601f1061124b57610100808354040283529160200191611276565b820191906000526020600020905b81548152906001019060200180831161125957829003601f168201915b505050505090508051600014156112cf5760405162461bcd60e51b815260206004820152601d60248201527f4c7a4170703a206e6f20747275737465642070617468207265636f72640000006044820152606401610887565b6112ea6000601483516112e2919061344f565b839190611f8c565b9392505050565b6112f9611b07565b81813060405160200161130e93929190613126565b60408051601f1981840301815291815261ffff85166000908152600160209081529190208251611343939192909101906126a2565b507f8c0400cfe2d1199b1a725c78960bcc2a344d869b80590d0f2bd005db15a572ce83838360405161137793929190613220565b60405180910390a1505050565b610a3b87878787878787611bac565b61139b611b07565b600380546001600160a01b0319166001600160a01b0383169081179091556040519081527f5db758e995a17ec1ad84bdef7e8c3293a0bd6179bcce400dff5d4c3d87db726b9060200160405180910390a150565b6113f7611b07565b6040516332fb62e760e21b81526001600160a01b037f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675169063cbed8b9c9061144b9088908890889088908890600401613370565b600060405180830381600087803b15801561146557600080fd5b505af1158015611479573d6000803e3d6000fd5b505050505050505050565b61148c611b07565b600081116114f15760405162461bcd60e51b815260206004820152602c60248201527f4f4e46543732313a20647374436861696e4964546f5472616e7366657247617360448201526b0206d757374206265203e20360a41b6064820152608401610887565b61ffff909116600090815260076020526040902055565b61ffff8616600090815260046020526040808220905161152b9088908890613116565b90815260408051602092819003830190206001600160401b038716600090815292529020549050806115ab5760405162461bcd60e51b815260206004820152602360248201527f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d65737360448201526261676560e81b6064820152608401610887565b8083836040516115bc929190613116565b60405180910390201461161b5760405162461bcd60e51b815260206004820152602160248201527f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f616044820152601960fa1b6064820152608401610887565b61ffff8716600090815260046020526040808220905161163e9089908990613116565b90815260408051602092819003830181206001600160401b038916600090815290845282902093909355601f880182900482028301820190528682526116d6918991899089908190840183828082843760009201919091525050604080516020601f8a018190048102820181019092528881528a935091508890889081908401838280828437600092019190915250611d9392505050565b7fc264d91f3adc5588250e1551f547752ca0cfa8f6b530d243b9f9f4cab10ea8e5878787878560405161170d95949392919061323e565b60405180910390a150505050505050565b611726611b07565b6000811161176e5760405162461bcd60e51b81526020600482015260156024820152744c7a4170703a20696e76616c6964206d696e47617360581b6044820152606401610887565b61ffff83811660008181526002602090815260408083209487168084529482529182902085905581519283528201929092529081018290527f9d5c7c0b934da8fefa9c7760c98383778a12dfbfc0c3b3106518f43fb9508ac090606001611377565b6117d8611b07565b61ffff831660009081526001602052604090206117f6908383612726565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab83838360405161137793929190613220565b600080600086866040516020016118429291906131a7565b60408051601f198184030181529082905263040a7bb160e41b825291506001600160a01b037f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67516906340a7bb10906118a6908b90309086908b908b906004016131cc565b604080518083038186803b1580156118bd57600080fd5b505afa1580156118d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f59190613062565b92509250509550959350505050565b61190c611b07565b6001600160a01b0381166119715760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610887565b61197a81611eea565b50565b604051633d7b2f6f60e21b815261ffff808616600483015284166024820152306044820152606481018290526060907f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd6756001600160a01b03169063f5ecbdbc9060840160006040518083038186803b1580156119f857600080fd5b505afa158015611a0c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611a349190810190612bb5565b95945050505050565b6000611a4883612099565b80156112ea57506112ea83836120cc565b600080611abc5a60966366ad5c8a60e01b89898989604051602401611a8194939291906132e0565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915230929190612155565b9150915081610e5257610e5286868686856121df565b60006001600160e01b031982166322bac5d960e01b1480610a6957506301ffc9a760e01b6001600160e01b0319831614610a69565b6000546001600160a01b03163314610e6c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610887565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611b9b57611b9b6134fe565b602090810291909101015292915050565b6000845111611bfd5760405162461bcd60e51b815260206004820152601a60248201527f4c7a4170703a20746f6b656e4964735b5d20697320656d7074790000000000006044820152606401610887565b835160011480611c21575061ffff8616600090815260066020526040902054845111155b611c815760405162461bcd60e51b815260206004820152602b60248201527f4f4e46543732313a2062617463682073697a652065786365656473206473742060448201526a18985d18da081b1a5b5a5d60aa1b6064820152608401610887565b60005b8451811015611cc457611cb2888888888581518110611ca557611ca56134fe565b602002602001015161227c565b80611cbc816134cd565b915050611c84565b5060008585604051602001611cda9291906131a7565b6040516020818303038152906040529050611d1f876001848851600760008d61ffff1661ffff16815260200190815260200160002054611d1a9190613430565b612371565b611d2d878286868634612450565b85604051611d3b919061314c565b6040518091039020886001600160a01b03168861ffff167fe1b87c47fdeb4f9cbadbca9df3af7aba453bb6e501075d0440d88125b711522a88604051611d819190613168565b60405180910390a45050505050505050565b60008082806020019051810190611daa9190612be9565b601482015191935091506000611dc288838386611f3a565b90508251811015611e965784516020808701919091206040805160808101825261ffff808d1682526001600160a01b0380881683870190815283850188815260016060860181815260008981526008909a529887902095518654935190941662010000026001600160b01b03199093169390941692909217178355519082015592516002909301805493151560ff199094169390931790925590517f10e0b70d256bccc84b7027506978bd8b68984a870788b93b479def144c839ad790611e8c908390899061317b565b60405180910390a1505b816001600160a01b031687604051611eae919061314c565b60405180910390208961ffff167f5b821db8a46f8ecbe1941ba2f51cfeea9643268b56631f70d45e2a745d99026586604051611d819190613168565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000825b8251811015611a34576005545a1015611f5657611a34565b611f7a8686858481518110611f6d57611f6d6134fe565b60200260200101516125eb565b80611f84816134cd565b915050611f3e565b606081611f9a81601f613418565b1015611fd95760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b6044820152606401610887565b611fe38284613418565b845110156120275760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b6044820152606401610887565b6060821580156120465760405191506000825260208201604052612090565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561207f578051835260209283019201612067565b5050858452601f01601f1916604052505b50949350505050565b60006120ac826301ffc9a760e01b6120cc565b8015610a6957506120c5826001600160e01b03196120cc565b1592915050565b604080516001600160e01b03198316602480830191909152825180830390910181526044909101909152602080820180516001600160e01b03166301ffc9a760e01b178152825160009392849283928392918391908a617530fa92503d9150600051905082801561213e575060208210155b801561214a5750600081115b979650505050505050565b6000606060008060008661ffff166001600160401b0381111561217a5761217a613514565b6040519080825280601f01601f1916602001820160405280156121a4576020820181803683370190505b50905060008087516020890160008d8df191503d9250868311156121c6578692505b828152826000602083013e909890975095505050505050565b8180519060200120600460008761ffff1661ffff16815260200190815260200160002085604051612210919061314c565b9081526040805191829003602090810183206001600160401b0388166000908152915220919091557fe183f33de2837795525b4792ca4cd60535bd77c53b7e7030060bfcf5734d6b0c9061226d908790879087908790879061331e565b60405180910390a15050505050565b6001600160a01b03841633146122e35760405162461bcd60e51b815260206004820152602660248201527f50726f78794f4e46543732313a206f776e6572206973206e6f742073656e642060448201526531b0b63632b960d11b6064820152608401610887565b604051632142170760e11b81526001600160a01b038581166004830152306024830152604482018390527f000000000000000000000000ee0e0b6c76d528b07113bb5709b30822de46732b16906342842e0e90606401600060405180830381600087803b15801561235357600080fd5b505af1158015612367573d6000803e3d6000fd5b5050505050505050565b600061237c83612646565b61ffff8087166000908152600260209081526040808320938916835292905290812054919250906123ae908490613418565b9050600081116124005760405162461bcd60e51b815260206004820152601a60248201527f4c7a4170703a206d696e4761734c696d6974206e6f74207365740000000000006044820152606401610887565b80821015610e525760405162461bcd60e51b815260206004820152601b60248201527f4c7a4170703a20676173206c696d697420697320746f6f206c6f7700000000006044820152606401610887565b61ffff86166000908152600160205260408120805461246e90613492565b80601f016020809104026020016040519081016040528092919081815260200182805461249a90613492565b80156124e75780601f106124bc576101008083540402835291602001916124e7565b820191906000526020600020905b8154815290600101906020018083116124ca57829003601f168201915b505050505090508051600014156125595760405162461bcd60e51b815260206004820152603060248201527f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060448201526f61207472757374656420736f7572636560801b6064820152608401610887565b60405162c5803160e81b81526001600160a01b037f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675169063c58031009084906125b0908b9086908c908c908c908c90600401613279565b6000604051808303818588803b1580156125c957600080fd5b505af11580156125dd573d6000803e3d6000fd5b505050505050505050505050565b604051632142170760e11b81523060048201526001600160a01b038381166024830152604482018390527f000000000000000000000000ee0e0b6c76d528b07113bb5709b30822de46732b16906342842e0e90606401610d39565b600060228251101561269a5760405162461bcd60e51b815260206004820152601c60248201527f4c7a4170703a20696e76616c69642061646170746572506172616d73000000006044820152606401610887565b506022015190565b8280546126ae90613492565b90600052602060002090601f0160209004810192826126d05760008555612716565b82601f106126e957805160ff1916838001178555612716565b82800160010185558215612716579182015b828111156127165782518255916020019190600101906126fb565b5061272292915061279a565b5090565b82805461273290613492565b90600052602060002090601f0160209004810192826127545760008555612716565b82601f1061276d5782800160ff19823516178555612716565b82800160010185558215612716579182015b8281111561271657823582559160200191906001019061277f565b5b80821115612722576000815560010161279b565b80356127ba8161352a565b919050565b600082601f8301126127d057600080fd5b813560206127e56127e0836133ce565b61339e565b80838252828201915082860187848660051b890101111561280557600080fd5b60005b8581101561282457813584529284019290840190600101612808565b5090979650505050505050565b803580151581146127ba57600080fd5b60008083601f84011261285357600080fd5b5081356001600160401b0381111561286a57600080fd5b60208301915083602082850101111561288257600080fd5b9250929050565b600082601f83011261289a57600080fd5b81356128a86127e0826133f1565b8181528460208386010111156128bd57600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f8301126128eb57600080fd5b81516128f96127e0826133f1565b81815284602083860101111561290e57600080fd5b610be7826020830160208701613466565b803561ffff811681146127ba57600080fd5b80356001600160401b03811681146127ba57600080fd5b60006020828403121561295a57600080fd5b81356112ea8161352a565b6000806000806080858703121561297b57600080fd5b84356129868161352a565b935060208501356129968161352a565b92506040850135915060608501356001600160401b038111156129b857600080fd5b6129c487828801612889565b91505092959194509250565b600080600080600080600060e0888a0312156129eb57600080fd5b87356129f68161352a565b9650612a046020890161291f565b955060408801356001600160401b0380821115612a2057600080fd5b612a2c8b838c01612889565b965060608a0135915080821115612a4257600080fd5b612a4e8b838c016127bf565b955060808a01359150612a608261352a565b819450612a6f60a08b016127af565b935060c08a0135915080821115612a8557600080fd5b50612a928a828b01612889565b91505092959891949750929550565b600080600080600080600060e0888a031215612abc57600080fd5b8735612ac78161352a565b9650612ad56020890161291f565b955060408801356001600160401b0380821115612af157600080fd5b612afd8b838c01612889565b965060608a0135955060808a01359150612b168261352a565b90935060a089013590612b288261352a565b90925060c08901359080821115612a8557600080fd5b600060208284031215612b5057600080fd5b5035919050565b600060208284031215612b6957600080fd5b81356001600160e01b0319811681146112ea57600080fd5b600060208284031215612b9357600080fd5b81356001600160401b03811115612ba957600080fd5b610be784828501612889565b600060208284031215612bc757600080fd5b81516001600160401b03811115612bdd57600080fd5b610be7848285016128da565b60008060408385031215612bfc57600080fd5b82516001600160401b0380821115612c1357600080fd5b612c1f868387016128da565b9350602091508185015181811115612c3657600080fd5b85019050601f81018613612c4957600080fd5b8051612c576127e0826133ce565b80828252848201915084840189868560051b8701011115612c7757600080fd5b600094505b83851015612c9a578051835260019490940193918501918501612c7c565b5080955050505050509250929050565b600060208284031215612cbc57600080fd5b6112ea8261291f565b600080600060408486031215612cda57600080fd5b612ce38461291f565b925060208401356001600160401b03811115612cfe57600080fd5b612d0a86828701612841565b9497909650939450505050565b60008060008060008060808789031215612d3057600080fd5b612d398761291f565b955060208701356001600160401b0380821115612d5557600080fd5b612d618a838b01612841565b9097509550859150612d7560408a01612931565b94506060890135915080821115612d8b57600080fd5b50612d9889828a01612841565b979a9699509497509295939492505050565b600080600080600060a08688031215612dc257600080fd5b612dcb8661291f565b945060208601356001600160401b0380821115612de757600080fd5b612df389838a01612889565b95506040880135915080821115612e0957600080fd5b612e1589838a016127bf565b9450612e2360608901612831565b93506080880135915080821115612e3957600080fd5b50612e4688828901612889565b9150509295509295909350565b600080600080600060a08688031215612e6b57600080fd5b612e748661291f565b945060208601356001600160401b0380821115612e9057600080fd5b612e9c89838a01612889565b955060408801359450612e2360608901612831565b600080600060608486031215612ec657600080fd5b612ecf8461291f565b925060208401356001600160401b03811115612eea57600080fd5b612ef686828701612889565b925050612f0560408501612931565b90509250925092565b60008060408385031215612f2157600080fd5b612f2a8361291f565b9150612f386020840161291f565b90509250929050565b60008060008060808587031215612f5757600080fd5b612f608561291f565b9350612f6e6020860161291f565b92506040850135612f7e8161352a565b9396929550929360600135925050565b600080600060608486031215612fa357600080fd5b612fac8461291f565b9250612fba6020850161291f565b9150604084013590509250925092565b600080600080600060808688031215612fe257600080fd5b612feb8661291f565b9450612ff96020870161291f565b93506040860135925060608601356001600160401b0381111561301b57600080fd5b61302788828901612841565b969995985093965092949392505050565b6000806040838503121561304b57600080fd5b6130548361291f565b946020939093013593505050565b6000806040838503121561307557600080fd5b505080516020909101519092909150565b600081518084526020808501945080840160005b838110156130b65781518752958201959082019060010161309a565b509495945050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60008151808452613102816020860160208601613466565b601f01601f19169290920160200192915050565b8183823760009101908152919050565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b6000825161315e818460208701613466565b9190910192915050565b6020815260006112ea6020830184613086565b828152604060208201526000610be760408301846130ea565b6020815260006112ea60208301846130ea565b6040815260006131ba60408301856130ea565b8281036020840152611a348185613086565b61ffff861681526001600160a01b038516602082015260a0604082018190526000906131fa908301866130ea565b8415156060840152828103608084015261321481856130ea565b98975050505050505050565b61ffff84168152604060208201526000611a346040830184866130c1565b61ffff8616815260806020820152600061325c6080830186886130c1565b6001600160401b0394909416604083015250606001529392505050565b61ffff8716815260c06020820152600061329660c08301886130ea565b82810360408401526132a881886130ea565b6001600160a01b0387811660608601528616608085015283810360a085015290506132d381856130ea565b9998505050505050505050565b61ffff851681526080602082015260006132fd60808301866130ea565b6001600160401b0385166040840152828103606084015261214a81856130ea565b61ffff8616815260a06020820152600061333b60a08301876130ea565b6001600160401b0386166040840152828103606084015261335c81866130ea565b9050828103608084015261321481856130ea565b600061ffff80881683528087166020840152508460408301526080606083015261214a6080830184866130c1565b604051601f8201601f191681016001600160401b03811182821017156133c6576133c6613514565b604052919050565b60006001600160401b038211156133e7576133e7613514565b5060051b60200190565b60006001600160401b0382111561340a5761340a613514565b50601f01601f191660200190565b6000821982111561342b5761342b6134e8565b500190565b600081600019048311821515161561344a5761344a6134e8565b500290565b600082821015613461576134616134e8565b500390565b60005b83811015613481578181015183820152602001613469565b838111156111515750506000910152565b600181811c908216806134a657607f821691505b602082108114156134c757634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156134e1576134e16134e8565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461197a57600080fdfea2646970667358221220d6fa3129040b01b5d1cc9303ea9352737ea4a14e6d53ab030754b1070be8cf7364736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000249f000000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675000000000000000000000000ee0e0b6c76d528b07113bb5709b30822de46732b

-----Decoded View---------------
Arg [0] : _minGasToTransfer (uint256): 150000
Arg [1] : _lzEndpoint (address): 0x66A71Dcef29A0fFBDBE3c6a460a3B5BC225Cd675
Arg [2] : _proxyToken (address): 0xEE0e0b6c76d528B07113bB5709b30822DE46732B

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000249f0
Arg [1] : 00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675
Arg [2] : 000000000000000000000000ee0e0b6c76d528b07113bb5709b30822de46732b


Deployed Bytecode Sourcemap

37378:196:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15514:559;;;;;;;;;;-1:-1:-1;15514:559:0;;;;;:::i;:::-;;:::i;:::-;;36481:205;;;;;;;;;;-1:-1:-1;36481:205:0;;;;;:::i;:::-;;:::i;:::-;;;17073:14:1;;17066:22;17048:41;;17036:2;17021:18;36481:205:0;;;;;;;;17859:123;;;;;;;;;;-1:-1:-1;17859:123:0;;;;;:::i;:::-;;:::i;34784:260::-;;;;;;;;;;-1:-1:-1;34784:260:0;;;;;:::i;:::-;;:::i;17990:129::-;;;;;;;;;;-1:-1:-1;17990:129:0;;;;;:::i;:::-;;:::i;37130:241::-;;;;;;;;;;-1:-1:-1;37130:241:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;;17737:33:1;;;17719:52;;17707:2;17692:18;37130:241:0;17575:202:1;29669:53:0;;;;;;;;;;-1:-1:-1;29669:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29669:53:0;;;;;;;;;;;28795:6:1;28783:19;;;28765:38;;-1:-1:-1;;;;;28839:32:1;;;28834:2;28819:18;;28812:60;28888:18;;;28881:34;28958:14;28951:22;28946:2;28931:18;;28924:50;28752:3;28737:19;29669:53:0;28542:438:1;30233:320:0;;;;;;;;;;-1:-1:-1;30233:320:0;;;;;:::i;:::-;;:::i;:::-;;;;33620:25:1;;;33676:2;33661:18;;33654:34;;;;33593:18;30233:320:0;33446:248:1;19537:250:0;;;;;;;;;;-1:-1:-1;19537:250:0;;;;;:::i;:::-;;:::i;18127:178::-;;;;;;;;;;-1:-1:-1;18127:178:0;;;;;:::i;:::-;;:::i;29496:39::-;;;;;;;;;;;;;;;;;;;17246:25:1;;;17234:2;17219:18;29496:39:0;17100:177:1;29542:56:0;;;;;;;;;;-1:-1:-1;29542:56:0;;;;;:::i;:::-;;;;;;;;;;;;;;30957:351;;;;;;:::i;:::-;;:::i;23350:85::-;;;;;;;;;;-1:-1:-1;23350:85:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24466:308;;;;;;;;;;-1:-1:-1;24466:308:0;;;;;:::i;:::-;;:::i;856:89::-;;;;;;;;;;;;;:::i;14986:51::-;;;;;;;;;;-1:-1:-1;14986:51:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;15044:65::-;;;;;;;;;;-1:-1:-1;15044:65:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;653:73;;;;;;;;;;-1:-1:-1;699:7:0;717:6;-1:-1:-1;;;;;717:6:0;653:73;;;-1:-1:-1;;;;;16218:32:1;;;16200:51;;16188:2;16173:18;653:73:0;16054:203:1;33479:905:0;;;;;;;;;;-1:-1:-1;33479:905:0;;;;;:::i;:::-;;:::i;15116:23::-;;;;;;;;;;-1:-1:-1;15116:23:0;;;;-1:-1:-1;;;;;15116:23:0;;;35347:281;;;;;;;;;;-1:-1:-1;35347:281:0;;;;;:::i;:::-;;:::i;18808:285::-;;;;;;;;;;-1:-1:-1;18808:285:0;;;;;:::i;:::-;;:::i;18519:281::-;;;;;;;;;;-1:-1:-1;18519:281:0;;;;;:::i;:::-;;:::i;31316:348::-;;;;;;:::i;:::-;;:::i;29297:45::-;;;;;;;;;;;;29341:1;29297:45;;;;;27878:6:1;27866:19;;;27848:38;;27836:2;27821:18;29297:45:0;27704:188:1;14933:46:0;;;;;;;;;;;;;;;19101:136;;;;;;;;;;-1:-1:-1;19101:136:0;;;;;:::i;:::-;;:::i;17647:204::-;;;;;;;;;;-1:-1:-1;17647:204:0;;;;;:::i;:::-;;:::i;35052:287::-;;;;;;;;;;-1:-1:-1;35052:287:0;;;;;:::i;:::-;;:::i;24918:627::-;;;;;;:::i;:::-;;:::i;19245:284::-;;;;;;;;;;-1:-1:-1;19245:284:0;;;;;:::i;:::-;;:::i;18313:198::-;;;;;;;;;;-1:-1:-1;18313:198:0;;;;;:::i;:::-;;:::i;30561:388::-;;;;;;;;;;-1:-1:-1;30561:388:0;;;;;:::i;:::-;;:::i;951:178::-;;;;;;;;;;-1:-1:-1;951:178:0;;;;;:::i;:::-;;:::i;17428:211::-;;;;;;;;;;-1:-1:-1;17428:211:0;;;;;:::i;:::-;;:::i;29605:57::-;;;;;;;;;;-1:-1:-1;29605:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;36148:30;;;;;;;;;;;;;;;15514:559;273:10;15688;-1:-1:-1;;;;;15664:35:0;;15656:78;;;;-1:-1:-1;;;15656:78:0;;26392:2:1;15656:78:0;;;26374:21:1;26431:2;26411:18;;;26404:30;26470:32;26450:18;;;26443:60;26520:18;;15656:78:0;;;;;;;;;15774:32;;;15745:26;15774:32;;;:19;:32;;;;;15745:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15847:13;:20;15825:11;;:18;;:42;:70;;;;;15894:1;15871:13;:20;:24;15825:70;:124;;;;-1:-1:-1;15925:24:0;;;;;;15899:22;;;;15909:11;;;;15899:22;:::i;:::-;;;;;;;;:50;15825:124;15817:175;;;;-1:-1:-1;;;15817:175:0;;27499:2:1;15817:175:0;;;27481:21:1;27538:2;27518:18;;;27511:30;27577:34;27557:18;;;27550:62;-1:-1:-1;;;27628:18:1;;;27621:36;27674:19;;15817:175:0;27297:402:1;15817:175:0;16003:62;16022:11;16035;;16003:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;16003:62:0;;;;;;;;;;;;;;;;;;;;;;16048:6;;-1:-1:-1;16003:62:0;-1:-1:-1;16056:8:0;;;;;;16003:62;;16056:8;;;;16003:62;;;;;;;;;-1:-1:-1;16003:18:0;;-1:-1:-1;;;16003:62:0:i;:::-;15645:428;15514:559;;;;;;:::o;36481:205::-;36566:4;-1:-1:-1;;;;;;36590:48:0;;-1:-1:-1;;;36590:48:0;;:88;;;36642:36;36666:11;36642:23;:36::i;:::-;36583:95;36481:205;-1:-1:-1;;36481:205:0:o;17859:123::-;629:13;:11;:13::i;:::-;17939:35:::1;::::0;-1:-1:-1;;;17939:35:0;;27878:6:1;27866:19;;17939:35:0::1;::::0;::::1;27848:38:1::0;17939:10:0::1;-1:-1:-1::0;;;;;17939:25:0::1;::::0;::::1;::::0;27821:18:1;;17939:35:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;17859:123:::0;:::o;34784:260::-;629:13;:11;:13::i;:::-;34922:1:::1;34894:25;:29;34886:87;;;::::0;-1:-1:-1;;;34886:87:0;;21862:2:1;34886:87:0::1;::::0;::::1;21844:21:1::0;21901:2;21881:18;;;21874:30;21940:34;21920:18;;;21913:62;-1:-1:-1;;;21991:18:1;;;21984:43;22044:19;;34886:87:0::1;21660:409:1::0;34886:87:0::1;34984:24;:52:::0;34784:260::o;17990:129::-;629:13;:11;:13::i;:::-;18073:38:::1;::::0;-1:-1:-1;;;18073:38:0;;27878:6:1;27866:19;;18073:38:0::1;::::0;::::1;27848::1::0;18073:10:0::1;-1:-1:-1::0;;;;;18073:28:0::1;::::0;::::1;::::0;27821:18:1;;18073:38:0::1;27704:188:1::0;37130:241:0;37237:6;-1:-1:-1;;;;;37260:26:0;;37281:4;37260:26;37256:48;;-1:-1:-1;37302:1:0;37288:16;;37256:48;-1:-1:-1;;;;37130:241:0;;;;;;;:::o;30233:320::-;30399:14;30415:11;30446:99;30467:11;30480:10;30492:27;30510:8;30492:17;:27::i;:::-;30521:7;30530:14;30446:20;:99::i;:::-;30439:106;;;;30233:320;;;;;;;;:::o;19537:250::-;19679:32;;;19633:4;19679:32;;;:19;:32;;;;;19650:61;;19633:4;;19679:32;19650:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19767:11;;19757:22;;;;;;;:::i;:::-;;;;;;;;19739:13;19729:24;;;;;;:50;19722:57;;;19537:250;;;;;:::o;18127:178::-;629:13;:11;:13::i;:::-;18242:55:::1;::::0;-1:-1:-1;;;18242:55:0;;-1:-1:-1;;;;;18242:10:0::1;:29;::::0;::::1;::::0;:55:::1;::::0;18272:11;;18285;;;;18242:55:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;30957:351:::0;31182:118;31188:5;31195:11;31208:10;31220:27;31238:8;31220:17;:27::i;:::-;31249:14;31265:18;31285:14;31182:5;:118::i;24466:308::-;273:10;24642:4;24618:29;24610:80;;;;-1:-1:-1;;;24610:80:0;;19921:2:1;24610:80:0;;;19903:21:1;19960:2;19940:18;;;19933:30;19999:34;19979:18;;;19972:62;-1:-1:-1;;;20050:18:1;;;20043:36;20096:19;;24610:80:0;19719:402:1;24610:80:0;24701:65;24723:11;24736;;24701:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24701:65:0;;;;;;;;;;;;;;;;;;;;;;24749:6;;-1:-1:-1;24701:65:0;-1:-1:-1;24757:8:0;;;;;;24701:65;;24757:8;;;;24701:65;;;;;;;;;-1:-1:-1;24701:21:0;;-1:-1:-1;;;24701:65:0:i;:::-;24466:308;;;;;;:::o;856:89::-;629:13;:11;:13::i;:::-;912:30:::1;939:1;912:18;:30::i;:::-;856:89::o:0;14986:51::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;33479:905::-;33568:19;;;;;;;;;;33544:21;33606:28;;;:13;:28;;;;;;;:42;;;;;33598:81;;;;-1:-1:-1;;;33598:81:0;;24909:2:1;33598:81:0;;;24891:21:1;24948:2;24928:18;;;24921:30;24987:28;24967:18;;;24960:56;25033:18;;33598:81:0;24707:350:1;33598:81:0;33695:22;33732:8;33721:37;;;;;;;;;;;;:::i;:::-;33771:14;33800:28;;;:13;:28;;;;;:39;;;33881:34;;;;33692:66;;-1:-1:-1;33771:14:0;;-1:-1:-1;33788:138:0;;33800:39;;;;33841:38;;;-1:-1:-1;;;;;33841:38:0;;33692:66;33788:11;:138::i;:::-;33957:28;;;;:13;:28;;;;;:34;;;33771:155;;-1:-1:-1;33945:46:0;;33937:109;;;;-1:-1:-1;;;33937:109:0;;19502:2:1;33937:109:0;;;19484:21:1;19541:2;19521:18;;;19514:30;19580:34;19560:18;;;19553:62;-1:-1:-1;;;19631:18:1;;;19624:48;19689:19;;33937:109:0;19300:414:1;33937:109:0;34076:8;:15;34063:9;:28;34059:318;;;34115:28;;;;:13;:28;;;;;;34108:35;;-1:-1:-1;;;;;;34108:35:0;;;;;;;;;;;;;;;;-1:-1:-1;;34108:35:0;;;34163:28;;;;;34129:13;17246:25:1;;17234:2;17219:18;;17100:177;34163:28:0;;;;;;;;34059:318;;;34255:110;;;;;;;;-1:-1:-1;34268:28:0;;;:13;:28;;;;;;;:39;;;;;;34255:110;;-1:-1:-1;;;;;34309:38:0;;;;;;34255:110;;;;;;;;;;;;34268:39;34255:110;;;;;;34224:28;;;;;;;;:141;;;;;;;;-1:-1:-1;;;;;;34224:141:0;;;;;;;;;;;;;;;;;;;;;;;;;;;34309:38;34224:141;;;;;;;;-1:-1:-1;;34224:141:0;;;;;;;;;34059:318;33533:851;;;33479:905;:::o;35347:281::-;629:13;:11;:13::i;:::-;35499:1:::1;35473:23;:27;35465:83;;;::::0;-1:-1:-1;;;35465:83:0;;19090:2:1;35465:83:0::1;::::0;::::1;19072:21:1::0;19129:2;19109:18;;;19102:30;19168:34;19148:18;;;19141:62;-1:-1:-1;;;19219:18:1;;;19212:41;19270:19;;35465:83:0::1;18888:407:1::0;35465:83:0::1;35559:35;::::0;;::::1;;::::0;;;:22:::1;:35;::::0;;;;:61;35347:281::o;18808:285::-;18932:35;;;18912:17;18932:35;;;:19;:35;;;;;18912:55;;18887:12;;18912:17;18932:35;18912:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18986:4;:11;19001:1;18986:16;;18978:58;;;;-1:-1:-1;;;18978:58:0;;20741:2:1;18978:58:0;;;20723:21:1;20780:2;20760:18;;;20753:30;20819:31;20799:18;;;20792:59;20868:18;;18978:58:0;20539:353:1;18978:58:0;19054:31;19065:1;19082:2;19068:4;:11;:16;;;;:::i;:::-;19054:4;;:31;:10;:31::i;:::-;19047:38;18808:285;-1:-1:-1;;;18808:285:0:o;18519:281::-;629:13;:11;:13::i;:::-;18691:14:::1;;18715:4;18674:47;;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;18674:47:0;;::::1;::::0;;;;;;18636:35:::1;::::0;::::1;;::::0;;;:19:::1;18674:47;18636:35:::0;;;;;;:85;;::::1;::::0;:35;;:85;;::::1;::::0;::::1;:::i;:::-;;18737:55;18761:14;18777;;18737:55;;;;;;;;:::i;:::-;;;;;;;;18519:281:::0;;;:::o;31316:348::-;31556:100;31562:5;31569:11;31582:10;31594:9;31605:14;31621:18;31641:14;31556:5;:100::i;19101:136::-;629:13;:11;:13::i;:::-;19171:8:::1;:20:::0;;-1:-1:-1;;;;;;19171:20:0::1;-1:-1:-1::0;;;;;19171:20:0;::::1;::::0;;::::1;::::0;;;19207:22:::1;::::0;16200:51:1;;;19207:22:0::1;::::0;16188:2:1;16173:18;19207:22:0::1;;;;;;;19101:136:::0;:::o;17647:204::-;629:13;:11;:13::i;:::-;17781:62:::1;::::0;-1:-1:-1;;;17781:62:0;;-1:-1:-1;;;;;17781:10:0::1;:20;::::0;::::1;::::0;:62:::1;::::0;17802:8;;17812;;17822:11;;17835:7;;;;17781:62:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;17647:204:::0;;;;;:::o;35052:287::-;629:13;:11;:13::i;:::-;35207:1:::1;35180:24;:28;35172:85;;;::::0;-1:-1:-1;;;35172:85:0;;20328:2:1;35172:85:0::1;::::0;::::1;20310:21:1::0;20367:2;20347:18;;;20340:30;20406:34;20386:18;;;20379:62;-1:-1:-1;;;20457:18:1;;;20450:42;20509:19;;35172:85:0::1;20126:408:1::0;35172:85:0::1;35268:36;::::0;;::::1;;::::0;;;:23:::1;:36;::::0;;;;:63;35052:287::o;24918:627::-;25084:27;;;25062:19;25084:27;;;:14;:27;;;;;;:40;;;;25112:11;;;;25084:40;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25084:48:0;;;;;;;;;;;;-1:-1:-1;25084:48:0;25143:73;;;;-1:-1:-1;;;25143:73:0;;23388:2:1;25143:73:0;;;23370:21:1;23427:2;23407:18;;;23400:30;23466:34;23446:18;;;23439:62;-1:-1:-1;;;23517:18:1;;;23510:33;23560:19;;25143:73:0;23186:399:1;25143:73:0;25258:11;25245:8;;25235:19;;;;;;;:::i;:::-;;;;;;;;:34;25227:80;;;;-1:-1:-1;;;25227:80:0;;27097:2:1;25227:80:0;;;27079:21:1;27136:2;27116:18;;;27109:30;27175:34;27155:18;;;27148:62;-1:-1:-1;;;27226:18:1;;;27219:31;27267:19;;25227:80:0;26895:397:1;25227:80:0;25318:27;;;25377:1;25318:27;;;:14;:27;;;;;;:40;;;;25346:11;;;;25318:40;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25318:48:0;;;;;;;;;;;;:61;;;;25390:65;;;;;;;;;;;;;;;;;;;25412:11;;25425;;25390:65;;;;;;25425:11;25390:65;;25425:11;25390:65;;;;;;;;;-1:-1:-1;;25390:65:0;;;;;;;;;;;;;;;;;;;;;;25438:6;;-1:-1:-1;25390:65:0;-1:-1:-1;25446:8:0;;;;;;25390:65;;25446:8;;;;25390:65;;;;;;;;;-1:-1:-1;25390:21:0;;-1:-1:-1;;;25390:65:0:i;:::-;25471:66;25491:11;25504;;25517:6;25525:11;25471:66;;;;;;;;;;:::i;:::-;;;;;;;;25051:494;24918:627;;;;;;:::o;19245:284::-;629:13;:11;:13::i;:::-;19369:1:::1;19359:7;:11;19351:45;;;::::0;-1:-1:-1;;;19351:45:0;;22276:2:1;19351:45:0::1;::::0;::::1;22258:21:1::0;22315:2;22295:18;;;22288:30;-1:-1:-1;;;22334:18:1;;;22327:51;22395:18;;19351:45:0::1;22074:345:1::0;19351:45:0::1;19407:28;::::0;;::::1;;::::0;;;:15:::1;:28;::::0;;;;;;;:41;;::::1;::::0;;;;;;;;;;:51;;;19474:47;;32621:34:1;;;32671:18;;32664:43;;;;32723:18;;;32716:34;;;19474:47:0::1;::::0;32584:2:1;32569:18;19474:47:0::1;32398:358:1::0;18313:198:0;629:13;:11;:13::i;:::-;18411:32:::1;::::0;::::1;;::::0;;;:19:::1;:32;::::0;;;;:40:::1;::::0;18446:5;;18411:40:::1;:::i;:::-;;18467:36;18484:11;18497:5;;18467:36;;;;;;;;:::i;30561:388::-:0;30742:14;30758:11;30782:20;30816:10;30828:9;30805:33;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;30805:33:0;;;;;;;;;;-1:-1:-1;;;30856:85:0;;30805:33;-1:-1:-1;;;;;;30856:10:0;:23;;;;:85;;30880:11;;30901:4;;30805:33;;30917:7;;30926:14;;30856:85;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30849:92;;;;;30561:388;;;;;;;;:::o;951:178::-;629:13;:11;:13::i;:::-;-1:-1:-1;;;;;1031:22:0;::::1;1023:73;;;::::0;-1:-1:-1;;;1023:73:0;;22981:2:1;1023:73:0::1;::::0;::::1;22963:21:1::0;23020:2;23000:18;;;22993:30;23059:34;23039:18;;;23032:62;-1:-1:-1;;;23110:18:1;;;23103:36;23156:19;;1023:73:0::1;22779:402:1::0;1023:73:0::1;1098:28;1117:8;1098:18;:28::i;:::-;951:178:::0;:::o;17428:211::-;17563:68;;-1:-1:-1;;;17563:68:0;;32174:6:1;32207:15;;;17563:68:0;;;32189:34:1;32259:15;;32239:18;;;32232:43;17612:4:0;32291:18:1;;;32284:60;32360:18;;;32353:34;;;17531:12:0;;17563:10;-1:-1:-1;;;;;17563:20:0;;;;32136:19:1;;17563:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;17563:68:0;;;;;;;;;;;;:::i;:::-;17556:75;17428:211;-1:-1:-1;;;;;17428:211:0:o;27453:200::-;27540:4;27564:23;27579:7;27564:14;:23::i;:::-;:81;;;;;27591:54;27624:7;27633:11;27591:32;:54::i;23661:470::-;23811:12;23825:19;23848:153;23882:9;23893:3;23921:34;;;23957:11;23970;23983:6;23991:8;23898:102;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;23898:102:0;;;;;;;;;;;;;;-1:-1:-1;;;;;23898:102:0;-1:-1:-1;;;;;;23898:102:0;;;;;;;;;;23856:4;;23848:153;;:33;:153::i;:::-;23810:191;;;;24017:7;24012:112;;24041:71;24061:11;24074;24087:6;24095:8;24105:6;24041:19;:71::i;30006:219::-;30108:4;-1:-1:-1;;;;;;30132:45:0;;-1:-1:-1;;;30132:45:0;;:85;;-1:-1:-1;;;;;;;;;;25695:40:0;;;30181:36;25595:143;732:118;699:7;717:6;-1:-1:-1;;;;;717:6:0;273:10;787:23;779:68;;;;-1:-1:-1;;;779:68:0;;25264:2:1;779:68:0;;;25246:21:1;;;25283:18;;;25276:30;25342:34;25322:18;;;25315:62;25394:18;;779:68:0;25062:356:1;35855:185:0;35967:13;;;35978:1;35967:13;;;;;;;;;35919;;35945:19;;35967:13;;;;;;;;;;;;-1:-1:-1;35967:13:0;35945:35;;36002:7;35991:5;35997:1;35991:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;36027:5;35855:185;-1:-1:-1;;35855:185:0:o;31672:945::-;31916:1;31897:9;:16;:20;31889:59;;;;-1:-1:-1;;;31889:59:0;;26037:2:1;31889:59:0;;;26019:21:1;26076:2;26056:18;;;26049:30;26115:28;26095:18;;;26088:56;26161:18;;31889:59:0;25835:350:1;31889:59:0;31967:9;:16;31987:1;31967:21;:80;;;-1:-1:-1;32012:35:0;;;;;;;:22;:35;;;;;;31992:16;;:55;;31967:80;31959:136;;;;-1:-1:-1;;;31959:136:0;;25625:2:1;31959:136:0;;;25607:21:1;25664:2;25644:18;;;25637:30;25703:34;25683:18;;;25676:62;-1:-1:-1;;;25754:18:1;;;25747:41;25805:19;;31959:136:0;25423:407:1;31959:136:0;32113:6;32108:127;32129:9;:16;32125:1;:20;32108:127;;;32167:56;32178:5;32185:11;32198:10;32210:9;32220:1;32210:12;;;;;;;;:::i;:::-;;;;;;;32167:10;:56::i;:::-;32147:3;;;;:::i;:::-;;;;32108:127;;;;32247:20;32281:10;32293:9;32270:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32247:56;;32316:120;32331:11;29341:1;32364:14;32419:9;:16;32380:23;:36;32404:11;32380:36;;;;;;;;;;;;;;;;:55;;;;:::i;:::-;32316:14;:120::i;:::-;32447:92;32455:11;32468:7;32477:14;32493:18;32513:14;32529:9;32447:7;:92::i;:::-;32587:10;32555:54;;;;;;:::i;:::-;;;;;;;;32580:5;-1:-1:-1;;;;;32555:54:0;32567:11;32555:54;;;32599:9;32555:54;;;;;;:::i;:::-;;;;;;;;31878:739;31672:945;;;;;;;:::o;32625:846::-;32825:27;32854:22;32891:8;32880:37;;;;;;;;;;;;:::i;:::-;33021:2;33001:23;;32995:30;32824:93;;-1:-1:-1;32824:93:0;-1:-1:-1;32930:17:0;33065:48;33077:11;32995:30;32930:17;32824:93;33065:11;:48::i;:::-;33048:65;;33140:8;:15;33128:9;:27;33124:259;;;33196:19;;;;;;;;;;33261:53;;;;;;;;;;;;;;-1:-1:-1;;;;;33261:53:0;;;;;;;;;;;;;;;33309:4;33261:53;;;;;;33172:21;33230:28;;;:13;:28;;;;;;;:84;;;;;;;;;;;-1:-1:-1;;;;;;33230:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33230:84:0;;;;;;;;;;33334:37;;;;;;33196:19;;33206:8;;33334:37;:::i;:::-;;;;;;;;33157:226;33124:259;33443:9;-1:-1:-1;;;;;33400:63:0;33430:11;33400:63;;;;;;:::i;:::-;;;;;;;;33417:11;33400:63;;;33454:8;33400:63;;;;;;:::i;1135:159::-;1200:16;1219:6;;-1:-1:-1;;;;;1227:17:0;;;-1:-1:-1;;;;;;1227:17:0;;;;;;1251:40;;1219:6;;;;;;;1251:40;;1200:16;1251:40;1198:96;1135:159;:::o;34392:384::-;34514:7;34542:11;34564:186;34575:9;:16;34571:1;:20;34564:186;;;34624:24;;34612:9;:36;34608:47;;;34650:5;;34608:47;34672:48;34682:11;34695:10;34707:9;34717:1;34707:12;;;;;;;;:::i;:::-;;;;;;;34672:9;:48::i;:::-;34735:3;;;;:::i;:::-;;;;34564:186;;7931:1299;8072:12;8126:7;8110:12;8126:7;8120:2;8110:12;:::i;:::-;:23;;8102:50;;;;-1:-1:-1;;;8102:50:0;;23792:2:1;8102:50:0;;;23774:21:1;23831:2;23811:18;;;23804:30;-1:-1:-1;;;23850:18:1;;;23843:44;23904:18;;8102:50:0;23590:338:1;8102:50:0;8188:16;8197:7;8188:6;:16;:::i;:::-;8171:6;:13;:33;;8163:63;;;;-1:-1:-1;;;8163:63:0;;26751:2:1;8163:63:0;;;26733:21:1;26790:2;26770:18;;;26763:30;-1:-1:-1;;;26809:18:1;;;26802:47;26866:18;;8163:63:0;26549:341:1;8163:63:0;8239:22;8305:15;;8334:677;;;;9071:4;9065:11;9052:24;;9112:1;9101:9;9094:20;9162:4;9151:9;9147:20;9141:4;9134:34;8298:885;;8334:677;8379:4;8373:11;8360:24;;8432:2;8423:7;8419:16;8511:9;8504:17;8498:4;8494:28;8482:9;8471;8467:25;8463:60;8560:7;8556:2;8552:16;8688:6;8674:9;8667:17;8661:4;8657:28;8645:9;8637:6;8633:22;8629:57;8625:70;8588:305;8722:3;8718:2;8715:11;8588:305;;;8864:9;;8853:21;;8764:4;8756:13;;;;8797;8588:305;;;-1:-1:-1;;8913:26:0;;;8991:2;8974:11;-1:-1:-1;;8970:25:0;8964:4;8957:39;-1:-1:-1;8298:885:0;-1:-1:-1;9213:9:0;7931:1299;-1:-1:-1;;;;7931:1299:0:o;27186:259::-;27250:4;27287:68;27320:7;-1:-1:-1;;;27287:32:0;:68::i;:::-;:150;;;;-1:-1:-1;27373:64:0;27406:7;-1:-1:-1;;;;;;27373:32:0;:64::i;:::-;27372:65;27267:170;27186:259;-1:-1:-1;;27186:259:0:o;28608:603::-;28756:71;;;-1:-1:-1;;;;;;17737:33:1;;28756:71:0;;;;17719:52:1;;;;28756:71:0;;;;;;;;;;17692:18:1;;;;28756:71:0;;;;;;;;;-1:-1:-1;;;;;28756:71:0;-1:-1:-1;;;28756:71:0;;;29008:20;;28710:4;;28756:71;28710:4;;;;;;28756:71;28710:4;;29008:20;28973:7;28966:5;28955:86;28944:97;;29069:16;29055:30;;29120:4;29114:11;29099:26;;29155:7;:29;;;;;29180:4;29166:10;:18;;29155:29;:48;;;;;29202:1;29188:11;:15;29155:48;29148:55;28608:603;-1:-1:-1;;;;;;;28608:603:0:o;19938:808::-;20100:4;20106:12;20131:15;20157:13;20181:24;20218:8;20208:19;;-1:-1:-1;;;;;20208:19:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20208:19:0;;20181:46;;20432:1;20416;20391:9;20385:16;20365:4;20354:9;20350:20;20334:1;20312:7;20293:4;20274:174;20262:186;;20473:16;20462:27;;20518:8;20509:7;20506:21;20503:78;;;20558:8;20547:19;;20503:78;20615:7;20602:11;20595:28;20679:7;20676:1;20669:4;20656:11;20652:22;20637:50;20716:8;;;;-1:-1:-1;19938:808:0;-1:-1:-1;;;;;;19938:808:0:o;24137:323::-;24361:8;24351:19;;;;;;24300:14;:27;24315:11;24300:27;;;;;;;;;;;;;;;24328:11;24300:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24300:48:0;;;;;;;;;:70;;;;24386:66;;;;24400:11;;24413;;24341:6;;24434:8;;24444:7;;24386:66;:::i;:::-;;;;;;;;24137:323;;;;;:::o;36694:254::-;-1:-1:-1;;;;;36811:21:0;;273:10;36811:21;36803:72;;;;-1:-1:-1;;;36803:72:0;;21099:2:1;36803:72:0;;;21081:21:1;21138:2;21118:18;;;21111:30;21177:34;21157:18;;;21150:62;-1:-1:-1;;;21228:18:1;;;21221:36;21274:19;;36803:72:0;20897:402:1;36803:72:0;36886:54;;-1:-1:-1;;;36886:54:0;;-1:-1:-1;;;;;16520:15:1;;;36886:54:0;;;16502:34:1;36924:4:0;16552:18:1;;;16545:43;16604:18;;;16597:34;;;36886:5:0;:22;;;;16437:18:1;;36886:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36694:254;;;;:::o;16721:420::-;16857:21;16881:28;16894:14;16881:12;:28::i;:::-;16939;;;;16920:16;16939:28;;;:15;:28;;;;;;;;:35;;;;;;;;;;;;16857:52;;-1:-1:-1;16920:16:0;16939:47;;16977:9;;16939:47;:::i;:::-;16920:66;;17019:1;17005:11;:15;16997:54;;;;-1:-1:-1;;;16997:54:0;;22626:2:1;16997:54:0;;;22608:21:1;22665:2;22645:18;;;22638:30;22704:28;22684:18;;;22677:56;22750:18;;16997:54:0;22424:350:1;16997:54:0;17090:11;17070:16;:31;;17062:71;;;;-1:-1:-1;;;17062:71:0;;21506:2:1;17062:71:0;;;21488:21:1;21545:2;21525:18;;;21518:30;21584:29;21564:18;;;21557:57;21631:18;;17062:71:0;21304:351:1;16218:495:0;16441:32;;;16412:26;16441:32;;;:19;:32;;;;;16412:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16492:13;:20;16516:1;16492:25;;16484:86;;;;-1:-1:-1;;;16484:86:0;;24135:2:1;16484:86:0;;;24117:21:1;24174:2;24154:18;;;24147:30;24213:34;24193:18;;;24186:62;-1:-1:-1;;;24264:18:1;;;24257:46;24320:19;;16484:86:0;23933:412:1;16484:86:0;16581:124;;-1:-1:-1;;;16581:124:0;;-1:-1:-1;;;;;16581:10:0;:15;;;;16604:10;;16581:124;;16616:11;;16629:13;;16644:8;;16654:14;;16670:18;;16690:14;;16581:124;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16401:312;16218:495;;;;;;:::o;36956:166::-;37055:59;;-1:-1:-1;;;37055:59:0;;37086:4;37055:59;;;16502:34:1;-1:-1:-1;;;;;16572:15:1;;;16552:18;;;16545:43;16604:18;;;16597:34;;;37055:5:0;:22;;;;16437:18:1;;37055:59:0;16262:375:1;17149:271:0;17231:13;17290:2;17265:14;:21;:27;;17257:68;;;;-1:-1:-1;;;17257:68:0;;24552:2:1;17257:68:0;;;24534:21:1;24591:2;24571:18;;;24564:30;24630;24610:18;;;24603:58;24678:18;;17257:68:0;24350:352:1;17257:68:0;-1:-1:-1;17398:2:0;17378:23;17372:30;;17149:271::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:134:1;82:20;;111:31;82:20;111:31;:::i;:::-;14:134;;;:::o;153:673::-;207:5;260:3;253:4;245:6;241:17;237:27;227:55;;278:1;275;268:12;227:55;314:6;301:20;340:4;364:60;380:43;420:2;380:43;:::i;:::-;364:60;:::i;:::-;446:3;470:2;465:3;458:15;498:2;493:3;489:12;482:19;;533:2;525:6;521:15;585:3;580:2;574;571:1;567:10;559:6;555:23;551:32;548:41;545:61;;;602:1;599;592:12;545:61;624:1;634:163;648:2;645:1;642:9;634:163;;;705:17;;693:30;;743:12;;;;775;;;;666:1;659:9;634:163;;;-1:-1:-1;815:5:1;;153:673;-1:-1:-1;;;;;;;153:673:1:o;831:160::-;896:20;;952:13;;945:21;935:32;;925:60;;981:1;978;971:12;996:347;1047:8;1057:6;1111:3;1104:4;1096:6;1092:17;1088:27;1078:55;;1129:1;1126;1119:12;1078:55;-1:-1:-1;1152:20:1;;-1:-1:-1;;;;;1184:30:1;;1181:50;;;1227:1;1224;1217:12;1181:50;1264:4;1256:6;1252:17;1240:29;;1316:3;1309:4;1300:6;1292;1288:19;1284:30;1281:39;1278:59;;;1333:1;1330;1323:12;1278:59;996:347;;;;;:::o;1348:462::-;1390:5;1443:3;1436:4;1428:6;1424:17;1420:27;1410:55;;1461:1;1458;1451:12;1410:55;1497:6;1484:20;1528:48;1544:31;1572:2;1544:31;:::i;1528:48::-;1601:2;1592:7;1585:19;1647:3;1640:4;1635:2;1627:6;1623:15;1619:26;1616:35;1613:55;;;1664:1;1661;1654:12;1613:55;1729:2;1722:4;1714:6;1710:17;1703:4;1694:7;1690:18;1677:55;1777:1;1752:16;;;1770:4;1748:27;1741:38;;;;1756:7;1348:462;-1:-1:-1;;;1348:462:1:o;1815:428::-;1868:5;1921:3;1914:4;1906:6;1902:17;1898:27;1888:55;;1939:1;1936;1929:12;1888:55;1968:6;1962:13;1999:48;2015:31;2043:2;2015:31;:::i;1999:48::-;2072:2;2063:7;2056:19;2118:3;2111:4;2106:2;2098:6;2094:15;2090:26;2087:35;2084:55;;;2135:1;2132;2125:12;2084:55;2148:64;2209:2;2202:4;2193:7;2189:18;2182:4;2174:6;2170:17;2148:64;:::i;2248:159::-;2315:20;;2375:6;2364:18;;2354:29;;2344:57;;2397:1;2394;2387:12;2412:171;2479:20;;-1:-1:-1;;;;;2528:30:1;;2518:41;;2508:69;;2573:1;2570;2563:12;2588:247;2647:6;2700:2;2688:9;2679:7;2675:23;2671:32;2668:52;;;2716:1;2713;2706:12;2668:52;2755:9;2742:23;2774:31;2799:5;2774:31;:::i;2840:665::-;2935:6;2943;2951;2959;3012:3;3000:9;2991:7;2987:23;2983:33;2980:53;;;3029:1;3026;3019:12;2980:53;3068:9;3055:23;3087:31;3112:5;3087:31;:::i;:::-;3137:5;-1:-1:-1;3194:2:1;3179:18;;3166:32;3207:33;3166:32;3207:33;:::i;:::-;3259:7;-1:-1:-1;3313:2:1;3298:18;;3285:32;;-1:-1:-1;3368:2:1;3353:18;;3340:32;-1:-1:-1;;;;;3384:30:1;;3381:50;;;3427:1;3424;3417:12;3381:50;3450:49;3491:7;3482:6;3471:9;3467:22;3450:49;:::i;:::-;3440:59;;;2840:665;;;;;;;:::o;3510:1199::-;3673:6;3681;3689;3697;3705;3713;3721;3774:3;3762:9;3753:7;3749:23;3745:33;3742:53;;;3791:1;3788;3781:12;3742:53;3830:9;3817:23;3849:31;3874:5;3849:31;:::i;:::-;3899:5;-1:-1:-1;3923:37:1;3956:2;3941:18;;3923:37;:::i;:::-;3913:47;;4011:2;4000:9;3996:18;3983:32;-1:-1:-1;;;;;4075:2:1;4067:6;4064:14;4061:34;;;4091:1;4088;4081:12;4061:34;4114:49;4155:7;4146:6;4135:9;4131:22;4114:49;:::i;:::-;4104:59;;4216:2;4205:9;4201:18;4188:32;4172:48;;4245:2;4235:8;4232:16;4229:36;;;4261:1;4258;4251:12;4229:36;4284:63;4339:7;4328:8;4317:9;4313:24;4284:63;:::i;:::-;4274:73;;4399:3;4388:9;4384:19;4371:33;4356:48;;4413:33;4438:7;4413:33;:::i;:::-;4465:7;4455:17;;4491:39;4525:3;4514:9;4510:19;4491:39;:::i;:::-;4481:49;;4583:3;4572:9;4568:19;4555:33;4539:49;;4613:2;4603:8;4600:16;4597:36;;;4629:1;4626;4619:12;4597:36;;4652:51;4695:7;4684:8;4673:9;4669:24;4652:51;:::i;:::-;4642:61;;;3510:1199;;;;;;;;;;:::o;4714:1108::-;4852:6;4860;4868;4876;4884;4892;4900;4953:3;4941:9;4932:7;4928:23;4924:33;4921:53;;;4970:1;4967;4960:12;4921:53;5009:9;4996:23;5028:31;5053:5;5028:31;:::i;:::-;5078:5;-1:-1:-1;5102:37:1;5135:2;5120:18;;5102:37;:::i;:::-;5092:47;;5190:2;5179:9;5175:18;5162:32;-1:-1:-1;;;;;5254:2:1;5246:6;5243:14;5240:34;;;5270:1;5267;5260:12;5240:34;5293:49;5334:7;5325:6;5314:9;5310:22;5293:49;:::i;:::-;5283:59;;5389:2;5378:9;5374:18;5361:32;5351:42;;5445:3;5434:9;5430:19;5417:33;5402:48;;5459:33;5484:7;5459:33;:::i;:::-;5511:7;;-1:-1:-1;5570:3:1;5555:19;;5542:33;;5584;5542;5584;:::i;:::-;5636:7;;-1:-1:-1;5696:3:1;5681:19;;5668:33;;5713:16;;;5710:36;;;5742:1;5739;5732:12;5827:180;5886:6;5939:2;5927:9;5918:7;5914:23;5910:32;5907:52;;;5955:1;5952;5945:12;5907:52;-1:-1:-1;5978:23:1;;5827:180;-1:-1:-1;5827:180:1:o;6012:286::-;6070:6;6123:2;6111:9;6102:7;6098:23;6094:32;6091:52;;;6139:1;6136;6129:12;6091:52;6165:23;;-1:-1:-1;;;;;;6217:32:1;;6207:43;;6197:71;;6264:1;6261;6254:12;6303:320;6371:6;6424:2;6412:9;6403:7;6399:23;6395:32;6392:52;;;6440:1;6437;6430:12;6392:52;6480:9;6467:23;-1:-1:-1;;;;;6505:6:1;6502:30;6499:50;;;6545:1;6542;6535:12;6499:50;6568:49;6609:7;6600:6;6589:9;6585:22;6568:49;:::i;6628:335::-;6707:6;6760:2;6748:9;6739:7;6735:23;6731:32;6728:52;;;6776:1;6773;6766:12;6728:52;6809:9;6803:16;-1:-1:-1;;;;;6834:6:1;6831:30;6828:50;;;6874:1;6871;6864:12;6828:50;6897:60;6949:7;6940:6;6929:9;6925:22;6897:60;:::i;6968:1115::-;7081:6;7089;7142:2;7130:9;7121:7;7117:23;7113:32;7110:52;;;7158:1;7155;7148:12;7110:52;7191:9;7185:16;-1:-1:-1;;;;;7261:2:1;7253:6;7250:14;7247:34;;;7277:1;7274;7267:12;7247:34;7300:60;7352:7;7343:6;7332:9;7328:22;7300:60;:::i;:::-;7290:70;;7379:2;7369:12;;7427:2;7416:9;7412:18;7406:25;7456:2;7446:8;7443:16;7440:36;;;7472:1;7469;7462:12;7440:36;7495:24;;;-1:-1:-1;7550:4:1;7542:13;;7538:27;-1:-1:-1;7528:55:1;;7579:1;7576;7569:12;7528:55;7608:2;7602:9;7631:60;7647:43;7687:2;7647:43;:::i;7631:60::-;7713:3;7737:2;7732:3;7725:15;7765:2;7760:3;7756:12;7749:19;;7796:2;7792;7788:11;7844:7;7839:2;7833;7830:1;7826:10;7822:2;7818:19;7814:28;7811:41;7808:61;;;7865:1;7862;7855:12;7808:61;7887:1;7878:10;;7897:156;7911:2;7908:1;7905:9;7897:156;;;7968:10;;7956:23;;7929:1;7922:9;;;;;7999:12;;;;8031;;7897:156;;;7901:3;8072:5;8062:15;;;;;;;6968:1115;;;;;:::o;8088:184::-;8146:6;8199:2;8187:9;8178:7;8174:23;8170:32;8167:52;;;8215:1;8212;8205:12;8167:52;8238:28;8256:9;8238:28;:::i;8277:481::-;8355:6;8363;8371;8424:2;8412:9;8403:7;8399:23;8395:32;8392:52;;;8440:1;8437;8430:12;8392:52;8463:28;8481:9;8463:28;:::i;:::-;8453:38;;8542:2;8531:9;8527:18;8514:32;-1:-1:-1;;;;;8561:6:1;8558:30;8555:50;;;8601:1;8598;8591:12;8555:50;8640:58;8690:7;8681:6;8670:9;8666:22;8640:58;:::i;:::-;8277:481;;8717:8;;-1:-1:-1;8614:84:1;;-1:-1:-1;;;;8277:481:1:o;8763:862::-;8869:6;8877;8885;8893;8901;8909;8962:3;8950:9;8941:7;8937:23;8933:33;8930:53;;;8979:1;8976;8969:12;8930:53;9002:28;9020:9;9002:28;:::i;:::-;8992:38;;9081:2;9070:9;9066:18;9053:32;-1:-1:-1;;;;;9145:2:1;9137:6;9134:14;9131:34;;;9161:1;9158;9151:12;9131:34;9200:58;9250:7;9241:6;9230:9;9226:22;9200:58;:::i;:::-;9277:8;;-1:-1:-1;9174:84:1;-1:-1:-1;9174:84:1;;-1:-1:-1;9331:37:1;9364:2;9349:18;;9331:37;:::i;:::-;9321:47;;9421:2;9410:9;9406:18;9393:32;9377:48;;9450:2;9440:8;9437:16;9434:36;;;9466:1;9463;9456:12;9434:36;;9505:60;9557:7;9546:8;9535:9;9531:24;9505:60;:::i;:::-;8763:862;;;;-1:-1:-1;8763:862:1;;-1:-1:-1;8763:862:1;;9584:8;;8763:862;-1:-1:-1;;;8763:862:1:o;9630:907::-;9764:6;9772;9780;9788;9796;9849:3;9837:9;9828:7;9824:23;9820:33;9817:53;;;9866:1;9863;9856:12;9817:53;9889:28;9907:9;9889:28;:::i;:::-;9879:38;;9968:2;9957:9;9953:18;9940:32;-1:-1:-1;;;;;10032:2:1;10024:6;10021:14;10018:34;;;10048:1;10045;10038:12;10018:34;10071:49;10112:7;10103:6;10092:9;10088:22;10071:49;:::i;:::-;10061:59;;10173:2;10162:9;10158:18;10145:32;10129:48;;10202:2;10192:8;10189:16;10186:36;;;10218:1;10215;10208:12;10186:36;10241:63;10296:7;10285:8;10274:9;10270:24;10241:63;:::i;:::-;10231:73;;10323:35;10354:2;10343:9;10339:18;10323:35;:::i;:::-;10313:45;;10411:3;10400:9;10396:19;10383:33;10367:49;;10441:2;10431:8;10428:16;10425:36;;;10457:1;10454;10447:12;10425:36;;10480:51;10523:7;10512:8;10501:9;10497:24;10480:51;:::i;:::-;10470:61;;;9630:907;;;;;;;;:::o;10542:749::-;10651:6;10659;10667;10675;10683;10736:3;10724:9;10715:7;10711:23;10707:33;10704:53;;;10753:1;10750;10743:12;10704:53;10776:28;10794:9;10776:28;:::i;:::-;10766:38;;10855:2;10844:9;10840:18;10827:32;-1:-1:-1;;;;;10919:2:1;10911:6;10908:14;10905:34;;;10935:1;10932;10925:12;10905:34;10958:49;10999:7;10990:6;10979:9;10975:22;10958:49;:::i;:::-;10948:59;;11054:2;11043:9;11039:18;11026:32;11016:42;;11077:35;11108:2;11097:9;11093:18;11077:35;:::i;11296:464::-;11380:6;11388;11396;11449:2;11437:9;11428:7;11424:23;11420:32;11417:52;;;11465:1;11462;11455:12;11417:52;11488:28;11506:9;11488:28;:::i;:::-;11478:38;;11567:2;11556:9;11552:18;11539:32;-1:-1:-1;;;;;11586:6:1;11583:30;11580:50;;;11626:1;11623;11616:12;11580:50;11649:49;11690:7;11681:6;11670:9;11666:22;11649:49;:::i;:::-;11639:59;;;11717:37;11750:2;11739:9;11735:18;11717:37;:::i;:::-;11707:47;;11296:464;;;;;:::o;11765:256::-;11831:6;11839;11892:2;11880:9;11871:7;11867:23;11863:32;11860:52;;;11908:1;11905;11898:12;11860:52;11931:28;11949:9;11931:28;:::i;:::-;11921:38;;11978:37;12011:2;12000:9;11996:18;11978:37;:::i;:::-;11968:47;;11765:256;;;;;:::o;12026:460::-;12110:6;12118;12126;12134;12187:3;12175:9;12166:7;12162:23;12158:33;12155:53;;;12204:1;12201;12194:12;12155:53;12227:28;12245:9;12227:28;:::i;:::-;12217:38;;12274:37;12307:2;12296:9;12292:18;12274:37;:::i;:::-;12264:47;;12361:2;12350:9;12346:18;12333:32;12374:31;12399:5;12374:31;:::i;:::-;12026:460;;;;-1:-1:-1;12424:5:1;;12476:2;12461:18;12448:32;;-1:-1:-1;;12026:460:1:o;12491:324::-;12566:6;12574;12582;12635:2;12623:9;12614:7;12610:23;12606:32;12603:52;;;12651:1;12648;12641:12;12603:52;12674:28;12692:9;12674:28;:::i;:::-;12664:38;;12721:37;12754:2;12743:9;12739:18;12721:37;:::i;:::-;12711:47;;12805:2;12794:9;12790:18;12777:32;12767:42;;12491:324;;;;;:::o;12820:622::-;12915:6;12923;12931;12939;12947;13000:3;12988:9;12979:7;12975:23;12971:33;12968:53;;;13017:1;13014;13007:12;12968:53;13040:28;13058:9;13040:28;:::i;:::-;13030:38;;13087:37;13120:2;13109:9;13105:18;13087:37;:::i;:::-;13077:47;;13171:2;13160:9;13156:18;13143:32;13133:42;;13226:2;13215:9;13211:18;13198:32;-1:-1:-1;;;;;13245:6:1;13242:30;13239:50;;;13285:1;13282;13275:12;13239:50;13324:58;13374:7;13365:6;13354:9;13350:22;13324:58;:::i;:::-;12820:622;;;;-1:-1:-1;12820:622:1;;-1:-1:-1;13401:8:1;;13298:84;12820:622;-1:-1:-1;;;12820:622:1:o;13447:252::-;13514:6;13522;13575:2;13563:9;13554:7;13550:23;13546:32;13543:52;;;13591:1;13588;13581:12;13543:52;13614:28;13632:9;13614:28;:::i;:::-;13604:38;13689:2;13674:18;;;;13661:32;;-1:-1:-1;;;13447:252:1:o;13889:245::-;13968:6;13976;14029:2;14017:9;14008:7;14004:23;14000:32;13997:52;;;14045:1;14042;14035:12;13997:52;-1:-1:-1;;14068:16:1;;14124:2;14109:18;;;14103:25;14068:16;;14103:25;;-1:-1:-1;13889:245:1:o;14139:435::-;14192:3;14230:5;14224:12;14257:6;14252:3;14245:19;14283:4;14312:2;14307:3;14303:12;14296:19;;14349:2;14342:5;14338:14;14370:1;14380:169;14394:6;14391:1;14388:13;14380:169;;;14455:13;;14443:26;;14489:12;;;;14524:15;;;;14416:1;14409:9;14380:169;;;-1:-1:-1;14565:3:1;;14139:435;-1:-1:-1;;;;;14139:435:1:o;14579:266::-;14667:6;14662:3;14655:19;14719:6;14712:5;14705:4;14700:3;14696:14;14683:43;-1:-1:-1;14771:1:1;14746:16;;;14764:4;14742:27;;;14735:38;;;;14827:2;14806:15;;;-1:-1:-1;;14802:29:1;14793:39;;;14789:50;;14579:266::o;14850:257::-;14891:3;14929:5;14923:12;14956:6;14951:3;14944:19;14972:63;15028:6;15021:4;15016:3;15012:14;15005:4;14998:5;14994:16;14972:63;:::i;:::-;15089:2;15068:15;-1:-1:-1;;15064:29:1;15055:39;;;;15096:4;15051:50;;14850:257;-1:-1:-1;;14850:257:1:o;15112:271::-;15295:6;15287;15282:3;15269:33;15251:3;15321:16;;15346:13;;;15321:16;15112:271;-1:-1:-1;15112:271:1:o;15388:382::-;15599:6;15591;15586:3;15573:33;15691:2;15687:15;;;;-1:-1:-1;;15683:53:1;15625:16;;15672:65;;;15761:2;15753:11;;15388:382;-1:-1:-1;15388:382:1:o;15775:274::-;15904:3;15942:6;15936:13;15958:53;16004:6;15999:3;15992:4;15984:6;15980:17;15958:53;:::i;:::-;16027:16;;;;;15775:274;-1:-1:-1;;15775:274:1:o;16642:261::-;16821:2;16810:9;16803:21;16784:4;16841:56;16893:2;16882:9;16878:18;16870:6;16841:56;:::i;17282:288::-;17457:6;17446:9;17439:25;17500:2;17495;17484:9;17480:18;17473:30;17420:4;17520:44;17560:2;17549:9;17545:18;17537:6;17520:44;:::i;17782:217::-;17929:2;17918:9;17911:21;17892:4;17949:44;17989:2;17978:9;17974:18;17966:6;17949:44;:::i;18004:421::-;18229:2;18218:9;18211:21;18192:4;18255:44;18295:2;18284:9;18280:18;18272:6;18255:44;:::i;:::-;18347:9;18339:6;18335:22;18330:2;18319:9;18315:18;18308:50;18375:44;18412:6;18404;18375:44;:::i;27897:640::-;28178:6;28166:19;;28148:38;;-1:-1:-1;;;;;28222:32:1;;28217:2;28202:18;;28195:60;28242:3;28286:2;28271:18;;28264:31;;;-1:-1:-1;;28318:45:1;;28343:19;;28335:6;28318:45;:::i;:::-;28413:6;28406:14;28399:22;28394:2;28383:9;28379:18;28372:50;28471:9;28463:6;28459:22;28453:3;28442:9;28438:19;28431:51;28499:32;28524:6;28516;28499:32;:::i;:::-;28491:40;27897:640;-1:-1:-1;;;;;;;;27897:640:1:o;28985:326::-;29180:6;29172;29168:19;29157:9;29150:38;29224:2;29219;29208:9;29204:18;29197:30;29131:4;29244:61;29301:2;29290:9;29286:18;29278:6;29270;29244:61;:::i;29316:493::-;29565:6;29557;29553:19;29542:9;29535:38;29609:3;29604:2;29593:9;29589:18;29582:31;29516:4;29630:62;29687:3;29676:9;29672:19;29664:6;29656;29630:62;:::i;:::-;-1:-1:-1;;;;;29728:31:1;;;;29723:2;29708:18;;29701:59;-1:-1:-1;29791:2:1;29776:18;29769:34;29622:70;29316:493;-1:-1:-1;;;29316:493:1:o;29814:837::-;30163:6;30155;30151:19;30140:9;30133:38;30207:3;30202:2;30191:9;30187:18;30180:31;30114:4;30234:45;30274:3;30263:9;30259:19;30251:6;30234:45;:::i;:::-;30327:9;30319:6;30315:22;30310:2;30299:9;30295:18;30288:50;30361:32;30386:6;30378;30361:32;:::i;:::-;-1:-1:-1;;;;;30467:15:1;;;30462:2;30447:18;;30440:43;30520:15;;30514:3;30499:19;;30492:44;30573:22;;;30420:3;30552:19;;30545:51;30347:46;-1:-1:-1;30613:32:1;30347:46;30630:6;30613:32;:::i;:::-;30605:40;29814:837;-1:-1:-1;;;;;;;;;29814:837:1:o;30656:555::-;30913:6;30905;30901:19;30890:9;30883:38;30957:3;30952:2;30941:9;30937:18;30930:31;30864:4;30984:45;31024:3;31013:9;31009:19;31001:6;30984:45;:::i;:::-;-1:-1:-1;;;;;31069:6:1;31065:31;31060:2;31049:9;31045:18;31038:59;31145:9;31137:6;31133:22;31128:2;31117:9;31113:18;31106:50;31173:32;31198:6;31190;31173:32;:::i;31216:716::-;31519:6;31511;31507:19;31496:9;31489:38;31563:3;31558:2;31547:9;31543:18;31536:31;31470:4;31590:45;31630:3;31619:9;31615:19;31607:6;31590:45;:::i;:::-;-1:-1:-1;;;;;31675:6:1;31671:31;31666:2;31655:9;31651:18;31644:59;31751:9;31743:6;31739:22;31734:2;31723:9;31719:18;31712:50;31785:32;31810:6;31802;31785:32;:::i;:::-;31771:46;;31866:9;31858:6;31854:22;31848:3;31837:9;31833:19;31826:51;31894:32;31919:6;31911;31894:32;:::i;32761:498::-;32961:4;32990:6;33035:2;33027:6;33023:15;33012:9;33005:34;33087:2;33079:6;33075:15;33070:2;33059:9;33055:18;33048:43;;33127:6;33122:2;33111:9;33107:18;33100:34;33170:3;33165:2;33154:9;33150:18;33143:31;33191:62;33248:3;33237:9;33233:19;33225:6;33217;33191:62;:::i;33699:275::-;33770:2;33764:9;33835:2;33816:13;;-1:-1:-1;;33812:27:1;33800:40;;-1:-1:-1;;;;;33855:34:1;;33891:22;;;33852:62;33849:88;;;33917:18;;:::i;:::-;33953:2;33946:22;33699:275;;-1:-1:-1;33699:275:1:o;33979:183::-;34039:4;-1:-1:-1;;;;;34064:6:1;34061:30;34058:56;;;34094:18;;:::i;:::-;-1:-1:-1;34139:1:1;34135:14;34151:4;34131:25;;33979:183::o;34167:186::-;34215:4;-1:-1:-1;;;;;34240:6:1;34237:30;34234:56;;;34270:18;;:::i;:::-;-1:-1:-1;34336:2:1;34315:15;-1:-1:-1;;34311:29:1;34342:4;34307:40;;34167:186::o;34358:128::-;34398:3;34429:1;34425:6;34422:1;34419:13;34416:39;;;34435:18;;:::i;:::-;-1:-1:-1;34471:9:1;;34358:128::o;34491:168::-;34531:7;34597:1;34593;34589:6;34585:14;34582:1;34579:21;34574:1;34567:9;34560:17;34556:45;34553:71;;;34604:18;;:::i;:::-;-1:-1:-1;34644:9:1;;34491:168::o;34664:125::-;34704:4;34732:1;34729;34726:8;34723:34;;;34737:18;;:::i;:::-;-1:-1:-1;34774:9:1;;34664:125::o;34794:258::-;34866:1;34876:113;34890:6;34887:1;34884:13;34876:113;;;34966:11;;;34960:18;34947:11;;;34940:39;34912:2;34905:10;34876:113;;;35007:6;35004:1;35001:13;34998:48;;;-1:-1:-1;;35042:1:1;35024:16;;35017:27;34794:258::o;35057:380::-;35136:1;35132:12;;;;35179;;;35200:61;;35254:4;35246:6;35242:17;35232:27;;35200:61;35307:2;35299:6;35296:14;35276:18;35273:38;35270:161;;;35353:10;35348:3;35344:20;35341:1;35334:31;35388:4;35385:1;35378:15;35416:4;35413:1;35406:15;35270:161;;35057:380;;;:::o;35442:135::-;35481:3;-1:-1:-1;;35502:17:1;;35499:43;;;35522:18;;:::i;:::-;-1:-1:-1;35569:1:1;35558:13;;35442:135::o;35582:127::-;35643:10;35638:3;35634:20;35631:1;35624:31;35674:4;35671:1;35664:15;35698:4;35695:1;35688:15;35714:127;35775:10;35770:3;35766:20;35763:1;35756:31;35806:4;35803:1;35796:15;35830:4;35827:1;35820:15;35846:127;35907:10;35902:3;35898:20;35895:1;35888:31;35938:4;35935:1;35928:15;35962:4;35959:1;35952:15;35978:131;-1:-1:-1;;;;;36053:31:1;;36043:42;;36033:70;;36099:1;36096;36089:12

Swarm Source

ipfs://d6fa3129040b01b5d1cc9303ea9352737ea4a14e6d53ab030754b1070be8cf73

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  ]

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.