ETH Price: $3,356.40 (-2.30%)
Gas: 7.13 Gwei

Token

Doodle Slugs (DS)
 

Overview

Max Total Supply

8,627 DS

Holders

690

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
hk1.eth
Balance
10 DS
0x5C34108f41Ff072C9c84548f2b368b3D016D52da
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:
DoodleSlugs

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-24
*/

// SPDX-License-Identifier: MIT
/**
 * @title DoodleSlugs
 * @author Shahid Ahmed
 * @dev Used for Ethereum projects compatible with OpenSea
 */
pragma solidity >=0.8.4;

pragma solidity ^0.8.0;

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


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


pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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


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


pragma solidity ^0.8.0;

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


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


pragma solidity ^0.8.0;

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

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

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


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


pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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


pragma solidity ^0.8.0;

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

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


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


pragma solidity ^0.8.0;

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

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

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

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

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


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


pragma solidity ^0.8.0;

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


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


pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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


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


pragma solidity ^0.8.0;

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

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

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


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


pragma solidity ^0.8.0;


/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
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();
    }
}


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


pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}


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


pragma solidity ^0.8.0;

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


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


pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

contract DoodleSlugs is ERC721, Ownable { 

    bool    public  sale = true;
    bool    public  presale = false;
    string  private _baseURIextended;
    uint16  public  nonce = 0;
    uint    public  price;
    uint16  public  earlySupply;
    uint16  public  totalSupply;
    uint8   public  maxTx;
    uint256   public  maxFree = 5000;

    mapping (address => uint8) private presaleWallets;

    constructor(
        string memory _name,
        string memory _ticker,
        uint _price, 
        uint16 _totalSupply,
        uint8 _maxTx,
        string memory baseURI_
        //address[] memory _presaleWallets,
        //uint8[] memory _presaleAmounts
    ) ERC721(_name, _ticker) {
        price = _price;
        earlySupply = _totalSupply;
        totalSupply = _totalSupply;
        maxTx = _maxTx;
        //maxFree = _maxFree;
        _baseURIextended = baseURI_;
        //setPresaleWalletsAmounts(_presaleWallets, _presaleAmounts);
    }

    function setBaseURI(string memory baseURI_) public onlyOwner {
        _baseURIextended = baseURI_;
    }

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

    function setPrice(uint _newPrice) external onlyOwner {
        price = _newPrice;
    }

    function setEarlySupply(uint16 _newSupply) external onlyOwner {
        earlySupply = _newSupply;
    }

    function setTotalSupply(uint16 _newSupply) external onlyOwner {
        totalSupply = _newSupply;
    }

    function setPresale(bool _value) public onlyOwner {
        presale = _value;
    }

    function setSale(bool _value) public onlyOwner {
        sale = _value;
    }

    function setPresaleWalletsAmounts(address[] memory _a, uint8[] memory _amount) public onlyOwner {
        for (uint8 i; i < _a.length; i++) {
            presaleWallets[_a[i]] = _amount[i];
        }
    }

    function setMaxTx(uint8 _newMax) external onlyOwner {
        maxTx = _newMax;
    }

    function setMaxFree(uint8 _newMax) external onlyOwner {
        maxFree = _newMax;
    }

    function getPresaleWalletAmount(address _wallet) public view returns(uint8) {
        return presaleWallets[_wallet];
    }

    function buyPresale(uint8 _qty) external payable {
        uint8 _qtyAllowed = presaleWallets[msg.sender];
        require(presale, 'Presale is not active');
        require(_qty <= _qtyAllowed, 'You can not buy more than allowed');
        require(_qtyAllowed > 0, 'You can not mint on presale');
        require(uint16(_qty) + nonce - 1 <= earlySupply, 'No more supply');
        require(uint16(_qty) + nonce - 1 <= totalSupply, 'No more supply');
        require(msg.value >= price * _qty, 'Invalid price');
        presaleWallets[msg.sender] = _qtyAllowed - _qty;

        mintNFTs(msg.sender, _qty);
    }

    function buy(uint8 _qty) external payable {
        require(sale, 'Sale is not active');
        require(_qty <= maxTx || _qty < 1, 'You can not buy more than allowed');
        require(uint16(_qty) + nonce - 1 <= earlySupply, 'No more supply');
        require(uint16(_qty) + nonce - 1 <= totalSupply, 'No more supply');
        if (nonce < maxFree) {
        }else{
            require(msg.value >= price * _qty, 'Invalid price');
        }

        mintNFTs(msg.sender, _qty);
    }

    function buyfree(uint8 _qty) external payable {
        require(sale, 'Sale is not active');
        require(_qty <= maxTx || _qty < 1, 'You can not buy more than allowed');
        require(uint16(_qty) + nonce - 1 <= earlySupply, 'No more supply');
        require(uint16(_qty) + nonce - 1 <= totalSupply, 'No more supply');

        mintNFTs(msg.sender, _qty);
    }

    function giveaway(address _to, uint8 _qty) external onlyOwner {
        require(uint16(_qty) + nonce - 1 <= totalSupply, 'No more supply');

        mintNFTs(_to, _qty);
    }

    function mintNFTs(address _to, uint8 _qty) private {
        for (uint8 i = 0; i < _qty; i++) {
            uint16 _tokenId = nonce;
            _safeMint(_to, _tokenId);
            nonce++;
        }
    }

    function withdraw() external onlyOwner {
        payable(msg.sender).transfer(address(this).balance);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_ticker","type":"string"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint16","name":"_totalSupply","type":"uint16"},{"internalType":"uint8","name":"_maxTx","type":"uint8"},{"internalType":"string","name":"baseURI_","type":"string"}],"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":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":[{"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":"uint8","name":"_qty","type":"uint8"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_qty","type":"uint8"}],"name":"buyPresale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_qty","type":"uint8"}],"name":"buyfree","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"earlySupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"getPresaleWalletAmount","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint8","name":"_qty","type":"uint8"}],"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":[],"name":"maxFree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTx","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nonce","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","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":"presale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":[],"name":"sale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_newSupply","type":"uint16"}],"name":"setEarlySupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_newMax","type":"uint8"}],"name":"setMaxFree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_newMax","type":"uint8"}],"name":"setMaxTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_value","type":"bool"}],"name":"setPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_a","type":"address[]"},{"internalType":"uint8[]","name":"_amount","type":"uint8[]"}],"name":"setPresaleWalletsAmounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_value","type":"bool"}],"name":"setSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_newSupply","type":"uint16"}],"name":"setTotalSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"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":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526001600660146101000a81548160ff0219169083151502179055506000600660156101000a81548160ff0219169083151502179055506000600860006101000a81548161ffff021916908361ffff160217905550611388600b553480156200006b57600080fd5b506040516200507e3803806200507e83398181016040528101906200009191906200039d565b85858160009080519060200190620000ab92919062000236565b508060019080519060200190620000c492919062000236565b505050620000e7620000db6200016860201b60201c565b6200017060201b60201c565b8360098190555082600a60006101000a81548161ffff021916908361ffff16021790555082600a60026101000a81548161ffff021916908361ffff16021790555081600a60046101000a81548160ff021916908360ff16021790555080600790805190602001906200015b92919062000236565b5050505050505062000661565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002449062000538565b90600052602060002090601f016020900481019282620002685760008555620002b4565b82601f106200028357805160ff1916838001178555620002b4565b82800160010185558215620002b4579182015b82811115620002b357825182559160200191906001019062000296565b5b509050620002c39190620002c7565b5090565b5b80821115620002e2576000816000905550600101620002c8565b5090565b6000620002fd620002f784620004a7565b6200047e565b9050828152602081018484840111156200031657600080fd5b6200032384828562000502565b509392505050565b600082601f8301126200033d57600080fd5b81516200034f848260208601620002e6565b91505092915050565b600081519050620003698162000613565b92915050565b60008151905062000380816200062d565b92915050565b600081519050620003978162000647565b92915050565b60008060008060008060c08789031215620003b757600080fd5b600087015167ffffffffffffffff811115620003d257600080fd5b620003e089828a016200032b565b965050602087015167ffffffffffffffff811115620003fe57600080fd5b6200040c89828a016200032b565b95505060406200041f89828a016200036f565b94505060606200043289828a0162000358565b93505060806200044589828a0162000386565b92505060a087015167ffffffffffffffff8111156200046357600080fd5b6200047189828a016200032b565b9150509295509295509295565b60006200048a6200049d565b90506200049882826200056e565b919050565b6000604051905090565b600067ffffffffffffffff821115620004c557620004c4620005d3565b5b620004d08262000602565b9050602081019050919050565b600061ffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b838110156200052257808201518184015260208101905062000505565b8381111562000532576000848401525b50505050565b600060028204905060018216806200055157607f821691505b60208210811415620005685762000567620005a4565b5b50919050565b620005798262000602565b810181811067ffffffffffffffff821117156200059b576200059a620005d3565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6200061e81620004dd565b81146200062a57600080fd5b50565b6200063881620004eb565b81146200064457600080fd5b50565b6200065281620004f5565b81146200065e57600080fd5b50565b614a0d80620006716000396000f3fe6080604052600436106102305760003560e01c8063715018a61161012e578063a24ffbd4116100ab578063c54e73e31161006f578063c54e73e3146107d4578063c87b56dd146107fd578063e985e9c51461083a578063f2fde38b14610877578063fdea8e0b146108a057610230565b8063a24ffbd414610712578063a63b94f51461073b578063affed0e014610757578063b88d4fde14610782578063c1408d79146107ab57610230565b806391b7f5ed116100f257806391b7f5ed1461062d57806395d89b41146106565780639dcd8cde14610681578063a035b1fe146106be578063a22cb465146106e957610230565b8063715018a61461056c57806373bfad87146105835780637437681e146105ac5780638cb2923c146105d75780638da5cb5b1461060257610230565b80633ccfd60b116101bc5780636352211e116101805780636352211e1461048257806365f48e62146104bf57806369d957f4146104e85780636ad1fe021461050457806370a082311461052f57610230565b80633ccfd60b146103c557806342842e0e146103dc578063485a68a31461040557806355f804b314610430578063562e438b1461045957610230565b806314107f3c1161020357806314107f3c146103035780631734039c1461031f57806318160ddd146103485780631d2e5a3a1461037357806323b872dd1461039c57610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063095ea7b3146102da575b600080fd5b34801561024157600080fd5b5061025c6004803603810190610257919061355b565b6108cb565b6040516102699190613ae4565b60405180910390f35b34801561027e57600080fd5b506102876109ad565b6040516102949190613aff565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf9190613617565b610a3f565b6040516102d19190613a7d565b60405180910390f35b3480156102e657600080fd5b5061030160048036038101906102fc919061344e565b610ac4565b005b61031d60048036038101906103189190613640565b610bdc565b005b34801561032b57600080fd5b5061034660048036038101906103419190613640565b610e1f565b005b34801561035457600080fd5b5061035d610ea8565b60405161036a9190613de1565b60405180910390f35b34801561037f57600080fd5b5061039a60048036038101906103959190613532565b610ebc565b005b3480156103a857600080fd5b506103c360048036038101906103be9190613348565b610f55565b005b3480156103d157600080fd5b506103da610fb5565b005b3480156103e857600080fd5b5061040360048036038101906103fe9190613348565b61107a565b005b34801561041157600080fd5b5061041a61109a565b6040516104279190613dfc565b60405180910390f35b34801561043c57600080fd5b50610457600480360381019061045291906135ad565b6110a0565b005b34801561046557600080fd5b50610480600480360381019061047b91906135ee565b611136565b005b34801561048e57600080fd5b506104a960048036038101906104a49190613617565b6111d2565b6040516104b69190613a7d565b60405180910390f35b3480156104cb57600080fd5b506104e660048036038101906104e19190613640565b611284565b005b61050260048036038101906104fd9190613640565b61131e565b005b34801561051057600080fd5b506105196114ea565b6040516105269190613ae4565b60405180910390f35b34801561053b57600080fd5b50610556600480360381019061055191906132e3565b6114fd565b6040516105639190613dfc565b60405180910390f35b34801561057857600080fd5b506105816115b5565b005b34801561058f57600080fd5b506105aa60048036038101906105a591906134c6565b61163d565b005b3480156105b857600080fd5b506105c16117be565b6040516105ce9190613e17565b60405180910390f35b3480156105e357600080fd5b506105ec6117d1565b6040516105f99190613de1565b60405180910390f35b34801561060e57600080fd5b506106176117e5565b6040516106249190613a7d565b60405180910390f35b34801561063957600080fd5b50610654600480360381019061064f9190613617565b61180f565b005b34801561066257600080fd5b5061066b611895565b6040516106789190613aff565b60405180910390f35b34801561068d57600080fd5b506106a860048036038101906106a391906132e3565b611927565b6040516106b59190613e17565b60405180910390f35b3480156106ca57600080fd5b506106d361197d565b6040516106e09190613dfc565b60405180910390f35b3480156106f557600080fd5b50610710600480360381019061070b9190613412565b611983565b005b34801561071e57600080fd5b506107396004803603810190610734919061348a565b611b04565b005b61075560048036038101906107509190613640565b611c13565b005b34801561076357600080fd5b5061076c611f10565b6040516107799190613de1565b60405180910390f35b34801561078e57600080fd5b506107a960048036038101906107a49190613397565b611f24565b005b3480156107b757600080fd5b506107d260048036038101906107cd91906135ee565b611f86565b005b3480156107e057600080fd5b506107fb60048036038101906107f69190613532565b612022565b005b34801561080957600080fd5b50610824600480360381019061081f9190613617565b6120bb565b6040516108319190613aff565b60405180910390f35b34801561084657600080fd5b50610861600480360381019061085c919061330c565b612162565b60405161086e9190613ae4565b60405180910390f35b34801561088357600080fd5b5061089e600480360381019061089991906132e3565b6121f6565b005b3480156108ac57600080fd5b506108b56122ee565b6040516108c29190613ae4565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061099657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109a657506109a582612301565b5b9050919050565b6060600080546109bc906141da565b80601f01602080910402602001604051908101604052809291908181526020018280546109e8906141da565b8015610a355780601f10610a0a57610100808354040283529160200191610a35565b820191906000526020600020905b815481529060010190602001808311610a1857829003601f168201915b5050505050905090565b6000610a4a8261236b565b610a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8090613ca1565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610acf826111d2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3790613d21565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b5f6123d7565b73ffffffffffffffffffffffffffffffffffffffff161480610b8e5750610b8d81610b886123d7565b612162565b5b610bcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc490613c01565b60405180910390fd5b610bd783836123df565b505050565b600660149054906101000a900460ff16610c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2290613bc1565b60405180910390fd5b600a60049054906101000a900460ff1660ff168160ff16111580610c52575060018160ff16105b610c91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8890613c21565b60405180910390fd5b600a60009054906101000a900461ffff1661ffff166001600860009054906101000a900461ffff168360ff16610cc79190613f54565b610cd1919061406d565b61ffff161115610d16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0d90613d81565b60405180910390fd5b600a60029054906101000a900461ffff1661ffff166001600860009054906101000a900461ffff168360ff16610d4c9190613f54565b610d56919061406d565b61ffff161115610d9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9290613d81565b60405180910390fd5b600b54600860009054906101000a900461ffff1661ffff161015610dbe57610e12565b8060ff16600954610dcf9190614013565b341015610e11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0890613da1565b60405180910390fd5b5b610e1c3382612498565b50565b610e276123d7565b73ffffffffffffffffffffffffffffffffffffffff16610e456117e5565b73ffffffffffffffffffffffffffffffffffffffff1614610e9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9290613cc1565b60405180910390fd5b8060ff16600b8190555050565b600a60029054906101000a900461ffff1681565b610ec46123d7565b73ffffffffffffffffffffffffffffffffffffffff16610ee26117e5565b73ffffffffffffffffffffffffffffffffffffffff1614610f38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2f90613cc1565b60405180910390fd5b80600660146101000a81548160ff02191690831515021790555050565b610f66610f606123d7565b82612520565b610fa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9c90613d41565b60405180910390fd5b610fb08383836125fe565b505050565b610fbd6123d7565b73ffffffffffffffffffffffffffffffffffffffff16610fdb6117e5565b73ffffffffffffffffffffffffffffffffffffffff1614611031576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102890613cc1565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611077573d6000803e3d6000fd5b50565b61109583838360405180602001604052806000815250611f24565b505050565b600b5481565b6110a86123d7565b73ffffffffffffffffffffffffffffffffffffffff166110c66117e5565b73ffffffffffffffffffffffffffffffffffffffff161461111c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111390613cc1565b60405180910390fd5b8060079080519060200190611132929190612fb1565b5050565b61113e6123d7565b73ffffffffffffffffffffffffffffffffffffffff1661115c6117e5565b73ffffffffffffffffffffffffffffffffffffffff16146111b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a990613cc1565b60405180910390fd5b80600a60026101000a81548161ffff021916908361ffff16021790555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561127b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127290613c61565b60405180910390fd5b80915050919050565b61128c6123d7565b73ffffffffffffffffffffffffffffffffffffffff166112aa6117e5565b73ffffffffffffffffffffffffffffffffffffffff1614611300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f790613cc1565b60405180910390fd5b80600a60046101000a81548160ff021916908360ff16021790555050565b600660149054906101000a900460ff1661136d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136490613bc1565b60405180910390fd5b600a60049054906101000a900460ff1660ff168160ff16111580611394575060018160ff16105b6113d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ca90613c21565b60405180910390fd5b600a60009054906101000a900461ffff1661ffff166001600860009054906101000a900461ffff168360ff166114099190613f54565b611413919061406d565b61ffff161115611458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144f90613d81565b60405180910390fd5b600a60029054906101000a900461ffff1661ffff166001600860009054906101000a900461ffff168360ff1661148e9190613f54565b611498919061406d565b61ffff1611156114dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d490613d81565b60405180910390fd5b6114e73382612498565b50565b600660149054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561156e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156590613c41565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6115bd6123d7565b73ffffffffffffffffffffffffffffffffffffffff166115db6117e5565b73ffffffffffffffffffffffffffffffffffffffff1614611631576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162890613cc1565b60405180910390fd5b61163b600061285a565b565b6116456123d7565b73ffffffffffffffffffffffffffffffffffffffff166116636117e5565b73ffffffffffffffffffffffffffffffffffffffff16146116b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b090613cc1565b60405180910390fd5b60005b82518160ff1610156117b957818160ff1681518110611704577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600c6000858460ff168151811061174c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff16021790555080806117b1906142b1565b9150506116bc565b505050565b600a60049054906101000a900460ff1681565b600a60009054906101000a900461ffff1681565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6118176123d7565b73ffffffffffffffffffffffffffffffffffffffff166118356117e5565b73ffffffffffffffffffffffffffffffffffffffff161461188b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188290613cc1565b60405180910390fd5b8060098190555050565b6060600180546118a4906141da565b80601f01602080910402602001604051908101604052809291908181526020018280546118d0906141da565b801561191d5780601f106118f25761010080835404028352916020019161191d565b820191906000526020600020905b81548152906001019060200180831161190057829003601f168201915b5050505050905090565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60095481565b61198b6123d7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f090613ba1565b60405180910390fd5b8060056000611a066123d7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ab36123d7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611af89190613ae4565b60405180910390a35050565b611b0c6123d7565b73ffffffffffffffffffffffffffffffffffffffff16611b2a6117e5565b73ffffffffffffffffffffffffffffffffffffffff1614611b80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7790613cc1565b60405180910390fd5b600a60029054906101000a900461ffff1661ffff166001600860009054906101000a900461ffff168360ff16611bb69190613f54565b611bc0919061406d565b61ffff161115611c05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfc90613d81565b60405180910390fd5b611c0f8282612498565b5050565b6000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050600660159054906101000a900460ff16611cb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611caa90613d61565b60405180910390fd5b8060ff168260ff161115611cfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf390613c21565b60405180910390fd5b60008160ff1611611d42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3990613dc1565b60405180910390fd5b600a60009054906101000a900461ffff1661ffff166001600860009054906101000a900461ffff168460ff16611d789190613f54565b611d82919061406d565b61ffff161115611dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbe90613d81565b60405180910390fd5b600a60029054906101000a900461ffff1661ffff166001600860009054906101000a900461ffff168460ff16611dfd9190613f54565b611e07919061406d565b61ffff161115611e4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4390613d81565b60405180910390fd5b8160ff16600954611e5d9190614013565b341015611e9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9690613da1565b60405180910390fd5b8181611eab91906140d5565b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550611f0c3383612498565b5050565b600860009054906101000a900461ffff1681565b611f35611f2f6123d7565b83612520565b611f74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6b90613d41565b60405180910390fd5b611f8084848484612920565b50505050565b611f8e6123d7565b73ffffffffffffffffffffffffffffffffffffffff16611fac6117e5565b73ffffffffffffffffffffffffffffffffffffffff1614612002576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff990613cc1565b60405180910390fd5b80600a60006101000a81548161ffff021916908361ffff16021790555050565b61202a6123d7565b73ffffffffffffffffffffffffffffffffffffffff166120486117e5565b73ffffffffffffffffffffffffffffffffffffffff161461209e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209590613cc1565b60405180910390fd5b80600660156101000a81548160ff02191690831515021790555050565b60606120c68261236b565b612105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fc90613d01565b60405180910390fd5b600061210f61297c565b9050600081511161212f576040518060200160405280600081525061215a565b8061213984612a0e565b60405160200161214a929190613a59565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6121fe6123d7565b73ffffffffffffffffffffffffffffffffffffffff1661221c6117e5565b73ffffffffffffffffffffffffffffffffffffffff1614612272576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226990613cc1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156122e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d990613b41565b60405180910390fd5b6122eb8161285a565b50565b600660159054906101000a900460ff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612452836111d2565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60005b8160ff168160ff16101561251b576000600860009054906101000a900461ffff1690506124cc848261ffff16612bbb565b6008600081819054906101000a900461ffff16809291906124ec9061423d565b91906101000a81548161ffff021916908361ffff16021790555050508080612513906142b1565b91505061249b565b505050565b600061252b8261236b565b61256a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256190613be1565b60405180910390fd5b6000612575836111d2565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806125e457508373ffffffffffffffffffffffffffffffffffffffff166125cc84610a3f565b73ffffffffffffffffffffffffffffffffffffffff16145b806125f557506125f48185612162565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661261e826111d2565b73ffffffffffffffffffffffffffffffffffffffff1614612674576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266b90613ce1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126db90613b81565b60405180910390fd5b6126ef838383612bd9565b6126fa6000826123df565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461274a91906140a1565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127a19190613f8c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61292b8484846125fe565b61293784848484612bde565b612976576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296d90613b21565b60405180910390fd5b50505050565b60606007805461298b906141da565b80601f01602080910402602001604051908101604052809291908181526020018280546129b7906141da565b8015612a045780601f106129d957610100808354040283529160200191612a04565b820191906000526020600020905b8154815290600101906020018083116129e757829003601f168201915b5050505050905090565b60606000821415612a56576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612bb6565b600082905060005b60008214612a88578080612a7190614268565b915050600a82612a819190613fe2565b9150612a5e565b60008167ffffffffffffffff811115612aca577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612afc5781602001600182028036833780820191505090505b5090505b60008514612baf57600182612b1591906140a1565b9150600a85612b2491906142db565b6030612b309190613f8c565b60f81b818381518110612b6c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ba89190613fe2565b9450612b00565b8093505050505b919050565b612bd5828260405180602001604052806000815250612d75565b5050565b505050565b6000612bff8473ffffffffffffffffffffffffffffffffffffffff16612dd0565b15612d68578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612c286123d7565b8786866040518563ffffffff1660e01b8152600401612c4a9493929190613a98565b602060405180830381600087803b158015612c6457600080fd5b505af1925050508015612c9557506040513d601f19601f82011682018060405250810190612c929190613584565b60015b612d18573d8060008114612cc5576040519150601f19603f3d011682016040523d82523d6000602084013e612cca565b606091505b50600081511415612d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0790613b21565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612d6d565b600190505b949350505050565b612d7f8383612de3565b612d8c6000848484612bde565b612dcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dc290613b21565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4a90613c81565b60405180910390fd5b612e5c8161236b565b15612e9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9390613b61565b60405180910390fd5b612ea860008383612bd9565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ef89190613f8c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612fbd906141da565b90600052602060002090601f016020900481019282612fdf5760008555613026565b82601f10612ff857805160ff1916838001178555613026565b82800160010185558215613026579182015b8281111561302557825182559160200191906001019061300a565b5b5090506130339190613037565b5090565b5b80821115613050576000816000905550600101613038565b5090565b600061306761306284613e57565b613e32565b9050808382526020820190508285602086028201111561308657600080fd5b60005b858110156130b6578161309c88826131a8565b845260208401935060208301925050600181019050613089565b5050509392505050565b60006130d36130ce84613e83565b613e32565b905080838252602082019050828560208602820111156130f257600080fd5b60005b85811015613122578161310888826132ce565b8452602084019350602083019250506001810190506130f5565b5050509392505050565b600061313f61313a84613eaf565b613e32565b90508281526020810184848401111561315757600080fd5b613162848285614198565b509392505050565b600061317d61317884613ee0565b613e32565b90508281526020810184848401111561319557600080fd5b6131a0848285614198565b509392505050565b6000813590506131b78161494d565b92915050565b600082601f8301126131ce57600080fd5b81356131de848260208601613054565b91505092915050565b600082601f8301126131f857600080fd5b81356132088482602086016130c0565b91505092915050565b60008135905061322081614964565b92915050565b6000813590506132358161497b565b92915050565b60008151905061324a8161497b565b92915050565b600082601f83011261326157600080fd5b813561327184826020860161312c565b91505092915050565b600082601f83011261328b57600080fd5b813561329b84826020860161316a565b91505092915050565b6000813590506132b381614992565b92915050565b6000813590506132c8816149a9565b92915050565b6000813590506132dd816149c0565b92915050565b6000602082840312156132f557600080fd5b6000613303848285016131a8565b91505092915050565b6000806040838503121561331f57600080fd5b600061332d858286016131a8565b925050602061333e858286016131a8565b9150509250929050565b60008060006060848603121561335d57600080fd5b600061336b868287016131a8565b935050602061337c868287016131a8565b925050604061338d868287016132b9565b9150509250925092565b600080600080608085870312156133ad57600080fd5b60006133bb878288016131a8565b94505060206133cc878288016131a8565b93505060406133dd878288016132b9565b925050606085013567ffffffffffffffff8111156133fa57600080fd5b61340687828801613250565b91505092959194509250565b6000806040838503121561342557600080fd5b6000613433858286016131a8565b925050602061344485828601613211565b9150509250929050565b6000806040838503121561346157600080fd5b600061346f858286016131a8565b9250506020613480858286016132b9565b9150509250929050565b6000806040838503121561349d57600080fd5b60006134ab858286016131a8565b92505060206134bc858286016132ce565b9150509250929050565b600080604083850312156134d957600080fd5b600083013567ffffffffffffffff8111156134f357600080fd5b6134ff858286016131bd565b925050602083013567ffffffffffffffff81111561351c57600080fd5b613528858286016131e7565b9150509250929050565b60006020828403121561354457600080fd5b600061355284828501613211565b91505092915050565b60006020828403121561356d57600080fd5b600061357b84828501613226565b91505092915050565b60006020828403121561359657600080fd5b60006135a48482850161323b565b91505092915050565b6000602082840312156135bf57600080fd5b600082013567ffffffffffffffff8111156135d957600080fd5b6135e58482850161327a565b91505092915050565b60006020828403121561360057600080fd5b600061360e848285016132a4565b91505092915050565b60006020828403121561362957600080fd5b6000613637848285016132b9565b91505092915050565b60006020828403121561365257600080fd5b6000613660848285016132ce565b91505092915050565b61367281614109565b82525050565b6136818161411b565b82525050565b600061369282613f11565b61369c8185613f27565b93506136ac8185602086016141a7565b6136b5816143c8565b840191505092915050565b60006136cb82613f1c565b6136d58185613f38565b93506136e58185602086016141a7565b6136ee816143c8565b840191505092915050565b600061370482613f1c565b61370e8185613f49565b935061371e8185602086016141a7565b80840191505092915050565b6000613737603283613f38565b9150613742826143d9565b604082019050919050565b600061375a602683613f38565b915061376582614428565b604082019050919050565b600061377d601c83613f38565b915061378882614477565b602082019050919050565b60006137a0602483613f38565b91506137ab826144a0565b604082019050919050565b60006137c3601983613f38565b91506137ce826144ef565b602082019050919050565b60006137e6601283613f38565b91506137f182614518565b602082019050919050565b6000613809602c83613f38565b915061381482614541565b604082019050919050565b600061382c603883613f38565b915061383782614590565b604082019050919050565b600061384f602183613f38565b915061385a826145df565b604082019050919050565b6000613872602a83613f38565b915061387d8261462e565b604082019050919050565b6000613895602983613f38565b91506138a08261467d565b604082019050919050565b60006138b8602083613f38565b91506138c3826146cc565b602082019050919050565b60006138db602c83613f38565b91506138e6826146f5565b604082019050919050565b60006138fe602083613f38565b915061390982614744565b602082019050919050565b6000613921602983613f38565b915061392c8261476d565b604082019050919050565b6000613944602f83613f38565b915061394f826147bc565b604082019050919050565b6000613967602183613f38565b91506139728261480b565b604082019050919050565b600061398a603183613f38565b91506139958261485a565b604082019050919050565b60006139ad601583613f38565b91506139b8826148a9565b602082019050919050565b60006139d0600e83613f38565b91506139db826148d2565b602082019050919050565b60006139f3600d83613f38565b91506139fe826148fb565b602082019050919050565b6000613a16601b83613f38565b9150613a2182614924565b602082019050919050565b613a3581614153565b82525050565b613a4481614181565b82525050565b613a538161418b565b82525050565b6000613a6582856136f9565b9150613a7182846136f9565b91508190509392505050565b6000602082019050613a926000830184613669565b92915050565b6000608082019050613aad6000830187613669565b613aba6020830186613669565b613ac76040830185613a3b565b8181036060830152613ad98184613687565b905095945050505050565b6000602082019050613af96000830184613678565b92915050565b60006020820190508181036000830152613b1981846136c0565b905092915050565b60006020820190508181036000830152613b3a8161372a565b9050919050565b60006020820190508181036000830152613b5a8161374d565b9050919050565b60006020820190508181036000830152613b7a81613770565b9050919050565b60006020820190508181036000830152613b9a81613793565b9050919050565b60006020820190508181036000830152613bba816137b6565b9050919050565b60006020820190508181036000830152613bda816137d9565b9050919050565b60006020820190508181036000830152613bfa816137fc565b9050919050565b60006020820190508181036000830152613c1a8161381f565b9050919050565b60006020820190508181036000830152613c3a81613842565b9050919050565b60006020820190508181036000830152613c5a81613865565b9050919050565b60006020820190508181036000830152613c7a81613888565b9050919050565b60006020820190508181036000830152613c9a816138ab565b9050919050565b60006020820190508181036000830152613cba816138ce565b9050919050565b60006020820190508181036000830152613cda816138f1565b9050919050565b60006020820190508181036000830152613cfa81613914565b9050919050565b60006020820190508181036000830152613d1a81613937565b9050919050565b60006020820190508181036000830152613d3a8161395a565b9050919050565b60006020820190508181036000830152613d5a8161397d565b9050919050565b60006020820190508181036000830152613d7a816139a0565b9050919050565b60006020820190508181036000830152613d9a816139c3565b9050919050565b60006020820190508181036000830152613dba816139e6565b9050919050565b60006020820190508181036000830152613dda81613a09565b9050919050565b6000602082019050613df66000830184613a2c565b92915050565b6000602082019050613e116000830184613a3b565b92915050565b6000602082019050613e2c6000830184613a4a565b92915050565b6000613e3c613e4d565b9050613e48828261420c565b919050565b6000604051905090565b600067ffffffffffffffff821115613e7257613e71614399565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613e9e57613e9d614399565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613eca57613ec9614399565b5b613ed3826143c8565b9050602081019050919050565b600067ffffffffffffffff821115613efb57613efa614399565b5b613f04826143c8565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613f5f82614153565b9150613f6a83614153565b92508261ffff03821115613f8157613f8061430c565b5b828201905092915050565b6000613f9782614181565b9150613fa283614181565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613fd757613fd661430c565b5b828201905092915050565b6000613fed82614181565b9150613ff883614181565b9250826140085761400761433b565b5b828204905092915050565b600061401e82614181565b915061402983614181565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156140625761406161430c565b5b828202905092915050565b600061407882614153565b915061408383614153565b9250828210156140965761409561430c565b5b828203905092915050565b60006140ac82614181565b91506140b783614181565b9250828210156140ca576140c961430c565b5b828203905092915050565b60006140e08261418b565b91506140eb8361418b565b9250828210156140fe576140fd61430c565b5b828203905092915050565b600061411482614161565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156141c55780820151818401526020810190506141aa565b838111156141d4576000848401525b50505050565b600060028204905060018216806141f257607f821691505b602082108114156142065761420561436a565b5b50919050565b614215826143c8565b810181811067ffffffffffffffff8211171561423457614233614399565b5b80604052505050565b600061424882614153565b915061ffff82141561425d5761425c61430c565b5b600182019050919050565b600061427382614181565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156142a6576142a561430c565b5b600182019050919050565b60006142bc8261418b565b915060ff8214156142d0576142cf61430c565b5b600182019050919050565b60006142e682614181565b91506142f183614181565b9250826143015761430061433b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f53616c65206973206e6f74206163746976650000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f596f752063616e206e6f7420627579206d6f7265207468616e20616c6c6f776560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f50726573616c65206973206e6f74206163746976650000000000000000000000600082015250565b7f4e6f206d6f726520737570706c79000000000000000000000000000000000000600082015250565b7f496e76616c696420707269636500000000000000000000000000000000000000600082015250565b7f596f752063616e206e6f74206d696e74206f6e2070726573616c650000000000600082015250565b61495681614109565b811461496157600080fd5b50565b61496d8161411b565b811461497857600080fd5b50565b61498481614127565b811461498f57600080fd5b50565b61499b81614153565b81146149a657600080fd5b50565b6149b281614181565b81146149bd57600080fd5b50565b6149c98161418b565b81146149d457600080fd5b5056fea264697066735822122024511d674bd1ce98cd1ef87c890a65a393e79e8bad443fed2e87b10f776cc9f664736f6c6343000804003300000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000058d15e17628000000000000000000000000000000000000000000000000000000000000000138800000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000c446f6f646c6520536c7567730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000244530000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024687474703a2f2f6170692e646f6f646c65736c7567732e636f6d2f6d657461646174612f00000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102305760003560e01c8063715018a61161012e578063a24ffbd4116100ab578063c54e73e31161006f578063c54e73e3146107d4578063c87b56dd146107fd578063e985e9c51461083a578063f2fde38b14610877578063fdea8e0b146108a057610230565b8063a24ffbd414610712578063a63b94f51461073b578063affed0e014610757578063b88d4fde14610782578063c1408d79146107ab57610230565b806391b7f5ed116100f257806391b7f5ed1461062d57806395d89b41146106565780639dcd8cde14610681578063a035b1fe146106be578063a22cb465146106e957610230565b8063715018a61461056c57806373bfad87146105835780637437681e146105ac5780638cb2923c146105d75780638da5cb5b1461060257610230565b80633ccfd60b116101bc5780636352211e116101805780636352211e1461048257806365f48e62146104bf57806369d957f4146104e85780636ad1fe021461050457806370a082311461052f57610230565b80633ccfd60b146103c557806342842e0e146103dc578063485a68a31461040557806355f804b314610430578063562e438b1461045957610230565b806314107f3c1161020357806314107f3c146103035780631734039c1461031f57806318160ddd146103485780631d2e5a3a1461037357806323b872dd1461039c57610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063095ea7b3146102da575b600080fd5b34801561024157600080fd5b5061025c6004803603810190610257919061355b565b6108cb565b6040516102699190613ae4565b60405180910390f35b34801561027e57600080fd5b506102876109ad565b6040516102949190613aff565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf9190613617565b610a3f565b6040516102d19190613a7d565b60405180910390f35b3480156102e657600080fd5b5061030160048036038101906102fc919061344e565b610ac4565b005b61031d60048036038101906103189190613640565b610bdc565b005b34801561032b57600080fd5b5061034660048036038101906103419190613640565b610e1f565b005b34801561035457600080fd5b5061035d610ea8565b60405161036a9190613de1565b60405180910390f35b34801561037f57600080fd5b5061039a60048036038101906103959190613532565b610ebc565b005b3480156103a857600080fd5b506103c360048036038101906103be9190613348565b610f55565b005b3480156103d157600080fd5b506103da610fb5565b005b3480156103e857600080fd5b5061040360048036038101906103fe9190613348565b61107a565b005b34801561041157600080fd5b5061041a61109a565b6040516104279190613dfc565b60405180910390f35b34801561043c57600080fd5b50610457600480360381019061045291906135ad565b6110a0565b005b34801561046557600080fd5b50610480600480360381019061047b91906135ee565b611136565b005b34801561048e57600080fd5b506104a960048036038101906104a49190613617565b6111d2565b6040516104b69190613a7d565b60405180910390f35b3480156104cb57600080fd5b506104e660048036038101906104e19190613640565b611284565b005b61050260048036038101906104fd9190613640565b61131e565b005b34801561051057600080fd5b506105196114ea565b6040516105269190613ae4565b60405180910390f35b34801561053b57600080fd5b50610556600480360381019061055191906132e3565b6114fd565b6040516105639190613dfc565b60405180910390f35b34801561057857600080fd5b506105816115b5565b005b34801561058f57600080fd5b506105aa60048036038101906105a591906134c6565b61163d565b005b3480156105b857600080fd5b506105c16117be565b6040516105ce9190613e17565b60405180910390f35b3480156105e357600080fd5b506105ec6117d1565b6040516105f99190613de1565b60405180910390f35b34801561060e57600080fd5b506106176117e5565b6040516106249190613a7d565b60405180910390f35b34801561063957600080fd5b50610654600480360381019061064f9190613617565b61180f565b005b34801561066257600080fd5b5061066b611895565b6040516106789190613aff565b60405180910390f35b34801561068d57600080fd5b506106a860048036038101906106a391906132e3565b611927565b6040516106b59190613e17565b60405180910390f35b3480156106ca57600080fd5b506106d361197d565b6040516106e09190613dfc565b60405180910390f35b3480156106f557600080fd5b50610710600480360381019061070b9190613412565b611983565b005b34801561071e57600080fd5b506107396004803603810190610734919061348a565b611b04565b005b61075560048036038101906107509190613640565b611c13565b005b34801561076357600080fd5b5061076c611f10565b6040516107799190613de1565b60405180910390f35b34801561078e57600080fd5b506107a960048036038101906107a49190613397565b611f24565b005b3480156107b757600080fd5b506107d260048036038101906107cd91906135ee565b611f86565b005b3480156107e057600080fd5b506107fb60048036038101906107f69190613532565b612022565b005b34801561080957600080fd5b50610824600480360381019061081f9190613617565b6120bb565b6040516108319190613aff565b60405180910390f35b34801561084657600080fd5b50610861600480360381019061085c919061330c565b612162565b60405161086e9190613ae4565b60405180910390f35b34801561088357600080fd5b5061089e600480360381019061089991906132e3565b6121f6565b005b3480156108ac57600080fd5b506108b56122ee565b6040516108c29190613ae4565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061099657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109a657506109a582612301565b5b9050919050565b6060600080546109bc906141da565b80601f01602080910402602001604051908101604052809291908181526020018280546109e8906141da565b8015610a355780601f10610a0a57610100808354040283529160200191610a35565b820191906000526020600020905b815481529060010190602001808311610a1857829003601f168201915b5050505050905090565b6000610a4a8261236b565b610a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8090613ca1565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610acf826111d2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3790613d21565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b5f6123d7565b73ffffffffffffffffffffffffffffffffffffffff161480610b8e5750610b8d81610b886123d7565b612162565b5b610bcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc490613c01565b60405180910390fd5b610bd783836123df565b505050565b600660149054906101000a900460ff16610c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2290613bc1565b60405180910390fd5b600a60049054906101000a900460ff1660ff168160ff16111580610c52575060018160ff16105b610c91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8890613c21565b60405180910390fd5b600a60009054906101000a900461ffff1661ffff166001600860009054906101000a900461ffff168360ff16610cc79190613f54565b610cd1919061406d565b61ffff161115610d16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0d90613d81565b60405180910390fd5b600a60029054906101000a900461ffff1661ffff166001600860009054906101000a900461ffff168360ff16610d4c9190613f54565b610d56919061406d565b61ffff161115610d9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9290613d81565b60405180910390fd5b600b54600860009054906101000a900461ffff1661ffff161015610dbe57610e12565b8060ff16600954610dcf9190614013565b341015610e11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0890613da1565b60405180910390fd5b5b610e1c3382612498565b50565b610e276123d7565b73ffffffffffffffffffffffffffffffffffffffff16610e456117e5565b73ffffffffffffffffffffffffffffffffffffffff1614610e9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9290613cc1565b60405180910390fd5b8060ff16600b8190555050565b600a60029054906101000a900461ffff1681565b610ec46123d7565b73ffffffffffffffffffffffffffffffffffffffff16610ee26117e5565b73ffffffffffffffffffffffffffffffffffffffff1614610f38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2f90613cc1565b60405180910390fd5b80600660146101000a81548160ff02191690831515021790555050565b610f66610f606123d7565b82612520565b610fa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9c90613d41565b60405180910390fd5b610fb08383836125fe565b505050565b610fbd6123d7565b73ffffffffffffffffffffffffffffffffffffffff16610fdb6117e5565b73ffffffffffffffffffffffffffffffffffffffff1614611031576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102890613cc1565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611077573d6000803e3d6000fd5b50565b61109583838360405180602001604052806000815250611f24565b505050565b600b5481565b6110a86123d7565b73ffffffffffffffffffffffffffffffffffffffff166110c66117e5565b73ffffffffffffffffffffffffffffffffffffffff161461111c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111390613cc1565b60405180910390fd5b8060079080519060200190611132929190612fb1565b5050565b61113e6123d7565b73ffffffffffffffffffffffffffffffffffffffff1661115c6117e5565b73ffffffffffffffffffffffffffffffffffffffff16146111b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a990613cc1565b60405180910390fd5b80600a60026101000a81548161ffff021916908361ffff16021790555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561127b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127290613c61565b60405180910390fd5b80915050919050565b61128c6123d7565b73ffffffffffffffffffffffffffffffffffffffff166112aa6117e5565b73ffffffffffffffffffffffffffffffffffffffff1614611300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f790613cc1565b60405180910390fd5b80600a60046101000a81548160ff021916908360ff16021790555050565b600660149054906101000a900460ff1661136d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136490613bc1565b60405180910390fd5b600a60049054906101000a900460ff1660ff168160ff16111580611394575060018160ff16105b6113d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ca90613c21565b60405180910390fd5b600a60009054906101000a900461ffff1661ffff166001600860009054906101000a900461ffff168360ff166114099190613f54565b611413919061406d565b61ffff161115611458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144f90613d81565b60405180910390fd5b600a60029054906101000a900461ffff1661ffff166001600860009054906101000a900461ffff168360ff1661148e9190613f54565b611498919061406d565b61ffff1611156114dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d490613d81565b60405180910390fd5b6114e73382612498565b50565b600660149054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561156e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156590613c41565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6115bd6123d7565b73ffffffffffffffffffffffffffffffffffffffff166115db6117e5565b73ffffffffffffffffffffffffffffffffffffffff1614611631576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162890613cc1565b60405180910390fd5b61163b600061285a565b565b6116456123d7565b73ffffffffffffffffffffffffffffffffffffffff166116636117e5565b73ffffffffffffffffffffffffffffffffffffffff16146116b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b090613cc1565b60405180910390fd5b60005b82518160ff1610156117b957818160ff1681518110611704577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600c6000858460ff168151811061174c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff16021790555080806117b1906142b1565b9150506116bc565b505050565b600a60049054906101000a900460ff1681565b600a60009054906101000a900461ffff1681565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6118176123d7565b73ffffffffffffffffffffffffffffffffffffffff166118356117e5565b73ffffffffffffffffffffffffffffffffffffffff161461188b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188290613cc1565b60405180910390fd5b8060098190555050565b6060600180546118a4906141da565b80601f01602080910402602001604051908101604052809291908181526020018280546118d0906141da565b801561191d5780601f106118f25761010080835404028352916020019161191d565b820191906000526020600020905b81548152906001019060200180831161190057829003601f168201915b5050505050905090565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60095481565b61198b6123d7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f090613ba1565b60405180910390fd5b8060056000611a066123d7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ab36123d7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611af89190613ae4565b60405180910390a35050565b611b0c6123d7565b73ffffffffffffffffffffffffffffffffffffffff16611b2a6117e5565b73ffffffffffffffffffffffffffffffffffffffff1614611b80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7790613cc1565b60405180910390fd5b600a60029054906101000a900461ffff1661ffff166001600860009054906101000a900461ffff168360ff16611bb69190613f54565b611bc0919061406d565b61ffff161115611c05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfc90613d81565b60405180910390fd5b611c0f8282612498565b5050565b6000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050600660159054906101000a900460ff16611cb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611caa90613d61565b60405180910390fd5b8060ff168260ff161115611cfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf390613c21565b60405180910390fd5b60008160ff1611611d42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3990613dc1565b60405180910390fd5b600a60009054906101000a900461ffff1661ffff166001600860009054906101000a900461ffff168460ff16611d789190613f54565b611d82919061406d565b61ffff161115611dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbe90613d81565b60405180910390fd5b600a60029054906101000a900461ffff1661ffff166001600860009054906101000a900461ffff168460ff16611dfd9190613f54565b611e07919061406d565b61ffff161115611e4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4390613d81565b60405180910390fd5b8160ff16600954611e5d9190614013565b341015611e9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9690613da1565b60405180910390fd5b8181611eab91906140d5565b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550611f0c3383612498565b5050565b600860009054906101000a900461ffff1681565b611f35611f2f6123d7565b83612520565b611f74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6b90613d41565b60405180910390fd5b611f8084848484612920565b50505050565b611f8e6123d7565b73ffffffffffffffffffffffffffffffffffffffff16611fac6117e5565b73ffffffffffffffffffffffffffffffffffffffff1614612002576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff990613cc1565b60405180910390fd5b80600a60006101000a81548161ffff021916908361ffff16021790555050565b61202a6123d7565b73ffffffffffffffffffffffffffffffffffffffff166120486117e5565b73ffffffffffffffffffffffffffffffffffffffff161461209e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209590613cc1565b60405180910390fd5b80600660156101000a81548160ff02191690831515021790555050565b60606120c68261236b565b612105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fc90613d01565b60405180910390fd5b600061210f61297c565b9050600081511161212f576040518060200160405280600081525061215a565b8061213984612a0e565b60405160200161214a929190613a59565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6121fe6123d7565b73ffffffffffffffffffffffffffffffffffffffff1661221c6117e5565b73ffffffffffffffffffffffffffffffffffffffff1614612272576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226990613cc1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156122e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d990613b41565b60405180910390fd5b6122eb8161285a565b50565b600660159054906101000a900460ff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612452836111d2565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60005b8160ff168160ff16101561251b576000600860009054906101000a900461ffff1690506124cc848261ffff16612bbb565b6008600081819054906101000a900461ffff16809291906124ec9061423d565b91906101000a81548161ffff021916908361ffff16021790555050508080612513906142b1565b91505061249b565b505050565b600061252b8261236b565b61256a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256190613be1565b60405180910390fd5b6000612575836111d2565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806125e457508373ffffffffffffffffffffffffffffffffffffffff166125cc84610a3f565b73ffffffffffffffffffffffffffffffffffffffff16145b806125f557506125f48185612162565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661261e826111d2565b73ffffffffffffffffffffffffffffffffffffffff1614612674576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266b90613ce1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126db90613b81565b60405180910390fd5b6126ef838383612bd9565b6126fa6000826123df565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461274a91906140a1565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127a19190613f8c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61292b8484846125fe565b61293784848484612bde565b612976576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296d90613b21565b60405180910390fd5b50505050565b60606007805461298b906141da565b80601f01602080910402602001604051908101604052809291908181526020018280546129b7906141da565b8015612a045780601f106129d957610100808354040283529160200191612a04565b820191906000526020600020905b8154815290600101906020018083116129e757829003601f168201915b5050505050905090565b60606000821415612a56576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612bb6565b600082905060005b60008214612a88578080612a7190614268565b915050600a82612a819190613fe2565b9150612a5e565b60008167ffffffffffffffff811115612aca577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612afc5781602001600182028036833780820191505090505b5090505b60008514612baf57600182612b1591906140a1565b9150600a85612b2491906142db565b6030612b309190613f8c565b60f81b818381518110612b6c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ba89190613fe2565b9450612b00565b8093505050505b919050565b612bd5828260405180602001604052806000815250612d75565b5050565b505050565b6000612bff8473ffffffffffffffffffffffffffffffffffffffff16612dd0565b15612d68578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612c286123d7565b8786866040518563ffffffff1660e01b8152600401612c4a9493929190613a98565b602060405180830381600087803b158015612c6457600080fd5b505af1925050508015612c9557506040513d601f19601f82011682018060405250810190612c929190613584565b60015b612d18573d8060008114612cc5576040519150601f19603f3d011682016040523d82523d6000602084013e612cca565b606091505b50600081511415612d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0790613b21565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612d6d565b600190505b949350505050565b612d7f8383612de3565b612d8c6000848484612bde565b612dcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dc290613b21565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4a90613c81565b60405180910390fd5b612e5c8161236b565b15612e9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9390613b61565b60405180910390fd5b612ea860008383612bd9565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ef89190613f8c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612fbd906141da565b90600052602060002090601f016020900481019282612fdf5760008555613026565b82601f10612ff857805160ff1916838001178555613026565b82800160010185558215613026579182015b8281111561302557825182559160200191906001019061300a565b5b5090506130339190613037565b5090565b5b80821115613050576000816000905550600101613038565b5090565b600061306761306284613e57565b613e32565b9050808382526020820190508285602086028201111561308657600080fd5b60005b858110156130b6578161309c88826131a8565b845260208401935060208301925050600181019050613089565b5050509392505050565b60006130d36130ce84613e83565b613e32565b905080838252602082019050828560208602820111156130f257600080fd5b60005b85811015613122578161310888826132ce565b8452602084019350602083019250506001810190506130f5565b5050509392505050565b600061313f61313a84613eaf565b613e32565b90508281526020810184848401111561315757600080fd5b613162848285614198565b509392505050565b600061317d61317884613ee0565b613e32565b90508281526020810184848401111561319557600080fd5b6131a0848285614198565b509392505050565b6000813590506131b78161494d565b92915050565b600082601f8301126131ce57600080fd5b81356131de848260208601613054565b91505092915050565b600082601f8301126131f857600080fd5b81356132088482602086016130c0565b91505092915050565b60008135905061322081614964565b92915050565b6000813590506132358161497b565b92915050565b60008151905061324a8161497b565b92915050565b600082601f83011261326157600080fd5b813561327184826020860161312c565b91505092915050565b600082601f83011261328b57600080fd5b813561329b84826020860161316a565b91505092915050565b6000813590506132b381614992565b92915050565b6000813590506132c8816149a9565b92915050565b6000813590506132dd816149c0565b92915050565b6000602082840312156132f557600080fd5b6000613303848285016131a8565b91505092915050565b6000806040838503121561331f57600080fd5b600061332d858286016131a8565b925050602061333e858286016131a8565b9150509250929050565b60008060006060848603121561335d57600080fd5b600061336b868287016131a8565b935050602061337c868287016131a8565b925050604061338d868287016132b9565b9150509250925092565b600080600080608085870312156133ad57600080fd5b60006133bb878288016131a8565b94505060206133cc878288016131a8565b93505060406133dd878288016132b9565b925050606085013567ffffffffffffffff8111156133fa57600080fd5b61340687828801613250565b91505092959194509250565b6000806040838503121561342557600080fd5b6000613433858286016131a8565b925050602061344485828601613211565b9150509250929050565b6000806040838503121561346157600080fd5b600061346f858286016131a8565b9250506020613480858286016132b9565b9150509250929050565b6000806040838503121561349d57600080fd5b60006134ab858286016131a8565b92505060206134bc858286016132ce565b9150509250929050565b600080604083850312156134d957600080fd5b600083013567ffffffffffffffff8111156134f357600080fd5b6134ff858286016131bd565b925050602083013567ffffffffffffffff81111561351c57600080fd5b613528858286016131e7565b9150509250929050565b60006020828403121561354457600080fd5b600061355284828501613211565b91505092915050565b60006020828403121561356d57600080fd5b600061357b84828501613226565b91505092915050565b60006020828403121561359657600080fd5b60006135a48482850161323b565b91505092915050565b6000602082840312156135bf57600080fd5b600082013567ffffffffffffffff8111156135d957600080fd5b6135e58482850161327a565b91505092915050565b60006020828403121561360057600080fd5b600061360e848285016132a4565b91505092915050565b60006020828403121561362957600080fd5b6000613637848285016132b9565b91505092915050565b60006020828403121561365257600080fd5b6000613660848285016132ce565b91505092915050565b61367281614109565b82525050565b6136818161411b565b82525050565b600061369282613f11565b61369c8185613f27565b93506136ac8185602086016141a7565b6136b5816143c8565b840191505092915050565b60006136cb82613f1c565b6136d58185613f38565b93506136e58185602086016141a7565b6136ee816143c8565b840191505092915050565b600061370482613f1c565b61370e8185613f49565b935061371e8185602086016141a7565b80840191505092915050565b6000613737603283613f38565b9150613742826143d9565b604082019050919050565b600061375a602683613f38565b915061376582614428565b604082019050919050565b600061377d601c83613f38565b915061378882614477565b602082019050919050565b60006137a0602483613f38565b91506137ab826144a0565b604082019050919050565b60006137c3601983613f38565b91506137ce826144ef565b602082019050919050565b60006137e6601283613f38565b91506137f182614518565b602082019050919050565b6000613809602c83613f38565b915061381482614541565b604082019050919050565b600061382c603883613f38565b915061383782614590565b604082019050919050565b600061384f602183613f38565b915061385a826145df565b604082019050919050565b6000613872602a83613f38565b915061387d8261462e565b604082019050919050565b6000613895602983613f38565b91506138a08261467d565b604082019050919050565b60006138b8602083613f38565b91506138c3826146cc565b602082019050919050565b60006138db602c83613f38565b91506138e6826146f5565b604082019050919050565b60006138fe602083613f38565b915061390982614744565b602082019050919050565b6000613921602983613f38565b915061392c8261476d565b604082019050919050565b6000613944602f83613f38565b915061394f826147bc565b604082019050919050565b6000613967602183613f38565b91506139728261480b565b604082019050919050565b600061398a603183613f38565b91506139958261485a565b604082019050919050565b60006139ad601583613f38565b91506139b8826148a9565b602082019050919050565b60006139d0600e83613f38565b91506139db826148d2565b602082019050919050565b60006139f3600d83613f38565b91506139fe826148fb565b602082019050919050565b6000613a16601b83613f38565b9150613a2182614924565b602082019050919050565b613a3581614153565b82525050565b613a4481614181565b82525050565b613a538161418b565b82525050565b6000613a6582856136f9565b9150613a7182846136f9565b91508190509392505050565b6000602082019050613a926000830184613669565b92915050565b6000608082019050613aad6000830187613669565b613aba6020830186613669565b613ac76040830185613a3b565b8181036060830152613ad98184613687565b905095945050505050565b6000602082019050613af96000830184613678565b92915050565b60006020820190508181036000830152613b1981846136c0565b905092915050565b60006020820190508181036000830152613b3a8161372a565b9050919050565b60006020820190508181036000830152613b5a8161374d565b9050919050565b60006020820190508181036000830152613b7a81613770565b9050919050565b60006020820190508181036000830152613b9a81613793565b9050919050565b60006020820190508181036000830152613bba816137b6565b9050919050565b60006020820190508181036000830152613bda816137d9565b9050919050565b60006020820190508181036000830152613bfa816137fc565b9050919050565b60006020820190508181036000830152613c1a8161381f565b9050919050565b60006020820190508181036000830152613c3a81613842565b9050919050565b60006020820190508181036000830152613c5a81613865565b9050919050565b60006020820190508181036000830152613c7a81613888565b9050919050565b60006020820190508181036000830152613c9a816138ab565b9050919050565b60006020820190508181036000830152613cba816138ce565b9050919050565b60006020820190508181036000830152613cda816138f1565b9050919050565b60006020820190508181036000830152613cfa81613914565b9050919050565b60006020820190508181036000830152613d1a81613937565b9050919050565b60006020820190508181036000830152613d3a8161395a565b9050919050565b60006020820190508181036000830152613d5a8161397d565b9050919050565b60006020820190508181036000830152613d7a816139a0565b9050919050565b60006020820190508181036000830152613d9a816139c3565b9050919050565b60006020820190508181036000830152613dba816139e6565b9050919050565b60006020820190508181036000830152613dda81613a09565b9050919050565b6000602082019050613df66000830184613a2c565b92915050565b6000602082019050613e116000830184613a3b565b92915050565b6000602082019050613e2c6000830184613a4a565b92915050565b6000613e3c613e4d565b9050613e48828261420c565b919050565b6000604051905090565b600067ffffffffffffffff821115613e7257613e71614399565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613e9e57613e9d614399565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613eca57613ec9614399565b5b613ed3826143c8565b9050602081019050919050565b600067ffffffffffffffff821115613efb57613efa614399565b5b613f04826143c8565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613f5f82614153565b9150613f6a83614153565b92508261ffff03821115613f8157613f8061430c565b5b828201905092915050565b6000613f9782614181565b9150613fa283614181565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613fd757613fd661430c565b5b828201905092915050565b6000613fed82614181565b9150613ff883614181565b9250826140085761400761433b565b5b828204905092915050565b600061401e82614181565b915061402983614181565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156140625761406161430c565b5b828202905092915050565b600061407882614153565b915061408383614153565b9250828210156140965761409561430c565b5b828203905092915050565b60006140ac82614181565b91506140b783614181565b9250828210156140ca576140c961430c565b5b828203905092915050565b60006140e08261418b565b91506140eb8361418b565b9250828210156140fe576140fd61430c565b5b828203905092915050565b600061411482614161565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156141c55780820151818401526020810190506141aa565b838111156141d4576000848401525b50505050565b600060028204905060018216806141f257607f821691505b602082108114156142065761420561436a565b5b50919050565b614215826143c8565b810181811067ffffffffffffffff8211171561423457614233614399565b5b80604052505050565b600061424882614153565b915061ffff82141561425d5761425c61430c565b5b600182019050919050565b600061427382614181565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156142a6576142a561430c565b5b600182019050919050565b60006142bc8261418b565b915060ff8214156142d0576142cf61430c565b5b600182019050919050565b60006142e682614181565b91506142f183614181565b9250826143015761430061433b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f53616c65206973206e6f74206163746976650000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f596f752063616e206e6f7420627579206d6f7265207468616e20616c6c6f776560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f50726573616c65206973206e6f74206163746976650000000000000000000000600082015250565b7f4e6f206d6f726520737570706c79000000000000000000000000000000000000600082015250565b7f496e76616c696420707269636500000000000000000000000000000000000000600082015250565b7f596f752063616e206e6f74206d696e74206f6e2070726573616c650000000000600082015250565b61495681614109565b811461496157600080fd5b50565b61496d8161411b565b811461497857600080fd5b50565b61498481614127565b811461498f57600080fd5b50565b61499b81614153565b81146149a657600080fd5b50565b6149b281614181565b81146149bd57600080fd5b50565b6149c98161418b565b81146149d457600080fd5b5056fea264697066735822122024511d674bd1ce98cd1ef87c890a65a393e79e8bad443fed2e87b10f776cc9f664736f6c63430008040033

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

