ETH Price: $2,629.24 (+6.53%)

Token

SakuraApe (SAKURA)
 

Overview

Max Total Supply

547 SAKURA

Holders

305

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
thepotato.eth
Balance
1 SAKURA
0xed5934e09cdbce472af3ae5ac1506635900aa707
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:
SAKURAToken

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-09
*/

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

pragma solidity ^0.8.0;

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

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

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

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/introspection/IERC165.sol

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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/utils/introspection/ERC165.sol

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
        public
        virtual
        override
    {
        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: Animathereum.sol

pragma solidity ^0.8.0;

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

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

contract SAKURAToken is ERC721Enumerable, Ownable {
    uint256 public constant MAX_NFTS = 10000;
    uint256[MAX_NFTS] internal indices;
    bool public allPaused = true;
    string _baseTokenURI = "ipfs://QmTF6Q84j5THVncBdh2DsAHSTpNT1N9hgEHvCC8AorSu1f";

    uint256 public round = 0;
    uint256 public roundSalePerRound = 0;
    uint256 public startRoundBlock;
    uint256 public blockPerRound = 100;

    uint256 internal nonce = 0;

    enum MarketType {
        PreSale,
        TimeAttackSale,
        RoundSale
    }

    struct Market {
        bool paused;
        uint256 price;
        uint256 saleCount;
        uint256 maxAmount;
    }

    mapping(uint256 => Market) private marketList;

    constructor(address _to, uint256 _initialMint)
        ERC721("SakuraApe", "SAKURA")
    {
        for (uint256 i = 0; i < _initialMint; i++) {
            _safeMint(_to, _generateRandomIndex());
        }
        marketList[uint256(MarketType.PreSale)].saleCount += _initialMint;
        marketList[uint256(MarketType.PreSale)] = Market(
            true,
            50_000_000_000_000_000,
            _initialMint,
            1000
        ); // preSale: initial price 0.05 ether & initial max 1000
        marketList[uint256(MarketType.TimeAttackSale)] = Market(
            true,
            60_000_000_000_000_000,
            0,
            2000
        ); // timeAttackSale: initial price 0.06 ether & initial max 2000
        marketList[uint256(MarketType.RoundSale)] = Market(
            true,
            80_000_000_000_000_000,
            0,
            100
        ); // roundSale: initial price 0.08 ether & max 100 per round
    }

    function pauseAllMarket(bool _paused) public onlyOwner {
        allPaused = _paused;
    }

    function getMarketInfo(uint256 _marketType)
        public
        view
        returns (
            bool,
            uint256,
            uint256,
            uint256
        )
    {
        return (
            marketList[_marketType].paused,
            marketList[_marketType].price,
            marketList[_marketType].saleCount,
            marketList[_marketType].maxAmount
        );
    }

    function setMarketStatus(
        uint256 _marketType,
        bool _paused,
        uint256 _price,
        uint256 _saleCount,
        uint256 _maxAmount
    ) public onlyOwner {
        marketList[_marketType].paused = _paused;
        marketList[_marketType].price = _price;
        marketList[_marketType].saleCount = _saleCount;
        marketList[_marketType].maxAmount = _maxAmount;
    }

    function startRoundSale() public onlyOwner {
        marketList[uint256(MarketType.RoundSale)].paused = false;
        round = 1;
        startRoundBlock = block.number;
    }

    function getPredictRoundPrice() public view returns (uint256) {
        return
            (marketList[uint256(MarketType.RoundSale)].price *
                (50 + roundSalePerRound)) / 100;
    }

    function setBlockPerRound(uint256 _blockPerRound) public onlyOwner {
        blockPerRound = _blockPerRound;
    }

    function setNextRound() internal {
        uint256 nextRoundPrice = getPredictRoundPrice();

        if (nextRoundPrice < 100_000_000_000_000_000) {
            marketList[uint256(MarketType.RoundSale)]
                .price = 100_000_000_000_000_000;
        } else {
            marketList[uint256(MarketType.RoundSale)].price = nextRoundPrice;
        }
        round++;
        roundSalePerRound = 0;
        startRoundBlock += blockPerRound;
    }

    function setEmergencyNextRound() public onlyOwner {
        uint256 nextRoundPrice = getPredictRoundPrice();

        if (nextRoundPrice < 100_000_000_000_000_000) {
            marketList[uint256(MarketType.RoundSale)]
                .price = 100_000_000_000_000_000;
        } else {
            marketList[uint256(MarketType.RoundSale)].price = nextRoundPrice;
        }
        round++;
        roundSalePerRound = 0;
        startRoundBlock += blockPerRound;
    }

    function preMint(address _to, uint256 _count) public payable {
        require(
            !marketList[uint256(MarketType.PreSale)].paused,
            "This is not pre-sale period"
        );
        require(
            marketList[uint256(MarketType.PreSale)].saleCount + _count <
                marketList[uint256(MarketType.PreSale)].maxAmount,
            "max limit for preSale market"
        );
        require(
            msg.value >=
                (marketList[uint256(MarketType.PreSale)].price * _count),
            "Value below price"
        );

        mulitpleMint(_to, _count);
        marketList[uint256(MarketType.PreSale)].saleCount += _count;
    }

    function timeAttackMint(address _to, uint256 _count) public payable {
        require(
            !marketList[uint256(MarketType.TimeAttackSale)].paused,
            "This is not timeattack-sale period"
        );
        require(
            marketList[uint256(MarketType.TimeAttackSale)].saleCount + _count <
                marketList[uint256(MarketType.TimeAttackSale)].maxAmount,
            "max limit for timeAttackSale market"
        );
        require(
            msg.value >=
                (marketList[uint256(MarketType.TimeAttackSale)].price * _count),
            "Value below price"
        );
        mulitpleMint(_to, _count);
        marketList[uint256(MarketType.TimeAttackSale)].saleCount += _count;
    }

    function roundMint(address _to, uint256 _count) public payable {
        require(
            !marketList[uint256(MarketType.RoundSale)].paused,
            "This is not round-sale period"
        );
        require(
            roundSalePerRound + _count <
                marketList[uint256(MarketType.RoundSale)].maxAmount,
            "This round max limit"
        );
        require(
            msg.value >=
                (marketList[uint256(MarketType.RoundSale)].price * _count),
            "Value below price"
        );
        // over 3 times no minting then stop
        if (startRoundBlock + (blockPerRound * 3) < block.number) {
            marketList[uint256(MarketType.RoundSale)].paused = true;
            return;
        }
        //check block number over this round
        if (startRoundBlock + blockPerRound < block.number) {
            setNextRound();
        }

        mulitpleMint(_to, _count);
        roundSalePerRound += _count;
        marketList[uint256(MarketType.RoundSale)].saleCount += _count;
    }

    function mulitpleMint(address _to, uint256 _count) internal {
        require(!allPaused, "all market paused");
        require(_count <= 30, "Exceeds 30");
        require(totalSupply() + _count <= MAX_NFTS, "Max limit");
        require(totalSupply() < MAX_NFTS, "Sale end");
        for (uint256 i = 0; i < _count; i++) {
            _safeMint(_to, _generateRandomIndex());
        }
    }

    function walletOfOwner(address _owner)
        external
        view
        returns (uint256[] memory)
    {
        uint256 tokenCount = balanceOf(_owner);
        uint256[] memory tokensId = new uint256[](tokenCount);
        for (uint256 i = 0; i < tokenCount; i++) {
            tokensId[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokensId;
    }

    function withdrawAll() public payable onlyOwner {
        require(payable(msg.sender).send(address(this).balance));
    }

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

    function setBaseURI(string memory baseURI) public onlyOwner {
        _baseTokenURI = baseURI;
    }

    function _generateRandomIndex() internal returns (uint256) {
        uint256 totalSize = MAX_NFTS - totalSupply();
        uint256 index = uint256(
            keccak256(
                abi.encodePacked(
                    nonce,
                    msg.sender,
                    block.difficulty,
                    block.timestamp
                )
            )
        ) % totalSize;

        uint256 value = 0;
        if (indices[index] != 0) {
            value = indices[index];
        } else {
            value = index;
        }

        // Move last value to selected position
        if (indices[totalSize - 1] == 0) {
            // Array position not initialized, so use position
            indices[index] = totalSize - 1;
        } else {
            // Array position holds a value so use that
            indices[index] = indices[totalSize - 1];
        }
        nonce++;
        // Don't allow a zero index, start counting at 1
        return value++;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_initialMint","type":"uint256"}],"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":[],"name":"MAX_NFTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blockPerRound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketType","type":"uint256"}],"name":"getMarketInfo","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPredictRoundPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"pauseAllMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"preMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"round","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"roundMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"roundSalePerRound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_blockPerRound","type":"uint256"}],"name":"setBlockPerRound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setEmergencyNextRound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketType","type":"uint256"},{"internalType":"bool","name":"_paused","type":"bool"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_saleCount","type":"uint256"},{"internalType":"uint256","name":"_maxAmount","type":"uint256"}],"name":"setMarketStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startRoundBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startRoundSale","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":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"timeAttackMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]

6080604052600161271b60006101000a81548160ff02191690831515021790555060405180606001604052806035815260200162006ec96035913961271c908051906020019062000052929190620011dc565b50600061271d55600061271e556064612720556000612721553480156200007857600080fd5b5060405162006efe38038062006efe83398181016040528101906200009e9190620012d1565b6040518060400160405280600981526020017f53616b75726141706500000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f53414b5552410000000000000000000000000000000000000000000000000000815250816000908051906020019062000122929190620011dc565b5080600190805190602001906200013b929190620011dc565b5050506200015e620001526200044760201b60201c565b6200044f60201b60201c565b60005b81811015620001a1576200018b836200017f6200051560201b60201c565b6200077b60201b60201c565b80806200019890620017f8565b91505062000161565b50806127226000806002811115620001e2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200190815260200160002060020160008282546200020491906200168a565b92505081905550604051806080016040528060011515815260200166b1a2bc2ec5000081526020018281526020016103e8815250612722600080600281111562000277577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200190815260200160002060008201518160000160006101000a81548160ff021916908315150217905550602082015181600101556040820151816002015560608201518160030155905050604051806080016040528060011515815260200166d529ae9e8600008152602001600081526020016107d081525061272260006001600281111562000334577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200190815260200160002060008201518160000160006101000a81548160ff021916908315150217905550602082015181600101556040820151816002015560608201518160030155905050604051806080016040528060011515815260200167011c37937e08000081526020016000815260200160648152506127226000600280811115620003f0577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020155606082015181600301559050505050620019a9565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008062000528620007a160201b60201c565b612710620005379190620016e7565b9050600081612721543344426040516020016200055894939291906200152b565b6040516020818303038152906040528051906020012060001c6200057d919062001878565b9050600080600b836127108110620005be577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0154146200060c57600b82612710811062000602577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0154905062000610565b8190505b6000600b600185620006239190620016e7565b61271081106200065c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01541415620006bb57600183620006749190620016e7565b600b836127108110620006b0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b018190555062000749565b600b600184620006cc9190620016e7565b612710811062000705577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0154600b83612710811062000743577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01819055505b61272160008154809291906200075f90620017f8565b919050555080806200077190620017f8565b9150935050505090565b6200079d828260405180602001604052806000815250620007ae60201b60201c565b5050565b6000600880549050905090565b620007c083836200081c60201b60201c565b620007d5600084848462000a0260201b60201c565b62000817576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200080e90620015d5565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200088f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000886906200163b565b60405180910390fd5b620008a08162000bbc60201b60201c565b15620008e3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008da90620015f7565b60405180910390fd5b620008f76000838362000c2860201b60201c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200094991906200168a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600062000a308473ffffffffffffffffffffffffffffffffffffffff1662000d6f60201b6200245e1760201c565b1562000baf578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0262000a626200044760201b60201c565b8786866040518563ffffffff1660e01b815260040162000a86949392919062001581565b602060405180830381600087803b15801562000aa157600080fd5b505af192505050801562000ad557506040513d601f19601f8201168201806040525081019062000ad2919062001312565b60015b62000b5e573d806000811462000b08576040519150601f19603f3d011682016040523d82523d6000602084013e62000b0d565b606091505b5060008151141562000b56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000b4d90620015d5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505062000bb4565b600190505b949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b62000c4083838362000d8260201b620024711760201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562000c8d5762000c878162000d8760201b60201c565b62000cd5565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161462000cd45762000cd3838262000dd060201b60201c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000d225762000d1c8162000f4d60201b60201c565b62000d6a565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000d695762000d6882826200109560201b60201c565b5b5b505050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600162000dea846200112160201b620015401760201c565b62000df69190620016e7565b905060006007600084815260200190815260200160002054905081811462000edc576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905062000f639190620016e7565b905060006009600084815260200190815260200160002054905060006008838154811062000fba577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811062001003577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548062001079577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000620010ad836200112160201b620015401760201c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562001195576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200118c9062001619565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b828054620011ea90620017c2565b90600052602060002090601f0160209004810192826200120e57600085556200125a565b82601f106200122957805160ff19168380011785556200125a565b828001600101855582156200125a579182015b82811115620012595782518255916020019190600101906200123c565b5b5090506200126991906200126d565b5090565b5b80821115620012885760008160009055506001016200126e565b5090565b6000815190506200129d816200195b565b92915050565b600081519050620012b48162001975565b92915050565b600081519050620012cb816200198f565b92915050565b60008060408385031215620012e557600080fd5b6000620012f5858286016200128c565b92505060206200130885828601620012ba565b9150509250929050565b6000602082840312156200132557600080fd5b60006200133584828501620012a3565b91505092915050565b620013498162001722565b82525050565b620013646200135e8262001722565b62001846565b82525050565b600062001377826200165d565b62001383818562001668565b9350620013958185602086016200178c565b620013a0816200193d565b840191505092915050565b6000620013ba60328362001679565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600062001422601c8362001679565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b600062001464602a8362001679565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000620014cc60208362001679565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6200150a8162001782565b82525050565b620015256200151f8262001782565b6200186e565b82525050565b600062001539828762001510565b6020820191506200154b82866200134f565b6014820191506200155d828562001510565b6020820191506200156f828462001510565b60208201915081905095945050505050565b60006080820190506200159860008301876200133e565b620015a760208301866200133e565b620015b66040830185620014ff565b8181036060830152620015ca81846200136a565b905095945050505050565b60006020820190508181036000830152620015f081620013ab565b9050919050565b60006020820190508181036000830152620016128162001413565b9050919050565b60006020820190508181036000830152620016348162001455565b9050919050565b600060208201905081810360008301526200165681620014bd565b9050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000620016978262001782565b9150620016a48362001782565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620016dc57620016db620018b0565b5b828201905092915050565b6000620016f48262001782565b9150620017018362001782565b925082821015620017175762001716620018b0565b5b828203905092915050565b60006200172f8262001762565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b83811015620017ac5780820151818401526020810190506200178f565b83811115620017bc576000848401525b50505050565b60006002820490506001821680620017db57607f821691505b60208210811415620017f257620017f16200190e565b5b50919050565b6000620018058262001782565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156200183b576200183a620018b0565b5b600182019050919050565b600062001853826200185a565b9050919050565b600062001867826200194e565b9050919050565b6000819050919050565b6000620018858262001782565b9150620018928362001782565b925082620018a557620018a4620018df565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b620019668162001722565b81146200197257600080fd5b50565b620019808162001736565b81146200198c57600080fd5b50565b6200199a8162001782565b8114620019a657600080fd5b50565b61551080620019b96000396000f3fe6080604052600436106102255760003560e01c80634f6ccce7116101235780638da5cb5b116100ab578063c87b56dd1161006f578063c87b56dd146107cf578063e01a30061461080c578063e985e9c514610823578063ee5c1d0b14610860578063f2fde38b1461087c57610225565b80638da5cb5b1461070b57806395d89b4114610736578063a22cb46514610761578063b88d4fde1461078a578063bfcc3672146107b357610225565b8063697a80b7116100f2578063697a80b71461065957806370a0823114610684578063715018a6146106c15780637c8df833146106d8578063853828b61461070157610225565b80634f6ccce71461058b57806355f804b3146105c85780635dcf579e146105f15780636352211e1461061c57610225565b80631f297a70116101b15780632f745c59116101755780632f745c591461047f5780633c8f28ee146104bc5780633ec79193146104e557806342842e0e14610525578063438b63001461054e57610225565b80631f297a70146103cf57806323b872dd146103f85780632754cfbb14610421578063290c292d146104385780632b13ab661461045457610225565b8063093d8c64116101f8578063093d8c64146102fa578063095ea7b314610325578063123404731461034e578063146ca5311461037957806318160ddd146103a457610225565b806301ffc9a71461022a57806303ea7a5a1461026757806306fdde0314610292578063081812fc146102bd575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190613e64565b6108a5565b60405161025e9190614bb5565b60405180910390f35b34801561027357600080fd5b5061027c61091f565b6040516102899190614fd7565b60405180910390f35b34801561029e57600080fd5b506102a7610926565b6040516102b49190614c15565b60405180910390f35b3480156102c957600080fd5b506102e460048036038101906102df9190613ef7565b6109b8565b6040516102f19190614b2c565b60405180910390f35b34801561030657600080fd5b5061030f610a3d565b60405161031c9190614fd7565b60405180910390f35b34801561033157600080fd5b5061034c60048036038101906103479190613dff565b610a43565b005b34801561035a57600080fd5b50610363610b5b565b6040516103709190614fd7565b60405180910390f35b34801561038557600080fd5b5061038e610b62565b60405161039b9190614fd7565b60405180910390f35b3480156103b057600080fd5b506103b9610b69565b6040516103c69190614fd7565b60405180910390f35b3480156103db57600080fd5b506103f660048036038101906103f19190613ef7565b610b76565b005b34801561040457600080fd5b5061041f600480360381019061041a9190613cf9565b610bfd565b005b34801561042d57600080fd5b50610436610c5d565b005b610452600480360381019061044d9190613dff565b610d54565b005b34801561046057600080fd5b50610469610fed565b6040516104769190614fd7565b60405180910390f35b34801561048b57600080fd5b506104a660048036038101906104a19190613dff565b610ff4565b6040516104b39190614fd7565b60405180910390f35b3480156104c857600080fd5b506104e360048036038101906104de9190613e3b565b611099565b005b3480156104f157600080fd5b5061050c60048036038101906105079190613ef7565b611133565b60405161051c9493929190614bd0565b60405180910390f35b34801561053157600080fd5b5061054c60048036038101906105479190613cf9565b6111b5565b005b34801561055a57600080fd5b5061057560048036038101906105709190613c94565b6111d5565b6040516105829190614b93565b60405180910390f35b34801561059757600080fd5b506105b260048036038101906105ad9190613ef7565b6112cf565b6040516105bf9190614fd7565b60405180910390f35b3480156105d457600080fd5b506105ef60048036038101906105ea9190613eb6565b611366565b005b3480156105fd57600080fd5b506106066113fd565b6040516106139190614fd7565b60405180910390f35b34801561062857600080fd5b50610643600480360381019061063e9190613ef7565b61147a565b6040516106509190614b2c565b60405180910390f35b34801561066557600080fd5b5061066e61152c565b60405161067b9190614bb5565b60405180910390f35b34801561069057600080fd5b506106ab60048036038101906106a69190613c94565b611540565b6040516106b89190614fd7565b60405180910390f35b3480156106cd57600080fd5b506106d66115f8565b005b3480156106e457600080fd5b506106ff60048036038101906106fa9190613f20565b611680565b005b610709611786565b005b34801561071757600080fd5b50610720611842565b60405161072d9190614b2c565b60405180910390f35b34801561074257600080fd5b5061074b61186c565b6040516107589190614c15565b60405180910390f35b34801561076d57600080fd5b5061078860048036038101906107839190613dc3565b6118fe565b005b34801561079657600080fd5b506107b160048036038101906107ac9190613d48565b611a7f565b005b6107cd60048036038101906107c89190613dff565b611ae1565b005b3480156107db57600080fd5b506107f660048036038101906107f19190613ef7565b611dfd565b6040516108039190614c15565b60405180910390f35b34801561081857600080fd5b50610821611ea4565b005b34801561082f57600080fd5b5061084a60048036038101906108459190613cbd565b612034565b6040516108579190614bb5565b60405180910390f35b61087a60048036038101906108759190613dff565b6120c8565b005b34801561088857600080fd5b506108a3600480360381019061089e9190613c94565b612366565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610918575061091782612476565b5b9050919050565b61271e5481565b606060008054610935906152ca565b80601f0160208091040260200160405190810160405280929190818152602001828054610961906152ca565b80156109ae5780601f10610983576101008083540402835291602001916109ae565b820191906000526020600020905b81548152906001019060200180831161099157829003601f168201915b5050505050905090565b60006109c382612558565b610a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f990614e57565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61271081565b6000610a4e8261147a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610abf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab690614f37565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ade6125c4565b73ffffffffffffffffffffffffffffffffffffffff161480610b0d5750610b0c81610b076125c4565b612034565b5b610b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4390614d97565b60405180910390fd5b610b5683836125cc565b505050565b6127205481565b61271d5481565b6000600880549050905090565b610b7e6125c4565b73ffffffffffffffffffffffffffffffffffffffff16610b9c611842565b73ffffffffffffffffffffffffffffffffffffffff1614610bf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be990614e97565b60405180910390fd5b806127208190555050565b610c0e610c086125c4565b82612685565b610c4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4490614f77565b60405180910390fd5b610c58838383612763565b505050565b610c656125c4565b73ffffffffffffffffffffffffffffffffffffffff16610c83611842565b73ffffffffffffffffffffffffffffffffffffffff1614610cd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd090614e97565b60405180910390fd5b60006127226000600280811115610d19577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200190815260200160002060000160006101000a81548160ff021916908315150217905550600161271d819055504361271f81905550565b6127226000806002811115610d92577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200190815260200160002060000160009054906101000a900460ff1615610df1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de890614d17565b60405180910390fd5b6127226000806002811115610e2f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200190815260200160002060030154816127226000806002811115610e80577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200190815260200160002060020154610e9c91906150ff565b10610edc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed390614e77565b60405180910390fd5b806127226000806002811115610f1b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200190815260200160002060010154610f379190615186565b341015610f79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7090614f17565b60405180910390fd5b610f8382826129bf565b806127226000806002811115610fc2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81526020019081526020016000206002016000828254610fe291906150ff565b925050819055505050565b61271f5481565b6000610fff83611540565b8210611040576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103790614c37565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6110a16125c4565b73ffffffffffffffffffffffffffffffffffffffff166110bf611842565b73ffffffffffffffffffffffffffffffffffffffff1614611115576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110c90614e97565b60405180910390fd5b8061271b60006101000a81548160ff02191690831515021790555050565b600080600080612722600086815260200190815260200160002060000160009054906101000a900460ff1661272260008781526020019081526020016000206001015461272260008881526020019081526020016000206002015461272260008981526020019081526020016000206003015493509350935093509193509193565b6111d083838360405180602001604052806000815250611a7f565b505050565b606060006111e283611540565b905060008167ffffffffffffffff811115611226577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156112545781602001602082028036833780820191505090505b50905060005b828110156112c45761126c8582610ff4565b8282815181106112a5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080806112bc906152fc565b91505061125a565b508092505050919050565b60006112d9610b69565b821061131a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131190614f97565b60405180910390fd5b60088281548110611354577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b61136e6125c4565b73ffffffffffffffffffffffffffffffffffffffff1661138c611842565b73ffffffffffffffffffffffffffffffffffffffff16146113e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d990614e97565b60405180910390fd5b8061271c90805190602001906113f9929190613ab8565b5050565b6000606461271e54603261141191906150ff565b612722600060028081111561144f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81526020019081526020016000206001015461146b9190615186565b6114759190615155565b905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611523576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151a90614dd7565b60405180910390fd5b80915050919050565b61271b60009054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a890614db7565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6116006125c4565b73ffffffffffffffffffffffffffffffffffffffff1661161e611842565b73ffffffffffffffffffffffffffffffffffffffff1614611674576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166b90614e97565b60405180910390fd5b61167e6000612b2a565b565b6116886125c4565b73ffffffffffffffffffffffffffffffffffffffff166116a6611842565b73ffffffffffffffffffffffffffffffffffffffff16146116fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f390614e97565b60405180910390fd5b83612722600087815260200190815260200160002060000160006101000a81548160ff0219169083151502179055508261272260008781526020019081526020016000206001018190555081612722600087815260200190815260200160002060020181905550806127226000878152602001908152602001600020600301819055505050505050565b61178e6125c4565b73ffffffffffffffffffffffffffffffffffffffff166117ac611842565b73ffffffffffffffffffffffffffffffffffffffff1614611802576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f990614e97565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061184057600080fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461187b906152ca565b80601f01602080910402602001604051908101604052809291908181526020018280546118a7906152ca565b80156118f45780601f106118c9576101008083540402835291602001916118f4565b820191906000526020600020905b8154815290600101906020018083116118d757829003601f168201915b5050505050905090565b6119066125c4565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611974576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196b90614cf7565b60405180910390fd5b80600560006119816125c4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a2e6125c4565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a739190614bb5565b60405180910390a35050565b611a90611a8a6125c4565b83612685565b611acf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac690614f77565b60405180910390fd5b611adb84848484612bf0565b50505050565b6127226000600280811115611b1f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200190815260200160002060000160009054906101000a900460ff1615611b7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7590614df7565b60405180910390fd5b6127226000600280811115611bbc577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8152602001908152602001600020600301548161271e54611bdd91906150ff565b10611c1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1490614f57565b60405180910390fd5b806127226000600280811115611c5c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200190815260200160002060010154611c789190615186565b341015611cba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb190614f17565b60405180910390fd5b43600361272054611ccb9190615186565b61271f54611cd991906150ff565b1015611d4c5760016127226000600280811115611d1f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200190815260200160002060000160006101000a81548160ff021916908315150217905550611df9565b436127205461271f54611d5f91906150ff565b1015611d6e57611d6d612c4c565b5b611d7882826129bf565b8061271e6000828254611d8b91906150ff565b92505081905550806127226000600280811115611dd1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81526020019081526020016000206002016000828254611df191906150ff565b925050819055505b5050565b6060611e0882612558565b611e47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3e90614ef7565b60405180910390fd5b6000611e51612d60565b90506000815111611e715760405180602001604052806000815250611e9c565b80611e7b84612df3565b604051602001611e8c929190614aba565b6040516020818303038152906040525b915050919050565b611eac6125c4565b73ffffffffffffffffffffffffffffffffffffffff16611eca611842565b73ffffffffffffffffffffffffffffffffffffffff1614611f20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1790614e97565b60405180910390fd5b6000611f2a6113fd565b905067016345785d8a0000811015611f9d5767016345785d8a00006127226000600280811115611f83577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200190815260200160002060010181905550611ff2565b806127226000600280811115611fdc577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8152602001908152602001600020600101819055505b61271d6000815480929190612006906152fc565b9190505550600061271e819055506127205461271f600082825461202a91906150ff565b9250508190555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612722600060016002811115612107577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200190815260200160002060000160009054906101000a900460ff1615612166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215d90614d77565b60405180910390fd5b6127226000600160028111156121a5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200190815260200160002060030154816127226000600160028111156121f7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81526020019081526020016000206002015461221391906150ff565b10612253576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224a90614fb7565b60405180910390fd5b80612722600060016002811115612293577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8152602001908152602001600020600101546122af9190615186565b3410156122f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e890614f17565b60405180910390fd5b6122fb82826129bf565b8061272260006001600281111561233b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8152602001908152602001600020600201600082825461235b91906150ff565b925050819055505050565b61236e6125c4565b73ffffffffffffffffffffffffffffffffffffffff1661238c611842565b73ffffffffffffffffffffffffffffffffffffffff16146123e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d990614e97565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612452576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244990614c77565b60405180910390fd5b61245b81612b2a565b50565b600080823b905060008111915050919050565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061254157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612551575061255082612fa0565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661263f8361147a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061269082612558565b6126cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c690614d57565b60405180910390fd5b60006126da8361147a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061274957508373ffffffffffffffffffffffffffffffffffffffff16612731846109b8565b73ffffffffffffffffffffffffffffffffffffffff16145b8061275a57506127598185612034565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166127838261147a565b73ffffffffffffffffffffffffffffffffffffffff16146127d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d090614ed7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612849576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284090614cd7565b60405180910390fd5b61285483838361300a565b61285f6000826125cc565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128af91906151e0565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461290691906150ff565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b61271b60009054906101000a900460ff1615612a10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0790614eb7565b60405180910390fd5b601e811115612a54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4b90614cb7565b60405180910390fd5b61271081612a60610b69565b612a6a91906150ff565b1115612aab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aa290614d37565b60405180910390fd5b612710612ab6610b69565b10612af6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aed90614e37565b60405180910390fd5b60005b81811015612b2557612b1283612b0d61311e565b613362565b8080612b1d906152fc565b915050612af9565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612bfb848484612763565b612c0784848484613380565b612c46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3d90614c57565b60405180910390fd5b50505050565b6000612c566113fd565b905067016345785d8a0000811015612cc95767016345785d8a00006127226000600280811115612caf577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200190815260200160002060010181905550612d1e565b806127226000600280811115612d08577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8152602001908152602001600020600101819055505b61271d6000815480929190612d32906152fc565b9190505550600061271e819055506127205461271f6000828254612d5691906150ff565b9250508190555050565b606061271c8054612d70906152ca565b80601f0160208091040260200160405190810160405280929190818152602001828054612d9c906152ca565b8015612de95780601f10612dbe57610100808354040283529160200191612de9565b820191906000526020600020905b815481529060010190602001808311612dcc57829003601f168201915b5050505050905090565b60606000821415612e3b576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612f9b565b600082905060005b60008214612e6d578080612e56906152fc565b915050600a82612e669190615155565b9150612e43565b60008167ffffffffffffffff811115612eaf577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612ee15781602001600182028036833780820191505090505b5090505b60008514612f9457600182612efa91906151e0565b9150600a85612f099190615373565b6030612f1591906150ff565b60f81b818381518110612f51577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612f8d9190615155565b9450612ee5565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b613015838383612471565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156130585761305381613517565b613097565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613096576130958382613560565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130da576130d5816136cd565b613119565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613118576131178282613810565b5b5b505050565b600080613129610b69565b61271061313691906151e0565b9050600081612721543344426040516020016131559493929190614ade565b6040516020818303038152906040528051906020012060001c6131789190615373565b9050600080600b8361271081106131b8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01541461320357600b8261271081106131fa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01549050613207565b8190505b6000600b60018561321891906151e0565b6127108110613250577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b015414156132aa5760018361326591906151e0565b600b8361271081106132a0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0181905550613334565b600b6001846132b991906151e0565b61271081106132f1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0154600b83612710811061332e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01819055505b6127216000815480929190613348906152fc565b91905055508080613358906152fc565b9150935050505090565b61337c82826040518060200160405280600081525061388f565b5050565b60006133a18473ffffffffffffffffffffffffffffffffffffffff1661245e565b1561350a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026133ca6125c4565b8786866040518563ffffffff1660e01b81526004016133ec9493929190614b47565b602060405180830381600087803b15801561340657600080fd5b505af192505050801561343757506040513d601f19601f820116820180604052508101906134349190613e8d565b60015b6134ba573d8060008114613467576040519150601f19603f3d011682016040523d82523d6000602084013e61346c565b606091505b506000815114156134b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134a990614c57565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061350f565b600190505b949350505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161356d84611540565b61357791906151e0565b905060006007600084815260200190815260200160002054905081811461365c576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506136e191906151e0565b9050600060096000848152602001908152602001600020549050600060088381548110613737577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811061377f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806137f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061381b83611540565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b61389983836138ea565b6138a66000848484613380565b6138e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138dc90614c57565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561395a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161395190614e17565b60405180910390fd5b61396381612558565b156139a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161399a90614c97565b60405180910390fd5b6139af6000838361300a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546139ff91906150ff565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054613ac4906152ca565b90600052602060002090601f016020900481019282613ae65760008555613b2d565b82601f10613aff57805160ff1916838001178555613b2d565b82800160010185558215613b2d579182015b82811115613b2c578251825591602001919060010190613b11565b5b509050613b3a9190613b3e565b5090565b5b80821115613b57576000816000905550600101613b3f565b5090565b6000613b6e613b6984615023565b614ff2565b905082815260208101848484011115613b8657600080fd5b613b91848285615288565b509392505050565b6000613bac613ba784615053565b614ff2565b905082815260208101848484011115613bc457600080fd5b613bcf848285615288565b509392505050565b600081359050613be68161547e565b92915050565b600081359050613bfb81615495565b92915050565b600081359050613c10816154ac565b92915050565b600081519050613c25816154ac565b92915050565b600082601f830112613c3c57600080fd5b8135613c4c848260208601613b5b565b91505092915050565b600082601f830112613c6657600080fd5b8135613c76848260208601613b99565b91505092915050565b600081359050613c8e816154c3565b92915050565b600060208284031215613ca657600080fd5b6000613cb484828501613bd7565b91505092915050565b60008060408385031215613cd057600080fd5b6000613cde85828601613bd7565b9250506020613cef85828601613bd7565b9150509250929050565b600080600060608486031215613d0e57600080fd5b6000613d1c86828701613bd7565b9350506020613d2d86828701613bd7565b9250506040613d3e86828701613c7f565b9150509250925092565b60008060008060808587031215613d5e57600080fd5b6000613d6c87828801613bd7565b9450506020613d7d87828801613bd7565b9350506040613d8e87828801613c7f565b925050606085013567ffffffffffffffff811115613dab57600080fd5b613db787828801613c2b565b91505092959194509250565b60008060408385031215613dd657600080fd5b6000613de485828601613bd7565b9250506020613df585828601613bec565b9150509250929050565b60008060408385031215613e1257600080fd5b6000613e2085828601613bd7565b9250506020613e3185828601613c7f565b9150509250929050565b600060208284031215613e4d57600080fd5b6000613e5b84828501613bec565b91505092915050565b600060208284031215613e7657600080fd5b6000613e8484828501613c01565b91505092915050565b600060208284031215613e9f57600080fd5b6000613ead84828501613c16565b91505092915050565b600060208284031215613ec857600080fd5b600082013567ffffffffffffffff811115613ee257600080fd5b613eee84828501613c55565b91505092915050565b600060208284031215613f0957600080fd5b6000613f1784828501613c7f565b91505092915050565b600080600080600060a08688031215613f3857600080fd5b6000613f4688828901613c7f565b9550506020613f5788828901613bec565b9450506040613f6888828901613c7f565b9350506060613f7988828901613c7f565b9250506080613f8a88828901613c7f565b9150509295509295909350565b6000613fa38383614a85565b60208301905092915050565b613fb881615214565b82525050565b613fcf613fca82615214565b615345565b82525050565b6000613fe082615093565b613fea81856150c1565b9350613ff583615083565b8060005b8381101561402657815161400d8882613f97565b9750614018836150b4565b925050600181019050613ff9565b5085935050505092915050565b61403c81615226565b82525050565b600061404d8261509e565b61405781856150d2565b9350614067818560208601615297565b61407081615460565b840191505092915050565b6000614086826150a9565b61409081856150e3565b93506140a0818560208601615297565b6140a981615460565b840191505092915050565b60006140bf826150a9565b6140c981856150f4565b93506140d9818560208601615297565b80840191505092915050565b60006140f2602b836150e3565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006141586032836150e3565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006141be6026836150e3565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614224601c836150e3565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000614264600a836150e3565b91507f45786365656473203330000000000000000000000000000000000000000000006000830152602082019050919050565b60006142a46024836150e3565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061430a6019836150e3565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b600061434a601b836150e3565b91507f54686973206973206e6f74207072652d73616c6520706572696f6400000000006000830152602082019050919050565b600061438a6009836150e3565b91507f4d6178206c696d697400000000000000000000000000000000000000000000006000830152602082019050919050565b60006143ca602c836150e3565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006144306022836150e3565b91507f54686973206973206e6f742074696d6561747461636b2d73616c65207065726960008301527f6f640000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006144966038836150e3565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006144fc602a836150e3565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006145626029836150e3565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006145c8601d836150e3565b91507f54686973206973206e6f7420726f756e642d73616c6520706572696f640000006000830152602082019050919050565b60006146086020836150e3565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006146486008836150e3565b91507f53616c6520656e640000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614688602c836150e3565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006146ee601c836150e3565b91507f6d6178206c696d697420666f722070726553616c65206d61726b6574000000006000830152602082019050919050565b600061472e6020836150e3565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061476e6011836150e3565b91507f616c6c206d61726b6574207061757365640000000000000000000000000000006000830152602082019050919050565b60006147ae6029836150e3565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614814602f836150e3565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b600061487a6011836150e3565b91507f56616c75652062656c6f772070726963650000000000000000000000000000006000830152602082019050919050565b60006148ba6021836150e3565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006149206014836150e3565b91507f5468697320726f756e64206d6178206c696d69740000000000000000000000006000830152602082019050919050565b60006149606031836150e3565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006149c6602c836150e3565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000614a2c6023836150e3565b91507f6d6178206c696d697420666f722074696d6541747461636b53616c65206d617260008301527f6b657400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b614a8e8161527e565b82525050565b614a9d8161527e565b82525050565b614ab4614aaf8261527e565b615369565b82525050565b6000614ac682856140b4565b9150614ad282846140b4565b91508190509392505050565b6000614aea8287614aa3565b602082019150614afa8286613fbe565b601482019150614b0a8285614aa3565b602082019150614b1a8284614aa3565b60208201915081905095945050505050565b6000602082019050614b416000830184613faf565b92915050565b6000608082019050614b5c6000830187613faf565b614b696020830186613faf565b614b766040830185614a94565b8181036060830152614b888184614042565b905095945050505050565b60006020820190508181036000830152614bad8184613fd5565b905092915050565b6000602082019050614bca6000830184614033565b92915050565b6000608082019050614be56000830187614033565b614bf26020830186614a94565b614bff6040830185614a94565b614c0c6060830184614a94565b95945050505050565b60006020820190508181036000830152614c2f818461407b565b905092915050565b60006020820190508181036000830152614c50816140e5565b9050919050565b60006020820190508181036000830152614c708161414b565b9050919050565b60006020820190508181036000830152614c90816141b1565b9050919050565b60006020820190508181036000830152614cb081614217565b9050919050565b60006020820190508181036000830152614cd081614257565b9050919050565b60006020820190508181036000830152614cf081614297565b9050919050565b60006020820190508181036000830152614d10816142fd565b9050919050565b60006020820190508181036000830152614d308161433d565b9050919050565b60006020820190508181036000830152614d508161437d565b9050919050565b60006020820190508181036000830152614d70816143bd565b9050919050565b60006020820190508181036000830152614d9081614423565b9050919050565b60006020820190508181036000830152614db081614489565b9050919050565b60006020820190508181036000830152614dd0816144ef565b9050919050565b60006020820190508181036000830152614df081614555565b9050919050565b60006020820190508181036000830152614e10816145bb565b9050919050565b60006020820190508181036000830152614e30816145fb565b9050919050565b60006020820190508181036000830152614e508161463b565b9050919050565b60006020820190508181036000830152614e708161467b565b9050919050565b60006020820190508181036000830152614e90816146e1565b9050919050565b60006020820190508181036000830152614eb081614721565b9050919050565b60006020820190508181036000830152614ed081614761565b9050919050565b60006020820190508181036000830152614ef0816147a1565b9050919050565b60006020820190508181036000830152614f1081614807565b9050919050565b60006020820190508181036000830152614f308161486d565b9050919050565b60006020820190508181036000830152614f50816148ad565b9050919050565b60006020820190508181036000830152614f7081614913565b9050919050565b60006020820190508181036000830152614f9081614953565b9050919050565b60006020820190508181036000830152614fb0816149b9565b9050919050565b60006020820190508181036000830152614fd081614a1f565b9050919050565b6000602082019050614fec6000830184614a94565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561501957615018615431565b5b8060405250919050565b600067ffffffffffffffff82111561503e5761503d615431565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561506e5761506d615431565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061510a8261527e565b91506151158361527e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561514a576151496153a4565b5b828201905092915050565b60006151608261527e565b915061516b8361527e565b92508261517b5761517a6153d3565b5b828204905092915050565b60006151918261527e565b915061519c8361527e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156151d5576151d46153a4565b5b828202905092915050565b60006151eb8261527e565b91506151f68361527e565b925082821015615209576152086153a4565b5b828203905092915050565b600061521f8261525e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156152b557808201518184015260208101905061529a565b838111156152c4576000848401525b50505050565b600060028204905060018216806152e257607f821691505b602082108114156152f6576152f5615402565b5b50919050565b60006153078261527e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561533a576153396153a4565b5b600182019050919050565b600061535082615357565b9050919050565b600061536282615471565b9050919050565b6000819050919050565b600061537e8261527e565b91506153898361527e565b925082615399576153986153d3565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b61548781615214565b811461549257600080fd5b50565b61549e81615226565b81146154a957600080fd5b50565b6154b581615232565b81146154c057600080fd5b50565b6154cc8161527e565b81146154d757600080fd5b5056fea264697066735822122016a85d5dd736db25c7d85c5f649470c68bfe30f03c06364cd87fb69c36088dcf64736f6c63430008000033697066733a2f2f516d5446365138346a355448566e6342646832447341485354704e54314e396867454876434338416f7253753166000000000000000000000000341d21e766474459cd2a091c7057e2ae9943f52a0000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102255760003560e01c80634f6ccce7116101235780638da5cb5b116100ab578063c87b56dd1161006f578063c87b56dd146107cf578063e01a30061461080c578063e985e9c514610823578063ee5c1d0b14610860578063f2fde38b1461087c57610225565b80638da5cb5b1461070b57806395d89b4114610736578063a22cb46514610761578063b88d4fde1461078a578063bfcc3672146107b357610225565b8063697a80b7116100f2578063697a80b71461065957806370a0823114610684578063715018a6146106c15780637c8df833146106d8578063853828b61461070157610225565b80634f6ccce71461058b57806355f804b3146105c85780635dcf579e146105f15780636352211e1461061c57610225565b80631f297a70116101b15780632f745c59116101755780632f745c591461047f5780633c8f28ee146104bc5780633ec79193146104e557806342842e0e14610525578063438b63001461054e57610225565b80631f297a70146103cf57806323b872dd146103f85780632754cfbb14610421578063290c292d146104385780632b13ab661461045457610225565b8063093d8c64116101f8578063093d8c64146102fa578063095ea7b314610325578063123404731461034e578063146ca5311461037957806318160ddd146103a457610225565b806301ffc9a71461022a57806303ea7a5a1461026757806306fdde0314610292578063081812fc146102bd575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190613e64565b6108a5565b60405161025e9190614bb5565b60405180910390f35b34801561027357600080fd5b5061027c61091f565b6040516102899190614fd7565b60405180910390f35b34801561029e57600080fd5b506102a7610926565b6040516102b49190614c15565b60405180910390f35b3480156102c957600080fd5b506102e460048036038101906102df9190613ef7565b6109b8565b6040516102f19190614b2c565b60405180910390f35b34801561030657600080fd5b5061030f610a3d565b60405161031c9190614fd7565b60405180910390f35b34801561033157600080fd5b5061034c60048036038101906103479190613dff565b610a43565b005b34801561035a57600080fd5b50610363610b5b565b6040516103709190614fd7565b60405180910390f35b34801561038557600080fd5b5061038e610b62565b60405161039b9190614fd7565b60405180910390f35b3480156103b057600080fd5b506103b9610b69565b6040516103c69190614fd7565b60405180910390f35b3480156103db57600080fd5b506103f660048036038101906103f19190613ef7565b610b76565b005b34801561040457600080fd5b5061041f600480360381019061041a9190613cf9565b610bfd565b005b34801561042d57600080fd5b50610436610c5d565b005b610452600480360381019061044d9190613dff565b610d54565b005b34801561046057600080fd5b50610469610fed565b6040516104769190614fd7565b60405180910390f35b34801561048b57600080fd5b506104a660048036038101906104a19190613dff565b610ff4565b6040516104b39190614fd7565b60405180910390f35b3480156104c857600080fd5b506104e360048036038101906104de9190613e3b565b611099565b005b3480156104f157600080fd5b5061050c60048036038101906105079190613ef7565b611133565b60405161051c9493929190614bd0565b60405180910390f35b34801561053157600080fd5b5061054c60048036038101906105479190613cf9565b6111b5565b005b34801561055a57600080fd5b5061057560048036038101906105709190613c94565b6111d5565b6040516105829190614b93565b60405180910390f35b34801561059757600080fd5b506105b260048036038101906105ad9190613ef7565b6112cf565b6040516105bf9190614fd7565b60405180910390f35b3480156105d457600080fd5b506105ef60048036038101906105ea9190613eb6565b611366565b005b3480156105fd57600080fd5b506106066113fd565b6040516106139190614fd7565b60405180910390f35b34801561062857600080fd5b50610643600480360381019061063e9190613ef7565b61147a565b6040516106509190614b2c565b60405180910390f35b34801561066557600080fd5b5061066e61152c565b60405161067b9190614bb5565b60405180910390f35b34801561069057600080fd5b506106ab60048036038101906106a69190613c94565b611540565b6040516106b89190614fd7565b60405180910390f35b3480156106cd57600080fd5b506106d66115f8565b005b3480156106e457600080fd5b506106ff60048036038101906106fa9190613f20565b611680565b005b610709611786565b005b34801561071757600080fd5b50610720611842565b60405161072d9190614b2c565b60405180910390f35b34801561074257600080fd5b5061074b61186c565b6040516107589190614c15565b60405180910390f35b34801561076d57600080fd5b5061078860048036038101906107839190613dc3565b6118fe565b005b34801561079657600080fd5b506107b160048036038101906107ac9190613d48565b611a7f565b005b6107cd60048036038101906107c89190613dff565b611ae1565b005b3480156107db57600080fd5b506107f660048036038101906107f19190613ef7565b611dfd565b6040516108039190614c15565b60405180910390f35b34801561081857600080fd5b50610821611ea4565b005b34801561082f57600080fd5b5061084a60048036038101906108459190613cbd565b612034565b6040516108579190614bb5565b60405180910390f35b61087a60048036038101906108759190613dff565b6120c8565b005b34801561088857600080fd5b506108a3600480360381019061089e9190613c94565b612366565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610918575061091782612476565b5b9050919050565b61271e5481565b606060008054610935906152ca565b80601f0160208091040260200160405190810160405280929190818152602001828054610961906152ca565b80156109ae5780601f10610983576101008083540402835291602001916109ae565b820191906000526020600020905b81548152906001019060200180831161099157829003601f168201915b5050505050905090565b60006109c382612558565b610a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f990614e57565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61271081565b6000610a4e8261147a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610abf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab690614f37565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ade6125c4565b73ffffffffffffffffffffffffffffffffffffffff161480610b0d5750610b0c81610b076125c4565b612034565b5b610b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4390614d97565b60405180910390fd5b610b5683836125cc565b505050565b6127205481565b61271d5481565b6000600880549050905090565b610b7e6125c4565b73ffffffffffffffffffffffffffffffffffffffff16610b9c611842565b73ffffffffffffffffffffffffffffffffffffffff1614610bf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be990614e97565b60405180910390fd5b806127208190555050565b610c0e610c086125c4565b82612685565b610c4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4490614f77565b60405180910390fd5b610c58838383612763565b505050565b610c656125c4565b73ffffffffffffffffffffffffffffffffffffffff16610c83611842565b73ffffffffffffffffffffffffffffffffffffffff1614610cd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd090614e97565b60405180910390fd5b60006127226000600280811115610d19577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200190815260200160002060000160006101000a81548160ff021916908315150217905550600161271d819055504361271f81905550565b6127226000806002811115610d92577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200190815260200160002060000160009054906101000a900460ff1615610df1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de890614d17565b60405180910390fd5b6127226000806002811115610e2f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200190815260200160002060030154816127226000806002811115610e80577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200190815260200160002060020154610e9c91906150ff565b10610edc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed390614e77565b60405180910390fd5b806127226000806002811115610f1b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200190815260200160002060010154610f379190615186565b341015610f79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7090614f17565b60405180910390fd5b610f8382826129bf565b806127226000806002811115610fc2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81526020019081526020016000206002016000828254610fe291906150ff565b925050819055505050565b61271f5481565b6000610fff83611540565b8210611040576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103790614c37565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6110a16125c4565b73ffffffffffffffffffffffffffffffffffffffff166110bf611842565b73ffffffffffffffffffffffffffffffffffffffff1614611115576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110c90614e97565b60405180910390fd5b8061271b60006101000a81548160ff02191690831515021790555050565b600080600080612722600086815260200190815260200160002060000160009054906101000a900460ff1661272260008781526020019081526020016000206001015461272260008881526020019081526020016000206002015461272260008981526020019081526020016000206003015493509350935093509193509193565b6111d083838360405180602001604052806000815250611a7f565b505050565b606060006111e283611540565b905060008167ffffffffffffffff811115611226577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156112545781602001602082028036833780820191505090505b50905060005b828110156112c45761126c8582610ff4565b8282815181106112a5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080806112bc906152fc565b91505061125a565b508092505050919050565b60006112d9610b69565b821061131a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131190614f97565b60405180910390fd5b60088281548110611354577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b61136e6125c4565b73ffffffffffffffffffffffffffffffffffffffff1661138c611842565b73ffffffffffffffffffffffffffffffffffffffff16146113e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d990614e97565b60405180910390fd5b8061271c90805190602001906113f9929190613ab8565b5050565b6000606461271e54603261141191906150ff565b612722600060028081111561144f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81526020019081526020016000206001015461146b9190615186565b6114759190615155565b905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611523576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151a90614dd7565b60405180910390fd5b80915050919050565b61271b60009054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a890614db7565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6116006125c4565b73ffffffffffffffffffffffffffffffffffffffff1661161e611842565b73ffffffffffffffffffffffffffffffffffffffff1614611674576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166b90614e97565b60405180910390fd5b61167e6000612b2a565b565b6116886125c4565b73ffffffffffffffffffffffffffffffffffffffff166116a6611842565b73ffffffffffffffffffffffffffffffffffffffff16146116fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f390614e97565b60405180910390fd5b83612722600087815260200190815260200160002060000160006101000a81548160ff0219169083151502179055508261272260008781526020019081526020016000206001018190555081612722600087815260200190815260200160002060020181905550806127226000878152602001908152602001600020600301819055505050505050565b61178e6125c4565b73ffffffffffffffffffffffffffffffffffffffff166117ac611842565b73ffffffffffffffffffffffffffffffffffffffff1614611802576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f990614e97565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061184057600080fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461187b906152ca565b80601f01602080910402602001604051908101604052809291908181526020018280546118a7906152ca565b80156118f45780601f106118c9576101008083540402835291602001916118f4565b820191906000526020600020905b8154815290600101906020018083116118d757829003601f168201915b5050505050905090565b6119066125c4565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611974576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196b90614cf7565b60405180910390fd5b80600560006119816125c4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a2e6125c4565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a739190614bb5565b60405180910390a35050565b611a90611a8a6125c4565b83612685565b611acf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac690614f77565b60405180910390fd5b611adb84848484612bf0565b50505050565b6127226000600280811115611b1f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200190815260200160002060000160009054906101000a900460ff1615611b7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7590614df7565b60405180910390fd5b6127226000600280811115611bbc577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8152602001908152602001600020600301548161271e54611bdd91906150ff565b10611c1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1490614f57565b60405180910390fd5b806127226000600280811115611c5c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200190815260200160002060010154611c789190615186565b341015611cba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb190614f17565b60405180910390fd5b43600361272054611ccb9190615186565b61271f54611cd991906150ff565b1015611d4c5760016127226000600280811115611d1f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200190815260200160002060000160006101000a81548160ff021916908315150217905550611df9565b436127205461271f54611d5f91906150ff565b1015611d6e57611d6d612c4c565b5b611d7882826129bf565b8061271e6000828254611d8b91906150ff565b92505081905550806127226000600280811115611dd1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81526020019081526020016000206002016000828254611df191906150ff565b925050819055505b5050565b6060611e0882612558565b611e47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3e90614ef7565b60405180910390fd5b6000611e51612d60565b90506000815111611e715760405180602001604052806000815250611e9c565b80611e7b84612df3565b604051602001611e8c929190614aba565b6040516020818303038152906040525b915050919050565b611eac6125c4565b73ffffffffffffffffffffffffffffffffffffffff16611eca611842565b73ffffffffffffffffffffffffffffffffffffffff1614611f20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1790614e97565b60405180910390fd5b6000611f2a6113fd565b905067016345785d8a0000811015611f9d5767016345785d8a00006127226000600280811115611f83577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200190815260200160002060010181905550611ff2565b806127226000600280811115611fdc577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8152602001908152602001600020600101819055505b61271d6000815480929190612006906152fc565b9190505550600061271e819055506127205461271f600082825461202a91906150ff565b9250508190555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612722600060016002811115612107577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200190815260200160002060000160009054906101000a900460ff1615612166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215d90614d77565b60405180910390fd5b6127226000600160028111156121a5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200190815260200160002060030154816127226000600160028111156121f7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81526020019081526020016000206002015461221391906150ff565b10612253576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224a90614fb7565b60405180910390fd5b80612722600060016002811115612293577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8152602001908152602001600020600101546122af9190615186565b3410156122f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e890614f17565b60405180910390fd5b6122fb82826129bf565b8061272260006001600281111561233b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8152602001908152602001600020600201600082825461235b91906150ff565b925050819055505050565b61236e6125c4565b73ffffffffffffffffffffffffffffffffffffffff1661238c611842565b73ffffffffffffffffffffffffffffffffffffffff16146123e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d990614e97565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612452576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244990614c77565b60405180910390fd5b61245b81612b2a565b50565b600080823b905060008111915050919050565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061254157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612551575061255082612fa0565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661263f8361147a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061269082612558565b6126cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c690614d57565b60405180910390fd5b60006126da8361147a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061274957508373ffffffffffffffffffffffffffffffffffffffff16612731846109b8565b73ffffffffffffffffffffffffffffffffffffffff16145b8061275a57506127598185612034565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166127838261147a565b73ffffffffffffffffffffffffffffffffffffffff16146127d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d090614ed7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612849576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284090614cd7565b60405180910390fd5b61285483838361300a565b61285f6000826125cc565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128af91906151e0565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461290691906150ff565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b61271b60009054906101000a900460ff1615612a10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0790614eb7565b60405180910390fd5b601e811115612a54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4b90614cb7565b60405180910390fd5b61271081612a60610b69565b612a6a91906150ff565b1115612aab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aa290614d37565b60405180910390fd5b612710612ab6610b69565b10612af6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aed90614e37565b60405180910390fd5b60005b81811015612b2557612b1283612b0d61311e565b613362565b8080612b1d906152fc565b915050612af9565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612bfb848484612763565b612c0784848484613380565b612c46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3d90614c57565b60405180910390fd5b50505050565b6000612c566113fd565b905067016345785d8a0000811015612cc95767016345785d8a00006127226000600280811115612caf577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200190815260200160002060010181905550612d1e565b806127226000600280811115612d08577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8152602001908152602001600020600101819055505b61271d6000815480929190612d32906152fc565b9190505550600061271e819055506127205461271f6000828254612d5691906150ff565b9250508190555050565b606061271c8054612d70906152ca565b80601f0160208091040260200160405190810160405280929190818152602001828054612d9c906152ca565b8015612de95780601f10612dbe57610100808354040283529160200191612de9565b820191906000526020600020905b815481529060010190602001808311612dcc57829003601f168201915b5050505050905090565b60606000821415612e3b576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612f9b565b600082905060005b60008214612e6d578080612e56906152fc565b915050600a82612e669190615155565b9150612e43565b60008167ffffffffffffffff811115612eaf577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612ee15781602001600182028036833780820191505090505b5090505b60008514612f9457600182612efa91906151e0565b9150600a85612f099190615373565b6030612f1591906150ff565b60f81b818381518110612f51577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612f8d9190615155565b9450612ee5565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b613015838383612471565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156130585761305381613517565b613097565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613096576130958382613560565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130da576130d5816136cd565b613119565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613118576131178282613810565b5b5b505050565b600080613129610b69565b61271061313691906151e0565b9050600081612721543344426040516020016131559493929190614ade565b6040516020818303038152906040528051906020012060001c6131789190615373565b9050600080600b8361271081106131b8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01541461320357600b8261271081106131fa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01549050613207565b8190505b6000600b60018561321891906151e0565b6127108110613250577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b015414156132aa5760018361326591906151e0565b600b8361271081106132a0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0181905550613334565b600b6001846132b991906151e0565b61271081106132f1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0154600b83612710811061332e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01819055505b6127216000815480929190613348906152fc565b91905055508080613358906152fc565b9150935050505090565b61337c82826040518060200160405280600081525061388f565b5050565b60006133a18473ffffffffffffffffffffffffffffffffffffffff1661245e565b1561350a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026133ca6125c4565b8786866040518563ffffffff1660e01b81526004016133ec9493929190614b47565b602060405180830381600087803b15801561340657600080fd5b505af192505050801561343757506040513d601f19601f820116820180604052508101906134349190613e8d565b60015b6134ba573d8060008114613467576040519150601f19603f3d011682016040523d82523d6000602084013e61346c565b606091505b506000815114156134b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134a990614c57565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061350f565b600190505b949350505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161356d84611540565b61357791906151e0565b905060006007600084815260200190815260200160002054905081811461365c576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506136e191906151e0565b9050600060096000848152602001908152602001600020549050600060088381548110613737577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811061377f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806137f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061381b83611540565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b61389983836138ea565b6138a66000848484613380565b6138e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138dc90614c57565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561395a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161395190614e17565b60405180910390fd5b61396381612558565b156139a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161399a90614c97565b60405180910390fd5b6139af6000838361300a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546139ff91906150ff565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054613ac4906152ca565b90600052602060002090601f016020900481019282613ae65760008555613b2d565b82601f10613aff57805160ff1916838001178555613b2d565b82800160010185558215613b2d579182015b82811115613b2c578251825591602001919060010190613b11565b5b509050613b3a9190613b3e565b5090565b5b80821115613b57576000816000905550600101613b3f565b5090565b6000613b6e613b6984615023565b614ff2565b905082815260208101848484011115613b8657600080fd5b613b91848285615288565b509392505050565b6000613bac613ba784615053565b614ff2565b905082815260208101848484011115613bc457600080fd5b613bcf848285615288565b509392505050565b600081359050613be68161547e565b92915050565b600081359050613bfb81615495565b92915050565b600081359050613c10816154ac565b92915050565b600081519050613c25816154ac565b92915050565b600082601f830112613c3c57600080fd5b8135613c4c848260208601613b5b565b91505092915050565b600082601f830112613c6657600080fd5b8135613c76848260208601613b99565b91505092915050565b600081359050613c8e816154c3565b92915050565b600060208284031215613ca657600080fd5b6000613cb484828501613bd7565b91505092915050565b60008060408385031215613cd057600080fd5b6000613cde85828601613bd7565b9250506020613cef85828601613bd7565b9150509250929050565b600080600060608486031215613d0e57600080fd5b6000613d1c86828701613bd7565b9350506020613d2d86828701613bd7565b9250506040613d3e86828701613c7f565b9150509250925092565b60008060008060808587031215613d5e57600080fd5b6000613d6c87828801613bd7565b9450506020613d7d87828801613bd7565b9350506040613d8e87828801613c7f565b925050606085013567ffffffffffffffff811115613dab57600080fd5b613db787828801613c2b565b91505092959194509250565b60008060408385031215613dd657600080fd5b6000613de485828601613bd7565b9250506020613df585828601613bec565b9150509250929050565b60008060408385031215613e1257600080fd5b6000613e2085828601613bd7565b9250506020613e3185828601613c7f565b9150509250929050565b600060208284031215613e4d57600080fd5b6000613e5b84828501613bec565b91505092915050565b600060208284031215613e7657600080fd5b6000613e8484828501613c01565b91505092915050565b600060208284031215613e9f57600080fd5b6000613ead84828501613c16565b91505092915050565b600060208284031215613ec857600080fd5b600082013567ffffffffffffffff811115613ee257600080fd5b613eee84828501613c55565b91505092915050565b600060208284031215613f0957600080fd5b6000613f1784828501613c7f565b91505092915050565b600080600080600060a08688031215613f3857600080fd5b6000613f4688828901613c7f565b9550506020613f5788828901613bec565b9450506040613f6888828901613c7f565b9350506060613f7988828901613c7f565b9250506080613f8a88828901613c7f565b9150509295509295909350565b6000613fa38383614a85565b60208301905092915050565b613fb881615214565b82525050565b613fcf613fca82615214565b615345565b82525050565b6000613fe082615093565b613fea81856150c1565b9350613ff583615083565b8060005b8381101561402657815161400d8882613f97565b9750614018836150b4565b925050600181019050613ff9565b5085935050505092915050565b61403c81615226565b82525050565b600061404d8261509e565b61405781856150d2565b9350614067818560208601615297565b61407081615460565b840191505092915050565b6000614086826150a9565b61409081856150e3565b93506140a0818560208601615297565b6140a981615460565b840191505092915050565b60006140bf826150a9565b6140c981856150f4565b93506140d9818560208601615297565b80840191505092915050565b60006140f2602b836150e3565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006141586032836150e3565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006141be6026836150e3565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614224601c836150e3565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000614264600a836150e3565b91507f45786365656473203330000000000000000000000000000000000000000000006000830152602082019050919050565b60006142a46024836150e3565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061430a6019836150e3565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b600061434a601b836150e3565b91507f54686973206973206e6f74207072652d73616c6520706572696f6400000000006000830152602082019050919050565b600061438a6009836150e3565b91507f4d6178206c696d697400000000000000000000000000000000000000000000006000830152602082019050919050565b60006143ca602c836150e3565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006144306022836150e3565b91507f54686973206973206e6f742074696d6561747461636b2d73616c65207065726960008301527f6f640000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006144966038836150e3565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006144fc602a836150e3565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006145626029836150e3565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006145c8601d836150e3565b91507f54686973206973206e6f7420726f756e642d73616c6520706572696f640000006000830152602082019050919050565b60006146086020836150e3565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006146486008836150e3565b91507f53616c6520656e640000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614688602c836150e3565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006146ee601c836150e3565b91507f6d6178206c696d697420666f722070726553616c65206d61726b6574000000006000830152602082019050919050565b600061472e6020836150e3565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061476e6011836150e3565b91507f616c6c206d61726b6574207061757365640000000000000000000000000000006000830152602082019050919050565b60006147ae6029836150e3565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614814602f836150e3565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b600061487a6011836150e3565b91507f56616c75652062656c6f772070726963650000000000000000000000000000006000830152602082019050919050565b60006148ba6021836150e3565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006149206014836150e3565b91507f5468697320726f756e64206d6178206c696d69740000000000000000000000006000830152602082019050919050565b60006149606031836150e3565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006149c6602c836150e3565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000614a2c6023836150e3565b91507f6d6178206c696d697420666f722074696d6541747461636b53616c65206d617260008301527f6b657400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b614a8e8161527e565b82525050565b614a9d8161527e565b82525050565b614ab4614aaf8261527e565b615369565b82525050565b6000614ac682856140b4565b9150614ad282846140b4565b91508190509392505050565b6000614aea8287614aa3565b602082019150614afa8286613fbe565b601482019150614b0a8285614aa3565b602082019150614b1a8284614aa3565b60208201915081905095945050505050565b6000602082019050614b416000830184613faf565b92915050565b6000608082019050614b5c6000830187613faf565b614b696020830186613faf565b614b766040830185614a94565b8181036060830152614b888184614042565b905095945050505050565b60006020820190508181036000830152614bad8184613fd5565b905092915050565b6000602082019050614bca6000830184614033565b92915050565b6000608082019050614be56000830187614033565b614bf26020830186614a94565b614bff6040830185614a94565b614c0c6060830184614a94565b95945050505050565b60006020820190508181036000830152614c2f818461407b565b905092915050565b60006020820190508181036000830152614c50816140e5565b9050919050565b60006020820190508181036000830152614c708161414b565b9050919050565b60006020820190508181036000830152614c90816141b1565b9050919050565b60006020820190508181036000830152614cb081614217565b9050919050565b60006020820190508181036000830152614cd081614257565b9050919050565b60006020820190508181036000830152614cf081614297565b9050919050565b60006020820190508181036000830152614d10816142fd565b9050919050565b60006020820190508181036000830152614d308161433d565b9050919050565b60006020820190508181036000830152614d508161437d565b9050919050565b60006020820190508181036000830152614d70816143bd565b9050919050565b60006020820190508181036000830152614d9081614423565b9050919050565b60006020820190508181036000830152614db081614489565b9050919050565b60006020820190508181036000830152614dd0816144ef565b9050919050565b60006020820190508181036000830152614df081614555565b9050919050565b60006020820190508181036000830152614e10816145bb565b9050919050565b60006020820190508181036000830152614e30816145fb565b9050919050565b60006020820190508181036000830152614e508161463b565b9050919050565b60006020820190508181036000830152614e708161467b565b9050919050565b60006020820190508181036000830152614e90816146e1565b9050919050565b60006020820190508181036000830152614eb081614721565b9050919050565b60006020820190508181036000830152614ed081614761565b9050919050565b60006020820190508181036000830152614ef0816147a1565b9050919050565b60006020820190508181036000830152614f1081614807565b9050919050565b60006020820190508181036000830152614f308161486d565b9050919050565b60006020820190508181036000830152614f50816148ad565b9050919050565b60006020820190508181036000830152614f7081614913565b9050919050565b60006020820190508181036000830152614f9081614953565b9050919050565b60006020820190508181036000830152614fb0816149b9565b9050919050565b60006020820190508181036000830152614fd081614a1f565b9050919050565b6000602082019050614fec6000830184614a94565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561501957615018615431565b5b8060405250919050565b600067ffffffffffffffff82111561503e5761503d615431565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561506e5761506d615431565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061510a8261527e565b91506151158361527e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561514a576151496153a4565b5b828201905092915050565b60006151608261527e565b915061516b8361527e565b92508261517b5761517a6153d3565b5b828204905092915050565b60006151918261527e565b915061519c8361527e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156151d5576151d46153a4565b5b828202905092915050565b60006151eb8261527e565b91506151f68361527e565b925082821015615209576152086153a4565b5b828203905092915050565b600061521f8261525e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156152b557808201518184015260208101905061529a565b838111156152c4576000848401525b50505050565b600060028204905060018216806152e257607f821691505b602082108114156152f6576152f5615402565b5b50919050565b60006153078261527e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561533a576153396153a4565b5b600182019050919050565b600061535082615357565b9050919050565b600061536282615471565b9050919050565b6000819050919050565b600061537e8261527e565b91506153898361527e565b925082615399576153986153d3565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b61548781615214565b811461549257600080fd5b50565b61549e81615226565b81146154a957600080fd5b50565b6154b581615232565b81146154c057600080fd5b50565b6154cc8161527e565b81146154d757600080fd5b5056fea264697066735822122016a85d5dd736db25c7d85c5f649470c68bfe30f03c06364cd87fb69c36088dcf64736f6c63430008000033

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

000000000000000000000000341d21e766474459cd2a091c7057e2ae9943f52a0000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _to (address): 0x341D21E766474459CD2a091c7057e2ae9943f52A
Arg [1] : _initialMint (uint256): 0

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000341d21e766474459cd2a091c7057e2ae9943f52a
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

45113:8846:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38701:300;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45411:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25809:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27502:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45170:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27025:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45491:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45380:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39504:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48164:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28561:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47769:179;;;;;;;;;;;;;:::i;:::-;;49251:692;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45454:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39085:343;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46830:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46931:415;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;29008:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52189:381;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39694:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52831:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47956:200;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25416:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45258:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25059:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2503:94;;;;;;;;;;;;;:::i;:::-;;47354:407;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52578:123;;;:::i;:::-;;1852:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25978:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27882:327;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29264:365;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50705:1068;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26153:468;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48761:482;;;;;;;;;;;;;:::i;:::-;;28280:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49951:746;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2752:229;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38701:300;38848:4;38905:35;38890:50;;;:11;:50;;;;:103;;;;38957:36;38981:11;38957:23;:36::i;:::-;38890:103;38870:123;;38701:300;;;:::o;45411:36::-;;;;:::o;25809:100::-;25863:13;25896:5;25889:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25809:100;:::o;27502:308::-;27623:7;27670:16;27678:7;27670;:16::i;:::-;27648:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;27778:15;:24;27794:7;27778:24;;;;;;;;;;;;;;;;;;;;;27771:31;;27502:308;;;:::o;45170:40::-;45205:5;45170:40;:::o;27025:411::-;27106:13;27122:23;27137:7;27122:14;:23::i;:::-;27106:39;;27170:5;27164:11;;:2;:11;;;;27156:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27264:5;27248:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27273:37;27290:5;27297:12;:10;:12::i;:::-;27273:16;:37::i;:::-;27248:62;27226:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;27407:21;27416:2;27420:7;27407:8;:21::i;:::-;27025:411;;;:::o;45491:34::-;;;;:::o;45380:24::-;;;;:::o;39504:113::-;39565:7;39592:10;:17;;;;39585:24;;39504:113;:::o;48164:116::-;2083:12;:10;:12::i;:::-;2072:23;;:7;:5;:7::i;:::-;:23;;;2064:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48258:14:::1;48242:13;:30;;;;48164:116:::0;:::o;28561:376::-;28770:41;28789:12;:10;:12::i;:::-;28803:7;28770:18;:41::i;:::-;28748:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;28901:28;28911:4;28917:2;28921:7;28901:9;:28::i;:::-;28561:376;;;:::o;47769:179::-;2083:12;:10;:12::i;:::-;2072:23;;:7;:5;:7::i;:::-;:23;;;2064:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47874:5:::1;47823:10;:41;47842:20;47834:29:::0;::::1;;;;;;;;;;;;;;;47823:41;;;;;;;;;;;:48;;;:56;;;;;;;;;;;;;;;;;;47898:1;47890:5;:9;;;;47928:12;47910:15;:30;;;;47769:179::o:0;49251:692::-;49346:10;:39;49365:18;49357:27;;;;;;;;;;;;;;;;49346:39;;;;;;;;;;;:46;;;;;;;;;;;;49345:47;49323:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;49558:10;:39;49577:18;49569:27;;;;;;;;;;;;;;;;49558:39;;;;;;;;;;;:49;;;49532:6;49480:10;:39;49499:18;49491:27;;;;;;;;;;;;;;;;49480:39;;;;;;;;;;;:49;;;:58;;;;:::i;:::-;:127;49458:205;;;;;;;;;;;;:::i;:::-;;;;;;;;;49775:6;49727:10;:39;49746:18;49738:27;;;;;;;;;;;;;;;;49727:39;;;;;;;;;;;:45;;;:54;;;;:::i;:::-;49696:9;:86;;49674:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;49840:25;49853:3;49858:6;49840:12;:25::i;:::-;49929:6;49876:10;:39;49895:18;49887:27;;;;;;;;;;;;;;;;49876:39;;;;;;;;;;;:49;;;:59;;;;;;;:::i;:::-;;;;;;;;49251:692;;:::o;45454:30::-;;;;:::o;39085:343::-;39227:7;39282:23;39299:5;39282:16;:23::i;:::-;39274:5;:31;39252:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;39394:12;:19;39407:5;39394:19;;;;;;;;;;;;;;;:26;39414:5;39394:26;;;;;;;;;;;;39387:33;;39085:343;;;;:::o;46830:93::-;2083:12;:10;:12::i;:::-;2072:23;;:7;:5;:7::i;:::-;:23;;;2064:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46908:7:::1;46896:9;;:19;;;;;;;;;;;;;;;;;;46830:93:::0;:::o;46931:415::-;47037:4;47056:7;47078;47100;47157:10;:23;47168:11;47157:23;;;;;;;;;;;:30;;;;;;;;;;;;47202:10;:23;47213:11;47202:23;;;;;;;;;;;:29;;;47246:10;:23;47257:11;47246:23;;;;;;;;;;;:33;;;47294:10;:23;47305:11;47294:23;;;;;;;;;;;:33;;;47135:203;;;;;;;;46931:415;;;;;:::o;29008:185::-;29146:39;29163:4;29169:2;29173:7;29146:39;;;;;;;;;;;;:16;:39::i;:::-;29008:185;;;:::o;52189:381::-;52278:16;52312:18;52333:17;52343:6;52333:9;:17::i;:::-;52312:38;;52361:25;52403:10;52389:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52361:53;;52430:9;52425:112;52449:10;52445:1;:14;52425:112;;;52495:30;52515:6;52523:1;52495:19;:30::i;:::-;52481:8;52490:1;52481:11;;;;;;;;;;;;;;;;;;;;;:44;;;;;52461:3;;;;;:::i;:::-;;;;52425:112;;;;52554:8;52547:15;;;;52189:381;;;:::o;39694:320::-;39814:7;39869:30;:28;:30::i;:::-;39861:5;:38;39839:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;39989:10;40000:5;39989:17;;;;;;;;;;;;;;;;;;;;;;;;39982:24;;39694:320;;;:::o;52831:102::-;2083:12;:10;:12::i;:::-;2072:23;;:7;:5;:7::i;:::-;:23;;;2064:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52918:7:::1;52902:13;:23;;;;;;;;;;;;:::i;:::-;;52831:102:::0;:::o;47956:200::-;48009:7;48145:3;48123:17;;48118:2;:22;;;;:::i;:::-;48050:10;:41;48069:20;48061:29;;;;;;;;;;;;;;;;48050:41;;;;;;;;;;;:47;;;:91;;;;:::i;:::-;48049:99;;;;:::i;:::-;48029:119;;47956:200;:::o;25416:326::-;25533:7;25558:13;25574:7;:16;25582:7;25574:16;;;;;;;;;;;;;;;;;;;;;25558:32;;25640:1;25623:19;;:5;:19;;;;25601:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;25729:5;25722:12;;;25416:326;;;:::o;45258:28::-;;;;;;;;;;;;;:::o;25059:295::-;25176:7;25240:1;25223:19;;:5;:19;;;;25201:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25330:9;:16;25340:5;25330:16;;;;;;;;;;;;;;;;25323:23;;25059:295;;;:::o;2503:94::-;2083:12;:10;:12::i;:::-;2072:23;;:7;:5;:7::i;:::-;:23;;;2064:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2568:21:::1;2586:1;2568:9;:21::i;:::-;2503:94::o:0;47354:407::-;2083:12;:10;:12::i;:::-;2072:23;;:7;:5;:7::i;:::-;:23;;;2064:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47583:7:::1;47550:10;:23;47561:11;47550:23;;;;;;;;;;;:30;;;:40;;;;;;;;;;;;;;;;;;47633:6;47601:10;:23;47612:11;47601:23;;;;;;;;;;;:29;;:38;;;;47686:10;47650;:23;47661:11;47650:23;;;;;;;;;;;:33;;:46;;;;47743:10;47707;:23;47718:11;47707:23;;;;;;;;;;;:33;;:46;;;;47354:407:::0;;;;;:::o;52578:123::-;2083:12;:10;:12::i;:::-;2072:23;;:7;:5;:7::i;:::-;:23;;;2064:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52653:10:::1;52645:24;;:47;52670:21;52645:47;;;;;;;;;;;;;;;;;;;;;;;52637:56;;;::::0;::::1;;52578:123::o:0;1852:87::-;1898:7;1925:6;;;;;;;;;;;1918:13;;1852:87;:::o;25978:104::-;26034:13;26067:7;26060:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25978:104;:::o;27882:327::-;28029:12;:10;:12::i;:::-;28017:24;;:8;:24;;;;28009:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;28129:8;28084:18;:32;28103:12;:10;:12::i;:::-;28084:32;;;;;;;;;;;;;;;:42;28117:8;28084:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;28182:8;28153:48;;28168:12;:10;:12::i;:::-;28153:48;;;28192:8;28153:48;;;;;;:::i;:::-;;;;;;;;27882:327;;:::o;29264:365::-;29453:41;29472:12;:10;:12::i;:::-;29486:7;29453:18;:41::i;:::-;29431:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;29582:39;29596:4;29602:2;29606:7;29615:5;29582:13;:39::i;:::-;29264:365;;;;:::o;50705:1068::-;50802:10;:41;50821:20;50813:29;;;;;;;;;;;;;;;;50802:41;;;;;;;;;;;:48;;;;;;;;;;;;50801:49;50779:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;50986:10;:41;51005:20;50997:29;;;;;;;;;;;;;;;;50986:41;;;;;;;;;;;:51;;;50960:6;50940:17;;:26;;;;:::i;:::-;:97;50918:167;;;;;;;;;;;;:::i;:::-;;;;;;;;;51199:6;51149:10;:41;51168:20;51160:29;;;;;;;;;;;;;;;;51149:41;;;;;;;;;;;:47;;;:56;;;;:::i;:::-;51118:9;:88;;51096:155;;;;;;;;;;;;:::i;:::-;;;;;;;;;51352:12;51347:1;51331:13;;:17;;;;:::i;:::-;51312:15;;:37;;;;:::i;:::-;:52;51308:161;;;51432:4;51381:10;:41;51400:20;51392:29;;;;;;;;;;;;;;;;51381:41;;;;;;;;;;;:48;;;:55;;;;;;;;;;;;;;;;;;51451:7;;51308:161;51563:12;51547:13;;51529:15;;:31;;;;:::i;:::-;:46;51525:93;;;51592:14;:12;:14::i;:::-;51525:93;51630:25;51643:3;51648:6;51630:12;:25::i;:::-;51687:6;51666:17;;:27;;;;;;;:::i;:::-;;;;;;;;51759:6;51704:10;:41;51723:20;51715:29;;;;;;;;;;;;;;;;51704:41;;;;;;;;;;;:51;;;:61;;;;;;;:::i;:::-;;;;;;;;50705:1068;;;:::o;26153:468::-;26271:13;26324:16;26332:7;26324;:16::i;:::-;26302:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;26428:21;26452:10;:8;:10::i;:::-;26428:34;;26517:1;26499:7;26493:21;:25;:120;;;;;;;;;;;;;;;;;26562:7;26571:18;:7;:16;:18::i;:::-;26545:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26493:120;26473:140;;;26153:468;;;:::o;48761:482::-;2083:12;:10;:12::i;:::-;2072:23;;:7;:5;:7::i;:::-;:23;;;2064:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48822:22:::1;48847;:20;:22::i;:::-;48822:47;;48903:23;48886:14;:40;48882:261;;;49011:23;48943:10;:41;48962:20;48954:29:::0;::::1;;;;;;;;;;;;;;;48943:41;;;;;;;;;;;:65;;:91;;;;48882:261;;;49117:14;49067:10;:41;49086:20;49078:29:::0;::::1;;;;;;;;;;;;;;;49067:41;;;;;;;;;;;:47;;:64;;;;48882:261;49153:5;;:7;;;;;;;;;:::i;:::-;;;;;;49191:1;49171:17;:21;;;;49222:13;;49203:15;;:32;;;;;;;:::i;:::-;;;;;;;;2143:1;48761:482::o:0;28280:214::-;28422:4;28451:18;:25;28470:5;28451:25;;;;;;;;;;;;;;;:35;28477:8;28451:35;;;;;;;;;;;;;;;;;;;;;;;;;28444:42;;28280:214;;;;:::o;49951:746::-;50053:10;:46;50072:25;50064:34;;;;;;;;;;;;;;;;50053:46;;;;;;;;;;;:53;;;;;;;;;;;;50052:54;50030:138;;;;;;;;;;;;:::i;:::-;;;;;;;;;50286:10;:46;50305:25;50297:34;;;;;;;;;;;;;;;;50286:46;;;;;;;;;;;:56;;;50260:6;50201:10;:46;50220:25;50212:34;;;;;;;;;;;;;;;;50201:46;;;;;;;;;;;:56;;;:65;;;;:::i;:::-;:141;50179:226;;;;;;;;;;;;:::i;:::-;;;;;;;;;50524:6;50469:10;:46;50488:25;50480:34;;;;;;;;;;;;;;;;50469:46;;;;;;;;;;;:52;;;:61;;;;:::i;:::-;50438:9;:93;;50416:160;;;;;;;;;;;;:::i;:::-;;;;;;;;;50587:25;50600:3;50605:6;50587:12;:25::i;:::-;50683:6;50623:10;:46;50642:25;50634:34;;;;;;;;;;;;;;;;50623:46;;;;;;;;;;;:56;;;:66;;;;;;;:::i;:::-;;;;;;;;49951:746;;:::o;2752:229::-;2083:12;:10;:12::i;:::-;2072:23;;:7;:5;:7::i;:::-;:23;;;2064:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2875:1:::1;2855:22;;:8;:22;;;;2833:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;2954:19;2964:8;2954:9;:19::i;:::-;2752:229:::0;:::o;13843:387::-;13903:4;14111:12;14178:7;14166:20;14158:28;;14221:1;14214:4;:8;14207:15;;;13843:387;;;:::o;37590:126::-;;;;:::o;24640:355::-;24787:4;24844:25;24829:40;;;:11;:40;;;;:105;;;;24901:33;24886:48;;;:11;:48;;;;24829:105;:158;;;;24951:36;24975:11;24951:23;:36::i;:::-;24829:158;24809:178;;24640:355;;;:::o;31176:127::-;31241:4;31293:1;31265:30;;:7;:16;31273:7;31265:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31258:37;;31176:127;;;:::o;621:98::-;674:7;701:10;694:17;;621:98;:::o;35299:174::-;35401:2;35374:15;:24;35390:7;35374:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35457:7;35453:2;35419:46;;35428:23;35443:7;35428:14;:23::i;:::-;35419:46;;;;;;;;;;;;35299:174;;:::o;31470:452::-;31599:4;31643:16;31651:7;31643;:16::i;:::-;31621:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;31742:13;31758:23;31773:7;31758:14;:23::i;:::-;31742:39;;31811:5;31800:16;;:7;:16;;;:64;;;;31857:7;31833:31;;:20;31845:7;31833:11;:20::i;:::-;:31;;;31800:64;:113;;;;31881:32;31898:5;31905:7;31881:16;:32::i;:::-;31800:113;31792:122;;;31470:452;;;;:::o;34566:615::-;34739:4;34712:31;;:23;34727:7;34712:14;:23::i;:::-;:31;;;34690:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;34845:1;34831:16;;:2;:16;;;;34823:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34901:39;34922:4;34928:2;34932:7;34901:20;:39::i;:::-;35005:29;35022:1;35026:7;35005:8;:29::i;:::-;35066:1;35047:9;:15;35057:4;35047:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;35095:1;35078:9;:13;35088:2;35078:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35126:2;35107:7;:16;35115:7;35107:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35165:7;35161:2;35146:27;;35155:4;35146:27;;;;;;;;;;;;34566:615;;;:::o;51781:400::-;51861:9;;;;;;;;;;;51860:10;51852:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;51921:2;51911:6;:12;;51903:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;45205:5;51973:6;51957:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:34;;51949:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;45205:5;52024:13;:11;:13::i;:::-;:24;52016:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;52077:9;52072:102;52096:6;52092:1;:10;52072:102;;;52124:38;52134:3;52139:22;:20;:22::i;:::-;52124:9;:38::i;:::-;52104:3;;;;;:::i;:::-;;;;52072:102;;;;51781:400;;:::o;2989:173::-;3045:16;3064:6;;;;;;;;;;;3045:25;;3090:8;3081:6;;:17;;;;;;;;;;;;;;;;;;3145:8;3114:40;;3135:8;3114:40;;;;;;;;;;;;2989:173;;:::o;30511:352::-;30668:28;30678:4;30684:2;30688:7;30668:9;:28::i;:::-;30729:48;30752:4;30758:2;30762:7;30771:5;30729:22;:48::i;:::-;30707:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;30511:352;;;;:::o;48288:465::-;48332:22;48357;:20;:22::i;:::-;48332:47;;48413:23;48396:14;:40;48392:261;;;48521:23;48453:10;:41;48472:20;48464:29;;;;;;;;;;;;;;;;48453:41;;;;;;;;;;;:65;;:91;;;;48392:261;;;48627:14;48577:10;:41;48596:20;48588:29;;;;;;;;;;;;;;;;48577:41;;;;;;;;;;;:47;;:64;;;;48392:261;48663:5;;:7;;;;;;;;;:::i;:::-;;;;;;48701:1;48681:17;:21;;;;48732:13;;48713:15;;:32;;;;;;;:::i;:::-;;;;;;;;48288:465;:::o;52709:114::-;52769:13;52802;52795:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52709:114;:::o;11290:723::-;11346:13;11576:1;11567:5;:10;11563:53;;;11594:10;;;;;;;;;;;;;;;;;;;;;11563:53;11626:12;11641:5;11626:20;;11657:14;11682:78;11697:1;11689:4;:9;11682:78;;11715:8;;;;;:::i;:::-;;;;11746:2;11738:10;;;;;:::i;:::-;;;11682:78;;;11770:19;11802:6;11792:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11770:39;;11820:154;11836:1;11827:5;:10;11820:154;;11864:1;11854:11;;;;;:::i;:::-;;;11931:2;11923:5;:10;;;;:::i;:::-;11910:2;:24;;;;:::i;:::-;11897:39;;11880:6;11887;11880:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;11960:2;11951:11;;;;;:::i;:::-;;;11820:154;;;11998:6;11984:21;;;;;11290:723;;;;:::o;10769:207::-;10899:4;10943:25;10928:40;;;:11;:40;;;;10921:47;;10769:207;;;:::o;40627:589::-;40771:45;40798:4;40804:2;40808:7;40771:26;:45::i;:::-;40849:1;40833:18;;:4;:18;;;40829:187;;;40868:40;40900:7;40868:31;:40::i;:::-;40829:187;;;40938:2;40930:10;;:4;:10;;;40926:90;;40957:47;40990:4;40996:7;40957:32;:47::i;:::-;40926:90;40829:187;41044:1;41030:16;;:2;:16;;;41026:183;;;41063:45;41100:7;41063:36;:45::i;:::-;41026:183;;;41136:4;41130:10;;:2;:10;;;41126:83;;41157:40;41185:2;41189:7;41157:27;:40::i;:::-;41126:83;41026:183;40627:589;;;:::o;52941:1015::-;52991:7;53011:17;53042:13;:11;:13::i;:::-;45205:5;53031:24;;;;:::i;:::-;53011:44;;53066:13;53334:9;53171:5;;53199:10;53232:16;53271:15;53132:173;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53104:216;;;;;;53082:249;;:261;;;;:::i;:::-;53066:277;;53356:13;53406:1;53388:7;53396:5;53388:14;;;;;;;;;;;;;;;;;:19;53384:120;;53432:7;53440:5;53432:14;;;;;;;;;;;;;;;;;53424:22;;53384:120;;;53487:5;53479:13;;53384:120;53595:1;53569:7;53589:1;53577:9;:13;;;;:::i;:::-;53569:22;;;;;;;;;;;;;;;;;:27;53565:283;;;53706:1;53694:9;:13;;;;:::i;:::-;53677:7;53685:5;53677:14;;;;;;;;;;;;;;;;:30;;;;53565:283;;;53814:7;53834:1;53822:9;:13;;;;:::i;:::-;53814:22;;;;;;;;;;;;;;;;;53797:7;53805:5;53797:14;;;;;;;;;;;;;;;;:39;;;;53565:283;53858:5;;:7;;;;;;;;;:::i;:::-;;;;;;53941;;;;;:::i;:::-;;;53934:14;;;;;52941:1015;:::o;32264:110::-;32340:26;32350:2;32354:7;32340:26;;;;;;;;;;;;:9;:26::i;:::-;32264:110;;:::o;36038:980::-;36193:4;36214:15;:2;:13;;;:15::i;:::-;36210:801;;;36283:2;36267:36;;;36326:12;:10;:12::i;:::-;36361:4;36388:7;36418:5;36267:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36246:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36642:1;36625:6;:13;:18;36621:320;;;36668:108;;;;;;;;;;:::i;:::-;;;;;;;;36621:320;36891:6;36885:13;36876:6;36872:2;36868:15;36861:38;36246:710;36516:41;;;36506:51;;;:6;:51;;;;36499:58;;;;;36210:801;36995:4;36988:11;;36038:980;;;;;;;:::o;41939:164::-;42043:10;:17;;;;42016:15;:24;42032:7;42016:24;;;;;;;;;;;:44;;;;42071:10;42087:7;42071:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41939:164;:::o;42730:1002::-;43010:22;43060:1;43035:22;43052:4;43035:16;:22::i;:::-;:26;;;;:::i;:::-;43010:51;;43072:18;43093:17;:26;43111:7;43093:26;;;;;;;;;;;;43072:47;;43240:14;43226:10;:28;43222:328;;43271:19;43293:12;:18;43306:4;43293:18;;;;;;;;;;;;;;;:34;43312:14;43293:34;;;;;;;;;;;;43271:56;;43377:11;43344:12;:18;43357:4;43344:18;;;;;;;;;;;;;;;:30;43363:10;43344:30;;;;;;;;;;;:44;;;;43494:10;43461:17;:30;43479:11;43461:30;;;;;;;;;;;:43;;;;43222:328;;43646:17;:26;43664:7;43646:26;;;;;;;;;;;43639:33;;;43690:12;:18;43703:4;43690:18;;;;;;;;;;;;;;;:34;43709:14;43690:34;;;;;;;;;;;43683:41;;;42730:1002;;;;:::o;44027:1079::-;44280:22;44325:1;44305:10;:17;;;;:21;;;;:::i;:::-;44280:46;;44337:18;44358:15;:24;44374:7;44358:24;;;;;;;;;;;;44337:45;;44709:19;44731:10;44742:14;44731:26;;;;;;;;;;;;;;;;;;;;;;;;44709:48;;44795:11;44770:10;44781;44770:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;44906:10;44875:15;:28;44891:11;44875:28;;;;;;;;;;;:41;;;;45047:15;:24;45063:7;45047:24;;;;;;;;;;;45040:31;;;45082:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44027:1079;;;;:::o;41517:221::-;41602:14;41619:20;41636:2;41619:16;:20::i;:::-;41602:37;;41677:7;41650:12;:16;41663:2;41650:16;;;;;;;;;;;;;;;:24;41667:6;41650:24;;;;;;;;;;;:34;;;;41724:6;41695:17;:26;41713:7;41695:26;;;;;;;;;;;:35;;;;41517:221;;;:::o;32601:321::-;32731:18;32737:2;32741:7;32731:5;:18::i;:::-;32782:54;32813:1;32817:2;32821:7;32830:5;32782:22;:54::i;:::-;32760:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;32601:321;;;:::o;33258:382::-;33352:1;33338:16;;:2;:16;;;;33330:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33411:16;33419:7;33411;:16::i;:::-;33410:17;33402:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33473:45;33502:1;33506:2;33510:7;33473:20;:45::i;:::-;33548:1;33531:9;:13;33541:2;33531:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33579:2;33560:7;:16;33568:7;33560:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33624:7;33620:2;33599:33;;33616:1;33599:33;;;;;;;;;;;;33258:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:137::-;;1072:6;1059:20;1050:29;;1088:32;1114:5;1088:32;:::i;:::-;1040:86;;;;:::o;1132:141::-;;1219:6;1213:13;1204:22;;1235:32;1261:5;1235:32;:::i;:::-;1194:79;;;;:::o;1292:271::-;;1396:3;1389:4;1381:6;1377:17;1373:27;1363:2;;1414:1;1411;1404:12;1363:2;1454:6;1441:20;1479:78;1553:3;1545:6;1538:4;1530:6;1526:17;1479:78;:::i;:::-;1470:87;;1353:210;;;;;:::o;1583:273::-;;1688:3;1681:4;1673:6;1669:17;1665:27;1655:2;;1706:1;1703;1696:12;1655:2;1746:6;1733:20;1771:79;1846:3;1838:6;1831:4;1823:6;1819:17;1771:79;:::i;:::-;1762:88;;1645:211;;;;;:::o;1862:139::-;;1946:6;1933:20;1924:29;;1962:33;1989:5;1962:33;:::i;:::-;1914:87;;;;:::o;2007:262::-;;2115:2;2103:9;2094:7;2090:23;2086:32;2083:2;;;2131:1;2128;2121:12;2083:2;2174:1;2199:53;2244:7;2235:6;2224:9;2220:22;2199:53;:::i;:::-;2189:63;;2145:117;2073:196;;;;:::o;2275:407::-;;;2400:2;2388:9;2379:7;2375:23;2371:32;2368:2;;;2416:1;2413;2406:12;2368:2;2459:1;2484:53;2529:7;2520:6;2509:9;2505:22;2484:53;:::i;:::-;2474:63;;2430:117;2586:2;2612:53;2657:7;2648:6;2637:9;2633:22;2612:53;:::i;:::-;2602:63;;2557:118;2358:324;;;;;:::o;2688:552::-;;;;2830:2;2818:9;2809:7;2805:23;2801:32;2798:2;;;2846:1;2843;2836:12;2798:2;2889:1;2914:53;2959:7;2950:6;2939:9;2935:22;2914:53;:::i;:::-;2904:63;;2860:117;3016:2;3042:53;3087:7;3078:6;3067:9;3063:22;3042:53;:::i;:::-;3032:63;;2987:118;3144:2;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3115:118;2788:452;;;;;:::o;3246:809::-;;;;;3414:3;3402:9;3393:7;3389:23;3385:33;3382:2;;;3431:1;3428;3421:12;3382:2;3474:1;3499:53;3544:7;3535:6;3524:9;3520:22;3499:53;:::i;:::-;3489:63;;3445:117;3601:2;3627:53;3672:7;3663:6;3652:9;3648:22;3627:53;:::i;:::-;3617:63;;3572:118;3729:2;3755:53;3800:7;3791:6;3780:9;3776:22;3755:53;:::i;:::-;3745:63;;3700:118;3885:2;3874:9;3870:18;3857:32;3916:18;3908:6;3905:30;3902:2;;;3948:1;3945;3938:12;3902:2;3976:62;4030:7;4021:6;4010:9;4006:22;3976:62;:::i;:::-;3966:72;;3828:220;3372:683;;;;;;;:::o;4061:401::-;;;4183:2;4171:9;4162:7;4158:23;4154:32;4151:2;;;4199:1;4196;4189:12;4151:2;4242:1;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4213:117;4369:2;4395:50;4437:7;4428:6;4417:9;4413:22;4395:50;:::i;:::-;4385:60;;4340:115;4141:321;;;;;:::o;4468:407::-;;;4593:2;4581:9;4572:7;4568:23;4564:32;4561:2;;;4609:1;4606;4599:12;4561:2;4652:1;4677:53;4722:7;4713:6;4702:9;4698:22;4677:53;:::i;:::-;4667:63;;4623:117;4779:2;4805:53;4850:7;4841:6;4830:9;4826:22;4805:53;:::i;:::-;4795:63;;4750:118;4551:324;;;;;:::o;4881:256::-;;4986:2;4974:9;4965:7;4961:23;4957:32;4954:2;;;5002:1;4999;4992:12;4954:2;5045:1;5070:50;5112:7;5103:6;5092:9;5088:22;5070:50;:::i;:::-;5060:60;;5016:114;4944:193;;;;:::o;5143:260::-;;5250:2;5238:9;5229:7;5225:23;5221:32;5218:2;;;5266:1;5263;5256:12;5218:2;5309:1;5334:52;5378:7;5369:6;5358:9;5354:22;5334:52;:::i;:::-;5324:62;;5280:116;5208:195;;;;:::o;5409:282::-;;5527:2;5515:9;5506:7;5502:23;5498:32;5495:2;;;5543:1;5540;5533:12;5495:2;5586:1;5611:63;5666:7;5657:6;5646:9;5642:22;5611:63;:::i;:::-;5601:73;;5557:127;5485:206;;;;:::o;5697:375::-;;5815:2;5803:9;5794:7;5790:23;5786:32;5783:2;;;5831:1;5828;5821:12;5783:2;5902:1;5891:9;5887:17;5874:31;5932:18;5924:6;5921:30;5918:2;;;5964:1;5961;5954:12;5918:2;5992:63;6047:7;6038:6;6027:9;6023:22;5992:63;:::i;:::-;5982:73;;5845:220;5773:299;;;;:::o;6078:262::-;;6186:2;6174:9;6165:7;6161:23;6157:32;6154:2;;;6202:1;6199;6192:12;6154:2;6245:1;6270:53;6315:7;6306:6;6295:9;6291:22;6270:53;:::i;:::-;6260:63;;6216:117;6144:196;;;;:::o;6346:838::-;;;;;;6519:3;6507:9;6498:7;6494:23;6490:33;6487:2;;;6536:1;6533;6526:12;6487:2;6579:1;6604:53;6649:7;6640:6;6629:9;6625:22;6604:53;:::i;:::-;6594:63;;6550:117;6706:2;6732:50;6774:7;6765:6;6754:9;6750:22;6732:50;:::i;:::-;6722:60;;6677:115;6831:2;6857:53;6902:7;6893:6;6882:9;6878:22;6857:53;:::i;:::-;6847:63;;6802:118;6959:2;6985:53;7030:7;7021:6;7010:9;7006:22;6985:53;:::i;:::-;6975:63;;6930:118;7087:3;7114:53;7159:7;7150:6;7139:9;7135:22;7114:53;:::i;:::-;7104:63;;7058:119;6477:707;;;;;;;;:::o;7190:179::-;;7280:46;7322:3;7314:6;7280:46;:::i;:::-;7358:4;7353:3;7349:14;7335:28;;7270:99;;;;:::o;7375:118::-;7462:24;7480:5;7462:24;:::i;:::-;7457:3;7450:37;7440:53;;:::o;7499:157::-;7604:45;7624:24;7642:5;7624:24;:::i;:::-;7604:45;:::i;:::-;7599:3;7592:58;7582:74;;:::o;7692:732::-;;7840:54;7888:5;7840:54;:::i;:::-;7910:86;7989:6;7984:3;7910:86;:::i;:::-;7903:93;;8020:56;8070:5;8020:56;:::i;:::-;8099:7;8130:1;8115:284;8140:6;8137:1;8134:13;8115:284;;;8216:6;8210:13;8243:63;8302:3;8287:13;8243:63;:::i;:::-;8236:70;;8329:60;8382:6;8329:60;:::i;:::-;8319:70;;8175:224;8162:1;8159;8155:9;8150:14;;8115:284;;;8119:14;8415:3;8408:10;;7816:608;;;;;;;:::o;8430:109::-;8511:21;8526:5;8511:21;:::i;:::-;8506:3;8499:34;8489:50;;:::o;8545:360::-;;8659:38;8691:5;8659:38;:::i;:::-;8713:70;8776:6;8771:3;8713:70;:::i;:::-;8706:77;;8792:52;8837:6;8832:3;8825:4;8818:5;8814:16;8792:52;:::i;:::-;8869:29;8891:6;8869:29;:::i;:::-;8864:3;8860:39;8853:46;;8635:270;;;;;:::o;8911:364::-;;9027:39;9060:5;9027:39;:::i;:::-;9082:71;9146:6;9141:3;9082:71;:::i;:::-;9075:78;;9162:52;9207:6;9202:3;9195:4;9188:5;9184:16;9162:52;:::i;:::-;9239:29;9261:6;9239:29;:::i;:::-;9234:3;9230:39;9223:46;;9003:272;;;;;:::o;9281:377::-;;9415:39;9448:5;9415:39;:::i;:::-;9470:89;9552:6;9547:3;9470:89;:::i;:::-;9463:96;;9568:52;9613:6;9608:3;9601:4;9594:5;9590:16;9568:52;:::i;:::-;9645:6;9640:3;9636:16;9629:23;;9391:267;;;;;:::o;9664:375::-;;9827:67;9891:2;9886:3;9827:67;:::i;:::-;9820:74;;9924:34;9920:1;9915:3;9911:11;9904:55;9990:13;9985:2;9980:3;9976:12;9969:35;10030:2;10025:3;10021:12;10014:19;;9810:229;;;:::o;10045:382::-;;10208:67;10272:2;10267:3;10208:67;:::i;:::-;10201:74;;10305:34;10301:1;10296:3;10292:11;10285:55;10371:20;10366:2;10361:3;10357:12;10350:42;10418:2;10413:3;10409:12;10402:19;;10191:236;;;:::o;10433:370::-;;10596:67;10660:2;10655:3;10596:67;:::i;:::-;10589:74;;10693:34;10689:1;10684:3;10680:11;10673:55;10759:8;10754:2;10749:3;10745:12;10738:30;10794:2;10789:3;10785:12;10778:19;;10579:224;;;:::o;10809:326::-;;10972:67;11036:2;11031:3;10972:67;:::i;:::-;10965:74;;11069:30;11065:1;11060:3;11056:11;11049:51;11126:2;11121:3;11117:12;11110:19;;10955:180;;;:::o;11141:308::-;;11304:67;11368:2;11363:3;11304:67;:::i;:::-;11297:74;;11401:12;11397:1;11392:3;11388:11;11381:33;11440:2;11435:3;11431:12;11424:19;;11287:162;;;:::o;11455:368::-;;11618:67;11682:2;11677:3;11618:67;:::i;:::-;11611:74;;11715:34;11711:1;11706:3;11702:11;11695:55;11781:6;11776:2;11771:3;11767:12;11760:28;11814:2;11809:3;11805:12;11798:19;;11601:222;;;:::o;11829:323::-;;11992:67;12056:2;12051:3;11992:67;:::i;:::-;11985:74;;12089:27;12085:1;12080:3;12076:11;12069:48;12143:2;12138:3;12134:12;12127:19;;11975:177;;;:::o;12158:325::-;;12321:67;12385:2;12380:3;12321:67;:::i;:::-;12314:74;;12418:29;12414:1;12409:3;12405:11;12398:50;12474:2;12469:3;12465:12;12458:19;;12304:179;;;:::o;12489:306::-;;12652:66;12716:1;12711:3;12652:66;:::i;:::-;12645:73;;12748:11;12744:1;12739:3;12735:11;12728:32;12786:2;12781:3;12777:12;12770:19;;12635:160;;;:::o;12801:376::-;;12964:67;13028:2;13023:3;12964:67;:::i;:::-;12957:74;;13061:34;13057:1;13052:3;13048:11;13041:55;13127:14;13122:2;13117:3;13113:12;13106:36;13168:2;13163:3;13159:12;13152:19;;12947:230;;;:::o;13183:366::-;;13346:67;13410:2;13405:3;13346:67;:::i;:::-;13339:74;;13443:34;13439:1;13434:3;13430:11;13423:55;13509:4;13504:2;13499:3;13495:12;13488:26;13540:2;13535:3;13531:12;13524:19;;13329:220;;;:::o;13555:388::-;;13718:67;13782:2;13777:3;13718:67;:::i;:::-;13711:74;;13815:34;13811:1;13806:3;13802:11;13795:55;13881:26;13876:2;13871:3;13867:12;13860:48;13934:2;13929:3;13925:12;13918:19;;13701:242;;;:::o;13949:374::-;;14112:67;14176:2;14171:3;14112:67;:::i;:::-;14105:74;;14209:34;14205:1;14200:3;14196:11;14189:55;14275:12;14270:2;14265:3;14261:12;14254:34;14314:2;14309:3;14305:12;14298:19;;14095:228;;;:::o;14329:373::-;;14492:67;14556:2;14551:3;14492:67;:::i;:::-;14485:74;;14589:34;14585:1;14580:3;14576:11;14569:55;14655:11;14650:2;14645:3;14641:12;14634:33;14693:2;14688:3;14684:12;14677:19;;14475:227;;;:::o;14708:327::-;;14871:67;14935:2;14930:3;14871:67;:::i;:::-;14864:74;;14968:31;14964:1;14959:3;14955:11;14948:52;15026:2;15021:3;15017:12;15010:19;;14854:181;;;:::o;15041:330::-;;15204:67;15268:2;15263:3;15204:67;:::i;:::-;15197:74;;15301:34;15297:1;15292:3;15288:11;15281:55;15362:2;15357:3;15353:12;15346:19;;15187:184;;;:::o;15377:305::-;;15540:66;15604:1;15599:3;15540:66;:::i;:::-;15533:73;;15636:10;15632:1;15627:3;15623:11;15616:31;15673:2;15668:3;15664:12;15657:19;;15523:159;;;:::o;15688:376::-;;15851:67;15915:2;15910:3;15851:67;:::i;:::-;15844:74;;15948:34;15944:1;15939:3;15935:11;15928:55;16014:14;16009:2;16004:3;16000:12;15993:36;16055:2;16050:3;16046:12;16039:19;;15834:230;;;:::o;16070:326::-;;16233:67;16297:2;16292:3;16233:67;:::i;:::-;16226:74;;16330:30;16326:1;16321:3;16317:11;16310:51;16387:2;16382:3;16378:12;16371:19;;16216:180;;;:::o;16402:330::-;;16565:67;16629:2;16624:3;16565:67;:::i;:::-;16558:74;;16662:34;16658:1;16653:3;16649:11;16642:55;16723:2;16718:3;16714:12;16707:19;;16548:184;;;:::o;16738:315::-;;16901:67;16965:2;16960:3;16901:67;:::i;:::-;16894:74;;16998:19;16994:1;16989:3;16985:11;16978:40;17044:2;17039:3;17035:12;17028:19;;16884:169;;;:::o;17059:373::-;;17222:67;17286:2;17281:3;17222:67;:::i;:::-;17215:74;;17319:34;17315:1;17310:3;17306:11;17299:55;17385:11;17380:2;17375:3;17371:12;17364:33;17423:2;17418:3;17414:12;17407:19;;17205:227;;;:::o;17438:379::-;;17601:67;17665:2;17660:3;17601:67;:::i;:::-;17594:74;;17698:34;17694:1;17689:3;17685:11;17678:55;17764:17;17759:2;17754:3;17750:12;17743:39;17808:2;17803:3;17799:12;17792:19;;17584:233;;;:::o;17823:315::-;;17986:67;18050:2;18045:3;17986:67;:::i;:::-;17979:74;;18083:19;18079:1;18074:3;18070:11;18063:40;18129:2;18124:3;18120:12;18113:19;;17969:169;;;:::o;18144:365::-;;18307:67;18371:2;18366:3;18307:67;:::i;:::-;18300:74;;18404:34;18400:1;18395:3;18391:11;18384:55;18470:3;18465:2;18460:3;18456:12;18449:25;18500:2;18495:3;18491:12;18484:19;;18290:219;;;:::o;18515:318::-;;18678:67;18742:2;18737:3;18678:67;:::i;:::-;18671:74;;18775:22;18771:1;18766:3;18762:11;18755:43;18824:2;18819:3;18815:12;18808:19;;18661:172;;;:::o;18839:381::-;;19002:67;19066:2;19061:3;19002:67;:::i;:::-;18995:74;;19099:34;19095:1;19090:3;19086:11;19079:55;19165:19;19160:2;19155:3;19151:12;19144:41;19211:2;19206:3;19202:12;19195:19;;18985:235;;;:::o;19226:376::-;;19389:67;19453:2;19448:3;19389:67;:::i;:::-;19382:74;;19486:34;19482:1;19477:3;19473:11;19466:55;19552:14;19547:2;19542:3;19538:12;19531:36;19593:2;19588:3;19584:12;19577:19;;19372:230;;;:::o;19608:367::-;;19771:67;19835:2;19830:3;19771:67;:::i;:::-;19764:74;;19868:34;19864:1;19859:3;19855:11;19848:55;19934:5;19929:2;19924:3;19920:12;19913:27;19966:2;19961:3;19957:12;19950:19;;19754:221;;;:::o;19981:108::-;20058:24;20076:5;20058:24;:::i;:::-;20053:3;20046:37;20036:53;;:::o;20095:118::-;20182:24;20200:5;20182:24;:::i;:::-;20177:3;20170:37;20160:53;;:::o;20219:157::-;20324:45;20344:24;20362:5;20344:24;:::i;:::-;20324:45;:::i;:::-;20319:3;20312:58;20302:74;;:::o;20382:435::-;;20584:95;20675:3;20666:6;20584:95;:::i;:::-;20577:102;;20696:95;20787:3;20778:6;20696:95;:::i;:::-;20689:102;;20808:3;20801:10;;20566:251;;;;;:::o;20823:679::-;;21034:75;21105:3;21096:6;21034:75;:::i;:::-;21134:2;21129:3;21125:12;21118:19;;21147:75;21218:3;21209:6;21147:75;:::i;:::-;21247:2;21242:3;21238:12;21231:19;;21260:75;21331:3;21322:6;21260:75;:::i;:::-;21360:2;21355:3;21351:12;21344:19;;21373:75;21444:3;21435:6;21373:75;:::i;:::-;21473:2;21468:3;21464:12;21457:19;;21493:3;21486:10;;21023:479;;;;;;;:::o;21508:222::-;;21639:2;21628:9;21624:18;21616:26;;21652:71;21720:1;21709:9;21705:17;21696:6;21652:71;:::i;:::-;21606:124;;;;:::o;21736:640::-;;21969:3;21958:9;21954:19;21946:27;;21983:71;22051:1;22040:9;22036:17;22027:6;21983:71;:::i;:::-;22064:72;22132:2;22121:9;22117:18;22108:6;22064:72;:::i;:::-;22146;22214:2;22203:9;22199:18;22190:6;22146:72;:::i;:::-;22265:9;22259:4;22255:20;22250:2;22239:9;22235:18;22228:48;22293:76;22364:4;22355:6;22293:76;:::i;:::-;22285:84;;21936:440;;;;;;;:::o;22382:373::-;;22563:2;22552:9;22548:18;22540:26;;22612:9;22606:4;22602:20;22598:1;22587:9;22583:17;22576:47;22640:108;22743:4;22734:6;22640:108;:::i;:::-;22632:116;;22530:225;;;;:::o;22761:210::-;;22886:2;22875:9;22871:18;22863:26;;22899:65;22961:1;22950:9;22946:17;22937:6;22899:65;:::i;:::-;22853:118;;;;:::o;22977:541::-;;23186:3;23175:9;23171:19;23163:27;;23200:65;23262:1;23251:9;23247:17;23238:6;23200:65;:::i;:::-;23275:72;23343:2;23332:9;23328:18;23319:6;23275:72;:::i;:::-;23357;23425:2;23414:9;23410:18;23401:6;23357:72;:::i;:::-;23439;23507:2;23496:9;23492:18;23483:6;23439:72;:::i;:::-;23153:365;;;;;;;:::o;23524:313::-;;23675:2;23664:9;23660:18;23652:26;;23724:9;23718:4;23714:20;23710:1;23699:9;23695:17;23688:47;23752:78;23825:4;23816:6;23752:78;:::i;:::-;23744:86;;23642:195;;;;:::o;23843:419::-;;24047:2;24036:9;24032:18;24024:26;;24096:9;24090:4;24086:20;24082:1;24071:9;24067:17;24060:47;24124:131;24250:4;24124:131;:::i;:::-;24116:139;;24014:248;;;:::o;24268:419::-;;24472:2;24461:9;24457:18;24449:26;;24521:9;24515:4;24511:20;24507:1;24496:9;24492:17;24485:47;24549:131;24675:4;24549:131;:::i;:::-;24541:139;;24439:248;;;:::o;24693:419::-;;24897:2;24886:9;24882:18;24874:26;;24946:9;24940:4;24936:20;24932:1;24921:9;24917:17;24910:47;24974:131;25100:4;24974:131;:::i;:::-;24966:139;;24864:248;;;:::o;25118:419::-;;25322:2;25311:9;25307:18;25299:26;;25371:9;25365:4;25361:20;25357:1;25346:9;25342:17;25335:47;25399:131;25525:4;25399:131;:::i;:::-;25391:139;;25289:248;;;:::o;25543:419::-;;25747:2;25736:9;25732:18;25724:26;;25796:9;25790:4;25786:20;25782:1;25771:9;25767:17;25760:47;25824:131;25950:4;25824:131;:::i;:::-;25816:139;;25714:248;;;:::o;25968:419::-;;26172:2;26161:9;26157:18;26149:26;;26221:9;26215:4;26211:20;26207:1;26196:9;26192:17;26185:47;26249:131;26375:4;26249:131;:::i;:::-;26241:139;;26139:248;;;:::o;26393:419::-;;26597:2;26586:9;26582:18;26574:26;;26646:9;26640:4;26636:20;26632:1;26621:9;26617:17;26610:47;26674:131;26800:4;26674:131;:::i;:::-;26666:139;;26564:248;;;:::o;26818:419::-;;27022:2;27011:9;27007:18;26999:26;;27071:9;27065:4;27061:20;27057:1;27046:9;27042:17;27035:47;27099:131;27225:4;27099:131;:::i;:::-;27091:139;;26989:248;;;:::o;27243:419::-;;27447:2;27436:9;27432:18;27424:26;;27496:9;27490:4;27486:20;27482:1;27471:9;27467:17;27460:47;27524:131;27650:4;27524:131;:::i;:::-;27516:139;;27414:248;;;:::o;27668:419::-;;27872:2;27861:9;27857:18;27849:26;;27921:9;27915:4;27911:20;27907:1;27896:9;27892:17;27885:47;27949:131;28075:4;27949:131;:::i;:::-;27941:139;;27839:248;;;:::o;28093:419::-;;28297:2;28286:9;28282:18;28274:26;;28346:9;28340:4;28336:20;28332:1;28321:9;28317:17;28310:47;28374:131;28500:4;28374:131;:::i;:::-;28366:139;;28264:248;;;:::o;28518:419::-;;28722:2;28711:9;28707:18;28699:26;;28771:9;28765:4;28761:20;28757:1;28746:9;28742:17;28735:47;28799:131;28925:4;28799:131;:::i;:::-;28791:139;;28689:248;;;:::o;28943:419::-;;29147:2;29136:9;29132:18;29124:26;;29196:9;29190:4;29186:20;29182:1;29171:9;29167:17;29160:47;29224:131;29350:4;29224:131;:::i;:::-;29216:139;;29114:248;;;:::o;29368:419::-;;29572:2;29561:9;29557:18;29549:26;;29621:9;29615:4;29611:20;29607:1;29596:9;29592:17;29585:47;29649:131;29775:4;29649:131;:::i;:::-;29641:139;;29539:248;;;:::o;29793:419::-;;29997:2;29986:9;29982:18;29974:26;;30046:9;30040:4;30036:20;30032:1;30021:9;30017:17;30010:47;30074:131;30200:4;30074:131;:::i;:::-;30066:139;;29964:248;;;:::o;30218:419::-;;30422:2;30411:9;30407:18;30399:26;;30471:9;30465:4;30461:20;30457:1;30446:9;30442:17;30435:47;30499:131;30625:4;30499:131;:::i;:::-;30491:139;;30389:248;;;:::o;30643:419::-;;30847:2;30836:9;30832:18;30824:26;;30896:9;30890:4;30886:20;30882:1;30871:9;30867:17;30860:47;30924:131;31050:4;30924:131;:::i;:::-;30916:139;;30814:248;;;:::o;31068:419::-;;31272:2;31261:9;31257:18;31249:26;;31321:9;31315:4;31311:20;31307:1;31296:9;31292:17;31285:47;31349:131;31475:4;31349:131;:::i;:::-;31341:139;;31239:248;;;:::o;31493:419::-;;31697:2;31686:9;31682:18;31674:26;;31746:9;31740:4;31736:20;31732:1;31721:9;31717:17;31710:47;31774:131;31900:4;31774:131;:::i;:::-;31766:139;;31664:248;;;:::o;31918:419::-;;32122:2;32111:9;32107:18;32099:26;;32171:9;32165:4;32161:20;32157:1;32146:9;32142:17;32135:47;32199:131;32325:4;32199:131;:::i;:::-;32191:139;;32089:248;;;:::o;32343:419::-;;32547:2;32536:9;32532:18;32524:26;;32596:9;32590:4;32586:20;32582:1;32571:9;32567:17;32560:47;32624:131;32750:4;32624:131;:::i;:::-;32616:139;;32514:248;;;:::o;32768:419::-;;32972:2;32961:9;32957:18;32949:26;;33021:9;33015:4;33011:20;33007:1;32996:9;32992:17;32985:47;33049:131;33175:4;33049:131;:::i;:::-;33041:139;;32939:248;;;:::o;33193:419::-;;33397:2;33386:9;33382:18;33374:26;;33446:9;33440:4;33436:20;33432:1;33421:9;33417:17;33410:47;33474:131;33600:4;33474:131;:::i;:::-;33466:139;;33364:248;;;:::o;33618:419::-;;33822:2;33811:9;33807:18;33799:26;;33871:9;33865:4;33861:20;33857:1;33846:9;33842:17;33835:47;33899:131;34025:4;33899:131;:::i;:::-;33891:139;;33789:248;;;:::o;34043:419::-;;34247:2;34236:9;34232:18;34224:26;;34296:9;34290:4;34286:20;34282:1;34271:9;34267:17;34260:47;34324:131;34450:4;34324:131;:::i;:::-;34316:139;;34214:248;;;:::o;34468:419::-;;34672:2;34661:9;34657:18;34649:26;;34721:9;34715:4;34711:20;34707:1;34696:9;34692:17;34685:47;34749:131;34875:4;34749:131;:::i;:::-;34741:139;;34639:248;;;:::o;34893:419::-;;35097:2;35086:9;35082:18;35074:26;;35146:9;35140:4;35136:20;35132:1;35121:9;35117:17;35110:47;35174:131;35300:4;35174:131;:::i;:::-;35166:139;;35064:248;;;:::o;35318:419::-;;35522:2;35511:9;35507:18;35499:26;;35571:9;35565:4;35561:20;35557:1;35546:9;35542:17;35535:47;35599:131;35725:4;35599:131;:::i;:::-;35591:139;;35489:248;;;:::o;35743:419::-;;35947:2;35936:9;35932:18;35924:26;;35996:9;35990:4;35986:20;35982:1;35971:9;35967:17;35960:47;36024:131;36150:4;36024:131;:::i;:::-;36016:139;;35914:248;;;:::o;36168:222::-;;36299:2;36288:9;36284:18;36276:26;;36312:71;36380:1;36369:9;36365:17;36356:6;36312:71;:::i;:::-;36266:124;;;;:::o;36396:283::-;;36462:2;36456:9;36446:19;;36504:4;36496:6;36492:17;36611:6;36599:10;36596:22;36575:18;36563:10;36560:34;36557:62;36554:2;;;36622:18;;:::i;:::-;36554:2;36662:10;36658:2;36651:22;36436:243;;;;:::o;36685:331::-;;36836:18;36828:6;36825:30;36822:2;;;36858:18;;:::i;:::-;36822:2;36943:4;36939:9;36932:4;36924:6;36920:17;36916:33;36908:41;;37004:4;36998;36994:15;36986:23;;36751:265;;;:::o;37022:332::-;;37174:18;37166:6;37163:30;37160:2;;;37196:18;;:::i;:::-;37160:2;37281:4;37277:9;37270:4;37262:6;37258:17;37254:33;37246:41;;37342:4;37336;37332:15;37324:23;;37089:265;;;:::o;37360:132::-;;37450:3;37442:11;;37480:4;37475:3;37471:14;37463:22;;37432:60;;;:::o;37498:114::-;;37599:5;37593:12;37583:22;;37572:40;;;:::o;37618:98::-;;37703:5;37697:12;37687:22;;37676:40;;;:::o;37722:99::-;;37808:5;37802:12;37792:22;;37781:40;;;:::o;37827:113::-;;37929:4;37924:3;37920:14;37912:22;;37902:38;;;:::o;37946:184::-;;38079:6;38074:3;38067:19;38119:4;38114:3;38110:14;38095:29;;38057:73;;;;:::o;38136:168::-;;38253:6;38248:3;38241:19;38293:4;38288:3;38284:14;38269:29;;38231:73;;;;:::o;38310:169::-;;38428:6;38423:3;38416:19;38468:4;38463:3;38459:14;38444:29;;38406:73;;;;:::o;38485:148::-;;38624:3;38609:18;;38599:34;;;;:::o;38639:305::-;;38698:20;38716:1;38698:20;:::i;:::-;38693:25;;38732:20;38750:1;38732:20;:::i;:::-;38727:25;;38886:1;38818:66;38814:74;38811:1;38808:81;38805:2;;;38892:18;;:::i;:::-;38805:2;38936:1;38933;38929:9;38922:16;;38683:261;;;;:::o;38950:185::-;;39007:20;39025:1;39007:20;:::i;:::-;39002:25;;39041:20;39059:1;39041:20;:::i;:::-;39036:25;;39080:1;39070:2;;39085:18;;:::i;:::-;39070:2;39127:1;39124;39120:9;39115:14;;38992:143;;;;:::o;39141:348::-;;39204:20;39222:1;39204:20;:::i;:::-;39199:25;;39238:20;39256:1;39238:20;:::i;:::-;39233:25;;39426:1;39358:66;39354:74;39351:1;39348:81;39343:1;39336:9;39329:17;39325:105;39322:2;;;39433:18;;:::i;:::-;39322:2;39481:1;39478;39474:9;39463:20;;39189:300;;;;:::o;39495:191::-;;39555:20;39573:1;39555:20;:::i;:::-;39550:25;;39589:20;39607:1;39589:20;:::i;:::-;39584:25;;39628:1;39625;39622:8;39619:2;;;39633:18;;:::i;:::-;39619:2;39678:1;39675;39671:9;39663:17;;39540:146;;;;:::o;39692:96::-;;39758:24;39776:5;39758:24;:::i;:::-;39747:35;;39737:51;;;:::o;39794:90::-;;39871:5;39864:13;39857:21;39846:32;;39836:48;;;:::o;39890:149::-;;39966:66;39959:5;39955:78;39944:89;;39934:105;;;:::o;40045:126::-;;40122:42;40115:5;40111:54;40100:65;;40090:81;;;:::o;40177:77::-;;40243:5;40232:16;;40222:32;;;:::o;40260:154::-;40344:6;40339:3;40334;40321:30;40406:1;40397:6;40392:3;40388:16;40381:27;40311:103;;;:::o;40420:307::-;40488:1;40498:113;40512:6;40509:1;40506:13;40498:113;;;40597:1;40592:3;40588:11;40582:18;40578:1;40573:3;40569:11;40562:39;40534:2;40531:1;40527:10;40522:15;;40498:113;;;40629:6;40626:1;40623:13;40620:2;;;40709:1;40700:6;40695:3;40691:16;40684:27;40620:2;40469:258;;;;:::o;40733:320::-;;40814:1;40808:4;40804:12;40794:22;;40861:1;40855:4;40851:12;40882:18;40872:2;;40938:4;40930:6;40926:17;40916:27;;40872:2;41000;40992:6;40989:14;40969:18;40966:38;40963:2;;;41019:18;;:::i;:::-;40963:2;40784:269;;;;:::o;41059:233::-;;41121:24;41139:5;41121:24;:::i;:::-;41112:33;;41167:66;41160:5;41157:77;41154:2;;;41237:18;;:::i;:::-;41154:2;41284:1;41277:5;41273:13;41266:20;;41102:190;;;:::o;41298:100::-;;41366:26;41386:5;41366:26;:::i;:::-;41355:37;;41345:53;;;:::o;41404:94::-;;41472:20;41486:5;41472:20;:::i;:::-;41461:31;;41451:47;;;:::o;41504:79::-;;41572:5;41561:16;;41551:32;;;:::o;41589:176::-;;41638:20;41656:1;41638:20;:::i;:::-;41633:25;;41672:20;41690:1;41672:20;:::i;:::-;41667:25;;41711:1;41701:2;;41716:18;;:::i;:::-;41701:2;41757:1;41754;41750:9;41745:14;;41623:142;;;;:::o;41771:180::-;41819:77;41816:1;41809:88;41916:4;41913:1;41906:15;41940:4;41937:1;41930:15;41957:180;42005:77;42002:1;41995:88;42102:4;42099:1;42092:15;42126:4;42123:1;42116:15;42143:180;42191:77;42188:1;42181:88;42288:4;42285:1;42278:15;42312:4;42309:1;42302:15;42329:180;42377:77;42374:1;42367:88;42474:4;42471:1;42464:15;42498:4;42495:1;42488:15;42515:102;;42607:2;42603:7;42598:2;42591:5;42587:14;42583:28;42573:38;;42563:54;;;:::o;42623:94::-;;42704:5;42700:2;42696:14;42675:35;;42665:52;;;:::o;42723:122::-;42796:24;42814:5;42796:24;:::i;:::-;42789:5;42786:35;42776:2;;42835:1;42832;42825:12;42776:2;42766:79;:::o;42851:116::-;42921:21;42936:5;42921:21;:::i;:::-;42914:5;42911:32;42901:2;;42957:1;42954;42947:12;42901:2;42891:76;:::o;42973:120::-;43045:23;43062:5;43045:23;:::i;:::-;43038:5;43035:34;43025:2;;43083:1;43080;43073:12;43025:2;43015:78;:::o;43099:122::-;43172:24;43190:5;43172:24;:::i;:::-;43165:5;43162:35;43152:2;;43211:1;43208;43201:12;43152:2;43142:79;:::o

Swarm Source

ipfs://16a85d5dd736db25c7d85c5f649470c68bfe30f03c06364cd87fb69c36088dcf
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.