ETH Price: $3,387.44 (+1.18%)

Token

fishbags (fishbags)
 

Overview

Max Total Supply

96 fishbags

Holders

36

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
bushwhacker.eth
Balance
1 fishbags
0xAA58479f8a653fE21DDcB73eB5dD7861deD41d4b
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:
fishbags

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-08-13
*/

/**
 *Submitted for verification at Etherscan.io on 2022-08-13
*/

/**
 *Submitted for verification at Etherscan.io on 2022-08-09
*/

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

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

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

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

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

    // @notice Only when the UA needs to resume the message flow in blocking mode and clear the stored payload
    // @param _srcChainId - the chainId of the source chain
    // @param _srcAddress - the contract address of the source contract at the source chain
    function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external;
}
 
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);
}
 
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;
}
 
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);
    }
}
 
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}
 
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @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);
    }
}
 
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);
            }
        }
    }
}
 
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);
}
 
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);
}
 
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}
 
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;
} 

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

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

interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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

abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @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` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * 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 override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

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

contract fishbags is Ownable, ERC721, ERC721Enumerable, NonblockingReceiver {

    address public _owner;
    string private baseURI;
    
    uint256 public nextTokenId = 1;
    uint256 public MAX_MINT = 266;
    uint256 public MAX_PER_WALLET = 30;
    uint256 public PRICE = 0.02 ether;
    uint256 public mintcount = 0;
    uint256 public reserved = 15;

    mapping(address => uint256) public minted;
    
    bool public enableBatchMint = false;
    bool public enableMint = true;

    uint gasForDestinationLzReceive = 350000;

    constructor() ERC721("fishbags", "fishbags") { 
        _owner = msg.sender;
        endpoint = ILayerZeroEndpoint(0x66A71Dcef29A0fFBDBE3c6a460a3B5BC225Cd675);
        baseURI = "https://fishbags-nft-default-rtdb.firebaseio.com/metadata/eth/";
    } 

    function batchMint(uint q) external payable {
        require(enableBatchMint, "Batch mint is disabled!!");
        require(msg.value >= PRICE*q, "Insufficient MINT amout sent!!");
        require(nextTokenId + q <= (MAX_MINT+1) - reserved, "Mint exceeds MAX Quantity!!");
        require(minted[msg.sender] + q <= MAX_PER_WALLET, "Mint exceeds MAX Quantity!!");

        for(uint i=0; i < q; i++)
            _safeMint(msg.sender, nextTokenId++);
        minted[msg.sender] += q;
        mintcount += q;
    }

    function mint() external payable { 
        require(enableMint, "Mint not available!!");
        require(msg.value >= PRICE, "Insufficient MINT amout sent!!");
        require(nextTokenId <= MAX_MINT - reserved, "Mint exceeds MAX Quantity!!");
        require(minted[msg.sender] < MAX_PER_WALLET, "Mint exceeds MAX Quantity!!");

        _safeMint(msg.sender, nextTokenId++);
        minted[msg.sender] += 1;

        mintcount += 1;
    }

    function giveaway(uint256 q, address a) public onlyOwner {
        require(nextTokenId + q <= (MAX_MINT+1), "Mint exceeds MAX Quantity!!");
        require(reserved >= q , "Mint exceeds MAX Reserve!!");
        for(uint i=0; i < q; i++)
            _safeMint(a, nextTokenId++);
        reserved -= q;
    }

    function setReserved(uint256 r) public onlyOwner {
        reserved = r;
    }

    function setPrice(uint256 p) public onlyOwner {
        PRICE = p;
    }

    function toggleBatchMint() public onlyOwner {
        enableBatchMint = !enableBatchMint;
    }

    function toggleMint() public onlyOwner {
        enableMint = !enableMint;
    }

    function setMAX_PER_WALLET(uint256 m) public onlyOwner {
        MAX_PER_WALLET = m;
    }

    function estimateGasFee(uint16 _chainId) public view returns (uint){
        (uint messageFee, ) = endpoint.estimateFees(_chainId, address(this), "0x", false, "0x");

        return messageFee;
    }

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

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

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

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

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

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

    function setBaseURI(string memory URI) external onlyOwner {
        baseURI = URI;
    }

    function withdraw() public {
        uint balance = address(this).balance;

        (bool sent, ) = 0x14cDF3E211Fb6e5c6B714bf8061A765df08b267C.call{value: balance/100*68}("");
        require(sent, "Failed to withdraw Ether");

        (bool sent2, ) = 0xDC0100701FAe7e2c608dBB59151BCEaB9f1541dA.call{value: balance/100*17}("");
        require(sent2, "Failed to withdraw Ether");

        (bool sent3, ) = 0x77E5C0704d9681765d9C7204D66e5110c6556DDd.call{value: balance/100*15}("");
        require(sent3, "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;
    }

    function _beforeTokenTransfer(address from, address to, uint256 tokenId)
        internal
        override(ERC721, ERC721Enumerable)
    {
        super._beforeTokenTransfer(from, to, tokenId);
    }

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

Contract Security Audit

Contract ABI

[{"inputs":[],"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":"MAX_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"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":[{"internalType":"uint256","name":"q","type":"uint256"}],"name":"batchMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"enableBatchMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"}],"name":"estimateGasFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"failedMessages","outputs":[{"internalType":"uint256","name":"payloadLength","type":"uint256"},{"internalType":"bytes32","name":"payloadHash","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"q","type":"uint256"},{"internalType":"address","name":"a","type":"address"}],"name":"giveaway","outputs":[],"stateMutability":"nonpayable","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":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintcount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"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":[],"name":"reserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"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":"uint256","name":"m","type":"uint256"}],"name":"setMAX_PER_WALLET","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"p","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"r","type":"uint256"}],"name":"setReserved","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":[],"name":"toggleBatchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"traverseChains","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"trustedRemoteLookup","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600160105561010a601155601e60125566470de4df8200006013556000601455600f6015556017805461ffff1916610100179055620557306018553480156200004c57600080fd5b5060405180604001604052806008815260200167666973686261677360c01b81525060405180604001604052806008815260200167666973686261677360c01b815250620000a9620000a36200014160201b60201c565b62000145565b8151620000be90600190602085019062000195565b508051620000d490600290602084019062000195565b5050600e80546001600160a01b03199081163317909155600b80549091167366a71dcef29a0ffbdbe3c6a460a3b5bc225cd675179055506040805160608101909152603e808252620039af602083013980516200013a91600f9160209091019062000195565b5062000278565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054620001a3906200023b565b90600052602060002090601f016020900481019282620001c7576000855562000212565b82601f10620001e257805160ff191683800117855562000212565b8280016001018555821562000212579182015b8281111562000212578251825591602001919060010190620001f5565b506200022092915062000224565b5090565b5b8082111562000220576000815560010162000225565b600181811c908216806200025057607f821691505b602082108114156200027257634e487b7160e01b600052602260045260246000fd5b50919050565b61372780620002886000396000f3fe6080604052600436106102925760003560e01c80637f35d6341161015a578063b88d4fde116100c1578063e985e9c51161007a578063e985e9c5146107bc578063eb8d72b714610805578063f0292a0314610825578063f2fde38b1461083b578063f3f56aa51461085b578063fe60d12c1461087b57600080fd5b8063b88d4fde1461072b578063c87b56dd1461074b578063cf1faaad1461076b578063cf89fa0314610781578063d1deba1f14610794578063d3dd5fe0146107a757600080fd5b8063932d5bf811610113578063932d5bf814610687578063943fb872146106a157806395d89b41146106c15780639cd3c6b2146106d6578063a22cb465146106eb578063b2bdfa7b1461070b57600080fd5b80637f35d634146105955780638467be0d146105b55780638d859f3e146105c85780638da5cb5b146105de5780638ee74912146105fc57806391b7f5ed1461066757600080fd5b80632f745c59116101fe57806355f804b3116101b757806355f804b3146104ea5780636352211e1461050a57806370a082311461052a578063715018a61461054a5780637533d7881461055f57806375794a3c1461057f57600080fd5b80632f745c59146104365780633c0a1d09146104565780633ccfd60b1461047657806342842e0e1461048b57806344b28d59146104ab5780634f6ccce7146104ca57600080fd5b80631249c58b116102505780631249c58b1461038c57806318160ddd146103945780631c37a822146103a95780631e7269c5146103c957806323b872dd146103f65780632d6e71b61461041657600080fd5b80621d35671461029757806301ffc9a7146102b957806306fdde03146102ee578063081812fc14610310578063095ea7b3146103485780630f2cdd6c14610368575b600080fd5b3480156102a357600080fd5b506102b76102b2366004612f8f565b610891565b005b3480156102c557600080fd5b506102d96102d4366004612dbf565b610a8b565b60405190151581526020015b60405180910390f35b3480156102fa57600080fd5b50610303610a9c565b6040516102e591906131cb565b34801561031c57600080fd5b5061033061032b366004613023565b610b2e565b6040516001600160a01b0390911681526020016102e5565b34801561035457600080fd5b506102b7610363366004612d93565b610bc3565b34801561037457600080fd5b5061037e60125481565b6040519081526020016102e5565b6102b7610cd9565b3480156103a057600080fd5b5060095461037e565b3480156103b557600080fd5b506102b76103c4366004612f8f565b610e3a565b3480156103d557600080fd5b5061037e6103e4366004612c30565b60166020526000908152604090205481565b34801561040257600080fd5b506102b7610411366004612cb4565b610ea9565b34801561042257600080fd5b506102b7610431366004613023565b610eda565b34801561044257600080fd5b5061037e610451366004612d93565b610f09565b34801561046257600080fd5b506102b761047136600461303c565b610f9f565b34801561048257600080fd5b506102b76110a4565b34801561049757600080fd5b506102b76104a6366004612cb4565b611252565b3480156104b757600080fd5b506017546102d990610100900460ff1681565b3480156104d657600080fd5b5061037e6104e5366004613023565b61126d565b3480156104f657600080fd5b506102b7610505366004612df9565b611300565b34801561051657600080fd5b50610330610525366004613023565b611341565b34801561053657600080fd5b5061037e610545366004612c30565b6113b8565b34801561055657600080fd5b506102b761143f565b34801561056b57600080fd5b5061030361057a366004612e41565b611475565b34801561058b57600080fd5b5061037e60105481565b3480156105a157600080fd5b5061037e6105b0366004612e41565b61150f565b6102b76105c3366004613023565b61159f565b3480156105d457600080fd5b5061037e60135481565b3480156105ea57600080fd5b506000546001600160a01b0316610330565b34801561060857600080fd5b50610652610617366004612eae565b600c60209081526000938452604080852084518086018401805192815290840195840195909520945292905282529020805460019091015482565b604080519283526020830191909152016102e5565b34801561067357600080fd5b506102b7610682366004613023565b611745565b34801561069357600080fd5b506017546102d99060ff1681565b3480156106ad57600080fd5b506102b76106bc366004613023565b611774565b3480156106cd57600080fd5b506103036117a3565b3480156106e257600080fd5b506102b76117b2565b3480156106f757600080fd5b506102b7610706366004612d60565b6117f0565b34801561071757600080fd5b50600e54610330906001600160a01b031681565b34801561073757600080fd5b506102b7610746366004612cf5565b6117fb565b34801561075757600080fd5b50610303610766366004613023565b61182d565b34801561077757600080fd5b5061037e60145481565b6102b761078f366004613007565b611908565b6102b76107a2366004612f04565b611be5565b3480156107b357600080fd5b506102b7611d72565b3480156107c857600080fd5b506102d96107d7366004612c7b565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561081157600080fd5b506102b7610820366004612e5c565b611db9565b34801561083157600080fd5b5061037e60115481565b34801561084757600080fd5b506102b7610856366004612c30565b611e01565b34801561086757600080fd5b506102b7610876366004613023565b611e9c565b34801561088757600080fd5b5061037e60155481565b600b546001600160a01b031633146108a857600080fd5b61ffff84166000908152600d6020526040902080546108c6906135ee565b90508351148015610905575061ffff84166000908152600d60205260409081902090516108f391906130dd565b60405180910390208380519060200120145b6109735760405162461bcd60e51b815260206004820152603460248201527f4e6f6e626c6f636b696e6752656365697665723a20696e76616c696420736f756044820152731c98d9481cd95b991a5b99c818dbdb9d1c9858dd60621b60648201526084015b60405180910390fd5b604051630e1bd41160e11b81523090631c37a8229061099c908790879087908790600401613437565b600060405180830381600087803b1580156109b657600080fd5b505af19250505080156109c7575060015b610a85576040518060400160405280825181526020018280519060200120815250600c60008661ffff1661ffff16815260200190815260200160002084604051610a1191906130c1565b9081526040805191829003602090810183206001600160401b038716600090815290825291909120835181559201516001909201919091557fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d90610a7c908690869086908690613437565b60405180910390a15b50505050565b6000610a9682611ecb565b92915050565b606060018054610aab906135ee565b80601f0160208091040260200160405190810160405280929190818152602001828054610ad7906135ee565b8015610b245780601f10610af957610100808354040283529160200191610b24565b820191906000526020600020905b815481529060010190602001808311610b0757829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b0316610ba75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161096a565b506000908152600560205260409020546001600160a01b031690565b6000610bce82611341565b9050806001600160a01b0316836001600160a01b03161415610c3c5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161096a565b336001600160a01b0382161480610c585750610c5881336107d7565b610cca5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161096a565b610cd48383611ef0565b505050565b601754610100900460ff16610d275760405162461bcd60e51b81526020600482015260146024820152734d696e74206e6f7420617661696c61626c65212160601b604482015260640161096a565b601354341015610d795760405162461bcd60e51b815260206004820152601e60248201527f496e73756666696369656e74204d494e5420616d6f75742073656e7421210000604482015260640161096a565b601554601154610d8991906135ab565b6010541115610daa5760405162461bcd60e51b815260040161096a90613230565b6012543360009081526016602052604090205410610dda5760405162461bcd60e51b815260040161096a90613230565b60108054610df9913391906000610df083613629565b91905055611f5e565b336000908152601660205260408120805460019290610e19908490613560565b92505081905550600160146000828254610e339190613560565b9091555050565b333014610e9d5760405162461bcd60e51b815260206004820152602b60248201527f4e6f6e626c6f636b696e6752656365697665723a2063616c6c6572206d75737460448201526a10313290213934b233b29760a91b606482015260840161096a565b610a8584848484611f78565b610eb33382611fa5565b610ecf5760405162461bcd60e51b815260040161096a906132d3565b610cd483838361209c565b6000546001600160a01b03163314610f045760405162461bcd60e51b815260040161096a90613267565b601555565b6000610f14836113b8565b8210610f765760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161096a565b506001600160a01b03919091166000908152600760209081526040808320938352929052205490565b6000546001600160a01b03163314610fc95760405162461bcd60e51b815260040161096a90613267565b601154610fd7906001613560565b82601054610fe59190613560565b11156110035760405162461bcd60e51b815260040161096a90613230565b8160155410156110555760405162461bcd60e51b815260206004820152601a60248201527f4d696e742065786365656473204d415820526573657276652121000000000000604482015260640161096a565b60005b828110156110885760108054611076918491906000610df083613629565b8061108081613629565b915050611058565b50816015600082825461109b91906135ab565b90915550505050565b4760007314cdf3e211fb6e5c6b714bf8061a765df08b267c6110c7606484613578565b6110d290604461358c565b604051600081818185875af1925050503d806000811461110e576040519150601f19603f3d011682016040523d82523d6000602084013e611113565b606091505b50509050806111345760405162461bcd60e51b815260040161096a9061329c565b600073dc0100701fae7e2c608dbb59151bceab9f1541da611156606485613578565b61116190601161358c565b604051600081818185875af1925050503d806000811461119d576040519150601f19603f3d011682016040523d82523d6000602084013e6111a2565b606091505b50509050806111c35760405162461bcd60e51b815260040161096a9061329c565b60007377e5c0704d9681765d9c7204d66e5110c6556ddd6111e5606486613578565b6111f090600f61358c565b604051600081818185875af1925050503d806000811461122c576040519150601f19603f3d011682016040523d82523d6000602084013e611231565b606091505b5050905080610a855760405162461bcd60e51b815260040161096a9061329c565b610cd4838383604051806020016040528060008152506117fb565b600061127860095490565b82106112db5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161096a565b600982815481106112ee576112ee61369a565b90600052602060002001549050919050565b6000546001600160a01b0316331461132a5760405162461bcd60e51b815260040161096a90613267565b805161133d90600f906020840190612a18565b5050565b6000818152600360205260408120546001600160a01b031680610a965760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161096a565b60006001600160a01b0382166114235760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161096a565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b031633146114695760405162461bcd60e51b815260040161096a90613267565b6114736000612247565b565b600d602052600090815260409020805461148e906135ee565b80601f01602080910402602001604051908101604052809291908181526020018280546114ba906135ee565b80156115075780601f106114dc57610100808354040283529160200191611507565b820191906000526020600020905b8154815290600101906020018083116114ea57829003601f168201915b505050505081565b600b5460405163040a7bb160e41b815260009182916001600160a01b03909116906340a7bb109061154890869030908690600401613378565b604080518083038186803b15801561155f57600080fd5b505afa158015611573573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115979190613061565b509392505050565b60175460ff166115f15760405162461bcd60e51b815260206004820152601860248201527f4261746368206d696e742069732064697361626c656421210000000000000000604482015260640161096a565b806013546115ff919061358c565b34101561164e5760405162461bcd60e51b815260206004820152601e60248201527f496e73756666696369656e74204d494e5420616d6f75742073656e7421210000604482015260640161096a565b60155460115461165f906001613560565b61166991906135ab565b816010546116779190613560565b11156116955760405162461bcd60e51b815260040161096a90613230565b601254336000908152601660205260409020546116b3908390613560565b11156116d15760405162461bcd60e51b815260040161096a90613230565b60005b8181101561170457601080546116f2913391906000610df083613629565b806116fc81613629565b9150506116d4565b503360009081526016602052604081208054839290611724908490613560565b92505081905550806014600082825461173d9190613560565b909155505050565b6000546001600160a01b0316331461176f5760405162461bcd60e51b815260040161096a90613267565b601355565b6000546001600160a01b0316331461179e5760405162461bcd60e51b815260040161096a90613267565b601855565b606060028054610aab906135ee565b6000546001600160a01b031633146117dc5760405162461bcd60e51b815260040161096a90613267565b6017805460ff19811660ff90911615179055565b61133d338383612297565b6118053383611fa5565b6118215760405162461bcd60e51b815260040161096a906132d3565b610a8584848484612366565b6000818152600360205260409020546060906001600160a01b03166118ac5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161096a565b60006118b6612399565b905060008151116118d65760405180602001604052806000815250611901565b806118e0846123a8565b6040516020016118f192919061314f565b6040516020818303038152906040525b9392505050565b61191181611341565b6001600160a01b0316336001600160a01b03161461197c5760405162461bcd60e51b815260206004820152602260248201527f596f75206d757374206f776e2074686520746f6b656e20746f20747261766572604482015261736560f01b606482015260840161096a565b61ffff82166000908152600d60205260408120805461199a906135ee565b905011611a005760405162461bcd60e51b815260206004820152602e60248201527f5468697320636861696e2069732063757272656e746c7920756e617661696c6160448201526d189b1948199bdc881d1c985d995b60921b606482015260840161096a565b611a09816124a5565b60408051336020820152808201839052815180820383018152606082018352601854600160f01b60808401526082808401919091528351808403909101815260a2830193849052600b5463040a7bb160e41b90945290926001926000916001600160a01b0316906340a7bb1090611a8c908990309089908790899060a601613324565b604080518083038186803b158015611aa357600080fd5b505afa158015611ab7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611adb9190613061565b50905080341015611b605760405162461bcd60e51b815260206004820152604360248201527f6d73672e76616c7565206e6f7420656e6f75676820746f20636f766572206d6560448201527f73736167654665652e2053656e642067617320666f72206d657373616765206660648201526265657360e81b608482015260a40161096a565b600b5461ffff87166000908152600d6020526040808220905162c5803160e81b81526001600160a01b039093169263c5803100923492611bab928c928b913391908b90600401613480565b6000604051808303818588803b158015611bc457600080fd5b505af1158015611bd8573d6000803e3d6000fd5b5050505050505050505050565b61ffff85166000908152600c60205260408082209051611c069087906130c1565b90815260408051602092819003830190206001600160401b0387166000908152925290206001810154909150611c8d5760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e6752656365697665723a206e6f2073746f726564206d60448201526565737361676560d01b606482015260840161096a565b805482148015611cb7575080600101548383604051611cad9291906130b1565b6040518091039020145b611d035760405162461bcd60e51b815260206004820152601a60248201527f4c617965725a65726f3a20696e76616c6964207061796c6f6164000000000000604482015260640161096a565b60008082556001820155604051630e1bd41160e11b81523090631c37a82290611d3890899089908990899089906004016133d6565b600060405180830381600087803b158015611d5257600080fd5b505af1158015611d66573d6000803e3d6000fd5b50505050505050505050565b6000546001600160a01b03163314611d9c5760405162461bcd60e51b815260040161096a90613267565b6017805461ff001981166101009182900460ff1615909102179055565b6000546001600160a01b03163314611de35760405162461bcd60e51b815260040161096a90613267565b61ffff83166000908152600d60205260409020610a85908383612a9c565b6000546001600160a01b03163314611e2b5760405162461bcd60e51b815260040161096a90613267565b6001600160a01b038116611e905760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161096a565b611e9981612247565b50565b6000546001600160a01b03163314611ec65760405162461bcd60e51b815260040161096a90613267565b601255565b60006001600160e01b0319821663780e9d6360e01b1480610a965750610a968261254c565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611f2582611341565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61133d82826040518060200160405280600081525061259c565b60008082806020019051810190611f8f9190612c4d565b91509150611f9d8282611f5e565b505050505050565b6000818152600360205260408120546001600160a01b031661201e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161096a565b600061202983611341565b9050806001600160a01b0316846001600160a01b031614806120645750836001600160a01b031661205984610b2e565b6001600160a01b0316145b8061209457506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166120af82611341565b6001600160a01b0316146121175760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161096a565b6001600160a01b0382166121795760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161096a565b6121848383836125cf565b61218f600082611ef0565b6001600160a01b03831660009081526004602052604081208054600192906121b89084906135ab565b90915550506001600160a01b03821660009081526004602052604081208054600192906121e6908490613560565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b031614156122f95760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161096a565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61237184848461209c565b61237d848484846125da565b610a855760405162461bcd60e51b815260040161096a906131de565b6060600f8054610aab906135ee565b6060816123cc5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156123f657806123e081613629565b91506123ef9050600a83613578565b91506123d0565b6000816001600160401b03811115612410576124106136b0565b6040519080825280601f01601f19166020018201604052801561243a576020820181803683370190505b5090505b84156120945761244f6001836135ab565b915061245c600a86613644565b612467906030613560565b60f81b81838151811061247c5761247c61369a565b60200101906001600160f81b031916908160001a90535061249e600a86613578565b945061243e565b60006124b082611341565b90506124be816000846125cf565b6124c9600083611ef0565b6001600160a01b03811660009081526004602052604081208054600192906124f29084906135ab565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60006001600160e01b031982166380ac58cd60e01b148061257d57506001600160e01b03198216635b5e139f60e01b145b80610a9657506301ffc9a760e01b6001600160e01b0319831614610a96565b6125a683836126e7565b6125b360008484846125da565b610cd45760405162461bcd60e51b815260040161096a906131de565b610cd48383836127d0565b60006001600160a01b0384163b156126dc57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061261e90339089908890889060040161318e565b602060405180830381600087803b15801561263857600080fd5b505af1925050508015612668575060408051601f3d908101601f1916820190925261266591810190612ddc565b60015b6126c2573d808015612696576040519150601f19603f3d011682016040523d82523d6000602084013e61269b565b606091505b5080516126ba5760405162461bcd60e51b815260040161096a906131de565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612094565b506001949350505050565b6001600160a01b03821661273d5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161096a565b612749600083836125cf565b6001600160a01b0382166000908152600460205260408120805460019290612772908490613560565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160a01b03831661282b5761282681600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b61284e565b816001600160a01b0316836001600160a01b03161461284e5761284e8382612888565b6001600160a01b03821661286557610cd481612925565b826001600160a01b0316826001600160a01b031614610cd457610cd482826129d4565b60006001612895846113b8565b61289f91906135ab565b6000838152600860205260409020549091508082146128f2576001600160a01b03841660009081526007602090815260408083208584528252808320548484528184208190558352600890915290208190555b5060009182526008602090815260408084208490556001600160a01b039094168352600781528383209183525290812055565b600954600090612937906001906135ab565b6000838152600a60205260408120546009805493945090928490811061295f5761295f61369a565b9060005260206000200154905080600983815481106129805761298061369a565b6000918252602080832090910192909255828152600a909152604080822084905585825281205560098054806129b8576129b8613684565b6001900381819060005260206000200160009055905550505050565b60006129df836113b8565b6001600160a01b039093166000908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b828054612a24906135ee565b90600052602060002090601f016020900481019282612a465760008555612a8c565b82601f10612a5f57805160ff1916838001178555612a8c565b82800160010185558215612a8c579182015b82811115612a8c578251825591602001919060010190612a71565b50612a98929150612b10565b5090565b828054612aa8906135ee565b90600052602060002090601f016020900481019282612aca5760008555612a8c565b82601f10612ae35782800160ff19823516178555612a8c565b82800160010185558215612a8c579182015b82811115612a8c578235825591602001919060010190612af5565b5b80821115612a985760008155600101612b11565b60006001600160401b0380841115612b3f57612b3f6136b0565b604051601f8501601f19908116603f01168101908282118183101715612b6757612b676136b0565b81604052809350858152868686011115612b8057600080fd5b858560208301376000602087830101525050509392505050565b60008083601f840112612bac57600080fd5b5081356001600160401b03811115612bc357600080fd5b602083019150836020828501011115612bdb57600080fd5b9250929050565b600082601f830112612bf357600080fd5b61190183833560208501612b25565b803561ffff81168114612c1457600080fd5b919050565b80356001600160401b0381168114612c1457600080fd5b600060208284031215612c4257600080fd5b8135611901816136c6565b60008060408385031215612c6057600080fd5b8251612c6b816136c6565b6020939093015192949293505050565b60008060408385031215612c8e57600080fd5b8235612c99816136c6565b91506020830135612ca9816136c6565b809150509250929050565b600080600060608486031215612cc957600080fd5b8335612cd4816136c6565b92506020840135612ce4816136c6565b929592945050506040919091013590565b60008060008060808587031215612d0b57600080fd5b8435612d16816136c6565b93506020850135612d26816136c6565b92506040850135915060608501356001600160401b03811115612d4857600080fd5b612d5487828801612be2565b91505092959194509250565b60008060408385031215612d7357600080fd5b8235612d7e816136c6565b915060208301358015158114612ca957600080fd5b60008060408385031215612da657600080fd5b8235612db1816136c6565b946020939093013593505050565b600060208284031215612dd157600080fd5b8135611901816136db565b600060208284031215612dee57600080fd5b8151611901816136db565b600060208284031215612e0b57600080fd5b81356001600160401b03811115612e2157600080fd5b8201601f81018413612e3257600080fd5b61209484823560208401612b25565b600060208284031215612e5357600080fd5b61190182612c02565b600080600060408486031215612e7157600080fd5b612e7a84612c02565b925060208401356001600160401b03811115612e9557600080fd5b612ea186828701612b9a565b9497909650939450505050565b600080600060608486031215612ec357600080fd5b612ecc84612c02565b925060208401356001600160401b03811115612ee757600080fd5b612ef386828701612be2565b925050604084013590509250925092565b600080600080600060808688031215612f1c57600080fd5b612f2586612c02565b945060208601356001600160401b0380821115612f4157600080fd5b612f4d89838a01612be2565b9550612f5b60408901612c19565b94506060880135915080821115612f7157600080fd5b50612f7e88828901612b9a565b969995985093965092949392505050565b60008060008060808587031215612fa557600080fd5b612fae85612c02565b935060208501356001600160401b0380821115612fca57600080fd5b612fd688838901612be2565b9450612fe460408801612c19565b93506060870135915080821115612ffa57600080fd5b50612d5487828801612be2565b6000806040838503121561301a57600080fd5b612db183612c02565b60006020828403121561303557600080fd5b5035919050565b6000806040838503121561304f57600080fd5b823591506020830135612ca9816136c6565b6000806040838503121561307457600080fd5b505080516020909101519092909150565b6000815180845261309d8160208601602086016135c2565b601f01601f19169290920160200192915050565b8183823760009101908152919050565b600082516130d38184602087016135c2565b9190910192915050565b60008083546130eb816135ee565b60018281168015613103576001811461311457613143565b60ff19841687528287019450613143565b8760005260208060002060005b8581101561313a5781548a820152908401908201613121565b50505082870194505b50929695505050505050565b600083516131618184602088016135c2565b8351908301906131758183602088016135c2565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906131c190830184613085565b9695505050505050565b6020815260006119016020830184613085565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252601b908201527f4d696e742065786365656473204d4158205175616e7469747921210000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526018908201527f4661696c656420746f2077697468647261772045746865720000000000000000604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b61ffff861681526001600160a01b038516602082015260a06040820181905260009061335290830186613085565b8415156060840152828103608084015261336c8185613085565b98975050505050505050565b61ffff841681526001600160a01b038316602082015260a06040820181905260029082015261060f60f31b60c0820152600060e08201831515606084015282810360808401526002815261060f60f31b6020820152604081016131c1565b61ffff861681526080602082015260006133f36080830187613085565b6001600160401b03861660408401528281036060840152838152838560208301376000602085830101526020601f19601f8601168201019150509695505050505050565b61ffff851681526080602082015260006134546080830186613085565b6001600160401b038516604084015282810360608401526134758185613085565b979650505050505050565b61ffff871681526000602060c0818401526000885461349e816135ee565b8060c087015260e06001808416600081146134c057600181146134d557613503565b60ff1985168984015261010089019550613503565b8d6000528660002060005b858110156134fb5781548b82018601529083019088016134e0565b8a0184019650505b5050505050838103604085015261351a8189613085565b91505061353260608401876001600160a01b03169052565b6001600160a01b038516608084015282810360a08401526135538185613085565b9998505050505050505050565b6000821982111561357357613573613658565b500190565b6000826135875761358761366e565b500490565b60008160001904831182151516156135a6576135a6613658565b500290565b6000828210156135bd576135bd613658565b500390565b60005b838110156135dd5781810151838201526020016135c5565b83811115610a855750506000910152565b600181811c9082168061360257607f821691505b6020821081141561362357634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561363d5761363d613658565b5060010190565b6000826136535761365361366e565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611e9957600080fd5b6001600160e01b031981168114611e9957600080fdfea26469706673582212206d7d079b1466b39536964b74a9e428970aa80a37d60b345de6a34ea0d26ecfb164736f6c6343000807003368747470733a2f2f66697368626167732d6e66742d64656661756c742d727464622e6669726562617365696f2e636f6d2f6d657461646174612f6574682f

Deployed Bytecode

0x6080604052600436106102925760003560e01c80637f35d6341161015a578063b88d4fde116100c1578063e985e9c51161007a578063e985e9c5146107bc578063eb8d72b714610805578063f0292a0314610825578063f2fde38b1461083b578063f3f56aa51461085b578063fe60d12c1461087b57600080fd5b8063b88d4fde1461072b578063c87b56dd1461074b578063cf1faaad1461076b578063cf89fa0314610781578063d1deba1f14610794578063d3dd5fe0146107a757600080fd5b8063932d5bf811610113578063932d5bf814610687578063943fb872146106a157806395d89b41146106c15780639cd3c6b2146106d6578063a22cb465146106eb578063b2bdfa7b1461070b57600080fd5b80637f35d634146105955780638467be0d146105b55780638d859f3e146105c85780638da5cb5b146105de5780638ee74912146105fc57806391b7f5ed1461066757600080fd5b80632f745c59116101fe57806355f804b3116101b757806355f804b3146104ea5780636352211e1461050a57806370a082311461052a578063715018a61461054a5780637533d7881461055f57806375794a3c1461057f57600080fd5b80632f745c59146104365780633c0a1d09146104565780633ccfd60b1461047657806342842e0e1461048b57806344b28d59146104ab5780634f6ccce7146104ca57600080fd5b80631249c58b116102505780631249c58b1461038c57806318160ddd146103945780631c37a822146103a95780631e7269c5146103c957806323b872dd146103f65780632d6e71b61461041657600080fd5b80621d35671461029757806301ffc9a7146102b957806306fdde03146102ee578063081812fc14610310578063095ea7b3146103485780630f2cdd6c14610368575b600080fd5b3480156102a357600080fd5b506102b76102b2366004612f8f565b610891565b005b3480156102c557600080fd5b506102d96102d4366004612dbf565b610a8b565b60405190151581526020015b60405180910390f35b3480156102fa57600080fd5b50610303610a9c565b6040516102e591906131cb565b34801561031c57600080fd5b5061033061032b366004613023565b610b2e565b6040516001600160a01b0390911681526020016102e5565b34801561035457600080fd5b506102b7610363366004612d93565b610bc3565b34801561037457600080fd5b5061037e60125481565b6040519081526020016102e5565b6102b7610cd9565b3480156103a057600080fd5b5060095461037e565b3480156103b557600080fd5b506102b76103c4366004612f8f565b610e3a565b3480156103d557600080fd5b5061037e6103e4366004612c30565b60166020526000908152604090205481565b34801561040257600080fd5b506102b7610411366004612cb4565b610ea9565b34801561042257600080fd5b506102b7610431366004613023565b610eda565b34801561044257600080fd5b5061037e610451366004612d93565b610f09565b34801561046257600080fd5b506102b761047136600461303c565b610f9f565b34801561048257600080fd5b506102b76110a4565b34801561049757600080fd5b506102b76104a6366004612cb4565b611252565b3480156104b757600080fd5b506017546102d990610100900460ff1681565b3480156104d657600080fd5b5061037e6104e5366004613023565b61126d565b3480156104f657600080fd5b506102b7610505366004612df9565b611300565b34801561051657600080fd5b50610330610525366004613023565b611341565b34801561053657600080fd5b5061037e610545366004612c30565b6113b8565b34801561055657600080fd5b506102b761143f565b34801561056b57600080fd5b5061030361057a366004612e41565b611475565b34801561058b57600080fd5b5061037e60105481565b3480156105a157600080fd5b5061037e6105b0366004612e41565b61150f565b6102b76105c3366004613023565b61159f565b3480156105d457600080fd5b5061037e60135481565b3480156105ea57600080fd5b506000546001600160a01b0316610330565b34801561060857600080fd5b50610652610617366004612eae565b600c60209081526000938452604080852084518086018401805192815290840195840195909520945292905282529020805460019091015482565b604080519283526020830191909152016102e5565b34801561067357600080fd5b506102b7610682366004613023565b611745565b34801561069357600080fd5b506017546102d99060ff1681565b3480156106ad57600080fd5b506102b76106bc366004613023565b611774565b3480156106cd57600080fd5b506103036117a3565b3480156106e257600080fd5b506102b76117b2565b3480156106f757600080fd5b506102b7610706366004612d60565b6117f0565b34801561071757600080fd5b50600e54610330906001600160a01b031681565b34801561073757600080fd5b506102b7610746366004612cf5565b6117fb565b34801561075757600080fd5b50610303610766366004613023565b61182d565b34801561077757600080fd5b5061037e60145481565b6102b761078f366004613007565b611908565b6102b76107a2366004612f04565b611be5565b3480156107b357600080fd5b506102b7611d72565b3480156107c857600080fd5b506102d96107d7366004612c7b565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561081157600080fd5b506102b7610820366004612e5c565b611db9565b34801561083157600080fd5b5061037e60115481565b34801561084757600080fd5b506102b7610856366004612c30565b611e01565b34801561086757600080fd5b506102b7610876366004613023565b611e9c565b34801561088757600080fd5b5061037e60155481565b600b546001600160a01b031633146108a857600080fd5b61ffff84166000908152600d6020526040902080546108c6906135ee565b90508351148015610905575061ffff84166000908152600d60205260409081902090516108f391906130dd565b60405180910390208380519060200120145b6109735760405162461bcd60e51b815260206004820152603460248201527f4e6f6e626c6f636b696e6752656365697665723a20696e76616c696420736f756044820152731c98d9481cd95b991a5b99c818dbdb9d1c9858dd60621b60648201526084015b60405180910390fd5b604051630e1bd41160e11b81523090631c37a8229061099c908790879087908790600401613437565b600060405180830381600087803b1580156109b657600080fd5b505af19250505080156109c7575060015b610a85576040518060400160405280825181526020018280519060200120815250600c60008661ffff1661ffff16815260200190815260200160002084604051610a1191906130c1565b9081526040805191829003602090810183206001600160401b038716600090815290825291909120835181559201516001909201919091557fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d90610a7c908690869086908690613437565b60405180910390a15b50505050565b6000610a9682611ecb565b92915050565b606060018054610aab906135ee565b80601f0160208091040260200160405190810160405280929190818152602001828054610ad7906135ee565b8015610b245780601f10610af957610100808354040283529160200191610b24565b820191906000526020600020905b815481529060010190602001808311610b0757829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b0316610ba75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161096a565b506000908152600560205260409020546001600160a01b031690565b6000610bce82611341565b9050806001600160a01b0316836001600160a01b03161415610c3c5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161096a565b336001600160a01b0382161480610c585750610c5881336107d7565b610cca5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161096a565b610cd48383611ef0565b505050565b601754610100900460ff16610d275760405162461bcd60e51b81526020600482015260146024820152734d696e74206e6f7420617661696c61626c65212160601b604482015260640161096a565b601354341015610d795760405162461bcd60e51b815260206004820152601e60248201527f496e73756666696369656e74204d494e5420616d6f75742073656e7421210000604482015260640161096a565b601554601154610d8991906135ab565b6010541115610daa5760405162461bcd60e51b815260040161096a90613230565b6012543360009081526016602052604090205410610dda5760405162461bcd60e51b815260040161096a90613230565b60108054610df9913391906000610df083613629565b91905055611f5e565b336000908152601660205260408120805460019290610e19908490613560565b92505081905550600160146000828254610e339190613560565b9091555050565b333014610e9d5760405162461bcd60e51b815260206004820152602b60248201527f4e6f6e626c6f636b696e6752656365697665723a2063616c6c6572206d75737460448201526a10313290213934b233b29760a91b606482015260840161096a565b610a8584848484611f78565b610eb33382611fa5565b610ecf5760405162461bcd60e51b815260040161096a906132d3565b610cd483838361209c565b6000546001600160a01b03163314610f045760405162461bcd60e51b815260040161096a90613267565b601555565b6000610f14836113b8565b8210610f765760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161096a565b506001600160a01b03919091166000908152600760209081526040808320938352929052205490565b6000546001600160a01b03163314610fc95760405162461bcd60e51b815260040161096a90613267565b601154610fd7906001613560565b82601054610fe59190613560565b11156110035760405162461bcd60e51b815260040161096a90613230565b8160155410156110555760405162461bcd60e51b815260206004820152601a60248201527f4d696e742065786365656473204d415820526573657276652121000000000000604482015260640161096a565b60005b828110156110885760108054611076918491906000610df083613629565b8061108081613629565b915050611058565b50816015600082825461109b91906135ab565b90915550505050565b4760007314cdf3e211fb6e5c6b714bf8061a765df08b267c6110c7606484613578565b6110d290604461358c565b604051600081818185875af1925050503d806000811461110e576040519150601f19603f3d011682016040523d82523d6000602084013e611113565b606091505b50509050806111345760405162461bcd60e51b815260040161096a9061329c565b600073dc0100701fae7e2c608dbb59151bceab9f1541da611156606485613578565b61116190601161358c565b604051600081818185875af1925050503d806000811461119d576040519150601f19603f3d011682016040523d82523d6000602084013e6111a2565b606091505b50509050806111c35760405162461bcd60e51b815260040161096a9061329c565b60007377e5c0704d9681765d9c7204d66e5110c6556ddd6111e5606486613578565b6111f090600f61358c565b604051600081818185875af1925050503d806000811461122c576040519150601f19603f3d011682016040523d82523d6000602084013e611231565b606091505b5050905080610a855760405162461bcd60e51b815260040161096a9061329c565b610cd4838383604051806020016040528060008152506117fb565b600061127860095490565b82106112db5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161096a565b600982815481106112ee576112ee61369a565b90600052602060002001549050919050565b6000546001600160a01b0316331461132a5760405162461bcd60e51b815260040161096a90613267565b805161133d90600f906020840190612a18565b5050565b6000818152600360205260408120546001600160a01b031680610a965760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161096a565b60006001600160a01b0382166114235760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161096a565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b031633146114695760405162461bcd60e51b815260040161096a90613267565b6114736000612247565b565b600d602052600090815260409020805461148e906135ee565b80601f01602080910402602001604051908101604052809291908181526020018280546114ba906135ee565b80156115075780601f106114dc57610100808354040283529160200191611507565b820191906000526020600020905b8154815290600101906020018083116114ea57829003601f168201915b505050505081565b600b5460405163040a7bb160e41b815260009182916001600160a01b03909116906340a7bb109061154890869030908690600401613378565b604080518083038186803b15801561155f57600080fd5b505afa158015611573573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115979190613061565b509392505050565b60175460ff166115f15760405162461bcd60e51b815260206004820152601860248201527f4261746368206d696e742069732064697361626c656421210000000000000000604482015260640161096a565b806013546115ff919061358c565b34101561164e5760405162461bcd60e51b815260206004820152601e60248201527f496e73756666696369656e74204d494e5420616d6f75742073656e7421210000604482015260640161096a565b60155460115461165f906001613560565b61166991906135ab565b816010546116779190613560565b11156116955760405162461bcd60e51b815260040161096a90613230565b601254336000908152601660205260409020546116b3908390613560565b11156116d15760405162461bcd60e51b815260040161096a90613230565b60005b8181101561170457601080546116f2913391906000610df083613629565b806116fc81613629565b9150506116d4565b503360009081526016602052604081208054839290611724908490613560565b92505081905550806014600082825461173d9190613560565b909155505050565b6000546001600160a01b0316331461176f5760405162461bcd60e51b815260040161096a90613267565b601355565b6000546001600160a01b0316331461179e5760405162461bcd60e51b815260040161096a90613267565b601855565b606060028054610aab906135ee565b6000546001600160a01b031633146117dc5760405162461bcd60e51b815260040161096a90613267565b6017805460ff19811660ff90911615179055565b61133d338383612297565b6118053383611fa5565b6118215760405162461bcd60e51b815260040161096a906132d3565b610a8584848484612366565b6000818152600360205260409020546060906001600160a01b03166118ac5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161096a565b60006118b6612399565b905060008151116118d65760405180602001604052806000815250611901565b806118e0846123a8565b6040516020016118f192919061314f565b6040516020818303038152906040525b9392505050565b61191181611341565b6001600160a01b0316336001600160a01b03161461197c5760405162461bcd60e51b815260206004820152602260248201527f596f75206d757374206f776e2074686520746f6b656e20746f20747261766572604482015261736560f01b606482015260840161096a565b61ffff82166000908152600d60205260408120805461199a906135ee565b905011611a005760405162461bcd60e51b815260206004820152602e60248201527f5468697320636861696e2069732063757272656e746c7920756e617661696c6160448201526d189b1948199bdc881d1c985d995b60921b606482015260840161096a565b611a09816124a5565b60408051336020820152808201839052815180820383018152606082018352601854600160f01b60808401526082808401919091528351808403909101815260a2830193849052600b5463040a7bb160e41b90945290926001926000916001600160a01b0316906340a7bb1090611a8c908990309089908790899060a601613324565b604080518083038186803b158015611aa357600080fd5b505afa158015611ab7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611adb9190613061565b50905080341015611b605760405162461bcd60e51b815260206004820152604360248201527f6d73672e76616c7565206e6f7420656e6f75676820746f20636f766572206d6560448201527f73736167654665652e2053656e642067617320666f72206d657373616765206660648201526265657360e81b608482015260a40161096a565b600b5461ffff87166000908152600d6020526040808220905162c5803160e81b81526001600160a01b039093169263c5803100923492611bab928c928b913391908b90600401613480565b6000604051808303818588803b158015611bc457600080fd5b505af1158015611bd8573d6000803e3d6000fd5b5050505050505050505050565b61ffff85166000908152600c60205260408082209051611c069087906130c1565b90815260408051602092819003830190206001600160401b0387166000908152925290206001810154909150611c8d5760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e6752656365697665723a206e6f2073746f726564206d60448201526565737361676560d01b606482015260840161096a565b805482148015611cb7575080600101548383604051611cad9291906130b1565b6040518091039020145b611d035760405162461bcd60e51b815260206004820152601a60248201527f4c617965725a65726f3a20696e76616c6964207061796c6f6164000000000000604482015260640161096a565b60008082556001820155604051630e1bd41160e11b81523090631c37a82290611d3890899089908990899089906004016133d6565b600060405180830381600087803b158015611d5257600080fd5b505af1158015611d66573d6000803e3d6000fd5b50505050505050505050565b6000546001600160a01b03163314611d9c5760405162461bcd60e51b815260040161096a90613267565b6017805461ff001981166101009182900460ff1615909102179055565b6000546001600160a01b03163314611de35760405162461bcd60e51b815260040161096a90613267565b61ffff83166000908152600d60205260409020610a85908383612a9c565b6000546001600160a01b03163314611e2b5760405162461bcd60e51b815260040161096a90613267565b6001600160a01b038116611e905760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161096a565b611e9981612247565b50565b6000546001600160a01b03163314611ec65760405162461bcd60e51b815260040161096a90613267565b601255565b60006001600160e01b0319821663780e9d6360e01b1480610a965750610a968261254c565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611f2582611341565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61133d82826040518060200160405280600081525061259c565b60008082806020019051810190611f8f9190612c4d565b91509150611f9d8282611f5e565b505050505050565b6000818152600360205260408120546001600160a01b031661201e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161096a565b600061202983611341565b9050806001600160a01b0316846001600160a01b031614806120645750836001600160a01b031661205984610b2e565b6001600160a01b0316145b8061209457506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166120af82611341565b6001600160a01b0316146121175760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161096a565b6001600160a01b0382166121795760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161096a565b6121848383836125cf565b61218f600082611ef0565b6001600160a01b03831660009081526004602052604081208054600192906121b89084906135ab565b90915550506001600160a01b03821660009081526004602052604081208054600192906121e6908490613560565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b031614156122f95760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161096a565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61237184848461209c565b61237d848484846125da565b610a855760405162461bcd60e51b815260040161096a906131de565b6060600f8054610aab906135ee565b6060816123cc5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156123f657806123e081613629565b91506123ef9050600a83613578565b91506123d0565b6000816001600160401b03811115612410576124106136b0565b6040519080825280601f01601f19166020018201604052801561243a576020820181803683370190505b5090505b84156120945761244f6001836135ab565b915061245c600a86613644565b612467906030613560565b60f81b81838151811061247c5761247c61369a565b60200101906001600160f81b031916908160001a90535061249e600a86613578565b945061243e565b60006124b082611341565b90506124be816000846125cf565b6124c9600083611ef0565b6001600160a01b03811660009081526004602052604081208054600192906124f29084906135ab565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60006001600160e01b031982166380ac58cd60e01b148061257d57506001600160e01b03198216635b5e139f60e01b145b80610a9657506301ffc9a760e01b6001600160e01b0319831614610a96565b6125a683836126e7565b6125b360008484846125da565b610cd45760405162461bcd60e51b815260040161096a906131de565b610cd48383836127d0565b60006001600160a01b0384163b156126dc57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061261e90339089908890889060040161318e565b602060405180830381600087803b15801561263857600080fd5b505af1925050508015612668575060408051601f3d908101601f1916820190925261266591810190612ddc565b60015b6126c2573d808015612696576040519150601f19603f3d011682016040523d82523d6000602084013e61269b565b606091505b5080516126ba5760405162461bcd60e51b815260040161096a906131de565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612094565b506001949350505050565b6001600160a01b03821661273d5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161096a565b612749600083836125cf565b6001600160a01b0382166000908152600460205260408120805460019290612772908490613560565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160a01b03831661282b5761282681600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b61284e565b816001600160a01b0316836001600160a01b03161461284e5761284e8382612888565b6001600160a01b03821661286557610cd481612925565b826001600160a01b0316826001600160a01b031614610cd457610cd482826129d4565b60006001612895846113b8565b61289f91906135ab565b6000838152600860205260409020549091508082146128f2576001600160a01b03841660009081526007602090815260408083208584528252808320548484528184208190558352600890915290208190555b5060009182526008602090815260408084208490556001600160a01b039094168352600781528383209183525290812055565b600954600090612937906001906135ab565b6000838152600a60205260408120546009805493945090928490811061295f5761295f61369a565b9060005260206000200154905080600983815481106129805761298061369a565b6000918252602080832090910192909255828152600a909152604080822084905585825281205560098054806129b8576129b8613684565b6001900381819060005260206000200160009055905550505050565b60006129df836113b8565b6001600160a01b039093166000908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b828054612a24906135ee565b90600052602060002090601f016020900481019282612a465760008555612a8c565b82601f10612a5f57805160ff1916838001178555612a8c565b82800160010185558215612a8c579182015b82811115612a8c578251825591602001919060010190612a71565b50612a98929150612b10565b5090565b828054612aa8906135ee565b90600052602060002090601f016020900481019282612aca5760008555612a8c565b82601f10612ae35782800160ff19823516178555612a8c565b82800160010185558215612a8c579182015b82811115612a8c578235825591602001919060010190612af5565b5b80821115612a985760008155600101612b11565b60006001600160401b0380841115612b3f57612b3f6136b0565b604051601f8501601f19908116603f01168101908282118183101715612b6757612b676136b0565b81604052809350858152868686011115612b8057600080fd5b858560208301376000602087830101525050509392505050565b60008083601f840112612bac57600080fd5b5081356001600160401b03811115612bc357600080fd5b602083019150836020828501011115612bdb57600080fd5b9250929050565b600082601f830112612bf357600080fd5b61190183833560208501612b25565b803561ffff81168114612c1457600080fd5b919050565b80356001600160401b0381168114612c1457600080fd5b600060208284031215612c4257600080fd5b8135611901816136c6565b60008060408385031215612c6057600080fd5b8251612c6b816136c6565b6020939093015192949293505050565b60008060408385031215612c8e57600080fd5b8235612c99816136c6565b91506020830135612ca9816136c6565b809150509250929050565b600080600060608486031215612cc957600080fd5b8335612cd4816136c6565b92506020840135612ce4816136c6565b929592945050506040919091013590565b60008060008060808587031215612d0b57600080fd5b8435612d16816136c6565b93506020850135612d26816136c6565b92506040850135915060608501356001600160401b03811115612d4857600080fd5b612d5487828801612be2565b91505092959194509250565b60008060408385031215612d7357600080fd5b8235612d7e816136c6565b915060208301358015158114612ca957600080fd5b60008060408385031215612da657600080fd5b8235612db1816136c6565b946020939093013593505050565b600060208284031215612dd157600080fd5b8135611901816136db565b600060208284031215612dee57600080fd5b8151611901816136db565b600060208284031215612e0b57600080fd5b81356001600160401b03811115612e2157600080fd5b8201601f81018413612e3257600080fd5b61209484823560208401612b25565b600060208284031215612e5357600080fd5b61190182612c02565b600080600060408486031215612e7157600080fd5b612e7a84612c02565b925060208401356001600160401b03811115612e9557600080fd5b612ea186828701612b9a565b9497909650939450505050565b600080600060608486031215612ec357600080fd5b612ecc84612c02565b925060208401356001600160401b03811115612ee757600080fd5b612ef386828701612be2565b925050604084013590509250925092565b600080600080600060808688031215612f1c57600080fd5b612f2586612c02565b945060208601356001600160401b0380821115612f4157600080fd5b612f4d89838a01612be2565b9550612f5b60408901612c19565b94506060880135915080821115612f7157600080fd5b50612f7e88828901612b9a565b969995985093965092949392505050565b60008060008060808587031215612fa557600080fd5b612fae85612c02565b935060208501356001600160401b0380821115612fca57600080fd5b612fd688838901612be2565b9450612fe460408801612c19565b93506060870135915080821115612ffa57600080fd5b50612d5487828801612be2565b6000806040838503121561301a57600080fd5b612db183612c02565b60006020828403121561303557600080fd5b5035919050565b6000806040838503121561304f57600080fd5b823591506020830135612ca9816136c6565b6000806040838503121561307457600080fd5b505080516020909101519092909150565b6000815180845261309d8160208601602086016135c2565b601f01601f19169290920160200192915050565b8183823760009101908152919050565b600082516130d38184602087016135c2565b9190910192915050565b60008083546130eb816135ee565b60018281168015613103576001811461311457613143565b60ff19841687528287019450613143565b8760005260208060002060005b8581101561313a5781548a820152908401908201613121565b50505082870194505b50929695505050505050565b600083516131618184602088016135c2565b8351908301906131758183602088016135c2565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906131c190830184613085565b9695505050505050565b6020815260006119016020830184613085565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252601b908201527f4d696e742065786365656473204d4158205175616e7469747921210000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526018908201527f4661696c656420746f2077697468647261772045746865720000000000000000604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b61ffff861681526001600160a01b038516602082015260a06040820181905260009061335290830186613085565b8415156060840152828103608084015261336c8185613085565b98975050505050505050565b61ffff841681526001600160a01b038316602082015260a06040820181905260029082015261060f60f31b60c0820152600060e08201831515606084015282810360808401526002815261060f60f31b6020820152604081016131c1565b61ffff861681526080602082015260006133f36080830187613085565b6001600160401b03861660408401528281036060840152838152838560208301376000602085830101526020601f19601f8601168201019150509695505050505050565b61ffff851681526080602082015260006134546080830186613085565b6001600160401b038516604084015282810360608401526134758185613085565b979650505050505050565b61ffff871681526000602060c0818401526000885461349e816135ee565b8060c087015260e06001808416600081146134c057600181146134d557613503565b60ff1985168984015261010089019550613503565b8d6000528660002060005b858110156134fb5781548b82018601529083019088016134e0565b8a0184019650505b5050505050838103604085015261351a8189613085565b91505061353260608401876001600160a01b03169052565b6001600160a01b038516608084015282810360a08401526135538185613085565b9998505050505050505050565b6000821982111561357357613573613658565b500190565b6000826135875761358761366e565b500490565b60008160001904831182151516156135a6576135a6613658565b500290565b6000828210156135bd576135bd613658565b500390565b60005b838110156135dd5781810151838201526020016135c5565b83811115610a855750506000910152565b600181811c9082168061360257607f821691505b6020821081141561362357634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561363d5761363d613658565b5060010190565b6000826136535761365361366e565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611e9957600080fd5b6001600160e01b031981168114611e9957600080fdfea26469706673582212206d7d079b1466b39536964b74a9e428970aa80a37d60b345de6a34ea0d26ecfb164736f6c63430008070033

Deployed Bytecode Sourcemap

50422:6382:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47702:949;;;;;;;;;;-1:-1:-1;47702:949:0;;;;;:::i;:::-;;:::i;:::-;;56589:212;;;;;;;;;;-1:-1:-1;56589:212:0;;;;;:::i;:::-;;:::i;:::-;;;13170:14:1;;13163:22;13145:41;;13133:2;13118:18;56589:212:0;;;;;;;;28309:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;29876:221::-;;;;;;;;;;-1:-1:-1;29876:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;12189:32:1;;;12171:51;;12159:2;12144:18;29876:221:0;12025:203:1;29399:411:0;;;;;;;;;;-1:-1:-1;29399:411:0;;;;;:::i;:::-;;:::i;50643:34::-;;;;;;;;;;;;;;;;;;;29846:25:1;;;29834:2;29819:18;50643:34:0;29700:177:1;51769:449:0;;;:::i;41719:113::-;;;;;;;;;;-1:-1:-1;41807:10:0;:17;41719:113;;48659:356;;;;;;;;;;-1:-1:-1;48659:356:0;;;;;:::i;:::-;;:::i;50796:41::-;;;;;;;;;;-1:-1:-1;50796:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;30626:339;;;;;;;;;;-1:-1:-1;30626:339:0;;;;;:::i;:::-;;:::i;52546:80::-;;;;;;;;;;-1:-1:-1;52546:80:0;;;;;:::i;:::-;;:::i;41387:256::-;;;;;;;;;;-1:-1:-1;41387:256:0;;;;;:::i;:::-;;:::i;52226:312::-;;;;;;;;;;-1:-1:-1;52226:312:0;;;;;:::i;:::-;;:::i;55070:551::-;;;;;;;;;;;;;:::i;31036:185::-;;;;;;;;;;-1:-1:-1;31036:185:0;;;;;:::i;:::-;;:::i;50892:29::-;;;;;;;;;;-1:-1:-1;50892:29:0;;;;;;;;;;;41909:233;;;;;;;;;;-1:-1:-1;41909:233:0;;;;;:::i;:::-;;:::i;54972:90::-;;;;;;;;;;-1:-1:-1;54972:90:0;;;;;:::i;:::-;;:::i;28003:239::-;;;;;;;;;;-1:-1:-1;28003:239:0;;;;;:::i;:::-;;:::i;27733:208::-;;;;;;;;;;-1:-1:-1;27733:208:0;;;;;:::i;:::-;;:::i;11071:103::-;;;;;;;;;;;;;:::i;47544:51::-;;;;;;;;;;-1:-1:-1;47544:51:0;;;;;:::i;:::-;;:::i;50570:30::-;;;;;;;;;;;;;;;;53011:203;;;;;;;;;;-1:-1:-1;53011:203:0;;;;;:::i;:::-;;:::i;51241:520::-;;;;;;:::i;:::-;;:::i;50684:33::-;;;;;;;;;;;;;;;;10420:87;;;;;;;;;;-1:-1:-1;10466:7:0;10493:6;-1:-1:-1;;;;;10493:6:0;10420:87;;47447:90;;;;;;;;;;-1:-1:-1;47447:90:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30056:25:1;;;30112:2;30097:18;;30090:34;;;;30029:18;47447:90:0;29882:248:1;52634:74:0;;;;;;;;;;-1:-1:-1;52634:74:0;;;;;:::i;:::-;;:::i;50850:35::-;;;;;;;;;;-1:-1:-1;50850:35:0;;;;;;;;55705:125;;;;;;;;;;-1:-1:-1;55705:125:0;;;;;:::i;:::-;;:::i;28478:104::-;;;;;;;;;;;;;:::i;52716:97::-;;;;;;;;;;;;;:::i;30169:155::-;;;;;;;;;;-1:-1:-1;30169:155:0;;;;;:::i;:::-;;:::i;50507:21::-;;;;;;;;;;-1:-1:-1;50507:21:0;;;;-1:-1:-1;;;;;50507:21:0;;;31292:328;;;;;;;;;;-1:-1:-1;31292:328:0;;;;;:::i;:::-;;:::i;28653:342::-;;;;;;;;;;-1:-1:-1;28653:342:0;;;;;:::i;:::-;;:::i;50724:28::-;;;;;;;;;;;;;;;;53354:1608;;;;;;:::i;:::-;;:::i;49491:758::-;;;;;;:::i;:::-;;:::i;52821:82::-;;;;;;;;;;;;;:::i;30395:164::-;;;;;;;;;;-1:-1:-1;30395:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;30516:25:0;;;30492:4;30516:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;30395:164;50257:158;;;;;;;;;;-1:-1:-1;50257:158:0;;;;;:::i;:::-;;:::i;50607:29::-;;;;;;;;;;;;;;;;11329:201;;;;;;;;;;-1:-1:-1;11329:201:0;;;;;:::i;:::-;;:::i;52911:92::-;;;;;;;;;;-1:-1:-1;52911:92:0;;;;;:::i;:::-;;:::i;50759:28::-;;;;;;;;;;;;;;;;47702:949;47864:8;;-1:-1:-1;;;;;47864:8:0;47842:10;:31;47834:40;;;;;;47985:32;;;;;;;:19;:32;;;;;:39;;;;;:::i;:::-;;;47963:11;:18;:61;:134;;;;-1:-1:-1;48064:32:0;;;;;;;:19;:32;;;;;;;48054:43;;;;48064:32;48054:43;:::i;:::-;;;;;;;;48038:11;48028:22;;;;;;:69;47963:134;47955:213;;;;-1:-1:-1;;;47955:213:0;;21761:2:1;47955:213:0;;;21743:21:1;21800:2;21780:18;;;21773:30;21839:34;21819:18;;;21812:62;-1:-1:-1;;;21890:18:1;;;21883:50;21950:19;;47955:213:0;;;;;;;;;48296:60;;-1:-1:-1;;;48296:60:0;;:4;;:16;;:60;;48313:11;;48326;;48339:6;;48347:8;;48296:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48292:352;;48503:52;;;;;;;;48518:8;:15;48503:52;;;;48545:8;48535:19;;;;;;48503:52;;;48452:14;:27;48467:11;48452:27;;;;;;;;;;;;;;;48480:11;48452:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48452:48:0;;;;;;;;;;;;;:103;;;;;;;;;;;;;;;48575:57;;;;48589:11;;48602;;48493:6;;48623:8;;48575:57;:::i;:::-;;;;;;;;48292:352;47702:949;;;;:::o;56589:212::-;56728:4;56757:36;56781:11;56757:23;:36::i;:::-;56750:43;56589:212;-1:-1:-1;;56589:212:0:o;28309:100::-;28363:13;28396:5;28389:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28309:100;:::o;29876:221::-;29952:7;33219:16;;;:7;:16;;;;;;-1:-1:-1;;;;;33219:16:0;29972:73;;;;-1:-1:-1;;;29972:73:0;;20987:2:1;29972:73:0;;;20969:21:1;21026:2;21006:18;;;20999:30;21065:34;21045:18;;;21038:62;-1:-1:-1;;;21116:18:1;;;21109:42;21168:19;;29972:73:0;20785:408:1;29972:73:0;-1:-1:-1;30065:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;30065:24:0;;29876:221::o;29399:411::-;29480:13;29496:23;29511:7;29496:14;:23::i;:::-;29480:39;;29544:5;-1:-1:-1;;;;;29538:11:0;:2;-1:-1:-1;;;;;29538:11:0;;;29530:57;;;;-1:-1:-1;;;29530:57:0;;23361:2:1;29530:57:0;;;23343:21:1;23400:2;23380:18;;;23373:30;23439:34;23419:18;;;23412:62;-1:-1:-1;;;23490:18:1;;;23483:31;23531:19;;29530:57:0;23159:397:1;29530:57:0;9873:10;-1:-1:-1;;;;;29622:21:0;;;;:62;;-1:-1:-1;29647:37:0;29664:5;9873:10;30395:164;:::i;29647:37::-;29600:168;;;;-1:-1:-1;;;29600:168:0;;18613:2:1;29600:168:0;;;18595:21:1;18652:2;18632:18;;;18625:30;18691:34;18671:18;;;18664:62;18762:26;18742:18;;;18735:54;18806:19;;29600:168:0;18411:420:1;29600:168:0;29781:21;29790:2;29794:7;29781:8;:21::i;:::-;29469:341;29399:411;;:::o;51769:449::-;51822:10;;;;;;;51814:43;;;;-1:-1:-1;;;51814:43:0;;24540:2:1;51814:43:0;;;24522:21:1;24579:2;24559:18;;;24552:30;-1:-1:-1;;;24598:18:1;;;24591:50;24658:18;;51814:43:0;24338:344:1;51814:43:0;51889:5;;51876:9;:18;;51868:61;;;;-1:-1:-1;;;51868:61:0;;23763:2:1;51868:61:0;;;23745:21:1;23802:2;23782:18;;;23775:30;23841:32;23821:18;;;23814:60;23891:18;;51868:61:0;23561:354:1;51868:61:0;51974:8;;51963;;:19;;;;:::i;:::-;51948:11;;:34;;51940:74;;;;-1:-1:-1;;;51940:74:0;;;;;;;:::i;:::-;52054:14;;52040:10;52033:18;;;;:6;:18;;;;;;:35;52025:75;;;;-1:-1:-1;;;52025:75:0;;;;;;;:::i;:::-;52135:11;:13;;52113:36;;52123:10;;52135:13;:11;:13;;;:::i;:::-;;;;;52113:9;:36::i;:::-;52167:10;52160:18;;;;:6;:18;;;;;:23;;52182:1;;52160:18;:23;;52182:1;;52160:23;:::i;:::-;;;;;;;;52209:1;52196:9;;:14;;;;;;;:::i;:::-;;;;-1:-1:-1;;51769:449:0:o;48659:356::-;48828:10;48850:4;48828:27;48820:83;;;;-1:-1:-1;;;48820:83:0;;20214:2:1;48820:83:0;;;20196:21:1;20253:2;20233:18;;;20226:30;20292:34;20272:18;;;20265:62;-1:-1:-1;;;20343:18:1;;;20336:41;20394:19;;48820:83:0;20012:407:1;48820:83:0;48952:55;48964:11;48977;48990:6;48998:8;48952:10;:55::i;30626:339::-;30821:41;9873:10;30854:7;30821:18;:41::i;:::-;30813:103;;;;-1:-1:-1;;;30813:103:0;;;;;;;:::i;:::-;30929:28;30939:4;30945:2;30949:7;30929:9;:28::i;52546:80::-;10466:7;10493:6;-1:-1:-1;;;;;10493:6:0;9873:10;10640:23;10632:68;;;;-1:-1:-1;;;10632:68:0;;;;;;;:::i;:::-;52606:8:::1;:12:::0;52546:80::o;41387:256::-;41484:7;41520:23;41537:5;41520:16;:23::i;:::-;41512:5;:31;41504:87;;;;-1:-1:-1;;;41504:87:0;;14674:2:1;41504:87:0;;;14656:21:1;14713:2;14693:18;;;14686:30;14752:34;14732:18;;;14725:62;-1:-1:-1;;;14803:18:1;;;14796:41;14854:19;;41504:87:0;14472:407:1;41504:87:0;-1:-1:-1;;;;;;41609:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;41387:256::o;52226:312::-;10466:7;10493:6;-1:-1:-1;;;;;10493:6:0;9873:10;10640:23;10632:68;;;;-1:-1:-1;;;10632:68:0;;;;;;;:::i;:::-;52322:8:::1;::::0;:10:::1;::::0;52331:1:::1;52322:10;:::i;:::-;52316:1;52302:11;;:15;;;;:::i;:::-;:31;;52294:71;;;;-1:-1:-1::0;;;52294:71:0::1;;;;;;;:::i;:::-;52396:1;52384:8;;:13;;52376:53;;;::::0;-1:-1:-1;;;52376:53:0;;19038:2:1;52376:53:0::1;::::0;::::1;19020:21:1::0;19077:2;19057:18;;;19050:30;19116:28;19096:18;;;19089:56;19162:18;;52376:53:0::1;18836:350:1::0;52376:53:0::1;52444:6;52440:66;52458:1;52454;:5;52440:66;;;52492:11;:13:::0;;52479:27:::1;::::0;52489:1;;52492:13;:11:::1;:13;::::0;::::1;:::i;52479:27::-;52461:3:::0;::::1;::::0;::::1;:::i;:::-;;;;52440:66;;;;52529:1;52517:8;;:13;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;52226:312:0:o;55070:551::-;55123:21;55108:12;55173:42;55228:11;55236:3;55123:21;55228:11;:::i;:::-;:14;;55240:2;55228:14;:::i;:::-;55173:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55157:90;;;55266:4;55258:41;;;;-1:-1:-1;;;55258:41:0;;;;;;;:::i;:::-;55313:10;55329:42;55384:11;55392:3;55384:7;:11;:::i;:::-;:14;;55396:2;55384:14;:::i;:::-;55329:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55312:91;;;55422:5;55414:42;;;;-1:-1:-1;;;55414:42:0;;;;;;;:::i;:::-;55470:10;55486:42;55541:11;55549:3;55541:7;:11;:::i;:::-;:14;;55553:2;55541:14;:::i;:::-;55486:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55469:91;;;55579:5;55571:42;;;;-1:-1:-1;;;55571:42:0;;;;;;;:::i;31036:185::-;31174:39;31191:4;31197:2;31201:7;31174:39;;;;;;;;;;;;:16;:39::i;41909:233::-;41984:7;42020:30;41807:10;:17;;41719:113;42020:30;42012:5;:38;42004:95;;;;-1:-1:-1;;;42004:95:0;;24889:2:1;42004:95:0;;;24871:21:1;24928:2;24908:18;;;24901:30;24967:34;24947:18;;;24940:62;-1:-1:-1;;;25018:18:1;;;25011:42;25070:19;;42004:95:0;24687:408:1;42004:95:0;42117:10;42128:5;42117:17;;;;;;;;:::i;:::-;;;;;;;;;42110:24;;41909:233;;;:::o;54972:90::-;10466:7;10493:6;-1:-1:-1;;;;;10493:6:0;9873:10;10640:23;10632:68;;;;-1:-1:-1;;;10632:68:0;;;;;;;:::i;:::-;55041:13;;::::1;::::0;:7:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;;54972:90:::0;:::o;28003:239::-;28075:7;28111:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28111:16:0;28146:19;28138:73;;;;-1:-1:-1;;;28138:73:0;;19804:2:1;28138:73:0;;;19786:21:1;19843:2;19823:18;;;19816:30;19882:34;19862:18;;;19855:62;-1:-1:-1;;;19933:18:1;;;19926:39;19982:19;;28138:73:0;19602:405:1;27733:208:0;27805:7;-1:-1:-1;;;;;27833:19:0;;27825:74;;;;-1:-1:-1;;;27825:74:0;;19393:2:1;27825:74:0;;;19375:21:1;19432:2;19412:18;;;19405:30;19471:34;19451:18;;;19444:62;-1:-1:-1;;;19522:18:1;;;19515:40;19572:19;;27825:74:0;19191:406:1;27825:74:0;-1:-1:-1;;;;;;27917:16:0;;;;;:9;:16;;;;;;;27733:208::o;11071:103::-;10466:7;10493:6;-1:-1:-1;;;;;10493:6:0;9873:10;10640:23;10632:68;;;;-1:-1:-1;;;10632:68:0;;;;;;;:::i;:::-;11136:30:::1;11163:1;11136:18;:30::i;:::-;11071:103::o:0;47544:51::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;53011:203::-;53111:8;;:65;;-1:-1:-1;;;53111:65:0;;53073:4;;;;-1:-1:-1;;;;;53111:8:0;;;;:21;;:65;;53133:8;;53151:4;;53073;;53111:65;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;53089:87:0;53011:203;-1:-1:-1;;;53011:203:0:o;51241:520::-;51304:15;;;;51296:52;;;;-1:-1:-1;;;51296:52:0;;14321:2:1;51296:52:0;;;14303:21:1;14360:2;14340:18;;;14333:30;14399:26;14379:18;;;14372:54;14443:18;;51296:52:0;14119:348:1;51296:52:0;51386:1;51380:5;;:7;;;;:::i;:::-;51367:9;:20;;51359:63;;;;-1:-1:-1;;;51359:63:0;;23763:2:1;51359:63:0;;;23745:21:1;23802:2;23782:18;;;23775:30;23841:32;23821:18;;;23814:60;23891:18;;51359:63:0;23561:354:1;51359:63:0;51475:8;;51461;;:10;;51470:1;51461:10;:::i;:::-;51460:23;;;;:::i;:::-;51455:1;51441:11;;:15;;;;:::i;:::-;:42;;51433:82;;;;-1:-1:-1;;;51433:82:0;;;;;;;:::i;:::-;51560:14;;51541:10;51534:18;;;;:6;:18;;;;;;:22;;51555:1;;51534:22;:::i;:::-;:40;;51526:80;;;;-1:-1:-1;;;51526:80:0;;;;;;;:::i;:::-;51623:6;51619:75;51637:1;51633;:5;51619:75;;;51680:11;:13;;51658:36;;51668:10;;51680:13;:11;:13;;;:::i;51658:36::-;51640:3;;;;:::i;:::-;;;;51619:75;;;-1:-1:-1;51712:10:0;51705:18;;;;:6;:18;;;;;:23;;51727:1;;51705:18;:23;;51727:1;;51705:23;:::i;:::-;;;;;;;;51752:1;51739:9;;:14;;;;;;;:::i;:::-;;;;-1:-1:-1;;;51241:520:0:o;52634:74::-;10466:7;10493:6;-1:-1:-1;;;;;10493:6:0;9873:10;10640:23;10632:68;;;;-1:-1:-1;;;10632:68:0;;;;;;;:::i;:::-;52691:5:::1;:9:::0;52634:74::o;55705:125::-;10466:7;10493:6;-1:-1:-1;;;;;10493:6:0;9873:10;10640:23;10632:68;;;;-1:-1:-1;;;10632:68:0;;;;;;;:::i;:::-;55787:26:::1;:35:::0;55705:125::o;28478:104::-;28534:13;28567:7;28560:14;;;;;:::i;52716:97::-;10466:7;10493:6;-1:-1:-1;;;;;10493:6:0;9873:10;10640:23;10632:68;;;;-1:-1:-1;;;10632:68:0;;;;;;;:::i;:::-;52790:15:::1;::::0;;-1:-1:-1;;52771:34:0;::::1;52790:15;::::0;;::::1;52789:16;52771:34;::::0;;52716:97::o;30169:155::-;30264:52;9873:10;30297:8;30307;30264:18;:52::i;31292:328::-;31467:41;9873:10;31500:7;31467:18;:41::i;:::-;31459:103;;;;-1:-1:-1;;;31459:103:0;;;;;;;:::i;:::-;31573:39;31587:4;31593:2;31597:7;31606:5;31573:13;:39::i;28653:342::-;33195:4;33219:16;;;:7;:16;;;;;;28726:13;;-1:-1:-1;;;;;33219:16:0;28752:76;;;;-1:-1:-1;;;28752:76:0;;22592:2:1;28752:76:0;;;22574:21:1;22631:2;22611:18;;;22604:30;22670:34;22650:18;;;22643:62;-1:-1:-1;;;22721:18:1;;;22714:45;22776:19;;28752:76:0;22390:411:1;28752:76:0;28841:21;28865:10;:8;:10::i;:::-;28841:34;;28917:1;28899:7;28893:21;:25;:94;;;;;;;;;;;;;;;;;28945:7;28954:18;:7;:16;:18::i;:::-;28928:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28893:94;28886:101;28653:342;-1:-1:-1;;;28653:342:0:o;53354:1608::-;53457:16;53465:7;53457;:16::i;:::-;-1:-1:-1;;;;;53443:30:0;:10;-1:-1:-1;;;;;53443:30:0;;53435:77;;;;-1:-1:-1;;;53435:77:0;;17797:2:1;53435:77:0;;;17779:21:1;17836:2;17816:18;;;17809:30;17875:34;17855:18;;;17848:62;-1:-1:-1;;;17926:18:1;;;17919:32;17968:19;;53435:77:0;17595:398:1;53435:77:0;53531:29;;;53570:1;53531:29;;;:19;:29;;;;;:36;;;;;:::i;:::-;;;:40;53523:99;;;;-1:-1:-1;;;53523:99:0;;17027:2:1;53523:99:0;;;17009:21:1;17066:2;17046:18;;;17039:30;17105:34;17085:18;;;17078:62;-1:-1:-1;;;17156:18:1;;;17149:44;17210:19;;53523:99:0;16825:410:1;53523:99:0;53702:14;53708:7;53702:5;:14::i;:::-;53813:31;;;53824:10;53813:31;;;12900:51:1;12967:18;;;12960:34;;;53813:31:0;;;;;;;;;12873:18:1;;;53813:31:0;;54014:26;;-1:-1:-1;;;53988:53:0;;;11899:51:1;11966:11;;;;11959:27;;;;53988:53:0;;;;;;;;;;12002:12:1;;;53988:53:0;;;;54217:8;;-1:-1:-1;;;54217:77:0;;;53813:31;;53947:1;;-1:-1:-1;;;;;;;54217:8:0;;:21;;:77;;54239:8;;54257:4;;53813:31;;-1:-1:-1;;53988:53:0;;54217:77;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54195:99;;;54336:10;54323:9;:23;;54315:103;;;;-1:-1:-1;;;54315:103:0;;13845:2:1;54315:103:0;;;13827:21:1;13884:2;13864:18;;;13857:30;13923:34;13903:18;;;13896:62;13994:34;13974:18;;;13967:62;-1:-1:-1;;;14045:19:1;;;14038:34;14089:19;;54315:103:0;13643:471:1;54315:103:0;54431:8;;54549:29;;;54431:8;54549:29;;;:19;:29;;;;;;54431:499;;-1:-1:-1;;;54431:499:0;;-1:-1:-1;;;;;54431:8:0;;;;:13;;54452:9;;54431:499;;54477:8;;54637:7;;54720:10;;54431:8;54867:13;;54431:499;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53424:1538;;;;53354:1608;;:::o;49491:758::-;49707:27;;;49672:32;49707:27;;;:14;:27;;;;;;:40;;;;49735:11;;49707:40;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49707:48:0;;;;;;;;;;49774:21;;;;49707:48;;-1:-1:-1;49766:86:0;;;;-1:-1:-1;;;49766:86:0;;25302:2:1;49766:86:0;;;25284:21:1;25341:2;25321:18;;;25314:30;25380:34;25360:18;;;25353:62;-1:-1:-1;;;25431:18:1;;;25424:36;25477:19;;49766:86:0;25100:402:1;49766:86:0;49890:23;;49871:42;;:90;;;;;49940:9;:21;;;49927:8;;49917:19;;;;;;;:::i;:::-;;;;;;;;:44;49871:90;49863:129;;;;-1:-1:-1;;;49863:129:0;;17442:2:1;49863:129:0;;;17424:21:1;17481:2;17461:18;;;17454:30;17520:28;17500:18;;;17493:56;17566:18;;49863:129:0;17240:350:1;49863:129:0;50066:1;50040:27;;;50078:21;;;:34;50181:60;;-1:-1:-1;;;50181:60:0;;:4;;:16;;:60;;50198:11;;50211;;50224:6;;50232:8;;;;50181:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49616:633;49491:758;;;;;:::o;52821:82::-;10466:7;10493:6;-1:-1:-1;;;;;10493:6:0;9873:10;10640:23;10632:68;;;;-1:-1:-1;;;10632:68:0;;;;;;;:::i;:::-;52885:10:::1;::::0;;-1:-1:-1;;52871:24:0;::::1;52885:10;::::0;;;::::1;;;52884:11;52871:24:::0;;::::1;;::::0;;52821:82::o;50257:158::-;10466:7;10493:6;-1:-1:-1;;;;;10493:6:0;9873:10;10640:23;10632:68;;;;-1:-1:-1;;;10632:68:0;;;;;;;:::i;:::-;50361:29:::1;::::0;::::1;;::::0;;;:19:::1;:29;::::0;;;;:46:::1;::::0;50393:14;;50361:46:::1;:::i;11329:201::-:0;10466:7;10493:6;-1:-1:-1;;;;;10493:6:0;9873:10;10640:23;10632:68;;;;-1:-1:-1;;;10632:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11418:22:0;::::1;11410:73;;;::::0;-1:-1:-1;;;11410:73:0;;15505:2:1;11410:73:0::1;::::0;::::1;15487:21:1::0;15544:2;15524:18;;;15517:30;15583:34;15563:18;;;15556:62;-1:-1:-1;;;15634:18:1;;;15627:36;15680:19;;11410:73:0::1;15303:402:1::0;11410:73:0::1;11494:28;11513:8;11494:18;:28::i;:::-;11329:201:::0;:::o;52911:92::-;10466:7;10493:6;-1:-1:-1;;;;;10493:6:0;9873:10;10640:23;10632:68;;;;-1:-1:-1;;;10632:68:0;;;;;;;:::i;:::-;52977:14:::1;:18:::0;52911:92::o;41079:224::-;41181:4;-1:-1:-1;;;;;;41205:50:0;;-1:-1:-1;;;41205:50:0;;:90;;;41259:36;41283:11;41259:23;:36::i;37043:174::-;37118:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;37118:29:0;-1:-1:-1;;;;;37118:29:0;;;;;;;;:24;;37172:23;37118:24;37172:14;:23::i;:::-;-1:-1:-1;;;;;37163:46:0;;;;;;;;;;;37043:174;;:::o;34114:110::-;34190:26;34200:2;34204:7;34190:26;;;;;;;;;;;;:9;:26::i;55921:338::-;56074:14;56090:12;56117:8;56106:37;;;;;;;;;;;;:::i;:::-;56073:70;;;;56225:26;56235:6;56243:7;56225:9;:26::i;:::-;56043:216;;55921:338;;;;:::o;33424:348::-;33517:4;33219:16;;;:7;:16;;;;;;-1:-1:-1;;;;;33219:16:0;33534:73;;;;-1:-1:-1;;;33534:73:0;;18200:2:1;33534:73:0;;;18182:21:1;18239:2;18219:18;;;18212:30;18278:34;18258:18;;;18251:62;-1:-1:-1;;;18329:18:1;;;18322:42;18381:19;;33534:73:0;17998:408:1;33534:73:0;33618:13;33634:23;33649:7;33634:14;:23::i;:::-;33618:39;;33687:5;-1:-1:-1;;;;;33676:16:0;:7;-1:-1:-1;;;;;33676:16:0;;:51;;;;33720:7;-1:-1:-1;;;;;33696:31:0;:20;33708:7;33696:11;:20::i;:::-;-1:-1:-1;;;;;33696:31:0;;33676:51;:87;;;-1:-1:-1;;;;;;30516:25:0;;;30492:4;30516:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;33731:32;33668:96;33424:348;-1:-1:-1;;;;33424:348:0:o;36347:578::-;36506:4;-1:-1:-1;;;;;36479:31:0;:23;36494:7;36479:14;:23::i;:::-;-1:-1:-1;;;;;36479:31:0;;36471:85;;;;-1:-1:-1;;;36471:85:0;;22182:2:1;36471:85:0;;;22164:21:1;22221:2;22201:18;;;22194:30;22260:34;22240:18;;;22233:62;-1:-1:-1;;;22311:18:1;;;22304:39;22360:19;;36471:85:0;21980:405:1;36471:85:0;-1:-1:-1;;;;;36575:16:0;;36567:65;;;;-1:-1:-1;;;36567:65:0;;16268:2:1;36567:65:0;;;16250:21:1;16307:2;16287:18;;;16280:30;16346:34;16326:18;;;16319:62;-1:-1:-1;;;16397:18:1;;;16390:34;16441:19;;36567:65:0;16066:400:1;36567:65:0;36645:39;36666:4;36672:2;36676:7;36645:20;:39::i;:::-;36749:29;36766:1;36770:7;36749:8;:29::i;:::-;-1:-1:-1;;;;;36791:15:0;;;;;;:9;:15;;;;;:20;;36810:1;;36791:15;:20;;36810:1;;36791:20;:::i;:::-;;;;-1:-1:-1;;;;;;;36822:13:0;;;;;;:9;:13;;;;;:18;;36839:1;;36822:13;:18;;36839:1;;36822:18;:::i;:::-;;;;-1:-1:-1;;36851:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;36851:21:0;-1:-1:-1;;;;;36851:21:0;;;;;;;;;36890:27;;36851:16;;36890:27;;;;;;;36347:578;;;:::o;11690:191::-;11764:16;11783:6;;-1:-1:-1;;;;;11800:17:0;;;-1:-1:-1;;;;;;11800:17:0;;;;;;11833:40;;11783:6;;;;;;;11833:40;;11764:16;11833:40;11753:128;11690:191;:::o;37359:315::-;37514:8;-1:-1:-1;;;;;37505:17:0;:5;-1:-1:-1;;;;;37505:17:0;;;37497:55;;;;-1:-1:-1;;;37497:55:0;;16673:2:1;37497:55:0;;;16655:21:1;16712:2;16692:18;;;16685:30;16751:27;16731:18;;;16724:55;16796:18;;37497:55:0;16471:349:1;37497:55:0;-1:-1:-1;;;;;37563:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;37563:46:0;;;;;;;;;;37625:41;;13145::1;;;37625::0;;13118:18:1;37625:41:0;;;;;;;37359:315;;;:::o;32502:::-;32659:28;32669:4;32675:2;32679:7;32659:9;:28::i;:::-;32706:48;32729:4;32735:2;32739:7;32748:5;32706:22;:48::i;:::-;32698:111;;;;-1:-1:-1;;;32698:111:0;;;;;;;:::i;56269:100::-;56321:13;56354:7;56347:14;;;;;:::i;8000:723::-;8056:13;8277:10;8273:53;;-1:-1:-1;;8304:10:0;;;;;;;;;;;;-1:-1:-1;;;8304:10:0;;;;;8000:723::o;8273:53::-;8351:5;8336:12;8392:78;8399:9;;8392:78;;8425:8;;;;:::i;:::-;;-1:-1:-1;8448:10:0;;-1:-1:-1;8456:2:0;8448:10;;:::i;:::-;;;8392:78;;;8480:19;8512:6;-1:-1:-1;;;;;8502:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8502:17:0;;8480:39;;8530:154;8537:10;;8530:154;;8564:11;8574:1;8564:11;;:::i;:::-;;-1:-1:-1;8633:10:0;8641:2;8633:5;:10;:::i;:::-;8620:24;;:2;:24;:::i;:::-;8607:39;;8590:6;8597;8590:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;8590:56:0;;;;;;;;-1:-1:-1;8661:11:0;8670:2;8661:11;;:::i;:::-;;;8530:154;;35650:360;35710:13;35726:23;35741:7;35726:14;:23::i;:::-;35710:39;;35762:48;35783:5;35798:1;35802:7;35762:20;:48::i;:::-;35851:29;35868:1;35872:7;35851:8;:29::i;:::-;-1:-1:-1;;;;;35893:16:0;;;;;;:9;:16;;;;;:21;;35913:1;;35893:16;:21;;35913:1;;35893:21;:::i;:::-;;;;-1:-1:-1;;35932:16:0;;;;:7;:16;;;;;;35925:23;;-1:-1:-1;;;;;;35925:23:0;;;35966:36;35940:7;;35932:16;-1:-1:-1;;;;;35966:36:0;;;;;35932:16;;35966:36;35699:311;35650:360;:::o;27364:305::-;27466:4;-1:-1:-1;;;;;;27503:40:0;;-1:-1:-1;;;27503:40:0;;:105;;-1:-1:-1;;;;;;;27560:48:0;;-1:-1:-1;;;27560:48:0;27503:105;:158;;;-1:-1:-1;;;;;;;;;;21214:40:0;;;27625:36;21105:157;34451:321;34581:18;34587:2;34591:7;34581:5;:18::i;:::-;34632:54;34663:1;34667:2;34671:7;34680:5;34632:22;:54::i;:::-;34610:154;;;;-1:-1:-1;;;34610:154:0;;;;;;;:::i;56377:204::-;56528:45;56555:4;56561:2;56565:7;56528:26;:45::i;38239:799::-;38394:4;-1:-1:-1;;;;;38415:13:0;;12822:20;12870:8;38411:620;;38451:72;;-1:-1:-1;;;38451:72:0;;-1:-1:-1;;;;;38451:36:0;;;;;:72;;9873:10;;38502:4;;38508:7;;38517:5;;38451:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38451:72:0;;;;;;;;-1:-1:-1;;38451:72:0;;;;;;;;;;;;:::i;:::-;;;38447:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38693:13:0;;38689:272;;38736:60;;-1:-1:-1;;;38736:60:0;;;;;;;:::i;38689:272::-;38911:6;38905:13;38896:6;38892:2;38888:15;38881:38;38447:529;-1:-1:-1;;;;;;38574:51:0;-1:-1:-1;;;38574:51:0;;-1:-1:-1;38567:58:0;;38411:620;-1:-1:-1;39015:4:0;38239:799;;;;;;:::o;35108:313::-;-1:-1:-1;;;;;35188:16:0;;35180:61;;;;-1:-1:-1;;;35180:61:0;;20626:2:1;35180:61:0;;;20608:21:1;;;20645:18;;;20638:30;20704:34;20684:18;;;20677:62;20756:18;;35180:61:0;20424:356:1;35180:61:0;35254:45;35283:1;35287:2;35291:7;35254:20;:45::i;:::-;-1:-1:-1;;;;;35312:13:0;;;;;;:9;:13;;;;;:18;;35329:1;;35312:13;:18;;35329:1;;35312:18;:::i;:::-;;;;-1:-1:-1;;35341:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;35341:21:0;-1:-1:-1;;;;;35341:21:0;;;;;;;;35380:33;;35341:16;;;35380:33;;35341:16;;35380:33;35108:313;;:::o;42755:589::-;-1:-1:-1;;;;;42961:18:0;;42957:187;;42996:40;43028:7;44171:10;:17;;44144:24;;;;:15;:24;;;;;:44;;;44199:24;;;;;;;;;;;;44067:164;42996:40;42957:187;;;43066:2;-1:-1:-1;;;;;43058:10:0;:4;-1:-1:-1;;;;;43058:10:0;;43054:90;;43085:47;43118:4;43124:7;43085:32;:47::i;:::-;-1:-1:-1;;;;;43158:16:0;;43154:183;;43191:45;43228:7;43191:36;:45::i;43154:183::-;43264:4;-1:-1:-1;;;;;43258:10:0;:2;-1:-1:-1;;;;;43258:10:0;;43254:83;;43285:40;43313:2;43317:7;43285:27;:40::i;44858:988::-;45124:22;45174:1;45149:22;45166:4;45149:16;:22::i;:::-;:26;;;;:::i;:::-;45186:18;45207:26;;;:17;:26;;;;;;45124:51;;-1:-1:-1;45340:28:0;;;45336:328;;-1:-1:-1;;;;;45407:18:0;;45385:19;45407:18;;;:12;:18;;;;;;;;:34;;;;;;;;;45458:30;;;;;;:44;;;45575:30;;:17;:30;;;;;:43;;;45336:328;-1:-1:-1;45760:26:0;;;;:17;:26;;;;;;;;45753:33;;;-1:-1:-1;;;;;45804:18:0;;;;;:12;:18;;;;;:34;;;;;;;45797:41;44858:988::o;46141:1079::-;46419:10;:17;46394:22;;46419:21;;46439:1;;46419:21;:::i;:::-;46451:18;46472:24;;;:15;:24;;;;;;46845:10;:26;;46394:46;;-1:-1:-1;46472:24:0;;46394:46;;46845:26;;;;;;:::i;:::-;;;;;;;;;46823:48;;46909:11;46884:10;46895;46884:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;46989:28;;;:15;:28;;;;;;;:41;;;47161:24;;;;;47154:31;47196:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;46212:1008;;;46141:1079;:::o;43645:221::-;43730:14;43747:20;43764:2;43747:16;:20::i;:::-;-1:-1:-1;;;;;43778:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;43823:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;43645:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:631:1;78:5;-1:-1:-1;;;;;149:2:1;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:347::-;701:8;711:6;765:3;758:4;750:6;746:17;742:27;732:55;;783:1;780;773:12;732:55;-1:-1:-1;806:20:1;;-1:-1:-1;;;;;838:30:1;;835:50;;;881:1;878;871:12;835:50;918:4;910:6;906:17;894:29;;970:3;963:4;954:6;946;942:19;938:30;935:39;932:59;;;987:1;984;977:12;932:59;650:347;;;;;:::o;1002:220::-;1044:5;1097:3;1090:4;1082:6;1078:17;1074:27;1064:55;;1115:1;1112;1105:12;1064:55;1137:79;1212:3;1203:6;1190:20;1183:4;1175:6;1171:17;1137:79;:::i;1227:159::-;1294:20;;1354:6;1343:18;;1333:29;;1323:57;;1376:1;1373;1366:12;1323:57;1227:159;;;:::o;1391:171::-;1458:20;;-1:-1:-1;;;;;1507:30:1;;1497:41;;1487:69;;1552:1;1549;1542:12;1567:247;1626:6;1679:2;1667:9;1658:7;1654:23;1650:32;1647:52;;;1695:1;1692;1685:12;1647:52;1734:9;1721:23;1753:31;1778:5;1753:31;:::i;1819:320::-;1906:6;1914;1967:2;1955:9;1946:7;1942:23;1938:32;1935:52;;;1983:1;1980;1973:12;1935:52;2015:9;2009:16;2034:31;2059:5;2034:31;:::i;:::-;2129:2;2114:18;;;;2108:25;2084:5;;2108:25;;-1:-1:-1;;;1819:320:1:o;2144:388::-;2212:6;2220;2273:2;2261:9;2252:7;2248:23;2244:32;2241:52;;;2289:1;2286;2279:12;2241:52;2328:9;2315:23;2347:31;2372:5;2347:31;:::i;:::-;2397:5;-1:-1:-1;2454:2:1;2439:18;;2426:32;2467:33;2426:32;2467:33;:::i;:::-;2519:7;2509:17;;;2144:388;;;;;:::o;2537:456::-;2614:6;2622;2630;2683:2;2671:9;2662:7;2658:23;2654:32;2651:52;;;2699:1;2696;2689:12;2651:52;2738:9;2725:23;2757:31;2782:5;2757:31;:::i;:::-;2807:5;-1:-1:-1;2864:2:1;2849:18;;2836:32;2877:33;2836:32;2877:33;:::i;:::-;2537:456;;2929:7;;-1:-1:-1;;;2983:2:1;2968:18;;;;2955:32;;2537:456::o;2998:665::-;3093:6;3101;3109;3117;3170:3;3158:9;3149:7;3145:23;3141:33;3138:53;;;3187:1;3184;3177:12;3138:53;3226:9;3213:23;3245:31;3270:5;3245:31;:::i;:::-;3295:5;-1:-1:-1;3352:2:1;3337:18;;3324:32;3365:33;3324:32;3365:33;:::i;:::-;3417:7;-1:-1:-1;3471:2:1;3456:18;;3443:32;;-1:-1:-1;3526:2:1;3511:18;;3498:32;-1:-1:-1;;;;;3542:30:1;;3539:50;;;3585:1;3582;3575:12;3539:50;3608:49;3649:7;3640:6;3629:9;3625:22;3608:49;:::i;:::-;3598:59;;;2998:665;;;;;;;:::o;3668:416::-;3733:6;3741;3794:2;3782:9;3773:7;3769:23;3765:32;3762:52;;;3810:1;3807;3800:12;3762:52;3849:9;3836:23;3868:31;3893:5;3868:31;:::i;:::-;3918:5;-1:-1:-1;3975:2:1;3960:18;;3947:32;4017:15;;4010:23;3998:36;;3988:64;;4048:1;4045;4038:12;4089:315;4157:6;4165;4218:2;4206:9;4197:7;4193:23;4189:32;4186:52;;;4234:1;4231;4224:12;4186:52;4273:9;4260:23;4292:31;4317:5;4292:31;:::i;:::-;4342:5;4394:2;4379:18;;;;4366:32;;-1:-1:-1;;;4089:315:1:o;4409:245::-;4467:6;4520:2;4508:9;4499:7;4495:23;4491:32;4488:52;;;4536:1;4533;4526:12;4488:52;4575:9;4562:23;4594:30;4618:5;4594:30;:::i;4659:249::-;4728:6;4781:2;4769:9;4760:7;4756:23;4752:32;4749:52;;;4797:1;4794;4787:12;4749:52;4829:9;4823:16;4848:30;4872:5;4848:30;:::i;4913:450::-;4982:6;5035:2;5023:9;5014:7;5010:23;5006:32;5003:52;;;5051:1;5048;5041:12;5003:52;5091:9;5078:23;-1:-1:-1;;;;;5116:6:1;5113:30;5110:50;;;5156:1;5153;5146:12;5110:50;5179:22;;5232:4;5224:13;;5220:27;-1:-1:-1;5210:55:1;;5261:1;5258;5251:12;5210:55;5284:73;5349:7;5344:2;5331:16;5326:2;5322;5318:11;5284:73;:::i;5368:184::-;5426:6;5479:2;5467:9;5458:7;5454:23;5450:32;5447:52;;;5495:1;5492;5485:12;5447:52;5518:28;5536:9;5518:28;:::i;5557:481::-;5635:6;5643;5651;5704:2;5692:9;5683:7;5679:23;5675:32;5672:52;;;5720:1;5717;5710:12;5672:52;5743:28;5761:9;5743:28;:::i;:::-;5733:38;;5822:2;5811:9;5807:18;5794:32;-1:-1:-1;;;;;5841:6:1;5838:30;5835:50;;;5881:1;5878;5871:12;5835:50;5920:58;5970:7;5961:6;5950:9;5946:22;5920:58;:::i;:::-;5557:481;;5997:8;;-1:-1:-1;5894:84:1;;-1:-1:-1;;;;5557:481:1:o;6043:460::-;6128:6;6136;6144;6197:2;6185:9;6176:7;6172:23;6168:32;6165:52;;;6213:1;6210;6203:12;6165:52;6236:28;6254:9;6236:28;:::i;:::-;6226:38;;6315:2;6304:9;6300:18;6287:32;-1:-1:-1;;;;;6334:6:1;6331:30;6328:50;;;6374:1;6371;6364:12;6328:50;6397:49;6438:7;6429:6;6418:9;6414:22;6397:49;:::i;:::-;6387:59;;;6493:2;6482:9;6478:18;6465:32;6455:42;;6043:460;;;;;:::o;6508:773::-;6612:6;6620;6628;6636;6644;6697:3;6685:9;6676:7;6672:23;6668:33;6665:53;;;6714:1;6711;6704:12;6665:53;6737:28;6755:9;6737:28;:::i;:::-;6727:38;;6816:2;6805:9;6801:18;6788:32;-1:-1:-1;;;;;6880:2:1;6872:6;6869:14;6866:34;;;6896:1;6893;6886:12;6866:34;6919:49;6960:7;6951:6;6940:9;6936:22;6919:49;:::i;:::-;6909:59;;6987:37;7020:2;7009:9;7005:18;6987:37;:::i;:::-;6977:47;;7077:2;7066:9;7062:18;7049:32;7033:48;;7106:2;7096:8;7093:16;7090:36;;;7122:1;7119;7112:12;7090:36;;7161:60;7213:7;7202:8;7191:9;7187:24;7161:60;:::i;:::-;6508:773;;;;-1:-1:-1;6508:773:1;;-1:-1:-1;7240:8:1;;7135:86;6508:773;-1:-1:-1;;;6508:773:1:o;7286:684::-;7388:6;7396;7404;7412;7465:3;7453:9;7444:7;7440:23;7436:33;7433:53;;;7482:1;7479;7472:12;7433:53;7505:28;7523:9;7505:28;:::i;:::-;7495:38;;7584:2;7573:9;7569:18;7556:32;-1:-1:-1;;;;;7648:2:1;7640:6;7637:14;7634:34;;;7664:1;7661;7654:12;7634:34;7687:49;7728:7;7719:6;7708:9;7704:22;7687:49;:::i;:::-;7677:59;;7755:37;7788:2;7777:9;7773:18;7755:37;:::i;:::-;7745:47;;7845:2;7834:9;7830:18;7817:32;7801:48;;7874:2;7864:8;7861:16;7858:36;;;7890:1;7887;7880:12;7858:36;;7913:51;7956:7;7945:8;7934:9;7930:24;7913:51;:::i;7975:252::-;8042:6;8050;8103:2;8091:9;8082:7;8078:23;8074:32;8071:52;;;8119:1;8116;8109:12;8071:52;8142:28;8160:9;8142:28;:::i;8232:180::-;8291:6;8344:2;8332:9;8323:7;8319:23;8315:32;8312:52;;;8360:1;8357;8350:12;8312:52;-1:-1:-1;8383:23:1;;8232:180;-1:-1:-1;8232:180:1:o;8417:315::-;8485:6;8493;8546:2;8534:9;8525:7;8521:23;8517:32;8514:52;;;8562:1;8559;8552:12;8514:52;8598:9;8585:23;8575:33;;8658:2;8647:9;8643:18;8630:32;8671:31;8696:5;8671:31;:::i;8737:245::-;8816:6;8824;8877:2;8865:9;8856:7;8852:23;8848:32;8845:52;;;8893:1;8890;8883:12;8845:52;-1:-1:-1;;8916:16:1;;8972:2;8957:18;;;8951:25;8916:16;;8951:25;;-1:-1:-1;8737:245:1:o;9104:257::-;9145:3;9183:5;9177:12;9210:6;9205:3;9198:19;9226:63;9282:6;9275:4;9270:3;9266:14;9259:4;9252:5;9248:16;9226:63;:::i;:::-;9343:2;9322:15;-1:-1:-1;;9318:29:1;9309:39;;;;9350:4;9305:50;;9104:257;-1:-1:-1;;9104:257:1:o;9521:271::-;9704:6;9696;9691:3;9678:33;9660:3;9730:16;;9755:13;;;9730:16;9521:271;-1:-1:-1;9521:271:1:o;9797:274::-;9926:3;9964:6;9958:13;9980:53;10026:6;10021:3;10014:4;10006:6;10002:17;9980:53;:::i;:::-;10049:16;;;;;9797:274;-1:-1:-1;;9797:274:1:o;10076:811::-;10202:3;10231:1;10264:6;10258:13;10294:36;10320:9;10294:36;:::i;:::-;10349:1;10366:18;;;10393:104;;;;10511:1;10506:356;;;;10359:503;;10393:104;-1:-1:-1;;10426:24:1;;10414:37;;10471:16;;;;-1:-1:-1;10393:104:1;;10506:356;10537:6;10534:1;10527:17;10567:4;10612:2;10609:1;10599:16;10637:1;10651:165;10665:6;10662:1;10659:13;10651:165;;;10743:14;;10730:11;;;10723:35;10786:16;;;;10680:10;;10651:165;;;10655:3;;;10845:6;10840:3;10836:16;10829:23;;10359:503;-1:-1:-1;10878:3:1;;10076:811;-1:-1:-1;;;;;;10076:811:1:o;10892:637::-;11172:3;11210:6;11204:13;11226:53;11272:6;11267:3;11260:4;11252:6;11248:17;11226:53;:::i;:::-;11342:13;;11301:16;;;;11364:57;11342:13;11301:16;11398:4;11386:17;;11364:57;:::i;:::-;-1:-1:-1;;;11443:20:1;;11472:22;;;11521:1;11510:13;;10892:637;-1:-1:-1;;;;10892:637:1:o;12233:488::-;-1:-1:-1;;;;;12502:15:1;;;12484:34;;12554:15;;12549:2;12534:18;;12527:43;12601:2;12586:18;;12579:34;;;12649:3;12644:2;12629:18;;12622:31;;;12427:4;;12670:45;;12695:19;;12687:6;12670:45;:::i;:::-;12662:53;12233:488;-1:-1:-1;;;;;;12233:488:1:o;13197:217::-;13344:2;13333:9;13326:21;13307:4;13364:44;13404:2;13393:9;13389:18;13381:6;13364:44;:::i;14884:414::-;15086:2;15068:21;;;15125:2;15105:18;;;15098:30;15164:34;15159:2;15144:18;;15137:62;-1:-1:-1;;;15230:2:1;15215:18;;15208:48;15288:3;15273:19;;14884:414::o;15710:351::-;15912:2;15894:21;;;15951:2;15931:18;;;15924:30;15990:29;15985:2;15970:18;;15963:57;16052:2;16037:18;;15710:351::o;21198:356::-;21400:2;21382:21;;;21419:18;;;21412:30;21478:34;21473:2;21458:18;;21451:62;21545:2;21530:18;;21198:356::o;22806:348::-;23008:2;22990:21;;;23047:2;23027:18;;;23020:30;23086:26;23081:2;23066:18;;23059:54;23145:2;23130:18;;22806:348::o;23920:413::-;24122:2;24104:21;;;24161:2;24141:18;;;24134:30;24200:34;24195:2;24180:18;;24173:62;-1:-1:-1;;;24266:2:1;24251:18;;24244:47;24323:3;24308:19;;23920:413::o;25507:640::-;25788:6;25776:19;;25758:38;;-1:-1:-1;;;;;25832:32:1;;25827:2;25812:18;;25805:60;25852:3;25896:2;25881:18;;25874:31;;;-1:-1:-1;;25928:45:1;;25953:19;;25945:6;25928:45;:::i;:::-;26023:6;26016:14;26009:22;26004:2;25993:9;25989:18;25982:50;26081:9;26073:6;26069:22;26063:3;26052:9;26048:19;26041:51;26109:32;26134:6;26126;26109:32;:::i;:::-;26101:40;25507:640;-1:-1:-1;;;;;;;;25507:640:1:o;26152:758::-;26541:6;26529:19;;26511:38;;-1:-1:-1;;;;;26585:32:1;;26580:2;26565:18;;26558:60;26605:3;26649:2;26634:18;;26627:31;;;9443:1;26711:19;;;9431:14;-1:-1:-1;;;9461:14:1;;;9454:28;-1:-1:-1;9498:12:1;;;26774:14;;26767:22;26762:2;26747:18;;26740:50;26827:22;;;26821:3;26806:19;;26799:51;9443:1;9431:14;;-1:-1:-1;;;9470:4:1;9461:14;;9454:28;9507:2;9498:12;;26867:37;9366:150;26915:717;27182:6;27174;27170:19;27159:9;27152:38;27226:3;27221:2;27210:9;27206:18;27199:31;27133:4;27253:45;27293:3;27282:9;27278:19;27270:6;27253:45;:::i;:::-;-1:-1:-1;;;;;27338:6:1;27334:31;27329:2;27318:9;27314:18;27307:59;27414:9;27406:6;27402:22;27397:2;27386:9;27382:18;27375:50;27449:6;27441;27434:22;27503:6;27495;27490:2;27482:6;27478:15;27465:45;27556:1;27551:2;27542:6;27534;27530:19;27526:28;27519:39;27623:2;27616;27612:7;27607:2;27599:6;27595:15;27591:29;27583:6;27579:42;27575:51;27567:59;;;26915:717;;;;;;;;:::o;27637:555::-;27894:6;27886;27882:19;27871:9;27864:38;27938:3;27933:2;27922:9;27918:18;27911:31;27845:4;27965:45;28005:3;27994:9;27990:19;27982:6;27965:45;:::i;:::-;-1:-1:-1;;;;;28050:6:1;28046:31;28041:2;28030:9;28026:18;28019:59;28126:9;28118:6;28114:22;28109:2;28098:9;28094:18;28087:50;28154:32;28179:6;28171;28154:32;:::i;:::-;28146:40;27637:555;-1:-1:-1;;;;;;;27637:555:1:o;28197:1498::-;28543:6;28535;28531:19;28520:9;28513:38;28494:4;28570:2;28608:3;28603:2;28592:9;28588:18;28581:31;28632:1;28665:6;28659:13;28695:36;28721:9;28695:36;:::i;:::-;28768:6;28762:3;28751:9;28747:19;28740:35;28794:3;28816:1;28848:2;28837:9;28833:18;28865:1;28860:122;;;;28996:1;28991:354;;;;28826:519;;28860:122;-1:-1:-1;;28908:24:1;;28888:18;;;28881:52;28968:3;28953:19;;;-1:-1:-1;28860:122:1;;28991:354;29022:6;29019:1;29012:17;29070:2;29067:1;29057:16;29095:1;29109:180;29123:6;29120:1;29117:13;29109:180;;;29216:14;;29192:17;;;29188:26;;29181:50;29259:16;;;;29138:10;;29109:180;;;29313:17;;29309:26;;;-1:-1:-1;;28826:519:1;;;;;;29390:9;29385:3;29381:19;29376:2;29365:9;29361:18;29354:47;29424:29;29449:3;29441:6;29424:29;:::i;:::-;29410:43;;;29462:54;29512:2;29501:9;29497:18;29489:6;-1:-1:-1;;;;;9061:31:1;9049:44;;8987:112;29462:54;-1:-1:-1;;;;;9061:31:1;;29575:3;29560:19;;9049:44;29629:9;29621:6;29617:22;29611:3;29600:9;29596:19;29589:51;29657:32;29682:6;29674;29657:32;:::i;:::-;29649:40;28197:1498;-1:-1:-1;;;;;;;;;28197:1498:1:o;30135:128::-;30175:3;30206:1;30202:6;30199:1;30196:13;30193:39;;;30212:18;;:::i;:::-;-1:-1:-1;30248:9:1;;30135:128::o;30268:120::-;30308:1;30334;30324:35;;30339:18;;:::i;:::-;-1:-1:-1;30373:9:1;;30268:120::o;30393:168::-;30433:7;30499:1;30495;30491:6;30487:14;30484:1;30481:21;30476:1;30469:9;30462:17;30458:45;30455:71;;;30506:18;;:::i;:::-;-1:-1:-1;30546:9:1;;30393:168::o;30566:125::-;30606:4;30634:1;30631;30628:8;30625:34;;;30639:18;;:::i;:::-;-1:-1:-1;30676:9:1;;30566:125::o;30696:258::-;30768:1;30778:113;30792:6;30789:1;30786:13;30778:113;;;30868:11;;;30862:18;30849:11;;;30842:39;30814:2;30807:10;30778:113;;;30909:6;30906:1;30903:13;30900:48;;;-1:-1:-1;;30944:1:1;30926:16;;30919:27;30696:258::o;30959:380::-;31038:1;31034:12;;;;31081;;;31102:61;;31156:4;31148:6;31144:17;31134:27;;31102:61;31209:2;31201:6;31198:14;31178:18;31175:38;31172:161;;;31255:10;31250:3;31246:20;31243:1;31236:31;31290:4;31287:1;31280:15;31318:4;31315:1;31308:15;31172:161;;30959:380;;;:::o;31344:135::-;31383:3;-1:-1:-1;;31404:17:1;;31401:43;;;31424:18;;:::i;:::-;-1:-1:-1;31471:1:1;31460:13;;31344:135::o;31484:112::-;31516:1;31542;31532:35;;31547:18;;:::i;:::-;-1:-1:-1;31581:9:1;;31484:112::o;31601:127::-;31662:10;31657:3;31653:20;31650:1;31643:31;31693:4;31690:1;31683:15;31717:4;31714:1;31707:15;31733:127;31794:10;31789:3;31785:20;31782:1;31775:31;31825:4;31822:1;31815:15;31849:4;31846:1;31839:15;31865:127;31926:10;31921:3;31917:20;31914:1;31907:31;31957:4;31954:1;31947:15;31981:4;31978:1;31971:15;31997:127;32058:10;32053:3;32049:20;32046:1;32039:31;32089:4;32086:1;32079:15;32113:4;32110:1;32103:15;32129:127;32190:10;32185:3;32181:20;32178:1;32171:31;32221:4;32218:1;32211:15;32245:4;32242:1;32235:15;32261:131;-1:-1:-1;;;;;32336:31:1;;32326:42;;32316:70;;32382:1;32379;32372:12;32397:131;-1:-1:-1;;;;;;32471:32:1;;32461:43;;32451:71;;32518:1;32515;32508:12

Swarm Source

ipfs://6d7d079b1466b39536964b74a9e428970aa80a37d60b345de6a34ea0d26ecfb1
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.