Token Axolittles

 

Overview ERC-721

Total Supply:
10,000 AXOLITTLE

Holders:
34 addresses
Balance
0 AXOLITTLE
0x422a002105e8a5925fc1e93d2281a7ae989f7265
Loading
[ Download CSV Export  ] 
Loading
Loading

Click here to update the token ICO / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
AxolittlesArb

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 2022-06-29
*/

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}


// File contracts/LzBridge/interfaces/IONFT721Core.sol


pragma solidity ^0.8.0;
/**
 * @dev Interface of the ONFT Core standard
 */
interface IONFT721Core is IERC165 {
    /**
     * @dev estimate send token `_tokenId` to (`_dstChainId`, `_toAddress`)
     * _dstChainId - L0 defined chain id to send tokens too
     * _toAddress - dynamic bytes array which contains the address to whom you are sending tokens to on the dstChain
     * _tokenIds - token Id array to transfer
     * _useZro - indicates to use zro to pay L0 fees
     * _adapterParams - flexible bytes array to indicate messaging adapter services in L0
     */
    function estimateSendFee(uint16 _dstChainId, bytes calldata _toAddress, uint16[] calldata _tokenIds, bool _useZro, bytes calldata _adapterParams) external view returns (uint nativeFee, uint zroFee);

    /**
     * @dev send token `_tokenId` to (`_dstChainId`, `_toAddress`) from `msg.sender`
     * `_toAddress` can be any size depending on the `dstChainId`.
     * `_zroPaymentAddress` set to address(0x0) if not paying in ZRO (LayerZero Token)
     * `_adapterParams` is a flexible bytes array to indicate messaging adapter services
     */
    function sendFrom(uint16 _dstChainId, bytes calldata _toAddress, uint16[] calldata _tokenIds, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable;

    /**
     * @dev Emitted when `_tokenId` are moved from the `_sender` to (`_dstChainId`, `_toAddress`)
     * `_nonce` is the outbound nonce from
     */
    event SendToChain(address indexed _sender, uint16 indexed _dstChainId, bytes indexed _toAddress, uint16[] _tokenIds, uint64 _nonce);

    /**
     * @dev Emitted when `_tokenIds` are sent from `_srcChainId` to the `_toAddress` at this chain. `_nonce` is the inbound nonce.
     */
    event ReceiveFromChain(uint16 indexed _srcChainId, bytes indexed _srcAddress, address indexed _toAddress, uint16[] _tokenIds, uint64 _nonce);
}


// File @openzeppelin/contracts/utils/[email protected]

// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}


// File @openzeppelin/contracts/access/[email protected]

// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


// File contracts/LzBridge/interfaces/ILayerZeroReceiver.sol


pragma solidity >=0.5.0;

interface ILayerZeroReceiver {
    // @notice LayerZero endpoint will invoke this function to deliver the message on the destination
    // @param _srcChainId - the source endpoint identifier
    // @param _srcAddress - the source sending contract address from the source chain
    // @param _nonce - the ordered message nonce
    // @param _payload - the signed payload is the UA bytes has encoded to be sent
    function lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) external;
}


// File contracts/LzBridge/interfaces/ILayerZeroUserApplicationConfig.sol


pragma solidity >=0.5.0;

interface ILayerZeroUserApplicationConfig {
    // @notice set the configuration of the LayerZero messaging library of the specified version
    // @param _version - messaging library version
    // @param _chainId - the chainId for the pending config change
    // @param _configType - type of configuration. every messaging library has its own convention.
    // @param _config - configuration in the bytes. can encode arbitrary content.
    function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external;

    // @notice set the send() LayerZero messaging library version to _version
    // @param _version - new messaging library version
    function setSendVersion(uint16 _version) external;

    // @notice set the lzReceive() LayerZero messaging library version to _version
    // @param _version - new messaging library version
    function setReceiveVersion(uint16 _version) external;

    // @notice Only when the UA needs to resume the message flow in blocking mode and clear the stored payload
    // @param _srcChainId - the chainId of the source chain
    // @param _srcAddress - the contract address of the source contract at the source chain
    function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external;
}


// File contracts/LzBridge/interfaces/ILayerZeroEndpoint.sol


pragma solidity >=0.5.0;
interface ILayerZeroEndpoint is ILayerZeroUserApplicationConfig {
    // @notice send a LayerZero message to the specified address at a LayerZero endpoint.
    // @param _dstChainId - the destination chain identifier
    // @param _destination - the address on destination chain (in bytes). address length/format may vary by chains
    // @param _payload - a custom bytes payload to send to the destination contract
    // @param _refundAddress - if the source transaction is cheaper than the amount of value passed, refund the additional amount to this address
    // @param _zroPaymentAddress - the address of the ZRO token holder who would pay for the transaction
    // @param _adapterParams - parameters for custom functionality. e.g. receive airdropped native gas from the relayer on destination
    function send(uint16 _dstChainId, bytes calldata _destination, bytes calldata _payload, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable;

    // @notice used by the messaging library to publish verified payload
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source contract (as bytes) at the source chain
    // @param _dstAddress - the address on destination chain
    // @param _nonce - the unbound message ordering nonce
    // @param _gasLimit - the gas limit for external contract execution
    // @param _payload - verified payload to send to the destination contract
    function receivePayload(uint16 _srcChainId, bytes calldata _srcAddress, address _dstAddress, uint64 _nonce, uint _gasLimit, bytes calldata _payload) external;

    // @notice get the inboundNonce of a lzApp from a source chain which could be EVM or non-EVM chain
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source chain contract address
    function getInboundNonce(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (uint64);

    // @notice get the outboundNonce from this source chain which, consequently, is always an EVM
    // @param _srcAddress - the source chain contract address
    function getOutboundNonce(uint16 _dstChainId, address _srcAddress) external view returns (uint64);

    // @notice gets a quote in source native gas, for the amount that send() requires to pay for message delivery
    // @param _dstChainId - the destination chain identifier
    // @param _userApplication - the user app address on this EVM chain
    // @param _payload - the custom message to send over LayerZero
    // @param _payInZRO - if false, user app pays the protocol fee in native token
    // @param _adapterParam - parameters for the adapter service, e.g. send some dust native token to dstChain
    function estimateFees(uint16 _dstChainId, address _userApplication, bytes calldata _payload, bool _payInZRO, bytes calldata _adapterParam) external view returns (uint nativeFee, uint zroFee);

    // @notice get this Endpoint's immutable source identifier
    function getChainId() external view returns (uint16);

    // @notice the interface to retry failed message on this Endpoint destination
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source chain contract address
    // @param _payload - the payload to be retried
    function retryPayload(uint16 _srcChainId, bytes calldata _srcAddress, bytes calldata _payload) external;

    // @notice query if any STORED payload (message blocking) at the endpoint.
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source chain contract address
    function hasStoredPayload(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool);

    // @notice query if the _libraryAddress is valid for sending msgs.
    // @param _userApplication - the user app address on this EVM chain
    function getSendLibraryAddress(address _userApplication) external view returns (address);

    // @notice query if the _libraryAddress is valid for receiving msgs.
    // @param _userApplication - the user app address on this EVM chain
    function getReceiveLibraryAddress(address _userApplication) external view returns (address);

    // @notice query if the non-reentrancy guard for send() is on
    // @return true if the guard is on. false otherwise
    function isSendingPayload() external view returns (bool);

    // @notice query if the non-reentrancy guard for receive() is on
    // @return true if the guard is on. false otherwise
    function isReceivingPayload() external view returns (bool);

    // @notice get the configuration of the LayerZero messaging library of the specified version
    // @param _version - messaging library version
    // @param _chainId - the chainId for the pending config change
    // @param _userApplication - the contract address of the user application
    // @param _configType - type of configuration. every messaging library has its own convention.
    function getConfig(uint16 _version, uint16 _chainId, address _userApplication, uint _configType) external view returns (bytes memory);

    // @notice get the send() LayerZero messaging library version
    // @param _userApplication - the contract address of the user application
    function getSendVersion(address _userApplication) external view returns (uint16);

    // @notice get the lzReceive() LayerZero messaging library version
    // @param _userApplication - the contract address of the user application
    function getReceiveVersion(address _userApplication) external view returns (uint16);
}


// File contracts/LzBridge/lib/LzApp.sol


pragma solidity ^0.8.0;
/*
 * a generic LzReceiver implementation
 */
abstract contract LzApp is Ownable, ILayerZeroReceiver, ILayerZeroUserApplicationConfig {
    ILayerZeroEndpoint public immutable lzEndpoint;

    mapping(uint16 => bytes) public trustedRemoteLookup;

    event SetTrustedRemote(uint16 _srcChainId, bytes _srcAddress);

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

    function lzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) public virtual override {
        // lzReceive must be called by the endpoint for security
        require(_msgSender() == address(lzEndpoint), "LzApp: invalid endpoint caller");

        bytes memory trustedRemote = trustedRemoteLookup[_srcChainId];
        // if will still block the message pathway from (srcChainId, srcAddress). should not receive message from untrusted remote.
        require(_srcAddress.length == trustedRemote.length && keccak256(_srcAddress) == keccak256(trustedRemote), "LzApp: invalid source sending contract");

        _blockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload);
    }

    // abstract function - the default behaviour of LayerZero is blocking. See: NonblockingLzApp if you dont need to enforce ordered messaging
    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) internal virtual {
        bytes memory trustedRemote = trustedRemoteLookup[_dstChainId];
        require(trustedRemote.length != 0, "LzApp: destination chain is not a trusted source");
        lzEndpoint.send{value: msg.value}(_dstChainId, trustedRemote, _payload, _refundAddress, _zroPaymentAddress, _adapterParams);
    }

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

    // generic config for LayerZero user Application
    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);
    }

    // allow owner to set it multiple times.
    function setTrustedRemote(uint16 _srcChainId, bytes calldata _srcAddress) external onlyOwner {
        trustedRemoteLookup[_srcChainId] = _srcAddress;
        emit SetTrustedRemote(_srcChainId, _srcAddress);
    }

    //--------------------------- VIEW FUNCTION ----------------------------------------

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


// File contracts/LzBridge/lib/NonblockingLzApp.sol


pragma solidity ^0.8.0;
/*
 * the default LayerZero messaging behaviour is blocking, i.e. any failed message will block the channel
 * this abstract class try-catch all fail messages and store locally for future retry. hence, non-blocking
 * NOTE: if the srcAddress is not configured properly, it will still block the message pathway from (srcChainId, srcAddress)
 */
abstract contract NonblockingLzApp is LzApp {
    constructor(address _endpoint) LzApp(_endpoint) {}

    mapping(uint16 => mapping(bytes => mapping(uint64 => bytes32))) public failedMessages;

    event MessageFailed(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes _payload);

    // overriding the virtual function in LzReceiver
    function _blockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual override {
        // try-catch all errors/exceptions
        try this.nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload) {
            // do nothing
        } catch {
            // error / exception
            failedMessages[_srcChainId][_srcAddress][_nonce] = keccak256(_payload);
            emit MessageFailed(_srcChainId, _srcAddress, _nonce, _payload);
        }
    }

    function nonblockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) public virtual {
        // only internal transaction
        require(_msgSender() == address(this), "NonblockingLzApp: caller must be LzApp");
        _nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload);
    }

    //@notice override this function
    function _nonblockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual;

    function retryMessage(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) public payable virtual {
        // assert there is message to retry
        bytes32 payloadHash = failedMessages[_srcChainId][_srcAddress][_nonce];
        require(payloadHash != bytes32(0), "NonblockingLzApp: no stored message");
        require(keccak256(_payload) == payloadHash, "NonblockingLzApp: invalid payload");
        // clear the stored message
        failedMessages[_srcChainId][_srcAddress][_nonce] = bytes32(0);
        // execute the message. revert if it fails again
        _nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload);
    }
}


// File @openzeppelin/contracts/utils/introspection/[email protected]

// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}


// File contracts/LzBridge/lib/ONFT721Core.sol

// copied from: https://github.com/LayerZero-Labs/solidity-examples/blob/main/contracts/token/onft/ONFT721Core.sol

