ETH Price: $3,482.78 (+2.19%)
Gas: 6 Gwei

Token

Catshit Crazy NFT (CSC)
 

Overview

Max Total Supply

10,069 CSC

Holders

2,506

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 CSC
0xd80775766186ef44c73422fdf97d92701c27f70e
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

These cats have different feels, fur color and many other attributes that make up its variations.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
CatshitCrazyNFT

Compiler Version
v0.8.3+commit.8d00100c

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-08-26
*/

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/access/Ownable.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;
    }
}


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/token/ERC721/extensions/ERC721URIStorage.sol

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

pragma solidity ^0.8.0;


// 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/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/Context.sol

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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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


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

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/IERC721.sol

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

pragma solidity ^0.8.0;



// 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(to).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 {}
}


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

pragma solidity ^0.8.0;


/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

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

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @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 override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

pragma solidity 0.8.3;

interface IFrens {
    function balanceOf(address owner) external view returns (uint256 balance);
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);
}


pragma solidity 0.8.3;

contract CatshitCrazyNFT is ERC721, ERC721Enumerable,ERC721URIStorage, Ownable {
   using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;
    
    uint16 public constant maxSupply = 10069;
    string private _baseTokenURI;
    
    uint256 public _freemintStartDate = 1630008000;
    uint256 public _freemintStopDate = 1630051200;
    
    uint256 public _mintForAllStartDate = 1630080000;
    
    address private _frensAddress;
    
    mapping(uint256 => bool) private _freeMinted;

    constructor() ERC721("Catshit Crazy NFT", "CSC") {
    }
    
    function setMintForAllStartDate(uint256 startDate) public onlyOwner {
        _mintForAllStartDate = startDate;
    }
    
    function setFreemintStartDate(uint256 startDate) public onlyOwner {
        _freemintStartDate = startDate;
    }
    
    function setFreemintStopDate(uint256 stopDate) public onlyOwner {
        _freemintStopDate = stopDate;
    }
    
    function setFrensAddress(address frensAddress) public onlyOwner {
        _frensAddress = frensAddress;
    }
    
    function getFreeMintableCount(address userAddress) public view returns(uint256) {
        uint256 _frensMinted = IFrens(_frensAddress).balanceOf(userAddress);
        uint8 _freeMints;
        
        for(uint8 i = 0;i<_frensMinted;i++) {
            uint256 _tokenIndex = IFrens(_frensAddress).tokenOfOwnerByIndex(userAddress, i);
            if(!_freeMinted[_tokenIndex]) {
                _freeMints = _freeMints + 1;
            }
        }
        
        return _freeMints;
    }
    
    function getFirstAvailableFreeMintableFren() private view returns(uint256) {
        uint256 _frensMinted = IFrens(_frensAddress).balanceOf(msg.sender);
        
        for(uint8 i = 0;i<_frensMinted;i++) {
            uint256 _tokenIndex = IFrens(_frensAddress).tokenOfOwnerByIndex(msg.sender, i);
            if(!_freeMinted[_tokenIndex]) {
                return _tokenIndex;
            }
        }
        
        return 0;
    }


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

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


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

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

    // Get minting limit (for a single transaction) based on current token supply
    function getCurrentMintLimit() public pure returns (uint8) {
        return 20;
    }

    // Get ether price based on current token supply
    function getCurrentPrice() public pure returns (uint64) {
        return 42_000_000_000_000_000;
    }
    
    function mintForPreOwners(uint8 _quantityToMint) public{
        require(_quantityToMint >= 1, "Must mint at least 1");
        require(
            _quantityToMint <= getCurrentMintLimit(),
            "Maximum current buy limit for individual transaction exceeded"
        );
        require(
            (_quantityToMint + totalSupply()) <= maxSupply,
            "Exceeds maximum supply"
        );
        
        require(_freemintStartDate <= block.timestamp, "Free mint is not open yet");
        require(block.timestamp <= _freemintStopDate, "Free mint has finished.");
        
        require(getFreeMintableCount(msg.sender) >= _quantityToMint, "Not enough frens.");
        

        for (uint8 i = 0; i < _quantityToMint; i++) {
            _freeMinted[getFirstAvailableFreeMintableFren()] = true;
            _tokenIds.increment();
            

            uint256 newItemId = _tokenIds.current();
            _mint(msg.sender, newItemId);
        }
    }

    // Mint new token(s)
    function mint(uint8 _quantityToMint) public payable {
        require(_mintForAllStartDate <= block.timestamp, "Sale is not open");
        require(_quantityToMint >= 1, "Must mint at least 1");
        require(
            _quantityToMint <= getCurrentMintLimit(),
            "Maximum current buy limit for individual transaction exceeded"
        );
        require((_quantityToMint + balanceOf(msg.sender)) <= 69, "Max mint per account is 69");
        require(
            (_quantityToMint + totalSupply()) <= maxSupply,
            "Exceeds maximum supply"
        );
        require(
            msg.value == (getCurrentPrice() * _quantityToMint),
            "Ether submitted does not match current price"
        );

        for (uint8 i = 0; i < _quantityToMint; i++) {
            _tokenIds.increment();

            uint256 newItemId = _tokenIds.current();
            _mint(msg.sender, newItemId);
        }
    }
    
    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }

    // Withdraw ether from contract
    function withdraw() public onlyOwner {
        require(address(this).balance > 0, "Balance must be positive");
        (bool success, ) = msg.sender.call{value: address(this).balance}("");
        require(success == true, "Failed to withdraw ether");
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":"_freemintStartDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_freemintStopDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_mintForAllStartDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","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":[],"name":"getCurrentMintLimit","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getCurrentPrice","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"}],"name":"getFreeMintableCount","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":"maxSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_quantityToMint","type":"uint8"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_quantityToMint","type":"uint8"}],"name":"mintForPreOwners","outputs":[],"stateMutability":"nonpayable","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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newbaseTokenURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"startDate","type":"uint256"}],"name":"setFreemintStartDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"stopDate","type":"uint256"}],"name":"setFreemintStopDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"frensAddress","type":"address"}],"name":"setFrensAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"startDate","type":"uint256"}],"name":"setMintForAllStartDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052636127f2c0600e556361289b80600f556361290c006010553480156200002957600080fd5b506040518060400160405280601181526020017f43617473686974204372617a79204e46540000000000000000000000000000008152506040518060400160405280600381526020017f43534300000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000ae929190620001be565b508060019080519060200190620000c7929190620001be565b505050620000ea620000de620000f060201b60201c565b620000f860201b60201c565b620002d3565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001cc906200026e565b90600052602060002090601f016020900481019282620001f057600085556200023c565b82601f106200020b57805160ff19168380011785556200023c565b828001600101855582156200023c579182015b828111156200023b5782518255916020019190600101906200021e565b5b5090506200024b91906200024f565b5090565b5b808211156200026a57600081600090555060010162000250565b5090565b600060028204905060018216806200028757607f821691505b602082108114156200029e576200029d620002a4565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614eae80620002e36000396000f3fe6080604052600436106101f95760003560e01c806369ba814d1161010d578063a22cb465116100a0578063d5abeb011161006f578063d5abeb0114610720578063d65fcdd31461074b578063e985e9c514610776578063eb91d37e146107b3578063f2fde38b146107de576101f9565b8063a22cb46514610666578063b88d4fde1461068f578063c87b56dd146106b8578063d5507fd2146106f5576101f9565b806387330279116100dc57806387330279146105be5780638da5cb5b146105e757806395d89b41146106125780639d12006a1461063d576101f9565b806369ba814d146105115780636ecd23061461054e57806370a082311461056a578063715018a6146105a7576101f9565b8063339181d91161019057806342842e0e1161015f57806342842e0e1461041c5780634f6ccce71461044557806355f804b3146104825780635f8f3977146104ab5780636352211e146104d4576101f9565b8063339181d91461038657806338efe8e6146103b15780633cc42094146103da5780633ccfd60b14610405576101f9565b80630984d23d116101cc5780630984d23d146102cc57806318160ddd146102f557806323b872dd146103205780632f745c5914610349576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3575b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190613651565b610807565b6040516102329190613d71565b60405180910390f35b34801561024757600080fd5b50610250610819565b60405161025d9190613d8c565b60405180910390f35b34801561027257600080fd5b5061028d600480360381019061028891906136e4565b6108ab565b60405161029a9190613ce1565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c59190613615565b610930565b005b3480156102d857600080fd5b506102f360048036038101906102ee9190613736565b610a48565b005b34801561030157600080fd5b5061030a610c93565b6040516103179190614189565b60405180910390f35b34801561032c57600080fd5b506103476004803603810190610342919061350f565b610ca0565b005b34801561035557600080fd5b50610370600480360381019061036b9190613615565b610d00565b60405161037d9190614189565b60405180910390f35b34801561039257600080fd5b5061039b610da5565b6040516103a891906141bf565b60405180910390f35b3480156103bd57600080fd5b506103d860048036038101906103d391906134aa565b610dae565b005b3480156103e657600080fd5b506103ef610e6e565b6040516103fc9190614189565b60405180910390f35b34801561041157600080fd5b5061041a610e74565b005b34801561042857600080fd5b50610443600480360381019061043e919061350f565b610fe9565b005b34801561045157600080fd5b5061046c600480360381019061046791906136e4565b611009565b6040516104799190614189565b60405180910390f35b34801561048e57600080fd5b506104a960048036038101906104a491906136a3565b6110a0565b005b3480156104b757600080fd5b506104d260048036038101906104cd91906136e4565b611136565b005b3480156104e057600080fd5b506104fb60048036038101906104f691906136e4565b6111bc565b6040516105089190613ce1565b60405180910390f35b34801561051d57600080fd5b50610538600480360381019061053391906134aa565b61126e565b6040516105459190614189565b60405180910390f35b61056860048036038101906105639190613736565b611439565b005b34801561057657600080fd5b50610591600480360381019061058c91906134aa565b611679565b60405161059e9190614189565b60405180910390f35b3480156105b357600080fd5b506105bc611731565b005b3480156105ca57600080fd5b506105e560048036038101906105e091906136e4565b6117b9565b005b3480156105f357600080fd5b506105fc61183f565b6040516106099190613ce1565b60405180910390f35b34801561061e57600080fd5b50610627611869565b6040516106349190613d8c565b60405180910390f35b34801561064957600080fd5b50610664600480360381019061065f91906136e4565b6118fb565b005b34801561067257600080fd5b5061068d600480360381019061068891906135d9565b611981565b005b34801561069b57600080fd5b506106b660048036038101906106b1919061355e565b611b02565b005b3480156106c457600080fd5b506106df60048036038101906106da91906136e4565b611b64565b6040516106ec9190613d8c565b60405180910390f35b34801561070157600080fd5b5061070a611b76565b6040516107179190614189565b60405180910390f35b34801561072c57600080fd5b50610735611b7c565b604051610742919061416e565b60405180910390f35b34801561075757600080fd5b50610760611b82565b60405161076d9190614189565b60405180910390f35b34801561078257600080fd5b5061079d600480360381019061079891906134d3565b611b88565b6040516107aa9190613d71565b60405180910390f35b3480156107bf57600080fd5b506107c8611c1c565b6040516107d591906141a4565b60405180910390f35b3480156107ea57600080fd5b50610805600480360381019061080091906134aa565b611c2b565b005b600061081282611d23565b9050919050565b606060008054610828906144da565b80601f0160208091040260200160405190810160405280929190818152602001828054610854906144da565b80156108a15780601f10610876576101008083540402835291602001916108a1565b820191906000526020600020905b81548152906001019060200180831161088457829003601f168201915b5050505050905090565b60006108b682611d9d565b6108f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ec90613fae565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061093b826111bc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a39061406e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109cb611e09565b73ffffffffffffffffffffffffffffffffffffffff1614806109fa57506109f9816109f4611e09565b611b88565b5b610a39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3090613f0e565b60405180910390fd5b610a438383611e11565b505050565b60018160ff161015610a8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a86906140ae565b60405180910390fd5b610a97610da5565b60ff168160ff161115610adf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad690613e8e565b60405180910390fd5b61275561ffff16610aee610c93565b8260ff16610afc91906142af565b1115610b3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b349061408e565b60405180910390fd5b42600e541115610b82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7990613e4e565b60405180910390fd5b600f54421115610bc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbe9061404e565b60405180910390fd5b8060ff16610bd43361126e565b1015610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0c9061414e565b60405180910390fd5b60005b8160ff168160ff161015610c8f57600160126000610c34611eca565b815260200190815260200160002060006101000a81548160ff021916908315150217905550610c63600c612087565b6000610c6f600c61209d565b9050610c7b33826120ab565b508080610c8790614586565b915050610c18565b5050565b6000600880549050905090565b610cb1610cab611e09565b82612279565b610cf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce7906140ee565b60405180910390fd5b610cfb838383612357565b505050565b6000610d0b83611679565b8210610d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4390613dae565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60006014905090565b610db6611e09565b73ffffffffffffffffffffffffffffffffffffffff16610dd461183f565b73ffffffffffffffffffffffffffffffffffffffff1614610e2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2190613fce565b60405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60105481565b610e7c611e09565b73ffffffffffffffffffffffffffffffffffffffff16610e9a61183f565b73ffffffffffffffffffffffffffffffffffffffff1614610ef0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee790613fce565b60405180910390fd5b60004711610f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2a90613e6e565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610f5990613ccc565b60006040518083038185875af1925050503d8060008114610f96576040519150601f19603f3d011682016040523d82523d6000602084013e610f9b565b606091505b505090506001151581151514610fe6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fdd9061402e565b60405180910390fd5b50565b61100483838360405180602001604052806000815250611b02565b505050565b6000611013610c93565b8210611054576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104b9061412e565b60405180910390fd5b6008828154811061108e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6110a8611e09565b73ffffffffffffffffffffffffffffffffffffffff166110c661183f565b73ffffffffffffffffffffffffffffffffffffffff161461111c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111390613fce565b60405180910390fd5b80600d90805190602001906111329291906132a4565b5050565b61113e611e09565b73ffffffffffffffffffffffffffffffffffffffff1661115c61183f565b73ffffffffffffffffffffffffffffffffffffffff16146111b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a990613fce565b60405180910390fd5b80600f8190555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611265576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125c90613f4e565b60405180910390fd5b80915050919050565b600080601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b81526004016112cc9190613ce1565b60206040518083038186803b1580156112e457600080fd5b505afa1580156112f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061131c919061370d565b9050600080600090505b828160ff16101561142b576000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c5987846040518363ffffffff1660e01b8152600401611390929190613d48565b60206040518083038186803b1580156113a857600080fd5b505afa1580156113bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e0919061370d565b90506012600082815260200190815260200160002060009054906101000a900460ff16611417576001836114149190614305565b92505b50808061142390614586565b915050611326565b508060ff1692505050919050565b42601054111561147e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611475906140ce565b60405180910390fd5b60018160ff1610156114c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bc906140ae565b60405180910390fd5b6114cd610da5565b60ff168160ff161115611515576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150c90613e8e565b60405180910390fd5b604561152033611679565b8260ff1661152e91906142af565b111561156f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115669061410e565b60405180910390fd5b61275561ffff1661157e610c93565b8260ff1661158c91906142af565b11156115cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c49061408e565b60405180910390fd5b8060ff166115d9611c1c565b6115e3919061436d565b67ffffffffffffffff16341461162e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162590613dce565b60405180910390fd5b60005b8160ff168160ff16101561167557611649600c612087565b6000611655600c61209d565b905061166133826120ab565b50808061166d90614586565b915050611631565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e190613f2e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611739611e09565b73ffffffffffffffffffffffffffffffffffffffff1661175761183f565b73ffffffffffffffffffffffffffffffffffffffff16146117ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a490613fce565b60405180910390fd5b6117b760006125b3565b565b6117c1611e09565b73ffffffffffffffffffffffffffffffffffffffff166117df61183f565b73ffffffffffffffffffffffffffffffffffffffff1614611835576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182c90613fce565b60405180910390fd5b80600e8190555050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611878906144da565b80601f01602080910402602001604051908101604052809291908181526020018280546118a4906144da565b80156118f15780601f106118c6576101008083540402835291602001916118f1565b820191906000526020600020905b8154815290600101906020018083116118d457829003601f168201915b5050505050905090565b611903611e09565b73ffffffffffffffffffffffffffffffffffffffff1661192161183f565b73ffffffffffffffffffffffffffffffffffffffff1614611977576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196e90613fce565b60405180910390fd5b8060108190555050565b611989611e09565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ee90613ece565b60405180910390fd5b8060056000611a04611e09565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ab1611e09565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611af69190613d71565b60405180910390a35050565b611b13611b0d611e09565b83612279565b611b52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b49906140ee565b60405180910390fd5b611b5e84848484612679565b50505050565b6060611b6f826126d5565b9050919050565b600e5481565b61275581565b600f5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000669536c708910000905090565b611c33611e09565b73ffffffffffffffffffffffffffffffffffffffff16611c5161183f565b73ffffffffffffffffffffffffffffffffffffffff1614611ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9e90613fce565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0e90613e0e565b60405180910390fd5b611d20816125b3565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d965750611d9582612827565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e84836111bc565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611f289190613ce1565b60206040518083038186803b158015611f4057600080fd5b505afa158015611f54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f78919061370d565b905060005b818160ff16101561207d576000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c5933846040518363ffffffff1660e01b8152600401611fe7929190613d48565b60206040518083038186803b158015611fff57600080fd5b505afa158015612013573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612037919061370d565b90506012600082815260200190815260200160002060009054906101000a900460ff1661206957809350505050612084565b50808061207590614586565b915050611f7d565b5060009150505b90565b6001816000016000828254019250508190555050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561211b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211290613f6e565b60405180910390fd5b61212481611d9d565b15612164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215b90613e2e565b60405180910390fd5b61217060008383612909565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121c091906142af565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600061228482611d9d565b6122c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ba90613eee565b60405180910390fd5b60006122ce836111bc565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061233d57508373ffffffffffffffffffffffffffffffffffffffff16612325846108ab565b73ffffffffffffffffffffffffffffffffffffffff16145b8061234e575061234d8185611b88565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612377826111bc565b73ffffffffffffffffffffffffffffffffffffffff16146123cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c490613fee565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561243d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243490613eae565b60405180910390fd5b612448838383612909565b612453600082611e11565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124a391906143af565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124fa91906142af565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612684848484612357565b61269084848484612919565b6126cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c690613dee565b60405180910390fd5b50505050565b60606126e082611d9d565b61271f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271690613f8e565b60405180910390fd5b6000600a6000848152602001908152602001600020805461273f906144da565b80601f016020809104026020016040519081016040528092919081815260200182805461276b906144da565b80156127b85780601f1061278d576101008083540402835291602001916127b8565b820191906000526020600020905b81548152906001019060200180831161279b57829003601f168201915b5050505050905060006127c9612ab0565b90506000815114156127df578192505050612822565b6000825111156128145780826040516020016127fc929190613ca8565b60405160208183030381529060405292505050612822565b61281d84612b42565b925050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806128f257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612902575061290182612be9565b5b9050919050565b612914838383612c53565b505050565b600061293a8473ffffffffffffffffffffffffffffffffffffffff16612d67565b15612aa3578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612963611e09565b8786866040518563ffffffff1660e01b81526004016129859493929190613cfc565b602060405180830381600087803b15801561299f57600080fd5b505af19250505080156129d057506040513d601f19601f820116820180604052508101906129cd919061367a565b60015b612a53573d8060008114612a00576040519150601f19603f3d011682016040523d82523d6000602084013e612a05565b606091505b50600081511415612a4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4290613dee565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612aa8565b600190505b949350505050565b6060600d8054612abf906144da565b80601f0160208091040260200160405190810160405280929190818152602001828054612aeb906144da565b8015612b385780601f10612b0d57610100808354040283529160200191612b38565b820191906000526020600020905b815481529060010190602001808311612b1b57829003601f168201915b5050505050905090565b6060612b4d82611d9d565b612b8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b839061400e565b60405180910390fd5b6000612b96612ab0565b90506000815111612bb65760405180602001604052806000815250612be1565b80612bc084612d7a565b604051602001612bd1929190613ca8565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612c5e838383612f27565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612ca157612c9c81612f2c565b612ce0565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612cdf57612cde8382612f75565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d2357612d1e816130e2565b612d62565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612d6157612d608282613225565b5b5b505050565b600080823b905060008111915050919050565b60606000821415612dc2576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612f22565b600082905060005b60008214612df4578080612ddd9061453d565b915050600a82612ded919061433c565b9150612dca565b60008167ffffffffffffffff811115612e36577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612e685781602001600182028036833780820191505090505b5090505b60008514612f1b57600182612e8191906143af565b9150600a85612e9091906145b0565b6030612e9c91906142af565b60f81b818381518110612ed8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612f14919061433c565b9450612e6c565b8093505050505b919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612f8284611679565b612f8c91906143af565b9050600060076000848152602001908152602001600020549050818114613071576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506130f691906143af565b905060006009600084815260200190815260200160002054905060006008838154811061314c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613194577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613209577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061323083611679565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546132b0906144da565b90600052602060002090601f0160209004810192826132d25760008555613319565b82601f106132eb57805160ff1916838001178555613319565b82800160010185558215613319579182015b828111156133185782518255916020019190600101906132fd565b5b509050613326919061332a565b5090565b5b8082111561334357600081600090555060010161332b565b5090565b600061335a613355846141ff565b6141da565b90508281526020810184848401111561337257600080fd5b61337d848285614498565b509392505050565b600061339861339384614230565b6141da565b9050828152602081018484840111156133b057600080fd5b6133bb848285614498565b509392505050565b6000813590506133d281614e05565b92915050565b6000813590506133e781614e1c565b92915050565b6000813590506133fc81614e33565b92915050565b60008151905061341181614e33565b92915050565b600082601f83011261342857600080fd5b8135613438848260208601613347565b91505092915050565b600082601f83011261345257600080fd5b8135613462848260208601613385565b91505092915050565b60008135905061347a81614e4a565b92915050565b60008151905061348f81614e4a565b92915050565b6000813590506134a481614e61565b92915050565b6000602082840312156134bc57600080fd5b60006134ca848285016133c3565b91505092915050565b600080604083850312156134e657600080fd5b60006134f4858286016133c3565b9250506020613505858286016133c3565b9150509250929050565b60008060006060848603121561352457600080fd5b6000613532868287016133c3565b9350506020613543868287016133c3565b92505060406135548682870161346b565b9150509250925092565b6000806000806080858703121561357457600080fd5b6000613582878288016133c3565b9450506020613593878288016133c3565b93505060406135a48782880161346b565b925050606085013567ffffffffffffffff8111156135c157600080fd5b6135cd87828801613417565b91505092959194509250565b600080604083850312156135ec57600080fd5b60006135fa858286016133c3565b925050602061360b858286016133d8565b9150509250929050565b6000806040838503121561362857600080fd5b6000613636858286016133c3565b92505060206136478582860161346b565b9150509250929050565b60006020828403121561366357600080fd5b6000613671848285016133ed565b91505092915050565b60006020828403121561368c57600080fd5b600061369a84828501613402565b91505092915050565b6000602082840312156136b557600080fd5b600082013567ffffffffffffffff8111156136cf57600080fd5b6136db84828501613441565b91505092915050565b6000602082840312156136f657600080fd5b60006137048482850161346b565b91505092915050565b60006020828403121561371f57600080fd5b600061372d84828501613480565b91505092915050565b60006020828403121561374857600080fd5b600061375684828501613495565b91505092915050565b613768816143e3565b82525050565b613777816143f5565b82525050565b600061378882614261565b6137928185614277565b93506137a28185602086016144a7565b6137ab8161469d565b840191505092915050565b60006137c18261426c565b6137cb8185614293565b93506137db8185602086016144a7565b6137e48161469d565b840191505092915050565b60006137fa8261426c565b61380481856142a4565b93506138148185602086016144a7565b80840191505092915050565b600061382d602b83614293565b9150613838826146ae565b604082019050919050565b6000613850602c83614293565b915061385b826146fd565b604082019050919050565b6000613873603283614293565b915061387e8261474c565b604082019050919050565b6000613896602683614293565b91506138a18261479b565b604082019050919050565b60006138b9601c83614293565b91506138c4826147ea565b602082019050919050565b60006138dc601983614293565b91506138e782614813565b602082019050919050565b60006138ff601883614293565b915061390a8261483c565b602082019050919050565b6000613922603d83614293565b915061392d82614865565b604082019050919050565b6000613945602483614293565b9150613950826148b4565b604082019050919050565b6000613968601983614293565b915061397382614903565b602082019050919050565b600061398b602c83614293565b91506139968261492c565b604082019050919050565b60006139ae603883614293565b91506139b98261497b565b604082019050919050565b60006139d1602a83614293565b91506139dc826149ca565b604082019050919050565b60006139f4602983614293565b91506139ff82614a19565b604082019050919050565b6000613a17602083614293565b9150613a2282614a68565b602082019050919050565b6000613a3a603183614293565b9150613a4582614a91565b604082019050919050565b6000613a5d602c83614293565b9150613a6882614ae0565b604082019050919050565b6000613a80602083614293565b9150613a8b82614b2f565b602082019050919050565b6000613aa3602983614293565b9150613aae82614b58565b604082019050919050565b6000613ac6602f83614293565b9150613ad182614ba7565b604082019050919050565b6000613ae9601883614293565b9150613af482614bf6565b602082019050919050565b6000613b0c601783614293565b9150613b1782614c1f565b602082019050919050565b6000613b2f602183614293565b9150613b3a82614c48565b604082019050919050565b6000613b52601683614293565b9150613b5d82614c97565b602082019050919050565b6000613b75601483614293565b9150613b8082614cc0565b602082019050919050565b6000613b98601083614293565b9150613ba382614ce9565b602082019050919050565b6000613bbb600083614288565b9150613bc682614d12565b600082019050919050565b6000613bde603183614293565b9150613be982614d15565b604082019050919050565b6000613c01601a83614293565b9150613c0c82614d64565b602082019050919050565b6000613c24602c83614293565b9150613c2f82614d8d565b604082019050919050565b6000613c47601183614293565b9150613c5282614ddc565b602082019050919050565b613c668161442d565b82525050565b613c758161445b565b82525050565b613c8481614465565b82525050565b613c9381614486565b82525050565b613ca281614479565b82525050565b6000613cb482856137ef565b9150613cc082846137ef565b91508190509392505050565b6000613cd782613bae565b9150819050919050565b6000602082019050613cf6600083018461375f565b92915050565b6000608082019050613d11600083018761375f565b613d1e602083018661375f565b613d2b6040830185613c6c565b8181036060830152613d3d818461377d565b905095945050505050565b6000604082019050613d5d600083018561375f565b613d6a6020830184613c8a565b9392505050565b6000602082019050613d86600083018461376e565b92915050565b60006020820190508181036000830152613da681846137b6565b905092915050565b60006020820190508181036000830152613dc781613820565b9050919050565b60006020820190508181036000830152613de781613843565b9050919050565b60006020820190508181036000830152613e0781613866565b9050919050565b60006020820190508181036000830152613e2781613889565b9050919050565b60006020820190508181036000830152613e47816138ac565b9050919050565b60006020820190508181036000830152613e67816138cf565b9050919050565b60006020820190508181036000830152613e87816138f2565b9050919050565b60006020820190508181036000830152613ea781613915565b9050919050565b60006020820190508181036000830152613ec781613938565b9050919050565b60006020820190508181036000830152613ee78161395b565b9050919050565b60006020820190508181036000830152613f078161397e565b9050919050565b60006020820190508181036000830152613f27816139a1565b9050919050565b60006020820190508181036000830152613f47816139c4565b9050919050565b60006020820190508181036000830152613f67816139e7565b9050919050565b60006020820190508181036000830152613f8781613a0a565b9050919050565b60006020820190508181036000830152613fa781613a2d565b9050919050565b60006020820190508181036000830152613fc781613a50565b9050919050565b60006020820190508181036000830152613fe781613a73565b9050919050565b6000602082019050818103600083015261400781613a96565b9050919050565b6000602082019050818103600083015261402781613ab9565b9050919050565b6000602082019050818103600083015261404781613adc565b9050919050565b6000602082019050818103600083015261406781613aff565b9050919050565b6000602082019050818103600083015261408781613b22565b9050919050565b600060208201905081810360008301526140a781613b45565b9050919050565b600060208201905081810360008301526140c781613b68565b9050919050565b600060208201905081810360008301526140e781613b8b565b9050919050565b6000602082019050818103600083015261410781613bd1565b9050919050565b6000602082019050818103600083015261412781613bf4565b9050919050565b6000602082019050818103600083015261414781613c17565b9050919050565b6000602082019050818103600083015261416781613c3a565b9050919050565b60006020820190506141836000830184613c5d565b92915050565b600060208201905061419e6000830184613c6c565b92915050565b60006020820190506141b96000830184613c7b565b92915050565b60006020820190506141d46000830184613c99565b92915050565b60006141e46141f5565b90506141f0828261450c565b919050565b6000604051905090565b600067ffffffffffffffff82111561421a5761421961466e565b5b6142238261469d565b9050602081019050919050565b600067ffffffffffffffff82111561424b5761424a61466e565b5b6142548261469d565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006142ba8261445b565b91506142c58361445b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156142fa576142f96145e1565b5b828201905092915050565b600061431082614479565b915061431b83614479565b92508260ff03821115614331576143306145e1565b5b828201905092915050565b60006143478261445b565b91506143528361445b565b92508261436257614361614610565b5b828204905092915050565b600061437882614465565b915061438383614465565b92508167ffffffffffffffff04831182151516156143a4576143a36145e1565b5b828202905092915050565b60006143ba8261445b565b91506143c58361445b565b9250828210156143d8576143d76145e1565b5b828203905092915050565b60006143ee8261443b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b600061449182614479565b9050919050565b82818337600083830152505050565b60005b838110156144c55780820151818401526020810190506144aa565b838111156144d4576000848401525b50505050565b600060028204905060018216806144f257607f821691505b602082108114156145065761450561463f565b5b50919050565b6145158261469d565b810181811067ffffffffffffffff821117156145345761453361466e565b5b80604052505050565b60006145488261445b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561457b5761457a6145e1565b5b600182019050919050565b600061459182614479565b915060ff8214156145a5576145a46145e1565b5b600182019050919050565b60006145bb8261445b565b91506145c68361445b565b9250826145d6576145d5614610565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4574686572207375626d697474656420646f6573206e6f74206d61746368206360008201527f757272656e742070726963650000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f46726565206d696e74206973206e6f74206f70656e2079657400000000000000600082015250565b7f42616c616e6365206d75737420626520706f7369746976650000000000000000600082015250565b7f4d6178696d756d2063757272656e7420627579206c696d697420666f7220696e60008201527f646976696475616c207472616e73616374696f6e206578636565646564000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4661696c656420746f2077697468647261772065746865720000000000000000600082015250565b7f46726565206d696e74206861732066696e69736865642e000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f45786365656473206d6178696d756d20737570706c7900000000000000000000600082015250565b7f4d757374206d696e74206174206c656173742031000000000000000000000000600082015250565b7f53616c65206973206e6f74206f70656e00000000000000000000000000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4d6178206d696e7420706572206163636f756e74206973203639000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f756768206672656e732e000000000000000000000000000000600082015250565b614e0e816143e3565b8114614e1957600080fd5b50565b614e25816143f5565b8114614e3057600080fd5b50565b614e3c81614401565b8114614e4757600080fd5b50565b614e538161445b565b8114614e5e57600080fd5b50565b614e6a81614479565b8114614e7557600080fd5b5056fea26469706673582212208475b9af2191ae590ce30554f41a19f1fe1f033b8b463c23d7a52891a84a9b5064736f6c63430008030033

