ETH Price: $3,268.80 (+0.80%)
Gas: 2 Gwei

Token

Gokudo Paradise (GokudoParadise)
 

Overview

Max Total Supply

3,000 GokudoParadise

Holders

237

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
20 GokudoParadise
0xcf75bd79bc19c41f83a7c35eb276d830064ae85f
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
GokudoParadiseContract

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-04-16
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.7;

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;
}

pragma solidity ^0.8.7;


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 receiver 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);
}


pragma solidity ^0.8.7;

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;
}

pragma solidity ^0.8.7;

/**
 * @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);
    }
}


pragma solidity ^0.8.7;

/**
 * @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;
    }
}


pragma solidity ^0.8.7;


/**
 * @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);
    }
}


pragma solidity ^0.8.7;

/**
 * @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);
            }
        }
    }
}


pragma solidity ^0.8.7;

/**
 * @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);
}


pragma solidity ^0.8.7;

/**
 * @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);
}


pragma solidity ^0.8.7;


/**
 * @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;
    }
}


pragma solidity ^0.8.7;


/**
 * @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;
}


pragma solidity ^0.8.7;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
     function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

     /**
      * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
      * Use along with {totalSupply} to enumerate all tokens.
      */
     function tokenByIndex(uint256 index) external view returns (uint256);
}


pragma solidity ^0.8.7;