00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000058d15e17628000000000000000000000000000000000000000000000000000000000000000138800000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000c446f6f646c6520536c7567730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000244530000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024687474703a2f2f6170692e646f6f646c65736c7567732e636f6d2f6d657461646174612f00000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Doodle Slugs
Arg [1] : _ticker (string): DS
Arg [2] : _price (uint256): 25000000000000000
Arg [3] : _totalSupply (uint16): 5000
Arg [4] : _maxTx (uint8): 20
Arg [5] : baseURI_ (string): http://api.doodleslugs.com/metadata/

-----Encoded View---------------
13 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 0000000000000000000000000000000000000000000000000058d15e17628000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000001388
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [6] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [7] : 446f6f646c6520536c7567730000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [9] : 4453000000000000000000000000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000024
Arg [11] : 687474703a2f2f6170692e646f6f646c65736c7567732e636f6d2f6d65746164
Arg [12] : 6174612f00000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

51653:4319:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20792:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21737:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23296:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22819:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54563:496;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53703:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51908:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53305:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24186:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55858:109;;;;;;;;;;;;;:::i;:::-;;24596:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51970:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52649:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53099:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21431:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53609:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55067:375;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51703:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21161:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44061:94;;;;;;;;;;;;;:::i;:::-;;53392:209;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51942:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51874:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43410:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52889:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21906:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53801:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51846:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23589:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55450:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53934:621;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51814:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24852:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52986:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53212:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22081:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23955:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44310:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51737:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20792:305;20894:4;20946:25;20931:40;;;:11;:40;;;;:105;;;;21003:33;20988:48;;;:11;:48;;;;20931:105;:158;;;;21053:36;21077:11;21053:23;:36::i;:::-;20931:158;20911:178;;20792:305;;;:::o;21737:100::-;21791:13;21824:5;21817:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21737:100;:::o;23296:221::-;23372:7;23400:16;23408:7;23400;:16::i;:::-;23392:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23485:15;:24;23501:7;23485:24;;;;;;;;;;;;;;;;;;;;;23478:31;;23296:221;;;:::o;22819:411::-;22900:13;22916:23;22931:7;22916:14;:23::i;:::-;22900:39;;22964:5;22958:11;;:2;:11;;;;22950:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23058:5;23042:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23067:37;23084:5;23091:12;:10;:12::i;:::-;23067:16;:37::i;:::-;23042:62;23020:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23201:21;23210:2;23214:7;23201:8;:21::i;:::-;22819:411;;;:::o;54563:496::-;54624:4;;;;;;;;;;;54616:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;54678:5;;;;;;;;;;;54670:13;;:4;:13;;;;:25;;;;54694:1;54687:4;:8;;;54670:25;54662:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;54780:11;;;;;;;;;;;54752:39;;54775:1;54767:5;;;;;;;;;;;54759:4;54752:12;;:20;;;;:::i;:::-;:24;;;;:::i;:::-;:39;;;;54744:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;54857:11;;;;;;;;;;;54829:39;;54852:1;54844:5;;;;;;;;;;;54836:4;54829:12;;:20;;;;:::i;:::-;:24;;;;:::i;:::-;:39;;;;54821:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;54910:7;;54902:5;;;;;;;;;;;:15;;;54898:115;;;;;;54979:4;54971:12;;:5;;:12;;;;:::i;:::-;54958:9;:25;;54950:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;54898:115;55025:26;55034:10;55046:4;55025:8;:26::i;:::-;54563:496;:::o;53703:90::-;43641:12;:10;:12::i;:::-;43630:23;;:7;:5;:7::i;:::-;:23;;;43622:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53778:7:::1;53768:17;;:7;:17;;;;53703:90:::0;:::o;51908:27::-;;;;;;;;;;;;;:::o;53305:79::-;43641:12;:10;:12::i;:::-;43630:23;;:7;:5;:7::i;:::-;:23;;;43622:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53370:6:::1;53363:4;;:13;;;;;;;;;;;;;;;;;;53305:79:::0;:::o;24186:339::-;24381:41;24400:12;:10;:12::i;:::-;24414:7;24381:18;:41::i;:::-;24373:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24489:28;24499:4;24505:2;24509:7;24489:9;:28::i;:::-;24186:339;;;:::o;55858:109::-;43641:12;:10;:12::i;:::-;43630:23;;:7;:5;:7::i;:::-;:23;;;43622:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55916:10:::1;55908:28;;:51;55937:21;55908:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;55858:109::o:0;24596:185::-;24734:39;24751:4;24757:2;24761:7;24734:39;;;;;;;;;;;;:16;:39::i;:::-;24596:185;;;:::o;51970:32::-;;;;:::o;52649:107::-;43641:12;:10;:12::i;:::-;43630:23;;:7;:5;:7::i;:::-;:23;;;43622:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52740:8:::1;52721:16;:27;;;;;;;;;;;;:::i;:::-;;52649:107:::0;:::o;53099:105::-;43641:12;:10;:12::i;:::-;43630:23;;:7;:5;:7::i;:::-;:23;;;43622:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53186:10:::1;53172:11;;:24;;;;;;;;;;;;;;;;;;53099:105:::0;:::o;21431:239::-;21503:7;21523:13;21539:7;:16;21547:7;21539:16;;;;;;;;;;;;;;;;;;;;;21523:32;;21591:1;21574:19;;:5;:19;;;;21566:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21657:5;21650:12;;;21431:239;;;:::o;53609:86::-;43641:12;:10;:12::i;:::-;43630:23;;:7;:5;:7::i;:::-;:23;;;43622:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53680:7:::1;53672:5;;:15;;;;;;;;;;;;;;;;;;53609:86:::0;:::o;55067:375::-;55132:4;;;;;;;;;;;55124:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;55186:5;;;;;;;;;;;55178:13;;:4;:13;;;;:25;;;;55202:1;55195:4;:8;;;55178:25;55170:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;55288:11;;;;;;;;;;;55260:39;;55283:1;55275:5;;;;;;;;;;;55267:4;55260:12;;:20;;;;:::i;:::-;:24;;;;:::i;:::-;:39;;;;55252:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;55365:11;;;;;;;;;;;55337:39;;55360:1;55352:5;;;;;;;;;;;55344:4;55337:12;;:20;;;;:::i;:::-;:24;;;;:::i;:::-;:39;;;;55329:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;55408:26;55417:10;55429:4;55408:8;:26::i;:::-;55067:375;:::o;51703:27::-;;;;;;;;;;;;;:::o;21161:208::-;21233:7;21278:1;21261:19;;:5;:19;;;;21253:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21345:9;:16;21355:5;21345:16;;;;;;;;;;;;;;;;21338:23;;21161:208;;;:::o;44061:94::-;43641:12;:10;:12::i;:::-;43630:23;;:7;:5;:7::i;:::-;:23;;;43622:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44126:21:::1;44144:1;44126:9;:21::i;:::-;44061:94::o:0;53392:209::-;43641:12;:10;:12::i;:::-;43630:23;;:7;:5;:7::i;:::-;:23;;;43622:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53504:7:::1;53499:95;53517:2;:9;53513:1;:13;;;53499:95;;;53572:7;53580:1;53572:10;;;;;;;;;;;;;;;;;;;;;;;;53548:14;:21;53563:2;53566:1;53563:5;;;;;;;;;;;;;;;;;;;;;;;;53548:21;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;53528:3;;;;;:::i;:::-;;;;53499:95;;;;53392:209:::0;;:::o;51942:21::-;;;;;;;;;;;;;:::o;51874:27::-;;;;;;;;;;;;;:::o;43410:87::-;43456:7;43483:6;;;;;;;;;;;43476:13;;43410:87;:::o;52889:89::-;43641:12;:10;:12::i;:::-;43630:23;;:7;:5;:7::i;:::-;:23;;;43622:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52961:9:::1;52953:5;:17;;;;52889:89:::0;:::o;21906:104::-;21962:13;21995:7;21988:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21906:104;:::o;53801:125::-;53870:5;53895:14;:23;53910:7;53895:23;;;;;;;;;;;;;;;;;;;;;;;;;53888:30;;53801:125;;;:::o;51846:21::-;;;;:::o;23589:295::-;23704:12;:10;:12::i;:::-;23692:24;;:8;:24;;;;23684:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23804:8;23759:18;:32;23778:12;:10;:12::i;:::-;23759:32;;;;;;;;;;;;;;;:42;23792:8;23759:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23857:8;23828:48;;23843:12;:10;:12::i;:::-;23828:48;;;23867:8;23828:48;;;;;;:::i;:::-;;;;;;;;23589:295;;:::o;55450:179::-;43641:12;:10;:12::i;:::-;43630:23;;:7;:5;:7::i;:::-;:23;;;43622:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55559:11:::1;;;;;;;;;;;55531:39;;55554:1;55546:5;;;;;;;;;;;55538:4;55531:12;;:20;;;;:::i;:::-;:24;;;;:::i;:::-;:39;;;;55523:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;55602:19;55611:3;55616:4;55602:8;:19::i;:::-;55450:179:::0;;:::o;53934:621::-;53994:17;54014:14;:26;54029:10;54014:26;;;;;;;;;;;;;;;;;;;;;;;;;53994:46;;54059:7;;;;;;;;;;;54051:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;54119:11;54111:19;;:4;:19;;;;54103:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;54201:1;54187:11;:15;;;54179:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;54281:11;;;;;;;;;;;54253:39;;54276:1;54268:5;;;;;;;;;;;54260:4;54253:12;;:20;;;;:::i;:::-;:24;;;;:::i;:::-;:39;;;;54245:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;54358:11;;;;;;;;;;;54330:39;;54353:1;54345:5;;;;;;;;;;;54337:4;54330:12;;:20;;;;:::i;:::-;:24;;;;:::i;:::-;:39;;;;54322:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;54428:4;54420:12;;:5;;:12;;;;:::i;:::-;54407:9;:25;;54399:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;54504:4;54490:11;:18;;;;:::i;:::-;54461:14;:26;54476:10;54461:26;;;;;;;;;;;;;;;;:47;;;;;;;;;;;;;;;;;;54521:26;54530:10;54542:4;54521:8;:26::i;:::-;53934:621;;:::o;51814:25::-;;;;;;;;;;;;;:::o;24852:328::-;25027:41;25046:12;:10;:12::i;:::-;25060:7;25027:18;:41::i;:::-;25019:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25133:39;25147:4;25153:2;25157:7;25166:5;25133:13;:39::i;:::-;24852:328;;;;:::o;52986:105::-;43641:12;:10;:12::i;:::-;43630:23;;:7;:5;:7::i;:::-;:23;;;43622:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53073:10:::1;53059:11;;:24;;;;;;;;;;;;;;;;;;52986:105:::0;:::o;53212:85::-;43641:12;:10;:12::i;:::-;43630:23;;:7;:5;:7::i;:::-;:23;;;43622:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53283:6:::1;53273:7;;:16;;;;;;;;;;;;;;;;;;53212:85:::0;:::o;22081:334::-;22154:13;22188:16;22196:7;22188;:16::i;:::-;22180:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;22269:21;22293:10;:8;:10::i;:::-;22269:34;;22345:1;22327:7;22321:21;:25;:86;;;;;;;;;;;;;;;;;22373:7;22382:18;:7;:16;:18::i;:::-;22356:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22321:86;22314:93;;;22081:334;;;:::o;23955:164::-;24052:4;24076:18;:25;24095:5;24076:25;;;;;;;;;;;;;;;:35;24102:8;24076:35;;;;;;;;;;;;;;;;;;;;;;;;;24069:42;;23955:164;;;;:::o;44310:192::-;43641:12;:10;:12::i;:::-;43630:23;;:7;:5;:7::i;:::-;:23;;;43622:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44419:1:::1;44399:22;;:8;:22;;;;44391:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;44475:19;44485:8;44475:9;:19::i;:::-;44310:192:::0;:::o;51737:31::-;;;;;;;;;;;;;:::o;19292:157::-;19377:4;19416:25;19401:40;;;:11;:40;;;;19394:47;;19292:157;;;:::o;26690:127::-;26755:4;26807:1;26779:30;;:7;:16;26787:7;26779:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26772:37;;26690:127;;;:::o;16200:98::-;16253:7;16280:10;16273:17;;16200:98;:::o;30672:174::-;30774:2;30747:15;:24;30763:7;30747:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30830:7;30826:2;30792:46;;30801:23;30816:7;30801:14;:23::i;:::-;30792:46;;;;;;;;;;;;30672:174;;:::o;55637:213::-;55704:7;55699:144;55721:4;55717:8;;:1;:8;;;55699:144;;;55747:15;55765:5;;;;;;;;;;;55747:23;;55785:24;55795:3;55800:8;55785:24;;:9;:24::i;:::-;55824:5;;:7;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;55699:144;55727:3;;;;;:::i;:::-;;;;55699:144;;;;55637:213;;:::o;26984:348::-;27077:4;27102:16;27110:7;27102;:16::i;:::-;27094:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27178:13;27194:23;27209:7;27194:14;:23::i;:::-;27178:39;;27247:5;27236:16;;:7;:16;;;:51;;;;27280:7;27256:31;;:20;27268:7;27256:11;:20::i;:::-;:31;;;27236:51;:87;;;;27291:32;27308:5;27315:7;27291:16;:32::i;:::-;27236:87;27228:96;;;26984:348;;;;:::o;29976:578::-;30135:4;30108:31;;:23;30123:7;30108:14;:23::i;:::-;:31;;;30100:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30218:1;30204:16;;:2;:16;;;;30196:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30274:39;30295:4;30301:2;30305:7;30274:20;:39::i;:::-;30378:29;30395:1;30399:7;30378:8;:29::i;:::-;30439:1;30420:9;:15;30430:4;30420:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30468:1;30451:9;:13;30461:2;30451:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30499:2;30480:7;:16;30488:7;30480:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30538:7;30534:2;30519:27;;30528:4;30519:27;;;;;;;;;;;;29976:578;;;:::o;44510:173::-;44566:16;44585:6;;;;;;;;;;;44566:25;;44611:8;44602:6;;:17;;;;;;;;;;;;;;;;;;44666:8;44635:40;;44656:8;44635:40;;;;;;;;;;;;44510:173;;:::o;26062:315::-;26219:28;26229:4;26235:2;26239:7;26219:9;:28::i;:::-;26266:48;26289:4;26295:2;26299:7;26308:5;26266:22;:48::i;:::-;26258:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26062:315;;;;:::o;52764:117::-;52824:13;52857:16;52850:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52764:117;:::o;16731:723::-;16787:13;17017:1;17008:5;:10;17004:53;;;17035:10;;;;;;;;;;;;;;;;;;;;;17004:53;17067:12;17082:5;17067:20;;17098:14;17123:78;17138:1;17130:4;:9;17123:78;;17156:8;;;;;:::i;:::-;;;;17187:2;17179:10;;;;;:::i;:::-;;;17123:78;;;17211:19;17243:6;17233:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17211:39;;17261:154;17277:1;17268:5;:10;17261:154;;17305:1;17295:11;;;;;:::i;:::-;;;17372:2;17364:5;:10;;;;:::i;:::-;17351:2;:24;;;;:::i;:::-;17338:39;;17321:6;17328;17321:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17401:2;17392:11;;;;;:::i;:::-;;;17261:154;;;17439:6;17425:21;;;;;16731:723;;;;:::o;27674:110::-;27750:26;27760:2;27764:7;27750:26;;;;;;;;;;;;:9;:26::i;:::-;27674:110;;:::o;32782:126::-;;;;:::o;31411:799::-;31566:4;31587:15;:2;:13;;;:15::i;:::-;31583:620;;;31639:2;31623:36;;;31660:12;:10;:12::i;:::-;31674:4;31680:7;31689:5;31623:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31619:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31882:1;31865:6;:13;:18;31861:272;;;31908:60;;;;;;;;;;:::i;:::-;;;;;;;;31861:272;32083:6;32077:13;32068:6;32064:2;32060:15;32053:38;31619:529;31756:41;;;31746:51;;;:6;:51;;;;31739:58;;;;;31583:620;32187:4;32180:11;;31411:799;;;;;;;:::o;28011:321::-;28141:18;28147:2;28151:7;28141:5;:18::i;:::-;28192:54;28223:1;28227:2;28231:7;28240:5;28192:22;:54::i;:::-;28170:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;28011:321;;;:::o;8238:387::-;8298:4;8506:12;8573:7;8561:20;8553:28;;8616:1;8609:4;:8;8602:15;;;8238:387;;;:::o;28668:382::-;28762:1;28748:16;;:2;:16;;;;28740:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28821:16;28829:7;28821;:16::i;:::-;28820:17;28812:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28883:45;28912:1;28916:2;28920:7;28883:20;:45::i;:::-;28958:1;28941:9;:13;28951:2;28941:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28989:2;28970:7;:16;28978:7;28970:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29034:7;29030:2;29009:33;;29026:1;29009:33;;;;;;;;;;;;28668:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:655:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:2;;;414:1;411;404:12;350:2;450:1;435:238;460:6;457:1;454:13;435:238;;;528:3;557:37;590:3;578:10;557:37;:::i;:::-;552:3;545:50;624:4;619:3;615:14;608:21;;658:4;653:3;649:14;642:21;;495:178;482:1;479;475:9;470:14;;435:238;;;439:14;126:553;;;;;;;:::o;700:649::-;794:5;819:79;835:62;890:6;835:62;:::i;:::-;819:79;:::i;:::-;810:88;;918:5;947:6;940:5;933:21;981:4;974:5;970:16;963:23;;1007:6;1057:3;1049:4;1041:6;1037:17;1032:3;1028:27;1025:36;1022:2;;;1086:1;1083;1076:12;1022:2;1122:1;1107:236;1132:6;1129:1;1126:13;1107:236;;;1200:3;1229:35;1260:3;1248:10;1229:35;:::i;:::-;1224:3;1217:48;1294:4;1289:3;1285:14;1278:21;;1328:4;1323:3;1319:14;1312:21;;1167:176;1154:1;1151;1147:9;1142:14;;1107:236;;;1111:14;800:549;;;;;;;:::o;1355:343::-;1432:5;1457:65;1473:48;1514:6;1473:48;:::i;:::-;1457:65;:::i;:::-;1448:74;;1545:6;1538:5;1531:21;1583:4;1576:5;1572:16;1621:3;1612:6;1607:3;1603:16;1600:25;1597:2;;;1638:1;1635;1628:12;1597:2;1651:41;1685:6;1680:3;1675;1651:41;:::i;:::-;1438:260;;;;;;:::o;1704:345::-;1782:5;1807:66;1823:49;1865:6;1823:49;:::i;:::-;1807:66;:::i;:::-;1798:75;;1896:6;1889:5;1882:21;1934:4;1927:5;1923:16;1972:3;1963:6;1958:3;1954:16;1951:25;1948:2;;;1989:1;1986;1979:12;1948:2;2002:41;2036:6;2031:3;2026;2002:41;:::i;:::-;1788:261;;;;;;:::o;2055:139::-;2101:5;2139:6;2126:20;2117:29;;2155:33;2182:5;2155:33;:::i;:::-;2107:87;;;;:::o;2217:303::-;2288:5;2337:3;2330:4;2322:6;2318:17;2314:27;2304:2;;2355:1;2352;2345:12;2304:2;2395:6;2382:20;2420:94;2510:3;2502:6;2495:4;2487:6;2483:17;2420:94;:::i;:::-;2411:103;;2294:226;;;;;:::o;2541:299::-;2610:5;2659:3;2652:4;2644:6;2640:17;2636:27;2626:2;;2677:1;2674;2667:12;2626:2;2717:6;2704:20;2742:92;2830:3;2822:6;2815:4;2807:6;2803:17;2742:92;:::i;:::-;2733:101;;2616:224;;;;;:::o;2846:133::-;2889:5;2927:6;2914:20;2905:29;;2943:30;2967:5;2943:30;:::i;:::-;2895:84;;;;:::o;2985:137::-;3030:5;3068:6;3055:20;3046:29;;3084:32;3110:5;3084:32;:::i;:::-;3036:86;;;;:::o;3128:141::-;3184:5;3215:6;3209:13;3200:22;;3231:32;3257:5;3231:32;:::i;:::-;3190:79;;;;:::o;3288:271::-;3343:5;3392:3;3385:4;3377:6;3373:17;3369:27;3359:2;;3410:1;3407;3400:12;3359:2;3450:6;3437:20;3475:78;3549:3;3541:6;3534:4;3526:6;3522:17;3475:78;:::i;:::-;3466:87;;3349:210;;;;;:::o;3579:273::-;3635:5;3684:3;3677:4;3669:6;3665:17;3661:27;3651:2;;3702:1;3699;3692:12;3651:2;3742:6;3729:20;3767:79;3842:3;3834:6;3827:4;3819:6;3815:17;3767:79;:::i;:::-;3758:88;;3641:211;;;;;:::o;3858:137::-;3903:5;3941:6;3928:20;3919:29;;3957:32;3983:5;3957:32;:::i;:::-;3909:86;;;;:::o;4001:139::-;4047:5;4085:6;4072:20;4063:29;;4101:33;4128:5;4101:33;:::i;:::-;4053:87;;;;:::o;4146:135::-;4190:5;4228:6;4215:20;4206:29;;4244:31;4269:5;4244:31;:::i;:::-;4196:85;;;;:::o;4287:262::-;4346:6;4395:2;4383:9;4374:7;4370:23;4366:32;4363:2;;;4411:1;4408;4401:12;4363:2;4454:1;4479:53;4524:7;4515:6;4504:9;4500:22;4479:53;:::i;:::-;4469:63;;4425:117;4353:196;;;;:::o;4555:407::-;4623:6;4631;4680:2;4668:9;4659:7;4655:23;4651:32;4648:2;;;4696:1;4693;4686:12;4648:2;4739:1;4764:53;4809:7;4800:6;4789:9;4785:22;4764:53;:::i;:::-;4754:63;;4710:117;4866:2;4892:53;4937:7;4928:6;4917:9;4913:22;4892:53;:::i;:::-;4882:63;;4837:118;4638:324;;;;;:::o;4968:552::-;5045:6;5053;5061;5110:2;5098:9;5089:7;5085:23;5081:32;5078:2;;;5126:1;5123;5116:12;5078:2;5169:1;5194:53;5239:7;5230:6;5219:9;5215:22;5194:53;:::i;:::-;5184:63;;5140:117;5296:2;5322:53;5367:7;5358:6;5347:9;5343:22;5322:53;:::i;:::-;5312:63;;5267:118;5424:2;5450:53;5495:7;5486:6;5475:9;5471:22;5450:53;:::i;:::-;5440:63;;5395:118;5068:452;;;;;:::o;5526:809::-;5621:6;5629;5637;5645;5694:3;5682:9;5673:7;5669:23;5665:33;5662:2;;;5711:1;5708;5701:12;5662:2;5754:1;5779:53;5824:7;5815:6;5804:9;5800:22;5779:53;:::i;:::-;5769:63;;5725:117;5881:2;5907:53;5952:7;5943:6;5932:9;5928:22;5907:53;:::i;:::-;5897:63;;5852:118;6009:2;6035:53;6080:7;6071:6;6060:9;6056:22;6035:53;:::i;:::-;6025:63;;5980:118;6165:2;6154:9;6150:18;6137:32;6196:18;6188:6;6185:30;6182:2;;;6228:1;6225;6218:12;6182:2;6256:62;6310:7;6301:6;6290:9;6286:22;6256:62;:::i;:::-;6246:72;;6108:220;5652:683;;;;;;;:::o;6341:401::-;6406:6;6414;6463:2;6451:9;6442:7;6438:23;6434:32;6431:2;;;6479:1;6476;6469:12;6431:2;6522:1;6547:53;6592:7;6583:6;6572:9;6568:22;6547:53;:::i;:::-;6537:63;;6493:117;6649:2;6675:50;6717:7;6708:6;6697:9;6693:22;6675:50;:::i;:::-;6665:60;;6620:115;6421:321;;;;;:::o;6748:407::-;6816:6;6824;6873:2;6861:9;6852:7;6848:23;6844:32;6841:2;;;6889:1;6886;6879:12;6841:2;6932:1;6957:53;7002:7;6993:6;6982:9;6978:22;6957:53;:::i;:::-;6947:63;;6903:117;7059:2;7085:53;7130:7;7121:6;7110:9;7106:22;7085:53;:::i;:::-;7075:63;;7030:118;6831:324;;;;;:::o;7161:403::-;7227:6;7235;7284:2;7272:9;7263:7;7259:23;7255:32;7252:2;;;7300:1;7297;7290:12;7252:2;7343:1;7368:53;7413:7;7404:6;7393:9;7389:22;7368:53;:::i;:::-;7358:63;;7314:117;7470:2;7496:51;7539:7;7530:6;7519:9;7515:22;7496:51;:::i;:::-;7486:61;;7441:116;7242:322;;;;;:::o;7570:689::-;7686:6;7694;7743:2;7731:9;7722:7;7718:23;7714:32;7711:2;;;7759:1;7756;7749:12;7711:2;7830:1;7819:9;7815:17;7802:31;7860:18;7852:6;7849:30;7846:2;;;7892:1;7889;7882:12;7846:2;7920:78;7990:7;7981:6;7970:9;7966:22;7920:78;:::i;:::-;7910:88;;7773:235;8075:2;8064:9;8060:18;8047:32;8106:18;8098:6;8095:30;8092:2;;;8138:1;8135;8128:12;8092:2;8166:76;8234:7;8225:6;8214:9;8210:22;8166:76;:::i;:::-;8156:86;;8018:234;7701:558;;;;;:::o;8265:256::-;8321:6;8370:2;8358:9;8349:7;8345:23;8341:32;8338:2;;;8386:1;8383;8376:12;8338:2;8429:1;8454:50;8496:7;8487:6;8476:9;8472:22;8454:50;:::i;:::-;8444:60;;8400:114;8328:193;;;;:::o;8527:260::-;8585:6;8634:2;8622:9;8613:7;8609:23;8605:32;8602:2;;;8650:1;8647;8640:12;8602:2;8693:1;8718:52;8762:7;8753:6;8742:9;8738:22;8718:52;:::i;:::-;8708:62;;8664:116;8592:195;;;;:::o;8793:282::-;8862:6;8911:2;8899:9;8890:7;8886:23;8882:32;8879:2;;;8927:1;8924;8917:12;8879:2;8970:1;8995:63;9050:7;9041:6;9030:9;9026:22;8995:63;:::i;:::-;8985:73;;8941:127;8869:206;;;;:::o;9081:375::-;9150:6;9199:2;9187:9;9178:7;9174:23;9170:32;9167:2;;;9215:1;9212;9205:12;9167:2;9286:1;9275:9;9271:17;9258:31;9316:18;9308:6;9305:30;9302:2;;;9348:1;9345;9338:12;9302:2;9376:63;9431:7;9422:6;9411:9;9407:22;9376:63;:::i;:::-;9366:73;;9229:220;9157:299;;;;:::o;9462:260::-;9520:6;9569:2;9557:9;9548:7;9544:23;9540:32;9537:2;;;9585:1;9582;9575:12;9537:2;9628:1;9653:52;9697:7;9688:6;9677:9;9673:22;9653:52;:::i;:::-;9643:62;;9599:116;9527:195;;;;:::o;9728:262::-;9787:6;9836:2;9824:9;9815:7;9811:23;9807:32;9804:2;;;9852:1;9849;9842:12;9804:2;9895:1;9920:53;9965:7;9956:6;9945:9;9941:22;9920:53;:::i;:::-;9910:63;;9866:117;9794:196;;;;:::o;9996:258::-;10053:6;10102:2;10090:9;10081:7;10077:23;10073:32;10070:2;;;10118:1;10115;10108:12;10070:2;10161:1;10186:51;10229:7;10220:6;10209:9;10205:22;10186:51;:::i;:::-;10176:61;;10132:115;10060:194;;;;:::o;10260:118::-;10347:24;10365:5;10347:24;:::i;:::-;10342:3;10335:37;10325:53;;:::o;10384:109::-;10465:21;10480:5;10465:21;:::i;:::-;10460:3;10453:34;10443:50;;:::o;10499:360::-;10585:3;10613:38;10645:5;10613:38;:::i;:::-;10667:70;10730:6;10725:3;10667:70;:::i;:::-;10660:77;;10746:52;10791:6;10786:3;10779:4;10772:5;10768:16;10746:52;:::i;:::-;10823:29;10845:6;10823:29;:::i;:::-;10818:3;10814:39;10807:46;;10589:270;;;;;:::o;10865:364::-;10953:3;10981:39;11014:5;10981:39;:::i;:::-;11036:71;11100:6;11095:3;11036:71;:::i;:::-;11029:78;;11116:52;11161:6;11156:3;11149:4;11142:5;11138:16;11116:52;:::i;:::-;11193:29;11215:6;11193:29;:::i;:::-;11188:3;11184:39;11177:46;;10957:272;;;;;:::o;11235:377::-;11341:3;11369:39;11402:5;11369:39;:::i;:::-;11424:89;11506:6;11501:3;11424:89;:::i;:::-;11417:96;;11522:52;11567:6;11562:3;11555:4;11548:5;11544:16;11522:52;:::i;:::-;11599:6;11594:3;11590:16;11583:23;;11345:267;;;;;:::o;11618:366::-;11760:3;11781:67;11845:2;11840:3;11781:67;:::i;:::-;11774:74;;11857:93;11946:3;11857:93;:::i;:::-;11975:2;11970:3;11966:12;11959:19;;11764:220;;;:::o;11990:366::-;12132:3;12153:67;12217:2;12212:3;12153:67;:::i;:::-;12146:74;;12229:93;12318:3;12229:93;:::i;:::-;12347:2;12342:3;12338:12;12331:19;;12136:220;;;:::o;12362:366::-;12504:3;12525:67;12589:2;12584:3;12525:67;:::i;:::-;12518:74;;12601:93;12690:3;12601:93;:::i;:::-;12719:2;12714:3;12710:12;12703:19;;12508:220;;;:::o;12734:366::-;12876:3;12897:67;12961:2;12956:3;12897:67;:::i;:::-;12890:74;;12973:93;13062:3;12973:93;:::i;:::-;13091:2;13086:3;13082:12;13075:19;;12880:220;;;:::o;13106:366::-;13248:3;13269:67;13333:2;13328:3;13269:67;:::i;:::-;13262:74;;13345:93;13434:3;13345:93;:::i;:::-;13463:2;13458:3;13454:12;13447:19;;13252:220;;;:::o;13478:366::-;13620:3;13641:67;13705:2;13700:3;13641:67;:::i;:::-;13634:74;;13717:93;13806:3;13717:93;:::i;:::-;13835:2;13830:3;13826:12;13819:19;;13624:220;;;:::o;13850:366::-;13992:3;14013:67;14077:2;14072:3;14013:67;:::i;:::-;14006:74;;14089:93;14178:3;14089:93;:::i;:::-;14207:2;14202:3;14198:12;14191:19;;13996:220;;;:::o;14222:366::-;14364:3;14385:67;14449:2;14444:3;14385:67;:::i;:::-;14378:74;;14461:93;14550:3;14461:93;:::i;:::-;14579:2;14574:3;14570:12;14563:19;;14368:220;;;:::o;14594:366::-;14736:3;14757:67;14821:2;14816:3;14757:67;:::i;:::-;14750:74;;14833:93;14922:3;14833:93;:::i;:::-;14951:2;14946:3;14942:12;14935:19;;14740:220;;;:::o;14966:366::-;15108:3;15129:67;15193:2;15188:3;15129:67;:::i;:::-;15122:74;;15205:93;15294:3;15205:93;:::i;:::-;15323:2;15318:3;15314:12;15307:19;;15112:220;;;:::o;15338:366::-;15480:3;15501:67;15565:2;15560:3;15501:67;:::i;:::-;15494:74;;15577:93;15666:3;15577:93;:::i;:::-;15695:2;15690:3;15686:12;15679:19;;15484:220;;;:::o;15710:366::-;15852:3;15873:67;15937:2;15932:3;15873:67;:::i;:::-;15866:74;;15949:93;16038:3;15949:93;:::i;:::-;16067:2;16062:3;16058:12;16051:19;;15856:220;;;:::o;16082:366::-;16224:3;16245:67;16309:2;16304:3;16245:67;:::i;:::-;16238:74;;16321:93;16410:3;16321:93;:::i;:::-;16439:2;16434:3;16430:12;16423:19;;16228:220;;;:::o;16454:366::-;16596:3;16617:67;16681:2;16676:3;16617:67;:::i;:::-;16610:74;;16693:93;16782:3;16693:93;:::i;:::-;16811:2;16806:3;16802:12;16795:19;;16600:220;;;:::o;16826:366::-;16968:3;16989:67;17053:2;17048:3;16989:67;:::i;:::-;16982:74;;17065:93;17154:3;17065:93;:::i;:::-;17183:2;17178:3;17174:12;17167:19;;16972:220;;;:::o;17198:366::-;17340:3;17361:67;17425:2;17420:3;17361:67;:::i;:::-;17354:74;;17437:93;17526:3;17437:93;:::i;:::-;17555:2;17550:3;17546:12;17539:19;;17344:220;;;:::o;17570:366::-;17712:3;17733:67;17797:2;17792:3;17733:67;:::i;:::-;17726:74;;17809:93;17898:3;17809:93;:::i;:::-;17927:2;17922:3;17918:12;17911:19;;17716:220;;;:::o;17942:366::-;18084:3;18105:67;18169:2;18164:3;18105:67;:::i;:::-;18098:74;;18181:93;18270:3;18181:93;:::i;:::-;18299:2;18294:3;18290:12;18283:19;;18088:220;;;:::o;18314:366::-;18456:3;18477:67;18541:2;18536:3;18477:67;:::i;:::-;18470:74;;18553:93;18642:3;18553:93;:::i;:::-;18671:2;18666:3;18662:12;18655:19;;18460:220;;;:::o;18686:366::-;18828:3;18849:67;18913:2;18908:3;18849:67;:::i;:::-;18842:74;;18925:93;19014:3;18925:93;:::i;:::-;19043:2;19038:3;19034:12;19027:19;;18832:220;;;:::o;19058:366::-;19200:3;19221:67;19285:2;19280:3;19221:67;:::i;:::-;19214:74;;19297:93;19386:3;19297:93;:::i;:::-;19415:2;19410:3;19406:12;19399:19;;19204:220;;;:::o;19430:366::-;19572:3;19593:67;19657:2;19652:3;19593:67;:::i;:::-;19586:74;;19669:93;19758:3;19669:93;:::i;:::-;19787:2;19782:3;19778:12;19771:19;;19576:220;;;:::o;19802:115::-;19887:23;19904:5;19887:23;:::i;:::-;19882:3;19875:36;19865:52;;:::o;19923:118::-;20010:24;20028:5;20010:24;:::i;:::-;20005:3;19998:37;19988:53;;:::o;20047:112::-;20130:22;20146:5;20130:22;:::i;:::-;20125:3;20118:35;20108:51;;:::o;20165:435::-;20345:3;20367:95;20458:3;20449:6;20367:95;:::i;:::-;20360:102;;20479:95;20570:3;20561:6;20479:95;:::i;:::-;20472:102;;20591:3;20584:10;;20349:251;;;;;:::o;20606:222::-;20699:4;20737:2;20726:9;20722:18;20714:26;;20750:71;20818:1;20807:9;20803:17;20794:6;20750:71;:::i;:::-;20704:124;;;;:::o;20834:640::-;21029:4;21067:3;21056:9;21052:19;21044:27;;21081:71;21149:1;21138:9;21134:17;21125:6;21081:71;:::i;:::-;21162:72;21230:2;21219:9;21215:18;21206:6;21162:72;:::i;:::-;21244;21312:2;21301:9;21297:18;21288:6;21244:72;:::i;:::-;21363:9;21357:4;21353:20;21348:2;21337:9;21333:18;21326:48;21391:76;21462:4;21453:6;21391:76;:::i;:::-;21383:84;;21034:440;;;;;;;:::o;21480:210::-;21567:4;21605:2;21594:9;21590:18;21582:26;;21618:65;21680:1;21669:9;21665:17;21656:6;21618:65;:::i;:::-;21572:118;;;;:::o;21696:313::-;21809:4;21847:2;21836:9;21832:18;21824:26;;21896:9;21890:4;21886:20;21882:1;21871:9;21867:17;21860:47;21924:78;21997:4;21988:6;21924:78;:::i;:::-;21916:86;;21814:195;;;;:::o;22015:419::-;22181:4;22219:2;22208:9;22204:18;22196:26;;22268:9;22262:4;22258:20;22254:1;22243:9;22239:17;22232:47;22296:131;22422:4;22296:131;:::i;:::-;22288:139;;22186:248;;;:::o;22440:419::-;22606:4;22644:2;22633:9;22629:18;22621:26;;22693:9;22687:4;22683:20;22679:1;22668:9;22664:17;22657:47;22721:131;22847:4;22721:131;:::i;:::-;22713:139;;22611:248;;;:::o;22865:419::-;23031:4;23069:2;23058:9;23054:18;23046:26;;23118:9;23112:4;23108:20;23104:1;23093:9;23089:17;23082:47;23146:131;23272:4;23146:131;:::i;:::-;23138:139;;23036:248;;;:::o;23290:419::-;23456:4;23494:2;23483:9;23479:18;23471:26;;23543:9;23537:4;23533:20;23529:1;23518:9;23514:17;23507:47;23571:131;23697:4;23571:131;:::i;:::-;23563:139;;23461:248;;;:::o;23715:419::-;23881:4;23919:2;23908:9;23904:18;23896:26;;23968:9;23962:4;23958:20;23954:1;23943:9;23939:17;23932:47;23996:131;24122:4;23996:131;:::i;:::-;23988:139;;23886:248;;;:::o;24140:419::-;24306:4;24344:2;24333:9;24329:18;24321:26;;24393:9;24387:4;24383:20;24379:1;24368:9;24364:17;24357:47;24421:131;24547:4;24421:131;:::i;:::-;24413:139;;24311:248;;;:::o;24565:419::-;24731:4;24769:2;24758:9;24754:18;24746:26;;24818:9;24812:4;24808:20;24804:1;24793:9;24789:17;24782:47;24846:131;24972:4;24846:131;:::i;:::-;24838:139;;24736:248;;;:::o;24990:419::-;25156:4;25194:2;25183:9;25179:18;25171:26;;25243:9;25237:4;25233:20;25229:1;25218:9;25214:17;25207:47;25271:131;25397:4;25271:131;:::i;:::-;25263:139;;25161:248;;;:::o;25415:419::-;25581:4;25619:2;25608:9;25604:18;25596:26;;25668:9;25662:4;25658:20;25654:1;25643:9;25639:17;25632:47;25696:131;25822:4;25696:131;:::i;:::-;25688:139;;25586:248;;;:::o;25840:419::-;26006:4;26044:2;26033:9;26029:18;26021:26;;26093:9;26087:4;26083:20;26079:1;26068:9;26064:17;26057:47;26121:131;26247:4;26121:131;:::i;:::-;26113:139;;26011:248;;;:::o;26265:419::-;26431:4;26469:2;26458:9;26454:18;26446:26;;26518:9;26512:4;26508:20;26504:1;26493:9;26489:17;26482:47;26546:131;26672:4;26546:131;:::i;:::-;26538:139;;26436:248;;;:::o;26690:419::-;26856:4;26894:2;26883:9;26879:18;26871:26;;26943:9;26937:4;26933:20;26929:1;26918:9;26914:17;26907:47;26971:131;27097:4;26971:131;:::i;:::-;26963:139;;26861:248;;;:::o;27115:419::-;27281:4;27319:2;27308:9;27304:18;27296:26;;27368:9;27362:4;27358:20;27354:1;27343:9;27339:17;27332:47;27396:131;27522:4;27396:131;:::i;:::-;27388:139;;27286:248;;;:::o;27540:419::-;27706:4;27744:2;27733:9;27729:18;27721:26;;27793:9;27787:4;27783:20;27779:1;27768:9;27764:17;27757:47;27821:131;27947:4;27821:131;:::i;:::-;27813:139;;27711:248;;;:::o;27965:419::-;28131:4;28169:2;28158:9;28154:18;28146:26;;28218:9;28212:4;28208:20;28204:1;28193:9;28189:17;28182:47;28246:131;28372:4;28246:131;:::i;:::-;28238:139;;28136:248;;;:::o;28390:419::-;28556:4;28594:2;28583:9;28579:18;28571:26;;28643:9;28637:4;28633:20;28629:1;28618:9;28614:17;28607:47;28671:131;28797:4;28671:131;:::i;:::-;28663:139;;28561:248;;;:::o;28815:419::-;28981:4;29019:2;29008:9;29004:18;28996:26;;29068:9;29062:4;29058:20;29054:1;29043:9;29039:17;29032:47;29096:131;29222:4;29096:131;:::i;:::-;29088:139;;28986:248;;;:::o;29240:419::-;29406:4;29444:2;29433:9;29429:18;29421:26;;29493:9;29487:4;29483:20;29479:1;29468:9;29464:17;29457:47;29521:131;29647:4;29521:131;:::i;:::-;29513:139;;29411:248;;;:::o;29665:419::-;29831:4;29869:2;29858:9;29854:18;29846:26;;29918:9;29912:4;29908:20;29904:1;29893:9;29889:17;29882:47;29946:131;30072:4;29946:131;:::i;:::-;29938:139;;29836:248;;;:::o;30090:419::-;30256:4;30294:2;30283:9;30279:18;30271:26;;30343:9;30337:4;30333:20;30329:1;30318:9;30314:17;30307:47;30371:131;30497:4;30371:131;:::i;:::-;30363:139;;30261:248;;;:::o;30515:419::-;30681:4;30719:2;30708:9;30704:18;30696:26;;30768:9;30762:4;30758:20;30754:1;30743:9;30739:17;30732:47;30796:131;30922:4;30796:131;:::i;:::-;30788:139;;30686:248;;;:::o;30940:419::-;31106:4;31144:2;31133:9;31129:18;31121:26;;31193:9;31187:4;31183:20;31179:1;31168:9;31164:17;31157:47;31221:131;31347:4;31221:131;:::i;:::-;31213:139;;31111:248;;;:::o;31365:218::-;31456:4;31494:2;31483:9;31479:18;31471:26;;31507:69;31573:1;31562:9;31558:17;31549:6;31507:69;:::i;:::-;31461:122;;;;:::o;31589:222::-;31682:4;31720:2;31709:9;31705:18;31697:26;;31733:71;31801:1;31790:9;31786:17;31777:6;31733:71;:::i;:::-;31687:124;;;;:::o;31817:214::-;31906:4;31944:2;31933:9;31929:18;31921:26;;31957:67;32021:1;32010:9;32006:17;31997:6;31957:67;:::i;:::-;31911:120;;;;:::o;32037:129::-;32071:6;32098:20;;:::i;:::-;32088:30;;32127:33;32155:4;32147:6;32127:33;:::i;:::-;32078:88;;;:::o;32172:75::-;32205:6;32238:2;32232:9;32222:19;;32212:35;:::o;32253:311::-;32330:4;32420:18;32412:6;32409:30;32406:2;;;32442:18;;:::i;:::-;32406:2;32492:4;32484:6;32480:17;32472:25;;32552:4;32546;32542:15;32534:23;;32335:229;;;:::o;32570:309::-;32645:4;32735:18;32727:6;32724:30;32721:2;;;32757:18;;:::i;:::-;32721:2;32807:4;32799:6;32795:17;32787:25;;32867:4;32861;32857:15;32849:23;;32650:229;;;:::o;32885:307::-;32946:4;33036:18;33028:6;33025:30;33022:2;;;33058:18;;:::i;:::-;33022:2;33096:29;33118:6;33096:29;:::i;:::-;33088:37;;33180:4;33174;33170:15;33162:23;;32951:241;;;:::o;33198:308::-;33260:4;33350:18;33342:6;33339:30;33336:2;;;33372:18;;:::i;:::-;33336:2;33410:29;33432:6;33410:29;:::i;:::-;33402:37;;33494:4;33488;33484:15;33476:23;;33265:241;;;:::o;33512:98::-;33563:6;33597:5;33591:12;33581:22;;33570:40;;;:::o;33616:99::-;33668:6;33702:5;33696:12;33686:22;;33675:40;;;:::o;33721:168::-;33804:11;33838:6;33833:3;33826:19;33878:4;33873:3;33869:14;33854:29;;33816:73;;;;:::o;33895:169::-;33979:11;34013:6;34008:3;34001:19;34053:4;34048:3;34044:14;34029:29;;33991:73;;;;:::o;34070:148::-;34172:11;34209:3;34194:18;;34184:34;;;;:::o;34224:242::-;34263:3;34282:19;34299:1;34282:19;:::i;:::-;34277:24;;34315:19;34332:1;34315:19;:::i;:::-;34310:24;;34408:1;34400:6;34396:14;34393:1;34390:21;34387:2;;;34414:18;;:::i;:::-;34387:2;34458:1;34455;34451:9;34444:16;;34267:199;;;;:::o;34472:305::-;34512:3;34531:20;34549:1;34531:20;:::i;:::-;34526:25;;34565:20;34583:1;34565:20;:::i;:::-;34560:25;;34719:1;34651:66;34647:74;34644:1;34641:81;34638:2;;;34725:18;;:::i;:::-;34638:2;34769:1;34766;34762:9;34755:16;;34516:261;;;;:::o;34783:185::-;34823:1;34840:20;34858:1;34840:20;:::i;:::-;34835:25;;34874:20;34892:1;34874:20;:::i;:::-;34869:25;;34913:1;34903:2;;34918:18;;:::i;:::-;34903:2;34960:1;34957;34953:9;34948:14;;34825:143;;;;:::o;34974:348::-;35014:7;35037:20;35055:1;35037:20;:::i;:::-;35032:25;;35071:20;35089:1;35071:20;:::i;:::-;35066:25;;35259:1;35191:66;35187:74;35184:1;35181:81;35176:1;35169:9;35162:17;35158:105;35155:2;;;35266:18;;:::i;:::-;35155:2;35314:1;35311;35307:9;35296:20;;35022:300;;;;:::o;35328:188::-;35367:4;35387:19;35404:1;35387:19;:::i;:::-;35382:24;;35420:19;35437:1;35420:19;:::i;:::-;35415:24;;35458:1;35455;35452:8;35449:2;;;35463:18;;:::i;:::-;35449:2;35508:1;35505;35501:9;35493:17;;35372:144;;;;:::o;35522:191::-;35562:4;35582:20;35600:1;35582:20;:::i;:::-;35577:25;;35616:20;35634:1;35616:20;:::i;:::-;35611:25;;35655:1;35652;35649:8;35646:2;;;35660:18;;:::i;:::-;35646:2;35705:1;35702;35698:9;35690:17;;35567:146;;;;:::o;35719:185::-;35757:4;35777:18;35793:1;35777:18;:::i;:::-;35772:23;;35809:18;35825:1;35809:18;:::i;:::-;35804:23;;35846:1;35843;35840:8;35837:2;;;35851:18;;:::i;:::-;35837:2;35896:1;35893;35889:9;35881:17;;35762:142;;;;:::o;35910:96::-;35947:7;35976:24;35994:5;35976:24;:::i;:::-;35965:35;;35955:51;;;:::o;36012:90::-;36046:7;36089:5;36082:13;36075:21;36064:32;;36054:48;;;:::o;36108:149::-;36144:7;36184:66;36177:5;36173:78;36162:89;;36152:105;;;:::o;36263:89::-;36299:7;36339:6;36332:5;36328:18;36317:29;;36307:45;;;:::o;36358:126::-;36395:7;36435:42;36428:5;36424:54;36413:65;;36403:81;;;:::o;36490:77::-;36527:7;36556:5;36545:16;;36535:32;;;:::o;36573:86::-;36608:7;36648:4;36641:5;36637:16;36626:27;;36616:43;;;:::o;36665:154::-;36749:6;36744:3;36739;36726:30;36811:1;36802:6;36797:3;36793:16;36786:27;36716:103;;;:::o;36825:307::-;36893:1;36903:113;36917:6;36914:1;36911:13;36903:113;;;37002:1;36997:3;36993:11;36987:18;36983:1;36978:3;36974:11;36967:39;36939:2;36936:1;36932:10;36927:15;;36903:113;;;37034:6;37031:1;37028:13;37025:2;;;37114:1;37105:6;37100:3;37096:16;37089:27;37025:2;36874:258;;;;:::o;37138:320::-;37182:6;37219:1;37213:4;37209:12;37199:22;;37266:1;37260:4;37256:12;37287:18;37277:2;;37343:4;37335:6;37331:17;37321:27;;37277:2;37405;37397:6;37394:14;37374:18;37371:38;37368:2;;;37424:18;;:::i;:::-;37368:2;37189:269;;;;:::o;37464:281::-;37547:27;37569:4;37547:27;:::i;:::-;37539:6;37535:40;37677:6;37665:10;37662:22;37641:18;37629:10;37626:34;37623:62;37620:2;;;37688:18;;:::i;:::-;37620:2;37728:10;37724:2;37717:22;37507:238;;;:::o;37751:171::-;37789:3;37812:23;37829:5;37812:23;:::i;:::-;37803:32;;37857:6;37850:5;37847:17;37844:2;;;37867:18;;:::i;:::-;37844:2;37914:1;37907:5;37903:13;37896:20;;37793:129;;;:::o;37928:233::-;37967:3;37990:24;38008:5;37990:24;:::i;:::-;37981:33;;38036:66;38029:5;38026:77;38023:2;;;38106:18;;:::i;:::-;38023:2;38153:1;38146:5;38142:13;38135:20;;37971:190;;;:::o;38167:167::-;38204:3;38227:22;38243:5;38227:22;:::i;:::-;38218:31;;38271:4;38264:5;38261:15;38258:2;;;38279:18;;:::i;:::-;38258:2;38326:1;38319:5;38315:13;38308:20;;38208:126;;;:::o;38340:176::-;38372:1;38389:20;38407:1;38389:20;:::i;:::-;38384:25;;38423:20;38441:1;38423:20;:::i;:::-;38418:25;;38462:1;38452:2;;38467:18;;:::i;:::-;38452:2;38508:1;38505;38501:9;38496:14;;38374:142;;;;:::o;38522:180::-;38570:77;38567:1;38560:88;38667:4;38664:1;38657:15;38691:4;38688:1;38681:15;38708:180;38756:77;38753:1;38746:88;38853:4;38850:1;38843:15;38877:4;38874:1;38867:15;38894:180;38942:77;38939:1;38932:88;39039:4;39036:1;39029:15;39063:4;39060:1;39053:15;39080:180;39128:77;39125:1;39118:88;39225:4;39222:1;39215:15;39249:4;39246:1;39239:15;39266:102;39307:6;39358:2;39354:7;39349:2;39342:5;39338:14;39334:28;39324:38;;39314:54;;;:::o;39374:237::-;39514:34;39510:1;39502:6;39498:14;39491:58;39583:20;39578:2;39570:6;39566:15;39559:45;39480:131;:::o;39617:225::-;39757:34;39753:1;39745:6;39741:14;39734:58;39826:8;39821:2;39813:6;39809:15;39802:33;39723:119;:::o;39848:178::-;39988:30;39984:1;39976:6;39972:14;39965:54;39954:72;:::o;40032:223::-;40172:34;40168:1;40160:6;40156:14;40149:58;40241:6;40236:2;40228:6;40224:15;40217:31;40138:117;:::o;40261:175::-;40401:27;40397:1;40389:6;40385:14;40378:51;40367:69;:::o;40442:168::-;40582:20;40578:1;40570:6;40566:14;40559:44;40548:62;:::o;40616:231::-;40756:34;40752:1;40744:6;40740:14;40733:58;40825:14;40820:2;40812:6;40808:15;40801:39;40722:125;:::o;40853:243::-;40993:34;40989:1;40981:6;40977:14;40970:58;41062:26;41057:2;41049:6;41045:15;41038:51;40959:137;:::o;41102:220::-;41242:34;41238:1;41230:6;41226:14;41219:58;41311:3;41306:2;41298:6;41294:15;41287:28;41208:114;:::o;41328:229::-;41468:34;41464:1;41456:6;41452:14;41445:58;41537:12;41532:2;41524:6;41520:15;41513:37;41434:123;:::o;41563:228::-;41703:34;41699:1;41691:6;41687:14;41680:58;41772:11;41767:2;41759:6;41755:15;41748:36;41669:122;:::o;41797:182::-;41937:34;41933:1;41925:6;41921:14;41914:58;41903:76;:::o;41985:231::-;42125:34;42121:1;42113:6;42109:14;42102:58;42194:14;42189:2;42181:6;42177:15;42170:39;42091:125;:::o;42222:182::-;42362:34;42358:1;42350:6;42346:14;42339:58;42328:76;:::o;42410:228::-;42550:34;42546:1;42538:6;42534:14;42527:58;42619:11;42614:2;42606:6;42602:15;42595:36;42516:122;:::o;42644:234::-;42784:34;42780:1;42772:6;42768:14;42761:58;42853:17;42848:2;42840:6;42836:15;42829:42;42750:128;:::o;42884:220::-;43024:34;43020:1;43012:6;43008:14;43001:58;43093:3;43088:2;43080:6;43076:15;43069:28;42990:114;:::o;43110:236::-;43250:34;43246:1;43238:6;43234:14;43227:58;43319:19;43314:2;43306:6;43302:15;43295:44;43216:130;:::o;43352:171::-;43492:23;43488:1;43480:6;43476:14;43469:47;43458:65;:::o;43529:164::-;43669:16;43665:1;43657:6;43653:14;43646:40;43635:58;:::o;43699:163::-;43839:15;43835:1;43827:6;43823:14;43816:39;43805:57;:::o;43868:177::-;44008:29;44004:1;43996:6;43992:14;43985:53;43974:71;:::o;44051:122::-;44124:24;44142:5;44124:24;:::i;:::-;44117:5;44114:35;44104:2;;44163:1;44160;44153:12;44104:2;44094:79;:::o;44179:116::-;44249:21;44264:5;44249:21;:::i;:::-;44242:5;44239:32;44229:2;;44285:1;44282;44275:12;44229:2;44219:76;:::o;44301:120::-;44373:23;44390:5;44373:23;:::i;:::-;44366:5;44363:34;44353:2;;44411:1;44408;44401:12;44353:2;44343:78;:::o;44427:120::-;44499:23;44516:5;44499:23;:::i;:::-;44492:5;44489:34;44479:2;;44537:1;44534;44527:12;44479:2;44469:78;:::o;44553:122::-;44626:24;44644:5;44626:24;:::i;:::-;44619:5;44616:35;44606:2;;44665:1;44662;44655:12;44606:2;44596:79;:::o;44681:118::-;44752:22;44768:5;44752:22;:::i;:::-;44745:5;44742:33;44732:2;;44789:1;44786;44779:12;44732:2;44722:77;:::o

Swarm Source

ipfs://24511d674bd1ce98cd1ef87c890a65a393e79e8bad443fed2e87b10f776cc9f6
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.