pragma solidity ^0.8.0;
abstract contract ONFT721Core is NonblockingLzApp, ERC165, IONFT721Core {
    constructor(address _lzEndpoint) NonblockingLzApp(_lzEndpoint) {}

    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, uint16[] memory _tokenIds, bool _useZro, bytes memory _adapterParams) public view virtual override returns (uint nativeFee, uint zroFee) {
        // mock the payload for send()
        bytes memory payload = abi.encode(_toAddress, _tokenIds);
        return lzEndpoint.estimateFees(_dstChainId, address(this), payload, _useZro, _adapterParams);
    }

    function sendFrom(uint16 _dstChainId, bytes memory _toAddress, uint16[] memory _tokenIds, address payable _refundAddress, address _zroPaymentAddress, bytes memory _adapterParams) public payable virtual override {
        _send(msg.sender, _dstChainId, _toAddress, _tokenIds, _refundAddress, _zroPaymentAddress, _adapterParams);
    }

    function _send(address _from, uint16 _dstChainId, bytes memory _toAddress, uint16[] memory _tokenIds, address payable _refundAddress, address _zroPaymentAddress, bytes memory _adapterParams) internal virtual {
        _debitFrom(_from, _dstChainId, _toAddress, _tokenIds);

        bytes memory payload = abi.encode(_toAddress, _tokenIds);
        _lzSend(_dstChainId, payload, _refundAddress, _zroPaymentAddress, _adapterParams);

        uint64 nonce = lzEndpoint.getOutboundNonce(_dstChainId, address(this));
        emit SendToChain(_from, _dstChainId, _toAddress, _tokenIds, nonce);
    }

    function _nonblockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual override {
        // decode and load the toAddress
        (bytes memory toAddressBytes, uint16[] memory tokenIds) = abi.decode(_payload, (bytes, uint16[]));
        address toAddress;
        assembly {
            toAddress := mload(add(toAddressBytes, 20))
        }

        _creditTo(_srcChainId, toAddress, tokenIds);

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

    function _debitFrom(address _from, uint16 _dstChainId, bytes memory _toAddress, uint16[] memory _tokenIds) internal virtual;

    function _creditTo(uint16 _srcChainId, address _toAddress, uint16[] memory _tokenIds) internal virtual;
}


// File @openzeppelin/contracts/token/ERC721/[email protected]

// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}


// File @openzeppelin/contracts/token/ERC721/[email protected]

// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}


// File @openzeppelin/contracts/utils/[email protected]

// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


// File @openzeppelin/contracts/utils/[email protected]

// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}


// File @openzeppelin/contracts/token/ERC721/[email protected]

// OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;







/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}


// File contracts/LzBridge/AxolittlesArb.sol


pragma solidity ^0.8.0;
contract AxolittlesArb is Ownable, ONFT721Core, ERC721 {
    uint256 public totalSupply = 10000;
    string public _baseTokenURI;

    constructor(address _lzEndpoint) ERC721("Axolittles", "AXOLITTLE") ONFT721Core(_lzEndpoint) {}

    function supportsInterface(bytes4 interfaceId) public view virtual override(ONFT721Core, ERC721) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

    function _debitFrom(address _from, uint16, bytes memory, uint16[] memory _tokenIds) internal virtual override {
        for (uint16 i = 0; i < _tokenIds.length;) {
            require(ERC721.ownerOf(_tokenIds[i]) == _from, "Axolittles: incorrect owner");
            _burn(_tokenIds[i]);
            unchecked { ++i; }
        }
    }

    function _creditTo(uint16, address _toAddress, uint16[] memory _tokenIds) internal virtual override {
        for (uint16 i = 0; i < _tokenIds.length;) {
            require(!_exists(_tokenIds[i]), "Axolittles: already exist");
            _safeMint(_toAddress, _tokenIds[i]);
            unchecked { ++i; }
        }
    }

    // set base URI for token metadata. Allows file host change to ipfs
    function setBaseTokenURI(string memory __baseTokenURI) external onlyOwner {
        _baseTokenURI = __baseTokenURI;
    }

    // Returns a URI for a given token ID's metadata
    function tokenURI(uint256 _tokenId)
        public
        view
        override
        returns (string memory)
    {
        return
            string(abi.encodePacked(_baseTokenURI, Strings.toString(_tokenId)));
    }

    function adminRecover(address _to, uint16 _tokenId, bool isMint) external onlyOwner {
        if (isMint) {
            _safeMint(_to, _tokenId);
        }
        else {
            require(_exists(_tokenId), "Axolittles: doesn't exist");
            _burn(_tokenId);
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_lzEndpoint","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","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"}],"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":"uint16[]","name":"_tokenIds","type":"uint16[]"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"}],"name":"ReceiveFromChain","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_sender","type":"address"},{"indexed":true,"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"indexed":true,"internalType":"bytes","name":"_toAddress","type":"bytes"},{"indexed":false,"internalType":"uint16[]","name":"_tokenIds","type":"uint16[]"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"}],"name":"SendToChain","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"SetTrustedRemote","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint16","name":"_tokenId","type":"uint16"},{"internalType":"bool","name":"isMint","type":"bool"}],"name":"adminRecover","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes","name":"_toAddress","type":"bytes"},{"internalType":"uint16[]","name":"_tokenIds","type":"uint16[]"},{"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":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","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":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes","name":"_toAddress","type":"bytes"},{"internalType":"uint16[]","name":"_tokenIds","type":"uint16[]"},{"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":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"__baseTokenURI","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","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":"_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":"_srcAddress","type":"bytes"}],"name":"setTrustedRemote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","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"}]

