ETH Price: $3,298.95 (-0.94%)

Token

BETA (BETA)
 

Overview

Max Total Supply

0 BETA

Holders

637

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
5 BETA
0x947245F9057514be448236cde5C20Db263BB4F7F
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:
BETA

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-05
*/

// File: contracts/interfaces/ILayerZeroUserApplicationConfig.sol



pragma solidity >=0.5.0;

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

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

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

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

// File: contracts/interfaces/ILayerZeroEndpoint.sol



pragma solidity >=0.5.0;


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

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

    // @notice get the inboundNonce of a 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);
}

// File: contracts/interfaces/ILayerZeroReceiver.sol



pragma solidity >=0.5.0;

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Context.sol


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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/access/Ownable.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Address.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


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

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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



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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

// File: contracts/NonblockingReceiver.sol


pragma solidity ^0.8.6;




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

// File: contracts/BETA.sol



pragma solidity ^0.8.7;

// XXXXXXXXXXXXXXXXXXXXXXXKc    cKXXXXXXXKc    cKXX0:    :0XXXXXXXX0:    :0XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
// XXXXXXXXXXKKKKKKKKKKKKK0c.   cKXXXXXXXKl.   c0KK0:    c0XXXXXXXX0c    :0KKKKXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
// XXXXXXXXKd,''''''''''''':dddxOKXXXXXXXXOxdddc''''cdddxOKXXXXXXXXKOxdddc''',oKXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
// XXXXXXXXKc              :0XXXXXXXXXXXXXXXXXKc    cKXXXXXXXXXXXXXXXXXXKc    cKXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
// XXXXOddddc''''''''..    :0XXXXXXXKOxdddOKXXKc    cKXXXXXXXKOxxddxOXXXKc    cKXXXOdddddddddddddxOXXXXXXXXXXXXXXXXXXXXXXXX
// XXXK:    :0KKKKKKK0;    :0XXXXXXX0:    :0XXKc    cKXXXXXXXKc.   .lKXXKc    cKXXK:             .lKXXXXXXXXXXXXXXXXXXXXXXX
// KKK0:    :0XXXKKKK0:    :0KKKKXXX0:    :0KK0:    c0KKKKXXXKc.   .c0KK0c    :0KK0:              cKKKKXXXXXXKKKKKKKKKXXXXX
// ''',codddOKXXKd,,,,coddoc,,,,dKXXKOdddoc,,,'.    .',,,oKXXKOxdddo:,,,,;clll:,,',codddddddo'    .''',oKXXKd,''''',,,oKXXX
//     cKXXXXXXXKc    cKXXKc    cKXXXXXXXKc              :0XXXXXXXX0:    ,kOOk;    cKXXXXXXXKc         :KXXKc         :KXXX
//     cKXXXXXXXKd;,,;dKXXKc    'loooooooo,    ..''..    'looooooooo:'''';cccc:,,,;dKXXXXXXXKd;,,'.    'looo:,,,,,,,,,:oooo
//     cKXXXXXXXXXKKKKXXXXKc                   ;kOOx,               :kkkk:    c0KKKXXXXXXXXXXKKKK0:         c0KKKKKKKKc    
//     cKKKKXXXXXXXXXXXKKKKc                   ;kkOx,               :kOOk:    cKXXXXKKKKKXXXXXXXX0:         cKXXXXXXXKl.   
// oooo:,,,;dKXXXXXXXKd;,,,:cccc.    ,ooooooooo:'''';ccccccccccccccldOOOk:    cKXXKd;,,;dKXXXXXXX0:    'loodOKXXXXXXXXOdooo
// XXX0:    :0XXXXXXX0:    ,kOOk;    lKXXXXXXXKc    :kOOOOOOOOOOOOOOOOOOk:    cKXX0:    :KXXXXXXX0:    :0XXXXXXXXXXXXXXXXXX
// XXXKo,',,:odddddddo:'..';cllc:,'';dKXXXXXXXKd,'',:cllldkOOkdlllllllllc;'..':oddo:,'',oKXXXOdddo'    :0XXKOddddOXXXXXXXXX
// XXXXXKKKKc         :kkkk:    c0KKKXXXXXXXXXXKKKK0:    ;kOOk;.         ,xkkx;    c0KKKKXXXKc         :0XXKc   .lKXXXXXXXX
// XXXXXXXXKl.        :xkkx;    cKXXXXXXXXKKKKKKXXX0:    ,xkkx;.         ;xkkx;    c0KKKKKKK0:         :OKK0c   .lKXXXKKKKK
// XXXXXXXXXOxdddddddo:.....    :KXXXXXXXKd,'',dKXX0:     ....:oddddddddd:'...;llll;'''''''''.    'llll:''',cdddxOXXXKd,'''
// XXXXXXXXXXXXXXXXXXK:         cKXXXXXXXKc    cKXX0:         c0KXXXXXXXKc    ;kOOk,              :kOOk:    cKXXXXXXXKl    
// XXXXXXXXXOxdddddddd:''''.    ,oddxOXXXKd,'',cdddo'    ..'',o0KXXXXXXXKd,''':lllc.    ..'''''''':lllc'    ,oddddddddc,'''
// XXXXXXXXKl.        c0KK0c        .lKXXXKKKK0c         ;OKKKKXXXXXXXXXXKKKK0c         ;OKKKKKKKO:                   :0KKK
// XXXXXKKKKc         cKKKKc         c0KKKKKKK0c         :0XXXXXXXXXKKKKKKXXXKc         :0KKKKXXX0:                   :KXXX
// XXXKo,,,,:odddddddo:,'''.    .cllc:,,',,,,,,:cllc.    :0XXXXXXXXKo,,,,oKXXKc    ,oddoc,,,,dKXXKOdddo,    ,oddddddddOXXXX
// XXXK:    :0XXXXXXX0:         ;kOOk,         ;kOOk,    :0XXXXXXXX0:    :0XXKc    cKXXKl    cKXXXXXXXKc    cKXXXXXXXXXXXXX
// oooo:,,,;oKXXKkdooo:,,,,.    ;kOOkc'''''''''lkOOkc'''':ooodOKKXXKd;,,,coool'    cKXXKx;,,;dKXXXXXXXKc    cKXXXXXXXXXXXXX
//     cKKKKXXXXKc    cKKKKc    ;kOOOOOkkkOkkOOOOOOOOkkOk:    c0KXXXXKKKKc         cKXXXXKKKKXXXXXXXXXKc    cKXXXXXXXXXXXXX
//     cKXXXXXXXKc   .lKXXKl    ;kOOOOOOOOOOOOOOOOOOOOOOk:    cO0KKKKKKKKc         cKKKKXXXXXXXXXXXKKKKc    cKXKXXXXXXXXXXX
//     lKXXXXXXXKOdoodOXXXKc    ;kOOOOOOOOOOOOOOOOOOOOOOOdlccc:,,,,,,,,,,;ccccccccc:,,,;dKXXXXXXXKd;,,,:cccc:,,,;dXXXXXXXXX
//     lKXXXXXXXXXXXXXXXXXKc    ;kOOOOOOOOOOOOOOOOOOOOOOOOOOOk;          ,kOOOOOOOk,    :0XXXXXXX0:    ,kOOk;    cKXXXXXXXX
// '',,codddOKXXXXXXXKkdddo:'..'lkOOOOOOOOOOOOOOOOOOOOOOOOOOOkl,'.......'ckOOOOOOOkc'..':odddddddo:'..'ckOOk;    cKXXXXXXXX
// KKK0:    :0XXXXXXX0:    ,xkkkOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOkkkkkkkkkkkOOOOOOOOOOkkkk:         :kkkkOOOOk;    cKXXXXXXXX
// XXXK:    :OKKKKKKKO:    ;kOOOOOOOOOOOOOOOOOOOOOOOOOOOOkkkkkkkkkkkkOOOOOOOOOOOOOOOOOOk:         :kOOOkkkkx;   .lKXXXXXXXX
// XXXXOddddc''''''''':lllldOOOOOOOOOOOOOOOOOOOOOOOOOOOOOl'........'lOOOOOOOOOOOOOOOOOOOxlllllllloxOOOkl'...:dddxOXXXXXXXXX
// XXXXXXXXKc         :kOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO:          :OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOk:    cKXXXXXXXXXXXXX
// XXXXXXXXKd,'''''''':llllllllldOOOkdlllldkOOOOOOOkdllll'          'lllldkOOOOOOOOOOOOOOOOOOdlllllllll'    cKXXXXXXXXXXXXX
// XXXXXXXXXXKKKKKKKK0:         ;kOOk;    ;kOOOOOOOk;                    ;kOOOOOOOOOOOOOOOOOk;              cKXXXXXXXXXXXXX
// XXXXXXXXXXXXXXXXXXK:         ;xkkx,    ,xkkkkkkkx,                    ,xkkkkOOOOOOOOOOOOOk;              :0KKKXXXXXXXXXX
// XXXXXXXXXXXXXXXXXXK:    .cllc;'..',,,,,''.........                    ....'lkOOOOOOOOOOOOOdlllllllllllllc;,'',dKXXXXXXXX
// XXXXXXXXXXXXXXXXXX0:    ,kOOk;    'cllc'                                   ;kOOOOOOOOOOOOOOOOOOOOOOOOOOOk;    cKXXXXXXXX
// XXXXXXXXXXXXXXXXXXKo,,,,;cccc,....;cllc;..............                     ;kOOOOOOOOOOOOOOOOOOOOOOOOOOOk;    cKXXXXXXXX
// XXXXXXXXXXXXXXXXXXXXXXXKc    'clllllllllcllcclllcccllc'                    ;kOOOOOOOOOOOOOOOOOOOOOOOOOOOk;    cKXXXXXXXX
// XXXXXXXXXXXXXXXXXXXXXXXKc    .cllclllllllllllllllllllc'                    ;kOOOOOOOOOOOOOOOOOOOOOOOOOOOk;    cKXXXXXXXX
// XXXXXXXXXXXXXXXXXXXXXXXKc     .........,clllllllllllll:,,,,.               ;kOOOOOOOOOOOOOOOOOOOOOOOOOOOk;    cKXXXXXXXX
// XXXXXXXXXXXXXXXXXXXXXXXKc              .clllllllllllllllllc.               ;kOOOOOOOOOOOOOOOOOOOOOOOOOOOk;    cKXXXXXXXX
// XXXXXXXXXXXXXXXXXXXXXXXKc    .........'',,,,,,,,,,,,,,:lllc,.....          ;kOOOOOOOOOOOOOOOOOOOOOOOOOOOk;    cKXXXXXXXX
// XXXXXXXXXXXXXXXXXXXXXXXKc    ;xkkkkkkkk;              .cllllccccc.         ;kOOOOOOOOOOOOOOOOOOOOOOOOOOOk;    cKXXXXXXXX
// XXXXXXXXXXXXXXXXXXXXXXXKc    ;kOOOOOOOk:              .:cccccccc:.         ;kOOOOOOOOOOOOOOOOOOOOOOOOOOOk;    cKXXXXXXXX
// XXXXXXXXXXXXXXXXXXXXXXXKc    ;kOOOOOOOOxllllllllc.     ..........     .cllldOOOOOOOOOOOOOOOOOOOOOOOOOOOOk;    cKXXXXXXXX
// XXXXXXXXXXXXXXXXXXXXXXXKc    ;kOOOOOOOOOOOOOOOOOk,                    ,kOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOk;    cKXXXXXXXX
// XXXXXXXXXXXXXXXXXXXXXXXXd,''';llllxOOOOOOOOOOOOOkc.....          .....ckOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOk;    cKXXXXXXXX
// XXXXXXXXXXXXXXXXXXXXXXXXXKKK0:    :kOOOOOOOOOOOOOkkkkk;          ;kkkkkOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOk;    cKXXXXXXXX
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXKc    :kkkkkkkkkOOOOOOOOOk:          :kOOOOOOOOOOOOOOOOOOOOOOOOkkkkkkkkkkkkkx;    lKXXXXXXXX
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXOdddo:'.'.....'lkOOOOOOOOxllllllllllxOOOOOOOOOOOOOOOOOOOOOOOkl'............':odddOXXXXXXXXX
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXK:         ;kOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOk;              cKXXXXXXXXXXXXX
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXKd,,,,,,,,,:cccldOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOk;    .,,,,,,,,;dKXXXXXXXXXXXXX
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXKXXXXXK:    :kOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOk;    cKXXXXXXXXXXXXXXXXXXXXXXX
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXKc    :kOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOk;    cKXXXXXXXXXXXXXXXXXXXXXXX
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXKc    :kOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOk;    cKXXXXXXXXXXXXXXXXXXXXXXX
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXKc    :kOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOk;    cKXXXXXXXXXXXXXXXXXXXXXXX
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXKc    :kOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOk;    cKXXXXXXXXXXXXXXXXXXXXXXX