/**
 * @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);
}


pragma solidity ^0.8.7;

abstract contract NonblockingReceiver is Ownable, ILayerZeroReceiver {

    ILayerZeroEndpoint internal endpoint;

    struct FailedMessages {
        uint payloadLength;
        bytes32 payloadHash;
    }

    mapping(uint16 => mapping(bytes => mapping(uint => FailedMessages))) public failedMessages;
    mapping(uint16 => bytes) public trustedRemoteLookup;

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

    function lzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) external override {
        require(msg.sender == address(endpoint)); // boilerplate! lzReceive must be called by the endpoint for security
        require(_srcAddress.length == trustedRemoteLookup[_srcChainId].length && keccak256(_srcAddress) == keccak256(trustedRemoteLookup[_srcChainId]), 
            "NonblockingReceiver: invalid source sending contract");

        // try-catch all errors/exceptions
        // having failed messages does not block messages passing
        try this.onLzReceive(_srcChainId, _srcAddress, _nonce, _payload) {
            // do nothing
        } catch {
            // error / exception
            failedMessages[_srcChainId][_srcAddress][_nonce] = FailedMessages(_payload.length, keccak256(_payload));
            emit MessageFailed(_srcChainId, _srcAddress, _nonce, _payload);
        }
    }

    function onLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) public {
        // only internal transaction
        require(msg.sender == address(this), "NonblockingReceiver: caller must be Bridge.");

        // handle incoming message
        _LzReceive( _srcChainId, _srcAddress, _nonce, _payload);
    }

    // abstract function
    function _LzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) virtual internal;

    function _lzSend(uint16 _dstChainId, bytes memory _payload, address payable _refundAddress, address _zroPaymentAddress, bytes memory _txParam) internal {
        endpoint.send{value: msg.value}(_dstChainId, trustedRemoteLookup[_dstChainId], _payload, _refundAddress, _zroPaymentAddress, _txParam);
    }

    function retryMessage(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes calldata _payload) external payable {
        // assert there is message to retry
        FailedMessages storage failedMsg = failedMessages[_srcChainId][_srcAddress][_nonce];
        require(failedMsg.payloadHash != bytes32(0), "NonblockingReceiver: no stored message");
        require(_payload.length == failedMsg.payloadLength && keccak256(_payload) == failedMsg.payloadHash, "LayerZero: invalid payload");
        // clear the stored message
        failedMsg.payloadLength = 0;
        failedMsg.payloadHash = bytes32(0);
        // execute the message. revert if it fails again
        this.onLzReceive(_srcChainId, _srcAddress, _nonce, _payload);
    }

    function setTrustedRemote(uint16 _chainId, bytes calldata _trustedRemote) external onlyOwner {
        trustedRemoteLookup[_chainId] = _trustedRemote;
    }
}


pragma solidity ^0.8.7;

/**
 * @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 ERC721B is
  Context,
  ERC165,
  IERC721,
  IERC721Metadata,
  IERC721Enumerable
{
  using Address for address;
  using Strings for uint256;

  struct TokenOwnership {
    address addr;
    uint64 startTimestamp;
  }
 
  struct AddressData {
    uint128 balance;
    uint128 numberMinted;
  }

  uint256 private currentIndex = 0;
  uint256 private TotalToken = 0; 
  uint256 private MaxTokenId = 0;   
  uint256 internal immutable maxBatchSize;
  uint256 private startIndex = 0;
  uint256 private endIndex = 0;
  address private burnaddress = 0x000000000000000000000000000000000000dEaD;

  // Token name
  string private _name;

  // Token symbol
  string private _symbol;

  // Mapping from token ID to ownership details
  // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
  mapping(uint256 => TokenOwnership) private _ownerships;

  // Mapping owner address to address data
  mapping(address => AddressData) private _addressData;

  // 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
   * `maxBatchSize` refers to how much a minter can mint at a time.
   * `TotalToken_` refers to how many tokens are in the collection.
   */
  constructor(
    string memory name_,
    string memory symbol_,
    uint256 maxBatchSize_,
    uint256 startIndex_,
    uint256 endIndex_   
  ) {
    require(maxBatchSize_ > 0, "ERC721B: max batch size must be nonzero");
    _name = name_;
    _symbol = symbol_;
    maxBatchSize = maxBatchSize_;
    currentIndex = startIndex_;
    startIndex = startIndex_;
    endIndex = endIndex_; 
    MaxTokenId = endIndex_; 
  }

  /**
   * @dev See {IERC721Enumerable-totalSupply}.
   */
  function totalSupply() public view override returns (uint256) {
     return TotalToken;
  }

  /**	
   * @dev See {IERC721Enumerable-tokenByIndex}.	
   */	
   function tokenByIndex(uint256 index) public view override returns (uint256) {	
    require(index <= MaxTokenId, "ERC721B: global index out of bounds");	

    uint256 tokenIdsIdx = 0;

    for (uint256 i = 0; i <= MaxTokenId; i++) {
      TokenOwnership memory ownership = _ownerships[i];

      if(_inrange(i)){
        if ( (ownership.addr != burnaddress) && (i < currentIndex)) {
            if (tokenIdsIdx == index) {
                return i;
            }
            tokenIdsIdx++;
        }
      }
      else
      {
        if ((ownership.addr != address(0)) && (ownership.addr != burnaddress))  {
            if (tokenIdsIdx == index) {
                return i;
            }
            tokenIdsIdx++;
        }     
      }
    }

    revert("ERC721A: unable to get token by index");
  }

  /**
   * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
   * This read function is O(TotalToken). If calling from a separate contract, be sure to test gas first.
   * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
   */
  function tokenOfOwnerByIndex(address owner, uint256 index)
    public
    view
    override
    returns (uint256)
  {
    require(index < balanceOf(owner), "ERC721A: owner index out of bounds");
    uint256 tokenIdsIdx = 0;
    address currOwnershipAddr = address(0);
    for (uint256 i = 0; i <= MaxTokenId; i++) {
      TokenOwnership memory ownership = _ownerships[i];

      if(_inrange(i) && (i < currentIndex)){
        if ((ownership.addr != address(0))) {
            currOwnershipAddr = ownership.addr;
        }

        if (currOwnershipAddr == owner) {
            if (tokenIdsIdx == index) {
                return i;
            }
            tokenIdsIdx++;
        }
      }
      else
      {
        if (ownership.addr == owner) {
            if (tokenIdsIdx == index) {
                return i;
            }
            tokenIdsIdx++;
        }     
      }
    }
    revert("ERC721A: unable to get token of owner by index");
  }

  /**
   * @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 ||
      interfaceId == type(IERC721Enumerable).interfaceId ||
      super.supportsInterface(interfaceId);
  }

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

  function _numberMinted(address owner) internal view returns (uint256) {
    require(
      owner != address(0),
      "ERC721A: number minted query for the zero address"
    );
    require(
        owner != burnaddress,
        "ERC721A: number minted query for the burnaddress"
      );    
    return uint256(_addressData[owner].numberMinted);
  }

  function ownershipOf(uint256 tokenId)
    internal
    view
    returns (TokenOwnership memory)
  {
    require(_exists(tokenId), "ERC721B: owner query for nonexistent token");

    //If it is airdrop(transfered between chains), we have owner address set already.
    TokenOwnership memory ownership = _ownerships[tokenId];
    if ( !_inrange(tokenId) ) {
        if ( (ownership.addr != address(0)) && (ownership.addr != burnaddress) )
            return ownership;
        else
            revert("ERC721B: unable to determine the owner of token");
    }

    uint256 lowestTokenToCheck;
    if (tokenId >= maxBatchSize) {
      lowestTokenToCheck = tokenId - maxBatchSize + 1;
    }

    if (lowestTokenToCheck < startIndex) {
        lowestTokenToCheck = startIndex;
    }

    for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) {
      ownership = _ownerships[curr];
      if ((ownership.addr != address(0)) && (ownership.addr != burnaddress)  ) {
        return ownership;
      }
    }

    revert("ERC721B: unable to determine the owner of token");
  }

  /**
   * @dev See {IERC721-ownerOf}.
   */
  function ownerOf(uint256 tokenId) public view override returns (address) {
    return ownershipOf(tokenId).addr;
  }

  /**
   * @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()))
        : "";
  }


  function _baseURI() internal view virtual returns (string memory) {
    return "";
  }

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

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

    _approve(to, tokenId, owner);
  }

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

    return _tokenApprovals[tokenId];
  }

  /**
   * @dev See {IERC721-setApprovalForAll}.
   */
  function setApprovalForAll(address operator, bool approved) public override {
    require(operator != _msgSender(), "ERC721B: approve to caller");

    _operatorApprovals[_msgSender()][operator] = approved;
    emit ApprovalForAll(_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 {
    _transfer(from, to, tokenId);
  }

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

  /**
   * @dev See {IERC721-safeTransferFrom}.
   */
  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId,
    bytes memory _data
  ) public virtual override {
    _transfer(from, to, tokenId);
    require(
      _checkOnERC721Received(from, to, tokenId, _data),
      "ERC721B: 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`),
   */
  function _exists(uint256 tokenId) internal view returns (bool) {
    //@dan token could be out of range from tranferring between blockchains 
    if (_inrange(tokenId))
    {
        return ((tokenId < currentIndex) && (_ownerships[tokenId].addr !=burnaddress));      
    }
    else
    {
        return ((_ownerships[tokenId].addr != address(0)) && (_ownerships[tokenId].addr !=burnaddress));     
    }

  }

  
  /**
   * @dev Returns whether `tokenId` in start and end ranges.
   *
   * Tokens can be out of range by airdrop.
   */
   function _inrange(uint256 tokenId) internal view returns (bool) {
    //@dan token could be out of range from tranferring between blockchains 
    return ((tokenId >= startIndex) && (tokenId <= endIndex));
  }


  function _safeMint(address to, uint256 quantity) internal {
    _safeMint(to, quantity, "");
  }

  /**
   * @dev Mints `quantity` tokens and transfers them to `to`.
   *
   * Requirements:
   *
   * - there must be `quantity` tokens remaining unminted in the total collection.
   * - `to` cannot be the zero address.
   * - `quantity` cannot be larger than the max batch size.
   *
   * Emits a {Transfer} event.
   */
  function _safeMint(
    address to,
    uint256 quantity,
    bytes memory _data
  ) internal {
    uint256 startTokenId = currentIndex;
    require(to != address(0), "ERC721B: mint to the zero address");
    require(to != burnaddress, "ERC721B: mint to the burn address");    
    // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
    require(!_exists(startTokenId), "ERC721B: token already minted");
    require(quantity <= maxBatchSize, "ERC721B: quantity to mint too high");

    _beforeTokenTransfers(address(0), to, startTokenId, quantity);

    AddressData memory addressData = _addressData[to];
    _addressData[to] = AddressData(
      addressData.balance + uint128(quantity),
      addressData.numberMinted + uint128(quantity)
    );    
    _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

    uint256 updatedIndex = startTokenId;

    for (uint256 i = 0; i < quantity; i++) {
      emit Transfer(address(0), to, updatedIndex);
      require(
        _checkOnERC721Received(address(0), to, updatedIndex, _data),
        "ERC721A: transfer to non ERC721Receiver implementer"
      );

      updatedIndex++;
      TotalToken++;
    }

    currentIndex = updatedIndex;

    _afterTokenTransfers(address(0), to, startTokenId, quantity);
  }

/**
     * @dev Safely airdrop `tokenId` and transfers it to `to`. This is for the receive side of Level Zero Chain transfer
     *
     * 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 _airdrop(address to, uint256 tokenId) internal virtual {
        _airdrop(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 _airdrop(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _airdropbyId(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 _airdropbyId(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(to != burnaddress, "ERC721B: mint to the burn address");   

        _beforeTokenTransfers(address(0), to, tokenId, 1);

        TotalToken++;    
        if(tokenId > MaxTokenId){
            MaxTokenId = tokenId;
        }  

        AddressData memory addressData = _addressData[to];
        _addressData[to] = AddressData(
            addressData.balance + 1,
            addressData.numberMinted + 1);

        _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

        emit Transfer(address(0), to, tokenId);
    }
    
/**
     * @dev ERC721A uses address(0), so we use 0x000000000000000000000000000000000000dEaD as burn address
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);
        address owner = ERC721B.ownerOf(tokenId);

        _beforeTokenTransfers(owner, burnaddress, tokenId, 1);

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

        AddressData memory addressData = _addressData[owner];
        _addressData[owner] = AddressData(
            addressData.balance - 1,
            addressData.numberMinted - 1);

        TotalToken--;
        _ownerships[tokenId] = TokenOwnership(burnaddress, uint64(block.timestamp));

         //@dan only do this if minted in range.
        // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
        // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
        uint256 nextTokenId = tokenId + 1;
        if (_inrange(nextTokenId) && (_ownerships[nextTokenId].addr == address(0))) {
            if (_exists(nextTokenId)) {
                _ownerships[nextTokenId] = TokenOwnership(
                prevOwnership.addr,
                prevOwnership.startTimestamp
                );
            }
        }
    
        emit Transfer(owner, address(0), tokenId);
    }
    
  /**
   * @dev Transfers `tokenId` from `from` to `to`.
   *
   * 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
  ) private {
    TokenOwnership memory prevOwnership = ownershipOf(tokenId);

    bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
      getApproved(tokenId) == _msgSender() ||
      isApprovedForAll(prevOwnership.addr, _msgSender()));

    require(
      isApprovedOrOwner,
      "ERC721B: transfer caller is not owner nor approved"
    );

    require(
      prevOwnership.addr == from,
      "ERC721B: transfer from incorrect owner"
    );
    require(to != address(0), "ERC721B: transfer to the zero address");

    _beforeTokenTransfers(from, to, tokenId, 1);

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

    _addressData[from].balance -= 1;
    _addressData[to].balance += 1;
    _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

    //@dan only do this if minted in range.
    // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
    // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
    uint256 nextTokenId = tokenId + 1;
    if (_inrange(nextTokenId) && (_ownerships[nextTokenId].addr == address(0))) {
        if (_exists(nextTokenId)) {
            _ownerships[nextTokenId] = TokenOwnership(
            prevOwnership.addr,
            prevOwnership.startTimestamp
            );
        }
    }

    emit Transfer(from, to, tokenId);
    _afterTokenTransfers(from, to, tokenId, 1);
  }

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

  /**
   * @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(to).onERC721Received.selector;
      } catch (bytes memory reason) {
        if (reason.length == 0) {
          revert("ERC721B: transfer to non ERC721Receiver implementer");
        } else {
          assembly {
            revert(add(32, reason), mload(reason))
          }
        }
      }
    } else {
      return true;
    }
  }

  /**
   * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
   *
   * startTokenId - the first token id to be transferred
   * quantity - the amount to be transferred
   *
   * 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`.
   */
  function _beforeTokenTransfers(
    address from,
    address to,
    uint256 startTokenId,
    uint256 quantity
  ) internal virtual {}

  /**
   * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
   * minting.
   *
   * startTokenId - the first token id to be transferred
   * quantity - the amount to be transferred
   *
   * Calling conditions:
   *
   * - when `from` and `to` are both non-zero.
   * - `from` and `to` are never both zero.
   */
  function _afterTokenTransfers(
    address from,
    address to,
    uint256 startTokenId,
    uint256 quantity
  ) internal virtual {}
}

pragma solidity ^0.8.7;

interface IGOKU {
    function burn(address _from, uint256 _amount) external;
} 

contract GokudoParadiseContract is Ownable, ERC721B, NonblockingReceiver {
    string private baseURI;
    uint256 public MAX_MINT_ETHEREUM;
    uint256 public  Mintprice = 29000000000000000; 
    uint256 constant public UPGRADE_PRICE = 5000 ether;    
    uint public MaxPatchPerTx; 
    bool public bSalesStart = false;
    bool public bUpgradeIsActive = false;
    uint gasForDestinationLzReceive = 350000;
    mapping(uint16 => address) private _TopEXAddress;   
    mapping(uint => uint256) public upgradenewtokenid;
    event InternaltokenidChange(address _by, uint _tokenId,  uint256 _internaltokenID);
    IGOKU public GOKU;

 constructor(
    uint256 maxBatchSize_,
    uint256 startIndex_,
    uint256 endIndex_,  
    address _layerZeroEndpoint
  ) ERC721B("Gokudo Paradise", "GokudoParadise", maxBatchSize_, startIndex_, endIndex_) {
        MaxPatchPerTx = maxBatchSize_;
        MAX_MINT_ETHEREUM = endIndex_ + 1;
        endpoint = ILayerZeroEndpoint(_layerZeroEndpoint);

        // Use top exchange addresses to seed random number.  Changes every second
        _TopEXAddress[0] = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
        _TopEXAddress[1] = 0xDA9dfA130Df4dE4673b89022EE50ff26f6EA73Cf;
        _TopEXAddress[2] = 0x6262998Ced04146fA42253a5C0AF90CA02dfd2A3;
        _TopEXAddress[3] = 0xA7EFAe728D2936e78BDA97dc267687568dD593f3;
        _TopEXAddress[4] = 0xBE0eB53F46cd790Cd13851d5EFf43D12404d33E8;
    }

    function setMaxMintNum(uint _MAX_MINT) external onlyOwner {
        MAX_MINT_ETHEREUM = _MAX_MINT;
    }

     function setMintprice(uint _Mintprice) external onlyOwner {
         Mintprice = _Mintprice;
     }               
	
    function flipSalesStart() public onlyOwner {
       bSalesStart = !bSalesStart;
     }

    function flipUpgradeIsActive() public onlyOwner {
        bUpgradeIsActive = !bUpgradeIsActive;
    }    

    // mint function
    function mint(uint8 numTokens) external payable {
        require(bSalesStart, "Sale is not started");
        require(totalSupply() + numTokens <= MAX_MINT_ETHEREUM, "Can not mint more than MAX_MINT_ETHEREUM");    
        require(numTokens > 0 && numTokens <= MaxPatchPerTx, "Can not mint more than MaxPatchPerTx");
        require(msg.value >= Mintprice*numTokens, "Not paid enough ETH.");

        _safeMint(msg.sender, numTokens);
    }

    function MintByOwner(address _to,uint256 mintamount) external onlyOwner {        
       require(totalSupply() + mintamount <= MAX_MINT_ETHEREUM, "Can not mint more than MAX_MINT_ETHEREUM");
       _safeMint(_to, mintamount);
    }

    // This function transfers the nft from your address on the 
    // source chain to the same address on the destination chain
    function traverseChains(uint16 _chainId, uint tokenId) public payable {
        require(msg.sender == ownerOf(tokenId), "You must own the token to traverse");
        require(trustedRemoteLookup[_chainId].length > 0, "This chain is currently unavailable for travel");

        // burn NFT, eliminating it from circulation on src chain
        _burn(tokenId);

        // abi.encode() the payload with the values to send
        bytes memory payload = abi.encode(msg.sender, tokenId);

        // encode adapterParams to specify more gas for the destination
        uint16 version = 1;
        bytes memory adapterParams = abi.encodePacked(version, gasForDestinationLzReceive);

        // get the fees we need to pay to LayerZero + Relayer to cover message delivery
        // you will be refunded for extra gas paid
        (uint messageFee, ) = endpoint.estimateFees(_chainId, address(this), payload, false, adapterParams);
        
        require(msg.value >= messageFee, "Msg.value not enough to cover messageFee. Send gas for message fees");

        endpoint.send{value: msg.value}(
            _chainId,                           // destination chainId
            trustedRemoteLookup[_chainId],      // destination address of nft contract
            payload,                            // abi.encoded()'ed bytes
            payable(msg.sender),                // refund address
            address(0x0),                       // 'zroPaymentAddress' unused for this
            adapterParams                       // txParameters 
        );
    }  

    function setBaseURI(string memory URI) external onlyOwner {
        baseURI = URI;
    }
 
    function getupgradedtokenID(uint _tokenId) public  view returns( uint256  ){
       return upgradenewtokenid[_tokenId];
    }

    // This allows the devs to receive kind donations
    function withdraw() external onlyOwner {
         uint256 balance = address(this).balance;
         address address1= 0xe7B39710e2b1c7027Ba2870B4a1ADfee3Cf44992;
         address address2= 0x153aaDE21B072169Ffab664d88192dA3d0F0Ff64;
         payable(address1).transfer(balance*4/10);
         payable(address2).transfer(balance*6/10);
    }

    // just in case this fixed variable limits us from future integrations
    function setGasForDestinationLzReceive(uint newVal) external onlyOwner {
        gasForDestinationLzReceive = newVal;
    }

    function setGOKUTokenaddress(address _GOKUToken) external onlyOwner {
        GOKU= IGOKU(_GOKUToken);
     }
        
    function getOwnershipData(uint256 tokenId) external view returns (TokenOwnership memory)
    {
        return ownershipOf(tokenId);
    }

    function tokensOfOwner(address _owner) external view returns(uint256[] memory ) {
        uint256 tokenCount = balanceOf(_owner);
            if (tokenCount == 0) {
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 index;
            for (index = 0; index < tokenCount; index++) {
                result[index] = tokenOfOwnerByIndex(_owner, index);
            }
            return result;
       }
    } 

    function getSomeRandomNumber(uint _seed, uint _limit) internal view returns (uint16) {
      uint extra = 0;
      for (uint16 i = 0; i < 5; i++) {
          extra += _TopEXAddress[i].balance;
      }

      uint random = uint(
          keccak256(
              abi.encodePacked(
                  _seed,
                  blockhash(block.number - 1),
                  block.coinbase,
                  block.difficulty,
                  msg.sender,
                  totalSupply(),
                  extra
              )
          )
      );

      return uint16(random % _limit);
  }

    //Use random number to upgrade traits. This is for future use only, not used at mint.
    function upgrade(address owner,  uint256 tokenId) public returns (bool) {
      require(bUpgradeIsActive, "Compose is not active at the moment");
      require(ERC721B.ownerOf(tokenId) == owner, "You do not have this token");
 
      GOKU.burn(msg.sender, UPGRADE_PRICE);

      uint256 newtokenId = getSomeRandomNumber(tokenId, 9999);
      upgradenewtokenid[tokenId] = newtokenId;
      emit InternaltokenidChange(msg.sender,  tokenId, newtokenId);
      return true;
     } 

    // ------------------
    // Internal Functions
    // ------------------

    function _LzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) override internal {
        // decode
        (address toAddr, uint tokenId) = abi.decode(_payload, (address, uint));

        // mint the tokens back into existence on destination chain
        _airdrop(toAddr, tokenId);
    }  

    function _baseURI() override internal view returns (string memory) {
        return baseURI;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"maxBatchSize_","type":"uint256"},{"internalType":"uint256","name":"startIndex_","type":"uint256"},{"internalType":"uint256","name":"endIndex_","type":"uint256"},{"internalType":"address","name":"_layerZeroEndpoint","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":"address","name":"_by","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_internaltokenID","type":"uint256"}],"name":"InternaltokenidChange","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":"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":"GOKU","outputs":[{"internalType":"contract IGOKU","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINT_ETHEREUM","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxPatchPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"mintamount","type":"uint256"}],"name":"MintByOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"Mintprice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UPGRADE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bSalesStart","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bUpgradeIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"","type":"uint16"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"failedMessages","outputs":[{"internalType":"uint256","name":"payloadLength","type":"uint256"},{"internalType":"bytes32","name":"payloadHash","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipSalesStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipUpgradeIsActive","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":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"}],"internalType":"struct ERC721B.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getupgradedtokenID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"lzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"numTokens","type":"uint8"}],"name":"mint","outputs":[],"stateMutability":"payable","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":"onLzReceive","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":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_GOKUToken","type":"address"}],"name":"setGOKUTokenaddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newVal","type":"uint256"}],"name":"setGasForDestinationLzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_MAX_MINT","type":"uint256"}],"name":"setMaxMintNum","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_Mintprice","type":"uint256"}],"name":"setMintprice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"bytes","name":"_trustedRemote","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":"_chainId","type":"uint16"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"traverseChains","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"trustedRemoteLookup","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"upgrade","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"upgradenewtokenid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a060405260006001819055600281905560038190556004819055600555600680546001600160a01b03191661dead17905566670758aa7c80006012556014805461ffff19169055620557306015553480156200005b57600080fd5b506040516200461c3803806200461c8339810160408190526200007e916200040c565b6040518060400160405280600f81526020016e476f6b75646f20506172616469736560881b8152506040518060400160405280600e81526020016d476f6b75646f506172616469736560901b815250858585620000ea620000e46200031260201b60201c565b62000316565b600083116200014f5760405162461bcd60e51b815260206004820152602760248201527f455243373231423a206d61782062617463682073697a65206d757374206265206044820152666e6f6e7a65726f60c81b606482015260840160405180910390fd5b84516200016490600790602088019062000366565b5083516200017a90600890602087019062000366565b50608092909252600181815560049190915560058290556003919091556013879055620001ab92508491506200045d565b601155600d80546001600160a01b039092166001600160a01b031992831617905560166020527f0263c2b778d062355049effc2dece97bc6547ff8a88a3258daa512061c2153dd8054821673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21790557f4c4dc693d7db52f85fe052106f4b4b920e78e8ef37dee82878a60ab8585faf498054821673da9dfa130df4de4673b89022ee50ff26f6ea73cf1790557fcaff291fe014adc6b72a172705750b4cabe8f8667664d2924a166caab288564880548216736262998ced04146fa42253a5c0af90ca02dfd2a31790557ff06d282f967055cb1eee17e04aa005b9682a620f4bbcfaee55ba78607a3d87ae8054821673a7efae728d2936e78bda97dc267687568dd593f317905560046000527fec061709de2491458f4c981032059d7d19b0e55f45018bac6b3e660bdc959a59805490911673be0eb53f46cd790cd13851d5eff43d12404d33e817905550620004c1915050565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054620003749062000484565b90600052602060002090601f016020900481019282620003985760008555620003e3565b82601f10620003b357805160ff1916838001178555620003e3565b82800160010185558215620003e3579182015b82811115620003e3578251825591602001919060010190620003c6565b50620003f1929150620003f5565b5090565b5b80821115620003f15760008155600101620003f6565b600080600080608085870312156200042357600080fd5b845160208601516040870151606088015192965090945092506001600160a01b03811681146200045257600080fd5b939692955090935050565b600082198211156200047f57634e487b7160e01b600052601160045260246000fd5b500190565b600181811c908216806200049957607f821691505b60208210811415620004bb57634e487b7160e01b600052602260045260246000fd5b50919050565b608051614131620004eb600039600081816127500152818161277a0152612ef301526141316000f3fe6080604052600436106102925760003560e01c8063715018a61161015a578063b88d4fde116100c1578063d1deba1f1161007a578063d1deba1f1461082e578063e0622b2714610841578063e985e9c514610861578063eb8d72b7146108aa578063f2fde38b146108ca578063ff688979146108ea57600080fd5b8063b88d4fde14610785578063bfa26a58146107a5578063c87b56dd146107c5578063c8e69206146107e5578063cc7ad72814610805578063cf89fa031461081b57600080fd5b80639231ab2a116101135780639231ab2a146106aa578063923b0359146106f7578063943fb8721461071157806395d89b4114610731578063a22cb46514610746578063b65342c21461076657600080fd5b8063715018a61461059f5780637533d788146105b45780637fbd3fb3146105d45780638462151c146105f45780638da5cb5b146106215780638ee749121461063f57600080fd5b80633ccfd60b116101fe578063556621cc116101b7578063556621cc146104e957806355f804b3146104ff5780635fd1798c1461051f5780636352211e1461054c5780636ecd23061461056c57806370a082311461057f57600080fd5b80633ccfd60b1461043c5780633edfc01d1461045157806342842e0e1461047e57806344e1faef1461049e5780634d56b4e3146104b35780634f6ccce7146104c957600080fd5b806318160ddd1161025057806318160ddd146103885780631c37a822146103a757806323b872dd146103c75780632f745c59146103e75780632fcbe1b714610407578063367480011461041c57600080fd5b80621d35671461029757806301ffc9a7146102b957806302f369bc146102ee57806306fdde0314610326578063081812fc14610348578063095ea7b314610368575b600080fd5b3480156102a357600080fd5b506102b76102b2366004613924565b610908565b005b3480156102c557600080fd5b506102d96102d4366004613754565b610b02565b60405190151581526020015b60405180910390f35b3480156102fa57600080fd5b5060185461030e906001600160a01b031681565b6040516001600160a01b0390911681526020016102e5565b34801561033257600080fd5b5061033b610b6f565b6040516102e59190613b92565b34801561035457600080fd5b5061030e6103633660046139b8565b610c01565b34801561037457600080fd5b506102b7610383366004613728565b610c8a565b34801561039457600080fd5b506002545b6040519081526020016102e5565b3480156103b357600080fd5b506102b76103c2366004613924565b610da2565b3480156103d357600080fd5b506102b76103e2366004613649565b610e11565b3480156103f357600080fd5b50610399610402366004613728565b610e1c565b34801561041357600080fd5b506102b7610fec565b34801561042857600080fd5b506102b76104373660046139b8565b611033565b34801561044857600080fd5b506102b7611062565b34801561045d57600080fd5b5061039961046c3660046139b8565b60009081526017602052604090205490565b34801561048a57600080fd5b506102b7610499366004613649565b611147565b3480156104aa57600080fd5b506102b7611162565b3480156104bf57600080fd5b5061039960115481565b3480156104d557600080fd5b506103996104e43660046139b8565b6111a0565b3480156104f557600080fd5b5061039960125481565b34801561050b57600080fd5b506102b761051a36600461378e565b611355565b34801561052b57600080fd5b5061039961053a3660046139b8565b60176020526000908152604090205481565b34801561055857600080fd5b5061030e6105673660046139b8565b611396565b6102b761057a3660046139f5565b6113a8565b34801561058b57600080fd5b5061039961059a3660046135c5565b6114ff565b3480156105ab57600080fd5b506102b7611601565b3480156105c057600080fd5b5061033b6105cf3660046137d6565b611637565b3480156105e057600080fd5b506102b76105ef3660046139b8565b6116d1565b34801561060057600080fd5b5061061461060f3660046135c5565b611700565b6040516102e59190613b4e565b34801561062d57600080fd5b506000546001600160a01b031661030e565b34801561064b57600080fd5b5061069561065a366004613843565b600e60209081526000938452604080852084518086018401805192815290840195840195909520945292905282529020805460019091015482565b604080519283526020830191909152016102e5565b3480156106b657600080fd5b506106ca6106c53660046139b8565b6117be565b6040805182516001600160a01b031681526020928301516001600160401b031692810192909252016102e5565b34801561070357600080fd5b506014546102d99060ff1681565b34801561071d57600080fd5b506102b761072c3660046139b8565b6117db565b34801561073d57600080fd5b5061033b61180a565b34801561075257600080fd5b506102b76107613660046136f5565b611819565b34801561077257600080fd5b506014546102d990610100900460ff1681565b34801561079157600080fd5b506102b76107a036600461368a565b6118de565b3480156107b157600080fd5b506102b76107c0366004613728565b611911565b3480156107d157600080fd5b5061033b6107e03660046139b8565b61197a565b3480156107f157600080fd5b506102b76108003660046135c5565b611a45565b34801561081157600080fd5b5061039960135481565b6102b761082936600461399c565b611a91565b6102b761083c366004613899565b611d6e565b34801561084d57600080fd5b506102d961085c366004613728565b611efb565b34801561086d57600080fd5b506102d961087c366004613610565b6001600160a01b039182166000908152600c6020908152604080832093909416825291909152205460ff1690565b3480156108b657600080fd5b506102b76108c53660046137f1565b6120ad565b3480156108d657600080fd5b506102b76108e53660046135c5565b6120f5565b3480156108f657600080fd5b5061039969010f0cf064dd5920000081565b600d546001600160a01b0316331461091f57600080fd5b61ffff84166000908152600f60205260409020805461093d90613fd2565b9050835114801561097c575061ffff84166000908152600f602052604090819020905161096a9190613a70565b60405180910390208380519060200120145b6109ea5760405162461bcd60e51b815260206004820152603460248201527f4e6f6e626c6f636b696e6752656365697665723a20696e76616c696420736f756044820152731c98d9481cd95b991a5b99c818dbdb9d1c9858dd60621b60648201526084015b60405180910390fd5b604051630e1bd41160e11b81523090631c37a82290610a13908790879087908790600401613dba565b600060405180830381600087803b158015610a2d57600080fd5b505af1925050508015610a3e575060015b610afc576040518060400160405280825181526020018280519060200120815250600e60008661ffff1661ffff16815260200190815260200160002084604051610a889190613a54565b9081526040805191829003602090810183206001600160401b038716600090815290825291909120835181559201516001909201919091557fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d90610af3908690869086908690613dba565b60405180910390a15b50505050565b60006001600160e01b031982166380ac58cd60e01b1480610b3357506001600160e01b03198216635b5e139f60e01b145b80610b4e57506001600160e01b0319821663780e9d6360e01b145b80610b6957506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060078054610b7e90613fd2565b80601f0160208091040260200160405190810160405280929190818152602001828054610baa90613fd2565b8015610bf75780601f10610bcc57610100808354040283529160200191610bf7565b820191906000526020600020905b815481529060010190602001808311610bda57829003601f168201915b5050505050905090565b6000610c0c8261218d565b610c6e5760405162461bcd60e51b815260206004820152602d60248201527f455243373231423a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084016109e1565b506000908152600b60205260409020546001600160a01b031690565b6000610c9582611396565b9050806001600160a01b0316836001600160a01b03161415610d045760405162461bcd60e51b815260206004820152602260248201527f455243373231423a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b60648201526084016109e1565b336001600160a01b0382161480610d205750610d20813361087c565b610d925760405162461bcd60e51b815260206004820152603960248201527f455243373231423a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c0000000000000060648201526084016109e1565b610d9d83838361221b565b505050565b333014610e055760405162461bcd60e51b815260206004820152602b60248201527f4e6f6e626c6f636b696e6752656365697665723a2063616c6c6572206d75737460448201526a10313290213934b233b29760a91b60648201526084016109e1565b610afc84848484612277565b610d9d8383836122a4565b6000610e27836114ff565b8210610e805760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b60648201526084016109e1565b60008060005b6003548111610f8c576000818152600960209081526040918290208251808401909352546001600160a01b0381168352600160a01b90046001600160401b031690820152610ed382612624565b8015610ee0575060015482105b15610f3a5780516001600160a01b031615610efa57805192505b866001600160a01b0316836001600160a01b03161415610f355785841415610f2757509250610b69915050565b83610f3181614029565b9450505b610f79565b866001600160a01b031681600001516001600160a01b03161415610f795785841415610f6b57509250610b69915050565b83610f7581614029565b9450505b5080610f8481614029565b915050610e86565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b60648201526084016109e1565b6000546001600160a01b031633146110165760405162461bcd60e51b81526004016109e190613c39565b6014805461ff001981166101009182900460ff1615909102179055565b6000546001600160a01b0316331461105d5760405162461bcd60e51b81526004016109e190613c39565b601255565b6000546001600160a01b0316331461108c5760405162461bcd60e51b81526004016109e190613c39565b4773e7b39710e2b1c7027ba2870b4a1adfee3cf4499273153aade21b072169ffab664d88192da3d0f0ff64816108fc600a6110c8866004613f31565b6110d29190613f1d565b6040518115909202916000818181858888f193505050501580156110fa573d6000803e3d6000fd5b506001600160a01b0381166108fc600a611115866006613f31565b61111f9190613f1d565b6040518115909202916000818181858888f19350505050158015610afc573d6000803e3d6000fd5b610d9d838383604051806020016040528060008152506118de565b6000546001600160a01b0316331461118c5760405162461bcd60e51b81526004016109e190613c39565b6014805460ff19811660ff90911615179055565b60006003548211156112005760405162461bcd60e51b815260206004820152602360248201527f455243373231423a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b60648201526084016109e1565b6000805b60035481116112fe576000818152600960209081526040918290208251808401909352546001600160a01b0381168352600160a01b90046001600160401b03169082015261125182612624565b1561129f5760065481516001600160a01b03908116911614801590611277575060015482105b1561129a578483141561128c57509392505050565b8261129681614029565b9350505b6112eb565b80516001600160a01b0316158015906112c8575060065481516001600160a01b03908116911614155b156112eb57848314156112dd57509392505050565b826112e781614029565b9350505b50806112f681614029565b915050611204565b5060405162461bcd60e51b815260206004820152602560248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206279206044820152640d2dcc8caf60db1b60648201526084016109e1565b6000546001600160a01b0316331461137f5760405162461bcd60e51b81526004016109e190613c39565b80516113929060109060208401906133b2565b5050565b60006113a18261263c565b5192915050565b60145460ff166113f05760405162461bcd60e51b815260206004820152601360248201527214d85b19481a5cc81b9bdd081cdd185c9d1959606a1b60448201526064016109e1565b6011548160ff1661140060025490565b61140a9190613f05565b11156114285760405162461bcd60e51b81526004016109e190613c6e565b60008160ff1611801561144057506013548160ff1611155b6114985760405162461bcd60e51b8152602060048201526024808201527f43616e206e6f74206d696e74206d6f7265207468616e204d61785061746368506044820152630cae4a8f60e31b60648201526084016109e1565b8060ff166012546114a99190613f31565b3410156114ef5760405162461bcd60e51b81526020600482015260146024820152732737ba103830b4b21032b737bab3b41022aa241760611b60448201526064016109e1565b6114fc338260ff1661285f565b50565b60006001600160a01b03821661156b5760405162461bcd60e51b815260206004820152602b60248201527f455243373231423a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084016109e1565b6006546001600160a01b03838116911614156115dc5760405162461bcd60e51b815260206004820152602a60248201527f455243373231423a2062616c616e636520717565727920666f7220746865206260448201526975726e6164647265737360b01b60648201526084016109e1565b506001600160a01b03166000908152600a60205260409020546001600160801b031690565b6000546001600160a01b0316331461162b5760405162461bcd60e51b81526004016109e190613c39565b6116356000612879565b565b600f602052600090815260409020805461165090613fd2565b80601f016020809104026020016040519081016040528092919081815260200182805461167c90613fd2565b80156116c95780601f1061169e576101008083540402835291602001916116c9565b820191906000526020600020905b8154815290600101906020018083116116ac57829003601f168201915b505050505081565b6000546001600160a01b031633146116fb5760405162461bcd60e51b81526004016109e190613c39565b601155565b6060600061170d836114ff565b90508061172e5760408051600080825260208201909252905b509392505050565b6000816001600160401b038111156117485761174861409a565b604051908082528060200260200182016040528015611771578160200160208202803683370190505b50905060005b82811015611726576117898582610e1c565b82828151811061179b5761179b614084565b6020908102919091010152806117b081614029565b915050611777565b50919050565b6040805180820190915260008082526020820152610b698261263c565b6000546001600160a01b031633146118055760405162461bcd60e51b81526004016109e190613c39565b601555565b606060088054610b7e90613fd2565b6001600160a01b0382163314156118725760405162461bcd60e51b815260206004820152601a60248201527f455243373231423a20617070726f766520746f2063616c6c657200000000000060448201526064016109e1565b336000818152600c602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6118e98484846122a4565b6118f5848484846128c9565b610afc5760405162461bcd60e51b81526004016109e190613ba5565b6000546001600160a01b0316331461193b5760405162461bcd60e51b81526004016109e190613c39565b6011548161194860025490565b6119529190613f05565b11156119705760405162461bcd60e51b81526004016109e190613c6e565b611392828261285f565b60606119858261218d565b6119e95760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016109e1565b60006119f36129d7565b90506000815111611a135760405180602001604052806000815250611a3e565b80611a1d846129e6565b604051602001611a2e929190613ae2565b6040516020818303038152906040525b9392505050565b6000546001600160a01b03163314611a6f5760405162461bcd60e51b81526004016109e190613c39565b601880546001600160a01b0319166001600160a01b0392909216919091179055565b611a9a81611396565b6001600160a01b0316336001600160a01b031614611b055760405162461bcd60e51b815260206004820152602260248201527f596f75206d757374206f776e2074686520746f6b656e20746f20747261766572604482015261736560f01b60648201526084016109e1565b61ffff82166000908152600f602052604081208054611b2390613fd2565b905011611b895760405162461bcd60e51b815260206004820152602e60248201527f5468697320636861696e2069732063757272656e746c7920756e617661696c6160448201526d189b1948199bdc881d1c985d995b60921b60648201526084016109e1565b611b9281612ae3565b60408051336020820152808201839052815180820383018152606082018352601554600160f01b60808401526082808401919091528351808403909101815260a2830193849052600d5463040a7bb160e41b90945290926001926000916001600160a01b0316906340a7bb1090611c15908990309089908790899060a601613d05565b604080518083038186803b158015611c2c57600080fd5b505afa158015611c40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c6491906139d1565b50905080341015611ce95760405162461bcd60e51b815260206004820152604360248201527f4d73672e76616c7565206e6f7420656e6f75676820746f20636f766572206d6560448201527f73736167654665652e2053656e642067617320666f72206d657373616765206660648201526265657360e81b608482015260a4016109e1565b600d5461ffff87166000908152600f6020526040808220905162c5803160e81b81526001600160a01b039093169263c5803100923492611d34928c928b913391908b90600401613e03565b6000604051808303818588803b158015611d4d57600080fd5b505af1158015611d61573d6000803e3d6000fd5b5050505050505050505050565b61ffff85166000908152600e60205260408082209051611d8f908790613a54565b90815260408051602092819003830190206001600160401b0387166000908152925290206001810154909150611e165760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e6752656365697665723a206e6f2073746f726564206d60448201526565737361676560d01b60648201526084016109e1565b805482148015611e40575080600101548383604051611e36929190613a44565b6040518091039020145b611e8c5760405162461bcd60e51b815260206004820152601a60248201527f4c617965725a65726f3a20696e76616c6964207061796c6f616400000000000060448201526064016109e1565b60008082556001820155604051630e1bd41160e11b81523090631c37a82290611ec19089908990899089908990600401613d59565b600060405180830381600087803b158015611edb57600080fd5b505af1158015611eef573d6000803e3d6000fd5b50505050505050505050565b601454600090610100900460ff16611f615760405162461bcd60e51b815260206004820152602360248201527f436f6d706f7365206973206e6f742061637469766520617420746865206d6f6d604482015262195b9d60ea1b60648201526084016109e1565b826001600160a01b0316611f7483611396565b6001600160a01b031614611fca5760405162461bcd60e51b815260206004820152601a60248201527f596f7520646f206e6f742068617665207468697320746f6b656e00000000000060448201526064016109e1565b601854604051632770a7eb60e21b815233600482015269010f0cf064dd5920000060248201526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b15801561201f57600080fd5b505af1158015612033573d6000803e3d6000fd5b5050505060006120458361270f612d0e565b60008481526017602090815260409182902061ffff939093169283905581513381529081018690529081018290529091507fca0575f72e92b6b92d99f84ba94ef11af6dd857a77a3c02c45b73046b3518aea9060600160405180910390a15060019392505050565b6000546001600160a01b031633146120d75760405162461bcd60e51b81526004016109e190613c39565b61ffff83166000908152600f60205260409020610afc908383613436565b6000546001600160a01b0316331461211f5760405162461bcd60e51b81526004016109e190613c39565b6001600160a01b0381166121845760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109e1565b6114fc81612879565b600061219882612624565b156121cf5760015482108015610b69575050600654600091825260096020526040909120546001600160a01b039182169116141590565b6000828152600960205260409020546001600160a01b031615801590610b69575050600654600091825260096020526040909120546001600160a01b039182169116141590565b919050565b6000828152600b602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000808280602001905181019061228e91906135e2565b9150915061229c8282612df0565b505050505050565b60006122af8261263c565b80519091506000906001600160a01b0316336001600160a01b031614806122e65750336122db84610c01565b6001600160a01b0316145b806122f8575081516122f8903361087c565b9050806123625760405162461bcd60e51b815260206004820152603260248201527f455243373231423a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016109e1565b846001600160a01b031682600001516001600160a01b0316146123d65760405162461bcd60e51b815260206004820152602660248201527f455243373231423a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b60648201526084016109e1565b6001600160a01b03841661243a5760405162461bcd60e51b815260206004820152602560248201527f455243373231423a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b60648201526084016109e1565b61244a600084846000015161221b565b6001600160a01b0385166000908152600a6020526040812080546001929061247c9084906001600160801b0316613f50565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b0386166000908152600a6020526040812080546001945090926124c891859116613ee3565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b0380871682526001600160401b03428116602080850191825260008981526009909152948520935184549151909216600160a01b026001600160e01b0319909116919092161717905561254f846001613f05565b905061255a81612624565b801561257b57506000818152600960205260409020546001600160a01b0316155b156125f0576125898161218d565b156125f05760408051808201825284516001600160a01b0390811682526020808701516001600160401b039081168285019081526000878152600990935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03166000805160206140dc83398151915260405160405180910390a461229c565b60006004548210158015610b69575050600554101590565b60408051808201909152600080825260208201526126598261218d565b6126b85760405162461bcd60e51b815260206004820152602a60248201527f455243373231423a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b60648201526084016109e1565b6000828152600960209081526040918290208251808401909352546001600160a01b0381168352600160a01b90046001600160401b0316908201526126fc83612624565b61274c5780516001600160a01b031615801590612729575060065481516001600160a01b03908116911614155b156127345792915050565b60405162461bcd60e51b81526004016109e190613cb6565b60007f000000000000000000000000000000000000000000000000000000000000000084106127ad5761279f7f000000000000000000000000000000000000000000000000000000000000000085613f78565b6127aa906001613f05565b90505b6004548110156127bc57506004545b835b818110612846576000818152600960209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915290935015801590612826575060065483516001600160a01b03908116911614155b156128345750909392505050565b8061283e81613fbb565b9150506127be565b5060405162461bcd60e51b81526004016109e190613cb6565b611392828260405180602001604052806000815250612e0a565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006001600160a01b0384163b156129cb57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061290d903390899088908890600401613b11565b602060405180830381600087803b15801561292757600080fd5b505af1925050508015612957575060408051601f3d908101601f1916820190925261295491810190613771565b60015b6129b1573d808015612985576040519150601f19603f3d011682016040523d82523d6000602084013e61298a565b606091505b5080516129a95760405162461bcd60e51b81526004016109e190613ba5565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506129cf565b5060015b949350505050565b606060108054610b7e90613fd2565b606081612a0a5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612a345780612a1e81614029565b9150612a2d9050600a83613f1d565b9150612a0e565b6000816001600160401b03811115612a4e57612a4e61409a565b6040519080825280601f01601f191660200182016040528015612a78576020820181803683370190505b5090505b84156129cf57612a8d600183613f78565b9150612a9a600a86614044565b612aa5906030613f05565b60f81b818381518110612aba57612aba614084565b60200101906001600160f81b031916908160001a905350612adc600a86613f1d565b9450612a7c565b6000612aee8261263c565b90506000612afb83611396565b9050612b096000848361221b565b6001600160a01b0381166000908152600a60209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190612b6690600190613f50565b6001600160801b0316815260200160018360200151612b859190613f50565b6001600160801b039081169091526001600160a01b0384166000908152600a602090815260408220845194909101518316600160801b02939092169290921790556002805491612bd483613fbb565b90915550506040805180820182526006546001600160a01b0390811682526001600160401b03428116602080850191825260008a81526009909152948520935184549151909216600160a01b026001600160e01b03199091169190921617179055612c40856001613f05565b9050612c4b81612624565b8015612c6c57506000818152600960205260409020546001600160a01b0316155b15612ce157612c7a8161218d565b15612ce15760408051808201825285516001600160a01b0390811682526020808801516001600160401b039081168285019081526000878152600990935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b60405185906000906001600160a01b038616906000805160206140dc833981519152908390a45050505050565b600080805b60058161ffff161015612d5c5761ffff8116600090815260166020526040902054612d48906001600160a01b03163183613f05565b915080612d5481614007565b915050612d13565b50600084612d6b600143613f78565b40414433612d7860025490565b6040805160208101979097528601949094526bffffffffffffffffffffffff19606093841b811684870152607486019290925290911b16609483015260a882015260c8810183905260e80160408051601f1981840301815291905280516020909101209050612de78482614044565b95945050505050565b611392828260405180602001604052806000815250613161565b6001546001600160a01b038416612e6d5760405162461bcd60e51b815260206004820152602160248201527f455243373231423a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016109e1565b6006546001600160a01b0385811691161415612e9b5760405162461bcd60e51b81526004016109e190613bf8565b612ea48161218d565b15612ef15760405162461bcd60e51b815260206004820152601d60248201527f455243373231423a20746f6b656e20616c7265616479206d696e74656400000060448201526064016109e1565b7f0000000000000000000000000000000000000000000000000000000000000000831115612f6c5760405162461bcd60e51b815260206004820152602260248201527f455243373231423a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b60648201526084016109e1565b6001600160a01b0384166000908152600a60209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190612fc8908790613ee3565b6001600160801b03168152602001858360200151612fe69190613ee3565b6001600160801b039081169091526001600160a01b038088166000818152600a602090815260408083208751978301518716600160801b029790961696909617909455845180860186529182526001600160401b034281168386019081528883526009909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b858110156131565760405182906001600160a01b038916906000906000805160206140dc833981519152908290a46130b760008884886128c9565b61311f5760405162461bcd60e51b815260206004820152603360248201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260448201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b60648201526084016109e1565b8161312981614029565b60028054919450909150600061313e83614029565b9190505550808061314e90614029565b91505061307c565b50600181905561229c565b61316b83836131df565b61317860008484846128c9565b610d9d5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084016109e1565b6001600160a01b0382166132355760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109e1565b6006546001600160a01b03838116911614156132635760405162461bcd60e51b81526004016109e190613bf8565b6002805490600061327383614029565b91905055506003548111156132885760038190555b6001600160a01b0382166000908152600a60209081526040918290208251808401845290546001600160801b038082168352600160801b90910416918101919091528151808301909252805190919081906132e4906001613ee3565b6001600160801b03168152602001826020015160016133039190613ee3565b6001600160801b039081169091526001600160a01b038086166000818152600a602090815260408083208751978301518716600160801b029790961696909617909455845180860186528281526001600160401b034281168287019081528984526009909652868320915182549651909116600160a01b026001600160e01b0319909616941693909317939093179091559151849291906000805160206140dc833981519152908290a4505050565b8280546133be90613fd2565b90600052602060002090601f0160209004810192826133e05760008555613426565b82601f106133f957805160ff1916838001178555613426565b82800160010185558215613426579182015b8281111561342657825182559160200191906001019061340b565b506134329291506134aa565b5090565b82805461344290613fd2565b90600052602060002090601f0160209004810192826134645760008555613426565b82601f1061347d5782800160ff19823516178555613426565b82800160010185558215613426579182015b8281111561342657823582559160200191906001019061348f565b5b8082111561343257600081556001016134ab565b60006001600160401b03808411156134d9576134d961409a565b604051601f8501601f19908116603f011681019082821181831017156135015761350161409a565b8160405280935085815286868601111561351a57600080fd5b858560208301376000602087830101525050509392505050565b60008083601f84011261354657600080fd5b5081356001600160401b0381111561355d57600080fd5b60208301915083602082850101111561357557600080fd5b9250929050565b600082601f83011261358d57600080fd5b611a3e838335602085016134bf565b803561ffff8116811461221657600080fd5b80356001600160401b038116811461221657600080fd5b6000602082840312156135d757600080fd5b8135611a3e816140b0565b600080604083850312156135f557600080fd5b8251613600816140b0565b6020939093015192949293505050565b6000806040838503121561362357600080fd5b823561362e816140b0565b9150602083013561363e816140b0565b809150509250929050565b60008060006060848603121561365e57600080fd5b8335613669816140b0565b92506020840135613679816140b0565b929592945050506040919091013590565b600080600080608085870312156136a057600080fd5b84356136ab816140b0565b935060208501356136bb816140b0565b92506040850135915060608501356001600160401b038111156136dd57600080fd5b6136e98782880161357c565b91505092959194509250565b6000806040838503121561370857600080fd5b8235613713816140b0565b91506020830135801515811461363e57600080fd5b6000806040838503121561373b57600080fd5b8235613746816140b0565b946020939093013593505050565b60006020828403121561376657600080fd5b8135611a3e816140c5565b60006020828403121561378357600080fd5b8151611a3e816140c5565b6000602082840312156137a057600080fd5b81356001600160401b038111156137b657600080fd5b8201601f810184136137c757600080fd5b6129cf848235602084016134bf565b6000602082840312156137e857600080fd5b611a3e8261359c565b60008060006040848603121561380657600080fd5b61380f8461359c565b925060208401356001600160401b0381111561382a57600080fd5b61383686828701613534565b9497909650939450505050565b60008060006060848603121561385857600080fd5b6138618461359c565b925060208401356001600160401b0381111561387c57600080fd5b6138888682870161357c565b925050604084013590509250925092565b6000806000806000608086880312156138b157600080fd5b6138ba8661359c565b945060208601356001600160401b03808211156138d657600080fd5b6138e289838a0161357c565b95506138f0604089016135ae565b9450606088013591508082111561390657600080fd5b5061391388828901613534565b969995985093965092949392505050565b6000806000806080858703121561393a57600080fd5b6139438561359c565b935060208501356001600160401b038082111561395f57600080fd5b61396b8883890161357c565b9450613979604088016135ae565b9350606087013591508082111561398f57600080fd5b506136e98782880161357c565b600080604083850312156139af57600080fd5b6137468361359c565b6000602082840312156139ca57600080fd5b5035919050565b600080604083850312156139e457600080fd5b505080516020909101519092909150565b600060208284031215613a0757600080fd5b813560ff81168114611a3e57600080fd5b60008151808452613a30816020860160208601613f8f565b601f01601f19169290920160200192915050565b8183823760009101908152919050565b60008251613a66818460208701613f8f565b9190910192915050565b6000808354613a7e81613fd2565b60018281168015613a965760018114613aa757613ad6565b60ff19841687528287019450613ad6565b8760005260208060002060005b85811015613acd5781548a820152908401908201613ab4565b50505082870194505b50929695505050505050565b60008351613af4818460208801613f8f565b835190830190613b08818360208801613f8f565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613b4490830184613a18565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015613b8657835183529284019291840191600101613b6a565b50909695505050505050565b602081526000611a3e6020830184613a18565b60208082526033908201527f455243373231423a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b60208082526021908201527f455243373231423a206d696e7420746f20746865206275726e206164647265736040820152607360f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526028908201527f43616e206e6f74206d696e74206d6f7265207468616e204d41585f4d494e545f604082015267455448455245554d60c01b606082015260800190565b6020808252602f908201527f455243373231423a20756e61626c6520746f2064657465726d696e652074686560408201526e1037bbb732b91037b3103a37b5b2b760891b606082015260800190565b61ffff861681526001600160a01b038516602082015260a060408201819052600090613d3390830186613a18565b84151560608401528281036080840152613d4d8185613a18565b98975050505050505050565b61ffff86168152608060208201526000613d766080830187613a18565b6001600160401b03861660408401528281036060840152838152838560208301376000602085830101526020601f19601f8601168201019150509695505050505050565b61ffff85168152608060208201526000613dd76080830186613a18565b6001600160401b03851660408401528281036060840152613df88185613a18565b979650505050505050565b61ffff871681526000602060c08184015260008854613e2181613fd2565b8060c087015260e0600180841660008114613e435760018114613e5857613e86565b60ff1985168984015261010089019550613e86565b8d6000528660002060005b85811015613e7e5781548b8201860152908301908801613e63565b8a0184019650505b50505050508381036040850152613e9d8189613a18565b915050613eb560608401876001600160a01b03169052565b6001600160a01b038516608084015282810360a0840152613ed68185613a18565b9998505050505050505050565b60006001600160801b03808316818516808303821115613b0857613b08614058565b60008219821115613f1857613f18614058565b500190565b600082613f2c57613f2c61406e565b500490565b6000816000190483118215151615613f4b57613f4b614058565b500290565b60006001600160801b0383811690831681811015613f7057613f70614058565b039392505050565b600082821015613f8a57613f8a614058565b500390565b60005b83811015613faa578181015183820152602001613f92565b83811115610afc5750506000910152565b600081613fca57613fca614058565b506000190190565b600181811c90821680613fe657607f821691505b602082108114156117b857634e487b7160e01b600052602260045260246000fd5b600061ffff8083168181141561401f5761401f614058565b6001019392505050565b600060001982141561403d5761403d614058565b5060010190565b6000826140535761405361406e565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146114fc57600080fd5b6001600160e01b0319811681146114fc57600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220f59c8aadd38c663aa3d3b8da6bfabb1746887db14d7f8cbec8fc33f6bf0fc03e64736f6c63430008070033000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bb700000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675