60a06040526127106009553480156200001757600080fd5b5060405162003816380380620038168339810160408190526200003a91620001dd565b6040518060400160405280600a81526020016941786f6c6974746c657360b01b8152506040518060400160405280600981526020016841584f4c4954544c4560b81b8152508280806200009c62000096620000e360201b60201c565b620000e7565b60601b6001600160601b03191660805250508151620000c390600390602085019062000137565b508051620000d990600490602084019062000137565b505050506200024c565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b82805462000145906200020f565b90600052602060002090601f016020900481019282620001695760008555620001b4565b82601f106200018457805160ff1916838001178555620001b4565b82800160010185558215620001b4579182015b82811115620001b457825182559160200191906001019062000197565b50620001c2929150620001c6565b5090565b5b80821115620001c25760008155600101620001c7565b600060208284031215620001f057600080fd5b81516001600160a01b03811681146200020857600080fd5b9392505050565b600181811c908216806200022457607f821691505b602082108114156200024657634e487b7160e01b600052602260045260246000fd5b50919050565b60805160601c61356c620002aa6000396000818161055b015281816106e40152818161096e01528181610bb901528181610c9701528181610e68015281816111d70152818161151801528181611dd20152612370015261356c6000f3fe6080604052600436106102035760003560e01c806370a0823111610118578063cbed8b9c116100a0578063e985e9c51161006f578063e985e9c514610618578063eb8d72b714610661578063f2fde38b14610681578063f5ecbdbc146106a1578063fc0cd5eb146106c157600080fd5b8063cbed8b9c146105bd578063cfc86f7b146105dd578063d1deba1f146105f2578063e7bc3a201461060557600080fd5b806395d89b41116100e757806395d89b4114610514578063a22cb46514610529578063b353aaa714610549578063b88d4fde1461057d578063c87b56dd1461059d57600080fd5b806370a08231146104a1578063715018a6146104c15780637533d788146104d65780638da5cb5b146104f657600080fd5b806318160ddd1161019b57806342842e0e1161016a57806342842e0e146103d257806342d65a8d146103f25780635b8c41e6146104125780636352211e1461046157806366ad5c8a1461048157600080fd5b806318160ddd1461034e57806323b872dd1461037257806330176e13146103925780633d8b38f6146103b257600080fd5b8063081812fc116101d7578063081812fc146102a1578063095ea7b3146102d95780630a54dda1146102f957806310ddb1371461032e57600080fd5b80621d35671461020857806301ffc9a71461022a57806306fdde031461025f57806307e0db1714610281575b600080fd5b34801561021457600080fd5b50610228610223366004612d55565b6106e1565b005b34801561023657600080fd5b5061024a610245366004612994565b610888565b60405190151581526020015b60405180910390f35b34801561026b57600080fd5b50610274610899565b60405161025691906130db565b34801561028d57600080fd5b5061022861029c366004612b14565b61092b565b3480156102ad57600080fd5b506102c16102bc366004612e96565b6109cf565b6040516001600160a01b039091168152602001610256565b3480156102e557600080fd5b506102286102f4366004612968565b610a64565b34801561030557600080fd5b50610319610314366004612c47565b610b7a565b60408051928352602083019190915201610256565b34801561033a57600080fd5b50610228610349366004612b14565b610c54565b34801561035a57600080fd5b5061036460095481565b604051908152602001610256565b34801561037e57600080fd5b5061022861038d366004612840565b610cce565b34801561039e57600080fd5b506102286103ad366004612acc565b610cff565b3480156103be57600080fd5b5061024a6103cd366004612b31565b610d40565b3480156103de57600080fd5b506102286103ed366004612840565b610e0c565b3480156103fe57600080fd5b5061022861040d366004612b31565b610e27565b34801561041e57600080fd5b5061036461042d366004612cf2565b6002602090815260009384526040808520845180860184018051928152908401958401959095209452929052825290205481565b34801561046d57600080fd5b506102c161047c366004612e96565b610ed8565b34801561048d57600080fd5b5061022861049c366004612d55565b610f4f565b3480156104ad57600080fd5b506103646104bc3660046127ea565b610fbf565b3480156104cd57600080fd5b50610228611046565b3480156104e257600080fd5b506102746104f1366004612b14565b61107c565b34801561050257600080fd5b506000546001600160a01b03166102c1565b34801561052057600080fd5b50610274611116565b34801561053557600080fd5b506102286105443660046128ec565b611125565b34801561055557600080fd5b506102c17f000000000000000000000000000000000000000000000000000000000000000081565b34801561058957600080fd5b50610228610598366004612881565b611130565b3480156105a957600080fd5b506102746105b8366004612e96565b611162565b3480156105c957600080fd5b506102286105d8366004612e24565b611196565b3480156105e957600080fd5b5061027461124d565b610228610600366004612d55565b61125a565b610228610613366004612b85565b6113ac565b34801561062457600080fd5b5061024a610633366004612807565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b34801561066d57600080fd5b5061022861067c366004612b31565b6113c3565b34801561068d57600080fd5b5061022861069c3660046127ea565b61144c565b3480156106ad57600080fd5b506102746106bc366004612dd3565b6114e7565b3480156106cd57600080fd5b506102286106dc366004612921565b6115a9565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461075e5760405162461bcd60e51b815260206004820152601e60248201527f4c7a4170703a20696e76616c696420656e64706f696e742063616c6c6572000060448201526064015b60405180910390fd5b61ffff84166000908152600160205260408120805461077c90613424565b80601f01602080910402602001604051908101604052809291908181526020018280546107a890613424565b80156107f55780601f106107ca576101008083540402835291602001916107f5565b820191906000526020600020905b8154815290600101906020018083116107d857829003601f168201915b505050505090508051845114801561081a575080805190602001208480519060200120145b6108755760405162461bcd60e51b815260206004820152602660248201527f4c7a4170703a20696e76616c696420736f757263652073656e64696e6720636f6044820152651b9d1c9858dd60d21b6064820152608401610755565b6108818585858561165d565b5050505050565b60006108938261174e565b92915050565b6060600380546108a890613424565b80601f01602080910402602001604051908101604052809291908181526020018280546108d490613424565b80156109215780601f106108f657610100808354040283529160200191610921565b820191906000526020600020905b81548152906001019060200180831161090457829003601f168201915b5050505050905090565b6000546001600160a01b031633146109555760405162461bcd60e51b815260040161075590613165565b6040516307e0db1760e01b815261ffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906307e0db17906024015b600060405180830381600087803b1580156109bb57600080fd5b505af1158015610881573d6000803e3d6000fd5b6000818152600560205260408120546001600160a01b0316610a485760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610755565b506000908152600760205260409020546001600160a01b031690565b6000610a6f82610ed8565b9050806001600160a01b0316836001600160a01b03161415610add5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610755565b336001600160a01b0382161480610af95750610af98133610633565b610b6b5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610755565b610b75838361178e565b505050565b60008060008686604051602001610b929291906130ee565b60408051601f198184030181529082905263040a7bb160e41b825291506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906340a7bb1090610bf6908b90309086908b908b906004016131eb565b604080518083038186803b158015610c0d57600080fd5b505afa158015610c21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c459190612eaf565b92509250509550959350505050565b6000546001600160a01b03163314610c7e5760405162461bcd60e51b815260040161075590613165565b6040516310ddb13760e01b815261ffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906310ddb137906024016109a1565b610cd833826117fc565b610cf45760405162461bcd60e51b81526004016107559061319a565b610b758383836118ef565b6000546001600160a01b03163314610d295760405162461bcd60e51b815260040161075590613165565b8051610d3c90600a906020840190612560565b5050565b61ffff831660009081526001602052604081208054829190610d6190613424565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8d90613424565b8015610dda5780601f10610daf57610100808354040283529160200191610dda565b820191906000526020600020905b815481529060010190602001808311610dbd57829003601f168201915b505050505090508383604051610df1929190612fa0565b60405180910390208180519060200120149150509392505050565b610b7583838360405180602001604052806000815250611130565b6000546001600160a01b03163314610e515760405162461bcd60e51b815260040161075590613165565b6040516342d65a8d60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906342d65a8d90610ea19086908690869060040161323f565b600060405180830381600087803b158015610ebb57600080fd5b505af1158015610ecf573d6000803e3d6000fd5b50505050505050565b6000818152600560205260408120546001600160a01b0316806108935760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610755565b333014610fad5760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d7573742062656044820152650204c7a4170760d41b6064820152608401610755565b610fb984848484611a8f565b50505050565b60006001600160a01b03821661102a5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610755565b506001600160a01b031660009081526006602052604090205490565b6000546001600160a01b031633146110705760405162461bcd60e51b815260040161075590613165565b61107a6000611b22565b565b6001602052600090815260409020805461109590613424565b80601f01602080910402602001604051908101604052809291908181526020018280546110c190613424565b801561110e5780601f106110e35761010080835404028352916020019161110e565b820191906000526020600020905b8154815290600101906020018083116110f157829003601f168201915b505050505081565b6060600480546108a890613424565b610d3c338383611b72565b61113a33836117fc565b6111565760405162461bcd60e51b81526004016107559061319a565b610fb984848484611c41565b6060600a61116f83611c74565b604051602001611180929190612fcc565b6040516020818303038152906040529050919050565b6000546001600160a01b031633146111c05760405162461bcd60e51b815260040161075590613165565b6040516332fb62e760e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063cbed8b9c90611214908890889088908890889060040161330d565b600060405180830381600087803b15801561122e57600080fd5b505af1158015611242573d6000803e3d6000fd5b505050505050505050565b600a805461109590613424565b61ffff8416600090815260026020526040808220905161127b908690612fb0565b90815260408051602092819003830190206001600160401b038616600090815292529020549050806112fb5760405162461bcd60e51b815260206004820152602360248201527f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d65737360448201526261676560e81b6064820152608401610755565b81516020830120811461135a5760405162461bcd60e51b815260206004820152602160248201527f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f616044820152601960fa1b6064820152608401610755565b61ffff8516600090815260026020526040808220905161137b908790612fb0565b90815260408051602092819003830190206001600160401b0387166000908152925290205561088185858585611a8f565b6113bb33878787878787611d71565b505050505050565b6000546001600160a01b031633146113ed5760405162461bcd60e51b815260040161075590613165565b61ffff8316600090815260016020526040902061140b9083836125e4565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab83838360405161143f9392919061323f565b60405180910390a1505050565b6000546001600160a01b031633146114765760405162461bcd60e51b815260040161075590613165565b6001600160a01b0381166114db5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610755565b6114e481611b22565b50565b604051633d7b2f6f60e21b815261ffff808616600483015284166024820152306044820152606481018290526060907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f5ecbdbc9060840160006040518083038186803b15801561156257600080fd5b505afa158015611576573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261159e91908101906129ce565b90505b949350505050565b6000546001600160a01b031633146115d35760405162461bcd60e51b815260040161075590613165565b80156115e757610b75838361ffff16611ebf565b61ffff82166000908152600560205260409020546001600160a01b03166116505760405162461bcd60e51b815260206004820152601960248201527f41786f6c6974746c65733a20646f65736e2774206578697374000000000000006044820152606401610755565b610b758261ffff16611ed9565b604051633356ae4560e11b815230906366ad5c8a906116869087908790879087906004016132c4565b600060405180830381600087803b1580156116a057600080fd5b505af19250505080156116b1575060015b610fb9578080519060200120600260008661ffff1661ffff168152602001908152602001600020846040516116e69190612fb0565b9081526040805191829003602090810183206001600160401b0387166000908152915220919091557fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d906117419086908690869086906132c4565b60405180910390a1610fb9565b60006001600160e01b031982166380ac58cd60e01b148061177f57506001600160e01b03198216635b5e139f60e01b145b80610893575061089382611f74565b600081815260076020526040902080546001600160a01b0319166001600160a01b03841690811790915581906117c382610ed8565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600560205260408120546001600160a01b03166118755760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610755565b600061188083610ed8565b9050806001600160a01b0316846001600160a01b031614806118bb5750836001600160a01b03166118b0846109cf565b6001600160a01b0316145b806115a157506001600160a01b0380821660009081526008602090815260408083209388168352929052205460ff166115a1565b826001600160a01b031661190282610ed8565b6001600160a01b03161461196a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610755565b6001600160a01b0382166119cc5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610755565b6119d760008261178e565b6001600160a01b0383166000908152600660205260408120805460019290611a009084906133e1565b90915550506001600160a01b0382166000908152600660205260408120805460019290611a2e9084906133b5565b909155505060008181526005602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60008082806020019051810190611aa69190612a02565b60148201519193509150611abb878284611fa9565b806001600160a01b031686604051611ad39190612fb0565b60405180910390208861ffff167fbd66934b09dec04b3aea2d88b8893e2844133810be0e2298aa6f6a28aa65795f8589604051611b119291906130b0565b60405180910390a450505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b03161415611bd45760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610755565b6001600160a01b03838116600081815260086020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611c4c8484846118ef565b611c588484848461207b565b610fb95760405162461bcd60e51b815260040161075590613113565b606081611c985750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611cc25780611cac8161345f565b9150611cbb9050600a836133cd565b9150611c9c565b6000816001600160401b03811115611cdc57611cdc6134d0565b6040519080825280601f01601f191660200182016040528015611d06576020820181803683370190505b5090505b84156115a157611d1b6001836133e1565b9150611d28600a8661347a565b611d339060306133b5565b60f81b818381518110611d4857611d486134ba565b60200101906001600160f81b031916908160001a905350611d6a600a866133cd565b9450611d0a565b611d7d87878787612185565b60008585604051602001611d929291906130ee565b6040516020818303038152906040529050611db08782868686612251565b604051630f428ae960e31b815261ffff881660048201523060248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690637a1457489060440160206040518083038186803b158015611e1c57600080fd5b505afa158015611e30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e549190612ed3565b905086604051611e649190612fb0565b60405180910390208861ffff168a6001600160a01b03167fb7ea7294afa99e68f724ddc625e6ecf2086863430067ce6ff5cd4404445d32228985604051611eac9291906130b0565b60405180910390a4505050505050505050565b610d3c8282604051806020016040528060008152506123eb565b6000611ee482610ed8565b9050611ef160008361178e565b6001600160a01b0381166000908152600660205260408120805460019290611f1a9084906133e1565b909155505060008281526005602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60006001600160e01b0319821663ede8e78160e01b148061089357506301ffc9a760e01b6001600160e01b0319831614610893565b60005b81518161ffff161015610fb957611ffb828261ffff1681518110611fd257611fd26134ba565b602002602001015161ffff166000908152600560205260409020546001600160a01b0316151590565b156120485760405162461bcd60e51b815260206004820152601960248201527f41786f6c6974746c65733a20616c7265616479206578697374000000000000006044820152606401610755565b61207383838361ffff1681518110612062576120626134ba565b602002602001015161ffff16611ebf565b600101611fac565b60006001600160a01b0384163b1561217d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906120bf903390899088908890600401613073565b602060405180830381600087803b1580156120d957600080fd5b505af1925050508015612109575060408051601f3d908101601f19168201909252612106918101906129b1565b60015b612163573d808015612137576040519150601f19603f3d011682016040523d82523d6000602084013e61213c565b606091505b50805161215b5760405162461bcd60e51b815260040161075590613113565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506115a1565b5060016115a1565b60005b81518161ffff16101561088157846001600160a01b03166121c9838361ffff16815181106121b8576121b86134ba565b602002602001015161ffff16610ed8565b6001600160a01b03161461221f5760405162461bcd60e51b815260206004820152601b60248201527f41786f6c6974746c65733a20696e636f7272656374206f776e657200000000006044820152606401610755565b612249828261ffff1681518110612238576122386134ba565b602002602001015161ffff16611ed9565b600101612188565b61ffff85166000908152600160205260408120805461226f90613424565b80601f016020809104026020016040519081016040528092919081815260200182805461229b90613424565b80156122e85780601f106122bd576101008083540402835291602001916122e8565b820191906000526020600020905b8154815290600101906020018083116122cb57829003601f168201915b5050505050905080516000141561235a5760405162461bcd60e51b815260206004820152603060248201527f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060448201526f61207472757374656420736f7572636560801b6064820152608401610755565b60405162c5803160e81b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063c58031009034906123b1908a9086908b908b908b908b9060040161325d565b6000604051808303818588803b1580156123ca57600080fd5b505af11580156123de573d6000803e3d6000fd5b5050505050505050505050565b6123f5838361241e565b612402600084848461207b565b610b755760405162461bcd60e51b815260040161075590613113565b6001600160a01b0382166124745760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610755565b6000818152600560205260409020546001600160a01b0316156124d95760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610755565b6001600160a01b03821660009081526006602052604081208054600192906125029084906133b5565b909155505060008181526005602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461256c90613424565b90600052602060002090601f01602090048101928261258e57600085556125d4565b82601f106125a757805160ff19168380011785556125d4565b828001600101855582156125d4579182015b828111156125d45782518255916020019190600101906125b9565b506125e0929150612658565b5090565b8280546125f090613424565b90600052602060002090601f01602090048101928261261257600085556125d4565b82601f1061262b5782800160ff198235161785556125d4565b828001600101855582156125d4579182015b828111156125d457823582559160200191906001019061263d565b5b808211156125e05760008155600101612659565b600061268061267b8461338e565b61333b565b905082815283838301111561269457600080fd5b828260208301376000602084830101529392505050565b600082601f8301126126bc57600080fd5b813560206126cc61267b8361336b565b80838252828201915082860187848660051b89010111156126ec57600080fd5b60005b8581101561271457813561270281613511565b845292840192908401906001016126ef565b5090979650505050505050565b8035801515811461273157600080fd5b919050565b60008083601f84011261274857600080fd5b5081356001600160401b0381111561275f57600080fd5b60208301915083602082850101111561277757600080fd5b9250929050565b600082601f83011261278f57600080fd5b61279e8383356020850161266d565b9392505050565b600082601f8301126127b657600080fd5b81516127c461267b8261338e565b8181528460208386010111156127d957600080fd5b6115a18260208301602087016133f8565b6000602082840312156127fc57600080fd5b813561279e816134e6565b6000806040838503121561281a57600080fd5b8235612825816134e6565b91506020830135612835816134e6565b809150509250929050565b60008060006060848603121561285557600080fd5b8335612860816134e6565b92506020840135612870816134e6565b929592945050506040919091013590565b6000806000806080858703121561289757600080fd5b84356128a2816134e6565b935060208501356128b2816134e6565b92506040850135915060608501356001600160401b038111156128d457600080fd5b6128e08782880161277e565b91505092959194509250565b600080604083850312156128ff57600080fd5b823561290a816134e6565b915061291860208401612721565b90509250929050565b60008060006060848603121561293657600080fd5b8335612941816134e6565b9250602084013561295181613511565b915061295f60408501612721565b90509250925092565b6000806040838503121561297b57600080fd5b8235612986816134e6565b946020939093013593505050565b6000602082840312156129a657600080fd5b813561279e816134fb565b6000602082840312156129c357600080fd5b815161279e816134fb565b6000602082840312156129e057600080fd5b81516001600160401b038111156129f657600080fd5b6115a1848285016127a5565b60008060408385031215612a1557600080fd5b82516001600160401b0380821115612a2c57600080fd5b612a38868387016127a5565b9350602091508185015181811115612a4f57600080fd5b85019050601f81018613612a6257600080fd5b8051612a7061267b8261336b565b80828252848201915084840189868560051b8701011115612a9057600080fd5b600094505b83851015612abc578051612aa881613511565b835260019490940193918501918501612a95565b5080955050505050509250929050565b600060208284031215612ade57600080fd5b81356001600160401b03811115612af457600080fd5b8201601f81018413612b0557600080fd5b6115a18482356020840161266d565b600060208284031215612b2657600080fd5b813561279e81613511565b600080600060408486031215612b4657600080fd5b8335612b5181613511565b925060208401356001600160401b03811115612b6c57600080fd5b612b7886828701612736565b9497909650939450505050565b60008060008060008060c08789031215612b9e57600080fd5b8635612ba981613511565b955060208701356001600160401b0380821115612bc557600080fd5b612bd18a838b0161277e565b96506040890135915080821115612be757600080fd5b612bf38a838b016126ab565b955060608901359150612c05826134e6565b909350608088013590612c17826134e6565b90925060a08801359080821115612c2d57600080fd5b50612c3a89828a0161277e565b9150509295509295509295565b600080600080600060a08688031215612c5f57600080fd5b8535612c6a81613511565b945060208601356001600160401b0380821115612c8657600080fd5b612c9289838a0161277e565b95506040880135915080821115612ca857600080fd5b612cb489838a016126ab565b9450612cc260608901612721565b93506080880135915080821115612cd857600080fd5b50612ce58882890161277e565b9150509295509295909350565b600080600060608486031215612d0757600080fd5b8335612d1281613511565b925060208401356001600160401b03811115612d2d57600080fd5b612d398682870161277e565b9250506040840135612d4a81613521565b809150509250925092565b60008060008060808587031215612d6b57600080fd5b8435612d7681613511565b935060208501356001600160401b0380821115612d9257600080fd5b612d9e8883890161277e565b945060408701359150612db082613521565b90925060608601359080821115612dc657600080fd5b506128e08782880161277e565b60008060008060808587031215612de957600080fd5b8435612df481613511565b93506020850135612e0481613511565b92506040850135612e14816134e6565b9396929550929360600135925050565b600080600080600060808688031215612e3c57600080fd5b8535612e4781613511565b94506020860135612e5781613511565b93506040860135925060608601356001600160401b03811115612e7957600080fd5b612e8588828901612736565b969995985093965092949392505050565b600060208284031215612ea857600080fd5b5035919050565b60008060408385031215612ec257600080fd5b505080516020909101519092909150565b600060208284031215612ee557600080fd5b815161279e81613521565b600081518084526020808501945080840160005b83811015612f2457815161ffff1687529582019590820190600101612f04565b509495945050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60008151808452612f708160208601602086016133f8565b601f01601f19169290920160200192915050565b60008151612f968185602086016133f8565b9290920192915050565b8183823760009101908152919050565b60008251612fc28184602087016133f8565b9190910192915050565b600080845481600182811c915080831680612fe857607f831692505b602080841082141561300857634e487b7160e01b86526022600452602486fd5b81801561301c576001811461302d5761305a565b60ff1986168952848901965061305a565b60008b81526020902060005b868110156130525781548b820152908501908301613039565b505084890196505b50505050505061306a8185612f84565b95945050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906130a690830184612f58565b9695505050505050565b6040815260006130c36040830185612ef0565b90506001600160401b03831660208301529392505050565b60208152600061279e6020830184612f58565b6040815260006131016040830185612f58565b828103602084015261306a8185612ef0565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b61ffff861681526001600160a01b038516602082015260a06040820181905260009061321990830186612f58565b841515606084015282810360808401526132338185612f58565b98975050505050505050565b61ffff8416815260406020820152600061159e604083018486612f2f565b61ffff8716815260c06020820152600061327a60c0830188612f58565b828103604084015261328c8188612f58565b6001600160a01b0387811660608601528616608085015283810360a085015290506132b78185612f58565b9998505050505050505050565b61ffff851681526080602082015260006132e16080830186612f58565b6001600160401b038516604084015282810360608401526133028185612f58565b979650505050505050565b600061ffff808816835280871660208401525084604083015260806060830152613302608083018486612f2f565b604051601f8201601f191681016001600160401b0381118282101715613363576133636134d0565b604052919050565b60006001600160401b03821115613384576133846134d0565b5060051b60200190565b60006001600160401b038211156133a7576133a76134d0565b50601f01601f191660200190565b600082198211156133c8576133c861348e565b500190565b6000826133dc576133dc6134a4565b500490565b6000828210156133f3576133f361348e565b500390565b60005b838110156134135781810151838201526020016133fb565b83811115610fb95750506000910152565b600181811c9082168061343857607f821691505b6020821081141561345957634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156134735761347361348e565b5060010190565b600082613489576134896134a4565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146114e457600080fd5b6001600160e01b0319811681146114e457600080fd5b61ffff811681146114e457600080fd5b6001600160401b03811681146114e457600080fdfea26469706673582212200328b50d7fac21078212c9b54dbb0d683864aa70ecb7db9bb3531cd64985bf5064736f6c634300080700330000000000000000000000003c2269811836af69497e5f486a85d7316753cf62

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