Deployed Bytecode

0x6080604052600436106101f95760003560e01c806369ba814d1161010d578063a22cb465116100a0578063d5abeb011161006f578063d5abeb0114610720578063d65fcdd31461074b578063e985e9c514610776578063eb91d37e146107b3578063f2fde38b146107de576101f9565b8063a22cb46514610666578063b88d4fde1461068f578063c87b56dd146106b8578063d5507fd2146106f5576101f9565b806387330279116100dc57806387330279146105be5780638da5cb5b146105e757806395d89b41146106125780639d12006a1461063d576101f9565b806369ba814d146105115780636ecd23061461054e57806370a082311461056a578063715018a6146105a7576101f9565b8063339181d91161019057806342842e0e1161015f57806342842e0e1461041c5780634f6ccce71461044557806355f804b3146104825780635f8f3977146104ab5780636352211e146104d4576101f9565b8063339181d91461038657806338efe8e6146103b15780633cc42094146103da5780633ccfd60b14610405576101f9565b80630984d23d116101cc5780630984d23d146102cc57806318160ddd146102f557806323b872dd146103205780632f745c5914610349576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3575b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190613651565b610807565b6040516102329190613d71565b60405180910390f35b34801561024757600080fd5b50610250610819565b60405161025d9190613d8c565b60405180910390f35b34801561027257600080fd5b5061028d600480360381019061028891906136e4565b6108ab565b60405161029a9190613ce1565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c59190613615565b610930565b005b3480156102d857600080fd5b506102f360048036038101906102ee9190613736565b610a48565b005b34801561030157600080fd5b5061030a610c93565b6040516103179190614189565b60405180910390f35b34801561032c57600080fd5b506103476004803603810190610342919061350f565b610ca0565b005b34801561035557600080fd5b50610370600480360381019061036b9190613615565b610d00565b60405161037d9190614189565b60405180910390f35b34801561039257600080fd5b5061039b610da5565b6040516103a891906141bf565b60405180910390f35b3480156103bd57600080fd5b506103d860048036038101906103d391906134aa565b610dae565b005b3480156103e657600080fd5b506103ef610e6e565b6040516103fc9190614189565b60405180910390f35b34801561041157600080fd5b5061041a610e74565b005b34801561042857600080fd5b50610443600480360381019061043e919061350f565b610fe9565b005b34801561045157600080fd5b5061046c600480360381019061046791906136e4565b611009565b6040516104799190614189565b60405180910390f35b34801561048e57600080fd5b506104a960048036038101906104a491906136a3565b6110a0565b005b3480156104b757600080fd5b506104d260048036038101906104cd91906136e4565b611136565b005b3480156104e057600080fd5b506104fb60048036038101906104f691906136e4565b6111bc565b6040516105089190613ce1565b60405180910390f35b34801561051d57600080fd5b50610538600480360381019061053391906134aa565b61126e565b6040516105459190614189565b60405180910390f35b61056860048036038101906105639190613736565b611439565b005b34801561057657600080fd5b50610591600480360381019061058c91906134aa565b611679565b60405161059e9190614189565b60405180910390f35b3480156105b357600080fd5b506105bc611731565b005b3480156105ca57600080fd5b506105e560048036038101906105e091906136e4565b6117b9565b005b3480156105f357600080fd5b506105fc61183f565b6040516106099190613ce1565b60405180910390f35b34801561061e57600080fd5b50610627611869565b6040516106349190613d8c565b60405180910390f35b34801561064957600080fd5b50610664600480360381019061065f91906136e4565b6118fb565b005b34801561067257600080fd5b5061068d600480360381019061068891906135d9565b611981565b005b34801561069b57600080fd5b506106b660048036038101906106b1919061355e565b611b02565b005b3480156106c457600080fd5b506106df60048036038101906106da91906136e4565b611b64565b6040516106ec9190613d8c565b60405180910390f35b34801561070157600080fd5b5061070a611b76565b6040516107179190614189565b60405180910390f35b34801561072c57600080fd5b50610735611b7c565b604051610742919061416e565b60405180910390f35b34801561075757600080fd5b50610760611b82565b60405161076d9190614189565b60405180910390f35b34801561078257600080fd5b5061079d600480360381019061079891906134d3565b611b88565b6040516107aa9190613d71565b60405180910390f35b3480156107bf57600080fd5b506107c8611c1c565b6040516107d591906141a4565b60405180910390f35b3480156107ea57600080fd5b50610805600480360381019061080091906134aa565b611c2b565b005b600061081282611d23565b9050919050565b606060008054610828906144da565b80601f0160208091040260200160405190810160405280929190818152602001828054610854906144da565b80156108a15780601f10610876576101008083540402835291602001916108a1565b820191906000526020600020905b81548152906001019060200180831161088457829003601f168201915b5050505050905090565b60006108b682611d9d565b6108f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ec90613fae565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061093b826111bc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a39061406e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109cb611e09565b73ffffffffffffffffffffffffffffffffffffffff1614806109fa57506109f9816109f4611e09565b611b88565b5b610a39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3090613f0e565b60405180910390fd5b610a438383611e11565b505050565b60018160ff161015610a8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a86906140ae565b60405180910390fd5b610a97610da5565b60ff168160ff161115610adf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad690613e8e565b60405180910390fd5b61275561ffff16610aee610c93565b8260ff16610afc91906142af565b1115610b3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b349061408e565b60405180910390fd5b42600e541115610b82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7990613e4e565b60405180910390fd5b600f54421115610bc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbe9061404e565b60405180910390fd5b8060ff16610bd43361126e565b1015610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0c9061414e565b60405180910390fd5b60005b8160ff168160ff161015610c8f57600160126000610c34611eca565b815260200190815260200160002060006101000a81548160ff021916908315150217905550610c63600c612087565b6000610c6f600c61209d565b9050610c7b33826120ab565b508080610c8790614586565b915050610c18565b5050565b6000600880549050905090565b610cb1610cab611e09565b82612279565b610cf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce7906140ee565b60405180910390fd5b610cfb838383612357565b505050565b6000610d0b83611679565b8210610d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4390613dae565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60006014905090565b610db6611e09565b73ffffffffffffffffffffffffffffffffffffffff16610dd461183f565b73ffffffffffffffffffffffffffffffffffffffff1614610e2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2190613fce565b60405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60105481565b610e7c611e09565b73ffffffffffffffffffffffffffffffffffffffff16610e9a61183f565b73ffffffffffffffffffffffffffffffffffffffff1614610ef0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee790613fce565b60405180910390fd5b60004711610f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2a90613e6e565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610f5990613ccc565b60006040518083038185875af1925050503d8060008114610f96576040519150601f19603f3d011682016040523d82523d6000602084013e610f9b565b606091505b505090506001151581151514610fe6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fdd9061402e565b60405180910390fd5b50565b61100483838360405180602001604052806000815250611b02565b505050565b6000611013610c93565b8210611054576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104b9061412e565b60405180910390fd5b6008828154811061108e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6110a8611e09565b73ffffffffffffffffffffffffffffffffffffffff166110c661183f565b73ffffffffffffffffffffffffffffffffffffffff161461111c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111390613fce565b60405180910390fd5b80600d90805190602001906111329291906132a4565b5050565b61113e611e09565b73ffffffffffffffffffffffffffffffffffffffff1661115c61183f565b73ffffffffffffffffffffffffffffffffffffffff16146111b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a990613fce565b60405180910390fd5b80600f8190555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611265576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125c90613f4e565b60405180910390fd5b80915050919050565b600080601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b81526004016112cc9190613ce1565b60206040518083038186803b1580156112e457600080fd5b505afa1580156112f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061131c919061370d565b9050600080600090505b828160ff16101561142b576000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c5987846040518363ffffffff1660e01b8152600401611390929190613d48565b60206040518083038186803b1580156113a857600080fd5b505afa1580156113bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e0919061370d565b90506012600082815260200190815260200160002060009054906101000a900460ff16611417576001836114149190614305565b92505b50808061142390614586565b915050611326565b508060ff1692505050919050565b42601054111561147e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611475906140ce565b60405180910390fd5b60018160ff1610156114c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bc906140ae565b60405180910390fd5b6114cd610da5565b60ff168160ff161115611515576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150c90613e8e565b60405180910390fd5b604561152033611679565b8260ff1661152e91906142af565b111561156f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115669061410e565b60405180910390fd5b61275561ffff1661157e610c93565b8260ff1661158c91906142af565b11156115cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c49061408e565b60405180910390fd5b8060ff166115d9611c1c565b6115e3919061436d565b67ffffffffffffffff16341461162e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162590613dce565b60405180910390fd5b60005b8160ff168160ff16101561167557611649600c612087565b6000611655600c61209d565b905061166133826120ab565b50808061166d90614586565b915050611631565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e190613f2e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611739611e09565b73ffffffffffffffffffffffffffffffffffffffff1661175761183f565b73ffffffffffffffffffffffffffffffffffffffff16146117ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a490613fce565b60405180910390fd5b6117b760006125b3565b565b6117c1611e09565b73ffffffffffffffffffffffffffffffffffffffff166117df61183f565b73ffffffffffffffffffffffffffffffffffffffff1614611835576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182c90613fce565b60405180910390fd5b80600e8190555050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611878906144da565b80601f01602080910402602001604051908101604052809291908181526020018280546118a4906144da565b80156118f15780601f106118c6576101008083540402835291602001916118f1565b820191906000526020600020905b8154815290600101906020018083116118d457829003601f168201915b5050505050905090565b611903611e09565b73ffffffffffffffffffffffffffffffffffffffff1661192161183f565b73ffffffffffffffffffffffffffffffffffffffff1614611977576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196e90613fce565b60405180910390fd5b8060108190555050565b611989611e09565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ee90613ece565b60405180910390fd5b8060056000611a04611e09565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ab1611e09565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611af69190613d71565b60405180910390a35050565b611b13611b0d611e09565b83612279565b611b52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b49906140ee565b60405180910390fd5b611b5e84848484612679565b50505050565b6060611b6f826126d5565b9050919050565b600e5481565b61275581565b600f5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000669536c708910000905090565b611c33611e09565b73ffffffffffffffffffffffffffffffffffffffff16611c5161183f565b73ffffffffffffffffffffffffffffffffffffffff1614611ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9e90613fce565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0e90613e0e565b60405180910390fd5b611d20816125b3565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d965750611d9582612827565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e84836111bc565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611f289190613ce1565b60206040518083038186803b158015611f4057600080fd5b505afa158015611f54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f78919061370d565b905060005b818160ff16101561207d576000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c5933846040518363ffffffff1660e01b8152600401611fe7929190613d48565b60206040518083038186803b158015611fff57600080fd5b505afa158015612013573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612037919061370d565b90506012600082815260200190815260200160002060009054906101000a900460ff1661206957809350505050612084565b50808061207590614586565b915050611f7d565b5060009150505b90565b6001816000016000828254019250508190555050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561211b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211290613f6e565b60405180910390fd5b61212481611d9d565b15612164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215b90613e2e565b60405180910390fd5b61217060008383612909565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121c091906142af565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600061228482611d9d565b6122c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ba90613eee565b60405180910390fd5b60006122ce836111bc565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061233d57508373ffffffffffffffffffffffffffffffffffffffff16612325846108ab565b73ffffffffffffffffffffffffffffffffffffffff16145b8061234e575061234d8185611b88565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612377826111bc565b73ffffffffffffffffffffffffffffffffffffffff16146123cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c490613fee565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561243d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243490613eae565b60405180910390fd5b612448838383612909565b612453600082611e11565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124a391906143af565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124fa91906142af565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612684848484612357565b61269084848484612919565b6126cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c690613dee565b60405180910390fd5b50505050565b60606126e082611d9d565b61271f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271690613f8e565b60405180910390fd5b6000600a6000848152602001908152602001600020805461273f906144da565b80601f016020809104026020016040519081016040528092919081815260200182805461276b906144da565b80156127b85780601f1061278d576101008083540402835291602001916127b8565b820191906000526020600020905b81548152906001019060200180831161279b57829003601f168201915b5050505050905060006127c9612ab0565b90506000815114156127df578192505050612822565b6000825111156128145780826040516020016127fc929190613ca8565b60405160208183030381529060405292505050612822565b61281d84612b42565b925050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806128f257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612902575061290182612be9565b5b9050919050565b612914838383612c53565b505050565b600061293a8473ffffffffffffffffffffffffffffffffffffffff16612d67565b15612aa3578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612963611e09565b8786866040518563ffffffff1660e01b81526004016129859493929190613cfc565b602060405180830381600087803b15801561299f57600080fd5b505af19250505080156129d057506040513d601f19601f820116820180604052508101906129cd919061367a565b60015b612a53573d8060008114612a00576040519150601f19603f3d011682016040523d82523d6000602084013e612a05565b606091505b50600081511415612a4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4290613dee565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612aa8565b600190505b949350505050565b6060600d8054612abf906144da565b80601f0160208091040260200160405190810160405280929190818152602001828054612aeb906144da565b8015612b385780601f10612b0d57610100808354040283529160200191612b38565b820191906000526020600020905b815481529060010190602001808311612b1b57829003601f168201915b5050505050905090565b6060612b4d82611d9d565b612b8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b839061400e565b60405180910390fd5b6000612b96612ab0565b90506000815111612bb65760405180602001604052806000815250612be1565b80612bc084612d7a565b604051602001612bd1929190613ca8565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612c5e838383612f27565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612ca157612c9c81612f2c565b612ce0565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612cdf57612cde8382612f75565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d2357612d1e816130e2565b612d62565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612d6157612d608282613225565b5b5b505050565b600080823b905060008111915050919050565b60606000821415612dc2576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612f22565b600082905060005b60008214612df4578080612ddd9061453d565b915050600a82612ded919061433c565b9150612dca565b60008167ffffffffffffffff811115612e36577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612e685781602001600182028036833780820191505090505b5090505b60008514612f1b57600182612e8191906143af565b9150600a85612e9091906145b0565b6030612e9c91906142af565b60f81b818381518110612ed8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612f14919061433c565b9450612e6c565b8093505050505b919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612f8284611679565b612f8c91906143af565b9050600060076000848152602001908152602001600020549050818114613071576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506130f691906143af565b905060006009600084815260200190815260200160002054905060006008838154811061314c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613194577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613209577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061323083611679565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546132b0906144da565b90600052602060002090601f0160209004810192826132d25760008555613319565b82601f106132eb57805160ff1916838001178555613319565b82800160010185558215613319579182015b828111156133185782518255916020019190600101906132fd565b5b509050613326919061332a565b5090565b5b8082111561334357600081600090555060010161332b565b5090565b600061335a613355846141ff565b6141da565b90508281526020810184848401111561337257600080fd5b61337d848285614498565b509392505050565b600061339861339384614230565b6141da565b9050828152602081018484840111156133b057600080fd5b6133bb848285614498565b509392505050565b6000813590506133d281614e05565b92915050565b6000813590506133e781614e1c565b92915050565b6000813590506133fc81614e33565b92915050565b60008151905061341181614e33565b92915050565b600082601f83011261342857600080fd5b8135613438848260208601613347565b91505092915050565b600082601f83011261345257600080fd5b8135613462848260208601613385565b91505092915050565b60008135905061347a81614e4a565b92915050565b60008151905061348f81614e4a565b92915050565b6000813590506134a481614e61565b92915050565b6000602082840312156134bc57600080fd5b60006134ca848285016133c3565b91505092915050565b600080604083850312156134e657600080fd5b60006134f4858286016133c3565b9250506020613505858286016133c3565b9150509250929050565b60008060006060848603121561352457600080fd5b6000613532868287016133c3565b9350506020613543868287016133c3565b92505060406135548682870161346b565b9150509250925092565b6000806000806080858703121561357457600080fd5b6000613582878288016133c3565b9450506020613593878288016133c3565b93505060406135a48782880161346b565b925050606085013567ffffffffffffffff8111156135c157600080fd5b6135cd87828801613417565b91505092959194509250565b600080604083850312156135ec57600080fd5b60006135fa858286016133c3565b925050602061360b858286016133d8565b9150509250929050565b6000806040838503121561362857600080fd5b6000613636858286016133c3565b92505060206136478582860161346b565b9150509250929050565b60006020828403121561366357600080fd5b6000613671848285016133ed565b91505092915050565b60006020828403121561368c57600080fd5b600061369a84828501613402565b91505092915050565b6000602082840312156136b557600080fd5b600082013567ffffffffffffffff8111156136cf57600080fd5b6136db84828501613441565b91505092915050565b6000602082840312156136f657600080fd5b60006137048482850161346b565b91505092915050565b60006020828403121561371f57600080fd5b600061372d84828501613480565b91505092915050565b60006020828403121561374857600080fd5b600061375684828501613495565b91505092915050565b613768816143e3565b82525050565b613777816143f5565b82525050565b600061378882614261565b6137928185614277565b93506137a28185602086016144a7565b6137ab8161469d565b840191505092915050565b60006137c18261426c565b6137cb8185614293565b93506137db8185602086016144a7565b6137e48161469d565b840191505092915050565b60006137fa8261426c565b61380481856142a4565b93506138148185602086016144a7565b80840191505092915050565b600061382d602b83614293565b9150613838826146ae565b604082019050919050565b6000613850602c83614293565b915061385b826146fd565b604082019050919050565b6000613873603283614293565b915061387e8261474c565b604082019050919050565b6000613896602683614293565b91506138a18261479b565b604082019050919050565b60006138b9601c83614293565b91506138c4826147ea565b602082019050919050565b60006138dc601983614293565b91506138e782614813565b602082019050919050565b60006138ff601883614293565b915061390a8261483c565b602082019050919050565b6000613922603d83614293565b915061392d82614865565b604082019050919050565b6000613945602483614293565b9150613950826148b4565b604082019050919050565b6000613968601983614293565b915061397382614903565b602082019050919050565b600061398b602c83614293565b91506139968261492c565b604082019050919050565b60006139ae603883614293565b91506139b98261497b565b604082019050919050565b60006139d1602a83614293565b91506139dc826149ca565b604082019050919050565b60006139f4602983614293565b91506139ff82614a19565b604082019050919050565b6000613a17602083614293565b9150613a2282614a68565b602082019050919050565b6000613a3a603183614293565b9150613a4582614a91565b604082019050919050565b6000613a5d602c83614293565b9150613a6882614ae0565b604082019050919050565b6000613a80602083614293565b9150613a8b82614b2f565b602082019050919050565b6000613aa3602983614293565b9150613aae82614b58565b604082019050919050565b6000613ac6602f83614293565b9150613ad182614ba7565b604082019050919050565b6000613ae9601883614293565b9150613af482614bf6565b602082019050919050565b6000613b0c601783614293565b9150613b1782614c1f565b602082019050919050565b6000613b2f602183614293565b9150613b3a82614c48565b604082019050919050565b6000613b52601683614293565b9150613b5d82614c97565b602082019050919050565b6000613b75601483614293565b9150613b8082614cc0565b602082019050919050565b6000613b98601083614293565b9150613ba382614ce9565b602082019050919050565b6000613bbb600083614288565b9150613bc682614d12565b600082019050919050565b6000613bde603183614293565b9150613be982614d15565b604082019050919050565b6000613c01601a83614293565b9150613c0c82614d64565b602082019050919050565b6000613c24602c83614293565b9150613c2f82614d8d565b604082019050919050565b6000613c47601183614293565b9150613c5282614ddc565b602082019050919050565b613c668161442d565b82525050565b613c758161445b565b82525050565b613c8481614465565b82525050565b613c9381614486565b82525050565b613ca281614479565b82525050565b6000613cb482856137ef565b9150613cc082846137ef565b91508190509392505050565b6000613cd782613bae565b9150819050919050565b6000602082019050613cf6600083018461375f565b92915050565b6000608082019050613d11600083018761375f565b613d1e602083018661375f565b613d2b6040830185613c6c565b8181036060830152613d3d818461377d565b905095945050505050565b6000604082019050613d5d600083018561375f565b613d6a6020830184613c8a565b9392505050565b6000602082019050613d86600083018461376e565b92915050565b60006020820190508181036000830152613da681846137b6565b905092915050565b60006020820190508181036000830152613dc781613820565b9050919050565b60006020820190508181036000830152613de781613843565b9050919050565b60006020820190508181036000830152613e0781613866565b9050919050565b60006020820190508181036000830152613e2781613889565b9050919050565b60006020820190508181036000830152613e47816138ac565b9050919050565b60006020820190508181036000830152613e67816138cf565b9050919050565b60006020820190508181036000830152613e87816138f2565b9050919050565b60006020820190508181036000830152613ea781613915565b9050919050565b60006020820190508181036000830152613ec781613938565b9050919050565b60006020820190508181036000830152613ee78161395b565b9050919050565b60006020820190508181036000830152613f078161397e565b9050919050565b60006020820190508181036000830152613f27816139a1565b9050919050565b60006020820190508181036000830152613f47816139c4565b9050919050565b60006020820190508181036000830152613f67816139e7565b9050919050565b60006020820190508181036000830152613f8781613a0a565b9050919050565b60006020820190508181036000830152613fa781613a2d565b9050919050565b60006020820190508181036000830152613fc781613a50565b9050919050565b60006020820190508181036000830152613fe781613a73565b9050919050565b6000602082019050818103600083015261400781613a96565b9050919050565b6000602082019050818103600083015261402781613ab9565b9050919050565b6000602082019050818103600083015261404781613adc565b9050919050565b6000602082019050818103600083015261406781613aff565b9050919050565b6000602082019050818103600083015261408781613b22565b9050919050565b600060208201905081810360008301526140a781613b45565b9050919050565b600060208201905081810360008301526140c781613b68565b9050919050565b600060208201905081810360008301526140e781613b8b565b9050919050565b6000602082019050818103600083015261410781613bd1565b9050919050565b6000602082019050818103600083015261412781613bf4565b9050919050565b6000602082019050818103600083015261414781613c17565b9050919050565b6000602082019050818103600083015261416781613c3a565b9050919050565b60006020820190506141836000830184613c5d565b92915050565b600060208201905061419e6000830184613c6c565b92915050565b60006020820190506141b96000830184613c7b565b92915050565b60006020820190506141d46000830184613c99565b92915050565b60006141e46141f5565b90506141f0828261450c565b919050565b6000604051905090565b600067ffffffffffffffff82111561421a5761421961466e565b5b6142238261469d565b9050602081019050919050565b600067ffffffffffffffff82111561424b5761424a61466e565b5b6142548261469d565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006142ba8261445b565b91506142c58361445b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156142fa576142f96145e1565b5b828201905092915050565b600061431082614479565b915061431b83614479565b92508260ff03821115614331576143306145e1565b5b828201905092915050565b60006143478261445b565b91506143528361445b565b92508261436257614361614610565b5b828204905092915050565b600061437882614465565b915061438383614465565b92508167ffffffffffffffff04831182151516156143a4576143a36145e1565b5b828202905092915050565b60006143ba8261445b565b91506143c58361445b565b9250828210156143d8576143d76145e1565b5b828203905092915050565b60006143ee8261443b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b600061449182614479565b9050919050565b82818337600083830152505050565b60005b838110156144c55780820151818401526020810190506144aa565b838111156144d4576000848401525b50505050565b600060028204905060018216806144f257607f821691505b602082108114156145065761450561463f565b5b50919050565b6145158261469d565b810181811067ffffffffffffffff821117156145345761453361466e565b5b80604052505050565b60006145488261445b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561457b5761457a6145e1565b5b600182019050919050565b600061459182614479565b915060ff8214156145a5576145a46145e1565b5b600182019050919050565b60006145bb8261445b565b91506145c68361445b565b9250826145d6576145d5614610565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4574686572207375626d697474656420646f6573206e6f74206d61746368206360008201527f757272656e742070726963650000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f46726565206d696e74206973206e6f74206f70656e2079657400000000000000600082015250565b7f42616c616e6365206d75737420626520706f7369746976650000000000000000600082015250565b7f4d6178696d756d2063757272656e7420627579206c696d697420666f7220696e60008201527f646976696475616c207472616e73616374696f6e206578636565646564000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4661696c656420746f2077697468647261772065746865720000000000000000600082015250565b7f46726565206d696e74206861732066696e69736865642e000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f45786365656473206d6178696d756d20737570706c7900000000000000000000600082015250565b7f4d757374206d696e74206174206c656173742031000000000000000000000000600082015250565b7f53616c65206973206e6f74206f70656e00000000000000000000000000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4d6178206d696e7420706572206163636f756e74206973203639000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f756768206672656e732e000000000000000000000000000000600082015250565b614e0e816143e3565b8114614e1957600080fd5b50565b614e25816143f5565b8114614e3057600080fd5b50565b614e3c81614401565b8114614e4757600080fd5b50565b614e538161445b565b8114614e5e57600080fd5b50565b614e6a81614479565b8114614e7557600080fd5b5056fea26469706673582212208475b9af2191ae590ce30554f41a19f1fe1f033b8b463c23d7a52891a84a9b5064736f6c63430008030033