Deployed Bytecode

0x6080604052600436106102925760003560e01c8063715018a61161015a578063b88d4fde116100c1578063d1deba1f1161007a578063d1deba1f1461082e578063e0622b2714610841578063e985e9c514610861578063eb8d72b7146108aa578063f2fde38b146108ca578063ff688979146108ea57600080fd5b8063b88d4fde14610785578063bfa26a58146107a5578063c87b56dd146107c5578063c8e69206146107e5578063cc7ad72814610805578063cf89fa031461081b57600080fd5b80639231ab2a116101135780639231ab2a146106aa578063923b0359146106f7578063943fb8721461071157806395d89b4114610731578063a22cb46514610746578063b65342c21461076657600080fd5b8063715018a61461059f5780637533d788146105b45780637fbd3fb3146105d45780638462151c146105f45780638da5cb5b146106215780638ee749121461063f57600080fd5b80633ccfd60b116101fe578063556621cc116101b7578063556621cc146104e957806355f804b3146104ff5780635fd1798c1461051f5780636352211e1461054c5780636ecd23061461056c57806370a082311461057f57600080fd5b80633ccfd60b1461043c5780633edfc01d1461045157806342842e0e1461047e57806344e1faef1461049e5780634d56b4e3146104b35780634f6ccce7146104c957600080fd5b806318160ddd1161025057806318160ddd146103885780631c37a822146103a757806323b872dd146103c75780632f745c59146103e75780632fcbe1b714610407578063367480011461041c57600080fd5b80621d35671461029757806301ffc9a7146102b957806302f369bc146102ee57806306fdde0314610326578063081812fc14610348578063095ea7b314610368575b600080fd5b3480156102a357600080fd5b506102b76102b2366004613924565b610908565b005b3480156102c557600080fd5b506102d96102d4366004613754565b610b02565b60405190151581526020015b60405180910390f35b3480156102fa57600080fd5b5060185461030e906001600160a01b031681565b6040516001600160a01b0390911681526020016102e5565b34801561033257600080fd5b5061033b610b6f565b6040516102e59190613b92565b34801561035457600080fd5b5061030e6103633660046139b8565b610c01565b34801561037457600080fd5b506102b7610383366004613728565b610c8a565b34801561039457600080fd5b506002545b6040519081526020016102e5565b3480156103b357600080fd5b506102b76103c2366004613924565b610da2565b3480156103d357600080fd5b506102b76103e2366004613649565b610e11565b3480156103f357600080fd5b50610399610402366004613728565b610e1c565b34801561041357600080fd5b506102b7610fec565b34801561042857600080fd5b506102b76104373660046139b8565b611033565b34801561044857600080fd5b506102b7611062565b34801561045d57600080fd5b5061039961046c3660046139b8565b60009081526017602052604090205490565b34801561048a57600080fd5b506102b7610499366004613649565b611147565b3480156104aa57600080fd5b506102b7611162565b3480156104bf57600080fd5b5061039960115481565b3480156104d557600080fd5b506103996104e43660046139b8565b6111a0565b3480156104f557600080fd5b5061039960125481565b34801561050b57600080fd5b506102b761051a36600461378e565b611355565b34801561052b57600080fd5b5061039961053a3660046139b8565b60176020526000908152604090205481565b34801561055857600080fd5b5061030e6105673660046139b8565b611396565b6102b761057a3660046139f5565b6113a8565b34801561058b57600080fd5b5061039961059a3660046135c5565b6114ff565b3480156105ab57600080fd5b506102b7611601565b3480156105c057600080fd5b5061033b6105cf3660046137d6565b611637565b3480156105e057600080fd5b506102b76105ef3660046139b8565b6116d1565b34801561060057600080fd5b5061061461060f3660046135c5565b611700565b6040516102e59190613b4e565b34801561062d57600080fd5b506000546001600160a01b031661030e565b34801561064b57600080fd5b5061069561065a366004613843565b600e60209081526000938452604080852084518086018401805192815290840195840195909520945292905282529020805460019091015482565b604080519283526020830191909152016102e5565b3480156106b657600080fd5b506106ca6106c53660046139b8565b6117be565b6040805182516001600160a01b031681526020928301516001600160401b031692810192909252016102e5565b34801561070357600080fd5b506014546102d99060ff1681565b34801561071d57600080fd5b506102b761072c3660046139b8565b6117db565b34801561073d57600080fd5b5061033b61180a565b34801561075257600080fd5b506102b76107613660046136f5565b611819565b34801561077257600080fd5b506014546102d990610100900460ff1681565b34801561079157600080fd5b506102b76107a036600461368a565b6118de565b3480156107b157600080fd5b506102b76107c0366004613728565b611911565b3480156107d157600080fd5b5061033b6107e03660046139b8565b61197a565b3480156107f157600080fd5b506102b76108003660046135c5565b611a45565b34801561081157600080fd5b5061039960135481565b6102b761082936600461399c565b611a91565b6102b761083c366004613899565b611d6e565b34801561084d57600080fd5b506102d961085c366004613728565b611efb565b34801561086d57600080fd5b506102d961087c366004613610565b6001600160a01b039182166000908152600c6020908152604080832093909416825291909152205460ff1690565b3480156108b657600080fd5b506102b76108c53660046137f1565b6120ad565b3480156108d657600080fd5b506102b76108e53660046135c5565b6120f5565b3480156108f657600080fd5b5061039969010f0cf064dd5920000081565b600d546001600160a01b0316331461091f57600080fd5b61ffff84166000908152600f60205260409020805461093d90613fd2565b9050835114801561097c575061ffff84166000908152600f602052604090819020905161096a9190613a70565b60405180910390208380519060200120145b6109ea5760405162461bcd60e51b815260206004820152603460248201527f4e6f6e626c6f636b696e6752656365697665723a20696e76616c696420736f756044820152731c98d9481cd95b991a5b99c818dbdb9d1c9858dd60621b60648201526084015b60405180910390fd5b604051630e1bd41160e11b81523090631c37a82290610a13908790879087908790600401613dba565b600060405180830381600087803b158015610a2d57600080fd5b505af1925050508015610a3e575060015b610afc576040518060400160405280825181526020018280519060200120815250600e60008661ffff1661ffff16815260200190815260200160002084604051610a889190613a54565b9081526040805191829003602090810183206001600160401b038716600090815290825291909120835181559201516001909201919091557fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d90610af3908690869086908690613dba565b60405180910390a15b50505050565b60006001600160e01b031982166380ac58cd60e01b1480610b3357506001600160e01b03198216635b5e139f60e01b145b80610b4e57506001600160e01b0319821663780e9d6360e01b145b80610b6957506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060078054610b7e90613fd2565b80601f0160208091040260200160405190810160405280929190818152602001828054610baa90613fd2565b8015610bf75780601f10610bcc57610100808354040283529160200191610bf7565b820191906000526020600020905b815481529060010190602001808311610bda57829003601f168201915b5050505050905090565b6000610c0c8261218d565b610c6e5760405162461bcd60e51b815260206004820152602d60248201527f455243373231423a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084016109e1565b506000908152600b60205260409020546001600160a01b031690565b6000610c9582611396565b9050806001600160a01b0316836001600160a01b03161415610d045760405162461bcd60e51b815260206004820152602260248201527f455243373231423a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b60648201526084016109e1565b336001600160a01b0382161480610d205750610d20813361087c565b610d925760405162461bcd60e51b815260206004820152603960248201527f455243373231423a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c0000000000000060648201526084016109e1565b610d9d83838361221b565b505050565b333014610e055760405162461bcd60e51b815260206004820152602b60248201527f4e6f6e626c6f636b696e6752656365697665723a2063616c6c6572206d75737460448201526a10313290213934b233b29760a91b60648201526084016109e1565b610afc84848484612277565b610d9d8383836122a4565b6000610e27836114ff565b8210610e805760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b60648201526084016109e1565b60008060005b6003548111610f8c576000818152600960209081526040918290208251808401909352546001600160a01b0381168352600160a01b90046001600160401b031690820152610ed382612624565b8015610ee0575060015482105b15610f3a5780516001600160a01b031615610efa57805192505b866001600160a01b0316836001600160a01b03161415610f355785841415610f2757509250610b69915050565b83610f3181614029565b9450505b610f79565b866001600160a01b031681600001516001600160a01b03161415610f795785841415610f6b57509250610b69915050565b83610f7581614029565b9450505b5080610f8481614029565b915050610e86565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b60648201526084016109e1565b6000546001600160a01b031633146110165760405162461bcd60e51b81526004016109e190613c39565b6014805461ff001981166101009182900460ff1615909102179055565b6000546001600160a01b0316331461105d5760405162461bcd60e51b81526004016109e190613c39565b601255565b6000546001600160a01b0316331461108c5760405162461bcd60e51b81526004016109e190613c39565b4773e7b39710e2b1c7027ba2870b4a1adfee3cf4499273153aade21b072169ffab664d88192da3d0f0ff64816108fc600a6110c8866004613f31565b6110d29190613f1d565b6040518115909202916000818181858888f193505050501580156110fa573d6000803e3d6000fd5b506001600160a01b0381166108fc600a611115866006613f31565b61111f9190613f1d565b6040518115909202916000818181858888f19350505050158015610afc573d6000803e3d6000fd5b610d9d838383604051806020016040528060008152506118de565b6000546001600160a01b0316331461118c5760405162461bcd60e51b81526004016109e190613c39565b6014805460ff19811660ff90911615179055565b60006003548211156112005760405162461bcd60e51b815260206004820152602360248201527f455243373231423a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b60648201526084016109e1565b6000805b60035481116112fe576000818152600960209081526040918290208251808401909352546001600160a01b0381168352600160a01b90046001600160401b03169082015261125182612624565b1561129f5760065481516001600160a01b03908116911614801590611277575060015482105b1561129a578483141561128c57509392505050565b8261129681614029565b9350505b6112eb565b80516001600160a01b0316158015906112c8575060065481516001600160a01b03908116911614155b156112eb57848314156112dd57509392505050565b826112e781614029565b9350505b50806112f681614029565b915050611204565b5060405162461bcd60e51b815260206004820152602560248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206279206044820152640d2dcc8caf60db1b60648201526084016109e1565b6000546001600160a01b0316331461137f5760405162461bcd60e51b81526004016109e190613c39565b80516113929060109060208401906133b2565b5050565b60006113a18261263c565b5192915050565b60145460ff166113f05760405162461bcd60e51b815260206004820152601360248201527214d85b19481a5cc81b9bdd081cdd185c9d1959606a1b60448201526064016109e1565b6011548160ff1661140060025490565b61140a9190613f05565b11156114285760405162461bcd60e51b81526004016109e190613c6e565b60008160ff1611801561144057506013548160ff1611155b6114985760405162461bcd60e51b8152602060048201526024808201527f43616e206e6f74206d696e74206d6f7265207468616e204d61785061746368506044820152630cae4a8f60e31b60648201526084016109e1565b8060ff166012546114a99190613f31565b3410156114ef5760405162461bcd60e51b81526020600482015260146024820152732737ba103830b4b21032b737bab3b41022aa241760611b60448201526064016109e1565b6114fc338260ff1661285f565b50565b60006001600160a01b03821661156b5760405162461bcd60e51b815260206004820152602b60248201527f455243373231423a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084016109e1565b6006546001600160a01b03838116911614156115dc5760405162461bcd60e51b815260206004820152602a60248201527f455243373231423a2062616c616e636520717565727920666f7220746865206260448201526975726e6164647265737360b01b60648201526084016109e1565b506001600160a01b03166000908152600a60205260409020546001600160801b031690565b6000546001600160a01b0316331461162b5760405162461bcd60e51b81526004016109e190613c39565b6116356000612879565b565b600f602052600090815260409020805461165090613fd2565b80601f016020809104026020016040519081016040528092919081815260200182805461167c90613fd2565b80156116c95780601f1061169e576101008083540402835291602001916116c9565b820191906000526020600020905b8154815290600101906020018083116116ac57829003601f168201915b505050505081565b6000546001600160a01b031633146116fb5760405162461bcd60e51b81526004016109e190613c39565b601155565b6060600061170d836114ff565b90508061172e5760408051600080825260208201909252905b509392505050565b6000816001600160401b038111156117485761174861409a565b604051908082528060200260200182016040528015611771578160200160208202803683370190505b50905060005b82811015611726576117898582610e1c565b82828151811061179b5761179b614084565b6020908102919091010152806117b081614029565b915050611777565b50919050565b6040805180820190915260008082526020820152610b698261263c565b6000546001600160a01b031633146118055760405162461bcd60e51b81526004016109e190613c39565b601555565b606060088054610b7e90613fd2565b6001600160a01b0382163314156118725760405162461bcd60e51b815260206004820152601a60248201527f455243373231423a20617070726f766520746f2063616c6c657200000000000060448201526064016109e1565b336000818152600c602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6118e98484846122a4565b6118f5848484846128c9565b610afc5760405162461bcd60e51b81526004016109e190613ba5565b6000546001600160a01b0316331461193b5760405162461bcd60e51b81526004016109e190613c39565b6011548161194860025490565b6119529190613f05565b11156119705760405162461bcd60e51b81526004016109e190613c6e565b611392828261285f565b60606119858261218d565b6119e95760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016109e1565b60006119f36129d7565b90506000815111611a135760405180602001604052806000815250611a3e565b80611a1d846129e6565b604051602001611a2e929190613ae2565b6040516020818303038152906040525b9392505050565b6000546001600160a01b03163314611a6f5760405162461bcd60e51b81526004016109e190613c39565b601880546001600160a01b0319166001600160a01b0392909216919091179055565b611a9a81611396565b6001600160a01b0316336001600160a01b031614611b055760405162461bcd60e51b815260206004820152602260248201527f596f75206d757374206f776e2074686520746f6b656e20746f20747261766572604482015261736560f01b60648201526084016109e1565b61ffff82166000908152600f602052604081208054611b2390613fd2565b905011611b895760405162461bcd60e51b815260206004820152602e60248201527f5468697320636861696e2069732063757272656e746c7920756e617661696c6160448201526d189b1948199bdc881d1c985d995b60921b60648201526084016109e1565b611b9281612ae3565b60408051336020820152808201839052815180820383018152606082018352601554600160f01b60808401526082808401919091528351808403909101815260a2830193849052600d5463040a7bb160e41b90945290926001926000916001600160a01b0316906340a7bb1090611c15908990309089908790899060a601613d05565b604080518083038186803b158015611c2c57600080fd5b505afa158015611c40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c6491906139d1565b50905080341015611ce95760405162461bcd60e51b815260206004820152604360248201527f4d73672e76616c7565206e6f7420656e6f75676820746f20636f766572206d6560448201527f73736167654665652e2053656e642067617320666f72206d657373616765206660648201526265657360e81b608482015260a4016109e1565b600d5461ffff87166000908152600f6020526040808220905162c5803160e81b81526001600160a01b039093169263c5803100923492611d34928c928b913391908b90600401613e03565b6000604051808303818588803b158015611d4d57600080fd5b505af1158015611d61573d6000803e3d6000fd5b5050505050505050505050565b61ffff85166000908152600e60205260408082209051611d8f908790613a54565b90815260408051602092819003830190206001600160401b0387166000908152925290206001810154909150611e165760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e6752656365697665723a206e6f2073746f726564206d60448201526565737361676560d01b60648201526084016109e1565b805482148015611e40575080600101548383604051611e36929190613a44565b6040518091039020145b611e8c5760405162461bcd60e51b815260206004820152601a60248201527f4c617965725a65726f3a20696e76616c6964207061796c6f616400000000000060448201526064016109e1565b60008082556001820155604051630e1bd41160e11b81523090631c37a82290611ec19089908990899089908990600401613d59565b600060405180830381600087803b158015611edb57600080fd5b505af1158015611eef573d6000803e3d6000fd5b50505050505050505050565b601454600090610100900460ff16611f615760405162461bcd60e51b815260206004820152602360248201527f436f6d706f7365206973206e6f742061637469766520617420746865206d6f6d604482015262195b9d60ea1b60648201526084016109e1565b826001600160a01b0316611f7483611396565b6001600160a01b031614611fca5760405162461bcd60e51b815260206004820152601a60248201527f596f7520646f206e6f742068617665207468697320746f6b656e00000000000060448201526064016109e1565b601854604051632770a7eb60e21b815233600482015269010f0cf064dd5920000060248201526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b15801561201f57600080fd5b505af1158015612033573d6000803e3d6000fd5b5050505060006120458361270f612d0e565b60008481526017602090815260409182902061ffff939093169283905581513381529081018690529081018290529091507fca0575f72e92b6b92d99f84ba94ef11af6dd857a77a3c02c45b73046b3518aea9060600160405180910390a15060019392505050565b6000546001600160a01b031633146120d75760405162461bcd60e51b81526004016109e190613c39565b61ffff83166000908152600f60205260409020610afc908383613436565b6000546001600160a01b0316331461211f5760405162461bcd60e51b81526004016109e190613c39565b6001600160a01b0381166121845760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109e1565b6114fc81612879565b600061219882612624565b156121cf5760015482108015610b69575050600654600091825260096020526040909120546001600160a01b039182169116141590565b6000828152600960205260409020546001600160a01b031615801590610b69575050600654600091825260096020526040909120546001600160a01b039182169116141590565b919050565b6000828152600b602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000808280602001905181019061228e91906135e2565b9150915061229c8282612df0565b505050505050565b60006122af8261263c565b80519091506000906001600160a01b0316336001600160a01b031614806122e65750336122db84610c01565b6001600160a01b0316145b806122f8575081516122f8903361087c565b9050806123625760405162461bcd60e51b815260206004820152603260248201527f455243373231423a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016109e1565b846001600160a01b031682600001516001600160a01b0316146123d65760405162461bcd60e51b815260206004820152602660248201527f455243373231423a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b60648201526084016109e1565b6001600160a01b03841661243a5760405162461bcd60e51b815260206004820152602560248201527f455243373231423a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b60648201526084016109e1565b61244a600084846000015161221b565b6001600160a01b0385166000908152600a6020526040812080546001929061247c9084906001600160801b0316613f50565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b0386166000908152600a6020526040812080546001945090926124c891859116613ee3565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b0380871682526001600160401b03428116602080850191825260008981526009909152948520935184549151909216600160a01b026001600160e01b0319909116919092161717905561254f846001613f05565b905061255a81612624565b801561257b57506000818152600960205260409020546001600160a01b0316155b156125f0576125898161218d565b156125f05760408051808201825284516001600160a01b0390811682526020808701516001600160401b039081168285019081526000878152600990935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03166000805160206140dc83398151915260405160405180910390a461229c565b60006004548210158015610b69575050600554101590565b60408051808201909152600080825260208201526126598261218d565b6126b85760405162461bcd60e51b815260206004820152602a60248201527f455243373231423a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b60648201526084016109e1565b6000828152600960209081526040918290208251808401909352546001600160a01b0381168352600160a01b90046001600160401b0316908201526126fc83612624565b61274c5780516001600160a01b031615801590612729575060065481516001600160a01b03908116911614155b156127345792915050565b60405162461bcd60e51b81526004016109e190613cb6565b60007f000000000000000000000000000000000000000000000000000000000000001484106127ad5761279f7f000000000000000000000000000000000000000000000000000000000000001485613f78565b6127aa906001613f05565b90505b6004548110156127bc57506004545b835b818110612846576000818152600960209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915290935015801590612826575060065483516001600160a01b03908116911614155b156128345750909392505050565b8061283e81613fbb565b9150506127be565b5060405162461bcd60e51b81526004016109e190613cb6565b611392828260405180602001604052806000815250612e0a565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006001600160a01b0384163b156129cb57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061290d903390899088908890600401613b11565b602060405180830381600087803b15801561292757600080fd5b505af1925050508015612957575060408051601f3d908101601f1916820190925261295491810190613771565b60015b6129b1573d808015612985576040519150601f19603f3d011682016040523d82523d6000602084013e61298a565b606091505b5080516129a95760405162461bcd60e51b81526004016109e190613ba5565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506129cf565b5060015b949350505050565b606060108054610b7e90613fd2565b606081612a0a5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612a345780612a1e81614029565b9150612a2d9050600a83613f1d565b9150612a0e565b6000816001600160401b03811115612a4e57612a4e61409a565b6040519080825280601f01601f191660200182016040528015612a78576020820181803683370190505b5090505b84156129cf57612a8d600183613f78565b9150612a9a600a86614044565b612aa5906030613f05565b60f81b818381518110612aba57612aba614084565b60200101906001600160f81b031916908160001a905350612adc600a86613f1d565b9450612a7c565b6000612aee8261263c565b90506000612afb83611396565b9050612b096000848361221b565b6001600160a01b0381166000908152600a60209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190612b6690600190613f50565b6001600160801b0316815260200160018360200151612b859190613f50565b6001600160801b039081169091526001600160a01b0384166000908152600a602090815260408220845194909101518316600160801b02939092169290921790556002805491612bd483613fbb565b90915550506040805180820182526006546001600160a01b0390811682526001600160401b03428116602080850191825260008a81526009909152948520935184549151909216600160a01b026001600160e01b03199091169190921617179055612c40856001613f05565b9050612c4b81612624565b8015612c6c57506000818152600960205260409020546001600160a01b0316155b15612ce157612c7a8161218d565b15612ce15760408051808201825285516001600160a01b0390811682526020808801516001600160401b039081168285019081526000878152600990935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b60405185906000906001600160a01b038616906000805160206140dc833981519152908390a45050505050565b600080805b60058161ffff161015612d5c5761ffff8116600090815260166020526040902054612d48906001600160a01b03163183613f05565b915080612d5481614007565b915050612d13565b50600084612d6b600143613f78565b40414433612d7860025490565b6040805160208101979097528601949094526bffffffffffffffffffffffff19606093841b811684870152607486019290925290911b16609483015260a882015260c8810183905260e80160408051601f1981840301815291905280516020909101209050612de78482614044565b95945050505050565b611392828260405180602001604052806000815250613161565b6001546001600160a01b038416612e6d5760405162461bcd60e51b815260206004820152602160248201527f455243373231423a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016109e1565b6006546001600160a01b0385811691161415612e9b5760405162461bcd60e51b81526004016109e190613bf8565b612ea48161218d565b15612ef15760405162461bcd60e51b815260206004820152601d60248201527f455243373231423a20746f6b656e20616c7265616479206d696e74656400000060448201526064016109e1565b7f0000000000000000000000000000000000000000000000000000000000000014831115612f6c5760405162461bcd60e51b815260206004820152602260248201527f455243373231423a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b60648201526084016109e1565b6001600160a01b0384166000908152600a60209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190612fc8908790613ee3565b6001600160801b03168152602001858360200151612fe69190613ee3565b6001600160801b039081169091526001600160a01b038088166000818152600a602090815260408083208751978301518716600160801b029790961696909617909455845180860186529182526001600160401b034281168386019081528883526009909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b858110156131565760405182906001600160a01b038916906000906000805160206140dc833981519152908290a46130b760008884886128c9565b61311f5760405162461bcd60e51b815260206004820152603360248201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260448201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b60648201526084016109e1565b8161312981614029565b60028054919450909150600061313e83614029565b9190505550808061314e90614029565b91505061307c565b50600181905561229c565b61316b83836131df565b61317860008484846128c9565b610d9d5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084016109e1565b6001600160a01b0382166132355760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109e1565b6006546001600160a01b03838116911614156132635760405162461bcd60e51b81526004016109e190613bf8565b6002805490600061327383614029565b91905055506003548111156132885760038190555b6001600160a01b0382166000908152600a60209081526040918290208251808401845290546001600160801b038082168352600160801b90910416918101919091528151808301909252805190919081906132e4906001613ee3565b6001600160801b03168152602001826020015160016133039190613ee3565b6001600160801b039081169091526001600160a01b038086166000818152600a602090815260408083208751978301518716600160801b029790961696909617909455845180860186528281526001600160401b034281168287019081528984526009909652868320915182549651909116600160a01b026001600160e01b0319909616941693909317939093179091559151849291906000805160206140dc833981519152908290a4505050565b8280546133be90613fd2565b90600052602060002090601f0160209004810192826133e05760008555613426565b82601f106133f957805160ff1916838001178555613426565b82800160010185558215613426579182015b8281111561342657825182559160200191906001019061340b565b506134329291506134aa565b5090565b82805461344290613fd2565b90600052602060002090601f0160209004810192826134645760008555613426565b82601f1061347d5782800160ff19823516178555613426565b82800160010185558215613426579182015b8281111561342657823582559160200191906001019061348f565b5b8082111561343257600081556001016134ab565b60006001600160401b03808411156134d9576134d961409a565b604051601f8501601f19908116603f011681019082821181831017156135015761350161409a565b8160405280935085815286868601111561351a57600080fd5b858560208301376000602087830101525050509392505050565b60008083601f84011261354657600080fd5b5081356001600160401b0381111561355d57600080fd5b60208301915083602082850101111561357557600080fd5b9250929050565b600082601f83011261358d57600080fd5b611a3e838335602085016134bf565b803561ffff8116811461221657600080fd5b80356001600160401b038116811461221657600080fd5b6000602082840312156135d757600080fd5b8135611a3e816140b0565b600080604083850312156135f557600080fd5b8251613600816140b0565b6020939093015192949293505050565b6000806040838503121561362357600080fd5b823561362e816140b0565b9150602083013561363e816140b0565b809150509250929050565b60008060006060848603121561365e57600080fd5b8335613669816140b0565b92506020840135613679816140b0565b929592945050506040919091013590565b600080600080608085870312156136a057600080fd5b84356136ab816140b0565b935060208501356136bb816140b0565b92506040850135915060608501356001600160401b038111156136dd57600080fd5b6136e98782880161357c565b91505092959194509250565b6000806040838503121561370857600080fd5b8235613713816140b0565b91506020830135801515811461363e57600080fd5b6000806040838503121561373b57600080fd5b8235613746816140b0565b946020939093013593505050565b60006020828403121561376657600080fd5b8135611a3e816140c5565b60006020828403121561378357600080fd5b8151611a3e816140c5565b6000602082840312156137a057600080fd5b81356001600160401b038111156137b657600080fd5b8201601f810184136137c757600080fd5b6129cf848235602084016134bf565b6000602082840312156137e857600080fd5b611a3e8261359c565b60008060006040848603121561380657600080fd5b61380f8461359c565b925060208401356001600160401b0381111561382a57600080fd5b61383686828701613534565b9497909650939450505050565b60008060006060848603121561385857600080fd5b6138618461359c565b925060208401356001600160401b0381111561387c57600080fd5b6138888682870161357c565b925050604084013590509250925092565b6000806000806000608086880312156138b157600080fd5b6138ba8661359c565b945060208601356001600160401b03808211156138d657600080fd5b6138e289838a0161357c565b95506138f0604089016135ae565b9450606088013591508082111561390657600080fd5b5061391388828901613534565b969995985093965092949392505050565b6000806000806080858703121561393a57600080fd5b6139438561359c565b935060208501356001600160401b038082111561395f57600080fd5b61396b8883890161357c565b9450613979604088016135ae565b9350606087013591508082111561398f57600080fd5b506136e98782880161357c565b600080604083850312156139af57600080fd5b6137468361359c565b6000602082840312156139ca57600080fd5b5035919050565b600080604083850312156139e457600080fd5b505080516020909101519092909150565b600060208284031215613a0757600080fd5b813560ff81168114611a3e57600080fd5b60008151808452613a30816020860160208601613f8f565b601f01601f19169290920160200192915050565b8183823760009101908152919050565b60008251613a66818460208701613f8f565b9190910192915050565b6000808354613a7e81613fd2565b60018281168015613a965760018114613aa757613ad6565b60ff19841687528287019450613ad6565b8760005260208060002060005b85811015613acd5781548a820152908401908201613ab4565b50505082870194505b50929695505050505050565b60008351613af4818460208801613f8f565b835190830190613b08818360208801613f8f565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613b4490830184613a18565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015613b8657835183529284019291840191600101613b6a565b50909695505050505050565b602081526000611a3e6020830184613a18565b60208082526033908201527f455243373231423a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b60208082526021908201527f455243373231423a206d696e7420746f20746865206275726e206164647265736040820152607360f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526028908201527f43616e206e6f74206d696e74206d6f7265207468616e204d41585f4d494e545f604082015267455448455245554d60c01b606082015260800190565b6020808252602f908201527f455243373231423a20756e61626c6520746f2064657465726d696e652074686560408201526e1037bbb732b91037b3103a37b5b2b760891b606082015260800190565b61ffff861681526001600160a01b038516602082015260a060408201819052600090613d3390830186613a18565b84151560608401528281036080840152613d4d8185613a18565b98975050505050505050565b61ffff86168152608060208201526000613d766080830187613a18565b6001600160401b03861660408401528281036060840152838152838560208301376000602085830101526020601f19601f8601168201019150509695505050505050565b61ffff85168152608060208201526000613dd76080830186613a18565b6001600160401b03851660408401528281036060840152613df88185613a18565b979650505050505050565b61ffff871681526000602060c08184015260008854613e2181613fd2565b8060c087015260e0600180841660008114613e435760018114613e5857613e86565b60ff1985168984015261010089019550613e86565b8d6000528660002060005b85811015613e7e5781548b8201860152908301908801613e63565b8a0184019650505b50505050508381036040850152613e9d8189613a18565b915050613eb560608401876001600160a01b03169052565b6001600160a01b038516608084015282810360a0840152613ed68185613a18565b9998505050505050505050565b60006001600160801b03808316818516808303821115613b0857613b08614058565b60008219821115613f1857613f18614058565b500190565b600082613f2c57613f2c61406e565b500490565b6000816000190483118215151615613f4b57613f4b614058565b500290565b60006001600160801b0383811690831681811015613f7057613f70614058565b039392505050565b600082821015613f8a57613f8a614058565b500390565b60005b83811015613faa578181015183820152602001613f92565b83811115610afc5750506000910152565b600081613fca57613fca614058565b506000190190565b600181811c90821680613fe657607f821691505b602082108114156117b857634e487b7160e01b600052602260045260246000fd5b600061ffff8083168181141561401f5761401f614058565b6001019392505050565b600060001982141561403d5761403d614058565b5060010190565b6000826140535761405361406e565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146114fc57600080fd5b6001600160e01b0319811681146114fc57600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220f59c8aadd38c663aa3d3b8da6bfabb1746887db14d7f8cbec8fc33f6bf0fc03e64736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bb700000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675