0000000000000000000000003c2269811836af69497e5f486a85d7316753cf62

-----Decoded View---------------
Arg [0] : _lzEndpoint (address): 0x3c2269811836af69497e5f486a85d7316753cf62

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000003c2269811836af69497e5f486a85d7316753cf62


Deployed ByteCode Sourcemap

55082:1897:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14661:730;;;;;;;;;;-1:-1:-1;14661:730:0;;;;;:::i;:::-;;:::i;:::-;;55323:174;;;;;;;;;;-1:-1:-1;55323:174:0;;;;;:::i;:::-;;:::i;:::-;;;18217:14:1;;18210:22;18192:41;;18180:2;18165:18;55323:174:0;;;;;;;;43510:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;16747:123::-;;;;;;;;;;-1:-1:-1;16747:123:0;;;;;:::i;:::-;;:::i;45069:221::-;;;;;;;;;;-1:-1:-1;45069:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;17147:32:1;;;17129:51;;17117:2;17102:18;45069:221:0;16983:203:1;44592:411:0;;;;;;;;;;-1:-1:-1;44592:411:0;;;;;:::i;:::-;;:::i;21967:425::-;;;;;;;;;;-1:-1:-1;21967:425:0;;;;;:::i;:::-;;:::i;:::-;;;;33246:25:1;;;33302:2;33287:18;;33280:34;;;;33219:18;21967:425:0;33072:248:1;16878:129:0;;;;;;;;;;-1:-1:-1;16878:129:0;;;;;:::i;:::-;;:::i;55144:34::-;;;;;;;;;;;;;;;;;;;18390:25:1;;;18378:2;18363:18;55144:34:0;18244:177:1;45819:339:0;;;;;;;;;;-1:-1:-1;45819:339:0;;;;;:::i;:::-;;:::i;56263:123::-;;;;;;;;;;-1:-1:-1;56263:123:0;;;;;:::i;:::-;;:::i;17563:250::-;;;;;;;;;;-1:-1:-1;17563:250:0;;;;;:::i;:::-;;:::i;46229:185::-;;;;;;;;;;-1:-1:-1;46229:185:0;;;;;:::i;:::-;;:::i;17015:178::-;;;;;;;;;;-1:-1:-1;17015:178:0;;;;;:::i;:::-;;:::i;18362:85::-;;;;;;;;;;-1:-1:-1;18362:85:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43204:239;;;;;;;;;;-1:-1:-1;43204:239:0;;;;;:::i;:::-;;:::i;19144:342::-;;;;;;;;;;-1:-1:-1;19144:342:0;;;;;:::i;:::-;;:::i;42934:208::-;;;;;;;;;;-1:-1:-1;42934:208:0;;;;;:::i;:::-;;:::i;5510:103::-;;;;;;;;;;;;;:::i;14431:51::-;;;;;;;;;;-1:-1:-1;14431:51:0;;;;;:::i;:::-;;:::i;4859:87::-;;;;;;;;;;-1:-1:-1;4905:7:0;4932:6;-1:-1:-1;;;;;4932:6:0;4859:87;;43679:104;;;;;;;;;;;;;:::i;45362:155::-;;;;;;;;;;-1:-1:-1;45362:155:0;;;;;:::i;:::-;;:::i;14376:46::-;;;;;;;;;;;;;;;46485:328;;;;;;;;;;-1:-1:-1;46485:328:0;;;;;:::i;:::-;;:::i;56448:228::-;;;;;;;;;;-1:-1:-1;56448:228:0;;;;;:::i;:::-;;:::i;16535:204::-;;;;;;;;;;-1:-1:-1;16535:204:0;;;;;:::i;:::-;;:::i;55185:27::-;;;;;;;;;;;;;:::i;19672:681::-;;;;;;:::i;:::-;;:::i;22400:335::-;;;;;;:::i;:::-;;:::i;45588:164::-;;;;;;;;;;-1:-1:-1;45588:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;45709:25:0;;;45685:4;45709:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;45588:164;17247:216;;;;;;;;;;-1:-1:-1;17247:216:0;;;;;:::i;:::-;;:::i;5768:201::-;;;;;;;;;;-1:-1:-1;5768:201:0;;;;;:::i;:::-;;:::i;16262:211::-;;;;;;;;;;-1:-1:-1;16262:211:0;;;;;:::i;:::-;;:::i;56684:292::-;;;;;;;;;;-1:-1:-1;56684:292:0;;;;;:::i;:::-;;:::i;14661:730::-;3659:10;14897;-1:-1:-1;;;;;14873:35:0;;14865:78;;;;-1:-1:-1;;;14865:78:0;;27604:2:1;14865:78:0;;;27586:21:1;27643:2;27623:18;;;27616:30;27682:32;27662:18;;;27655:60;27732:18;;14865:78:0;;;;;;;;;14985:32;;;14956:26;14985:32;;;:19;:32;;;;;14956:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15191:13;:20;15169:11;:18;:42;:96;;;;;15251:13;15241:24;;;;;;15225:11;15215:22;;;;;;:50;15169:96;15161:147;;;;-1:-1:-1;;;15161:147:0;;28783:2:1;15161:147:0;;;28765:21:1;28822:2;28802:18;;;28795:30;28861:34;28841:18;;;28834:62;-1:-1:-1;;;28912:18:1;;;28905:36;28958:19;;15161:147:0;28581:402:1;15161:147:0;15321:62;15340:11;15353;15366:6;15374:8;15321:18;:62::i;:::-;14788:603;14661:730;;;;:::o;55323:174::-;55429:4;55453:36;55477:11;55453:23;:36::i;:::-;55446:43;55323:174;-1:-1:-1;;55323:174:0:o;43510:100::-;43564:13;43597:5;43590:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43510:100;:::o;16747:123::-;4905:7;4932:6;-1:-1:-1;;;;;4932:6:0;3659:10;5079:23;5071:68;;;;-1:-1:-1;;;5071:68:0;;;;;;;:::i;:::-;16827:35:::1;::::0;-1:-1:-1;;;16827:35:0;;29162:6:1;29150:19;;16827:35:0::1;::::0;::::1;29132:38:1::0;16827:10:0::1;-1:-1:-1::0;;;;;16827:25:0::1;::::0;::::1;::::0;29105:18:1;;16827:35:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;45069:221:::0;45145:7;48412:16;;;:7;:16;;;;;;-1:-1:-1;;;;;48412:16:0;45165:73;;;;-1:-1:-1;;;45165:73:0;;25308:2:1;45165:73:0;;;25290:21:1;25347:2;25327:18;;;25320:30;25386:34;25366:18;;;25359:62;-1:-1:-1;;;25437:18:1;;;25430:42;25489:19;;45165:73:0;25106:408:1;45165:73:0;-1:-1:-1;45258:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;45258:24:0;;45069:221::o;44592:411::-;44673:13;44689:23;44704:7;44689:14;:23::i;:::-;44673:39;;44737:5;-1:-1:-1;;;;;44731:11:0;:2;-1:-1:-1;;;;;44731:11:0;;;44723:57;;;;-1:-1:-1;;;44723:57:0;;27202:2:1;44723:57:0;;;27184:21:1;27241:2;27221:18;;;27214:30;27280:34;27260:18;;;27253:62;-1:-1:-1;;;27331:18:1;;;27324:31;27372:19;;44723:57:0;27000:397:1;44723:57:0;3659:10;-1:-1:-1;;;;;44815:21:0;;;;:62;;-1:-1:-1;44840:37:0;44857:5;3659:10;45588:164;:::i;44840:37::-;44793:168;;;;-1:-1:-1;;;44793:168:0;;23347:2:1;44793:168:0;;;23329:21:1;23386:2;23366:18;;;23359:30;23425:34;23405:18;;;23398:62;23496:26;23476:18;;;23469:54;23540:19;;44793:168:0;23145:420:1;44793:168:0;44974:21;44983:2;44987:7;44974:8;:21::i;:::-;44662:341;44592:411;;:::o;21967:425::-;22145:14;22161:11;22225:20;22259:10;22271:9;22248:33;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;22248:33:0;;;;;;;;;;-1:-1:-1;;;22299:85:0;;22248:33;-1:-1:-1;;;;;;22299:10:0;:23;;;;:85;;22323:11;;22344:4;;22248:33;;22360:7;;22369:14;;22299:85;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22292:92;;;;;21967:425;;;;;;;;:::o;16878:129::-;4905:7;4932:6;-1:-1:-1;;;;;4932:6:0;3659:10;5079:23;5071:68;;;;-1:-1:-1;;;5071:68:0;;;;;;;:::i;:::-;16961:38:::1;::::0;-1:-1:-1;;;16961:38:0;;29162:6:1;29150:19;;16961:38:0::1;::::0;::::1;29132::1::0;16961:10:0::1;-1:-1:-1::0;;;;;16961:28:0::1;::::0;::::1;::::0;29105:18:1;;16961:38:0::1;28988:188:1::0;45819:339:0;46014:41;3659:10;46047:7;46014:18;:41::i;:::-;46006:103;;;;-1:-1:-1;;;46006:103:0;;;;;;;:::i;:::-;46122:28;46132:4;46138:2;46142:7;46122:9;:28::i;56263:123::-;4905:7;4932:6;-1:-1:-1;;;;;4932:6:0;3659:10;5079:23;5071:68;;;;-1:-1:-1;;;5071:68:0;;;;;;;:::i;:::-;56348:30;;::::1;::::0;:13:::1;::::0;:30:::1;::::0;::::1;::::0;::::1;:::i;:::-;;56263:123:::0;:::o;17563:250::-;17705:32;;;17659:4;17705:32;;;:19;:32;;;;;17676:61;;17659:4;;17705:32;17676:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17793:11;;17783:22;;;;;;;:::i;:::-;;;;;;;;17765:13;17755:24;;;;;;:50;17748:57;;;17563:250;;;;;:::o;46229:185::-;46367:39;46384:4;46390:2;46394:7;46367:39;;;;;;;;;;;;:16;:39::i;17015:178::-;4905:7;4932:6;-1:-1:-1;;;;;4932:6:0;3659:10;5079:23;5071:68;;;;-1:-1:-1;;;5071:68:0;;;;;;;:::i;:::-;17130:55:::1;::::0;-1:-1:-1;;;17130:55:0;;-1:-1:-1;;;;;17130:10:0::1;:29;::::0;::::1;::::0;:55:::1;::::0;17160:11;;17173;;;;17130:55:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;17015:178:::0;;;:::o;43204:239::-;43276:7;43312:16;;;:7;:16;;;;;;-1:-1:-1;;;;;43312:16:0;43347:19;43339:73;;;;-1:-1:-1;;;43339:73:0;;24183:2:1;43339:73:0;;;24165:21:1;24222:2;24202:18;;;24195:30;24261:34;24241:18;;;24234:62;-1:-1:-1;;;24312:18:1;;;24305:39;24361:19;;43339:73:0;23981:405:1;19144:342:0;3659:10;19354:4;19330:29;19322:80;;;;-1:-1:-1;;;19322:80:0;;19764:2:1;19322:80:0;;;19746:21:1;19803:2;19783:18;;;19776:30;19842:34;19822:18;;;19815:62;-1:-1:-1;;;19893:18:1;;;19886:36;19939:19;;19322:80:0;19562:402:1;19322:80:0;19413:65;19435:11;19448;19461:6;19469:8;19413:21;:65::i;:::-;19144:342;;;;:::o;42934:208::-;43006:7;-1:-1:-1;;;;;43034:19:0;;43026:74;;;;-1:-1:-1;;;43026:74:0;;23772:2:1;43026:74:0;;;23754:21:1;23811:2;23791:18;;;23784:30;23850:34;23830:18;;;23823:62;-1:-1:-1;;;23901:18:1;;;23894:40;23951:19;;43026:74:0;23570:406:1;43026:74:0;-1:-1:-1;;;;;;43118:16:0;;;;;:9;:16;;;;;;;42934:208::o;5510:103::-;4905:7;4932:6;-1:-1:-1;;;;;4932:6:0;3659:10;5079:23;5071:68;;;;-1:-1:-1;;;5071:68:0;;;;;;;:::i;:::-;5575:30:::1;5602:1;5575:18;:30::i;:::-;5510:103::o:0;14431:51::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43679:104::-;43735:13;43768:7;43761:14;;;;;:::i;45362:155::-;45457:52;3659:10;45490:8;45500;45457:18;:52::i;46485:328::-;46660:41;3659:10;46693:7;46660:18;:41::i;:::-;46652:103;;;;-1:-1:-1;;;46652:103:0;;;;;;;:::i;:::-;46766:39;46780:4;46786:2;46790:7;46799:5;46766:13;:39::i;56448:228::-;56550:13;56625;56640:26;56657:8;56640:16;:26::i;:::-;56608:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56581:87;;56448:228;;;:::o;16535:204::-;4905:7;4932:6;-1:-1:-1;;;;;4932:6:0;3659:10;5079:23;5071:68;;;;-1:-1:-1;;;5071:68:0;;;;;;;:::i;:::-;16669:62:::1;::::0;-1:-1:-1;;;16669:62:0;;-1:-1:-1;;;;;16669:10:0::1;:20;::::0;::::1;::::0;:62:::1;::::0;16690:8;;16700;;16710:11;;16723:7;;;;16669:62:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;16535:204:::0;;;;;:::o;55185:27::-;;;;;;;:::i;19672:681::-;19879:27;;;19857:19;19879:27;;;:14;:27;;;;;;:40;;;;19907:11;;19879:40;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19879:48:0;;;;;;;;;;;;-1:-1:-1;19879:48:0;19938:73;;;;-1:-1:-1;;;19938:73:0;;21354:2:1;19938:73:0;;;21336:21:1;21393:2;21373:18;;;21366:30;21432:34;21412:18;;;21405:62;-1:-1:-1;;;21483:18:1;;;21476:33;21526:19;;19938:73:0;21152:399:1;19938:73:0;20030:19;;;;;;:34;;20022:80;;;;-1:-1:-1;;;20022:80:0;;28381:2:1;20022:80:0;;;28363:21:1;28420:2;28400:18;;;28393:30;28459:34;28439:18;;;28432:62;-1:-1:-1;;;28510:18:1;;;28503:31;28551:19;;20022:80:0;28179:397:1;20022:80:0;20150:27;;;20209:1;20150:27;;;:14;:27;;;;;;:40;;;;20178:11;;20150:40;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20150:48:0;;;;;;;;;;:61;20280:65;20302:11;20315;20150:48;20336:8;20280:21;:65::i;22400:335::-;22622:105;22628:10;22640:11;22653:10;22665:9;22676:14;22692:18;22712:14;22622:5;:105::i;:::-;22400:335;;;;;;:::o;17247:216::-;4905:7;4932:6;-1:-1:-1;;;;;4932:6:0;3659:10;5079:23;5071:68;;;;-1:-1:-1;;;5071:68:0;;;;;;;:::i;:::-;17351:32:::1;::::0;::::1;;::::0;;;:19:::1;:32;::::0;;;;:46:::1;::::0;17386:11;;17351:46:::1;:::i;:::-;;17413:42;17430:11;17443;;17413:42;;;;;;;;:::i;:::-;;;;;;;;17247:216:::0;;;:::o;5768:201::-;4905:7;4932:6;-1:-1:-1;;;;;4932:6:0;3659:10;5079:23;5071:68;;;;-1:-1:-1;;;5071:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5857:22:0;::::1;5849:73;;;::::0;-1:-1:-1;;;5849:73:0;;20590:2:1;5849:73:0::1;::::0;::::1;20572:21:1::0;20629:2;20609:18;;;20602:30;20668:34;20648:18;;;20641:62;-1:-1:-1;;;20719:18:1;;;20712:36;20765:19;;5849:73:0::1;20388:402:1::0;5849:73:0::1;5933:28;5952:8;5933:18;:28::i;:::-;5768:201:::0;:::o;16262:211::-;16397:68;;-1:-1:-1;;;16397:68:0;;32163:6:1;32196:15;;;16397:68:0;;;32178:34:1;32248:15;;32228:18;;;32221:43;16446:4:0;32280:18:1;;;32273:60;32349:18;;;32342:34;;;16365:12:0;;16397:10;-1:-1:-1;;;;;16397:20:0;;;;32125:19:1;;16397:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;16397:68:0;;;;;;;;;;;;:::i;:::-;16390:75;;16262:211;;;;;;;:::o;56684:292::-;4905:7;4932:6;-1:-1:-1;;;;;4932:6:0;3659:10;5079:23;5071:68;;;;-1:-1:-1;;;5071:68:0;;;;;;;:::i;:::-;56783:6:::1;56779:190;;;56806:24;56816:3;56821:8;56806:24;;:9;:24::i;56779:190::-;56880:17;::::0;::::1;48388:4:::0;48412:16;;;:7;:16;;;;;;-1:-1:-1;;;;;48412:16:0;56872:55:::1;;;::::0;-1:-1:-1;;;56872:55:0;;26848:2:1;56872:55:0::1;::::0;::::1;26830:21:1::0;26887:2;26867:18;;;26860:30;26926:27;26906:18;;;26899:55;26971:18;;56872:55:0::1;26646:349:1::0;56872:55:0::1;56942:15;56948:8;56942:15;;:5;:15::i;18608:528::-:0;18805:69;;-1:-1:-1;;;18805:69:0;;:4;;:25;;:69;;18831:11;;18844;;18857:6;;18865:8;;18805:69;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18801:328;;19031:8;19021:19;;;;;;18970:14;:27;18985:11;18970:27;;;;;;;;;;;;;;;18998:11;18970:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18970:48:0;;;;;;;;;:70;;;;19060:57;;;;19074:11;;19087;;19011:6;;19108:8;;19060:57;:::i;:::-;;;;;;;;18801:328;;42565:305;42667:4;-1:-1:-1;;;;;;42704:40:0;;-1:-1:-1;;;42704:40:0;;:105;;-1:-1:-1;;;;;;;42761:48:0;;-1:-1:-1;;;42761:48:0;42704:105;:158;;;;42826:36;42850:11;42826:23;:36::i;52305:174::-;52380:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;52380:29:0;-1:-1:-1;;;;;52380:29:0;;;;;;;;:24;;52434:23;52380:24;52434:14;:23::i;:::-;-1:-1:-1;;;;;52425:46:0;;;;;;;;;;;52305:174;;:::o;48617:348::-;48710:4;48412:16;;;:7;:16;;;;;;-1:-1:-1;;;;;48412:16:0;48727:73;;;;-1:-1:-1;;;48727:73:0;;22517:2:1;48727:73:0;;;22499:21:1;22556:2;22536:18;;;22529:30;22595:34;22575:18;;;22568:62;-1:-1:-1;;;22646:18:1;;;22639:42;22698:19;;48727:73:0;22315:408:1;48727:73:0;48811:13;48827:23;48842:7;48827:14;:23::i;:::-;48811:39;;48880:5;-1:-1:-1;;;;;48869:16:0;:7;-1:-1:-1;;;;;48869:16:0;;:51;;;;48913:7;-1:-1:-1;;;;;48889:31:0;:20;48901:7;48889:11;:20::i;:::-;-1:-1:-1;;;;;48889:31:0;;48869:51;:87;;;-1:-1:-1;;;;;;45709:25:0;;;45685:4;45709:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;48924:32;45588:164;51609:578;51768:4;-1:-1:-1;;;;;51741:31:0;:23;51756:7;51741:14;:23::i;:::-;-1:-1:-1;;;;;51741:31:0;;51733:85;;;;-1:-1:-1;;;51733:85:0;;26438:2:1;51733:85:0;;;26420:21:1;26477:2;26457:18;;;26450:30;26516:34;26496:18;;;26489:62;-1:-1:-1;;;26567:18:1;;;26560:39;26616:19;;51733:85:0;26236:405:1;51733:85:0;-1:-1:-1;;;;;51837:16:0;;51829:65;;;;-1:-1:-1;;;51829:65:0;;21758:2:1;51829:65:0;;;21740:21:1;21797:2;21777:18;;;21770:30;21836:34;21816:18;;;21809:62;-1:-1:-1;;;21887:18:1;;;21880:34;21931:19;;51829:65:0;21556:400:1;51829:65:0;52011:29;52028:1;52032:7;52011:8;:29::i;:::-;-1:-1:-1;;;;;52053:15:0;;;;;;:9;:15;;;;;:20;;52072:1;;52053:15;:20;;52072:1;;52053:20;:::i;:::-;;;;-1:-1:-1;;;;;;;52084:13:0;;;;;;:9;:13;;;;;:18;;52101:1;;52084:13;:18;;52101:1;;52084:18;:::i;:::-;;;;-1:-1:-1;;52113:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;52113:21:0;-1:-1:-1;;;;;52113:21:0;;;;;;;;;52152:27;;52113:16;;52152:27;;;;;;;51609:578;;;:::o;23352:560::-;23547:27;23576:24;23615:8;23604:39;;;;;;;;;;;;:::i;:::-;23745:2;23725:23;;23719:30;23546:97;;-1:-1:-1;23546:97:0;-1:-1:-1;23772:43:0;23782:11;23719:30;23546:97;23772:9;:43::i;:::-;23876:9;-1:-1:-1;;;;;23833:71:0;23863:11;23833:71;;;;;;:::i;:::-;;;;;;;;23850:11;23833:71;;;23887:8;23897:6;23833:71;;;;;;;:::i;:::-;;;;;;;;23493:419;;;23352:560;;;;:::o;6129:191::-;6203:16;6222:6;;-1:-1:-1;;;;;6239:17:0;;;-1:-1:-1;;;;;;6239:17:0;;;;;;6272:40;;6222:6;;;;;;;6272:40;;6203:16;6272:40;6192:128;6129:191;:::o;52621:315::-;52776:8;-1:-1:-1;;;;;52767:17:0;:5;-1:-1:-1;;;;;52767:17:0;;;52759:55;;;;-1:-1:-1;;;52759:55:0;;22163:2:1;52759:55:0;;;22145:21:1;22202:2;22182:18;;;22175:30;22241:27;22221:18;;;22214:55;22286:18;;52759:55:0;21961:349:1;52759:55:0;-1:-1:-1;;;;;52825:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;52825:46:0;;;;;;;;;;52887:41;;18192::1;;;52887::0;;18165:18:1;52887:41:0;;;;;;;52621:315;;;:::o;47695:::-;47852:28;47862:4;47868:2;47872:7;47852:9;:28::i;:::-;47899:48;47922:4;47928:2;47932:7;47941:5;47899:22;:48::i;:::-;47891:111;;;;-1:-1:-1;;;47891:111:0;;;;;;;:::i;39410:723::-;39466:13;39687:10;39683:53;;-1:-1:-1;;39714:10:0;;;;;;;;;;;;-1:-1:-1;;;39714:10:0;;;;;39410:723::o;39683:53::-;39761:5;39746:12;39802:78;39809:9;;39802:78;;39835:8;;;;:::i;:::-;;-1:-1:-1;39858:10:0;;-1:-1:-1;39866:2:0;39858:10;;:::i;:::-;;;39802:78;;;39890:19;39922:6;-1:-1:-1;;;;;39912:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39912:17:0;;39890:39;;39940:154;39947:10;;39940:154;;39974:11;39984:1;39974:11;;:::i;:::-;;-1:-1:-1;40043:10:0;40051:2;40043:5;:10;:::i;:::-;40030:24;;:2;:24;:::i;:::-;40017:39;;40000:6;40007;40000:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;40000:56:0;;;;;;;;-1:-1:-1;40071:11:0;40080:2;40071:11;;:::i;:::-;;;39940:154;;22743:601;22962:53;22973:5;22980:11;22993:10;23005:9;22962:10;:53::i;:::-;23028:20;23062:10;23074:9;23051:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23028:56;;23095:81;23103:11;23116:7;23125:14;23141:18;23161:14;23095:7;:81::i;:::-;23204:55;;-1:-1:-1;;;23204:55:0;;29383:6:1;29371:19;;23204:55:0;;;29353:38:1;23253:4:0;29407:18:1;;;29400:60;23189:12:0;;23204:10;-1:-1:-1;;;;;23204:27:0;;;;29326:18:1;;23204:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23189:70;;23307:10;23275:61;;;;;;:::i;:::-;;;;;;;;23294:11;23275:61;;23287:5;-1:-1:-1;;;;;23275:61:0;;23319:9;23330:5;23275:61;;;;;;;:::i;:::-;;;;;;;;22951:393;;22743:601;;;;;;;:::o;49307:110::-;49383:26;49393:2;49397:7;49383:26;;;;;;;;;;;;:9;:26::i;50912:360::-;50972:13;50988:23;51003:7;50988:14;:23::i;:::-;50972:39;;51113:29;51130:1;51134:7;51113:8;:29::i;:::-;-1:-1:-1;;;;;51155:16:0;;;;;;:9;:16;;;;;:21;;51175:1;;51155:16;:21;;51175:1;;51155:21;:::i;:::-;;;;-1:-1:-1;;51194:16:0;;;;:7;:16;;;;;;51187:23;;-1:-1:-1;;;;;;51187:23:0;;;51228:36;51202:7;;51194:16;-1:-1:-1;;;;;51228:36:0;;;;;51194:16;;51228:36;50961:311;50912:360;:::o;21740:219::-;21842:4;-1:-1:-1;;;;;;21866:45:0;;-1:-1:-1;;;21866:45:0;;:85;;-1:-1:-1;;;;;;;;;;21338:40:0;;;21915:36;21229:157;55853:329;55969:8;55964:211;55987:9;:16;55983:1;:20;;;55964:211;;;56030:21;56038:9;56048:1;56038:12;;;;;;;;;;:::i;:::-;;;;;;;56030:21;;48388:4;48412:16;;;:7;:16;;;;;;-1:-1:-1;;;;;48412:16:0;:30;;;48323:127;56030:21;56029:22;56021:60;;;;-1:-1:-1;;;56021:60:0;;24593:2:1;56021:60:0;;;24575:21:1;24632:2;24612:18;;;24605:30;24671:27;24651:18;;;24644:55;24716:18;;56021:60:0;24391:349:1;56021:60:0;56096:35;56106:10;56118:9;56128:1;56118:12;;;;;;;;;;:::i;:::-;;;;;;;56096:35;;:9;:35::i;:::-;56158:3;;55964:211;;53501:799;53656:4;-1:-1:-1;;;;;53677:13:0;;32031:20;32079:8;53673:620;;53713:72;;-1:-1:-1;;;53713:72:0;;-1:-1:-1;;;;;53713:36:0;;;;;:72;;3659:10;;53764:4;;53770:7;;53779:5;;53713:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53713:72:0;;;;;;;;-1:-1:-1;;53713:72:0;;;;;;;;;;;;:::i;:::-;;;53709:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53955:13:0;;53951:272;;53998:60;;-1:-1:-1;;;53998:60:0;;;;;;;:::i;53951:272::-;54173:6;54167:13;54158:6;54154:2;54150:15;54143:38;53709:529;-1:-1:-1;;;;;;53836:51:0;-1:-1:-1;;;53836:51:0;;-1:-1:-1;53829:58:0;;53673:620;-1:-1:-1;54277:4:0;54270:11;;55505:340;55631:8;55626:212;55649:9;:16;55645:1;:20;;;55626:212;;;55723:5;-1:-1:-1;;;;;55691:37:0;:28;55706:9;55716:1;55706:12;;;;;;;;;;:::i;:::-;;;;;;;55691:28;;:14;:28::i;:::-;-1:-1:-1;;;;;55691:37:0;;55683:77;;;;-1:-1:-1;;;55683:77:0;;25721:2:1;55683:77:0;;;25703:21:1;25760:2;25740:18;;;25733:30;25799:29;25779:18;;;25772:57;25846:18;;55683:77:0;25519:351:1;55683:77:0;55775:19;55781:9;55791:1;55781:12;;;;;;;;;;:::i;:::-;;;;;;;55775:19;;:5;:19::i;:::-;55821:3;;55626:212;;15680:477;15886:32;;;15857:26;15886:32;;;:19;:32;;;;;15857:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15937:13;:20;15961:1;15937:25;;15929:86;;;;-1:-1:-1;;;15929:86:0;;22930:2:1;15929:86:0;;;22912:21:1;22969:2;22949:18;;;22942:30;23008:34;22988:18;;;22981:62;-1:-1:-1;;;23059:18:1;;;23052:46;23115:19;;15929:86:0;22728:412:1;15929:86:0;16026:123;;-1:-1:-1;;;16026:123:0;;-1:-1:-1;;;;;16026:10:0;:15;;;;16049:9;;16026:123;;16060:11;;16073:13;;16088:8;;16098:14;;16114:18;;16134:14;;16026:123;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15846:311;15680:477;;;;;:::o;49644:321::-;49774:18;49780:2;49784:7;49774:5;:18::i;:::-;49825:54;49856:1;49860:2;49864:7;49873:5;49825:22;:54::i;:::-;49803:154;;;;-1:-1:-1;;;49803:154:0;;;;;;;:::i;50301:382::-;-1:-1:-1;;;;;50381:16:0;;50373:61;;;;-1:-1:-1;;;50373:61:0;;24947:2:1;50373:61:0;;;24929:21:1;;;24966:18;;;24959:30;25025:34;25005:18;;;24998:62;25077:18;;50373:61:0;24745:356:1;50373:61:0;48388:4;48412:16;;;:7;:16;;;;;;-1:-1:-1;;;;;48412:16:0;:30;50445:58;;;;-1:-1:-1;;;50445:58:0;;20997:2:1;50445:58:0;;;20979:21:1;21036:2;21016:18;;;21009:30;21075;21055:18;;;21048:58;21123:18;;50445:58:0;20795:352:1;50445:58:0;-1:-1:-1;;;;;50574:13:0;;;;;;:9;:13;;;;;:18;;50591:1;;50574:13;:18;;50591:1;;50574:18;:::i;:::-;;;;-1:-1:-1;;50603:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;50603:21:0;-1:-1:-1;;;;;50603:21:0;;;;;;;;50642:33;;50603:16;;;50642:33;;50603:16;;50642:33;50301:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:336:1;78:5;107:52;123:35;151:6;123:35;:::i;:::-;107:52;:::i;:::-;98:61;;182:6;175:5;168:21;222:3;213:6;208:3;204:16;201:25;198:45;;;239:1;236;229:12;198:45;288:6;283:3;276:4;269:5;265:16;252:43;342:1;335:4;326:6;319:5;315:18;311:29;304:40;14:336;;;;;:::o;355:745::-;408:5;461:3;454:4;446:6;442:17;438:27;428:55;;479:1;476;469:12;428:55;515:6;502:20;541:4;565:59;581:42;620:2;581:42;:::i;565:59::-;646:3;670:2;665:3;658:15;698:2;693:3;689:12;682:19;;733:2;725:6;721:15;785:3;780:2;774;771:1;767:10;759:6;755:23;751:32;748:41;745:61;;;802:1;799;792:12;745:61;824:1;834:237;848:2;845:1;842:9;834:237;;;919:3;906:17;936:30;960:5;936:30;:::i;:::-;979:18;;1017:12;;;;1049;;;;866:1;859:9;834:237;;;-1:-1:-1;1089:5:1;;355:745;-1:-1:-1;;;;;;;355:745:1:o;1105:160::-;1170:20;;1226:13;;1219:21;1209:32;;1199:60;;1255:1;1252;1245:12;1199:60;1105:160;;;:::o;1270:347::-;1321:8;1331:6;1385:3;1378:4;1370:6;1366:17;1362:27;1352:55;;1403:1;1400;1393:12;1352:55;-1:-1:-1;1426:20:1;;-1:-1:-1;;;;;1458:30:1;;1455:50;;;1501:1;1498;1491:12;1455:50;1538:4;1530:6;1526:17;1514:29;;1590:3;1583:4;1574:6;1566;1562:19;1558:30;1555:39;1552:59;;;1607:1;1604;1597:12;1552:59;1270:347;;;;;:::o;1622:220::-;1664:5;1717:3;1710:4;1702:6;1698:17;1694:27;1684:55;;1735:1;1732;1725:12;1684:55;1757:79;1832:3;1823:6;1810:20;1803:4;1795:6;1791:17;1757:79;:::i;:::-;1748:88;1622:220;-1:-1:-1;;;1622:220:1:o;1847:428::-;1900:5;1953:3;1946:4;1938:6;1934:17;1930:27;1920:55;;1971:1;1968;1961:12;1920:55;2000:6;1994:13;2031:48;2047:31;2075:2;2047:31;:::i;2031:48::-;2104:2;2095:7;2088:19;2150:3;2143:4;2138:2;2130:6;2126:15;2122:26;2119:35;2116:55;;;2167:1;2164;2157:12;2116:55;2180:64;2241:2;2234:4;2225:7;2221:18;2214:4;2206:6;2202:17;2180:64;:::i;2280:247::-;2339:6;2392:2;2380:9;2371:7;2367:23;2363:32;2360:52;;;2408:1;2405;2398:12;2360:52;2447:9;2434:23;2466:31;2491:5;2466:31;:::i;2532:388::-;2600:6;2608;2661:2;2649:9;2640:7;2636:23;2632:32;2629:52;;;2677:1;2674;2667:12;2629:52;2716:9;2703:23;2735:31;2760:5;2735:31;:::i;:::-;2785:5;-1:-1:-1;2842:2:1;2827:18;;2814:32;2855:33;2814:32;2855:33;:::i;:::-;2907:7;2897:17;;;2532:388;;;;;:::o;2925:456::-;3002:6;3010;3018;3071:2;3059:9;3050:7;3046:23;3042:32;3039:52;;;3087:1;3084;3077:12;3039:52;3126:9;3113:23;3145:31;3170:5;3145:31;:::i;:::-;3195:5;-1:-1:-1;3252:2:1;3237:18;;3224:32;3265:33;3224:32;3265:33;:::i;:::-;2925:456;;3317:7;;-1:-1:-1;;;3371:2:1;3356:18;;;;3343:32;;2925:456::o;3386:665::-;3481:6;3489;3497;3505;3558:3;3546:9;3537:7;3533:23;3529:33;3526:53;;;3575:1;3572;3565:12;3526:53;3614:9;3601:23;3633:31;3658:5;3633:31;:::i;:::-;3683:5;-1:-1:-1;3740:2:1;3725:18;;3712:32;3753:33;3712:32;3753:33;:::i;:::-;3805:7;-1:-1:-1;3859:2:1;3844:18;;3831:32;;-1:-1:-1;3914:2:1;3899:18;;3886:32;-1:-1:-1;;;;;3930:30:1;;3927:50;;;3973:1;3970;3963:12;3927:50;3996:49;4037:7;4028:6;4017:9;4013:22;3996:49;:::i;:::-;3986:59;;;3386:665;;;;;;;:::o;4056:315::-;4121:6;4129;4182:2;4170:9;4161:7;4157:23;4153:32;4150:52;;;4198:1;4195;4188:12;4150:52;4237:9;4224:23;4256:31;4281:5;4256:31;:::i;:::-;4306:5;-1:-1:-1;4330:35:1;4361:2;4346:18;;4330:35;:::i;:::-;4320:45;;4056:315;;;;;:::o;4376:454::-;4449:6;4457;4465;4518:2;4506:9;4497:7;4493:23;4489:32;4486:52;;;4534:1;4531;4524:12;4486:52;4573:9;4560:23;4592:31;4617:5;4592:31;:::i;:::-;4642:5;-1:-1:-1;4699:2:1;4684:18;;4671:32;4712;4671;4712;:::i;:::-;4763:7;-1:-1:-1;4789:35:1;4820:2;4805:18;;4789:35;:::i;:::-;4779:45;;4376:454;;;;;:::o;4835:315::-;4903:6;4911;4964:2;4952:9;4943:7;4939:23;4935:32;4932:52;;;4980:1;4977;4970:12;4932:52;5019:9;5006:23;5038:31;5063:5;5038:31;:::i;:::-;5088:5;5140:2;5125:18;;;;5112:32;;-1:-1:-1;;;4835:315:1:o;5155:245::-;5213:6;5266:2;5254:9;5245:7;5241:23;5237:32;5234:52;;;5282:1;5279;5272:12;5234:52;5321:9;5308:23;5340:30;5364:5;5340:30;:::i;5405:249::-;5474:6;5527:2;5515:9;5506:7;5502:23;5498:32;5495:52;;;5543:1;5540;5533:12;5495:52;5575:9;5569:16;5594:30;5618:5;5594:30;:::i;5659:335::-;5738:6;5791:2;5779:9;5770:7;5766:23;5762:32;5759:52;;;5807:1;5804;5797:12;5759:52;5840:9;5834:16;-1:-1:-1;;;;;5865:6:1;5862:30;5859:50;;;5905:1;5902;5895:12;5859:50;5928:60;5980:7;5971:6;5960:9;5956:22;5928:60;:::i;5999:1187::-;6111:6;6119;6172:2;6160:9;6151:7;6147:23;6143:32;6140:52;;;6188:1;6185;6178:12;6140:52;6221:9;6215:16;-1:-1:-1;;;;;6291:2:1;6283:6;6280:14;6277:34;;;6307:1;6304;6297:12;6277:34;6330:60;6382:7;6373:6;6362:9;6358:22;6330:60;:::i;:::-;6320:70;;6409:2;6399:12;;6457:2;6446:9;6442:18;6436:25;6486:2;6476:8;6473:16;6470:36;;;6502:1;6499;6492:12;6470:36;6525:24;;;-1:-1:-1;6580:4:1;6572:13;;6568:27;-1:-1:-1;6558:55:1;;6609:1;6606;6599:12;6558:55;6638:2;6632:9;6661:59;6677:42;6716:2;6677:42;:::i;6661:59::-;6742:3;6766:2;6761:3;6754:15;6794:2;6789:3;6785:12;6778:19;;6825:2;6821;6817:11;6873:7;6868:2;6862;6859:1;6855:10;6851:2;6847:19;6843:28;6840:41;6837:61;;;6894:1;6891;6884:12;6837:61;6916:1;6907:10;;6926:230;6940:2;6937:1;6934:9;6926:230;;;7004:3;6998:10;7021:30;7045:5;7021:30;:::i;:::-;7064:18;;6958:1;6951:9;;;;;7102:12;;;;7134;;6926:230;;;6930:3;7175:5;7165:15;;;;;;;5999:1187;;;;;:::o;7191:450::-;7260:6;7313:2;7301:9;7292:7;7288:23;7284:32;7281:52;;;7329:1;7326;7319:12;7281:52;7369:9;7356:23;-1:-1:-1;;;;;7394:6:1;7391:30;7388:50;;;7434:1;7431;7424:12;7388:50;7457:22;;7510:4;7502:13;;7498:27;-1:-1:-1;7488:55:1;;7539:1;7536;7529:12;7488:55;7562:73;7627:7;7622:2;7609:16;7604:2;7600;7596:11;7562:73;:::i;7646:245::-;7704:6;7757:2;7745:9;7736:7;7732:23;7728:32;7725:52;;;7773:1;7770;7763:12;7725:52;7812:9;7799:23;7831:30;7855:5;7831:30;:::i;7896:542::-;7974:6;7982;7990;8043:2;8031:9;8022:7;8018:23;8014:32;8011:52;;;8059:1;8056;8049:12;8011:52;8098:9;8085:23;8117:30;8141:5;8117:30;:::i;:::-;8166:5;-1:-1:-1;8222:2:1;8207:18;;8194:32;-1:-1:-1;;;;;8238:30:1;;8235:50;;;8281:1;8278;8271:12;8235:50;8320:58;8370:7;8361:6;8350:9;8346:22;8320:58;:::i;:::-;7896:542;;8397:8;;-1:-1:-1;8294:84:1;;-1:-1:-1;;;;7896:542:1:o;8443:1189::-;8596:6;8604;8612;8620;8628;8636;8689:3;8677:9;8668:7;8664:23;8660:33;8657:53;;;8706:1;8703;8696:12;8657:53;8745:9;8732:23;8764:30;8788:5;8764:30;:::i;:::-;8813:5;-1:-1:-1;8869:2:1;8854:18;;8841:32;-1:-1:-1;;;;;8922:14:1;;;8919:34;;;8949:1;8946;8939:12;8919:34;8972:49;9013:7;9004:6;8993:9;8989:22;8972:49;:::i;:::-;8962:59;;9074:2;9063:9;9059:18;9046:32;9030:48;;9103:2;9093:8;9090:16;9087:36;;;9119:1;9116;9109:12;9087:36;9142:62;9196:7;9185:8;9174:9;9170:24;9142:62;:::i;:::-;9132:72;;9256:2;9245:9;9241:18;9228:32;9213:47;;9269:33;9294:7;9269:33;:::i;:::-;9321:7;;-1:-1:-1;9380:3:1;9365:19;;9352:33;;9394;9352;9394;:::i;:::-;9446:7;;-1:-1:-1;9506:3:1;9491:19;;9478:33;;9523:16;;;9520:36;;;9552:1;9549;9542:12;9520:36;;9575:51;9618:7;9607:8;9596:9;9592:24;9575:51;:::i;:::-;9565:61;;;8443:1189;;;;;;;;:::o;9637:966::-;9770:6;9778;9786;9794;9802;9855:3;9843:9;9834:7;9830:23;9826:33;9823:53;;;9872:1;9869;9862:12;9823:53;9911:9;9898:23;9930:30;9954:5;9930:30;:::i;:::-;9979:5;-1:-1:-1;10035:2:1;10020:18;;10007:32;-1:-1:-1;;;;;10088:14:1;;;10085:34;;;10115:1;10112;10105:12;10085:34;10138:49;10179:7;10170:6;10159:9;10155:22;10138:49;:::i;:::-;10128:59;;10240:2;10229:9;10225:18;10212:32;10196:48;;10269:2;10259:8;10256:16;10253:36;;;10285:1;10282;10275:12;10253:36;10308:62;10362:7;10351:8;10340:9;10336:24;10308:62;:::i;:::-;10298:72;;10389:35;10420:2;10409:9;10405:18;10389:35;:::i;:::-;10379:45;;10477:3;10466:9;10462:19;10449:33;10433:49;;10507:2;10497:8;10494:16;10491:36;;;10523:1;10520;10513:12;10491:36;;10546:51;10589:7;10578:8;10567:9;10563:24;10546:51;:::i;:::-;10536:61;;;9637:966;;;;;;;;:::o;10608:592::-;10692:6;10700;10708;10761:2;10749:9;10740:7;10736:23;10732:32;10729:52;;;10777:1;10774;10767:12;10729:52;10816:9;10803:23;10835:30;10859:5;10835:30;:::i;:::-;10884:5;-1:-1:-1;10940:2:1;10925:18;;10912:32;-1:-1:-1;;;;;10956:30:1;;10953:50;;;10999:1;10996;10989:12;10953:50;11022:49;11063:7;11054:6;11043:9;11039:22;11022:49;:::i;:::-;11012:59;;;11123:2;11112:9;11108:18;11095:32;11136;11160:7;11136:32;:::i;:::-;11187:7;11177:17;;;10608:592;;;;;:::o;11205:812::-;11307:6;11315;11323;11331;11384:3;11372:9;11363:7;11359:23;11355:33;11352:53;;;11401:1;11398;11391:12;11352:53;11440:9;11427:23;11459:30;11483:5;11459:30;:::i;:::-;11508:5;-1:-1:-1;11564:2:1;11549:18;;11536:32;-1:-1:-1;;;;;11617:14:1;;;11614:34;;;11644:1;11641;11634:12;11614:34;11667:49;11708:7;11699:6;11688:9;11684:22;11667:49;:::i;:::-;11657:59;;11768:2;11757:9;11753:18;11740:32;11725:47;;11781:32;11805:7;11781:32;:::i;:::-;11832:7;;-1:-1:-1;11892:2:1;11877:18;;11864:32;;11908:16;;;11905:36;;;11937:1;11934;11927:12;11905:36;;11960:51;12003:7;11992:8;11981:9;11977:24;11960:51;:::i;12022:594::-;12106:6;12114;12122;12130;12183:3;12171:9;12162:7;12158:23;12154:33;12151:53;;;12200:1;12197;12190:12;12151:53;12239:9;12226:23;12258:30;12282:5;12258:30;:::i;:::-;12307:5;-1:-1:-1;12364:2:1;12349:18;;12336:32;12377;12336;12377;:::i;:::-;12428:7;-1:-1:-1;12487:2:1;12472:18;;12459:32;12500:33;12459:32;12500:33;:::i;:::-;12022:594;;;;-1:-1:-1;12552:7:1;;12606:2;12591:18;12578:32;;-1:-1:-1;;12022:594:1:o;12621:750::-;12716:6;12724;12732;12740;12748;12801:3;12789:9;12780:7;12776:23;12772:33;12769:53;;;12818:1;12815;12808:12;12769:53;12857:9;12844:23;12876:30;12900:5;12876:30;:::i;:::-;12925:5;-1:-1:-1;12982:2:1;12967:18;;12954:32;12995;12954;12995;:::i;:::-;13046:7;-1:-1:-1;13100:2:1;13085:18;;13072:32;;-1:-1:-1;13155:2:1;13140:18;;13127:32;-1:-1:-1;;;;;13171:30:1;;13168:50;;;13214:1;13211;13204:12;13168:50;13253:58;13303:7;13294:6;13283:9;13279:22;13253:58;:::i;:::-;12621:750;;;;-1:-1:-1;12621:750:1;;-1:-1:-1;13330:8:1;;13227:84;12621:750;-1:-1:-1;;;12621:750:1:o;13376:180::-;13435:6;13488:2;13476:9;13467:7;13463:23;13459:32;13456:52;;;13504:1;13501;13494:12;13456:52;-1:-1:-1;13527:23:1;;13376:180;-1:-1:-1;13376:180:1:o;13561:245::-;13640:6;13648;13701:2;13689:9;13680:7;13676:23;13672:32;13669:52;;;13717:1;13714;13707:12;13669:52;-1:-1:-1;;13740:16:1;;13796:2;13781:18;;;13775:25;13740:16;;13775:25;;-1:-1:-1;13561:245:1:o;13811:249::-;13880:6;13933:2;13921:9;13912:7;13908:23;13904:32;13901:52;;;13949:1;13946;13939:12;13901:52;13981:9;13975:16;14000:30;14024:5;14000:30;:::i;14065:447::-;14117:3;14155:5;14149:12;14182:6;14177:3;14170:19;14208:4;14237:2;14232:3;14228:12;14221:19;;14274:2;14267:5;14263:14;14295:1;14305:182;14319:6;14316:1;14313:13;14305:182;;;14384:13;;14399:6;14380:26;14368:39;;14427:12;;;;14462:15;;;;14341:1;14334:9;14305:182;;;-1:-1:-1;14503:3:1;;14065:447;-1:-1:-1;;;;;14065:447:1:o;14517:266::-;14605:6;14600:3;14593:19;14657:6;14650:5;14643:4;14638:3;14634:14;14621:43;-1:-1:-1;14709:1:1;14684:16;;;14702:4;14680:27;;;14673:38;;;;14765:2;14744:15;;;-1:-1:-1;;14740:29:1;14731:39;;;14727:50;;14517:266::o;14788:268::-;14840:3;14878:5;14872:12;14905:6;14900:3;14893:19;14921:63;14977:6;14970:4;14965:3;14961:14;14954:4;14947:5;14943:16;14921:63;:::i;:::-;15038:2;15017:15;-1:-1:-1;;15013:29:1;15004:39;;;;15045:4;15000:50;;14788:268;-1:-1:-1;;14788:268:1:o;15061:184::-;15102:3;15140:5;15134:12;15155:52;15200:6;15195:3;15188:4;15181:5;15177:16;15155:52;:::i;:::-;15223:16;;;;;15061:184;-1:-1:-1;;15061:184:1:o;15250:271::-;15433:6;15425;15420:3;15407:33;15389:3;15459:16;;15484:13;;;15459:16;15250:271;-1:-1:-1;15250:271:1:o;15526:274::-;15655:3;15693:6;15687:13;15709:53;15755:6;15750:3;15743:4;15735:6;15731:17;15709:53;:::i;:::-;15778:16;;;;;15526:274;-1:-1:-1;;15526:274:1:o;15805:1173::-;15981:3;16010:1;16043:6;16037:13;16073:3;16095:1;16123:9;16119:2;16115:18;16105:28;;16183:2;16172:9;16168:18;16205;16195:61;;16249:4;16241:6;16237:17;16227:27;;16195:61;16275:2;16323;16315:6;16312:14;16292:18;16289:38;16286:165;;;-1:-1:-1;;;16350:33:1;;16406:4;16403:1;16396:15;16436:4;16357:3;16424:17;16286:165;16467:18;16494:104;;;;16612:1;16607:320;;;;16460:467;;16494:104;-1:-1:-1;;16527:24:1;;16515:37;;16572:16;;;;-1:-1:-1;16494:104:1;;16607:320;34056:1;34049:14;;;34093:4;34080:18;;16702:1;16716:165;16730:6;16727:1;16724:13;16716:165;;;16808:14;;16795:11;;;16788:35;16851:16;;;;16745:10;;16716:165;;;16720:3;;16910:6;16905:3;16901:16;16894:23;;16460:467;;;;;;;16943:29;16968:3;16960:6;16943:29;:::i;:::-;16936:36;15805:1173;-1:-1:-1;;;;;15805:1173:1:o;17191:499::-;-1:-1:-1;;;;;17460:15:1;;;17442:34;;17512:15;;17507:2;17492:18;;17485:43;17559:2;17544:18;;17537:34;;;17607:3;17602:2;17587:18;;17580:31;;;17385:4;;17628:56;;17664:19;;17656:6;17628:56;:::i;:::-;17620:64;17191:499;-1:-1:-1;;;;;;17191:499:1:o;17695:352::-;17898:2;17887:9;17880:21;17861:4;17918:55;17969:2;17958:9;17954:18;17946:6;17918:55;:::i;:::-;17910:63;;-1:-1:-1;;;;;18013:6:1;18009:31;18004:2;17993:9;17989:18;17982:59;17695:352;;;;;:::o;18426:228::-;18573:2;18562:9;18555:21;18536:4;18593:55;18644:2;18633:9;18629:18;18621:6;18593:55;:::i;18659:429::-;18882:2;18871:9;18864:21;18845:4;18908:55;18959:2;18948:9;18944:18;18936:6;18908:55;:::i;:::-;19011:9;19003:6;18999:22;18994:2;18983:9;18979:18;18972:50;19039:43;19075:6;19067;19039:43;:::i;19969:414::-;20171:2;20153:21;;;20210:2;20190:18;;;20183:30;20249:34;20244:2;20229:18;;20222:62;-1:-1:-1;;;20315:2:1;20300:18;;20293:48;20373:3;20358:19;;19969:414::o;25875:356::-;26077:2;26059:21;;;26096:18;;;26089:30;26155:34;26150:2;26135:18;;26128:62;26222:2;26207:18;;25875:356::o;27761:413::-;27963:2;27945:21;;;28002:2;27982:18;;;27975:30;28041:34;28036:2;28021:18;;28014:62;-1:-1:-1;;;28107:2:1;28092:18;;28085:47;28164:3;28149:19;;27761:413::o;29471:662::-;29752:6;29740:19;;29722:38;;-1:-1:-1;;;;;29796:32:1;;29791:2;29776:18;;29769:60;29816:3;29860:2;29845:18;;29838:31;;;-1:-1:-1;;29892:56:1;;29928:19;;29920:6;29892:56;:::i;:::-;29998:6;29991:14;29984:22;29979:2;29968:9;29964:18;29957:50;30056:9;30048:6;30044:22;30038:3;30027:9;30023:19;30016:51;30084:43;30120:6;30112;30084:43;:::i;:::-;30076:51;29471:662;-1:-1:-1;;;;;;;;29471:662:1:o;30138:326::-;30333:6;30325;30321:19;30310:9;30303:38;30377:2;30372;30361:9;30357:18;30350:30;30284:4;30397:61;30454:2;30443:9;30439:18;30431:6;30423;30397:61;:::i;30469:870::-;30818:6;30810;30806:19;30795:9;30788:38;30862:3;30857:2;30846:9;30842:18;30835:31;30769:4;30889:56;30940:3;30929:9;30925:19;30917:6;30889:56;:::i;:::-;30993:9;30985:6;30981:22;30976:2;30965:9;30961:18;30954:50;31027:43;31063:6;31055;31027:43;:::i;:::-;-1:-1:-1;;;;;31144:15:1;;;31139:2;31124:18;;31117:43;31197:15;;31191:3;31176:19;;31169:44;31250:22;;;31097:3;31229:19;;31222:51;31013:57;-1:-1:-1;31290:43:1;31013:57;31318:6;31290:43;:::i;:::-;31282:51;30469:870;-1:-1:-1;;;;;;;;;30469:870:1:o;31344:577::-;31601:6;31593;31589:19;31578:9;31571:38;31645:3;31640:2;31629:9;31625:18;31618:31;31552:4;31672:56;31723:3;31712:9;31708:19;31700:6;31672:56;:::i;:::-;-1:-1:-1;;;;;31768:6:1;31764:31;31759:2;31748:9;31744:18;31737:59;31844:9;31836:6;31832:22;31827:2;31816:9;31812:18;31805:50;31872:43;31908:6;31900;31872:43;:::i;:::-;31864:51;31344:577;-1:-1:-1;;;;;;;31344:577:1:o;32387:498::-;32587:4;32616:6;32661:2;32653:6;32649:15;32638:9;32631:34;32713:2;32705:6;32701:15;32696:2;32685:9;32681:18;32674:43;;32753:6;32748:2;32737:9;32733:18;32726:34;32796:3;32791:2;32780:9;32776:18;32769:31;32817:62;32874:3;32863:9;32859:19;32851:6;32843;32817:62;:::i;33325:275::-;33396:2;33390:9;33461:2;33442:13;;-1:-1:-1;;33438:27:1;33426:40;;-1:-1:-1;;;;;33481:34:1;;33517:22;;;33478:62;33475:88;;;33543:18;;:::i;:::-;33579:2;33572:22;33325:275;;-1:-1:-1;33325:275:1:o;33605:182::-;33664:4;-1:-1:-1;;;;;33689:6:1;33686:30;33683:56;;;33719:18;;:::i;:::-;-1:-1:-1;33764:1:1;33760:14;33776:4;33756:25;;33605:182::o;33792:186::-;33840:4;-1:-1:-1;;;;;33865:6:1;33862:30;33859:56;;;33895:18;;:::i;:::-;-1:-1:-1;33961:2:1;33940:15;-1:-1:-1;;33936:29:1;33967:4;33932:40;;33792:186::o;34109:128::-;34149:3;34180:1;34176:6;34173:1;34170:13;34167:39;;;34186:18;;:::i;:::-;-1:-1:-1;34222:9:1;;34109:128::o;34242:120::-;34282:1;34308;34298:35;;34313:18;;:::i;:::-;-1:-1:-1;34347:9:1;;34242:120::o;34367:125::-;34407:4;34435:1;34432;34429:8;34426:34;;;34440:18;;:::i;:::-;-1:-1:-1;34477:9:1;;34367:125::o;34497:258::-;34569:1;34579:113;34593:6;34590:1;34587:13;34579:113;;;34669:11;;;34663:18;34650:11;;;34643:39;34615:2;34608:10;34579:113;;;34710:6;34707:1;34704:13;34701:48;;;-1:-1:-1;;34745:1:1;34727:16;;34720:27;34497:258::o;34760:380::-;34839:1;34835:12;;;;34882;;;34903:61;;34957:4;34949:6;34945:17;34935:27;;34903:61;35010:2;35002:6;34999:14;34979:18;34976:38;34973:161;;;35056:10;35051:3;35047:20;35044:1;35037:31;35091:4;35088:1;35081:15;35119:4;35116:1;35109:15;34973:161;;34760:380;;;:::o;35145:135::-;35184:3;-1:-1:-1;;35205:17:1;;35202:43;;;35225:18;;:::i;:::-;-1:-1:-1;35272:1:1;35261:13;;35145:135::o;35285:112::-;35317:1;35343;35333:35;;35348:18;;:::i;:::-;-1:-1:-1;35382:9:1;;35285:112::o;35402:127::-;35463:10;35458:3;35454:20;35451:1;35444:31;35494:4;35491:1;35484:15;35518:4;35515:1;35508:15;35534:127;35595:10;35590:3;35586:20;35583:1;35576:31;35626:4;35623:1;35616:15;35650:4;35647:1;35640:15;35666:127;35727:10;35722:3;35718:20;35715:1;35708:31;35758:4;35755:1;35748:15;35782:4;35779:1;35772:15;35798:127;35859:10;35854:3;35850:20;35847:1;35840:31;35890:4;35887:1;35880:15;35914:4;35911:1;35904:15;35930:131;-1:-1:-1;;;;;36005:31:1;;35995:42;;35985:70;;36051:1;36048;36041:12;36066:131;-1:-1:-1;;;;;;36140:32:1;;36130:43;;36120:71;;36187:1;36184;36177:12;36202:117;36287:6;36280:5;36276:18;36269:5;36266:29;36256:57;;36309:1;36306;36299:12;36324:129;-1:-1:-1;;;;;36402:5:1;36398:30;36391:5;36388:41;36378:69;;36443:1;36440;36433:12

Metadata Hash

ipfs://0328b50d7fac21078212c9b54dbb0d683864aa70ecb7db9bb3531cd64985bf50
Loading