contract BETA is Ownable, ERC721, NonblockingReceiver {

    address public _owner;
    string private baseURI;
    uint256 nextTokenId = 0;
	uint256 nextReserveTokenId = 2700;
	uint256 MAX_PUBLIC_MINT = 2700;
    uint256 MAX_MINT_ETHEREUM = 3000;

    uint gasForDestinationLzReceive = 350000;

    constructor(string memory baseURI_, address _layerZeroEndpoint) ERC721("BETA", "BETA") { 
        _owner = msg.sender;
        endpoint = ILayerZeroEndpoint(_layerZeroEndpoint);
        baseURI = baseURI_;
    }

	// owner reserve function
	function reserve(address _receiverAddress, uint8 numTokens) external onlyOwner {
		require(nextReserveTokenId + numTokens <= MAX_MINT_ETHEREUM, "Greedy devs trying to take more than available!");
		for (uint j = 0; j < numTokens; j++) {
			_safeMint(_receiverAddress, ++nextReserveTokenId);
		}
	}
	
	// mint function
    // you can choose to mint 1 or 2
    // mint is free, but payments are accepted
    function mint(uint8 numTokens) external payable {
        require(numTokens < 3, "BETA: Max 2 NFTs per transaction");
        require(nextTokenId + numTokens <= MAX_PUBLIC_MINT, "BETA: Mint exceeds supply");
        _safeMint(msg.sender, ++nextTokenId);
        if (numTokens == 2) {
            _safeMint(msg.sender, ++nextTokenId);
        }
    }

    // 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, "BETA: 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 donate() external payable {
        // thank you
    }

    function withdrawAll() public payable onlyOwner {
       (bool success, ) = payable(msg.sender).call{value: address(this).balance}("");
       require(success);
    }

    // This allows the devs to receive kind donations
    function withdrawAmount(uint amt) external onlyOwner {
        (bool sent, ) = payable(_owner).call{value: amt}("");
        require(sent, "META: Failed to withdraw Ether");
    }

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

    // ------------------
    // 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
        _safeMint(toAddr, tokenId);
    }  

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"},{"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":"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":"_owner","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"donate","outputs":[],"stateMutability":"payable","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"address","name":"_receiverAddress","type":"address"},{"internalType":"uint8","name":"numTokens","type":"uint8"}],"name":"reserve","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":"uint256","name":"newVal","type":"uint256"}],"name":"setGasForDestinationLzReceive","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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"withdrawAmount","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600c55610a8c600d55610a8c600e55610bb8600f55620557306010553480156200002f57600080fd5b5060405162002f1c38038062002f1c833981016040819052620000529162000248565b604051806040016040528060048152602001634245544160e01b815250604051806040016040528060048152602001634245544160e01b815250620000a6620000a06200011b60201b60201c565b6200011f565b8151620000bb9060019060208501906200016f565b508051620000d19060029060208401906200016f565b5050600a8054336001600160a01b031991821617909155600780549091166001600160a01b0384161790555081516200011290600b9060208501906200016f565b50505062000376565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280546200017d9062000339565b90600052602060002090601f016020900481019282620001a15760008555620001ec565b82601f10620001bc57805160ff1916838001178555620001ec565b82800160010185558215620001ec579182015b82811115620001ec578251825591602001919060010190620001cf565b50620001fa929150620001fe565b5090565b5b80821115620001fa5760008155600101620001ff565b634e487b7160e01b600052604160045260246000fd5b80516001600160a01b03811681146200024357600080fd5b919050565b600080604083850312156200025c57600080fd5b82516001600160401b03808211156200027457600080fd5b818501915085601f8301126200028957600080fd5b8151818111156200029e576200029e62000215565b604051601f8201601f19908116603f01168101908382118183101715620002c957620002c962000215565b81604052828152602093508884848701011115620002e657600080fd5b600091505b828210156200030a5784820184015181830185015290830190620002eb565b828211156200031c5760008484830101525b95506200032e9150508582016200022b565b925050509250929050565b600181811c908216806200034e57607f821691505b602082108114156200037057634e487b7160e01b600052602260045260246000fd5b50919050565b612b9680620003866000396000f3fe6080604052600436106101d75760003560e01c80637533d78811610102578063b88d4fde11610095578063e985e9c511610064578063e985e9c51461056f578063eb8d72b7146105b8578063ed88c68e146101fc578063f2fde38b146105d857600080fd5b8063b88d4fde14610509578063c87b56dd14610529578063cf89fa0314610549578063d1deba1f1461055c57600080fd5b8063943fb872116100d1578063943fb8721461049457806395d89b41146104b4578063a22cb465146104c9578063b2bdfa7b146104e957600080fd5b80637533d788146103e3578063853828b6146104035780638da5cb5b1461040b5780638ee749121461042957600080fd5b806323b872dd1161017a578063654e568511610149578063654e56851461036d5780636ecd23061461038d57806370a08231146103a0578063715018a6146103ce57600080fd5b806323b872dd146102ed57806342842e0e1461030d57806355f804b31461032d5780636352211e1461034d57600080fd5b806306fdde03116101b657806306fdde0314610253578063081812fc14610275578063095ea7b3146102ad5780631c37a822146102cd57600080fd5b80621d3567146101dc57806301ffc9a7146101fe5780630562b9f714610233575b600080fd5b3480156101e857600080fd5b506101fc6101f7366004612132565b6105f8565b005b34801561020a57600080fd5b5061021e6102193660046121cc565b6107f2565b60405190151581526020015b60405180910390f35b34801561023f57600080fd5b506101fc61024e3660046121e9565b610844565b34801561025f57600080fd5b50610268610915565b60405161022a919061225a565b34801561028157600080fd5b506102956102903660046121e9565b6109a7565b6040516001600160a01b03909116815260200161022a565b3480156102b957600080fd5b506101fc6102c8366004612282565b610a3c565b3480156102d957600080fd5b506101fc6102e8366004612132565b610b52565b3480156102f957600080fd5b506101fc6103083660046122ae565b610bc1565b34801561031957600080fd5b506101fc6103283660046122ae565b610bf2565b34801561033957600080fd5b506101fc6103483660046122ef565b610c0d565b34801561035957600080fd5b506102956103683660046121e9565b610c4a565b34801561037957600080fd5b506101fc610388366004612348565b610cc1565b6101fc61039b36600461237d565b610da2565b3480156103ac57600080fd5b506103c06103bb366004612398565b610e8c565b60405190815260200161022a565b3480156103da57600080fd5b506101fc610f13565b3480156103ef57600080fd5b506102686103fe3660046123b5565b610f49565b6101fc610fe3565b34801561041757600080fd5b506000546001600160a01b0316610295565b34801561043557600080fd5b5061047f6104443660046123d0565b600860209081526000938452604080852084518086018401805192815290840195840195909520945292905282529020805460019091015482565b6040805192835260208301919091520161022a565b3480156104a057600080fd5b506101fc6104af3660046121e9565b611062565b3480156104c057600080fd5b50610268611091565b3480156104d557600080fd5b506101fc6104e4366004612426565b6110a0565b3480156104f557600080fd5b50600a54610295906001600160a01b031681565b34801561051557600080fd5b506101fc610524366004612464565b6110ab565b34801561053557600080fd5b506102686105443660046121e9565b6110dd565b6101fc6105573660046124c3565b6111b8565b6101fc61056a366004612527565b61148c565b34801561057b57600080fd5b5061021e61058a3660046125b2565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b3480156105c457600080fd5b506101fc6105d33660046125e0565b611619565b3480156105e457600080fd5b506101fc6105f3366004612398565b611661565b6007546001600160a01b0316331461060f57600080fd5b61ffff84166000908152600960205260409020805461062d90612632565b9050835114801561066c575061ffff841660009081526009602052604090819020905161065a919061266d565b60405180910390208380519060200120145b6106da5760405162461bcd60e51b815260206004820152603460248201527f4e6f6e626c6f636b696e6752656365697665723a20696e76616c696420736f756044820152731c98d9481cd95b991a5b99c818dbdb9d1c9858dd60621b60648201526084015b60405180910390fd5b604051630e1bd41160e11b81523090631c37a822906107039087908790879087906004016126df565b600060405180830381600087803b15801561071d57600080fd5b505af192505050801561072e575060015b6107ec576040518060400160405280825181526020018280519060200120815250600860008661ffff1661ffff168152602001908152602001600020846040516107789190612728565b9081526040805191829003602090810183206001600160401b038716600090815290825291909120835181559201516001909201919091557fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d906107e39086908690869086906126df565b60405180910390a15b50505050565b60006001600160e01b031982166380ac58cd60e01b148061082357506001600160e01b03198216635b5e139f60e01b145b8061083e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000546001600160a01b0316331461086e5760405162461bcd60e51b81526004016106d190612744565b600a546040516000916001600160a01b03169083908381818185875af1925050503d80600081146108bb576040519150601f19603f3d011682016040523d82523d6000602084013e6108c0565b606091505b50509050806109115760405162461bcd60e51b815260206004820152601e60248201527f4d4554413a204661696c656420746f207769746864726177204574686572000060448201526064016106d1565b5050565b60606001805461092490612632565b80601f016020809104026020016040519081016040528092919081815260200182805461095090612632565b801561099d5780601f106109725761010080835404028352916020019161099d565b820191906000526020600020905b81548152906001019060200180831161098057829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b0316610a205760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016106d1565b506000908152600560205260409020546001600160a01b031690565b6000610a4782610c4a565b9050806001600160a01b0316836001600160a01b03161415610ab55760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016106d1565b336001600160a01b0382161480610ad15750610ad1813361058a565b610b435760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016106d1565b610b4d83836116f9565b505050565b333014610bb55760405162461bcd60e51b815260206004820152602b60248201527f4e6f6e626c6f636b696e6752656365697665723a2063616c6c6572206d75737460448201526a10313290213934b233b29760a91b60648201526084016106d1565b6107ec84848484611767565b610bcb3382611794565b610be75760405162461bcd60e51b81526004016106d190612779565b610b4d83838361188b565b610b4d838383604051806020016040528060008152506110ab565b6000546001600160a01b03163314610c375760405162461bcd60e51b81526004016106d190612744565b805161091190600b906020840190611f4c565b6000818152600360205260408120546001600160a01b03168061083e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016106d1565b6000546001600160a01b03163314610ceb5760405162461bcd60e51b81526004016106d190612744565b600f548160ff16600d54610cff91906127e0565b1115610d655760405162461bcd60e51b815260206004820152602f60248201527f477265656479206465767320747279696e6720746f2074616b65206d6f72652060448201526e7468616e20617661696c61626c652160881b60648201526084016106d1565b60005b8160ff16811015610b4d57610d9083600d60008154610d86906127f8565b9182905550611a2b565b80610d9a816127f8565b915050610d68565b60038160ff1610610df55760405162461bcd60e51b815260206004820181905260248201527f424554413a204d61782032204e46547320706572207472616e73616374696f6e60448201526064016106d1565b600e548160ff16600c54610e0991906127e0565b1115610e575760405162461bcd60e51b815260206004820152601960248201527f424554413a204d696e74206578636565647320737570706c790000000000000060448201526064016106d1565b610e6a33600c60008154610d86906127f8565b8060ff1660021415610e8957610e8933600c60008154610d86906127f8565b50565b60006001600160a01b038216610ef75760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016106d1565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b03163314610f3d5760405162461bcd60e51b81526004016106d190612744565b610f476000611a45565b565b60096020526000908152604090208054610f6290612632565b80601f0160208091040260200160405190810160405280929190818152602001828054610f8e90612632565b8015610fdb5780601f10610fb057610100808354040283529160200191610fdb565b820191906000526020600020905b815481529060010190602001808311610fbe57829003601f168201915b505050505081565b6000546001600160a01b0316331461100d5760405162461bcd60e51b81526004016106d190612744565b604051600090339047908381818185875af1925050503d806000811461104f576040519150601f19603f3d011682016040523d82523d6000602084013e611054565b606091505b5050905080610e8957600080fd5b6000546001600160a01b0316331461108c5760405162461bcd60e51b81526004016106d190612744565b601055565b60606002805461092490612632565b610911338383611a95565b6110b53383611794565b6110d15760405162461bcd60e51b81526004016106d190612779565b6107ec84848484611b64565b6000818152600360205260409020546060906001600160a01b031661115c5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016106d1565b6000611166611b97565b9050600081511161118657604051806020016040528060008152506111b1565b8061119084611ba6565b6040516020016111a1929190612813565b6040516020818303038152906040525b9392505050565b6111c181610c4a565b6001600160a01b0316336001600160a01b03161461122c5760405162461bcd60e51b815260206004820152602260248201527f596f75206d757374206f776e2074686520746f6b656e20746f20747261766572604482015261736560f01b60648201526084016106d1565b61ffff82166000908152600960205260408120805461124a90612632565b9050116112b05760405162461bcd60e51b815260206004820152602e60248201527f5468697320636861696e2069732063757272656e746c7920756e617661696c6160448201526d189b1948199bdc881d1c985d995b60921b60648201526084016106d1565b6112b981611ca3565b60408051336020820152808201839052815180820383018152606082018352601054600160f01b60808401526082808401919091528351808403909101815260a283019384905260075463040a7bb160e41b90945290926001926000916001600160a01b0316906340a7bb109061133c908990309089908790899060a601612852565b6040805180830381865afa158015611358573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137c91906128a6565b509050803410156114075760405162461bcd60e51b815260206004820152604960248201527f424554413a206d73672e76616c7565206e6f7420656e6f75676820746f20636f60448201527f766572206d6573736167654665652e2053656e642067617320666f72206d657360648201526873616765206665657360b81b608482015260a4016106d1565b60075461ffff8716600090815260096020526040808220905162c5803160e81b81526001600160a01b039093169263c5803100923492611452928c928b913391908b906004016128ca565b6000604051808303818588803b15801561146b57600080fd5b505af115801561147f573d6000803e3d6000fd5b5050505050505050505050565b61ffff851660009081526008602052604080822090516114ad908790612728565b90815260408051602092819003830190206001600160401b03871660009081529252902060018101549091506115345760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e6752656365697665723a206e6f2073746f726564206d60448201526565737361676560d01b60648201526084016106d1565b80548214801561155e5750806001015483836040516115549291906129aa565b6040518091039020145b6115aa5760405162461bcd60e51b815260206004820152601a60248201527f4c617965725a65726f3a20696e76616c6964207061796c6f616400000000000060448201526064016106d1565b60008082556001820155604051630e1bd41160e11b81523090631c37a822906115df90899089908990899089906004016129ba565b600060405180830381600087803b1580156115f957600080fd5b505af115801561160d573d6000803e3d6000fd5b50505050505050505050565b6000546001600160a01b031633146116435760405162461bcd60e51b81526004016106d190612744565b61ffff831660009081526009602052604090206107ec908383611fd0565b6000546001600160a01b0316331461168b5760405162461bcd60e51b81526004016106d190612744565b6001600160a01b0381166116f05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106d1565b610e8981611a45565b600081815260056020526040902080546001600160a01b0319166001600160a01b038416908117909155819061172e82610c4a565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000808280602001905181019061177e9190612a1b565b9150915061178c8282611a2b565b505050505050565b6000818152600360205260408120546001600160a01b031661180d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016106d1565b600061181883610c4a565b9050806001600160a01b0316846001600160a01b031614806118535750836001600160a01b0316611848846109a7565b6001600160a01b0316145b8061188357506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661189e82610c4a565b6001600160a01b0316146119065760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016106d1565b6001600160a01b0382166119685760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016106d1565b6119736000826116f9565b6001600160a01b038316600090815260046020526040812080546001929061199c908490612a49565b90915550506001600160a01b03821660009081526004602052604081208054600192906119ca9084906127e0565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610911828260405180602001604052806000815250611d3e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b03161415611af75760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016106d1565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611b6f84848461188b565b611b7b84848484611d71565b6107ec5760405162461bcd60e51b81526004016106d190612a60565b6060600b805461092490612632565b606081611bca5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611bf45780611bde816127f8565b9150611bed9050600a83612ac8565b9150611bce565b6000816001600160401b03811115611c0e57611c0e612070565b6040519080825280601f01601f191660200182016040528015611c38576020820181803683370190505b5090505b841561188357611c4d600183612a49565b9150611c5a600a86612adc565b611c659060306127e0565b60f81b818381518110611c7a57611c7a612af0565b60200101906001600160f81b031916908160001a905350611c9c600a86612ac8565b9450611c3c565b6000611cae82610c4a565b9050611cbb6000836116f9565b6001600160a01b0381166000908152600460205260408120805460019290611ce4908490612a49565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b611d488383611e6f565b611d556000848484611d71565b610b4d5760405162461bcd60e51b81526004016106d190612a60565b60006001600160a01b0384163b15611e6457604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611db5903390899088908890600401612b06565b6020604051808303816000875af1925050508015611df0575060408051601f3d908101601f19168201909252611ded91810190612b43565b60015b611e4a573d808015611e1e576040519150601f19603f3d011682016040523d82523d6000602084013e611e23565b606091505b508051611e425760405162461bcd60e51b81526004016106d190612a60565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611883565b506001949350505050565b6001600160a01b038216611ec55760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016106d1565b6001600160a01b0382166000908152600460205260408120805460019290611eee9084906127e0565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611f5890612632565b90600052602060002090601f016020900481019282611f7a5760008555611fc0565b82601f10611f9357805160ff1916838001178555611fc0565b82800160010185558215611fc0579182015b82811115611fc0578251825591602001919060010190611fa5565b50611fcc929150612044565b5090565b828054611fdc90612632565b90600052602060002090601f016020900481019282611ffe5760008555611fc0565b82601f106120175782800160ff19823516178555611fc0565b82800160010185558215611fc0579182015b82811115611fc0578235825591602001919060010190612029565b5b80821115611fcc5760008155600101612045565b803561ffff8116811461206b57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b03808411156120a0576120a0612070565b604051601f8501601f19908116603f011681019082821181831017156120c8576120c8612070565b816040528093508581528686860111156120e157600080fd5b858560208301376000602087830101525050509392505050565b600082601f83011261210c57600080fd5b6111b183833560208501612086565b80356001600160401b038116811461206b57600080fd5b6000806000806080858703121561214857600080fd5b61215185612059565b935060208501356001600160401b038082111561216d57600080fd5b612179888389016120fb565b94506121876040880161211b565b9350606087013591508082111561219d57600080fd5b506121aa878288016120fb565b91505092959194509250565b6001600160e01b031981168114610e8957600080fd5b6000602082840312156121de57600080fd5b81356111b1816121b6565b6000602082840312156121fb57600080fd5b5035919050565b60005b8381101561221d578181015183820152602001612205565b838111156107ec5750506000910152565b60008151808452612246816020860160208601612202565b601f01601f19169290920160200192915050565b6020815260006111b1602083018461222e565b6001600160a01b0381168114610e8957600080fd5b6000806040838503121561229557600080fd5b82356122a08161226d565b946020939093013593505050565b6000806000606084860312156122c357600080fd5b83356122ce8161226d565b925060208401356122de8161226d565b929592945050506040919091013590565b60006020828403121561230157600080fd5b81356001600160401b0381111561231757600080fd5b8201601f8101841361232857600080fd5b61188384823560208401612086565b803560ff8116811461206b57600080fd5b6000806040838503121561235b57600080fd5b82356123668161226d565b915061237460208401612337565b90509250929050565b60006020828403121561238f57600080fd5b6111b182612337565b6000602082840312156123aa57600080fd5b81356111b18161226d565b6000602082840312156123c757600080fd5b6111b182612059565b6000806000606084860312156123e557600080fd5b6123ee84612059565b925060208401356001600160401b0381111561240957600080fd5b612415868287016120fb565b925050604084013590509250925092565b6000806040838503121561243957600080fd5b82356124448161226d565b91506020830135801515811461245957600080fd5b809150509250929050565b6000806000806080858703121561247a57600080fd5b84356124858161226d565b935060208501356124958161226d565b92506040850135915060608501356001600160401b038111156124b757600080fd5b6121aa878288016120fb565b600080604083850312156124d657600080fd5b6122a083612059565b60008083601f8401126124f157600080fd5b5081356001600160401b0381111561250857600080fd5b60208301915083602082850101111561252057600080fd5b9250929050565b60008060008060006080868803121561253f57600080fd5b61254886612059565b945060208601356001600160401b038082111561256457600080fd5b61257089838a016120fb565b955061257e6040890161211b565b9450606088013591508082111561259457600080fd5b506125a1888289016124df565b969995985093965092949392505050565b600080604083850312156125c557600080fd5b82356125d08161226d565b915060208301356124598161226d565b6000806000604084860312156125f557600080fd5b6125fe84612059565b925060208401356001600160401b0381111561261957600080fd5b612625868287016124df565b9497909650939450505050565b600181811c9082168061264657607f821691505b6020821081141561266757634e487b7160e01b600052602260045260246000fd5b50919050565b600080835461267b81612632565b6001828116801561269357600181146126a4576126d3565b60ff198416875282870194506126d3565b8760005260208060002060005b858110156126ca5781548a8201529084019082016126b1565b50505082870194505b50929695505050505050565b61ffff851681526080602082015260006126fc608083018661222e565b6001600160401b0385166040840152828103606084015261271d818561222e565b979650505050505050565b6000825161273a818460208701612202565b9190910192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082198211156127f3576127f36127ca565b500190565b600060001982141561280c5761280c6127ca565b5060010190565b60008351612825818460208801612202565b835190830190612839818360208801612202565b64173539b7b760d91b9101908152600501949350505050565b61ffff861681526001600160a01b038516602082015260a0604082018190526000906128809083018661222e565b8415156060840152828103608084015261289a818561222e565b98975050505050505050565b600080604083850312156128b957600080fd5b505080516020909101519092909150565b61ffff871681526000602060c081840152600088546128e881612632565b8060c087015260e060018084166000811461290a576001811461291f5761294d565b60ff198516898401526101008901955061294d565b8d6000528660002060005b858110156129455781548b820186015290830190880161292a565b8a0184019650505b50505050508381036040850152612964818961222e565b91505061297c60608401876001600160a01b03169052565b6001600160a01b038516608084015282810360a084015261299d818561222e565b9998505050505050505050565b8183823760009101908152919050565b61ffff861681526080602082015260006129d7608083018761222e565b6001600160401b03861660408401528281036060840152838152838560208301376000602085830101526020601f19601f8601168201019150509695505050505050565b60008060408385031215612a2e57600080fd5b8251612a398161226d565b6020939093015192949293505050565b600082821015612a5b57612a5b6127ca565b500390565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082612ad757612ad7612ab2565b500490565b600082612aeb57612aeb612ab2565b500690565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612b399083018461222e565b9695505050505050565b600060208284031215612b5557600080fd5b81516111b1816121b656fea26469706673582212201ef26822af2efb9fa53fab61b85cda4757f53c02e6671a6eacdaad687ec4458a64736f6c634300080b0033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd6750000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d586156354741595547765852543379363367677173626972454454797a7a35774e68615a687447474650484a2f00000000000000000000