-----Decoded View---------------
Arg [0] : maxBatchSize_ (uint256): 20
Arg [1] : startIndex_ (uint256): 0
Arg [2] : endIndex_ (uint256): 2999
Arg [3] : _layerZeroEndpoint (address): 0x66A71Dcef29A0fFBDBE3c6a460a3B5BC225Cd675

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000bb7
Arg [3] : 00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675


Deployed Bytecode Sourcemap

54061:7744:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30277:949;;;;;;;;;;-1:-1:-1;30277:949:0;;;;;:::i;:::-;;:::i;:::-;;37558:370;;;;;;;;;;-1:-1:-1;37558:370:0;;;;;:::i;:::-;;:::i;:::-;;;14262:14:1;;14255:22;14237:41;;14225:2;14210:18;37558:370:0;;;;;;;;54687:17;;;;;;;;;;-1:-1:-1;54687:17:0;;;;-1:-1:-1;;;;;54687:17:0;;;;;;-1:-1:-1;;;;;12294:32:1;;;12276:51;;12264:2;12249:18;54687:17:0;12130:203:1;39990:94:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;41287:204::-;;;;;;;;;;-1:-1:-1;41287:204:0;;;;;:::i;:::-;;:::i;40850:379::-;;;;;;;;;;-1:-1:-1;40850:379:0;;;;;:::i;:::-;;:::i;35228:93::-;;;;;;;;;;-1:-1:-1;35305:10:0;;35228:93;;;34536:25:1;;;34524:2;34509:18;35228:93:0;34390:177:1;31234:356:0;;;;;;;;;;-1:-1:-1;31234:356:0;;;;;:::i;:::-;;:::i;42137:150::-;;;;;;;;;;-1:-1:-1;42137:150:0;;;;;:::i;:::-;;:::i;36510:984::-;;;;;;;;;;-1:-1:-1;36510:984:0;;;;;:::i;:::-;;:::i;55866:103::-;;;;;;;;;;;;;:::i;55645:101::-;;;;;;;;;;-1:-1:-1;55645:101:0;;;;;:::i;:::-;;:::i;58716:346::-;;;;;;;;;;;;;:::i;58526:127::-;;;;;;;;;;-1:-1:-1;58526:127:0;;;;;:::i;:::-;58591:7;58618:27;;;:17;:27;;;;;;;58526:127;42350:157;;;;;;;;;;-1:-1:-1;42350:157:0;;;;;:::i;:::-;;:::i;55770:88::-;;;;;;;;;;;;;:::i;54170:32::-;;;;;;;;;;;;;;;;35394:829;;;;;;;;;;-1:-1:-1;35394:829:0;;;;;:::i;:::-;;:::i;54209:45::-;;;;;;;;;;;;;;;;58427:90;;;;;;;;;;-1:-1:-1;58427:90:0;;;;;:::i;:::-;;:::i;54542:49::-;;;;;;;;;;-1:-1:-1;54542:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;39813:118;;;;;;;;;;-1:-1:-1;39813:118:0;;;;;:::i;:::-;;:::i;56003:448::-;;;;;;:::i;:::-;;:::i;37984:297::-;;;;;;;;;;-1:-1:-1;37984:297:0;;;;;:::i;:::-;;:::i;12052:103::-;;;;;;;;;;;;;:::i;30119:51::-;;;;;;;;;;-1:-1:-1;30119:51:0;;;;;:::i;:::-;;:::i;55530:106::-;;;;;;;;;;-1:-1:-1;55530:106:0;;;;;:::i;:::-;;:::i;59554:505::-;;;;;;;;;;-1:-1:-1;59554:505:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;11401:87::-;;;;;;;;;;-1:-1:-1;11447:7:0;11474:6;-1:-1:-1;;;;;11474:6:0;11401:87;;30022:90;;;;;;;;;;-1:-1:-1;30022:90:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34746:25:1;;;34802:2;34787:18;;34780:34;;;;34719:18;30022:90:0;34572:248:1;59406:140:0;;;;;;;;;;-1:-1:-1;59406:140:0;;;;;:::i;:::-;;:::i;:::-;;;;30825:13:1;;-1:-1:-1;;;;;30821:39:1;30803:58;;30921:4;30909:17;;;30903:24;-1:-1:-1;;;;;30899:49:1;30877:20;;;30870:79;;;;30776:18;59406:140:0;30593:362:1;54356:31:0;;;;;;;;;;-1:-1:-1;54356:31:0;;;;;;;;59146:125;;;;;;;;;;-1:-1:-1;59146:125:0;;;;;:::i;:::-;;:::i;40145:98::-;;;;;;;;;;;;;:::i;41555:274::-;;;;;;;;;;-1:-1:-1;41555:274:0;;;;;:::i;:::-;;:::i;54394:36::-;;;;;;;;;;-1:-1:-1;54394:36:0;;;;;;;;;;;42570:319;;;;;;;;;;-1:-1:-1;42570:319:0;;;;;:::i;:::-;;:::i;56459:234::-;;;;;;;;;;-1:-1:-1;56459:234:0;;;;;:::i;:::-;;:::i;40306:394::-;;;;;;;;;;-1:-1:-1;40306:394:0;;;;;:::i;:::-;;:::i;59279:111::-;;;;;;;;;;-1:-1:-1;59279:111:0;;;;;:::i;:::-;;:::i;54323:25::-;;;;;;;;;;;;;;;;56833:1584;;;;;;:::i;:::-;;:::i;32066:758::-;;;;;;:::i;:::-;;:::i;60777:486::-;;;;;;;;;;-1:-1:-1;60777:486:0;;;;;:::i;:::-;;:::i;41892:186::-;;;;;;;;;;-1:-1:-1;41892:186:0;;;;;:::i;:::-;-1:-1:-1;;;;;42037:25:0;;;42014:4;42037:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;41892:186;32832:158;;;;;;;;;;-1:-1:-1;32832:158:0;;;;;:::i;:::-;;:::i;12310:201::-;;;;;;;;;;-1:-1:-1;12310:201:0;;;;;:::i;:::-;;:::i;54262:50::-;;;;;;;;;;;;54302:10;54262:50;;30277:949;30439:8;;-1:-1:-1;;;;;30439:8:0;30417:10;:31;30409:40;;;;;;30560:32;;;;;;;:19;:32;;;;;:39;;;;;:::i;:::-;;;30538:11;:18;:61;:134;;;;-1:-1:-1;30639:32:0;;;;;;;:19;:32;;;;;;;30629:43;;;;30639:32;30629:43;:::i;:::-;;;;;;;;30613:11;30603:22;;;;;;:69;30538:134;30530:213;;;;-1:-1:-1;;;30530:213:0;;24742:2:1;30530:213:0;;;24724:21:1;24781:2;24761:18;;;24754:30;24820:34;24800:18;;;24793:62;-1:-1:-1;;;24871:18:1;;;24864:50;24931:19;;30530:213:0;;;;;;;;;30871:60;;-1:-1:-1;;;30871:60:0;;:4;;:16;;:60;;30888:11;;30901;;30914:6;;30922:8;;30871:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30867:352;;31078:52;;;;;;;;31093:8;:15;31078:52;;;;31120:8;31110:19;;;;;;31078:52;;;31027:14;:27;31042:11;31027:27;;;;;;;;;;;;;;;31055:11;31027:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31027:48:0;;;;;;;;;;;;;:103;;;;;;;;;;;;;;;31150:57;;;;31164:11;;31177;;31068:6;;31198:8;;31150:57;:::i;:::-;;;;;;;;30867:352;30277:949;;;;:::o;37558:370::-;37685:4;-1:-1:-1;;;;;;37715:40:0;;-1:-1:-1;;;37715:40:0;;:99;;-1:-1:-1;;;;;;;37766:48:0;;-1:-1:-1;;;37766:48:0;37715:99;:160;;;-1:-1:-1;;;;;;;37825:50:0;;-1:-1:-1;;;37825:50:0;37715:160;:207;;;-1:-1:-1;;;;;;;;;;23418:40:0;;;37886:36;37701:221;37558:370;-1:-1:-1;;37558:370:0:o;39990:94::-;40044:13;40073:5;40066:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39990:94;:::o;41287:204::-;41355:7;41379:16;41387:7;41379;:16::i;:::-;41371:74;;;;-1:-1:-1;;;41371:74:0;;15562:2:1;41371:74:0;;;15544:21:1;15601:2;15581:18;;;15574:30;15640:34;15620:18;;;15613:62;-1:-1:-1;;;15691:18:1;;;15684:43;15744:19;;41371:74:0;15360:409:1;41371:74:0;-1:-1:-1;41461:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;41461:24:0;;41287:204::o;40850:379::-;40919:13;40935:24;40951:7;40935:15;:24::i;:::-;40919:40;;40980:5;-1:-1:-1;;;;;40974:11:0;:2;-1:-1:-1;;;;;40974:11:0;;;40966:58;;;;-1:-1:-1;;;40966:58:0;;26330:2:1;40966:58:0;;;26312:21:1;26369:2;26349:18;;;26342:30;26408:34;26388:18;;;26381:62;-1:-1:-1;;;26459:18:1;;;26452:32;26501:19;;40966:58:0;26128:398:1;40966:58:0;10317:10;-1:-1:-1;;;;;41049:21:0;;;;:62;;-1:-1:-1;41074:37:0;41091:5;10317:10;41892:186;:::i;41074:37::-;41033:153;;;;-1:-1:-1;;;41033:153:0;;22014:2:1;41033:153:0;;;21996:21:1;22053:2;22033:18;;;22026:30;22092:34;22072:18;;;22065:62;22163:27;22143:18;;;22136:55;22208:19;;41033:153:0;21812:421:1;41033:153:0;41195:28;41204:2;41208:7;41217:5;41195:8;:28::i;:::-;40912:317;40850:379;;:::o;31234:356::-;31403:10;31425:4;31403:27;31395:83;;;;-1:-1:-1;;;31395:83:0;;23608:2:1;31395:83:0;;;23590:21:1;23647:2;23627:18;;;23620:30;23686:34;23666:18;;;23659:62;-1:-1:-1;;;23737:18:1;;;23730:41;23788:19;;31395:83:0;23406:407:1;31395:83:0;31527:55;31539:11;31552;31565:6;31573:8;31527:10;:55::i;42137:150::-;42253:28;42263:4;42269:2;42273:7;42253:9;:28::i;36510:984::-;36619:7;36654:16;36664:5;36654:9;:16::i;:::-;36646:5;:24;36638:71;;;;-1:-1:-1;;;36638:71:0;;15159:2:1;36638:71:0;;;15141:21:1;15198:2;15178:18;;;15171:30;15237:34;15217:18;;;15210:62;-1:-1:-1;;;15288:18:1;;;15281:32;15330:19;;36638:71:0;14957:398:1;36638:71:0;36716:19;36746:25;36796:9;36791:635;36816:10;;36811:1;:15;36791:635;;36842:31;36876:14;;;:11;:14;;;;;;;;;36842:48;;;;;;;;;-1:-1:-1;;;;;36842:48:0;;;;-1:-1:-1;;;36842:48:0;;-1:-1:-1;;;;;36842:48:0;;;;;36904:11;36876:14;36904:8;:11::i;:::-;:33;;;;;36924:12;;36920:1;:16;36904:33;36901:518;;;36954:14;;-1:-1:-1;;;;;36954:28:0;;36949:97;;37020:14;;;-1:-1:-1;36949:97:0;37083:5;-1:-1:-1;;;;;37062:26:0;:17;-1:-1:-1;;;;;37062:26:0;;37058:155;;;37124:5;37109:11;:20;37105:69;;;-1:-1:-1;37157:1:0;-1:-1:-1;37150:8:0;;-1:-1:-1;;37150:8:0;37105:69;37188:13;;;;:::i;:::-;;;;37058:155;36901:518;;;37275:5;-1:-1:-1;;;;;37257:23:0;:9;:14;;;-1:-1:-1;;;;;37257:23:0;;37253:152;;;37316:5;37301:11;:20;37297:69;;;-1:-1:-1;37349:1:0;-1:-1:-1;37342:8:0;;-1:-1:-1;;37342:8:0;37297:69;37380:13;;;;:::i;:::-;;;;37253:152;-1:-1:-1;36828:3:0;;;;:::i;:::-;;;;36791:635;;;-1:-1:-1;37432:56:0;;-1:-1:-1;;;37432:56:0;;29615:2:1;37432:56:0;;;29597:21:1;29654:2;29634:18;;;29627:30;29693:34;29673:18;;;29666:62;-1:-1:-1;;;29744:18:1;;;29737:44;29798:19;;37432:56:0;29413:410:1;55866:103:0;11447:7;11474:6;-1:-1:-1;;;;;11474:6:0;10317:10;11621:23;11613:68;;;;-1:-1:-1;;;11613:68:0;;;;;;;:::i;:::-;55945:16:::1;::::0;;-1:-1:-1;;55925:36:0;::::1;55945:16;::::0;;;::::1;;;55944:17;55925:36:::0;;::::1;;::::0;;55866:103::o;55645:101::-;11447:7;11474:6;-1:-1:-1;;;;;11474:6:0;10317:10;11621:23;11613:68;;;;-1:-1:-1;;;11613:68:0;;;;;;;:::i;:::-;55715:9:::1;:22:::0;55645:101::o;58716:346::-;11447:7;11474:6;-1:-1:-1;;;;;11474:6:0;10317:10;11621:23;11613:68;;;;-1:-1:-1;;;11613:68:0;;;;;;;:::i;:::-;58785:21:::1;58836:42;58908;58836::::0;58962:40:::1;58999:2;58989:9;58785:21:::0;58997:1:::1;58989:9;:::i;:::-;:12;;;;:::i;:::-;58962:40;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;;;;59014:26:0;::::1;:40;59051:2;59041:9;:7:::0;59049:1:::1;59041:9;:::i;:::-;:12;;;;:::i;:::-;59014:40;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;42350:157:::0;42462:39;42479:4;42485:2;42489:7;42462:39;;;;;;;;;;;;:16;:39::i;55770:88::-;11447:7;11474:6;-1:-1:-1;;;;;11474:6:0;10317:10;11621:23;11613:68;;;;-1:-1:-1;;;11613:68:0;;;;;;;:::i;:::-;55838:11:::1;::::0;;-1:-1:-1;;55823:26:0;::::1;55838:11;::::0;;::::1;55837:12;55823:26;::::0;;55770:88::o;35394:829::-;35461:7;35495:10;;35486:5;:19;;35478:67;;;;-1:-1:-1;;;35478:67:0;;16331:2:1;35478:67:0;;;16313:21:1;16370:2;16350:18;;;16343:30;16409:34;16389:18;;;16382:62;-1:-1:-1;;;16460:18:1;;;16453:33;16503:19;;35478:67:0;16129:399:1;35478:67:0;35555:19;35592:9;35587:575;35612:10;;35607:1;:15;35587:575;;35638:31;35672:14;;;:11;:14;;;;;;;;;35638:48;;;;;;;;;-1:-1:-1;;;;;35638:48:0;;;;-1:-1:-1;;;35638:48:0;;-1:-1:-1;;;;;35638:48:0;;;;;35700:11;35672:14;35700:8;:11::i;:::-;35697:458;;;35747:11;;35729:14;;-1:-1:-1;;;;;35729:29:0;;;35747:11;;35729:29;;;;35728:53;;;35768:12;;35764:1;:16;35728:53;35723:183;;;35817:5;35802:11;:20;35798:69;;;-1:-1:-1;35850:1:0;35394:829;-1:-1:-1;;;35394:829:0:o;35798:69::-;35881:13;;;;:::i;:::-;;;;35723:183;35697:458;;;35951:14;;-1:-1:-1;;;;;35951:28:0;;;;;35950:65;;-1:-1:-1;36003:11:0;;35985:14;;-1:-1:-1;;;;;35985:29:0;;;36003:11;;35985:29;;35950:65;35946:195;;;36052:5;36037:11;:20;36033:69;;;-1:-1:-1;36085:1:0;35394:829;-1:-1:-1;;;35394:829:0:o;36033:69::-;36116:13;;;;:::i;:::-;;;;35946:195;-1:-1:-1;35624:3:0;;;;:::i;:::-;;;;35587:575;;;-1:-1:-1;36170:47:0;;-1:-1:-1;;;36170:47:0;;21608:2:1;36170:47:0;;;21590:21:1;21647:2;21627:18;;;21620:30;21686:34;21666:18;;;21659:62;-1:-1:-1;;;21737:18:1;;;21730:35;21782:19;;36170:47:0;21406:401:1;58427:90:0;11447:7;11474:6;-1:-1:-1;;;;;11474:6:0;10317:10;11621:23;11613:68;;;;-1:-1:-1;;;11613:68:0;;;;;;;:::i;:::-;58496:13;;::::1;::::0;:7:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;;58427:90:::0;:::o;39813:118::-;39877:7;39900:20;39912:7;39900:11;:20::i;:::-;:25;;39813:118;-1:-1:-1;;39813:118:0:o;56003:448::-;56070:11;;;;56062:43;;;;-1:-1:-1;;;56062:43:0;;21260:2:1;56062:43:0;;;21242:21:1;21299:2;21279:18;;;21272:30;-1:-1:-1;;;21318:18:1;;;21311:49;21377:18;;56062:43:0;21058:343:1;56062:43:0;56153:17;;56140:9;56124:25;;:13;35305:10;;;35228:93;56124:13;:25;;;;:::i;:::-;:46;;56116:99;;;;-1:-1:-1;;;56116:99:0;;;;;;;:::i;:::-;56250:1;56238:9;:13;;;:43;;;;;56268:13;;56255:9;:26;;;;56238:43;56230:92;;;;-1:-1:-1;;;56230:92:0;;27142:2:1;56230:92:0;;;27124:21:1;27181:2;27161:18;;;27154:30;27220:34;27200:18;;;27193:62;-1:-1:-1;;;27271:18:1;;;27264:34;27315:19;;56230:92:0;26940:400:1;56230:92:0;56364:9;56354:19;;:9;;:19;;;;:::i;:::-;56341:9;:32;;56333:65;;;;-1:-1:-1;;;56333:65:0;;25579:2:1;56333:65:0;;;25561:21:1;25618:2;25598:18;;;25591:30;-1:-1:-1;;;25637:18:1;;;25630:50;25697:18;;56333:65:0;25377:344:1;56333:65:0;56411:32;56421:10;56433:9;56411:32;;:9;:32::i;:::-;56003:448;:::o;37984:297::-;38048:7;-1:-1:-1;;;;;38072:19:0;;38064:75;;;;-1:-1:-1;;;38064:75:0;;18868:2:1;38064:75:0;;;18850:21:1;18907:2;18887:18;;;18880:30;18946:34;18926:18;;;18919:62;-1:-1:-1;;;18997:18:1;;;18990:41;19048:19;;38064:75:0;18666:407:1;38064:75:0;38163:11;;-1:-1:-1;;;;;38154:20:0;;;38163:11;;38154:20;;38146:75;;;;-1:-1:-1;;;38146:75:0;;17630:2:1;38146:75:0;;;17612:21:1;17669:2;17649:18;;;17642:30;17708:34;17688:18;;;17681:62;-1:-1:-1;;;17759:18:1;;;17752:40;17809:19;;38146:75:0;17428:406:1;38146:75:0;-1:-1:-1;;;;;;38247:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;38247:27:0;;37984:297::o;12052:103::-;11447:7;11474:6;-1:-1:-1;;;;;11474:6:0;10317:10;11621:23;11613:68;;;;-1:-1:-1;;;11613:68:0;;;;;;;:::i;:::-;12117:30:::1;12144:1;12117:18;:30::i;:::-;12052:103::o:0;30119:51::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55530:106::-;11447:7;11474:6;-1:-1:-1;;;;;11474:6:0;10317:10;11621:23;11613:68;;;;-1:-1:-1;;;11613:68:0;;;;;;;:::i;:::-;55599:17:::1;:29:::0;55530:106::o;59554:505::-;59615:16;59645:18;59666:17;59676:6;59666:9;:17::i;:::-;59645:38;-1:-1:-1;59702:15:0;59698:354;;59741:16;;;59755:1;59741:16;;;;;;;;;;;-1:-1:-1;59734:23:0;59554:505;-1:-1:-1;;;59554:505:0:o;59698:354::-;59790:23;59830:10;-1:-1:-1;;;;;59816:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59816:25:0;;59790:51;;59856:13;59884:130;59908:10;59900:5;:18;59884:130;;;59964:34;59984:6;59992:5;59964:19;:34::i;:::-;59948:6;59955:5;59948:13;;;;;;;;:::i;:::-;;;;;;;;;;:50;59920:7;;;;:::i;:::-;;;;59884:130;;59698:354;59634:425;59554:505;;;:::o;59406:140::-;-1:-1:-1;;;;;;;;;;;;;;;;;59518:20:0;59530:7;59518:11;:20::i;59146:125::-;11447:7;11474:6;-1:-1:-1;;;;;11474:6:0;10317:10;11621:23;11613:68;;;;-1:-1:-1;;;11613:68:0;;;;;;;:::i;:::-;59228:26:::1;:35:::0;59146:125::o;40145:98::-;40201:13;40230:7;40223:14;;;;;:::i;41555:274::-;-1:-1:-1;;;;;41646:24:0;;10317:10;41646:24;;41638:63;;;;-1:-1:-1;;;41638:63:0;;22440:2:1;41638:63:0;;;22422:21:1;22479:2;22459:18;;;22452:30;22518:28;22498:18;;;22491:56;22564:18;;41638:63:0;22238:350:1;41638:63:0;10317:10;41710:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;41710:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;41710:53:0;;;;;;;;;;41775:48;;14237:41:1;;;41710:42:0;;10317:10;41775:48;;14210:18:1;41775:48:0;;;;;;;41555:274;;:::o;42570:319::-;42715:28;42725:4;42731:2;42735:7;42715:9;:28::i;:::-;42766:48;42789:4;42795:2;42799:7;42808:5;42766:22;:48::i;:::-;42750:133;;;;-1:-1:-1;;;42750:133:0;;;;;;;:::i;56459:234::-;11447:7;11474:6;-1:-1:-1;;;;;11474:6:0;10317:10;11621:23;11613:68;;;;-1:-1:-1;;;11613:68:0;;;;;;;:::i;:::-;56587:17:::1;;56573:10;56557:13;35305:10:::0;;;35228:93;56557:13:::1;:26;;;;:::i;:::-;:47;;56549:100;;;;-1:-1:-1::0;;;56549:100:0::1;;;;;;;:::i;:::-;56659:26;56669:3;56674:10;56659:9;:26::i;40306:394::-:0;40404:13;40445:16;40453:7;40445;:16::i;:::-;40429:97;;;;-1:-1:-1;;;40429:97:0;;25163:2:1;40429:97:0;;;25145:21:1;25202:2;25182:18;;;25175:30;25241:34;25221:18;;;25214:62;-1:-1:-1;;;25292:18:1;;;25285:45;25347:19;;40429:97:0;24961:411:1;40429:97:0;40535:21;40559:10;:8;:10::i;:::-;40535:34;;40614:1;40596:7;40590:21;:25;:104;;;;;;;;;;;;;;;;;40651:7;40660:18;:7;:16;:18::i;:::-;40634:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40590:104;40576:118;40306:394;-1:-1:-1;;;40306:394:0:o;59279:111::-;11447:7;11474:6;-1:-1:-1;;;;;11474:6:0;10317:10;11621:23;11613:68;;;;-1:-1:-1;;;11613:68:0;;;;;;;:::i;:::-;59358:4:::1;:23:::0;;-1:-1:-1;;;;;;59358:23:0::1;-1:-1:-1::0;;;;;59358:23:0;;;::::1;::::0;;;::::1;::::0;;59279:111::o;56833:1584::-;56936:16;56944:7;56936;:16::i;:::-;-1:-1:-1;;;;;56922:30:0;:10;-1:-1:-1;;;;;56922:30:0;;56914:77;;;;-1:-1:-1;;;56914:77:0;;20857:2:1;56914:77:0;;;20839:21:1;20896:2;20876:18;;;20869:30;20935:34;20915:18;;;20908:62;-1:-1:-1;;;20986:18:1;;;20979:32;21028:19;;56914:77:0;20655:398:1;56914:77:0;57010:29;;;57049:1;57010:29;;;:19;:29;;;;;:36;;;;;:::i;:::-;;;:40;57002:99;;;;-1:-1:-1;;;57002:99:0;;19684:2:1;57002:99:0;;;19666:21:1;19723:2;19703:18;;;19696:30;19762:34;19742:18;;;19735:62;-1:-1:-1;;;19813:18:1;;;19806:44;19867:19;;57002:99:0;19482:410:1;57002:99:0;57181:14;57187:7;57181:5;:14::i;:::-;57292:31;;;57303:10;57292:31;;;13005:51:1;13072:18;;;13065:34;;;57292:31:0;;;;;;;;;12978:18:1;;;57292:31:0;;57493:26;;-1:-1:-1;;;57467:53:0;;;11321:51:1;11388:11;;;;11381:27;;;;57467:53:0;;;;;;;;;;11424:12:1;;;57467:53:0;;;;57696:8;;-1:-1:-1;;;57696:77:0;;;57292:31;;57426:1;;-1:-1:-1;;;;;;;57696:8:0;;:21;;:77;;57718:8;;57736:4;;57292:31;;-1:-1:-1;;57467:53:0;;57696:77;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57674:99;;;57815:10;57802:9;:23;;57794:103;;;;-1:-1:-1;;;57794:103:0;;17154:2:1;57794:103:0;;;17136:21:1;17193:2;17173:18;;;17166:30;17232:34;17212:18;;;17205:62;17303:34;17283:18;;;17276:62;-1:-1:-1;;;17354:19:1;;;17347:34;17398:19;;57794:103:0;16952:471:1;57794:103:0;57910:8;;58028:29;;;57910:8;58028:29;;;:19;:29;;;;;;57910:499;;-1:-1:-1;;;57910:499:0;;-1:-1:-1;;;;;57910:8:0;;;;:13;;57931:9;;57910:499;;57956:8;;58116:7;;58199:10;;57910:8;58346:13;;57910:499;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56903:1514;;;;56833:1584;;:::o;32066:758::-;32282:27;;;32247:32;32282:27;;;:14;:27;;;;;;:40;;;;32310:11;;32282:40;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32282:48:0;;;;;;;;;;32349:21;;;;32282:48;;-1:-1:-1;32341:86:0;;;;-1:-1:-1;;;32341:86:0;;28792:2:1;32341:86:0;;;28774:21:1;28831:2;28811:18;;;28804:30;28870:34;28850:18;;;28843:62;-1:-1:-1;;;28921:18:1;;;28914:36;28967:19;;32341:86:0;28590:402:1;32341:86:0;32465:23;;32446:42;;:90;;;;;32515:9;:21;;;32502:8;;32492:19;;;;;;;:::i;:::-;;;;;;;;:44;32446:90;32438:129;;;;-1:-1:-1;;;32438:129:0;;20502:2:1;32438:129:0;;;20484:21:1;20541:2;20521:18;;;20514:30;20580:28;20560:18;;;20553:56;20626:18;;32438:129:0;20300:350:1;32438:129:0;32641:1;32615:27;;;32653:21;;;:34;32756:60;;-1:-1:-1;;;32756:60:0;;:4;;:16;;:60;;32773:11;;32786;;32799:6;;32807:8;;;;32756:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32191:633;32066:758;;;;;:::o;60777:486::-;60866:16;;60843:4;;60866:16;;;;;60858:64;;;;-1:-1:-1;;;60858:64:0;;19280:2:1;60858:64:0;;;19262:21:1;19319:2;19299:18;;;19292:30;19358:34;19338:18;;;19331:62;-1:-1:-1;;;19409:18:1;;;19402:33;19452:19;;60858:64:0;19078:399:1;60858:64:0;60967:5;-1:-1:-1;;;;;60939:33:0;:24;60955:7;60939:15;:24::i;:::-;-1:-1:-1;;;;;60939:33:0;;60931:72;;;;-1:-1:-1;;;60931:72:0;;15976:2:1;60931:72:0;;;15958:21:1;16015:2;15995:18;;;15988:30;16054:28;16034:18;;;16027:56;16100:18;;60931:72:0;15774:350:1;60931:72:0;61015:4;;:36;;-1:-1:-1;;;61015:36:0;;61025:10;61015:36;;;13005:51:1;54302:10:0;13072:18:1;;;13065:34;-1:-1:-1;;;;;61015:4:0;;;;:9;;12978:18:1;;61015:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61062:18;61083:34;61103:7;61112:4;61083:19;:34::i;:::-;61126:26;;;;:17;:26;;;;;;;;;61062:55;;;;;61126:39;;;;61179:55;;61201:10;13312:51:1;;13379:18;;;13372:34;;;13422:18;;;13415:34;;;61062:55:0;;-1:-1:-1;61179:55:0;;13300:2:1;13285:18;61179:55:0;;;;;;;-1:-1:-1;61250:4:0;;60777:486;-1:-1:-1;;;60777:486:0:o;32832:158::-;11447:7;11474:6;-1:-1:-1;;;;;11474:6:0;10317:10;11621:23;11613:68;;;;-1:-1:-1;;;11613:68:0;;;;;;;:::i;:::-;32936:29:::1;::::0;::::1;;::::0;;;:19:::1;:29;::::0;;;;:46:::1;::::0;32968:14;;32936:46:::1;:::i;12310:201::-:0;11447:7;11474:6;-1:-1:-1;;;;;11474:6:0;10317:10;11621:23;11613:68;;;;-1:-1:-1;;;11613:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;12399:22:0;::::1;12391:73;;;::::0;-1:-1:-1;;;12391:73:0;;18041:2:1;12391:73:0::1;::::0;::::1;18023:21:1::0;18080:2;18060:18;;;18053:30;18119:34;18099:18;;;18092:62;-1:-1:-1;;;18170:18:1;;;18163:36;18216:19;;12391:73:0::1;17839:402:1::0;12391:73:0::1;12475:28;12494:8;12475:18;:28::i;43128:421::-:0;43185:4;43280:17;43289:7;43280:8;:17::i;:::-;43276:266;;;43334:12;;43324:7;:22;43323:69;;;;-1:-1:-1;;43380:11:0;;;43352:20;;;:11;:20;;;;;;:25;-1:-1:-1;;;;;43380:11:0;;;43352:25;;:39;;;43128:421::o;43276:266::-;43480:1;43443:20;;;:11;:20;;;;;:25;-1:-1:-1;;;;;43443:25:0;:39;;;;43442:86;;-1:-1:-1;;43516:11:0;;;43488:20;;;:11;:20;;;;;;:25;-1:-1:-1;;;;;43516:11:0;;;43488:25;;:39;;;43128:421::o;43276:266::-;43128:421;;;:::o;51407:172::-;51504:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;51504:29:0;-1:-1:-1;;;;;51504:29:0;;;;;;;;;51545:28;;51504:24;;51545:28;;;;;;;51407:172;;;:::o;61355:337::-;61508:14;61524:12;61551:8;61540:37;;;;;;;;;;;;:::i;:::-;61507:70;;;;61659:25;61668:6;61676:7;61659:8;:25::i;:::-;61477:215;;61355:337;;;;:::o;49684:1617::-;49781:35;49819:20;49831:7;49819:11;:20::i;:::-;49890:18;;49781:58;;-1:-1:-1;49848:22:0;;-1:-1:-1;;;;;49874:34:0;10317:10;-1:-1:-1;;;;;49874:34:0;;:81;;;-1:-1:-1;10317:10:0;49919:20;49931:7;49919:11;:20::i;:::-;-1:-1:-1;;;;;49919:36:0;;49874:81;:142;;;-1:-1:-1;49983:18:0;;49966:50;;10317:10;41892:186;:::i;49966:50::-;49848:169;;50042:17;50026:101;;;;-1:-1:-1;;;50026:101:0;;28373:2:1;50026:101:0;;;28355:21:1;28412:2;28392:18;;;28385:30;28451:34;28431:18;;;28424:62;-1:-1:-1;;;28502:18:1;;;28495:48;28560:19;;50026:101:0;28171:414:1;50026:101:0;50174:4;-1:-1:-1;;;;;50152:26:0;:13;:18;;;-1:-1:-1;;;;;50152:26:0;;50136:98;;;;-1:-1:-1;;;50136:98:0;;30030:2:1;50136:98:0;;;30012:21:1;30069:2;30049:18;;;30042:30;30108:34;30088:18;;;30081:62;-1:-1:-1;;;30159:18:1;;;30152:36;30205:19;;50136:98:0;29828:402:1;50136:98:0;-1:-1:-1;;;;;50249:16:0;;50241:66;;;;-1:-1:-1;;;50241:66:0;;27547:2:1;50241:66:0;;;27529:21:1;27586:2;27566:18;;;27559:30;27625:34;27605:18;;;27598:62;-1:-1:-1;;;27676:18:1;;;27669:35;27721:19;;50241:66:0;27345:401:1;50241:66:0;50416:49;50433:1;50437:7;50446:13;:18;;;50416:8;:49::i;:::-;-1:-1:-1;;;;;50474:18:0;;;;;;:12;:18;;;;;:31;;50504:1;;50474:18;:31;;50504:1;;-1:-1:-1;;;;;50474:31:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;50474:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;50512:16:0;;-1:-1:-1;50512:16:0;;;:12;:16;;;;;:29;;-1:-1:-1;;;50512:16:0;;:29;;-1:-1:-1;;50512:29:0;;:::i;:::-;;;-1:-1:-1;;;;;50512:29:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50571:43:0;;;;;;;;-1:-1:-1;;;;;50571:43:0;;;;;-1:-1:-1;;;;;50597:15:0;50571:43;;;;;;;;;-1:-1:-1;50548:20:0;;;:11;:20;;;;;;:66;;;;;;;;;-1:-1:-1;;;50548:66:0;-1:-1:-1;;;;;;50548:66:0;;;;;;;;;;;50909:11;50560:7;-1:-1:-1;50909:11:0;:::i;:::-;50887:33;;50931:21;50940:11;50931:8;:21::i;:::-;:70;;;;-1:-1:-1;50998:1:0;50957:24;;;:11;:24;;;;;:29;-1:-1:-1;;;;;50957:29:0;:43;50931:70;50927:279;;;51018:20;51026:11;51018:7;:20::i;:::-;51014:185;;;51082:105;;;;;;;;51111:18;;-1:-1:-1;;;;;51082:105:0;;;;;;51144:28;;;;-1:-1:-1;;;;;51082:105:0;;;;;;;;;-1:-1:-1;51055:24:0;;;:11;:24;;;;;;;:132;;;;;;;;;-1:-1:-1;;;51055:132:0;-1:-1:-1;;;;;;51055:132:0;;;;;;;;;;;;51014:185;51238:7;51234:2;-1:-1:-1;;;;;51219:27:0;51228:4;-1:-1:-1;;;;;51219:27:0;-1:-1:-1;;;;;;;;;;;51219:27:0;;;;;;;;;51253:42;30277:949;43687:212;43745:4;43856:10;;43845:7;:21;;43844:48;;;;-1:-1:-1;;43883:8:0;;-1:-1:-1;43872:19:0;;43687:212::o;38652:1107::-;-1:-1:-1;;;;;;;;;;;;;;;;;38769:16:0;38777:7;38769;:16::i;:::-;38761:71;;;;-1:-1:-1;;;38761:71:0;;22795:2:1;38761:71:0;;;22777:21:1;22834:2;22814:18;;;22807:30;22873:34;22853:18;;;22846:62;-1:-1:-1;;;22924:18:1;;;22917:40;22974:19;;38761:71:0;22593:406:1;38761:71:0;38928:31;38962:20;;;:11;:20;;;;;;;;;38928:54;;;;;;;;;-1:-1:-1;;;;;38928:54:0;;;;-1:-1:-1;;;38928:54:0;;-1:-1:-1;;;;;38928:54:0;;;;;38995:17;38962:20;38995:8;:17::i;:::-;38989:233;;39032:14;;-1:-1:-1;;;;;39032:28:0;;;;;39031:65;;-1:-1:-1;39084:11:0;;39066:14;;-1:-1:-1;;;;;39066:29:0;;;39084:11;;39066:29;;39031:65;39026:188;;;39119:9;38652:1107;-1:-1:-1;;38652:1107:0:o;39026:188::-;39157:57;;-1:-1:-1;;;39157:57:0;;;;;;;:::i;39026:188::-;39230:26;39278:12;39267:7;:23;39263:93;;39322:22;39332:12;39322:7;:22;:::i;:::-;:26;;39347:1;39322:26;:::i;:::-;39301:47;;39263:93;39389:10;;39368:18;:31;39364:87;;;-1:-1:-1;39433:10:0;;39364:87;39479:7;39459:229;39496:18;39488:4;:26;39459:229;;39545:17;;;;:11;:17;;;;;;;;;39533:29;;;;;;;;;-1:-1:-1;;;;;39533:29:0;;;;;-1:-1:-1;;;39533:29:0;;;-1:-1:-1;;;;;39533:29:0;;;;;;;;;;-1:-1:-1;39576:28:0;;;;39575:65;;-1:-1:-1;39628:11:0;;39610:14;;-1:-1:-1;;;;;39610:29:0;;;39628:11;;39610:29;;39575:65;39571:110;;;-1:-1:-1;39662:9:0;;38652:1107;-1:-1:-1;;;38652:1107:0:o;39571:110::-;39516:6;;;;:::i;:::-;;;;39459:229;;;;39696:57;;-1:-1:-1;;;39696:57:0;;;;;;;:::i;43907:98::-;43972:27;43982:2;43986:8;43972:27;;;;;;;;;;;;:9;:27::i;12671:191::-;12745:16;12764:6;;-1:-1:-1;;;;;12781:17:0;;;-1:-1:-1;;;;;;12781:17:0;;;;;;12814:40;;12764:6;;;;;;;12814:40;;12745:16;12814:40;12734:128;12671:191;:::o;52122:690::-;52259:4;-1:-1:-1;;;;;52276:13:0;;13902:20;13950:8;52272:535;;52315:72;;-1:-1:-1;;;52315:72:0;;-1:-1:-1;;;;;52315:36:0;;;;;:72;;10317:10;;52366:4;;52372:7;;52381:5;;52315:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52315:72:0;;;;;;;;-1:-1:-1;;52315:72:0;;;;;;;;;;;;:::i;:::-;;;52302:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52546:13:0;;52542:215;;52579:61;;-1:-1:-1;;;52579:61:0;;;;;;;:::i;52542:215::-;52725:6;52719:13;52710:6;52706:2;52702:15;52695:38;52302:464;-1:-1:-1;;;;;;52437:55:0;-1:-1:-1;;;52437:55:0;;-1:-1:-1;52430:62:0;;52272:535;-1:-1:-1;52795:4:0;52272:535;52122:690;;;;;;:::o;61702:100::-;61754:13;61787:7;61780:14;;;;;:::i;7909:723::-;7965:13;8186:10;8182:53;;-1:-1:-1;;8213:10:0;;;;;;;;;;;;-1:-1:-1;;;8213:10:0;;;;;7909:723::o;8182:53::-;8260:5;8245:12;8301:78;8308:9;;8301:78;;8334:8;;;;:::i;:::-;;-1:-1:-1;8357:10:0;;-1:-1:-1;8365:2:0;8357:10;;:::i;:::-;;;8301:78;;;8389:19;8421:6;-1:-1:-1;;;;;8411:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8411:17:0;;8389:39;;8439:154;8446:10;;8439:154;;8473:11;8483:1;8473:11;;:::i;:::-;;-1:-1:-1;8542:10:0;8550:2;8542:5;:10;:::i;:::-;8529:24;;:2;:24;:::i;:::-;8516:39;;8499:6;8506;8499:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;8499:56:0;;;;;;;;-1:-1:-1;8570:11:0;8579:2;8570:11;;:::i;:::-;;;8439:154;;48128:1320;48188:35;48226:20;48238:7;48226:11;:20::i;:::-;48188:58;;48257:13;48273:24;48289:7;48273:15;:24::i;:::-;48257:40;-1:-1:-1;48404:36:0;48421:1;48425:7;48434:5;48404:8;:36::i;:::-;-1:-1:-1;;;;;48486:19:0;;48453:30;48486:19;;;:12;:19;;;;;;;;;48453:52;;;;;;;;;-1:-1:-1;;;;;48453:52:0;;;;;-1:-1:-1;;;48453:52:0;;;;;;;;;;;48538:93;;;;;;;;48564:19;;48453:52;;48538:93;;;48564:23;;48453:52;;48564:23;:::i;:::-;-1:-1:-1;;;;;48538:93:0;;;;;48629:1;48602:11;:24;;;:28;;;;:::i;:::-;-1:-1:-1;;;;;48538:93:0;;;;;;-1:-1:-1;;;;;48516:19:0;;;;;;:12;:19;;;;;;;:115;;;;;;;;;-1:-1:-1;;;48516:115:0;;;;;;;;;;;48644:10;:12;;;;;;:::i;:::-;;;;-1:-1:-1;;48690:52:0;;;;;;;;48705:11;;-1:-1:-1;;;;;48705:11:0;;;48690:52;;-1:-1:-1;;;;;48725:15:0;48690:52;;;;;;;;;-1:-1:-1;48667:20:0;;;:11;:20;;;;;;:75;;;;;;;;;-1:-1:-1;;;48667:75:0;-1:-1:-1;;;;;;48667:75:0;;;;;;;;;;;49054:11;48679:7;48705:11;49054;:::i;:::-;49032:33;;49080:21;49089:11;49080:8;:21::i;:::-;:70;;;;-1:-1:-1;49147:1:0;49106:24;;;:11;:24;;;;;:29;-1:-1:-1;;;;;49106:29:0;:43;49080:70;49076:307;;;49171:20;49179:11;49171:7;:20::i;:::-;49167:205;;;49239:117;;;;;;;;49272:18;;-1:-1:-1;;;;;49239:117:0;;;;;;49309:28;;;;-1:-1:-1;;;;;49239:117:0;;;;;;;;;-1:-1:-1;49212:24:0;;;:11;:24;;;;;;;:144;;;;;;;;;-1:-1:-1;;;49212:144:0;-1:-1:-1;;;;;;49212:144:0;;;;;;;;;;;;49167:205;49404:36;;49432:7;;49428:1;;-1:-1:-1;;;;;49404:36:0;;;-1:-1:-1;;;;;;;;;;;49404:36:0;49428:1;;49404:36;48177:1271;;;;48128:1320;:::o;60068:610::-;60145:6;;;60185:87;60208:1;60204;:5;;;60185:87;;;60238:16;;;;;;;:13;:16;;;;;;60229:33;;-1:-1:-1;;;;;60238:16:0;:24;60229:33;;:::i;:::-;;-1:-1:-1;60211:3:0;;;;:::i;:::-;;;;60185:87;;;-1:-1:-1;60282:11:0;60376:5;60412:16;60427:1;60412:12;:16;:::i;:::-;60402:27;60450:14;60485:16;60522:10;60553:13;35305:10;;;35228:93;60553:13;60339:270;;;;;;11760:19:1;;;;11795:12;;11788:28;;;;-1:-1:-1;;11904:2:1;11900:15;;;11896:24;;11882:12;;;11875:46;11937:12;;;11930:28;;;;11993:15;;;11989:24;11974:13;;;11967:47;12030:13;;;12023:29;12068:13;;;12061:29;;;12106:13;;60339:270:0;;;-1:-1:-1;;60339:270:0;;;;;;;;;60313:309;;60339:270;60313:309;;;;;-1:-1:-1;60656:15:0;60665:6;60313:309;60656:15;:::i;:::-;60642:30;60068:610;-1:-1:-1;;;;;60068:610:0:o;46117:108::-;46192:25;46201:2;46205:7;46192:25;;;;;;;;;;;;:8;:25::i;44344:1375::-;44472:12;;-1:-1:-1;;;;;44499:16:0;;44491:62;;;;-1:-1:-1;;;44491:62:0;;25928:2:1;44491:62:0;;;25910:21:1;25967:2;25947:18;;;25940:30;26006:34;25986:18;;;25979:62;-1:-1:-1;;;26057:18:1;;;26050:31;26098:19;;44491:62:0;25726:397:1;44491:62:0;44574:11;;-1:-1:-1;;;;;44568:17:0;;;44574:11;;44568:17;;44560:63;;;;-1:-1:-1;;;44560:63:0;;;;;;;:::i;:::-;44764:21;44772:12;44764:7;:21::i;:::-;44763:22;44755:64;;;;-1:-1:-1;;;44755:64:0;;30437:2:1;44755:64:0;;;30419:21:1;30476:2;30456:18;;;30449:30;30515:31;30495:18;;;30488:59;30564:18;;44755:64:0;30235:353:1;44755:64:0;44846:12;44834:8;:24;;44826:71;;;;-1:-1:-1;;;44826:71:0;;20099:2:1;44826:71:0;;;20081:21:1;20138:2;20118:18;;;20111:30;20177:34;20157:18;;;20150:62;-1:-1:-1;;;20228:18:1;;;20221:32;20270:19;;44826:71:0;19897:398:1;44826:71:0;-1:-1:-1;;;;;45009:16:0;;44976:30;45009:16;;;:12;:16;;;;;;;;;44976:49;;;;;;;;;-1:-1:-1;;;;;44976:49:0;;;;;-1:-1:-1;;;44976:49:0;;;;;;;;;;;45051:119;;;;;;;;45071:19;;44976:49;;45051:119;;;45071:39;;45101:8;;45071:39;:::i;:::-;-1:-1:-1;;;;;45051:119:0;;;;;45154:8;45119:11;:24;;;:44;;;;:::i;:::-;-1:-1:-1;;;;;45051:119:0;;;;;;-1:-1:-1;;;;;45032:16:0;;;;;;;:12;:16;;;;;;;;:138;;;;;;;;-1:-1:-1;;;45032:138:0;;;;;;;;;;;;45209:43;;;;;;;;;;-1:-1:-1;;;;;45235:15:0;45209:43;;;;;;;;45181:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;45181:71:0;-1:-1:-1;;;;;;45181:71:0;;;;;;;;;;;;;;;;;;45193:12;;45305:304;45329:8;45325:1;:12;45305:304;;;45358:38;;45383:12;;-1:-1:-1;;;;;45358:38:0;;;45375:1;;-1:-1:-1;;;;;;;;;;;45358:38:0;45375:1;;45358:38;45423:59;45454:1;45458:2;45462:12;45476:5;45423:22;:59::i;:::-;45405:150;;;;-1:-1:-1;;;45405:150:0;;27953:2:1;45405:150:0;;;27935:21:1;27992:2;27972:18;;;27965:30;28031:34;28011:18;;;28004:62;-1:-1:-1;;;28082:18:1;;;28075:49;28141:19;;45405:150:0;27751:415:1;45405:150:0;45566:14;;;;:::i;:::-;45589:10;:12;;45566:14;;-1:-1:-1;45589:12:0;;-1:-1:-1;45589:10:0;:12;;;:::i;:::-;;;;;;45339:3;;;;;:::i;:::-;;;;45305:304;;;-1:-1:-1;45617:12:0;:27;;;45653:60;30277:949;46452:327;46581:25;46594:2;46598:7;46581:12;:25::i;:::-;46639:54;46670:1;46674:2;46678:7;46687:5;46639:22;:54::i;:::-;46617:154;;;;-1:-1:-1;;;46617:154:0;;16735:2:1;46617:154:0;;;16717:21:1;16774:2;16754:18;;;16747:30;16813:34;16793:18;;;16786:62;-1:-1:-1;;;16864:18:1;;;16857:48;16922:19;;46617:154:0;16533:414:1;47111:714:0;-1:-1:-1;;;;;47198:16:0;;47190:61;;;;-1:-1:-1;;;47190:61:0;;24020:2:1;47190:61:0;;;24002:21:1;;;24039:18;;;24032:30;24098:34;24078:18;;;24071:62;24150:18;;47190:61:0;23818:356:1;47190:61:0;47276:11;;-1:-1:-1;;;;;47270:17:0;;;47276:11;;47270:17;;47262:63;;;;-1:-1:-1;;;47262:63:0;;;;;;;:::i;:::-;47403:10;:12;;;:10;:12;;;:::i;:::-;;;;;;47443:10;;47433:7;:20;47430:71;;;47469:10;:20;;;47430:71;-1:-1:-1;;;;;47548:16:0;;47515:30;47548:16;;;:12;:16;;;;;;;;;47515:49;;;;;;;;;-1:-1:-1;;;;;47515:49:0;;;;;-1:-1:-1;;;47515:49:0;;;;;;;;;;;47594:93;;;;;;;;47620:19;;47515:49;;47594:93;;;47620:23;;47515:49;47620:23;:::i;:::-;-1:-1:-1;;;;;47594:93:0;;;;;47658:11;:24;;;47685:1;47658:28;;;;:::i;:::-;-1:-1:-1;;;;;47594:93:0;;;;;;-1:-1:-1;;;;;47575:16:0;;;;;;;:12;:16;;;;;;;;:112;;;;;;;;-1:-1:-1;;;47575:112:0;;;;;;;;;;;;47723:43;;;;;;;;;;-1:-1:-1;;;;;47749:15:0;47723:43;;;;;;;;47700:20;;;:11;:20;;;;;;:66;;;;;;;;;-1:-1:-1;;;47700:66:0;-1:-1:-1;;;;;;47700:66:0;;;;;;;;;;;;;;;;47784:33;;47712:7;;47575:16;;-1:-1:-1;;;;;;;;;;;47784:33:0;47575:16;;47784:33;47179:646;47111:714;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:631:1;78:5;-1:-1:-1;;;;;149:2:1;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:347::-;701:8;711:6;765:3;758:4;750:6;746:17;742:27;732:55;;783:1;780;773:12;732:55;-1:-1:-1;806:20:1;;-1:-1:-1;;;;;838:30:1;;835:50;;;881:1;878;871:12;835:50;918:4;910:6;906:17;894:29;;970:3;963:4;954:6;946;942:19;938:30;935:39;932:59;;;987:1;984;977:12;932:59;650:347;;;;;:::o;1002:220::-;1044:5;1097:3;1090:4;1082:6;1078:17;1074:27;1064:55;;1115:1;1112;1105:12;1064:55;1137:79;1212:3;1203:6;1190:20;1183:4;1175:6;1171:17;1137:79;:::i;1227:159::-;1294:20;;1354:6;1343:18;;1333:29;;1323:57;;1376:1;1373;1366:12;1391:171;1458:20;;-1:-1:-1;;;;;1507:30:1;;1497:41;;1487:69;;1552:1;1549;1542:12;1567:247;1626:6;1679:2;1667:9;1658:7;1654:23;1650:32;1647:52;;;1695:1;1692;1685:12;1647:52;1734:9;1721:23;1753:31;1778:5;1753:31;:::i;1819:320::-;1906:6;1914;1967:2;1955:9;1946:7;1942:23;1938:32;1935:52;;;1983:1;1980;1973:12;1935:52;2015:9;2009:16;2034:31;2059:5;2034:31;:::i;:::-;2129:2;2114:18;;;;2108:25;2084:5;;2108:25;;-1:-1:-1;;;1819:320:1:o;2144:388::-;2212:6;2220;2273:2;2261:9;2252:7;2248:23;2244:32;2241:52;;;2289:1;2286;2279:12;2241:52;2328:9;2315:23;2347:31;2372:5;2347:31;:::i;:::-;2397:5;-1:-1:-1;2454:2:1;2439:18;;2426:32;2467:33;2426:32;2467:33;:::i;:::-;2519:7;2509:17;;;2144:388;;;;;:::o;2537:456::-;2614:6;2622;2630;2683:2;2671:9;2662:7;2658:23;2654:32;2651:52;;;2699:1;2696;2689:12;2651:52;2738:9;2725:23;2757:31;2782:5;2757:31;:::i;:::-;2807:5;-1:-1:-1;2864:2:1;2849:18;;2836:32;2877:33;2836:32;2877:33;:::i;:::-;2537:456;;2929:7;;-1:-1:-1;;;2983:2:1;2968:18;;;;2955:32;;2537:456::o;2998:665::-;3093:6;3101;3109;3117;3170:3;3158:9;3149:7;3145:23;3141:33;3138:53;;;3187:1;3184;3177:12;3138:53;3226:9;3213:23;3245:31;3270:5;3245:31;:::i;:::-;3295:5;-1:-1:-1;3352:2:1;3337:18;;3324:32;3365:33;3324:32;3365:33;:::i;:::-;3417:7;-1:-1:-1;3471:2:1;3456:18;;3443:32;;-1:-1:-1;3526:2:1;3511:18;;3498:32;-1:-1:-1;;;;;3542:30:1;;3539:50;;;3585:1;3582;3575:12;3539:50;3608:49;3649:7;3640:6;3629:9;3625:22;3608:49;:::i;:::-;3598:59;;;2998:665;;;;;;;:::o;3668:416::-;3733:6;3741;3794:2;3782:9;3773:7;3769:23;3765:32;3762:52;;;3810:1;3807;3800:12;3762:52;3849:9;3836:23;3868:31;3893:5;3868:31;:::i;:::-;3918:5;-1:-1:-1;3975:2:1;3960:18;;3947:32;4017:15;;4010:23;3998:36;;3988:64;;4048:1;4045;4038:12;4089:315;4157:6;4165;4218:2;4206:9;4197:7;4193:23;4189:32;4186:52;;;4234:1;4231;4224:12;4186:52;4273:9;4260:23;4292:31;4317:5;4292:31;:::i;:::-;4342:5;4394:2;4379:18;;;;4366:32;;-1:-1:-1;;;4089:315:1:o;4409:245::-;4467:6;4520:2;4508:9;4499:7;4495:23;4491:32;4488:52;;;4536:1;4533;4526:12;4488:52;4575:9;4562:23;4594:30;4618:5;4594:30;:::i;4659:249::-;4728:6;4781:2;4769:9;4760:7;4756:23;4752:32;4749:52;;;4797:1;4794;4787:12;4749:52;4829:9;4823:16;4848:30;4872:5;4848:30;:::i;4913:450::-;4982:6;5035:2;5023:9;5014:7;5010:23;5006:32;5003:52;;;5051:1;5048;5041:12;5003:52;5091:9;5078:23;-1:-1:-1;;;;;5116:6:1;5113:30;5110:50;;;5156:1;5153;5146:12;5110:50;5179:22;;5232:4;5224:13;;5220:27;-1:-1:-1;5210:55:1;;5261:1;5258;5251:12;5210:55;5284:73;5349:7;5344:2;5331:16;5326:2;5322;5318:11;5284:73;:::i;5368:184::-;5426:6;5479:2;5467:9;5458:7;5454:23;5450:32;5447:52;;;5495:1;5492;5485:12;5447:52;5518:28;5536:9;5518:28;:::i;5557:481::-;5635:6;5643;5651;5704:2;5692:9;5683:7;5679:23;5675:32;5672:52;;;5720:1;5717;5710:12;5672:52;5743:28;5761:9;5743:28;:::i;:::-;5733:38;;5822:2;5811:9;5807:18;5794:32;-1:-1:-1;;;;;5841:6:1;5838:30;5835:50;;;5881:1;5878;5871:12;5835:50;5920:58;5970:7;5961:6;5950:9;5946:22;5920:58;:::i;:::-;5557:481;;5997:8;;-1:-1:-1;5894:84:1;;-1:-1:-1;;;;5557:481:1:o;6043:460::-;6128:6;6136;6144;6197:2;6185:9;6176:7;6172:23;6168:32;6165:52;;;6213:1;6210;6203:12;6165:52;6236:28;6254:9;6236:28;:::i;:::-;6226:38;;6315:2;6304:9;6300:18;6287:32;-1:-1:-1;;;;;6334:6:1;6331:30;6328:50;;;6374:1;6371;6364:12;6328:50;6397:49;6438:7;6429:6;6418:9;6414:22;6397:49;:::i;:::-;6387:59;;;6493:2;6482:9;6478:18;6465:32;6455:42;;6043:460;;;;;:::o;6508:773::-;6612:6;6620;6628;6636;6644;6697:3;6685:9;6676:7;6672:23;6668:33;6665:53;;;6714:1;6711;6704:12;6665:53;6737:28;6755:9;6737:28;:::i;:::-;6727:38;;6816:2;6805:9;6801:18;6788:32;-1:-1:-1;;;;;6880:2:1;6872:6;6869:14;6866:34;;;6896:1;6893;6886:12;6866:34;6919:49;6960:7;6951:6;6940:9;6936:22;6919:49;:::i;:::-;6909:59;;6987:37;7020:2;7009:9;7005:18;6987:37;:::i;:::-;6977:47;;7077:2;7066:9;7062:18;7049:32;7033:48;;7106:2;7096:8;7093:16;7090:36;;;7122:1;7119;7112:12;7090:36;;7161:60;7213:7;7202:8;7191:9;7187:24;7161:60;:::i;:::-;6508:773;;;;-1:-1:-1;6508:773:1;;-1:-1:-1;7240:8:1;;7135:86;6508:773;-1:-1:-1;;;6508:773:1:o;7286:684::-;7388:6;7396;7404;7412;7465:3;7453:9;7444:7;7440:23;7436:33;7433:53;;;7482:1;7479;7472:12;7433:53;7505:28;7523:9;7505:28;:::i;:::-;7495:38;;7584:2;7573:9;7569:18;7556:32;-1:-1:-1;;;;;7648:2:1;7640:6;7637:14;7634:34;;;7664:1;7661;7654:12;7634:34;7687:49;7728:7;7719:6;7708:9;7704:22;7687:49;:::i;:::-;7677:59;;7755:37;7788:2;7777:9;7773:18;7755:37;:::i;:::-;7745:47;;7845:2;7834:9;7830:18;7817:32;7801:48;;7874:2;7864:8;7861:16;7858:36;;;7890:1;7887;7880:12;7858:36;;7913:51;7956:7;7945:8;7934:9;7930:24;7913:51;:::i;7975:252::-;8042:6;8050;8103:2;8091:9;8082:7;8078:23;8074:32;8071:52;;;8119:1;8116;8109:12;8071:52;8142:28;8160:9;8142:28;:::i;8232:180::-;8291:6;8344:2;8332:9;8323:7;8319:23;8315:32;8312:52;;;8360:1;8357;8350:12;8312:52;-1:-1:-1;8383:23:1;;8232:180;-1:-1:-1;8232:180:1:o;8417:245::-;8496:6;8504;8557:2;8545:9;8536:7;8532:23;8528:32;8525:52;;;8573:1;8570;8563:12;8525:52;-1:-1:-1;;8596:16:1;;8652:2;8637:18;;;8631:25;8596:16;;8631:25;;-1:-1:-1;8417:245:1:o;8667:269::-;8724:6;8777:2;8765:9;8756:7;8752:23;8748:32;8745:52;;;8793:1;8790;8783:12;8745:52;8832:9;8819:23;8882:4;8875:5;8871:16;8864:5;8861:27;8851:55;;8902:1;8899;8892:12;9058:257;9099:3;9137:5;9131:12;9164:6;9159:3;9152:19;9180:63;9236:6;9229:4;9224:3;9220:14;9213:4;9206:5;9202:16;9180:63;:::i;:::-;9297:2;9276:15;-1:-1:-1;;9272:29:1;9263:39;;;;9304:4;9259:50;;9058:257;-1:-1:-1;;9058:257:1:o;9320:271::-;9503:6;9495;9490:3;9477:33;9459:3;9529:16;;9554:13;;;9529:16;9320:271;-1:-1:-1;9320:271:1:o;9596:274::-;9725:3;9763:6;9757:13;9779:53;9825:6;9820:3;9813:4;9805:6;9801:17;9779:53;:::i;:::-;9848:16;;;;;9596:274;-1:-1:-1;;9596:274:1:o;9875:811::-;10001:3;10030:1;10063:6;10057:13;10093:36;10119:9;10093:36;:::i;:::-;10148:1;10165:18;;;10192:104;;;;10310:1;10305:356;;;;10158:503;;10192:104;-1:-1:-1;;10225:24:1;;10213:37;;10270:16;;;;-1:-1:-1;10192:104:1;;10305:356;10336:6;10333:1;10326:17;10366:4;10411:2;10408:1;10398:16;10436:1;10450:165;10464:6;10461:1;10458:13;10450:165;;;10542:14;;10529:11;;;10522:35;10585:16;;;;10479:10;;10450:165;;;10454:3;;;10644:6;10639:3;10635:16;10628:23;;10158:503;-1:-1:-1;10677:3:1;;9875:811;-1:-1:-1;;;;;;9875:811:1:o;10691:470::-;10870:3;10908:6;10902:13;10924:53;10970:6;10965:3;10958:4;10950:6;10946:17;10924:53;:::i;:::-;11040:13;;10999:16;;;;11062:57;11040:13;10999:16;11096:4;11084:17;;11062:57;:::i;:::-;11135:20;;10691:470;-1:-1:-1;;;;10691:470:1:o;12338:488::-;-1:-1:-1;;;;;12607:15:1;;;12589:34;;12659:15;;12654:2;12639:18;;12632:43;12706:2;12691:18;;12684:34;;;12754:3;12749:2;12734:18;;12727:31;;;12532:4;;12775:45;;12800:19;;12792:6;12775:45;:::i;:::-;12767:53;12338:488;-1:-1:-1;;;;;;12338:488:1:o;13460:632::-;13631:2;13683:21;;;13753:13;;13656:18;;;13775:22;;;13602:4;;13631:2;13854:15;;;;13828:2;13813:18;;;13602:4;13897:169;13911:6;13908:1;13905:13;13897:169;;;13972:13;;13960:26;;14041:15;;;;14006:12;;;;13933:1;13926:9;13897:169;;;-1:-1:-1;14083:3:1;;13460:632;-1:-1:-1;;;;;;13460:632:1:o;14289:217::-;14436:2;14425:9;14418:21;14399:4;14456:44;14496:2;14485:9;14481:18;14473:6;14456:44;:::i;18246:415::-;18448:2;18430:21;;;18487:2;18467:18;;;18460:30;18526:34;18521:2;18506:18;;18499:62;-1:-1:-1;;;18592:2:1;18577:18;;18570:49;18651:3;18636:19;;18246:415::o;23004:397::-;23206:2;23188:21;;;23245:2;23225:18;;;23218:30;23284:34;23279:2;23264:18;;23257:62;-1:-1:-1;;;23350:2:1;23335:18;;23328:31;23391:3;23376:19;;23004:397::o;24179:356::-;24381:2;24363:21;;;24400:18;;;24393:30;24459:34;24454:2;24439:18;;24432:62;24526:2;24511:18;;24179:356::o;26531:404::-;26733:2;26715:21;;;26772:2;26752:18;;;26745:30;26811:34;26806:2;26791:18;;26784:62;-1:-1:-1;;;26877:2:1;26862:18;;26855:38;26925:3;26910:19;;26531:404::o;28997:411::-;29199:2;29181:21;;;29238:2;29218:18;;;29211:30;29277:34;29272:2;29257:18;;29250:62;-1:-1:-1;;;29343:2:1;29328:18;;29321:45;29398:3;29383:19;;28997:411::o;30960:640::-;31241:6;31229:19;;31211:38;;-1:-1:-1;;;;;31285:32:1;;31280:2;31265:18;;31258:60;31305:3;31349:2;31334:18;;31327:31;;;-1:-1:-1;;31381:45:1;;31406:19;;31398:6;31381:45;:::i;:::-;31476:6;31469:14;31462:22;31457:2;31446:9;31442:18;31435:50;31534:9;31526:6;31522:22;31516:3;31505:9;31501:19;31494:51;31562:32;31587:6;31579;31562:32;:::i;:::-;31554:40;30960:640;-1:-1:-1;;;;;;;;30960:640:1:o;31605:717::-;31872:6;31864;31860:19;31849:9;31842:38;31916:3;31911:2;31900:9;31896:18;31889:31;31823:4;31943:45;31983:3;31972:9;31968:19;31960:6;31943:45;:::i;:::-;-1:-1:-1;;;;;32028:6:1;32024:31;32019:2;32008:9;32004:18;31997:59;32104:9;32096:6;32092:22;32087:2;32076:9;32072:18;32065:50;32139:6;32131;32124:22;32193:6;32185;32180:2;32172:6;32168:15;32155:45;32246:1;32241:2;32232:6;32224;32220:19;32216:28;32209:39;32313:2;32306;32302:7;32297:2;32289:6;32285:15;32281:29;32273:6;32269:42;32265:51;32257:59;;;31605:717;;;;;;;;:::o;32327:555::-;32584:6;32576;32572:19;32561:9;32554:38;32628:3;32623:2;32612:9;32608:18;32601:31;32535:4;32655:45;32695:3;32684:9;32680:19;32672:6;32655:45;:::i;:::-;-1:-1:-1;;;;;32740:6:1;32736:31;32731:2;32720:9;32716:18;32709:59;32816:9;32808:6;32804:22;32799:2;32788:9;32784:18;32777:50;32844:32;32869:6;32861;32844:32;:::i;:::-;32836:40;32327:555;-1:-1:-1;;;;;;;32327:555:1:o;32887:1498::-;33233:6;33225;33221:19;33210:9;33203:38;33184:4;33260:2;33298:3;33293:2;33282:9;33278:18;33271:31;33322:1;33355:6;33349:13;33385:36;33411:9;33385:36;:::i;:::-;33458:6;33452:3;33441:9;33437:19;33430:35;33484:3;33506:1;33538:2;33527:9;33523:18;33555:1;33550:122;;;;33686:1;33681:354;;;;33516:519;;33550:122;-1:-1:-1;;33598:24:1;;33578:18;;;33571:52;33658:3;33643:19;;;-1:-1:-1;33550:122:1;;33681:354;33712:6;33709:1;33702:17;33760:2;33757:1;33747:16;33785:1;33799:180;33813:6;33810:1;33807:13;33799:180;;;33906:14;;33882:17;;;33878:26;;33871:50;33949:16;;;;33828:10;;33799:180;;;34003:17;;33999:26;;;-1:-1:-1;;33516:519:1;;;;;;34080:9;34075:3;34071:19;34066:2;34055:9;34051:18;34044:47;34114:29;34139:3;34131:6;34114:29;:::i;:::-;34100:43;;;34152:54;34202:2;34191:9;34187:18;34179:6;-1:-1:-1;;;;;9015:31:1;9003:44;;8941:112;34152:54;-1:-1:-1;;;;;9015:31:1;;34265:3;34250:19;;9003:44;34319:9;34311:6;34307:22;34301:3;34290:9;34286:19;34279:51;34347:32;34372:6;34364;34347:32;:::i;:::-;34339:40;32887:1498;-1:-1:-1;;;;;;;;;32887:1498:1:o;34825:253::-;34865:3;-1:-1:-1;;;;;34954:2:1;34951:1;34947:10;34984:2;34981:1;34977:10;35015:3;35011:2;35007:12;35002:3;34999:21;34996:47;;;35023:18;;:::i;35083:128::-;35123:3;35154:1;35150:6;35147:1;35144:13;35141:39;;;35160:18;;:::i;:::-;-1:-1:-1;35196:9:1;;35083:128::o;35216:120::-;35256:1;35282;35272:35;;35287:18;;:::i;:::-;-1:-1:-1;35321:9:1;;35216:120::o;35341:168::-;35381:7;35447:1;35443;35439:6;35435:14;35432:1;35429:21;35424:1;35417:9;35410:17;35406:45;35403:71;;;35454:18;;:::i;:::-;-1:-1:-1;35494:9:1;;35341:168::o;35514:246::-;35554:4;-1:-1:-1;;;;;35667:10:1;;;;35637;;35689:12;;;35686:38;;;35704:18;;:::i;:::-;35741:13;;35514:246;-1:-1:-1;;;35514:246:1:o;35765:125::-;35805:4;35833:1;35830;35827:8;35824:34;;;35838:18;;:::i;:::-;-1:-1:-1;35875:9:1;;35765:125::o;35895:258::-;35967:1;35977:113;35991:6;35988:1;35985:13;35977:113;;;36067:11;;;36061:18;36048:11;;;36041:39;36013:2;36006:10;35977:113;;;36108:6;36105:1;36102:13;36099:48;;;-1:-1:-1;;36143:1:1;36125:16;;36118:27;35895:258::o;36158:136::-;36197:3;36225:5;36215:39;;36234:18;;:::i;:::-;-1:-1:-1;;;36270:18:1;;36158:136::o;36299:380::-;36378:1;36374:12;;;;36421;;;36442:61;;36496:4;36488:6;36484:17;36474:27;;36442:61;36549:2;36541:6;36538:14;36518:18;36515:38;36512:161;;;36595:10;36590:3;36586:20;36583:1;36576:31;36630:4;36627:1;36620:15;36658:4;36655:1;36648:15;36684:197;36722:3;36750:6;36791:2;36784:5;36780:14;36818:2;36809:7;36806:15;36803:41;;;36824:18;;:::i;:::-;36873:1;36860:15;;36684:197;-1:-1:-1;;;36684:197:1:o;36886:135::-;36925:3;-1:-1:-1;;36946:17:1;;36943:43;;;36966:18;;:::i;:::-;-1:-1:-1;37013:1:1;37002:13;;36886:135::o;37026:112::-;37058:1;37084;37074:35;;37089:18;;:::i;:::-;-1:-1:-1;37123:9:1;;37026:112::o;37143:127::-;37204:10;37199:3;37195:20;37192:1;37185:31;37235:4;37232:1;37225:15;37259:4;37256:1;37249:15;37275:127;37336:10;37331:3;37327:20;37324:1;37317:31;37367:4;37364:1;37357:15;37391:4;37388:1;37381:15;37407:127;37468:10;37463:3;37459:20;37456:1;37449:31;37499:4;37496:1;37489:15;37523:4;37520:1;37513:15;37539:127;37600:10;37595:3;37591:20;37588:1;37581:31;37631:4;37628:1;37621:15;37655:4;37652:1;37645:15;37671:131;-1:-1:-1;;;;;37746:31:1;;37736:42;;37726:70;;37792:1;37789;37782:12;37807:131;-1:-1:-1;;;;;;37881:32:1;;37871:43;;37861:71;;37928:1;37925;37918:12

Swarm Source

ipfs://f59c8aadd38c663aa3d3b8da6bfabb1746887db14d7f8cbec8fc33f6bf0fc03e
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.