Deployed Bytecode Sourcemap

46484:5727:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48904:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26235:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27794:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27317:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49716:996;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38873:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28684:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38541:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49451:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47463:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46857:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51948:260;;;;;;;;;;;;;:::i;:::-;;29094:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39063:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49126:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47340:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25929:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47586:499;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50746:949;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25659:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3868:94;;;;;;;;;;;;;:::i;:::-;;47213:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3217:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26404:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47082:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28087:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29350:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51707:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46746:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46658:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46799:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28453:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49600:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4117:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48904:212;49043:4;49072:36;49096:11;49072:23;:36::i;:::-;49065:43;;48904:212;;;:::o;26235:100::-;26289:13;26322:5;26315:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26235:100;:::o;27794:221::-;27870:7;27898:16;27906:7;27898;:16::i;:::-;27890:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27983:15;:24;27999:7;27983:24;;;;;;;;;;;;;;;;;;;;;27976:31;;27794:221;;;:::o;27317:411::-;27398:13;27414:23;27429:7;27414:14;:23::i;:::-;27398:39;;27462:5;27456:11;;:2;:11;;;;27448:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27556:5;27540:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27565:37;27582:5;27589:12;:10;:12::i;:::-;27565:16;:37::i;:::-;27540:62;27518:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;27699:21;27708:2;27712:7;27699:8;:21::i;:::-;27317:411;;;:::o;49716:996::-;49809:1;49790:15;:20;;;;49782:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;49887:21;:19;:21::i;:::-;49868:40;;:15;:40;;;;49846:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;46693:5;50030:46;;50049:13;:11;:13::i;:::-;50031:15;:31;;;;;;:::i;:::-;50030:46;;50008:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;50177:15;50155:18;;:37;;50147:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;50260:17;;50241:15;:36;;50233:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;50370:15;50334:51;;:32;50355:10;50334:20;:32::i;:::-;:51;;50326:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;50435:7;50430:275;50452:15;50448:19;;:1;:19;;;50430:275;;;50540:4;50489:11;:48;50501:35;:33;:35::i;:::-;50489:48;;;;;;;;;;;;:55;;;;;;;;;;;;;;;;;;50559:21;:9;:19;:21::i;:::-;50611:17;50631:19;:9;:17;:19::i;:::-;50611:39;;50665:28;50671:10;50683:9;50665:5;:28::i;:::-;50430:275;50469:3;;;;;:::i;:::-;;;;50430:275;;;;49716:996;:::o;38873:113::-;38934:7;38961:10;:17;;;;38954:24;;38873:113;:::o;28684:339::-;28879:41;28898:12;:10;:12::i;:::-;28912:7;28879:18;:41::i;:::-;28871:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28987:28;28997:4;29003:2;29007:7;28987:9;:28::i;:::-;28684:339;;;:::o;38541:256::-;38638:7;38674:23;38691:5;38674:16;:23::i;:::-;38666:5;:31;38658:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;38763:12;:19;38776:5;38763:19;;;;;;;;;;;;;;;:26;38783:5;38763:26;;;;;;;;;;;;38756:33;;38541:256;;;;:::o;49451:87::-;49503:5;49528:2;49521:9;;49451:87;:::o;47463:111::-;3448:12;:10;:12::i;:::-;3437:23;;:7;:5;:7::i;:::-;:23;;;3429:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47554:12:::1;47538:13;;:28;;;;;;;;;;;;;;;;;;47463:111:::0;:::o;46857:48::-;;;;:::o;51948:260::-;3448:12;:10;:12::i;:::-;3437:23;;:7;:5;:7::i;:::-;:23;;;3429:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52028:1:::1;52004:21;:25;51996:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;52070:12;52088:10;:15;;52111:21;52088:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52069:68;;;52167:4;52156:15;;:7;:15;;;52148:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;3508:1;51948:260::o:0;29094:185::-;29232:39;29249:4;29255:2;29259:7;29232:39;;;;;;;;;;;;:16;:39::i;:::-;29094:185;;;:::o;39063:233::-;39138:7;39174:30;:28;:30::i;:::-;39166:5;:38;39158:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;39271:10;39282:5;39271:17;;;;;;;;;;;;;;;;;;;;;;;;39264:24;;39063:233;;;:::o;49126:120::-;3448:12;:10;:12::i;:::-;3437:23;;:7;:5;:7::i;:::-;:23;;;3429:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49222:16:::1;49206:13;:32;;;;;;;;;;;;:::i;:::-;;49126:120:::0;:::o;47340:111::-;3448:12;:10;:12::i;:::-;3437:23;;:7;:5;:7::i;:::-;:23;;;3429:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47435:8:::1;47415:17;:28;;;;47340:111:::0;:::o;25929:239::-;26001:7;26021:13;26037:7;:16;26045:7;26037:16;;;;;;;;;;;;;;;;;;;;;26021:32;;26089:1;26072:19;;:5;:19;;;;26064:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26155:5;26148:12;;;25929:239;;;:::o;47586:499::-;47657:7;47677:20;47707:13;;;;;;;;;;;47700:31;;;47732:11;47700:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47677:67;;47755:16;47796:7;47806:1;47796:11;;47792:248;47810:12;47808:1;:14;;;47792:248;;;47843:19;47872:13;;;;;;;;;;;47865:41;;;47907:11;47920:1;47865:57;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47843:79;;47941:11;:24;47953:11;47941:24;;;;;;;;;;;;;;;;;;;;;47937:92;;48012:1;47999:10;:14;;;;:::i;:::-;47986:27;;47937:92;47792:248;47823:3;;;;;:::i;:::-;;;;47792:248;;;;48067:10;48060:17;;;;;;47586:499;;;:::o;50746:949::-;50841:15;50817:20;;:39;;50809:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50915:1;50896:15;:20;;;;50888:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;50993:21;:19;:21::i;:::-;50974:40;;:15;:40;;;;50952:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;51167:2;51141:21;51151:10;51141:9;:21::i;:::-;51123:15;:39;;;;;;:::i;:::-;51122:47;;51114:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;46693:5;51233:46;;51252:13;:11;:13::i;:::-;51234:15;:31;;;;;;:::i;:::-;51233:46;;51211:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;51396:15;51376:35;;:17;:15;:17::i;:::-;:35;;;;:::i;:::-;51362:50;;:9;:50;51340:144;;;;;;;;;;;;:::i;:::-;;;;;;;;;51502:7;51497:191;51519:15;51515:19;;:1;:19;;;51497:191;;;51556:21;:9;:19;:21::i;:::-;51594:17;51614:19;:9;:17;:19::i;:::-;51594:39;;51648:28;51654:10;51666:9;51648:5;:28::i;:::-;51497:191;51536:3;;;;;:::i;:::-;;;;51497:191;;;;50746:949;:::o;25659:208::-;25731:7;25776:1;25759:19;;:5;:19;;;;25751:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;25843:9;:16;25853:5;25843:16;;;;;;;;;;;;;;;;25836:23;;25659:208;;;:::o;3868:94::-;3448:12;:10;:12::i;:::-;3437:23;;:7;:5;:7::i;:::-;:23;;;3429:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3933:21:::1;3951:1;3933:9;:21::i;:::-;3868:94::o:0;47213:115::-;3448:12;:10;:12::i;:::-;3437:23;;:7;:5;:7::i;:::-;:23;;;3429:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47311:9:::1;47290:18;:30;;;;47213:115:::0;:::o;3217:87::-;3263:7;3290:6;;;;;;;;;;;3283:13;;3217:87;:::o;26404:104::-;26460:13;26493:7;26486:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26404:104;:::o;47082:119::-;3448:12;:10;:12::i;:::-;3437:23;;:7;:5;:7::i;:::-;:23;;;3429:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47184:9:::1;47161:20;:32;;;;47082:119:::0;:::o;28087:295::-;28202:12;:10;:12::i;:::-;28190:24;;:8;:24;;;;28182:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;28302:8;28257:18;:32;28276:12;:10;:12::i;:::-;28257:32;;;;;;;;;;;;;;;:42;28290:8;28257:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;28355:8;28326:48;;28341:12;:10;:12::i;:::-;28326:48;;;28365:8;28326:48;;;;;;:::i;:::-;;;;;;;;28087:295;;:::o;29350:328::-;29525:41;29544:12;:10;:12::i;:::-;29558:7;29525:18;:41::i;:::-;29517:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29631:39;29645:4;29651:2;29655:7;29664:5;29631:13;:39::i;:::-;29350:328;;;;:::o;51707:196::-;51834:13;51872:23;51887:7;51872:14;:23::i;:::-;51865:30;;51707:196;;;:::o;46746:46::-;;;;:::o;46658:40::-;46693:5;46658:40;:::o;46799:45::-;;;;:::o;28453:164::-;28550:4;28574:18;:25;28593:5;28574:25;;;;;;;;;;;;;;;:35;28600:8;28574:35;;;;;;;;;;;;;;;;;;;;;;;;;28567:42;;28453:164;;;;:::o;49600:104::-;49648:6;49674:22;49667:29;;49600:104;:::o;4117:192::-;3448:12;:10;:12::i;:::-;3437:23;;:7;:5;:7::i;:::-;:23;;;3429:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4226:1:::1;4206:22;;:8;:22;;;;4198:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4282:19;4292:8;4282:9;:19::i;:::-;4117:192:::0;:::o;38233:224::-;38335:4;38374:35;38359:50;;;:11;:50;;;;:90;;;;38413:36;38437:11;38413:23;:36::i;:::-;38359:90;38352:97;;38233:224;;;:::o;31188:127::-;31253:4;31305:1;31277:30;;:7;:16;31285:7;31277:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31270:37;;31188:127;;;:::o;2062:98::-;2115:7;2142:10;2135:17;;2062:98;:::o;35170:174::-;35272:2;35245:15;:24;35261:7;35245:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35328:7;35324:2;35290:46;;35299:23;35314:7;35299:14;:23::i;:::-;35290:46;;;;;;;;;;;;35170:174;;:::o;48097:447::-;48163:7;48183:20;48213:13;;;;;;;;;;;48206:31;;;48238:10;48206:43;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48183:66;;48274:7;48270:238;48288:12;48286:1;:14;;;48270:238;;;48321:19;48350:13;;;;;;;;;;;48343:41;;;48385:10;48397:1;48343:56;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48321:78;;48418:11;:24;48430:11;48418:24;;;;;;;;;;;;;;;;;;;;;48414:83;;48470:11;48463:18;;;;;;;48414:83;48270:238;48301:3;;;;;:::i;:::-;;;;48270:238;;;;48535:1;48528:8;;;48097:447;;:::o;970:127::-;1077:1;1059:7;:14;;;:19;;;;;;;;;;;970:127;:::o;848:114::-;913:7;940;:14;;;933:21;;848:114;;;:::o;33166:382::-;33260:1;33246:16;;:2;:16;;;;33238:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33319:16;33327:7;33319;:16::i;:::-;33318:17;33310:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33381:45;33410:1;33414:2;33418:7;33381:20;:45::i;:::-;33456:1;33439:9;:13;33449:2;33439:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33487:2;33468:7;:16;33476:7;33468:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33532:7;33528:2;33507:33;;33524:1;33507:33;;;;;;;;;;;;33166:382;;:::o;31482:348::-;31575:4;31600:16;31608:7;31600;:16::i;:::-;31592:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31676:13;31692:23;31707:7;31692:14;:23::i;:::-;31676:39;;31745:5;31734:16;;:7;:16;;;:51;;;;31778:7;31754:31;;:20;31766:7;31754:11;:20::i;:::-;:31;;;31734:51;:87;;;;31789:32;31806:5;31813:7;31789:16;:32::i;:::-;31734:87;31726:96;;;31482:348;;;;:::o;34474:578::-;34633:4;34606:31;;:23;34621:7;34606:14;:23::i;:::-;:31;;;34598:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;34716:1;34702:16;;:2;:16;;;;34694:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34772:39;34793:4;34799:2;34803:7;34772:20;:39::i;:::-;34876:29;34893:1;34897:7;34876:8;:29::i;:::-;34937:1;34918:9;:15;34928:4;34918:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34966:1;34949:9;:13;34959:2;34949:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34997:2;34978:7;:16;34986:7;34978:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35036:7;35032:2;35017:27;;35026:4;35017:27;;;;;;;;;;;;34474:578;;;:::o;4317:173::-;4373:16;4392:6;;;;;;;;;;;4373:25;;4418:8;4409:6;;:17;;;;;;;;;;;;;;;;;;4473:8;4442:40;;4463:8;4442:40;;;;;;;;;;;;4317:173;;:::o;30560:315::-;30717:28;30727:4;30733:2;30737:7;30717:9;:28::i;:::-;30764:48;30787:4;30793:2;30797:7;30806:5;30764:22;:48::i;:::-;30756:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;30560:315;;;;:::o;44726:679::-;44799:13;44833:16;44841:7;44833;:16::i;:::-;44825:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;44916:23;44942:10;:19;44953:7;44942:19;;;;;;;;;;;44916:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44972:18;44993:10;:8;:10::i;:::-;44972:31;;45101:1;45085:4;45079:18;:23;45075:72;;;45126:9;45119:16;;;;;;45075:72;45277:1;45257:9;45251:23;:27;45247:108;;;45326:4;45332:9;45309:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45295:48;;;;;;45247:108;45374:23;45389:7;45374:14;:23::i;:::-;45367:30;;;;44726:679;;;;:::o;25290:305::-;25392:4;25444:25;25429:40;;;:11;:40;;;;:105;;;;25501:33;25486:48;;;:11;:48;;;;25429:105;:158;;;;25551:36;25575:11;25551:23;:36::i;:::-;25429:158;25409:178;;25290:305;;;:::o;48554:215::-;48716:45;48743:4;48749:2;48753:7;48716:26;:45::i;:::-;48554:215;;;:::o;35909:803::-;36064:4;36085:15;:2;:13;;;:15::i;:::-;36081:624;;;36137:2;36121:36;;;36158:12;:10;:12::i;:::-;36172:4;36178:7;36187:5;36121:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36117:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36384:1;36367:6;:13;:18;36363:272;;;36410:60;;;;;;;;;;:::i;:::-;;;;;;;;36363:272;36585:6;36579:13;36570:6;36566:2;36562:15;36555:38;36117:533;36254:45;;;36244:55;;;:6;:55;;;;36237:62;;;;;36081:624;36689:4;36682:11;;35909:803;;;;;;;:::o;49254:106::-;49306:13;49339;49332:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49254:106;:::o;26579:334::-;26652:13;26686:16;26694:7;26686;:16::i;:::-;26678:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;26767:21;26791:10;:8;:10::i;:::-;26767:34;;26843:1;26825:7;26819:21;:25;:86;;;;;;;;;;;;;;;;;26871:7;26880:18;:7;:16;:18::i;:::-;26854:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26819:86;26812:93;;;26579:334;;;:::o;6328:157::-;6413:4;6452:25;6437:40;;;:11;:40;;;;6430:47;;6328:157;;;:::o;39909:589::-;40053:45;40080:4;40086:2;40090:7;40053:26;:45::i;:::-;40131:1;40115:18;;:4;:18;;;40111:187;;;40150:40;40182:7;40150:31;:40::i;:::-;40111:187;;;40220:2;40212:10;;:4;:10;;;40208:90;;40239:47;40272:4;40278:7;40239:32;:47::i;:::-;40208:90;40111:187;40326:1;40312:16;;:2;:16;;;40308:183;;;40345:45;40382:7;40345:36;:45::i;:::-;40308:183;;;40418:4;40412:10;;:2;:10;;;40408:83;;40439:40;40467:2;40471:7;40439:27;:40::i;:::-;40408:83;40308:183;39909:589;;;:::o;9374:387::-;9434:4;9642:12;9709:7;9697:20;9689:28;;9752:1;9745:4;:8;9738:15;;;9374:387;;;:::o;6799:723::-;6855:13;7085:1;7076:5;:10;7072:53;;;7103:10;;;;;;;;;;;;;;;;;;;;;7072:53;7135:12;7150:5;7135:20;;7166:14;7191:78;7206:1;7198:4;:9;7191:78;;7224:8;;;;;:::i;:::-;;;;7255:2;7247:10;;;;;:::i;:::-;;;7191:78;;;7279:19;7311:6;7301:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7279:39;;7329:154;7345:1;7336:5;:10;7329:154;;7373:1;7363:11;;;;;:::i;:::-;;;7440:2;7432:5;:10;;;;:::i;:::-;7419:2;:24;;;;:::i;:::-;7406:39;;7389:6;7396;7389:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;7469:2;7460:11;;;;;:::i;:::-;;;7329:154;;;7507:6;7493:21;;;;;6799:723;;;;:::o;37284:126::-;;;;:::o;41221:164::-;41325:10;:17;;;;41298:15;:24;41314:7;41298:24;;;;;;;;;;;:44;;;;41353:10;41369:7;41353:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41221:164;:::o;42012:988::-;42278:22;42328:1;42303:22;42320:4;42303:16;:22::i;:::-;:26;;;;:::i;:::-;42278:51;;42340:18;42361:17;:26;42379:7;42361:26;;;;;;;;;;;;42340:47;;42508:14;42494:10;:28;42490:328;;42539:19;42561:12;:18;42574:4;42561:18;;;;;;;;;;;;;;;:34;42580:14;42561:34;;;;;;;;;;;;42539:56;;42645:11;42612:12;:18;42625:4;42612:18;;;;;;;;;;;;;;;:30;42631:10;42612:30;;;;;;;;;;;:44;;;;42762:10;42729:17;:30;42747:11;42729:30;;;;;;;;;;;:43;;;;42490:328;;42914:17;:26;42932:7;42914:26;;;;;;;;;;;42907:33;;;42958:12;:18;42971:4;42958:18;;;;;;;;;;;;;;;:34;42977:14;42958:34;;;;;;;;;;;42951:41;;;42012:988;;;;:::o;43295:1079::-;43548:22;43593:1;43573:10;:17;;;;:21;;;;:::i;:::-;43548:46;;43605:18;43626:15;:24;43642:7;43626:24;;;;;;;;;;;;43605:45;;43977:19;43999:10;44010:14;43999:26;;;;;;;;;;;;;;;;;;;;;;;;43977:48;;44063:11;44038:10;44049;44038:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;44174:10;44143:15;:28;44159:11;44143:28;;;;;;;;;;;:41;;;;44315:15;:24;44331:7;44315:24;;;;;;;;;;;44308:31;;;44350:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43295:1079;;;;:::o;40799:221::-;40884:14;40901:20;40918:2;40901:16;:20::i;:::-;40884:37;;40959:7;40932:12;:16;40945:2;40932:16;;;;;;;;;;;;;;;:24;40949:6;40932:24;;;;;;;;;;;:34;;;;41006:6;40977:17;:26;40995:7;40977:26;;;;;;;;;;;:35;;;;40799:221;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:273::-;;1690:3;1683:4;1675:6;1671:17;1667:27;1657:2;;1708:1;1705;1698:12;1657:2;1748:6;1735:20;1773:79;1848:3;1840:6;1833:4;1825:6;1821:17;1773:79;:::i;:::-;1764:88;;1647:211;;;;;:::o;1864:139::-;;1948:6;1935:20;1926:29;;1964:33;1991:5;1964:33;:::i;:::-;1916:87;;;;:::o;2009:143::-;;2097:6;2091:13;2082:22;;2113:33;2140:5;2113:33;:::i;:::-;2072:80;;;;:::o;2158:135::-;;2240:6;2227:20;2218:29;;2256:31;2281:5;2256:31;:::i;:::-;2208:85;;;;:::o;2299:262::-;;2407:2;2395:9;2386:7;2382:23;2378:32;2375:2;;;2423:1;2420;2413:12;2375:2;2466:1;2491:53;2536:7;2527:6;2516:9;2512:22;2491:53;:::i;:::-;2481:63;;2437:117;2365:196;;;;:::o;2567:407::-;;;2692:2;2680:9;2671:7;2667:23;2663:32;2660:2;;;2708:1;2705;2698:12;2660:2;2751:1;2776:53;2821:7;2812:6;2801:9;2797:22;2776:53;:::i;:::-;2766:63;;2722:117;2878:2;2904:53;2949:7;2940:6;2929:9;2925:22;2904:53;:::i;:::-;2894:63;;2849:118;2650:324;;;;;:::o;2980:552::-;;;;3122:2;3110:9;3101:7;3097:23;3093:32;3090:2;;;3138:1;3135;3128:12;3090:2;3181:1;3206:53;3251:7;3242:6;3231:9;3227:22;3206:53;:::i;:::-;3196:63;;3152:117;3308:2;3334:53;3379:7;3370:6;3359:9;3355:22;3334:53;:::i;:::-;3324:63;;3279:118;3436:2;3462:53;3507:7;3498:6;3487:9;3483:22;3462:53;:::i;:::-;3452:63;;3407:118;3080:452;;;;;:::o;3538:809::-;;;;;3706:3;3694:9;3685:7;3681:23;3677:33;3674:2;;;3723:1;3720;3713:12;3674:2;3766:1;3791:53;3836:7;3827:6;3816:9;3812:22;3791:53;:::i;:::-;3781:63;;3737:117;3893:2;3919:53;3964:7;3955:6;3944:9;3940:22;3919:53;:::i;:::-;3909:63;;3864:118;4021:2;4047:53;4092:7;4083:6;4072:9;4068:22;4047:53;:::i;:::-;4037:63;;3992:118;4177:2;4166:9;4162:18;4149:32;4208:18;4200:6;4197:30;4194:2;;;4240:1;4237;4230:12;4194:2;4268:62;4322:7;4313:6;4302:9;4298:22;4268:62;:::i;:::-;4258:72;;4120:220;3664:683;;;;;;;:::o;4353:401::-;;;4475:2;4463:9;4454:7;4450:23;4446:32;4443:2;;;4491:1;4488;4481:12;4443:2;4534:1;4559:53;4604:7;4595:6;4584:9;4580:22;4559:53;:::i;:::-;4549:63;;4505:117;4661:2;4687:50;4729:7;4720:6;4709:9;4705:22;4687:50;:::i;:::-;4677:60;;4632:115;4433:321;;;;;:::o;4760:407::-;;;4885:2;4873:9;4864:7;4860:23;4856:32;4853:2;;;4901:1;4898;4891:12;4853:2;4944:1;4969:53;5014:7;5005:6;4994:9;4990:22;4969:53;:::i;:::-;4959:63;;4915:117;5071:2;5097:53;5142:7;5133:6;5122:9;5118:22;5097:53;:::i;:::-;5087:63;;5042:118;4843:324;;;;;:::o;5173:260::-;;5280:2;5268:9;5259:7;5255:23;5251:32;5248:2;;;5296:1;5293;5286:12;5248:2;5339:1;5364:52;5408:7;5399:6;5388:9;5384:22;5364:52;:::i;:::-;5354:62;;5310:116;5238:195;;;;:::o;5439:282::-;;5557:2;5545:9;5536:7;5532:23;5528:32;5525:2;;;5573:1;5570;5563:12;5525:2;5616:1;5641:63;5696:7;5687:6;5676:9;5672:22;5641:63;:::i;:::-;5631:73;;5587:127;5515:206;;;;:::o;5727:375::-;;5845:2;5833:9;5824:7;5820:23;5816:32;5813:2;;;5861:1;5858;5851:12;5813:2;5932:1;5921:9;5917:17;5904:31;5962:18;5954:6;5951:30;5948:2;;;5994:1;5991;5984:12;5948:2;6022:63;6077:7;6068:6;6057:9;6053:22;6022:63;:::i;:::-;6012:73;;5875:220;5803:299;;;;:::o;6108:262::-;;6216:2;6204:9;6195:7;6191:23;6187:32;6184:2;;;6232:1;6229;6222:12;6184:2;6275:1;6300:53;6345:7;6336:6;6325:9;6321:22;6300:53;:::i;:::-;6290:63;;6246:117;6174:196;;;;:::o;6376:284::-;;6495:2;6483:9;6474:7;6470:23;6466:32;6463:2;;;6511:1;6508;6501:12;6463:2;6554:1;6579:64;6635:7;6626:6;6615:9;6611:22;6579:64;:::i;:::-;6569:74;;6525:128;6453:207;;;;:::o;6666:258::-;;6772:2;6760:9;6751:7;6747:23;6743:32;6740:2;;;6788:1;6785;6778:12;6740:2;6831:1;6856:51;6899:7;6890:6;6879:9;6875:22;6856:51;:::i;:::-;6846:61;;6802:115;6730:194;;;;:::o;6930:118::-;7017:24;7035:5;7017:24;:::i;:::-;7012:3;7005:37;6995:53;;:::o;7054:109::-;7135:21;7150:5;7135:21;:::i;:::-;7130:3;7123:34;7113:50;;:::o;7169:360::-;;7283:38;7315:5;7283:38;:::i;:::-;7337:70;7400:6;7395:3;7337:70;:::i;:::-;7330:77;;7416:52;7461:6;7456:3;7449:4;7442:5;7438:16;7416:52;:::i;:::-;7493:29;7515:6;7493:29;:::i;:::-;7488:3;7484:39;7477:46;;7259:270;;;;;:::o;7535:364::-;;7651:39;7684:5;7651:39;:::i;:::-;7706:71;7770:6;7765:3;7706:71;:::i;:::-;7699:78;;7786:52;7831:6;7826:3;7819:4;7812:5;7808:16;7786:52;:::i;:::-;7863:29;7885:6;7863:29;:::i;:::-;7858:3;7854:39;7847:46;;7627:272;;;;;:::o;7905:377::-;;8039:39;8072:5;8039:39;:::i;:::-;8094:89;8176:6;8171:3;8094:89;:::i;:::-;8087:96;;8192:52;8237:6;8232:3;8225:4;8218:5;8214:16;8192:52;:::i;:::-;8269:6;8264:3;8260:16;8253:23;;8015:267;;;;;:::o;8288:366::-;;8451:67;8515:2;8510:3;8451:67;:::i;:::-;8444:74;;8527:93;8616:3;8527:93;:::i;:::-;8645:2;8640:3;8636:12;8629:19;;8434:220;;;:::o;8660:366::-;;8823:67;8887:2;8882:3;8823:67;:::i;:::-;8816:74;;8899:93;8988:3;8899:93;:::i;:::-;9017:2;9012:3;9008:12;9001:19;;8806:220;;;:::o;9032:366::-;;9195:67;9259:2;9254:3;9195:67;:::i;:::-;9188:74;;9271:93;9360:3;9271:93;:::i;:::-;9389:2;9384:3;9380:12;9373:19;;9178:220;;;:::o;9404:366::-;;9567:67;9631:2;9626:3;9567:67;:::i;:::-;9560:74;;9643:93;9732:3;9643:93;:::i;:::-;9761:2;9756:3;9752:12;9745:19;;9550:220;;;:::o;9776:366::-;;9939:67;10003:2;9998:3;9939:67;:::i;:::-;9932:74;;10015:93;10104:3;10015:93;:::i;:::-;10133:2;10128:3;10124:12;10117:19;;9922:220;;;:::o;10148:366::-;;10311:67;10375:2;10370:3;10311:67;:::i;:::-;10304:74;;10387:93;10476:3;10387:93;:::i;:::-;10505:2;10500:3;10496:12;10489:19;;10294:220;;;:::o;10520:366::-;;10683:67;10747:2;10742:3;10683:67;:::i;:::-;10676:74;;10759:93;10848:3;10759:93;:::i;:::-;10877:2;10872:3;10868:12;10861:19;;10666:220;;;:::o;10892:366::-;;11055:67;11119:2;11114:3;11055:67;:::i;:::-;11048:74;;11131:93;11220:3;11131:93;:::i;:::-;11249:2;11244:3;11240:12;11233:19;;11038:220;;;:::o;11264:366::-;;11427:67;11491:2;11486:3;11427:67;:::i;:::-;11420:74;;11503:93;11592:3;11503:93;:::i;:::-;11621:2;11616:3;11612:12;11605:19;;11410:220;;;:::o;11636:366::-;;11799:67;11863:2;11858:3;11799:67;:::i;:::-;11792:74;;11875:93;11964:3;11875:93;:::i;:::-;11993:2;11988:3;11984:12;11977:19;;11782:220;;;:::o;12008:366::-;;12171:67;12235:2;12230:3;12171:67;:::i;:::-;12164:74;;12247:93;12336:3;12247:93;:::i;:::-;12365:2;12360:3;12356:12;12349:19;;12154:220;;;:::o;12380:366::-;;12543:67;12607:2;12602:3;12543:67;:::i;:::-;12536:74;;12619:93;12708:3;12619:93;:::i;:::-;12737:2;12732:3;12728:12;12721:19;;12526:220;;;:::o;12752:366::-;;12915:67;12979:2;12974:3;12915:67;:::i;:::-;12908:74;;12991:93;13080:3;12991:93;:::i;:::-;13109:2;13104:3;13100:12;13093:19;;12898:220;;;:::o;13124:366::-;;13287:67;13351:2;13346:3;13287:67;:::i;:::-;13280:74;;13363:93;13452:3;13363:93;:::i;:::-;13481:2;13476:3;13472:12;13465:19;;13270:220;;;:::o;13496:366::-;;13659:67;13723:2;13718:3;13659:67;:::i;:::-;13652:74;;13735:93;13824:3;13735:93;:::i;:::-;13853:2;13848:3;13844:12;13837:19;;13642:220;;;:::o;13868:366::-;;14031:67;14095:2;14090:3;14031:67;:::i;:::-;14024:74;;14107:93;14196:3;14107:93;:::i;:::-;14225:2;14220:3;14216:12;14209:19;;14014:220;;;:::o;14240:366::-;;14403:67;14467:2;14462:3;14403:67;:::i;:::-;14396:74;;14479:93;14568:3;14479:93;:::i;:::-;14597:2;14592:3;14588:12;14581:19;;14386:220;;;:::o;14612:366::-;;14775:67;14839:2;14834:3;14775:67;:::i;:::-;14768:74;;14851:93;14940:3;14851:93;:::i;:::-;14969:2;14964:3;14960:12;14953:19;;14758:220;;;:::o;14984:366::-;;15147:67;15211:2;15206:3;15147:67;:::i;:::-;15140:74;;15223:93;15312:3;15223:93;:::i;:::-;15341:2;15336:3;15332:12;15325:19;;15130:220;;;:::o;15356:366::-;;15519:67;15583:2;15578:3;15519:67;:::i;:::-;15512:74;;15595:93;15684:3;15595:93;:::i;:::-;15713:2;15708:3;15704:12;15697:19;;15502:220;;;:::o;15728:366::-;;15891:67;15955:2;15950:3;15891:67;:::i;:::-;15884:74;;15967:93;16056:3;15967:93;:::i;:::-;16085:2;16080:3;16076:12;16069:19;;15874:220;;;:::o;16100:366::-;;16263:67;16327:2;16322:3;16263:67;:::i;:::-;16256:74;;16339:93;16428:3;16339:93;:::i;:::-;16457:2;16452:3;16448:12;16441:19;;16246:220;;;:::o;16472:366::-;;16635:67;16699:2;16694:3;16635:67;:::i;:::-;16628:74;;16711:93;16800:3;16711:93;:::i;:::-;16829:2;16824:3;16820:12;16813:19;;16618:220;;;:::o;16844:366::-;;17007:67;17071:2;17066:3;17007:67;:::i;:::-;17000:74;;17083:93;17172:3;17083:93;:::i;:::-;17201:2;17196:3;17192:12;17185:19;;16990:220;;;:::o;17216:366::-;;17379:67;17443:2;17438:3;17379:67;:::i;:::-;17372:74;;17455:93;17544:3;17455:93;:::i;:::-;17573:2;17568:3;17564:12;17557:19;;17362:220;;;:::o;17588:366::-;;17751:67;17815:2;17810:3;17751:67;:::i;:::-;17744:74;;17827:93;17916:3;17827:93;:::i;:::-;17945:2;17940:3;17936:12;17929:19;;17734:220;;;:::o;17960:398::-;;18140:83;18221:1;18216:3;18140:83;:::i;:::-;18133:90;;18232:93;18321:3;18232:93;:::i;:::-;18350:1;18345:3;18341:11;18334:18;;18123:235;;;:::o;18364:366::-;;18527:67;18591:2;18586:3;18527:67;:::i;:::-;18520:74;;18603:93;18692:3;18603:93;:::i;:::-;18721:2;18716:3;18712:12;18705:19;;18510:220;;;:::o;18736:366::-;;18899:67;18963:2;18958:3;18899:67;:::i;:::-;18892:74;;18975:93;19064:3;18975:93;:::i;:::-;19093:2;19088:3;19084:12;19077:19;;18882:220;;;:::o;19108:366::-;;19271:67;19335:2;19330:3;19271:67;:::i;:::-;19264:74;;19347:93;19436:3;19347:93;:::i;:::-;19465:2;19460:3;19456:12;19449:19;;19254:220;;;:::o;19480:366::-;;19643:67;19707:2;19702:3;19643:67;:::i;:::-;19636:74;;19719:93;19808:3;19719:93;:::i;:::-;19837:2;19832:3;19828:12;19821:19;;19626:220;;;:::o;19852:115::-;19937:23;19954:5;19937:23;:::i;:::-;19932:3;19925:36;19915:52;;:::o;19973:118::-;20060:24;20078:5;20060:24;:::i;:::-;20055:3;20048:37;20038:53;;:::o;20097:115::-;20182:23;20199:5;20182:23;:::i;:::-;20177:3;20170:36;20160:52;;:::o;20218:127::-;20303:35;20332:5;20303:35;:::i;:::-;20298:3;20291:48;20281:64;;:::o;20351:112::-;20434:22;20450:5;20434:22;:::i;:::-;20429:3;20422:35;20412:51;;:::o;20469:435::-;;20671:95;20762:3;20753:6;20671:95;:::i;:::-;20664:102;;20783:95;20874:3;20865:6;20783:95;:::i;:::-;20776:102;;20895:3;20888:10;;20653:251;;;;;:::o;20910:379::-;;21116:147;21259:3;21116:147;:::i;:::-;21109:154;;21280:3;21273:10;;21098:191;;;:::o;21295:222::-;;21426:2;21415:9;21411:18;21403:26;;21439:71;21507:1;21496:9;21492:17;21483:6;21439:71;:::i;:::-;21393:124;;;;:::o;21523:640::-;;21756:3;21745:9;21741:19;21733:27;;21770:71;21838:1;21827:9;21823:17;21814:6;21770:71;:::i;:::-;21851:72;21919:2;21908:9;21904:18;21895:6;21851:72;:::i;:::-;21933;22001:2;21990:9;21986:18;21977:6;21933:72;:::i;:::-;22052:9;22046:4;22042:20;22037:2;22026:9;22022:18;22015:48;22080:76;22151:4;22142:6;22080:76;:::i;:::-;22072:84;;21723:440;;;;;;;:::o;22169:328::-;;22326:2;22315:9;22311:18;22303:26;;22339:71;22407:1;22396:9;22392:17;22383:6;22339:71;:::i;:::-;22420:70;22486:2;22475:9;22471:18;22462:6;22420:70;:::i;:::-;22293:204;;;;;:::o;22503:210::-;;22628:2;22617:9;22613:18;22605:26;;22641:65;22703:1;22692:9;22688:17;22679:6;22641:65;:::i;:::-;22595:118;;;;:::o;22719:313::-;;22870:2;22859:9;22855:18;22847:26;;22919:9;22913:4;22909:20;22905:1;22894:9;22890:17;22883:47;22947:78;23020:4;23011:6;22947:78;:::i;:::-;22939:86;;22837:195;;;;:::o;23038:419::-;;23242:2;23231:9;23227:18;23219:26;;23291:9;23285:4;23281:20;23277:1;23266:9;23262:17;23255:47;23319:131;23445:4;23319:131;:::i;:::-;23311:139;;23209:248;;;:::o;23463:419::-;;23667:2;23656:9;23652:18;23644:26;;23716:9;23710:4;23706:20;23702:1;23691:9;23687:17;23680:47;23744:131;23870:4;23744:131;:::i;:::-;23736:139;;23634:248;;;:::o;23888:419::-;;24092:2;24081:9;24077:18;24069:26;;24141:9;24135:4;24131:20;24127:1;24116:9;24112:17;24105:47;24169:131;24295:4;24169:131;:::i;:::-;24161:139;;24059:248;;;:::o;24313:419::-;;24517:2;24506:9;24502:18;24494:26;;24566:9;24560:4;24556:20;24552:1;24541:9;24537:17;24530:47;24594:131;24720:4;24594:131;:::i;:::-;24586:139;;24484:248;;;:::o;24738:419::-;;24942:2;24931:9;24927:18;24919:26;;24991:9;24985:4;24981:20;24977:1;24966:9;24962:17;24955:47;25019:131;25145:4;25019:131;:::i;:::-;25011:139;;24909:248;;;:::o;25163:419::-;;25367:2;25356:9;25352:18;25344:26;;25416:9;25410:4;25406:20;25402:1;25391:9;25387:17;25380:47;25444:131;25570:4;25444:131;:::i;:::-;25436:139;;25334:248;;;:::o;25588:419::-;;25792:2;25781:9;25777:18;25769:26;;25841:9;25835:4;25831:20;25827:1;25816:9;25812:17;25805:47;25869:131;25995:4;25869:131;:::i;:::-;25861:139;;25759:248;;;:::o;26013:419::-;;26217:2;26206:9;26202:18;26194:26;;26266:9;26260:4;26256:20;26252:1;26241:9;26237:17;26230:47;26294:131;26420:4;26294:131;:::i;:::-;26286:139;;26184:248;;;:::o;26438:419::-;;26642:2;26631:9;26627:18;26619:26;;26691:9;26685:4;26681:20;26677:1;26666:9;26662:17;26655:47;26719:131;26845:4;26719:131;:::i;:::-;26711:139;;26609:248;;;:::o;26863:419::-;;27067:2;27056:9;27052:18;27044:26;;27116:9;27110:4;27106:20;27102:1;27091:9;27087:17;27080:47;27144:131;27270:4;27144:131;:::i;:::-;27136:139;;27034:248;;;:::o;27288:419::-;;27492:2;27481:9;27477:18;27469:26;;27541:9;27535:4;27531:20;27527:1;27516:9;27512:17;27505:47;27569:131;27695:4;27569:131;:::i;:::-;27561:139;;27459:248;;;:::o;27713:419::-;;27917:2;27906:9;27902:18;27894:26;;27966:9;27960:4;27956:20;27952:1;27941:9;27937:17;27930:47;27994:131;28120:4;27994:131;:::i;:::-;27986:139;;27884:248;;;:::o;28138:419::-;;28342:2;28331:9;28327:18;28319:26;;28391:9;28385:4;28381:20;28377:1;28366:9;28362:17;28355:47;28419:131;28545:4;28419:131;:::i;:::-;28411:139;;28309:248;;;:::o;28563:419::-;;28767:2;28756:9;28752:18;28744:26;;28816:9;28810:4;28806:20;28802:1;28791:9;28787:17;28780:47;28844:131;28970:4;28844:131;:::i;:::-;28836:139;;28734:248;;;:::o;28988:419::-;;29192:2;29181:9;29177:18;29169:26;;29241:9;29235:4;29231:20;29227:1;29216:9;29212:17;29205:47;29269:131;29395:4;29269:131;:::i;:::-;29261:139;;29159:248;;;:::o;29413:419::-;;29617:2;29606:9;29602:18;29594:26;;29666:9;29660:4;29656:20;29652:1;29641:9;29637:17;29630:47;29694:131;29820:4;29694:131;:::i;:::-;29686:139;;29584:248;;;:::o;29838:419::-;;30042:2;30031:9;30027:18;30019:26;;30091:9;30085:4;30081:20;30077:1;30066:9;30062:17;30055:47;30119:131;30245:4;30119:131;:::i;:::-;30111:139;;30009:248;;;:::o;30263:419::-;;30467:2;30456:9;30452:18;30444:26;;30516:9;30510:4;30506:20;30502:1;30491:9;30487:17;30480:47;30544:131;30670:4;30544:131;:::i;:::-;30536:139;;30434:248;;;:::o;30688:419::-;;30892:2;30881:9;30877:18;30869:26;;30941:9;30935:4;30931:20;30927:1;30916:9;30912:17;30905:47;30969:131;31095:4;30969:131;:::i;:::-;30961:139;;30859:248;;;:::o;31113:419::-;;31317:2;31306:9;31302:18;31294:26;;31366:9;31360:4;31356:20;31352:1;31341:9;31337:17;31330:47;31394:131;31520:4;31394:131;:::i;:::-;31386:139;;31284:248;;;:::o;31538:419::-;;31742:2;31731:9;31727:18;31719:26;;31791:9;31785:4;31781:20;31777:1;31766:9;31762:17;31755:47;31819:131;31945:4;31819:131;:::i;:::-;31811:139;;31709:248;;;:::o;31963:419::-;;32167:2;32156:9;32152:18;32144:26;;32216:9;32210:4;32206:20;32202:1;32191:9;32187:17;32180:47;32244:131;32370:4;32244:131;:::i;:::-;32236:139;;32134:248;;;:::o;32388:419::-;;32592:2;32581:9;32577:18;32569:26;;32641:9;32635:4;32631:20;32627:1;32616:9;32612:17;32605:47;32669:131;32795:4;32669:131;:::i;:::-;32661:139;;32559:248;;;:::o;32813:419::-;;33017:2;33006:9;33002:18;32994:26;;33066:9;33060:4;33056:20;33052:1;33041:9;33037:17;33030:47;33094:131;33220:4;33094:131;:::i;:::-;33086:139;;32984:248;;;:::o;33238:419::-;;33442:2;33431:9;33427:18;33419:26;;33491:9;33485:4;33481:20;33477:1;33466:9;33462:17;33455:47;33519:131;33645:4;33519:131;:::i;:::-;33511:139;;33409:248;;;:::o;33663:419::-;;33867:2;33856:9;33852:18;33844:26;;33916:9;33910:4;33906:20;33902:1;33891:9;33887:17;33880:47;33944:131;34070:4;33944:131;:::i;:::-;33936:139;;33834:248;;;:::o;34088:419::-;;34292:2;34281:9;34277:18;34269:26;;34341:9;34335:4;34331:20;34327:1;34316:9;34312:17;34305:47;34369:131;34495:4;34369:131;:::i;:::-;34361:139;;34259:248;;;:::o;34513:419::-;;34717:2;34706:9;34702:18;34694:26;;34766:9;34760:4;34756:20;34752:1;34741:9;34737:17;34730:47;34794:131;34920:4;34794:131;:::i;:::-;34786:139;;34684:248;;;:::o;34938:419::-;;35142:2;35131:9;35127:18;35119:26;;35191:9;35185:4;35181:20;35177:1;35166:9;35162:17;35155:47;35219:131;35345:4;35219:131;:::i;:::-;35211:139;;35109:248;;;:::o;35363:419::-;;35567:2;35556:9;35552:18;35544:26;;35616:9;35610:4;35606:20;35602:1;35591:9;35587:17;35580:47;35644:131;35770:4;35644:131;:::i;:::-;35636:139;;35534:248;;;:::o;35788:218::-;;35917:2;35906:9;35902:18;35894:26;;35930:69;35996:1;35985:9;35981:17;35972:6;35930:69;:::i;:::-;35884:122;;;;:::o;36012:222::-;;36143:2;36132:9;36128:18;36120:26;;36156:71;36224:1;36213:9;36209:17;36200:6;36156:71;:::i;:::-;36110:124;;;;:::o;36240:218::-;;36369:2;36358:9;36354:18;36346:26;;36382:69;36448:1;36437:9;36433:17;36424:6;36382:69;:::i;:::-;36336:122;;;;:::o;36464:214::-;;36591:2;36580:9;36576:18;36568:26;;36604:67;36668:1;36657:9;36653:17;36644:6;36604:67;:::i;:::-;36558:120;;;;:::o;36684:129::-;;36745:20;;:::i;:::-;36735:30;;36774:33;36802:4;36794:6;36774:33;:::i;:::-;36725:88;;;:::o;36819:75::-;;36885:2;36879:9;36869:19;;36859:35;:::o;36900:307::-;;37051:18;37043:6;37040:30;37037:2;;;37073:18;;:::i;:::-;37037:2;37111:29;37133:6;37111:29;:::i;:::-;37103:37;;37195:4;37189;37185:15;37177:23;;36966:241;;;:::o;37213:308::-;;37365:18;37357:6;37354:30;37351:2;;;37387:18;;:::i;:::-;37351:2;37425:29;37447:6;37425:29;:::i;:::-;37417:37;;37509:4;37503;37499:15;37491:23;;37280:241;;;:::o;37527:98::-;;37612:5;37606:12;37596:22;;37585:40;;;:::o;37631:99::-;;37717:5;37711:12;37701:22;;37690:40;;;:::o;37736:168::-;;37853:6;37848:3;37841:19;37893:4;37888:3;37884:14;37869:29;;37831:73;;;;:::o;37910:147::-;;38048:3;38033:18;;38023:34;;;;:::o;38063:169::-;;38181:6;38176:3;38169:19;38221:4;38216:3;38212:14;38197:29;;38159:73;;;;:::o;38238:148::-;;38377:3;38362:18;;38352:34;;;;:::o;38392:305::-;;38451:20;38469:1;38451:20;:::i;:::-;38446:25;;38485:20;38503:1;38485:20;:::i;:::-;38480:25;;38639:1;38571:66;38567:74;38564:1;38561:81;38558:2;;;38645:18;;:::i;:::-;38558:2;38689:1;38686;38682:9;38675:16;;38436:261;;;;:::o;38703:237::-;;38760:18;38776:1;38760:18;:::i;:::-;38755:23;;38792:18;38808:1;38792:18;:::i;:::-;38787:23;;38882:1;38876:4;38872:12;38869:1;38866:19;38863:2;;;38888:18;;:::i;:::-;38863:2;38932:1;38929;38925:9;38918:16;;38745:195;;;;:::o;38946:185::-;;39003:20;39021:1;39003:20;:::i;:::-;38998:25;;39037:20;39055:1;39037:20;:::i;:::-;39032:25;;39076:1;39066:2;;39081:18;;:::i;:::-;39066:2;39123:1;39120;39116:9;39111:14;;38988:143;;;;:::o;39137:297::-;;39199:19;39216:1;39199:19;:::i;:::-;39194:24;;39232:19;39249:1;39232:19;:::i;:::-;39227:24;;39371:1;39351:18;39347:26;39344:1;39341:33;39336:1;39329:9;39322:17;39318:57;39315:2;;;39378:18;;:::i;:::-;39315:2;39426:1;39423;39419:9;39408:20;;39184:250;;;;:::o;39440:191::-;;39500:20;39518:1;39500:20;:::i;:::-;39495:25;;39534:20;39552:1;39534:20;:::i;:::-;39529:25;;39573:1;39570;39567:8;39564:2;;;39578:18;;:::i;:::-;39564:2;39623:1;39620;39616:9;39608:17;;39485:146;;;;:::o;39637:96::-;;39703:24;39721:5;39703:24;:::i;:::-;39692:35;;39682:51;;;:::o;39739:90::-;;39816:5;39809:13;39802:21;39791:32;;39781:48;;;:::o;39835:149::-;;39911:66;39904:5;39900:78;39889:89;;39879:105;;;:::o;39990:89::-;;40066:6;40059:5;40055:18;40044:29;;40034:45;;;:::o;40085:126::-;;40162:42;40155:5;40151:54;40140:65;;40130:81;;;:::o;40217:77::-;;40283:5;40272:16;;40262:32;;;:::o;40300:101::-;;40376:18;40369:5;40365:30;40354:41;;40344:57;;;:::o;40407:86::-;;40482:4;40475:5;40471:16;40460:27;;40450:43;;;:::o;40499:109::-;;40580:22;40596:5;40580:22;:::i;:::-;40567:35;;40557:51;;;:::o;40614:154::-;40698:6;40693:3;40688;40675:30;40760:1;40751:6;40746:3;40742:16;40735:27;40665:103;;;:::o;40774:307::-;40842:1;40852:113;40866:6;40863:1;40860:13;40852:113;;;40951:1;40946:3;40942:11;40936:18;40932:1;40927:3;40923:11;40916:39;40888:2;40885:1;40881:10;40876:15;;40852:113;;;40983:6;40980:1;40977:13;40974:2;;;41063:1;41054:6;41049:3;41045:16;41038:27;40974:2;40823:258;;;;:::o;41087:320::-;;41168:1;41162:4;41158:12;41148:22;;41215:1;41209:4;41205:12;41236:18;41226:2;;41292:4;41284:6;41280:17;41270:27;;41226:2;41354;41346:6;41343:14;41323:18;41320:38;41317:2;;;41373:18;;:::i;:::-;41317:2;41138:269;;;;:::o;41413:281::-;41496:27;41518:4;41496:27;:::i;:::-;41488:6;41484:40;41626:6;41614:10;41611:22;41590:18;41578:10;41575:34;41572:62;41569:2;;;41637:18;;:::i;:::-;41569:2;41677:10;41673:2;41666:22;41456:238;;;:::o;41700:233::-;;41762:24;41780:5;41762:24;:::i;:::-;41753:33;;41808:66;41801:5;41798:77;41795:2;;;41878:18;;:::i;:::-;41795:2;41925:1;41918:5;41914:13;41907:20;;41743:190;;;:::o;41939:167::-;;41999:22;42015:5;41999:22;:::i;:::-;41990:31;;42043:4;42036:5;42033:15;42030:2;;;42051:18;;:::i;:::-;42030:2;42098:1;42091:5;42087:13;42080:20;;41980:126;;;:::o;42112:176::-;;42161:20;42179:1;42161:20;:::i;:::-;42156:25;;42195:20;42213:1;42195:20;:::i;:::-;42190:25;;42234:1;42224:2;;42239:18;;:::i;:::-;42224:2;42280:1;42277;42273:9;42268:14;;42146:142;;;;:::o;42294:180::-;42342:77;42339:1;42332:88;42439:4;42436:1;42429:15;42463:4;42460:1;42453:15;42480:180;42528:77;42525:1;42518:88;42625:4;42622:1;42615:15;42649:4;42646:1;42639:15;42666:180;42714:77;42711:1;42704:88;42811:4;42808:1;42801:15;42835:4;42832:1;42825:15;42852:180;42900:77;42897:1;42890:88;42997:4;42994:1;42987:15;43021:4;43018:1;43011:15;43038:102;;43130:2;43126:7;43121:2;43114:5;43110:14;43106:28;43096:38;;43086:54;;;:::o;43146:230::-;43286:34;43282:1;43274:6;43270:14;43263:58;43355:13;43350:2;43342:6;43338:15;43331:38;43252:124;:::o;43382:231::-;43522:34;43518:1;43510:6;43506:14;43499:58;43591:14;43586:2;43578:6;43574:15;43567:39;43488:125;:::o;43619:237::-;43759:34;43755:1;43747:6;43743:14;43736:58;43828:20;43823:2;43815:6;43811:15;43804:45;43725:131;:::o;43862:225::-;44002:34;43998:1;43990:6;43986:14;43979:58;44071:8;44066:2;44058:6;44054:15;44047:33;43968:119;:::o;44093:178::-;44233:30;44229:1;44221:6;44217:14;44210:54;44199:72;:::o;44277:175::-;44417:27;44413:1;44405:6;44401:14;44394:51;44383:69;:::o;44458:174::-;44598:26;44594:1;44586:6;44582:14;44575:50;44564:68;:::o;44638:248::-;44778:34;44774:1;44766:6;44762:14;44755:58;44847:31;44842:2;44834:6;44830:15;44823:56;44744:142;:::o;44892:223::-;45032:34;45028:1;45020:6;45016:14;45009:58;45101:6;45096:2;45088:6;45084:15;45077:31;44998:117;:::o;45121:175::-;45261:27;45257:1;45249:6;45245:14;45238:51;45227:69;:::o;45302:231::-;45442:34;45438:1;45430:6;45426:14;45419:58;45511:14;45506:2;45498:6;45494:15;45487:39;45408:125;:::o;45539:243::-;45679:34;45675:1;45667:6;45663:14;45656:58;45748:26;45743:2;45735:6;45731:15;45724:51;45645:137;:::o;45788:229::-;45928:34;45924:1;45916:6;45912:14;45905:58;45997:12;45992:2;45984:6;45980:15;45973:37;45894:123;:::o;46023:228::-;46163:34;46159:1;46151:6;46147:14;46140:58;46232:11;46227:2;46219:6;46215:15;46208:36;46129:122;:::o;46257:182::-;46397:34;46393:1;46385:6;46381:14;46374:58;46363:76;:::o;46445:236::-;46585:34;46581:1;46573:6;46569:14;46562:58;46654:19;46649:2;46641:6;46637:15;46630:44;46551:130;:::o;46687:231::-;46827:34;46823:1;46815:6;46811:14;46804:58;46896:14;46891:2;46883:6;46879:15;46872:39;46793:125;:::o;46924:182::-;47064:34;47060:1;47052:6;47048:14;47041:58;47030:76;:::o;47112:228::-;47252:34;47248:1;47240:6;47236:14;47229:58;47321:11;47316:2;47308:6;47304:15;47297:36;47218:122;:::o;47346:234::-;47486:34;47482:1;47474:6;47470:14;47463:58;47555:17;47550:2;47542:6;47538:15;47531:42;47452:128;:::o;47586:174::-;47726:26;47722:1;47714:6;47710:14;47703:50;47692:68;:::o;47766:173::-;47906:25;47902:1;47894:6;47890:14;47883:49;47872:67;:::o;47945:220::-;48085:34;48081:1;48073:6;48069:14;48062:58;48154:3;48149:2;48141:6;48137:15;48130:28;48051:114;:::o;48171:172::-;48311:24;48307:1;48299:6;48295:14;48288:48;48277:66;:::o;48349:170::-;48489:22;48485:1;48477:6;48473:14;48466:46;48455:64;:::o;48525:166::-;48665:18;48661:1;48653:6;48649:14;48642:42;48631:60;:::o;48697:114::-;48803:8;:::o;48817:236::-;48957:34;48953:1;48945:6;48941:14;48934:58;49026:19;49021:2;49013:6;49009:15;49002:44;48923:130;:::o;49059:176::-;49199:28;49195:1;49187:6;49183:14;49176:52;49165:70;:::o;49241:231::-;49381:34;49377:1;49369:6;49365:14;49358:58;49450:14;49445:2;49437:6;49433:15;49426:39;49347:125;:::o;49478:167::-;49618:19;49614:1;49606:6;49602:14;49595:43;49584:61;:::o;49651:122::-;49724:24;49742:5;49724:24;:::i;:::-;49717:5;49714:35;49704:2;;49763:1;49760;49753:12;49704:2;49694:79;:::o;49779:116::-;49849:21;49864:5;49849:21;:::i;:::-;49842:5;49839:32;49829:2;;49885:1;49882;49875:12;49829:2;49819:76;:::o;49901:120::-;49973:23;49990:5;49973:23;:::i;:::-;49966:5;49963:34;49953:2;;50011:1;50008;50001:12;49953:2;49943:78;:::o;50027:122::-;50100:24;50118:5;50100:24;:::i;:::-;50093:5;50090:35;50080:2;;50139:1;50136;50129:12;50080:2;50070:79;:::o;50155:118::-;50226:22;50242:5;50226:22;:::i;:::-;50219:5;50216:33;50206:2;;50263:1;50260;50253:12;50206:2;50196:77;:::o

Swarm Source

ipfs://8475b9af2191ae590ce30554f41a19f1fe1f033b8b463c23d7a52891a84a9b50
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.