Deployed Bytecode

0x6080604052600436106101d75760003560e01c80637533d78811610102578063b88d4fde11610095578063e985e9c511610064578063e985e9c51461056f578063eb8d72b7146105b8578063ed88c68e146101fc578063f2fde38b146105d857600080fd5b8063b88d4fde14610509578063c87b56dd14610529578063cf89fa0314610549578063d1deba1f1461055c57600080fd5b8063943fb872116100d1578063943fb8721461049457806395d89b41146104b4578063a22cb465146104c9578063b2bdfa7b146104e957600080fd5b80637533d788146103e3578063853828b6146104035780638da5cb5b1461040b5780638ee749121461042957600080fd5b806323b872dd1161017a578063654e568511610149578063654e56851461036d5780636ecd23061461038d57806370a08231146103a0578063715018a6146103ce57600080fd5b806323b872dd146102ed57806342842e0e1461030d57806355f804b31461032d5780636352211e1461034d57600080fd5b806306fdde03116101b657806306fdde0314610253578063081812fc14610275578063095ea7b3146102ad5780631c37a822146102cd57600080fd5b80621d3567146101dc57806301ffc9a7146101fe5780630562b9f714610233575b600080fd5b3480156101e857600080fd5b506101fc6101f7366004612132565b6105f8565b005b34801561020a57600080fd5b5061021e6102193660046121cc565b6107f2565b60405190151581526020015b60405180910390f35b34801561023f57600080fd5b506101fc61024e3660046121e9565b610844565b34801561025f57600080fd5b50610268610915565b60405161022a919061225a565b34801561028157600080fd5b506102956102903660046121e9565b6109a7565b6040516001600160a01b03909116815260200161022a565b3480156102b957600080fd5b506101fc6102c8366004612282565b610a3c565b3480156102d957600080fd5b506101fc6102e8366004612132565b610b52565b3480156102f957600080fd5b506101fc6103083660046122ae565b610bc1565b34801561031957600080fd5b506101fc6103283660046122ae565b610bf2565b34801561033957600080fd5b506101fc6103483660046122ef565b610c0d565b34801561035957600080fd5b506102956103683660046121e9565b610c4a565b34801561037957600080fd5b506101fc610388366004612348565b610cc1565b6101fc61039b36600461237d565b610da2565b3480156103ac57600080fd5b506103c06103bb366004612398565b610e8c565b60405190815260200161022a565b3480156103da57600080fd5b506101fc610f13565b3480156103ef57600080fd5b506102686103fe3660046123b5565b610f49565b6101fc610fe3565b34801561041757600080fd5b506000546001600160a01b0316610295565b34801561043557600080fd5b5061047f6104443660046123d0565b600860209081526000938452604080852084518086018401805192815290840195840195909520945292905282529020805460019091015482565b6040805192835260208301919091520161022a565b3480156104a057600080fd5b506101fc6104af3660046121e9565b611062565b3480156104c057600080fd5b50610268611091565b3480156104d557600080fd5b506101fc6104e4366004612426565b6110a0565b3480156104f557600080fd5b50600a54610295906001600160a01b031681565b34801561051557600080fd5b506101fc610524366004612464565b6110ab565b34801561053557600080fd5b506102686105443660046121e9565b6110dd565b6101fc6105573660046124c3565b6111b8565b6101fc61056a366004612527565b61148c565b34801561057b57600080fd5b5061021e61058a3660046125b2565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b3480156105c457600080fd5b506101fc6105d33660046125e0565b611619565b3480156105e457600080fd5b506101fc6105f3366004612398565b611661565b6007546001600160a01b0316331461060f57600080fd5b61ffff84166000908152600960205260409020805461062d90612632565b9050835114801561066c575061ffff841660009081526009602052604090819020905161065a919061266d565b60405180910390208380519060200120145b6106da5760405162461bcd60e51b815260206004820152603460248201527f4e6f6e626c6f636b696e6752656365697665723a20696e76616c696420736f756044820152731c98d9481cd95b991a5b99c818dbdb9d1c9858dd60621b60648201526084015b60405180910390fd5b604051630e1bd41160e11b81523090631c37a822906107039087908790879087906004016126df565b600060405180830381600087803b15801561071d57600080fd5b505af192505050801561072e575060015b6107ec576040518060400160405280825181526020018280519060200120815250600860008661ffff1661ffff168152602001908152602001600020846040516107789190612728565b9081526040805191829003602090810183206001600160401b038716600090815290825291909120835181559201516001909201919091557fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d906107e39086908690869086906126df565b60405180910390a15b50505050565b60006001600160e01b031982166380ac58cd60e01b148061082357506001600160e01b03198216635b5e139f60e01b145b8061083e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000546001600160a01b0316331461086e5760405162461bcd60e51b81526004016106d190612744565b600a546040516000916001600160a01b03169083908381818185875af1925050503d80600081146108bb576040519150601f19603f3d011682016040523d82523d6000602084013e6108c0565b606091505b50509050806109115760405162461bcd60e51b815260206004820152601e60248201527f4d4554413a204661696c656420746f207769746864726177204574686572000060448201526064016106d1565b5050565b60606001805461092490612632565b80601f016020809104026020016040519081016040528092919081815260200182805461095090612632565b801561099d5780601f106109725761010080835404028352916020019161099d565b820191906000526020600020905b81548152906001019060200180831161098057829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b0316610a205760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016106d1565b506000908152600560205260409020546001600160a01b031690565b6000610a4782610c4a565b9050806001600160a01b0316836001600160a01b03161415610ab55760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016106d1565b336001600160a01b0382161480610ad15750610ad1813361058a565b610b435760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016106d1565b610b4d83836116f9565b505050565b333014610bb55760405162461bcd60e51b815260206004820152602b60248201527f4e6f6e626c6f636b696e6752656365697665723a2063616c6c6572206d75737460448201526a10313290213934b233b29760a91b60648201526084016106d1565b6107ec84848484611767565b610bcb3382611794565b610be75760405162461bcd60e51b81526004016106d190612779565b610b4d83838361188b565b610b4d838383604051806020016040528060008152506110ab565b6000546001600160a01b03163314610c375760405162461bcd60e51b81526004016106d190612744565b805161091190600b906020840190611f4c565b6000818152600360205260408120546001600160a01b03168061083e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016106d1565b6000546001600160a01b03163314610ceb5760405162461bcd60e51b81526004016106d190612744565b600f548160ff16600d54610cff91906127e0565b1115610d655760405162461bcd60e51b815260206004820152602f60248201527f477265656479206465767320747279696e6720746f2074616b65206d6f72652060448201526e7468616e20617661696c61626c652160881b60648201526084016106d1565b60005b8160ff16811015610b4d57610d9083600d60008154610d86906127f8565b9182905550611a2b565b80610d9a816127f8565b915050610d68565b60038160ff1610610df55760405162461bcd60e51b815260206004820181905260248201527f424554413a204d61782032204e46547320706572207472616e73616374696f6e60448201526064016106d1565b600e548160ff16600c54610e0991906127e0565b1115610e575760405162461bcd60e51b815260206004820152601960248201527f424554413a204d696e74206578636565647320737570706c790000000000000060448201526064016106d1565b610e6a33600c60008154610d86906127f8565b8060ff1660021415610e8957610e8933600c60008154610d86906127f8565b50565b60006001600160a01b038216610ef75760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016106d1565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b03163314610f3d5760405162461bcd60e51b81526004016106d190612744565b610f476000611a45565b565b60096020526000908152604090208054610f6290612632565b80601f0160208091040260200160405190810160405280929190818152602001828054610f8e90612632565b8015610fdb5780601f10610fb057610100808354040283529160200191610fdb565b820191906000526020600020905b815481529060010190602001808311610fbe57829003601f168201915b505050505081565b6000546001600160a01b0316331461100d5760405162461bcd60e51b81526004016106d190612744565b604051600090339047908381818185875af1925050503d806000811461104f576040519150601f19603f3d011682016040523d82523d6000602084013e611054565b606091505b5050905080610e8957600080fd5b6000546001600160a01b0316331461108c5760405162461bcd60e51b81526004016106d190612744565b601055565b60606002805461092490612632565b610911338383611a95565b6110b53383611794565b6110d15760405162461bcd60e51b81526004016106d190612779565b6107ec84848484611b64565b6000818152600360205260409020546060906001600160a01b031661115c5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016106d1565b6000611166611b97565b9050600081511161118657604051806020016040528060008152506111b1565b8061119084611ba6565b6040516020016111a1929190612813565b6040516020818303038152906040525b9392505050565b6111c181610c4a565b6001600160a01b0316336001600160a01b03161461122c5760405162461bcd60e51b815260206004820152602260248201527f596f75206d757374206f776e2074686520746f6b656e20746f20747261766572604482015261736560f01b60648201526084016106d1565b61ffff82166000908152600960205260408120805461124a90612632565b9050116112b05760405162461bcd60e51b815260206004820152602e60248201527f5468697320636861696e2069732063757272656e746c7920756e617661696c6160448201526d189b1948199bdc881d1c985d995b60921b60648201526084016106d1565b6112b981611ca3565b60408051336020820152808201839052815180820383018152606082018352601054600160f01b60808401526082808401919091528351808403909101815260a283019384905260075463040a7bb160e41b90945290926001926000916001600160a01b0316906340a7bb109061133c908990309089908790899060a601612852565b6040805180830381865afa158015611358573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137c91906128a6565b509050803410156114075760405162461bcd60e51b815260206004820152604960248201527f424554413a206d73672e76616c7565206e6f7420656e6f75676820746f20636f60448201527f766572206d6573736167654665652e2053656e642067617320666f72206d657360648201526873616765206665657360b81b608482015260a4016106d1565b60075461ffff8716600090815260096020526040808220905162c5803160e81b81526001600160a01b039093169263c5803100923492611452928c928b913391908b906004016128ca565b6000604051808303818588803b15801561146b57600080fd5b505af115801561147f573d6000803e3d6000fd5b5050505050505050505050565b61ffff851660009081526008602052604080822090516114ad908790612728565b90815260408051602092819003830190206001600160401b03871660009081529252902060018101549091506115345760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e6752656365697665723a206e6f2073746f726564206d60448201526565737361676560d01b60648201526084016106d1565b80548214801561155e5750806001015483836040516115549291906129aa565b6040518091039020145b6115aa5760405162461bcd60e51b815260206004820152601a60248201527f4c617965725a65726f3a20696e76616c6964207061796c6f616400000000000060448201526064016106d1565b60008082556001820155604051630e1bd41160e11b81523090631c37a822906115df90899089908990899089906004016129ba565b600060405180830381600087803b1580156115f957600080fd5b505af115801561160d573d6000803e3d6000fd5b50505050505050505050565b6000546001600160a01b031633146116435760405162461bcd60e51b81526004016106d190612744565b61ffff831660009081526009602052604090206107ec908383611fd0565b6000546001600160a01b0316331461168b5760405162461bcd60e51b81526004016106d190612744565b6001600160a01b0381166116f05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106d1565b610e8981611a45565b600081815260056020526040902080546001600160a01b0319166001600160a01b038416908117909155819061172e82610c4a565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000808280602001905181019061177e9190612a1b565b9150915061178c8282611a2b565b505050505050565b6000818152600360205260408120546001600160a01b031661180d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016106d1565b600061181883610c4a565b9050806001600160a01b0316846001600160a01b031614806118535750836001600160a01b0316611848846109a7565b6001600160a01b0316145b8061188357506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661189e82610c4a565b6001600160a01b0316146119065760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016106d1565b6001600160a01b0382166119685760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016106d1565b6119736000826116f9565b6001600160a01b038316600090815260046020526040812080546001929061199c908490612a49565b90915550506001600160a01b03821660009081526004602052604081208054600192906119ca9084906127e0565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610911828260405180602001604052806000815250611d3e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b03161415611af75760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016106d1565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611b6f84848461188b565b611b7b84848484611d71565b6107ec5760405162461bcd60e51b81526004016106d190612a60565b6060600b805461092490612632565b606081611bca5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611bf45780611bde816127f8565b9150611bed9050600a83612ac8565b9150611bce565b6000816001600160401b03811115611c0e57611c0e612070565b6040519080825280601f01601f191660200182016040528015611c38576020820181803683370190505b5090505b841561188357611c4d600183612a49565b9150611c5a600a86612adc565b611c659060306127e0565b60f81b818381518110611c7a57611c7a612af0565b60200101906001600160f81b031916908160001a905350611c9c600a86612ac8565b9450611c3c565b6000611cae82610c4a565b9050611cbb6000836116f9565b6001600160a01b0381166000908152600460205260408120805460019290611ce4908490612a49565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b611d488383611e6f565b611d556000848484611d71565b610b4d5760405162461bcd60e51b81526004016106d190612a60565b60006001600160a01b0384163b15611e6457604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611db5903390899088908890600401612b06565b6020604051808303816000875af1925050508015611df0575060408051601f3d908101601f19168201909252611ded91810190612b43565b60015b611e4a573d808015611e1e576040519150601f19603f3d011682016040523d82523d6000602084013e611e23565b606091505b508051611e425760405162461bcd60e51b81526004016106d190612a60565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611883565b506001949350505050565b6001600160a01b038216611ec55760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016106d1565b6001600160a01b0382166000908152600460205260408120805460019290611eee9084906127e0565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611f5890612632565b90600052602060002090601f016020900481019282611f7a5760008555611fc0565b82601f10611f9357805160ff1916838001178555611fc0565b82800160010185558215611fc0579182015b82811115611fc0578251825591602001919060010190611fa5565b50611fcc929150612044565b5090565b828054611fdc90612632565b90600052602060002090601f016020900481019282611ffe5760008555611fc0565b82601f106120175782800160ff19823516178555611fc0565b82800160010185558215611fc0579182015b82811115611fc0578235825591602001919060010190612029565b5b80821115611fcc5760008155600101612045565b803561ffff8116811461206b57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b03808411156120a0576120a0612070565b604051601f8501601f19908116603f011681019082821181831017156120c8576120c8612070565b816040528093508581528686860111156120e157600080fd5b858560208301376000602087830101525050509392505050565b600082601f83011261210c57600080fd5b6111b183833560208501612086565b80356001600160401b038116811461206b57600080fd5b6000806000806080858703121561214857600080fd5b61215185612059565b935060208501356001600160401b038082111561216d57600080fd5b612179888389016120fb565b94506121876040880161211b565b9350606087013591508082111561219d57600080fd5b506121aa878288016120fb565b91505092959194509250565b6001600160e01b031981168114610e8957600080fd5b6000602082840312156121de57600080fd5b81356111b1816121b6565b6000602082840312156121fb57600080fd5b5035919050565b60005b8381101561221d578181015183820152602001612205565b838111156107ec5750506000910152565b60008151808452612246816020860160208601612202565b601f01601f19169290920160200192915050565b6020815260006111b1602083018461222e565b6001600160a01b0381168114610e8957600080fd5b6000806040838503121561229557600080fd5b82356122a08161226d565b946020939093013593505050565b6000806000606084860312156122c357600080fd5b83356122ce8161226d565b925060208401356122de8161226d565b929592945050506040919091013590565b60006020828403121561230157600080fd5b81356001600160401b0381111561231757600080fd5b8201601f8101841361232857600080fd5b61188384823560208401612086565b803560ff8116811461206b57600080fd5b6000806040838503121561235b57600080fd5b82356123668161226d565b915061237460208401612337565b90509250929050565b60006020828403121561238f57600080fd5b6111b182612337565b6000602082840312156123aa57600080fd5b81356111b18161226d565b6000602082840312156123c757600080fd5b6111b182612059565b6000806000606084860312156123e557600080fd5b6123ee84612059565b925060208401356001600160401b0381111561240957600080fd5b612415868287016120fb565b925050604084013590509250925092565b6000806040838503121561243957600080fd5b82356124448161226d565b91506020830135801515811461245957600080fd5b809150509250929050565b6000806000806080858703121561247a57600080fd5b84356124858161226d565b935060208501356124958161226d565b92506040850135915060608501356001600160401b038111156124b757600080fd5b6121aa878288016120fb565b600080604083850312156124d657600080fd5b6122a083612059565b60008083601f8401126124f157600080fd5b5081356001600160401b0381111561250857600080fd5b60208301915083602082850101111561252057600080fd5b9250929050565b60008060008060006080868803121561253f57600080fd5b61254886612059565b945060208601356001600160401b038082111561256457600080fd5b61257089838a016120fb565b955061257e6040890161211b565b9450606088013591508082111561259457600080fd5b506125a1888289016124df565b969995985093965092949392505050565b600080604083850312156125c557600080fd5b82356125d08161226d565b915060208301356124598161226d565b6000806000604084860312156125f557600080fd5b6125fe84612059565b925060208401356001600160401b0381111561261957600080fd5b612625868287016124df565b9497909650939450505050565b600181811c9082168061264657607f821691505b6020821081141561266757634e487b7160e01b600052602260045260246000fd5b50919050565b600080835461267b81612632565b6001828116801561269357600181146126a4576126d3565b60ff198416875282870194506126d3565b8760005260208060002060005b858110156126ca5781548a8201529084019082016126b1565b50505082870194505b50929695505050505050565b61ffff851681526080602082015260006126fc608083018661222e565b6001600160401b0385166040840152828103606084015261271d818561222e565b979650505050505050565b6000825161273a818460208701612202565b9190910192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082198211156127f3576127f36127ca565b500190565b600060001982141561280c5761280c6127ca565b5060010190565b60008351612825818460208801612202565b835190830190612839818360208801612202565b64173539b7b760d91b9101908152600501949350505050565b61ffff861681526001600160a01b038516602082015260a0604082018190526000906128809083018661222e565b8415156060840152828103608084015261289a818561222e565b98975050505050505050565b600080604083850312156128b957600080fd5b505080516020909101519092909150565b61ffff871681526000602060c081840152600088546128e881612632565b8060c087015260e060018084166000811461290a576001811461291f5761294d565b60ff198516898401526101008901955061294d565b8d6000528660002060005b858110156129455781548b820186015290830190880161292a565b8a0184019650505b50505050508381036040850152612964818961222e565b91505061297c60608401876001600160a01b03169052565b6001600160a01b038516608084015282810360a084015261299d818561222e565b9998505050505050505050565b8183823760009101908152919050565b61ffff861681526080602082015260006129d7608083018761222e565b6001600160401b03861660408401528281036060840152838152838560208301376000602085830101526020601f19601f8601168201019150509695505050505050565b60008060408385031215612a2e57600080fd5b8251612a398161226d565b6020939093015192949293505050565b600082821015612a5b57612a5b6127ca565b500390565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082612ad757612ad7612ab2565b500490565b600082612aeb57612aeb612ab2565b500690565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612b399083018461222e565b9695505050505050565b600060208284031215612b5557600080fd5b81516111b1816121b656fea26469706673582212201ef26822af2efb9fa53fab61b85cda4757f53c02e6671a6eacdaad687ec4458a64736f6c634300080b0033

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

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd6750000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d586156354741595547765852543379363367677173626972454454797a7a35774e68615a687447474650484a2f00000000000000000000

-----Decoded View---------------
Arg [0] : baseURI_ (string): ipfs://QmXaV5GAYUGvXRT3y63ggqsbirEDTyzz5wNhaZhtGGFPHJ/
Arg [1] : _layerZeroEndpoint (address): 0x66A71Dcef29A0fFBDBE3c6a460a3B5BC225Cd675

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [3] : 697066733a2f2f516d5861563547415955477658525433793633676771736269
Arg [4] : 72454454797a7a35774e68615a687447474650484a2f00000000000000000000


Deployed Bytecode Sourcemap

54781:4407:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44495:949;;;;;;;;;;-1:-1:-1;44495:949:0;;;;;:::i;:::-;;:::i;:::-;;31555:305;;;;;;;;;;-1:-1:-1;31555:305:0;;;;;:::i;:::-;;:::i;:::-;;;2587:14:1;;2580:22;2562:41;;2550:2;2535:18;31555:305:0;;;;;;;;58255:182;;;;;;;;;;-1:-1:-1;58255:182:0;;;;;:::i;:::-;;:::i;32500:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;34072:221::-;;;;;;;;;;-1:-1:-1;34072:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;3823:32:1;;;3805:51;;3793:2;3778:18;34072:221:0;3659:203:1;33595:411:0;;;;;;;;;;-1:-1:-1;33595:411:0;;;;;:::i;:::-;;:::i;45452:356::-;;;;;;;;;;-1:-1:-1;45452:356:0;;;;;:::i;:::-;;:::i;34822:339::-;;;;;;;;;;-1:-1:-1;34822:339:0;;;;;:::i;:::-;;:::i;35232:185::-;;;;;;;;;;-1:-1:-1;35232:185:0;;;;;:::i;:::-;;:::i;57852:90::-;;;;;;;;;;-1:-1:-1;57852:90:0;;;;;:::i;:::-;;:::i;32194:239::-;;;;;;;;;;-1:-1:-1;32194:239:0;;;;;:::i;:::-;;:::i;55340:302::-;;;;;;;;;;-1:-1:-1;55340:302:0;;;;;:::i;:::-;;:::i;55756:356::-;;;;;;:::i;:::-;;:::i;31924:208::-;;;;;;;;;;-1:-1:-1;31924:208:0;;;;;:::i;:::-;;:::i;:::-;;;6307:25:1;;;6295:2;6280:18;31924:208:0;6161:177:1;12543:103:0;;;;;;;;;;;;;:::i;44337:51::-;;;;;;;;;;-1:-1:-1;44337:51:0;;;;;:::i;:::-;;:::i;58023:169::-;;;:::i;11892:87::-;;;;;;;;;;-1:-1:-1;11938:7:0;11965:6;-1:-1:-1;;;;;11965:6:0;11892:87;;44240:90;;;;;;;;;;-1:-1:-1;44240:90:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7394:25:1;;;7450:2;7435:18;;7428:34;;;;7367:18;44240:90:0;7220:248:1;58521:125:0;;;;;;;;;;-1:-1:-1;58521:125:0;;;;;:::i;:::-;;:::i;32669:104::-;;;;;;;;;;;;;:::i;34365:155::-;;;;;;;;;;-1:-1:-1;34365:155:0;;;;;:::i;:::-;;:::i;54844:21::-;;;;;;;;;;-1:-1:-1;54844:21:0;;;;-1:-1:-1;;;;;54844:21:0;;;35488:328;;;;;;;;;;-1:-1:-1;35488:328:0;;;;;:::i;:::-;;:::i;32844:343::-;;;;;;;;;;-1:-1:-1;32844:343:0;;;;;:::i;:::-;;:::i;56252:1590::-;;;;;;:::i;:::-;;:::i;46284:758::-;;;;;;:::i;:::-;;:::i;34591:164::-;;;;;;;;;;-1:-1:-1;34591:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;34712:25:0;;;34688:4;34712:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;34591:164;47050:158;;;;;;;;;;-1:-1:-1;47050:158:0;;;;;:::i;:::-;;:::i;12801:201::-;;;;;;;;;;-1:-1:-1;12801:201:0;;;;;:::i;:::-;;:::i;44495:949::-;44657:8;;-1:-1:-1;;;;;44657:8:0;44635:10;:31;44627:40;;;;;;44778:32;;;;;;;:19;:32;;;;;:39;;;;;:::i;:::-;;;44756:11;:18;:61;:134;;;;-1:-1:-1;44857:32:0;;;;;;;:19;:32;;;;;;;44847:43;;;;44857:32;44847:43;:::i;:::-;;;;;;;;44831:11;44821:22;;;;;;:69;44756:134;44748:213;;;;-1:-1:-1;;;44748:213:0;;12233:2:1;44748:213:0;;;12215:21:1;12272:2;12252:18;;;12245:30;12311:34;12291:18;;;12284:62;-1:-1:-1;;;12362:18:1;;;12355:50;12422:19;;44748:213:0;;;;;;;;;45089:60;;-1:-1:-1;;;45089:60:0;;:4;;:16;;:60;;45106:11;;45119;;45132:6;;45140:8;;45089:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45085:352;;45296:52;;;;;;;;45311:8;:15;45296:52;;;;45338:8;45328:19;;;;;;45296:52;;;45245:14;:27;45260:11;45245:27;;;;;;;;;;;;;;;45273:11;45245:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;45245:48:0;;;;;;;;;;;;;:103;;;;;;;;;;;;;;;45368:57;;;;45382:11;;45395;;45286:6;;45416:8;;45368:57;:::i;:::-;;;;;;;;45085:352;44495:949;;;;:::o;31555:305::-;31657:4;-1:-1:-1;;;;;;31694:40:0;;-1:-1:-1;;;31694:40:0;;:105;;-1:-1:-1;;;;;;;31751:48:0;;-1:-1:-1;;;31751:48:0;31694:105;:158;;;-1:-1:-1;;;;;;;;;;24433:40:0;;;31816:36;31674:178;31555:305;-1:-1:-1;;31555:305:0:o;58255:182::-;11938:7;11965:6;-1:-1:-1;;;;;11965:6:0;10696:10;12112:23;12104:68;;;;-1:-1:-1;;;12104:68:0;;;;;;;:::i;:::-;58343:6:::1;::::0;58335:36:::1;::::0;58320:9:::1;::::0;-1:-1:-1;;;;;58343:6:0::1;::::0;58363:3;;58320:9;58335:36;58320:9;58335:36;58363:3;58343:6;58335:36:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58319:52;;;58390:4;58382:47;;;::::0;-1:-1:-1;;;58382:47:0;;14066:2:1;58382:47:0::1;::::0;::::1;14048:21:1::0;14105:2;14085:18;;;14078:30;14144:32;14124:18;;;14117:60;14194:18;;58382:47:0::1;13864:354:1::0;58382:47:0::1;58308:129;58255:182:::0;:::o;32500:100::-;32554:13;32587:5;32580:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32500:100;:::o;34072:221::-;34148:7;37415:16;;;:7;:16;;;;;;-1:-1:-1;;;;;37415:16:0;34168:73;;;;-1:-1:-1;;;34168:73:0;;14425:2:1;34168:73:0;;;14407:21:1;14464:2;14444:18;;;14437:30;14503:34;14483:18;;;14476:62;-1:-1:-1;;;14554:18:1;;;14547:42;14606:19;;34168:73:0;14223:408:1;34168:73:0;-1:-1:-1;34261:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;34261:24:0;;34072:221::o;33595:411::-;33676:13;33692:23;33707:7;33692:14;:23::i;:::-;33676:39;;33740:5;-1:-1:-1;;;;;33734:11:0;:2;-1:-1:-1;;;;;33734:11:0;;;33726:57;;;;-1:-1:-1;;;33726:57:0;;14838:2:1;33726:57:0;;;14820:21:1;14877:2;14857:18;;;14850:30;14916:34;14896:18;;;14889:62;-1:-1:-1;;;14967:18:1;;;14960:31;15008:19;;33726:57:0;14636:397:1;33726:57:0;10696:10;-1:-1:-1;;;;;33818:21:0;;;;:62;;-1:-1:-1;33843:37:0;33860:5;10696:10;34591:164;:::i;33843:37::-;33796:168;;;;-1:-1:-1;;;33796:168:0;;15240:2:1;33796:168:0;;;15222:21:1;15279:2;15259:18;;;15252:30;15318:34;15298:18;;;15291:62;15389:26;15369:18;;;15362:54;15433:19;;33796:168:0;15038:420:1;33796:168:0;33977:21;33986:2;33990:7;33977:8;:21::i;:::-;33665:341;33595:411;;:::o;45452:356::-;45621:10;45643:4;45621:27;45613:83;;;;-1:-1:-1;;;45613:83:0;;15665:2:1;45613:83:0;;;15647:21:1;15704:2;15684:18;;;15677:30;15743:34;15723:18;;;15716:62;-1:-1:-1;;;15794:18:1;;;15787:41;15845:19;;45613:83:0;15463:407:1;45613:83:0;45745:55;45757:11;45770;45783:6;45791:8;45745:10;:55::i;34822:339::-;35017:41;10696:10;35050:7;35017:18;:41::i;:::-;35009:103;;;;-1:-1:-1;;;35009:103:0;;;;;;;:::i;:::-;35125:28;35135:4;35141:2;35145:7;35125:9;:28::i;35232:185::-;35370:39;35387:4;35393:2;35397:7;35370:39;;;;;;;;;;;;:16;:39::i;57852:90::-;11938:7;11965:6;-1:-1:-1;;;;;11965:6:0;10696:10;12112:23;12104:68;;;;-1:-1:-1;;;12104:68:0;;;;;;;:::i;:::-;57921:13;;::::1;::::0;:7:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;32194:239::-:0;32266:7;32302:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32302:16:0;32337:19;32329:73;;;;-1:-1:-1;;;32329:73:0;;16495:2:1;32329:73:0;;;16477:21:1;16534:2;16514:18;;;16507:30;16573:34;16553:18;;;16546:62;-1:-1:-1;;;16624:18:1;;;16617:39;16673:19;;32329:73:0;16293:405:1;55340:302:0;11938:7;11965:6;-1:-1:-1;;;;;11965:6:0;10696:10;12112:23;12104:68;;;;-1:-1:-1;;;12104:68:0;;;;;;;:::i;:::-;55466:17:::1;;55453:9;55432:30;;:18;;:30;;;;:::i;:::-;:51;;55424:111;;;::::0;-1:-1:-1;;;55424:111:0;;17170:2:1;55424:111:0::1;::::0;::::1;17152:21:1::0;17209:2;17189:18;;;17182:30;17248:34;17228:18;;;17221:62;-1:-1:-1;;;17299:18:1;;;17292:45;17354:19;;55424:111:0::1;16968:411:1::0;55424:111:0::1;55545:6;55540:98;55561:9;55557:13;;:1;:13;55540:98;;;55583:49;55593:16;55613:18;;55611:20;;;;;:::i;:::-;::::0;;;;-1:-1:-1;55583:9:0::1;:49::i;:::-;55572:3:::0;::::1;::::0;::::1;:::i;:::-;;;;55540:98;;55756:356:::0;55835:1;55823:9;:13;;;55815:58;;;;-1:-1:-1;;;55815:58:0;;17726:2:1;55815:58:0;;;17708:21:1;;;17745:18;;;17738:30;17804:34;17784:18;;;17777:62;17856:18;;55815:58:0;17524:356:1;55815:58:0;55919:15;;55906:9;55892:23;;:11;;:23;;;;:::i;:::-;:42;;55884:80;;;;-1:-1:-1;;;55884:80:0;;18087:2:1;55884:80:0;;;18069:21:1;18126:2;18106:18;;;18099:30;18165:27;18145:18;;;18138:55;18210:18;;55884:80:0;17885:349:1;55884:80:0;55975:36;55985:10;55999:11;;55997:13;;;;;:::i;55975:36::-;56026:9;:14;;56039:1;56026:14;56022:83;;;56057:36;56067:10;56081:11;;56079:13;;;;;:::i;56057:36::-;55756:356;:::o;31924:208::-;31996:7;-1:-1:-1;;;;;32024:19:0;;32016:74;;;;-1:-1:-1;;;32016:74:0;;18441:2:1;32016:74:0;;;18423:21:1;18480:2;18460:18;;;18453:30;18519:34;18499:18;;;18492:62;-1:-1:-1;;;18570:18:1;;;18563:40;18620:19;;32016:74:0;18239:406:1;32016:74:0;-1:-1:-1;;;;;;32108:16:0;;;;;:9;:16;;;;;;;31924:208::o;12543:103::-;11938:7;11965:6;-1:-1:-1;;;;;11965:6:0;10696:10;12112:23;12104:68;;;;-1:-1:-1;;;12104:68:0;;;;;;;:::i;:::-;12608:30:::1;12635:1;12608:18;:30::i;:::-;12543:103::o:0;44337:51::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;58023:169::-;11938:7;11965:6;-1:-1:-1;;;;;11965:6:0;10696:10;12112:23;12104:68;;;;-1:-1:-1;;;12104:68:0;;;;;;;:::i;:::-;58100:58:::1;::::0;58082:12:::1;::::0;58108:10:::1;::::0;58132:21:::1;::::0;58082:12;58100:58;58082:12;58100:58;58132:21;58108:10;58100:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58081:77;;;58176:7;58168:16;;;::::0;::::1;58521:125:::0;11938:7;11965:6;-1:-1:-1;;;;;11965:6:0;10696:10;12112:23;12104:68;;;;-1:-1:-1;;;12104:68:0;;;;;;;:::i;:::-;58603:26:::1;:35:::0;58521:125::o;32669:104::-;32725:13;32758:7;32751:14;;;;;:::i;34365:155::-;34460:52;10696:10;34493:8;34503;34460:18;:52::i;35488:328::-;35663:41;10696:10;35696:7;35663:18;:41::i;:::-;35655:103;;;;-1:-1:-1;;;35655:103:0;;;;;;;:::i;:::-;35769:39;35783:4;35789:2;35793:7;35802:5;35769:13;:39::i;32844:343::-;37391:4;37415:16;;;:7;:16;;;;;;32917:13;;-1:-1:-1;;;;;37415:16:0;32943:76;;;;-1:-1:-1;;;32943:76:0;;18852:2:1;32943:76:0;;;18834:21:1;18891:2;18871:18;;;18864:30;18930:34;18910:18;;;18903:62;-1:-1:-1;;;18981:18:1;;;18974:45;19036:19;;32943:76:0;18650:411:1;32943:76:0;33032:21;33056:10;:8;:10::i;:::-;33032:34;;33108:1;33090:7;33084:21;:25;:95;;;;;;;;;;;;;;;;;33136:7;33145:18;:7;:16;:18::i;:::-;33119:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33084:95;33077:102;32844:343;-1:-1:-1;;;32844:343:0:o;56252:1590::-;56355:16;56363:7;56355;:16::i;:::-;-1:-1:-1;;;;;56341:30:0;:10;-1:-1:-1;;;;;56341:30:0;;56333:77;;;;-1:-1:-1;;;56333:77:0;;19910:2:1;56333:77:0;;;19892:21:1;19949:2;19929:18;;;19922:30;19988:34;19968:18;;;19961:62;-1:-1:-1;;;20039:18:1;;;20032:32;20081:19;;56333:77:0;19708:398:1;56333:77:0;56429:29;;;56468:1;56429:29;;;:19;:29;;;;;:36;;;;;:::i;:::-;;;:40;56421:99;;;;-1:-1:-1;;;56421:99:0;;20313:2:1;56421:99:0;;;20295:21:1;20352:2;20332:18;;;20325:30;20391:34;20371:18;;;20364:62;-1:-1:-1;;;20442:18:1;;;20435:44;20496:19;;56421:99:0;20111:410:1;56421:99:0;56600:14;56606:7;56600:5;:14::i;:::-;56711:31;;;56722:10;56711:31;;;20700:51:1;20767:18;;;20760:34;;;56711:31:0;;;;;;;;;20673:18:1;;;56711:31:0;;56912:26;;-1:-1:-1;;;56886:53:0;;;20960:51:1;21027:11;;;;21020:27;;;;56886:53:0;;;;;;;;;;21063:12:1;;;56886:53:0;;;;57115:8;;-1:-1:-1;;;57115:77:0;;;56711:31;;56845:1;;-1:-1:-1;;;;;;;57115:8:0;;:21;;:77;;57137:8;;57155:4;;56711:31;;-1:-1:-1;;56886:53:0;;57115:77;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57093:99;;;57234:10;57221:9;:23;;57213:109;;;;-1:-1:-1;;;57213:109:0;;22185:2:1;57213:109:0;;;22167:21:1;22224:2;22204:18;;;22197:30;22263:34;22243:18;;;22236:62;22334:34;22314:18;;;22307:62;-1:-1:-1;;;22385:19:1;;;22378:40;22435:19;;57213:109:0;21983:477:1;57213:109:0;57335:8;;57453:29;;;57335:8;57453:29;;;:19;:29;;;;;;57335:499;;-1:-1:-1;;;57335:499:0;;-1:-1:-1;;;;;57335:8:0;;;;:13;;57356:9;;57335:499;;57381:8;;57541:7;;57624:10;;57335:8;57771:13;;57335:499;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56322:1520;;;;56252:1590;;:::o;46284:758::-;46500:27;;;46465:32;46500:27;;;:14;:27;;;;;;:40;;;;46528:11;;46500:40;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46500:48:0;;;;;;;;;;46567:21;;;;46500:48;;-1:-1:-1;46559:86:0;;;;-1:-1:-1;;;46559:86:0;;24156:2:1;46559:86:0;;;24138:21:1;24195:2;24175:18;;;24168:30;24234:34;24214:18;;;24207:62;-1:-1:-1;;;24285:18:1;;;24278:36;24331:19;;46559:86:0;23954:402:1;46559:86:0;46683:23;;46664:42;;:90;;;;;46733:9;:21;;;46720:8;;46710:19;;;;;;;:::i;:::-;;;;;;;;:44;46664:90;46656:129;;;;-1:-1:-1;;;46656:129:0;;24839:2:1;46656:129:0;;;24821:21:1;24878:2;24858:18;;;24851:30;24917:28;24897:18;;;24890:56;24963:18;;46656:129:0;24637:350:1;46656:129:0;46859:1;46833:27;;;46871:21;;;:34;46974:60;;-1:-1:-1;;;46974:60:0;;:4;;:16;;:60;;46991:11;;47004;;47017:6;;47025:8;;;;46974:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46409:633;46284:758;;;;;:::o;47050:158::-;11938:7;11965:6;-1:-1:-1;;;;;11965:6:0;10696:10;12112:23;12104:68;;;;-1:-1:-1;;;12104:68:0;;;;;;;:::i;:::-;47154:29:::1;::::0;::::1;;::::0;;;:19:::1;:29;::::0;;;;:46:::1;::::0;47186:14;;47154:46:::1;:::i;12801:201::-:0;11938:7;11965:6;-1:-1:-1;;;;;11965:6:0;10696:10;12112:23;12104:68;;;;-1:-1:-1;;;12104:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;12890:22:0;::::1;12882:73;;;::::0;-1:-1:-1;;;12882:73:0;;25917:2:1;12882:73:0::1;::::0;::::1;25899:21:1::0;25956:2;25936:18;;;25929:30;25995:34;25975:18;;;25968:62;-1:-1:-1;;;26046:18:1;;;26039:36;26092:19;;12882:73:0::1;25715:402:1::0;12882:73:0::1;12966:28;12985:8;12966:18;:28::i;41239:174::-:0;41314:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;41314:29:0;-1:-1:-1;;;;;41314:29:0;;;;;;;;:24;;41368:23;41314:24;41368:14;:23::i;:::-;-1:-1:-1;;;;;41359:46:0;;;;;;;;;;;41239:174;;:::o;58737:338::-;58890:14;58906:12;58933:8;58922:37;;;;;;;;;;;;:::i;:::-;58889:70;;;;59041:26;59051:6;59059:7;59041:9;:26::i;:::-;58859:216;;58737:338;;;;:::o;37620:348::-;37713:4;37415:16;;;:7;:16;;;;;;-1:-1:-1;;;;;37415:16:0;37730:73;;;;-1:-1:-1;;;37730:73:0;;26649:2:1;37730:73:0;;;26631:21:1;26688:2;26668:18;;;26661:30;26727:34;26707:18;;;26700:62;-1:-1:-1;;;26778:18:1;;;26771:42;26830:19;;37730:73:0;26447:408:1;37730:73:0;37814:13;37830:23;37845:7;37830:14;:23::i;:::-;37814:39;;37883:5;-1:-1:-1;;;;;37872:16:0;:7;-1:-1:-1;;;;;37872:16:0;;:51;;;;37916:7;-1:-1:-1;;;;;37892:31:0;:20;37904:7;37892:11;:20::i;:::-;-1:-1:-1;;;;;37892:31:0;;37872:51;:87;;;-1:-1:-1;;;;;;34712:25:0;;;34688:4;34712:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;37927:32;37864:96;37620:348;-1:-1:-1;;;;37620:348:0:o;40543:578::-;40702:4;-1:-1:-1;;;;;40675:31:0;:23;40690:7;40675:14;:23::i;:::-;-1:-1:-1;;;;;40675:31:0;;40667:85;;;;-1:-1:-1;;;40667:85:0;;27062:2:1;40667:85:0;;;27044:21:1;27101:2;27081:18;;;27074:30;27140:34;27120:18;;;27113:62;-1:-1:-1;;;27191:18:1;;;27184:39;27240:19;;40667:85:0;26860:405:1;40667:85:0;-1:-1:-1;;;;;40771:16:0;;40763:65;;;;-1:-1:-1;;;40763:65:0;;27472:2:1;40763:65:0;;;27454:21:1;27511:2;27491:18;;;27484:30;27550:34;27530:18;;;27523:62;-1:-1:-1;;;27601:18:1;;;27594:34;27645:19;;40763:65:0;27270:400:1;40763:65:0;40945:29;40962:1;40966:7;40945:8;:29::i;:::-;-1:-1:-1;;;;;40987:15:0;;;;;;:9;:15;;;;;:20;;41006:1;;40987:15;:20;;41006:1;;40987:20;:::i;:::-;;;;-1:-1:-1;;;;;;;41018:13:0;;;;;;:9;:13;;;;;:18;;41035:1;;41018:13;:18;;41035:1;;41018:18;:::i;:::-;;;;-1:-1:-1;;41047:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;41047:21:0;-1:-1:-1;;;;;41047:21:0;;;;;;;;;41086:27;;41047:16;;41086:27;;;;;;;40543:578;;;:::o;38310:110::-;38386:26;38396:2;38400:7;38386:26;;;;;;;;;;;;:9;:26::i;13162:191::-;13236:16;13255:6;;-1:-1:-1;;;;;13272:17:0;;;-1:-1:-1;;;;;;13272:17:0;;;;;;13305:40;;13255:6;;;;;;;13305:40;;13236:16;13305:40;13225:128;13162:191;:::o;41555:315::-;41710:8;-1:-1:-1;;;;;41701:17:0;:5;-1:-1:-1;;;;;41701:17:0;;;41693:55;;;;-1:-1:-1;;;41693:55:0;;28007:2:1;41693:55:0;;;27989:21:1;28046:2;28026:18;;;28019:30;28085:27;28065:18;;;28058:55;28130:18;;41693:55:0;27805:349:1;41693:55:0;-1:-1:-1;;;;;41759:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;41759:46:0;;;;;;;;;;41821:41;;2562::1;;;41821::0;;2535:18:1;41821:41:0;;;;;;;41555:315;;;:::o;36698:::-;36855:28;36865:4;36871:2;36875:7;36855:9;:28::i;:::-;36902:48;36925:4;36931:2;36935:7;36944:5;36902:22;:48::i;:::-;36894:111;;;;-1:-1:-1;;;36894:111:0;;;;;;;:::i;59085:100::-;59137:13;59170:7;59163:14;;;;;:::i;8178:723::-;8234:13;8455:10;8451:53;;-1:-1:-1;;8482:10:0;;;;;;;;;;;;-1:-1:-1;;;8482:10:0;;;;;8178:723::o;8451:53::-;8529:5;8514:12;8570:78;8577:9;;8570:78;;8603:8;;;;:::i;:::-;;-1:-1:-1;8626:10:0;;-1:-1:-1;8634:2:0;8626:10;;:::i;:::-;;;8570:78;;;8658:19;8690:6;-1:-1:-1;;;;;8680:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8680:17:0;;8658:39;;8708:154;8715:10;;8708:154;;8742:11;8752:1;8742:11;;:::i;:::-;;-1:-1:-1;8811:10:0;8819:2;8811:5;:10;:::i;:::-;8798:24;;:2;:24;:::i;:::-;8785:39;;8768:6;8775;8768:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;8768:56:0;;;;;;;;-1:-1:-1;8839:11:0;8848:2;8839:11;;:::i;:::-;;;8708:154;;39846:360;39906:13;39922:23;39937:7;39922:14;:23::i;:::-;39906:39;;40047:29;40064:1;40068:7;40047:8;:29::i;:::-;-1:-1:-1;;;;;40089:16:0;;;;;;:9;:16;;;;;:21;;40109:1;;40089:16;:21;;40109:1;;40089:21;:::i;:::-;;;;-1:-1:-1;;40128:16:0;;;;:7;:16;;;;;;40121:23;;-1:-1:-1;;;;;;40121:23:0;;;40162:36;40136:7;;40128:16;-1:-1:-1;;;;;40162:36:0;;;;;40128:16;;40162:36;39895:311;39846:360;:::o;38647:321::-;38777:18;38783:2;38787:7;38777:5;:18::i;:::-;38828:54;38859:1;38863:2;38867:7;38876:5;38828:22;:54::i;:::-;38806:154;;;;-1:-1:-1;;;38806:154:0;;;;;;;:::i;42435:799::-;42590:4;-1:-1:-1;;;;;42611:13:0;;14503:20;14551:8;42607:620;;42647:72;;-1:-1:-1;;;42647:72:0;;-1:-1:-1;;;;;42647:36:0;;;;;:72;;10696:10;;42698:4;;42704:7;;42713:5;;42647:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42647:72:0;;;;;;;;-1:-1:-1;;42647:72:0;;;;;;;;;;;;:::i;:::-;;;42643:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42889:13:0;;42885:272;;42932:60;;-1:-1:-1;;;42932:60:0;;;;;;;:::i;42885:272::-;43107:6;43101:13;43092:6;43088:2;43084:15;43077:38;42643:529;-1:-1:-1;;;;;;42770:51:0;-1:-1:-1;;;42770:51:0;;-1:-1:-1;42763:58:0;;42607:620;-1:-1:-1;43211:4:0;42435:799;;;;;;:::o;39304:313::-;-1:-1:-1;;;;;39384:16:0;;39376:61;;;;-1:-1:-1;;;39376:61:0;;30034:2:1;39376:61:0;;;30016:21:1;;;30053:18;;;30046:30;30112:34;30092:18;;;30085:62;30164:18;;39376:61:0;29832:356:1;39376:61:0;-1:-1:-1;;;;;39508:13:0;;;;;;:9;:13;;;;;:18;;39525:1;;39508:13;:18;;39525:1;;39508:18;:::i;:::-;;;;-1:-1:-1;;39537:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;39537:21:0;-1:-1:-1;;;;;39537:21:0;;;;;;;;39576:33;;39537:16;;;39576:33;;39537:16;;39576:33;39304:313;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:159:1;81:20;;141:6;130:18;;120:29;;110:57;;163:1;160;153:12;110:57;14:159;;;:::o;178:127::-;239:10;234:3;230:20;227:1;220:31;270:4;267:1;260:15;294:4;291:1;284:15;310:631;374:5;-1:-1:-1;;;;;445:2:1;437:6;434:14;431:40;;;451:18;;:::i;:::-;526:2;520:9;494:2;580:15;;-1:-1:-1;;576:24:1;;;602:2;572:33;568:42;556:55;;;626:18;;;646:22;;;623:46;620:72;;;672:18;;:::i;:::-;712:10;708:2;701:22;741:6;732:15;;771:6;763;756:22;811:3;802:6;797:3;793:16;790:25;787:45;;;828:1;825;818:12;787:45;878:6;873:3;866:4;858:6;854:17;841:44;933:1;926:4;917:6;909;905:19;901:30;894:41;;;;310:631;;;;;:::o;946:220::-;988:5;1041:3;1034:4;1026:6;1022:17;1018:27;1008:55;;1059:1;1056;1049:12;1008:55;1081:79;1156:3;1147:6;1134:20;1127:4;1119:6;1115:17;1081:79;:::i;1171:171::-;1238:20;;-1:-1:-1;;;;;1287:30:1;;1277:41;;1267:69;;1332:1;1329;1322:12;1347:684;1449:6;1457;1465;1473;1526:3;1514:9;1505:7;1501:23;1497:33;1494:53;;;1543:1;1540;1533:12;1494:53;1566:28;1584:9;1566:28;:::i;:::-;1556:38;;1645:2;1634:9;1630:18;1617:32;-1:-1:-1;;;;;1709:2:1;1701:6;1698:14;1695:34;;;1725:1;1722;1715:12;1695:34;1748:49;1789:7;1780:6;1769:9;1765:22;1748:49;:::i;:::-;1738:59;;1816:37;1849:2;1838:9;1834:18;1816:37;:::i;:::-;1806:47;;1906:2;1895:9;1891:18;1878:32;1862:48;;1935:2;1925:8;1922:16;1919:36;;;1951:1;1948;1941:12;1919:36;;1974:51;2017:7;2006:8;1995:9;1991:24;1974:51;:::i;:::-;1964:61;;;1347:684;;;;;;;:::o;2036:131::-;-1:-1:-1;;;;;;2110:32:1;;2100:43;;2090:71;;2157:1;2154;2147:12;2172:245;2230:6;2283:2;2271:9;2262:7;2258:23;2254:32;2251:52;;;2299:1;2296;2289:12;2251:52;2338:9;2325:23;2357:30;2381:5;2357:30;:::i;2614:180::-;2673:6;2726:2;2714:9;2705:7;2701:23;2697:32;2694:52;;;2742:1;2739;2732:12;2694:52;-1:-1:-1;2765:23:1;;2614:180;-1:-1:-1;2614:180:1:o;2799:258::-;2871:1;2881:113;2895:6;2892:1;2889:13;2881:113;;;2971:11;;;2965:18;2952:11;;;2945:39;2917:2;2910:10;2881:113;;;3012:6;3009:1;3006:13;3003:48;;;-1:-1:-1;;3047:1:1;3029:16;;3022:27;2799:258::o;3062:::-;3104:3;3142:5;3136:12;3169:6;3164:3;3157:19;3185:63;3241:6;3234:4;3229:3;3225:14;3218:4;3211:5;3207:16;3185:63;:::i;:::-;3302:2;3281:15;-1:-1:-1;;3277:29:1;3268:39;;;;3309:4;3264:50;;3062:258;-1:-1:-1;;3062:258:1:o;3325:220::-;3474:2;3463:9;3456:21;3437:4;3494:45;3535:2;3524:9;3520:18;3512:6;3494:45;:::i;3867:131::-;-1:-1:-1;;;;;3942:31:1;;3932:42;;3922:70;;3988:1;3985;3978:12;4003:315;4071:6;4079;4132:2;4120:9;4111:7;4107:23;4103:32;4100:52;;;4148:1;4145;4138:12;4100:52;4187:9;4174:23;4206:31;4231:5;4206:31;:::i;:::-;4256:5;4308:2;4293:18;;;;4280:32;;-1:-1:-1;;;4003:315:1:o;4323:456::-;4400:6;4408;4416;4469:2;4457:9;4448:7;4444:23;4440:32;4437:52;;;4485:1;4482;4475:12;4437:52;4524:9;4511:23;4543:31;4568:5;4543:31;:::i;:::-;4593:5;-1:-1:-1;4650:2:1;4635:18;;4622:32;4663:33;4622:32;4663:33;:::i;:::-;4323:456;;4715:7;;-1:-1:-1;;;4769:2:1;4754:18;;;;4741:32;;4323:456::o;4784:450::-;4853:6;4906:2;4894:9;4885:7;4881:23;4877:32;4874:52;;;4922:1;4919;4912:12;4874:52;4962:9;4949:23;-1:-1:-1;;;;;4987:6:1;4984:30;4981:50;;;5027:1;5024;5017:12;4981:50;5050:22;;5103:4;5095:13;;5091:27;-1:-1:-1;5081:55:1;;5132:1;5129;5122:12;5081:55;5155:73;5220:7;5215:2;5202:16;5197:2;5193;5189:11;5155:73;:::i;5239:156::-;5305:20;;5365:4;5354:16;;5344:27;;5334:55;;5385:1;5382;5375:12;5400:317;5466:6;5474;5527:2;5515:9;5506:7;5502:23;5498:32;5495:52;;;5543:1;5540;5533:12;5495:52;5582:9;5569:23;5601:31;5626:5;5601:31;:::i;:::-;5651:5;-1:-1:-1;5675:36:1;5707:2;5692:18;;5675:36;:::i;:::-;5665:46;;5400:317;;;;;:::o;5722:182::-;5779:6;5832:2;5820:9;5811:7;5807:23;5803:32;5800:52;;;5848:1;5845;5838:12;5800:52;5871:27;5888:9;5871:27;:::i;5909:247::-;5968:6;6021:2;6009:9;6000:7;5996:23;5992:32;5989:52;;;6037:1;6034;6027:12;5989:52;6076:9;6063:23;6095:31;6120:5;6095:31;:::i;6343:184::-;6401:6;6454:2;6442:9;6433:7;6429:23;6425:32;6422:52;;;6470:1;6467;6460:12;6422:52;6493:28;6511:9;6493:28;:::i;6755:460::-;6840:6;6848;6856;6909:2;6897:9;6888:7;6884:23;6880:32;6877:52;;;6925:1;6922;6915:12;6877:52;6948:28;6966:9;6948:28;:::i;:::-;6938:38;;7027:2;7016:9;7012:18;6999:32;-1:-1:-1;;;;;7046:6:1;7043:30;7040:50;;;7086:1;7083;7076:12;7040:50;7109:49;7150:7;7141:6;7130:9;7126:22;7109:49;:::i;:::-;7099:59;;;7205:2;7194:9;7190:18;7177:32;7167:42;;6755:460;;;;;:::o;7473:416::-;7538:6;7546;7599:2;7587:9;7578:7;7574:23;7570:32;7567:52;;;7615:1;7612;7605:12;7567:52;7654:9;7641:23;7673:31;7698:5;7673:31;:::i;:::-;7723:5;-1:-1:-1;7780:2:1;7765:18;;7752:32;7822:15;;7815:23;7803:36;;7793:64;;7853:1;7850;7843:12;7793:64;7876:7;7866:17;;;7473:416;;;;;:::o;7894:665::-;7989:6;7997;8005;8013;8066:3;8054:9;8045:7;8041:23;8037:33;8034:53;;;8083:1;8080;8073:12;8034:53;8122:9;8109:23;8141:31;8166:5;8141:31;:::i;:::-;8191:5;-1:-1:-1;8248:2:1;8233:18;;8220:32;8261:33;8220:32;8261:33;:::i;:::-;8313:7;-1:-1:-1;8367:2:1;8352:18;;8339:32;;-1:-1:-1;8422:2:1;8407:18;;8394:32;-1:-1:-1;;;;;8438:30:1;;8435:50;;;8481:1;8478;8471:12;8435:50;8504:49;8545:7;8536:6;8525:9;8521:22;8504:49;:::i;8564:252::-;8631:6;8639;8692:2;8680:9;8671:7;8667:23;8663:32;8660:52;;;8708:1;8705;8698:12;8660:52;8731:28;8749:9;8731:28;:::i;8821:347::-;8872:8;8882:6;8936:3;8929:4;8921:6;8917:17;8913:27;8903:55;;8954:1;8951;8944:12;8903:55;-1:-1:-1;8977:20:1;;-1:-1:-1;;;;;9009:30:1;;9006:50;;;9052:1;9049;9042:12;9006:50;9089:4;9081:6;9077:17;9065:29;;9141:3;9134:4;9125:6;9117;9113:19;9109:30;9106:39;9103:59;;;9158:1;9155;9148:12;9103:59;8821:347;;;;;:::o;9173:773::-;9277:6;9285;9293;9301;9309;9362:3;9350:9;9341:7;9337:23;9333:33;9330:53;;;9379:1;9376;9369:12;9330:53;9402:28;9420:9;9402:28;:::i;:::-;9392:38;;9481:2;9470:9;9466:18;9453:32;-1:-1:-1;;;;;9545:2:1;9537:6;9534:14;9531:34;;;9561:1;9558;9551:12;9531:34;9584:49;9625:7;9616:6;9605:9;9601:22;9584:49;:::i;:::-;9574:59;;9652:37;9685:2;9674:9;9670:18;9652:37;:::i;:::-;9642:47;;9742:2;9731:9;9727:18;9714:32;9698:48;;9771:2;9761:8;9758:16;9755:36;;;9787:1;9784;9777:12;9755:36;;9826:60;9878:7;9867:8;9856:9;9852:24;9826:60;:::i;:::-;9173:773;;;;-1:-1:-1;9173:773:1;;-1:-1:-1;9905:8:1;;9800:86;9173:773;-1:-1:-1;;;9173:773:1:o;9951:388::-;10019:6;10027;10080:2;10068:9;10059:7;10055:23;10051:32;10048:52;;;10096:1;10093;10086:12;10048:52;10135:9;10122:23;10154:31;10179:5;10154:31;:::i;:::-;10204:5;-1:-1:-1;10261:2:1;10246:18;;10233:32;10274:33;10233:32;10274:33;:::i;10344:481::-;10422:6;10430;10438;10491:2;10479:9;10470:7;10466:23;10462:32;10459:52;;;10507:1;10504;10497:12;10459:52;10530:28;10548:9;10530:28;:::i;:::-;10520:38;;10609:2;10598:9;10594:18;10581:32;-1:-1:-1;;;;;10628:6:1;10625:30;10622:50;;;10668:1;10665;10658:12;10622:50;10707:58;10757:7;10748:6;10737:9;10733:22;10707:58;:::i;:::-;10344:481;;10784:8;;-1:-1:-1;10681:84:1;;-1:-1:-1;;;;10344:481:1:o;10830:380::-;10909:1;10905:12;;;;10952;;;10973:61;;11027:4;11019:6;11015:17;11005:27;;10973:61;11080:2;11072:6;11069:14;11049:18;11046:38;11043:161;;;11126:10;11121:3;11117:20;11114:1;11107:31;11161:4;11158:1;11151:15;11189:4;11186:1;11179:15;11043:161;;10830:380;;;:::o;11215:811::-;11341:3;11370:1;11403:6;11397:13;11433:36;11459:9;11433:36;:::i;:::-;11488:1;11505:18;;;11532:104;;;;11650:1;11645:356;;;;11498:503;;11532:104;-1:-1:-1;;11565:24:1;;11553:37;;11610:16;;;;-1:-1:-1;11532:104:1;;11645:356;11676:6;11673:1;11666:17;11706:4;11751:2;11748:1;11738:16;11776:1;11790:165;11804:6;11801:1;11798:13;11790:165;;;11882:14;;11869:11;;;11862:35;11925:16;;;;11819:10;;11790:165;;;11794:3;;;11984:6;11979:3;11975:16;11968:23;;11498:503;-1:-1:-1;12017:3:1;;11215:811;-1:-1:-1;;;;;;11215:811:1:o;12452:557::-;12709:6;12701;12697:19;12686:9;12679:38;12753:3;12748:2;12737:9;12733:18;12726:31;12660:4;12780:46;12821:3;12810:9;12806:19;12798:6;12780:46;:::i;:::-;-1:-1:-1;;;;;12866:6:1;12862:31;12857:2;12846:9;12842:18;12835:59;12942:9;12934:6;12930:22;12925:2;12914:9;12910:18;12903:50;12970:33;12996:6;12988;12970:33;:::i;:::-;12962:41;12452:557;-1:-1:-1;;;;;;;12452:557:1:o;13014:274::-;13143:3;13181:6;13175:13;13197:53;13243:6;13238:3;13231:4;13223:6;13219:17;13197:53;:::i;:::-;13266:16;;;;;13014:274;-1:-1:-1;;13014:274:1:o;13293:356::-;13495:2;13477:21;;;13514:18;;;13507:30;13573:34;13568:2;13553:18;;13546:62;13640:2;13625:18;;13293:356::o;15875:413::-;16077:2;16059:21;;;16116:2;16096:18;;;16089:30;16155:34;16150:2;16135:18;;16128:62;-1:-1:-1;;;16221:2:1;16206:18;;16199:47;16278:3;16263:19;;15875:413::o;16703:127::-;16764:10;16759:3;16755:20;16752:1;16745:31;16795:4;16792:1;16785:15;16819:4;16816:1;16809:15;16835:128;16875:3;16906:1;16902:6;16899:1;16896:13;16893:39;;;16912:18;;:::i;:::-;-1:-1:-1;16948:9:1;;16835:128::o;17384:135::-;17423:3;-1:-1:-1;;17444:17:1;;17441:43;;;17464:18;;:::i;:::-;-1:-1:-1;17511:1:1;17500:13;;17384:135::o;19066:637::-;19346:3;19384:6;19378:13;19400:53;19446:6;19441:3;19434:4;19426:6;19422:17;19400:53;:::i;:::-;19516:13;;19475:16;;;;19538:57;19516:13;19475:16;19572:4;19560:17;;19538:57;:::i;:::-;-1:-1:-1;;;19617:20:1;;19646:22;;;19695:1;19684:13;;19066:637;-1:-1:-1;;;;19066:637:1:o;21086:642::-;21367:6;21355:19;;21337:38;;-1:-1:-1;;;;;21411:32:1;;21406:2;21391:18;;21384:60;21431:3;21475:2;21460:18;;21453:31;;;-1:-1:-1;;21507:46:1;;21533:19;;21525:6;21507:46;:::i;:::-;21603:6;21596:14;21589:22;21584:2;21573:9;21569:18;21562:50;21661:9;21653:6;21649:22;21643:3;21632:9;21628:19;21621:51;21689:33;21715:6;21707;21689:33;:::i;:::-;21681:41;21086:642;-1:-1:-1;;;;;;;;21086:642:1:o;21733:245::-;21812:6;21820;21873:2;21861:9;21852:7;21848:23;21844:32;21841:52;;;21889:1;21886;21879:12;21841:52;-1:-1:-1;;21912:16:1;;21968:2;21953:18;;;21947:25;21912:16;;21947:25;;-1:-1:-1;21733:245:1:o;22465:1484::-;22811:6;22803;22799:19;22788:9;22781:38;22762:4;22838:2;22876:3;22871:2;22860:9;22856:18;22849:31;22900:1;22933:6;22927:13;22963:36;22989:9;22963:36;:::i;:::-;23036:6;23030:3;23019:9;23015:19;23008:35;23062:3;23084:1;23116:2;23105:9;23101:18;23133:1;23128:122;;;;23264:1;23259:354;;;;23094:519;;23128:122;-1:-1:-1;;23176:24:1;;23156:18;;;23149:52;23236:3;23221:19;;;-1:-1:-1;23128:122:1;;23259:354;23290:6;23287:1;23280:17;23338:2;23335:1;23325:16;23363:1;23377:180;23391:6;23388:1;23385:13;23377:180;;;23484:14;;23460:17;;;23456:26;;23449:50;23527:16;;;;23406:10;;23377:180;;;23581:17;;23577:26;;;-1:-1:-1;;23094:519:1;;;;;;23658:9;23653:3;23649:19;23644:2;23633:9;23629:18;23622:47;23692:30;23718:3;23710:6;23692:30;:::i;:::-;23678:44;;;23731:46;23773:2;23762:9;23758:18;23750:6;-1:-1:-1;;;;;3616:31:1;3604:44;;3550:104;23731:46;-1:-1:-1;;;;;3616:31:1;;23828:3;23813:19;;3604:44;23882:9;23874:6;23870:22;23864:3;23853:9;23849:19;23842:51;23910:33;23936:6;23928;23910:33;:::i;:::-;23902:41;22465:1484;-1:-1:-1;;;;;;;;;22465:1484:1:o;24361:271::-;24544:6;24536;24531:3;24518:33;24500:3;24570:16;;24595:13;;;24570:16;24361:271;-1:-1:-1;24361:271:1:o;24992:718::-;25259:6;25251;25247:19;25236:9;25229:38;25303:3;25298:2;25287:9;25283:18;25276:31;25210:4;25330:46;25371:3;25360:9;25356:19;25348:6;25330:46;:::i;:::-;-1:-1:-1;;;;;25416:6:1;25412:31;25407:2;25396:9;25392:18;25385:59;25492:9;25484:6;25480:22;25475:2;25464:9;25460:18;25453:50;25527:6;25519;25512:22;25581:6;25573;25568:2;25560:6;25556:15;25543:45;25634:1;25629:2;25620:6;25612;25608:19;25604:28;25597:39;25701:2;25694;25690:7;25685:2;25677:6;25673:15;25669:29;25661:6;25657:42;25653:51;25645:59;;;24992:718;;;;;;;;:::o;26122:320::-;26209:6;26217;26270:2;26258:9;26249:7;26245:23;26241:32;26238:52;;;26286:1;26283;26276:12;26238:52;26318:9;26312:16;26337:31;26362:5;26337:31;:::i;:::-;26432:2;26417:18;;;;26411:25;26387:5;;26411:25;;-1:-1:-1;;;26122:320:1:o;27675:125::-;27715:4;27743:1;27740;27737:8;27734:34;;;27748:18;;:::i;:::-;-1:-1:-1;27785:9:1;;27675:125::o;28159:414::-;28361:2;28343:21;;;28400:2;28380:18;;;28373:30;28439:34;28434:2;28419:18;;28412:62;-1:-1:-1;;;28505:2:1;28490:18;;28483:48;28563:3;28548:19;;28159:414::o;28578:127::-;28639:10;28634:3;28630:20;28627:1;28620:31;28670:4;28667:1;28660:15;28694:4;28691:1;28684:15;28710:120;28750:1;28776;28766:35;;28781:18;;:::i;:::-;-1:-1:-1;28815:9:1;;28710:120::o;28835:112::-;28867:1;28893;28883:35;;28898:18;;:::i;:::-;-1:-1:-1;28932:9:1;;28835:112::o;28952:127::-;29013:10;29008:3;29004:20;29001:1;28994:31;29044:4;29041:1;29034:15;29068:4;29065:1;29058:15;29084:489;-1:-1:-1;;;;;29353:15:1;;;29335:34;;29405:15;;29400:2;29385:18;;29378:43;29452:2;29437:18;;29430:34;;;29500:3;29495:2;29480:18;;29473:31;;;29278:4;;29521:46;;29547:19;;29539:6;29521:46;:::i;:::-;29513:54;29084:489;-1:-1:-1;;;;;;29084:489:1:o;29578:249::-;29647:6;29700:2;29688:9;29679:7;29675:23;29671:32;29668:52;;;29716:1;29713;29706:12;29668:52;29748:9;29742:16;29767:30;29791:5;29767:30;:::i

Swarm Source

ipfs://1ef26822af2efb9fa53fab61b85cda4757f53c02e6671a6eacdaad687ec4458a
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.