ETH Price: $2,878.08 (-5.68%)
Gas: 2 Gwei

Token

CatBloxGenesis (CATBLOXGEN)
 

Overview

Max Total Supply

9,999 CATBLOXGEN

Holders

4,486

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
chrispyk.eth
Balance
2 CATBLOXGEN
0x67595441da805fa6ca76caa28b9c0ca7af294a81
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Welcome to the cute and pudgy world of CatBlox. 9999 uniquely beautiful generative cats here to take over the world.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
CatBloxGenesis

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-15
*/

// File: @openzeppelin/contracts/utils/math/SafeMath.sol


// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: @openzeppelin/contracts/interfaces/IERC20.sol


// OpenZeppelin Contracts v4.4.1 (interfaces/IERC20.sol)

pragma solidity ^0.8.0;


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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (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 {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

        _afterTokenTransfer(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 from incorrect owner");
        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);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// File: contracts/CatBloxGenesis.sol

//SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

contract CatBloxGenesis is ERC721, Ownable, ReentrancyGuard {
    using Counters for Counters.Counter;
    using Strings for uint256;

    Counters.Counter private tokenCounter;

    string public baseURI;
    string public provenanceHash;

    uint256 public constant MAX_CATS_PER_WALLET = 2;
    uint256 public immutable maxCats;

    bool public isMilkListActive;
    bool public isReserveListActive;
    bool public isPublicSaleActive;

    uint256 public milkListSalePrice = 0.18 ether;
    uint256 public reserveListSalePrice = 0.22 ether;
    uint256 public publicSalePrice = 0.22 ether;

    bytes32 public milkListMerkleRoot;
    bytes32 public reserveListMerkleRoot;

    mapping(address => uint256) public milkListMintCounts;
    mapping(address => uint256) public reserveListMintCounts;
    mapping(address => uint256) public publicListMintCounts;

    // ============ ACCESS CONTROL/SANITY MODIFIERS ============

    modifier milkListActive() {
        require(isMilkListActive, "Milk list not active");
        _;
    }
    
    modifier reserveListActive() {
        require(isReserveListActive, "Reserve list not active");
        _;
    }

    modifier publicSaleActive() {
        require(isPublicSaleActive, "Public sale not active");
        _;
    }

    modifier totalNotExceeded(uint256 numberOfTokens) {
        require(
            tokenCounter.current() + numberOfTokens <= maxCats,
            "Not enough cats remaining to mint"
        );
        _;
    }

    modifier isCorrectPayment(uint256 price, uint256 numberOfTokens) {
        require(
            price * numberOfTokens == msg.value,
            "Incorrect ETH value sent"
        );
        _;
    }

    modifier isValidMerkleProof(bytes32[] calldata merkleProof, bytes32 root) {
        require(
            MerkleProof.verify(
                merkleProof,
                root,
                keccak256(abi.encodePacked(msg.sender))
            ),
            "Address does not exist in list"
        );
        _;
    }

    constructor(string memory _baseURI, uint256 _maxCats) ERC721("CatBloxGenesis", "CATBLOXGEN") {
        baseURI = _baseURI;
        maxCats = _maxCats;
    }

    // ============ OWNER ONLY FUNCTION FOR MINTING ============

    function mintToTeam(uint256 numberOfTokens, address recipient)
        external
        onlyOwner
        totalNotExceeded(numberOfTokens)
    {
        for (uint256 i = 0; i < numberOfTokens; i++) {
            _safeMint(recipient, nextTokenId());
        }
    }

    // ============ PUBLIC FUNCTIONS FOR MINTING ============

    function mintMilkListSale(
        uint8 numberOfTokens,
        bytes32[] calldata merkleProof
    )
        external
        payable
        nonReentrant
        milkListActive
        isCorrectPayment(milkListSalePrice, numberOfTokens)
        totalNotExceeded(numberOfTokens)
        isValidMerkleProof(merkleProof, milkListMerkleRoot)
    {
        uint256 numAlreadyMinted = milkListMintCounts[msg.sender];
        require(numAlreadyMinted + numberOfTokens <= MAX_CATS_PER_WALLET, "ML: Two cats max per wallet");
        milkListMintCounts[msg.sender] = numAlreadyMinted + numberOfTokens;

        for (uint256 i = 0; i < numberOfTokens; i++) {
            _safeMint(msg.sender, nextTokenId());
        }
    }

    function mintReserveListSale(
        uint8 numberOfTokens,
        bytes32[] calldata merkleProof
    )
        external
        payable
        nonReentrant
        reserveListActive
        isCorrectPayment(reserveListSalePrice, numberOfTokens)
        totalNotExceeded(numberOfTokens)
        isValidMerkleProof(merkleProof, reserveListMerkleRoot)
    {
        uint256 numAlreadyMinted = reserveListMintCounts[msg.sender];
        require(numAlreadyMinted + numberOfTokens <= MAX_CATS_PER_WALLET, "RL: Two cats max per wallet");
        reserveListMintCounts[msg.sender] = numAlreadyMinted + numberOfTokens;

        for (uint256 i = 0; i < numberOfTokens; i++) {
            _safeMint(msg.sender, nextTokenId());
        }
    }

    function publicMint(uint256 numberOfTokens)
        external
        payable
        nonReentrant
        publicSaleActive
        isCorrectPayment(publicSalePrice, numberOfTokens)
        totalNotExceeded(numberOfTokens)
    {
        uint256 numAlreadyMinted = publicListMintCounts[msg.sender];
        require(numAlreadyMinted + numberOfTokens <= MAX_CATS_PER_WALLET, "PM: Two cats max per wallet");
        publicListMintCounts[msg.sender] = numAlreadyMinted + numberOfTokens;

        for (uint256 i = 0; i < numberOfTokens; i++) {
            _safeMint(msg.sender, nextTokenId());
        }
    }

    // ============ PUBLIC READ-ONLY FUNCTIONS ============

    function totalSupply() external view returns (uint256) {
        return tokenCounter.current();
    }

    // ============ OWNER-ONLY ADMIN FUNCTIONS ============

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

    function setProvenanceHash(string memory _hash) external onlyOwner {
        provenanceHash = _hash;
    }

    // Set prices 

    function setPublicSalePrice(uint256 _price) external onlyOwner {
        publicSalePrice = _price;
    }

    function setMilkListPrice(uint256 _price) external onlyOwner {
        milkListSalePrice = _price;
    }

    function setReserveListPrice(uint256 _price) external onlyOwner {
        reserveListSalePrice = _price;
    }

    // Toggle Sales Active / Inactive 

    function setPublicSaleActive(bool _isPublicSaleActive) external onlyOwner {
        isPublicSaleActive = _isPublicSaleActive;
    }

    function setMilkListActive(bool _isMilkListActive) external onlyOwner {
        isMilkListActive = _isMilkListActive;
    }

    function setReserveListActive(bool _isReserveListActive) external onlyOwner {
        isReserveListActive = _isReserveListActive;
    }

    // Set Merkle Roots 

    function setMilkListMerkleRoot(bytes32 _merkleRoot) external onlyOwner {
        milkListMerkleRoot = _merkleRoot;
    }

    function setReserveListMerkleRoot(bytes32 _merkleRoot) external onlyOwner {
        reserveListMerkleRoot = _merkleRoot;
    }

    // Withdrawal 

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

    function withdrawTokens(IERC20 token) public onlyOwner {
        uint256 balance = token.balanceOf(address(this));
        token.transfer(msg.sender, balance);
    }

    // ============ SUPPORTING FUNCTIONS ============

    function nextTokenId() private returns (uint256) {
        tokenCounter.increment();
        return tokenCounter.current();
    }

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

        return string(abi.encodePacked(baseURI, tokenId.toString()));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"},{"internalType":"uint256","name":"_maxCats","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_CATS_PER_WALLET","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":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMilkListActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isReserveListActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxCats","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"milkListMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"milkListMintCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"milkListSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"numberOfTokens","type":"uint8"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"mintMilkListSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"numberOfTokens","type":"uint8"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"mintReserveListSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"mintToTeam","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":"provenanceHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"publicListMintCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveListMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"reserveListMintCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reserveListSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isMilkListActive","type":"bool"}],"name":"setMilkListActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMilkListMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setMilkListPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isPublicSaleActive","type":"bool"}],"name":"setPublicSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPublicSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isReserveListActive","type":"bool"}],"name":"setReserveListActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setReserveListMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setReserveListPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"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"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a060405267027f7d0bdb920000600c5567030d98d59a960000600d5567030d98d59a960000600e553480156200003557600080fd5b50604051620057443803806200574483398181016040528101906200005b91906200035f565b6040518060400160405280600e81526020017f436174426c6f7847656e657369730000000000000000000000000000000000008152506040518060400160405280600a81526020017f434154424c4f5847454e000000000000000000000000000000000000000000008152508160009080519060200190620000df9291906200021a565b508060019080519060200190620000f89291906200021a565b5050506200011b6200010f6200014c60201b60201c565b6200015460201b60201c565b600160078190555081600990805190602001906200013b9291906200021a565b50806080818152505050506200056d565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002289062000464565b90600052602060002090601f0160209004810192826200024c576000855562000298565b82601f106200026757805160ff191683800117855562000298565b8280016001018555821562000298579182015b82811115620002975782518255916020019190600101906200027a565b5b509050620002a79190620002ab565b5090565b5b80821115620002c6576000816000905550600101620002ac565b5090565b6000620002e1620002db84620003ee565b620003c5565b9050828152602081018484840111156200030057620002ff62000533565b5b6200030d8482856200042e565b509392505050565b600082601f8301126200032d576200032c6200052e565b5b81516200033f848260208601620002ca565b91505092915050565b600081519050620003598162000553565b92915050565b600080604083850312156200037957620003786200053d565b5b600083015167ffffffffffffffff8111156200039a576200039962000538565b5b620003a88582860162000315565b9250506020620003bb8582860162000348565b9150509250929050565b6000620003d1620003e4565b9050620003df82826200049a565b919050565b6000604051905090565b600067ffffffffffffffff8211156200040c576200040b620004ff565b5b620004178262000542565b9050602081019050919050565b6000819050919050565b60005b838110156200044e57808201518184015260208101905062000431565b838111156200045e576000848401525b50505050565b600060028204905060018216806200047d57607f821691505b60208210811415620004945762000493620004d0565b5b50919050565b620004a58262000542565b810181811067ffffffffffffffff82111715620004c757620004c6620004ff565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b6200055e8162000424565b81146200056a57600080fd5b50565b60805161519f620005a560003960008181610b5001528181611147015281816114ab015281816118c20152611ec1015261519f6000f3fe6080604052600436106102935760003560e01c806370a082311161015a578063a22cb465116100c1578063d3302df21161007a578063d3302df2146109c5578063e2e06fa3146109ee578063e985e9c514610a17578063ef8475ed14610a54578063f2fde38b14610a7f578063ffabb44214610aa857610293565b8063a22cb465146108b7578063a373e2bf146108e0578063b7ae924f14610909578063b88d4fde14610934578063c6ab67a31461095d578063c87b56dd1461098857610293565b8063813300a511610113578063813300a5146107a557806385ade25a146107e25780638da5cb5b1461080d5780638f62d2ee1461083857806395d89b41146108615780639b6860c81461088c57610293565b806370a08231146106a6578063715018a6146106e3578063735fddbf146106fa57806377c57bac14610737578063791a25191461076057806379e2a8321461078957610293565b80632db11544116101fe57806349df728c116101b757806349df728c1461059857806355ee481a146105c157806355f804b3146105ec5780635a9983b0146106155780636352211e1461063e5780636c0360eb1461067b57610293565b80632db11544146104ca57806332cbdf08146104e65780633b6238f5146105115780633ccfd60b1461053c5780633cddaaf51461055357806342842e0e1461056f57610293565b806312f25a211161025057806312f25a21146103b857806318160ddd146103e35780631e84c4131461040e57806323b872dd1461043957806324014f2d146104625780632b2ee54d1461049f57610293565b8063016640fc1461029857806301ffc9a7146102c157806306fdde03146102fe578063081812fc14610329578063095ea7b314610366578063109695231461038f575b600080fd5b3480156102a457600080fd5b506102bf60048036038101906102ba9190613bb6565b610ad1565b005b3480156102cd57600080fd5b506102e860048036038101906102e39190613a8c565b610bfa565b6040516102f59190614228565b60405180910390f35b34801561030a57600080fd5b50610313610cdc565b604051610320919061425e565b60405180910390f35b34801561033557600080fd5b50610350600480360381019061034b9190613b5c565b610d6e565b60405161035d9190614198565b60405180910390f35b34801561037257600080fd5b5061038d600480360381019061038891906139c5565b610df3565b005b34801561039b57600080fd5b506103b660048036038101906103b19190613b13565b610f0b565b005b3480156103c457600080fd5b506103cd610fa1565b6040516103da9190614228565b60405180910390f35b3480156103ef57600080fd5b506103f8610fb4565b60405161040591906145c0565b60405180910390f35b34801561041a57600080fd5b50610423610fc5565b6040516104309190614228565b60405180910390f35b34801561044557600080fd5b50610460600480360381019061045b91906138af565b610fd8565b005b34801561046e57600080fd5b5061048960048036038101906104849190613842565b611038565b60405161049691906145c0565b60405180910390f35b3480156104ab57600080fd5b506104b4611050565b6040516104c19190614243565b60405180910390f35b6104e460048036038101906104df9190613b5c565b611056565b005b3480156104f257600080fd5b506104fb6112dd565b60405161050891906145c0565b60405180910390f35b34801561051d57600080fd5b506105266112e3565b6040516105339190614243565b60405180910390f35b34801561054857600080fd5b506105516112e9565b005b61056d60048036038101906105689190613bf6565b6113b4565b005b34801561057b57600080fd5b50610596600480360381019061059191906138af565b611705565b005b3480156105a457600080fd5b506105bf60048036038101906105ba9190613ae6565b611725565b005b3480156105cd57600080fd5b506105d66118c0565b6040516105e391906145c0565b60405180910390f35b3480156105f857600080fd5b50610613600480360381019061060e9190613b13565b6118e4565b005b34801561062157600080fd5b5061063c60048036038101906106379190613a05565b61197a565b005b34801561064a57600080fd5b5061066560048036038101906106609190613b5c565b611a13565b6040516106729190614198565b60405180910390f35b34801561068757600080fd5b50610690611ac5565b60405161069d919061425e565b60405180910390f35b3480156106b257600080fd5b506106cd60048036038101906106c89190613842565b611b53565b6040516106da91906145c0565b60405180910390f35b3480156106ef57600080fd5b506106f8611c0b565b005b34801561070657600080fd5b50610721600480360381019061071c9190613842565b611c93565b60405161072e91906145c0565b60405180910390f35b34801561074357600080fd5b5061075e60048036038101906107599190613a05565b611cab565b005b34801561076c57600080fd5b5061078760048036038101906107829190613b5c565b611d44565b005b6107a3600480360381019061079e9190613bf6565b611dca565b005b3480156107b157600080fd5b506107cc60048036038101906107c79190613842565b61211b565b6040516107d991906145c0565b60405180910390f35b3480156107ee57600080fd5b506107f7612133565b60405161080491906145c0565b60405180910390f35b34801561081957600080fd5b50610822612138565b60405161082f9190614198565b60405180910390f35b34801561084457600080fd5b5061085f600480360381019061085a9190613a5f565b612162565b005b34801561086d57600080fd5b506108766121e8565b604051610883919061425e565b60405180910390f35b34801561089857600080fd5b506108a161227a565b6040516108ae91906145c0565b60405180910390f35b3480156108c357600080fd5b506108de60048036038101906108d99190613985565b612280565b005b3480156108ec57600080fd5b5061090760048036038101906109029190613b5c565b612296565b005b34801561091557600080fd5b5061091e61231c565b60405161092b91906145c0565b60405180910390f35b34801561094057600080fd5b5061095b60048036038101906109569190613902565b612322565b005b34801561096957600080fd5b50610972612384565b60405161097f919061425e565b60405180910390f35b34801561099457600080fd5b506109af60048036038101906109aa9190613b5c565b612412565b6040516109bc919061425e565b60405180910390f35b3480156109d157600080fd5b506109ec60048036038101906109e79190613a5f565b61248e565b005b3480156109fa57600080fd5b50610a156004803603810190610a109190613a05565b612514565b005b348015610a2357600080fd5b50610a3e6004803603810190610a39919061386f565b6125ad565b604051610a4b9190614228565b60405180910390f35b348015610a6057600080fd5b50610a69612641565b604051610a769190614228565b60405180910390f35b348015610a8b57600080fd5b50610aa66004803603810190610aa19190613842565b612654565b005b348015610ab457600080fd5b50610acf6004803603810190610aca9190613b5c565b61274c565b005b610ad96127d2565b73ffffffffffffffffffffffffffffffffffffffff16610af7612138565b73ffffffffffffffffffffffffffffffffffffffff1614610b4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b44906144c0565b60405180910390fd5b817f000000000000000000000000000000000000000000000000000000000000000081610b7a60086127da565b610b8491906146ba565b1115610bc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbc90614520565b60405180910390fd5b60005b83811015610bf457610be183610bdc6127e8565b612803565b8080610bec90614911565b915050610bc8565b50505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610cc557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610cd55750610cd482612821565b5b9050919050565b606060008054610ceb906148ae565b80601f0160208091040260200160405190810160405280929190818152602001828054610d17906148ae565b8015610d645780601f10610d3957610100808354040283529160200191610d64565b820191906000526020600020905b815481529060010190602001808311610d4757829003601f168201915b5050505050905090565b6000610d798261288b565b610db8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610daf90614480565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610dfe82611a13565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e66906144e0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e8e6127d2565b73ffffffffffffffffffffffffffffffffffffffff161480610ebd5750610ebc81610eb76127d2565b6125ad565b5b610efc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef3906143c0565b60405180910390fd5b610f0683836128f7565b505050565b610f136127d2565b73ffffffffffffffffffffffffffffffffffffffff16610f31612138565b73ffffffffffffffffffffffffffffffffffffffff1614610f87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7e906144c0565b60405180910390fd5b80600a9080519060200190610f9d929190613597565b5050565b600b60009054906101000a900460ff1681565b6000610fc060086127da565b905090565b600b60029054906101000a900460ff1681565b610fe9610fe36127d2565b826129b0565b611028576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101f90614500565b60405180910390fd5b611033838383612a8e565b505050565b60136020528060005260406000206000915090505481565b600f5481565b6002600754141561109c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109390614560565b60405180910390fd5b6002600781905550600b60029054906101000a900460ff166110f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ea906144a0565b60405180910390fd5b600e54813481836111049190614741565b14611144576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113b90614540565b60405180910390fd5b827f00000000000000000000000000000000000000000000000000000000000000008161117160086127da565b61117b91906146ba565b11156111bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b390614520565b60405180910390fd5b6000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506002858261120e91906146ba565b111561124f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124690614320565b60405180910390fd5b848161125b91906146ba565b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060005b858110156112cd576112ba336112b56127e8565b612803565b80806112c590614911565b9150506112a1565b5050505050600160078190555050565b600c5481565b60105481565b6112f16127d2565b73ffffffffffffffffffffffffffffffffffffffff1661130f612138565b73ffffffffffffffffffffffffffffffffffffffff1614611365576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135c906144c0565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156113b0573d6000803e3d6000fd5b5050565b600260075414156113fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f190614560565b60405180910390fd5b6002600781905550600b60019054906101000a900460ff16611451576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144890614580565b60405180910390fd5b600d548360ff163481836114659190614741565b146114a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149c90614540565b60405180910390fd5b8460ff167f0000000000000000000000000000000000000000000000000000000000000000816114d560086127da565b6114df91906146ba565b1115611520576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151790614520565b60405180910390fd5b8484601054611597838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050823360405160200161157c9190614159565b60405160208183030381529060405280519060200120612cf5565b6115d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cd906143a0565b60405180910390fd5b6000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060028a60ff168261162b91906146ba565b111561166c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166390614280565b60405180910390fd5b8960ff168161167b91906146ba565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060005b8a60ff168110156116f0576116dd336116d86127e8565b612803565b80806116e890614911565b9150506116c1565b50505050505050506001600781905550505050565b61172083838360405180602001604052806000815250612322565b505050565b61172d6127d2565b73ffffffffffffffffffffffffffffffffffffffff1661174b612138565b73ffffffffffffffffffffffffffffffffffffffff16146117a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611798906144c0565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016117dc9190614198565b60206040518083038186803b1580156117f457600080fd5b505afa158015611808573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182c9190613b89565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016118699291906141ff565b602060405180830381600087803b15801561188357600080fd5b505af1158015611897573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118bb9190613a32565b505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6118ec6127d2565b73ffffffffffffffffffffffffffffffffffffffff1661190a612138565b73ffffffffffffffffffffffffffffffffffffffff1614611960576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611957906144c0565b60405180910390fd5b8060099080519060200190611976929190613597565b5050565b6119826127d2565b73ffffffffffffffffffffffffffffffffffffffff166119a0612138565b73ffffffffffffffffffffffffffffffffffffffff16146119f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ed906144c0565b60405180910390fd5b80600b60016101000a81548160ff02191690831515021790555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611abc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab390614440565b60405180910390fd5b80915050919050565b60098054611ad2906148ae565b80601f0160208091040260200160405190810160405280929190818152602001828054611afe906148ae565b8015611b4b5780601f10611b2057610100808354040283529160200191611b4b565b820191906000526020600020905b815481529060010190602001808311611b2e57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbb90614420565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611c136127d2565b73ffffffffffffffffffffffffffffffffffffffff16611c31612138565b73ffffffffffffffffffffffffffffffffffffffff1614611c87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7e906144c0565b60405180910390fd5b611c916000612d0c565b565b60116020528060005260406000206000915090505481565b611cb36127d2565b73ffffffffffffffffffffffffffffffffffffffff16611cd1612138565b73ffffffffffffffffffffffffffffffffffffffff1614611d27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1e906144c0565b60405180910390fd5b80600b60006101000a81548160ff02191690831515021790555050565b611d4c6127d2565b73ffffffffffffffffffffffffffffffffffffffff16611d6a612138565b73ffffffffffffffffffffffffffffffffffffffff1614611dc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db7906144c0565b60405180910390fd5b80600e8190555050565b60026007541415611e10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0790614560565b60405180910390fd5b6002600781905550600b60009054906101000a900460ff16611e67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5e906145a0565b60405180910390fd5b600c548360ff16348183611e7b9190614741565b14611ebb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb290614540565b60405180910390fd5b8460ff167f000000000000000000000000000000000000000000000000000000000000000081611eeb60086127da565b611ef591906146ba565b1115611f36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2d90614520565b60405180910390fd5b8484600f54611fad838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508233604051602001611f929190614159565b60405160208183030381529060405280519060200120612cf5565b611fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe3906143a0565b60405180910390fd5b6000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060028a60ff168261204191906146ba565b1115612082576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612079906143e0565b60405180910390fd5b8960ff168161209191906146ba565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060005b8a60ff16811015612106576120f3336120ee6127e8565b612803565b80806120fe90614911565b9150506120d7565b50505050505050506001600781905550505050565b60126020528060005260406000206000915090505481565b600281565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61216a6127d2565b73ffffffffffffffffffffffffffffffffffffffff16612188612138565b73ffffffffffffffffffffffffffffffffffffffff16146121de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d5906144c0565b60405180910390fd5b8060108190555050565b6060600180546121f7906148ae565b80601f0160208091040260200160405190810160405280929190818152602001828054612223906148ae565b80156122705780601f1061224557610100808354040283529160200191612270565b820191906000526020600020905b81548152906001019060200180831161225357829003601f168201915b5050505050905090565b600e5481565b61229261228b6127d2565b8383612dd2565b5050565b61229e6127d2565b73ffffffffffffffffffffffffffffffffffffffff166122bc612138565b73ffffffffffffffffffffffffffffffffffffffff1614612312576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612309906144c0565b60405180910390fd5b80600c8190555050565b600d5481565b61233361232d6127d2565b836129b0565b612372576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236990614500565b60405180910390fd5b61237e84848484612f3f565b50505050565b600a8054612391906148ae565b80601f01602080910402602001604051908101604052809291908181526020018280546123bd906148ae565b801561240a5780601f106123df5761010080835404028352916020019161240a565b820191906000526020600020905b8154815290600101906020018083116123ed57829003601f168201915b505050505081565b606061241d8261288b565b61245c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245390614400565b60405180910390fd5b600961246783612f9b565b604051602001612478929190614174565b6040516020818303038152906040529050919050565b6124966127d2565b73ffffffffffffffffffffffffffffffffffffffff166124b4612138565b73ffffffffffffffffffffffffffffffffffffffff161461250a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612501906144c0565b60405180910390fd5b80600f8190555050565b61251c6127d2565b73ffffffffffffffffffffffffffffffffffffffff1661253a612138565b73ffffffffffffffffffffffffffffffffffffffff1614612590576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612587906144c0565b60405180910390fd5b80600b60026101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b60019054906101000a900460ff1681565b61265c6127d2565b73ffffffffffffffffffffffffffffffffffffffff1661267a612138565b73ffffffffffffffffffffffffffffffffffffffff16146126d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c7906144c0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612740576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612737906142c0565b60405180910390fd5b61274981612d0c565b50565b6127546127d2565b73ffffffffffffffffffffffffffffffffffffffff16612772612138565b73ffffffffffffffffffffffffffffffffffffffff16146127c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127bf906144c0565b60405180910390fd5b80600d8190555050565b600033905090565b600081600001549050919050565b60006127f460086130fc565b6127fe60086127da565b905090565b61281d828260405180602001604052806000815250613112565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661296a83611a13565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006129bb8261288b565b6129fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f190614380565b60405180910390fd5b6000612a0583611a13565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612a7457508373ffffffffffffffffffffffffffffffffffffffff16612a5c84610d6e565b73ffffffffffffffffffffffffffffffffffffffff16145b80612a855750612a8481856125ad565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612aae82611a13565b73ffffffffffffffffffffffffffffffffffffffff1614612b04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612afb906142e0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6b90614340565b60405180910390fd5b612b7f83838361316d565b612b8a6000826128f7565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bda919061479b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c3191906146ba565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612cf0838383613172565b505050565b600082612d028584613177565b1490509392505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612e41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3890614360565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612f329190614228565b60405180910390a3505050565b612f4a848484612a8e565b612f56848484846131ec565b612f95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f8c906142a0565b60405180910390fd5b50505050565b60606000821415612fe3576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506130f7565b600082905060005b60008214613015578080612ffe90614911565b915050600a8261300e9190614710565b9150612feb565b60008167ffffffffffffffff81111561303157613030614a6b565b5b6040519080825280601f01601f1916602001820160405280156130635781602001600182028036833780820191505090505b5090505b600085146130f05760018261307c919061479b565b9150600a8561308b919061497e565b603061309791906146ba565b60f81b8183815181106130ad576130ac614a3c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130e99190614710565b9450613067565b8093505050505b919050565b6001816000016000828254019250508190555050565b61311c8383613383565b61312960008484846131ec565b613168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315f906142a0565b60405180910390fd5b505050565b505050565b505050565b60008082905060005b84518110156131e157600085828151811061319e5761319d614a3c565b5b602002602001015190508083116131c0576131b9838261355d565b92506131cd565b6131ca818461355d565b92505b5080806131d990614911565b915050613180565b508091505092915050565b600061320d8473ffffffffffffffffffffffffffffffffffffffff16613574565b15613376578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026132366127d2565b8786866040518563ffffffff1660e01b815260040161325894939291906141b3565b602060405180830381600087803b15801561327257600080fd5b505af19250505080156132a357506040513d601f19601f820116820180604052508101906132a09190613ab9565b60015b613326573d80600081146132d3576040519150601f19603f3d011682016040523d82523d6000602084013e6132d8565b606091505b5060008151141561331e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613315906142a0565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061337b565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156133f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133ea90614460565b60405180910390fd5b6133fc8161288b565b1561343c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343390614300565b60405180910390fd5b6134486000838361316d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461349891906146ba565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461355960008383613172565b5050565b600082600052816020526040600020905092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546135a3906148ae565b90600052602060002090601f0160209004810192826135c5576000855561360c565b82601f106135de57805160ff191683800117855561360c565b8280016001018555821561360c579182015b8281111561360b5782518255916020019190600101906135f0565b5b509050613619919061361d565b5090565b5b8082111561363657600081600090555060010161361e565b5090565b600061364d61364884614600565b6145db565b90508281526020810184848401111561366957613668614aa9565b5b61367484828561486c565b509392505050565b600061368f61368a84614631565b6145db565b9050828152602081018484840111156136ab576136aa614aa9565b5b6136b684828561486c565b509392505050565b6000813590506136cd816150c8565b92915050565b60008083601f8401126136e9576136e8614a9f565b5b8235905067ffffffffffffffff81111561370657613705614a9a565b5b60208301915083602082028301111561372257613721614aa4565b5b9250929050565b600081359050613738816150df565b92915050565b60008151905061374d816150df565b92915050565b600081359050613762816150f6565b92915050565b6000813590506137778161510d565b92915050565b60008151905061378c8161510d565b92915050565b600082601f8301126137a7576137a6614a9f565b5b81356137b784826020860161363a565b91505092915050565b6000813590506137cf81615124565b92915050565b600082601f8301126137ea576137e9614a9f565b5b81356137fa84826020860161367c565b91505092915050565b6000813590506138128161513b565b92915050565b6000815190506138278161513b565b92915050565b60008135905061383c81615152565b92915050565b60006020828403121561385857613857614ab3565b5b6000613866848285016136be565b91505092915050565b6000806040838503121561388657613885614ab3565b5b6000613894858286016136be565b92505060206138a5858286016136be565b9150509250929050565b6000806000606084860312156138c8576138c7614ab3565b5b60006138d6868287016136be565b93505060206138e7868287016136be565b92505060406138f886828701613803565b9150509250925092565b6000806000806080858703121561391c5761391b614ab3565b5b600061392a878288016136be565b945050602061393b878288016136be565b935050604061394c87828801613803565b925050606085013567ffffffffffffffff81111561396d5761396c614aae565b5b61397987828801613792565b91505092959194509250565b6000806040838503121561399c5761399b614ab3565b5b60006139aa858286016136be565b92505060206139bb85828601613729565b9150509250929050565b600080604083850312156139dc576139db614ab3565b5b60006139ea858286016136be565b92505060206139fb85828601613803565b9150509250929050565b600060208284031215613a1b57613a1a614ab3565b5b6000613a2984828501613729565b91505092915050565b600060208284031215613a4857613a47614ab3565b5b6000613a568482850161373e565b91505092915050565b600060208284031215613a7557613a74614ab3565b5b6000613a8384828501613753565b91505092915050565b600060208284031215613aa257613aa1614ab3565b5b6000613ab084828501613768565b91505092915050565b600060208284031215613acf57613ace614ab3565b5b6000613add8482850161377d565b91505092915050565b600060208284031215613afc57613afb614ab3565b5b6000613b0a848285016137c0565b91505092915050565b600060208284031215613b2957613b28614ab3565b5b600082013567ffffffffffffffff811115613b4757613b46614aae565b5b613b53848285016137d5565b91505092915050565b600060208284031215613b7257613b71614ab3565b5b6000613b8084828501613803565b91505092915050565b600060208284031215613b9f57613b9e614ab3565b5b6000613bad84828501613818565b91505092915050565b60008060408385031215613bcd57613bcc614ab3565b5b6000613bdb85828601613803565b9250506020613bec858286016136be565b9150509250929050565b600080600060408486031215613c0f57613c0e614ab3565b5b6000613c1d8682870161382d565b935050602084013567ffffffffffffffff811115613c3e57613c3d614aae565b5b613c4a868287016136d3565b92509250509250925092565b613c5f816147cf565b82525050565b613c76613c71826147cf565b61495a565b82525050565b613c85816147e1565b82525050565b613c94816147ed565b82525050565b6000613ca582614677565b613caf818561468d565b9350613cbf81856020860161487b565b613cc881614ab8565b840191505092915050565b6000613cde82614682565b613ce8818561469e565b9350613cf881856020860161487b565b613d0181614ab8565b840191505092915050565b6000613d1782614682565b613d2181856146af565b9350613d3181856020860161487b565b80840191505092915050565b60008154613d4a816148ae565b613d5481866146af565b94506001821660008114613d6f5760018114613d8057613db3565b60ff19831686528186019350613db3565b613d8985614662565b60005b83811015613dab57815481890152600182019150602081019050613d8c565b838801955050505b50505092915050565b6000613dc9601b8361469e565b9150613dd482614ad6565b602082019050919050565b6000613dec60328361469e565b9150613df782614aff565b604082019050919050565b6000613e0f60268361469e565b9150613e1a82614b4e565b604082019050919050565b6000613e3260258361469e565b9150613e3d82614b9d565b604082019050919050565b6000613e55601c8361469e565b9150613e6082614bec565b602082019050919050565b6000613e78601b8361469e565b9150613e8382614c15565b602082019050919050565b6000613e9b60248361469e565b9150613ea682614c3e565b604082019050919050565b6000613ebe60198361469e565b9150613ec982614c8d565b602082019050919050565b6000613ee1602c8361469e565b9150613eec82614cb6565b604082019050919050565b6000613f04601e8361469e565b9150613f0f82614d05565b602082019050919050565b6000613f2760388361469e565b9150613f3282614d2e565b604082019050919050565b6000613f4a601b8361469e565b9150613f5582614d7d565b602082019050919050565b6000613f6d60118361469e565b9150613f7882614da6565b602082019050919050565b6000613f90602a8361469e565b9150613f9b82614dcf565b604082019050919050565b6000613fb360298361469e565b9150613fbe82614e1e565b604082019050919050565b6000613fd660208361469e565b9150613fe182614e6d565b602082019050919050565b6000613ff9602c8361469e565b915061400482614e96565b604082019050919050565b600061401c60168361469e565b915061402782614ee5565b602082019050919050565b600061403f60208361469e565b915061404a82614f0e565b602082019050919050565b600061406260218361469e565b915061406d82614f37565b604082019050919050565b600061408560318361469e565b915061409082614f86565b604082019050919050565b60006140a860218361469e565b91506140b382614fd5565b604082019050919050565b60006140cb60188361469e565b91506140d682615024565b602082019050919050565b60006140ee601f8361469e565b91506140f98261504d565b602082019050919050565b600061411160178361469e565b915061411c82615076565b602082019050919050565b600061413460148361469e565b915061413f8261509f565b602082019050919050565b61415381614855565b82525050565b60006141658284613c65565b60148201915081905092915050565b60006141808285613d3d565b915061418c8284613d0c565b91508190509392505050565b60006020820190506141ad6000830184613c56565b92915050565b60006080820190506141c86000830187613c56565b6141d56020830186613c56565b6141e2604083018561414a565b81810360608301526141f48184613c9a565b905095945050505050565b60006040820190506142146000830185613c56565b614221602083018461414a565b9392505050565b600060208201905061423d6000830184613c7c565b92915050565b60006020820190506142586000830184613c8b565b92915050565b600060208201905081810360008301526142788184613cd3565b905092915050565b6000602082019050818103600083015261429981613dbc565b9050919050565b600060208201905081810360008301526142b981613ddf565b9050919050565b600060208201905081810360008301526142d981613e02565b9050919050565b600060208201905081810360008301526142f981613e25565b9050919050565b6000602082019050818103600083015261431981613e48565b9050919050565b6000602082019050818103600083015261433981613e6b565b9050919050565b6000602082019050818103600083015261435981613e8e565b9050919050565b6000602082019050818103600083015261437981613eb1565b9050919050565b6000602082019050818103600083015261439981613ed4565b9050919050565b600060208201905081810360008301526143b981613ef7565b9050919050565b600060208201905081810360008301526143d981613f1a565b9050919050565b600060208201905081810360008301526143f981613f3d565b9050919050565b6000602082019050818103600083015261441981613f60565b9050919050565b6000602082019050818103600083015261443981613f83565b9050919050565b6000602082019050818103600083015261445981613fa6565b9050919050565b6000602082019050818103600083015261447981613fc9565b9050919050565b6000602082019050818103600083015261449981613fec565b9050919050565b600060208201905081810360008301526144b98161400f565b9050919050565b600060208201905081810360008301526144d981614032565b9050919050565b600060208201905081810360008301526144f981614055565b9050919050565b6000602082019050818103600083015261451981614078565b9050919050565b600060208201905081810360008301526145398161409b565b9050919050565b60006020820190508181036000830152614559816140be565b9050919050565b60006020820190508181036000830152614579816140e1565b9050919050565b6000602082019050818103600083015261459981614104565b9050919050565b600060208201905081810360008301526145b981614127565b9050919050565b60006020820190506145d5600083018461414a565b92915050565b60006145e56145f6565b90506145f182826148e0565b919050565b6000604051905090565b600067ffffffffffffffff82111561461b5761461a614a6b565b5b61462482614ab8565b9050602081019050919050565b600067ffffffffffffffff82111561464c5761464b614a6b565b5b61465582614ab8565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006146c582614855565b91506146d083614855565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614705576147046149af565b5b828201905092915050565b600061471b82614855565b915061472683614855565b925082614736576147356149de565b5b828204905092915050565b600061474c82614855565b915061475783614855565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156147905761478f6149af565b5b828202905092915050565b60006147a682614855565b91506147b183614855565b9250828210156147c4576147c36149af565b5b828203905092915050565b60006147da82614835565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061482e826147cf565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561489957808201518184015260208101905061487e565b838111156148a8576000848401525b50505050565b600060028204905060018216806148c657607f821691505b602082108114156148da576148d9614a0d565b5b50919050565b6148e982614ab8565b810181811067ffffffffffffffff8211171561490857614907614a6b565b5b80604052505050565b600061491c82614855565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561494f5761494e6149af565b5b600182019050919050565b60006149658261496c565b9050919050565b600061497782614ac9565b9050919050565b600061498982614855565b915061499483614855565b9250826149a4576149a36149de565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f524c3a2054776f2063617473206d6178207065722077616c6c65740000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f504d3a2054776f2063617473206d6178207065722077616c6c65740000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4164647265737320646f6573206e6f7420657869737420696e206c6973740000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4d4c3a2054776f2063617473206d6178207065722077616c6c65740000000000600082015250565b7f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5075626c69632073616c65206e6f742061637469766500000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820636174732072656d61696e696e6720746f206d696e60008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e636f7272656374204554482076616c75652073656e740000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f52657365727665206c697374206e6f7420616374697665000000000000000000600082015250565b7f4d696c6b206c697374206e6f7420616374697665000000000000000000000000600082015250565b6150d1816147cf565b81146150dc57600080fd5b50565b6150e8816147e1565b81146150f357600080fd5b50565b6150ff816147ed565b811461510a57600080fd5b50565b615116816147f7565b811461512157600080fd5b50565b61512d81614823565b811461513857600080fd5b50565b61514481614855565b811461514f57600080fd5b50565b61515b8161485f565b811461516657600080fd5b5056fea26469706673582212203b57a69493e2bbb7e834132002ed10a53bca32ca19e66df8b155708350286bfa64736f6c634300080700330000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000270f000000000000000000000000000000000000000000000000000000000000004368747470733a2f2f75732d63656e7472616c312d636174626c6f782d31663465352e636c6f756466756e6374696f6e732e6e65742f6170692f70726572657665616c2f0000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102935760003560e01c806370a082311161015a578063a22cb465116100c1578063d3302df21161007a578063d3302df2146109c5578063e2e06fa3146109ee578063e985e9c514610a17578063ef8475ed14610a54578063f2fde38b14610a7f578063ffabb44214610aa857610293565b8063a22cb465146108b7578063a373e2bf146108e0578063b7ae924f14610909578063b88d4fde14610934578063c6ab67a31461095d578063c87b56dd1461098857610293565b8063813300a511610113578063813300a5146107a557806385ade25a146107e25780638da5cb5b1461080d5780638f62d2ee1461083857806395d89b41146108615780639b6860c81461088c57610293565b806370a08231146106a6578063715018a6146106e3578063735fddbf146106fa57806377c57bac14610737578063791a25191461076057806379e2a8321461078957610293565b80632db11544116101fe57806349df728c116101b757806349df728c1461059857806355ee481a146105c157806355f804b3146105ec5780635a9983b0146106155780636352211e1461063e5780636c0360eb1461067b57610293565b80632db11544146104ca57806332cbdf08146104e65780633b6238f5146105115780633ccfd60b1461053c5780633cddaaf51461055357806342842e0e1461056f57610293565b806312f25a211161025057806312f25a21146103b857806318160ddd146103e35780631e84c4131461040e57806323b872dd1461043957806324014f2d146104625780632b2ee54d1461049f57610293565b8063016640fc1461029857806301ffc9a7146102c157806306fdde03146102fe578063081812fc14610329578063095ea7b314610366578063109695231461038f575b600080fd5b3480156102a457600080fd5b506102bf60048036038101906102ba9190613bb6565b610ad1565b005b3480156102cd57600080fd5b506102e860048036038101906102e39190613a8c565b610bfa565b6040516102f59190614228565b60405180910390f35b34801561030a57600080fd5b50610313610cdc565b604051610320919061425e565b60405180910390f35b34801561033557600080fd5b50610350600480360381019061034b9190613b5c565b610d6e565b60405161035d9190614198565b60405180910390f35b34801561037257600080fd5b5061038d600480360381019061038891906139c5565b610df3565b005b34801561039b57600080fd5b506103b660048036038101906103b19190613b13565b610f0b565b005b3480156103c457600080fd5b506103cd610fa1565b6040516103da9190614228565b60405180910390f35b3480156103ef57600080fd5b506103f8610fb4565b60405161040591906145c0565b60405180910390f35b34801561041a57600080fd5b50610423610fc5565b6040516104309190614228565b60405180910390f35b34801561044557600080fd5b50610460600480360381019061045b91906138af565b610fd8565b005b34801561046e57600080fd5b5061048960048036038101906104849190613842565b611038565b60405161049691906145c0565b60405180910390f35b3480156104ab57600080fd5b506104b4611050565b6040516104c19190614243565b60405180910390f35b6104e460048036038101906104df9190613b5c565b611056565b005b3480156104f257600080fd5b506104fb6112dd565b60405161050891906145c0565b60405180910390f35b34801561051d57600080fd5b506105266112e3565b6040516105339190614243565b60405180910390f35b34801561054857600080fd5b506105516112e9565b005b61056d60048036038101906105689190613bf6565b6113b4565b005b34801561057b57600080fd5b50610596600480360381019061059191906138af565b611705565b005b3480156105a457600080fd5b506105bf60048036038101906105ba9190613ae6565b611725565b005b3480156105cd57600080fd5b506105d66118c0565b6040516105e391906145c0565b60405180910390f35b3480156105f857600080fd5b50610613600480360381019061060e9190613b13565b6118e4565b005b34801561062157600080fd5b5061063c60048036038101906106379190613a05565b61197a565b005b34801561064a57600080fd5b5061066560048036038101906106609190613b5c565b611a13565b6040516106729190614198565b60405180910390f35b34801561068757600080fd5b50610690611ac5565b60405161069d919061425e565b60405180910390f35b3480156106b257600080fd5b506106cd60048036038101906106c89190613842565b611b53565b6040516106da91906145c0565b60405180910390f35b3480156106ef57600080fd5b506106f8611c0b565b005b34801561070657600080fd5b50610721600480360381019061071c9190613842565b611c93565b60405161072e91906145c0565b60405180910390f35b34801561074357600080fd5b5061075e60048036038101906107599190613a05565b611cab565b005b34801561076c57600080fd5b5061078760048036038101906107829190613b5c565b611d44565b005b6107a3600480360381019061079e9190613bf6565b611dca565b005b3480156107b157600080fd5b506107cc60048036038101906107c79190613842565b61211b565b6040516107d991906145c0565b60405180910390f35b3480156107ee57600080fd5b506107f7612133565b60405161080491906145c0565b60405180910390f35b34801561081957600080fd5b50610822612138565b60405161082f9190614198565b60405180910390f35b34801561084457600080fd5b5061085f600480360381019061085a9190613a5f565b612162565b005b34801561086d57600080fd5b506108766121e8565b604051610883919061425e565b60405180910390f35b34801561089857600080fd5b506108a161227a565b6040516108ae91906145c0565b60405180910390f35b3480156108c357600080fd5b506108de60048036038101906108d99190613985565b612280565b005b3480156108ec57600080fd5b5061090760048036038101906109029190613b5c565b612296565b005b34801561091557600080fd5b5061091e61231c565b60405161092b91906145c0565b60405180910390f35b34801561094057600080fd5b5061095b60048036038101906109569190613902565b612322565b005b34801561096957600080fd5b50610972612384565b60405161097f919061425e565b60405180910390f35b34801561099457600080fd5b506109af60048036038101906109aa9190613b5c565b612412565b6040516109bc919061425e565b60405180910390f35b3480156109d157600080fd5b506109ec60048036038101906109e79190613a5f565b61248e565b005b3480156109fa57600080fd5b50610a156004803603810190610a109190613a05565b612514565b005b348015610a2357600080fd5b50610a3e6004803603810190610a39919061386f565b6125ad565b604051610a4b9190614228565b60405180910390f35b348015610a6057600080fd5b50610a69612641565b604051610a769190614228565b60405180910390f35b348015610a8b57600080fd5b50610aa66004803603810190610aa19190613842565b612654565b005b348015610ab457600080fd5b50610acf6004803603810190610aca9190613b5c565b61274c565b005b610ad96127d2565b73ffffffffffffffffffffffffffffffffffffffff16610af7612138565b73ffffffffffffffffffffffffffffffffffffffff1614610b4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b44906144c0565b60405180910390fd5b817f000000000000000000000000000000000000000000000000000000000000270f81610b7a60086127da565b610b8491906146ba565b1115610bc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbc90614520565b60405180910390fd5b60005b83811015610bf457610be183610bdc6127e8565b612803565b8080610bec90614911565b915050610bc8565b50505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610cc557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610cd55750610cd482612821565b5b9050919050565b606060008054610ceb906148ae565b80601f0160208091040260200160405190810160405280929190818152602001828054610d17906148ae565b8015610d645780601f10610d3957610100808354040283529160200191610d64565b820191906000526020600020905b815481529060010190602001808311610d4757829003601f168201915b5050505050905090565b6000610d798261288b565b610db8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610daf90614480565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610dfe82611a13565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e66906144e0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e8e6127d2565b73ffffffffffffffffffffffffffffffffffffffff161480610ebd5750610ebc81610eb76127d2565b6125ad565b5b610efc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef3906143c0565b60405180910390fd5b610f0683836128f7565b505050565b610f136127d2565b73ffffffffffffffffffffffffffffffffffffffff16610f31612138565b73ffffffffffffffffffffffffffffffffffffffff1614610f87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7e906144c0565b60405180910390fd5b80600a9080519060200190610f9d929190613597565b5050565b600b60009054906101000a900460ff1681565b6000610fc060086127da565b905090565b600b60029054906101000a900460ff1681565b610fe9610fe36127d2565b826129b0565b611028576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101f90614500565b60405180910390fd5b611033838383612a8e565b505050565b60136020528060005260406000206000915090505481565b600f5481565b6002600754141561109c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109390614560565b60405180910390fd5b6002600781905550600b60029054906101000a900460ff166110f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ea906144a0565b60405180910390fd5b600e54813481836111049190614741565b14611144576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113b90614540565b60405180910390fd5b827f000000000000000000000000000000000000000000000000000000000000270f8161117160086127da565b61117b91906146ba565b11156111bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b390614520565b60405180910390fd5b6000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506002858261120e91906146ba565b111561124f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124690614320565b60405180910390fd5b848161125b91906146ba565b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060005b858110156112cd576112ba336112b56127e8565b612803565b80806112c590614911565b9150506112a1565b5050505050600160078190555050565b600c5481565b60105481565b6112f16127d2565b73ffffffffffffffffffffffffffffffffffffffff1661130f612138565b73ffffffffffffffffffffffffffffffffffffffff1614611365576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135c906144c0565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156113b0573d6000803e3d6000fd5b5050565b600260075414156113fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f190614560565b60405180910390fd5b6002600781905550600b60019054906101000a900460ff16611451576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144890614580565b60405180910390fd5b600d548360ff163481836114659190614741565b146114a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149c90614540565b60405180910390fd5b8460ff167f000000000000000000000000000000000000000000000000000000000000270f816114d560086127da565b6114df91906146ba565b1115611520576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151790614520565b60405180910390fd5b8484601054611597838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050823360405160200161157c9190614159565b60405160208183030381529060405280519060200120612cf5565b6115d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cd906143a0565b60405180910390fd5b6000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060028a60ff168261162b91906146ba565b111561166c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166390614280565b60405180910390fd5b8960ff168161167b91906146ba565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060005b8a60ff168110156116f0576116dd336116d86127e8565b612803565b80806116e890614911565b9150506116c1565b50505050505050506001600781905550505050565b61172083838360405180602001604052806000815250612322565b505050565b61172d6127d2565b73ffffffffffffffffffffffffffffffffffffffff1661174b612138565b73ffffffffffffffffffffffffffffffffffffffff16146117a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611798906144c0565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016117dc9190614198565b60206040518083038186803b1580156117f457600080fd5b505afa158015611808573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182c9190613b89565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016118699291906141ff565b602060405180830381600087803b15801561188357600080fd5b505af1158015611897573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118bb9190613a32565b505050565b7f000000000000000000000000000000000000000000000000000000000000270f81565b6118ec6127d2565b73ffffffffffffffffffffffffffffffffffffffff1661190a612138565b73ffffffffffffffffffffffffffffffffffffffff1614611960576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611957906144c0565b60405180910390fd5b8060099080519060200190611976929190613597565b5050565b6119826127d2565b73ffffffffffffffffffffffffffffffffffffffff166119a0612138565b73ffffffffffffffffffffffffffffffffffffffff16146119f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ed906144c0565b60405180910390fd5b80600b60016101000a81548160ff02191690831515021790555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611abc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab390614440565b60405180910390fd5b80915050919050565b60098054611ad2906148ae565b80601f0160208091040260200160405190810160405280929190818152602001828054611afe906148ae565b8015611b4b5780601f10611b2057610100808354040283529160200191611b4b565b820191906000526020600020905b815481529060010190602001808311611b2e57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbb90614420565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611c136127d2565b73ffffffffffffffffffffffffffffffffffffffff16611c31612138565b73ffffffffffffffffffffffffffffffffffffffff1614611c87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7e906144c0565b60405180910390fd5b611c916000612d0c565b565b60116020528060005260406000206000915090505481565b611cb36127d2565b73ffffffffffffffffffffffffffffffffffffffff16611cd1612138565b73ffffffffffffffffffffffffffffffffffffffff1614611d27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1e906144c0565b60405180910390fd5b80600b60006101000a81548160ff02191690831515021790555050565b611d4c6127d2565b73ffffffffffffffffffffffffffffffffffffffff16611d6a612138565b73ffffffffffffffffffffffffffffffffffffffff1614611dc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db7906144c0565b60405180910390fd5b80600e8190555050565b60026007541415611e10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0790614560565b60405180910390fd5b6002600781905550600b60009054906101000a900460ff16611e67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5e906145a0565b60405180910390fd5b600c548360ff16348183611e7b9190614741565b14611ebb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb290614540565b60405180910390fd5b8460ff167f000000000000000000000000000000000000000000000000000000000000270f81611eeb60086127da565b611ef591906146ba565b1115611f36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2d90614520565b60405180910390fd5b8484600f54611fad838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508233604051602001611f929190614159565b60405160208183030381529060405280519060200120612cf5565b611fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe3906143a0565b60405180910390fd5b6000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060028a60ff168261204191906146ba565b1115612082576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612079906143e0565b60405180910390fd5b8960ff168161209191906146ba565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060005b8a60ff16811015612106576120f3336120ee6127e8565b612803565b80806120fe90614911565b9150506120d7565b50505050505050506001600781905550505050565b60126020528060005260406000206000915090505481565b600281565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61216a6127d2565b73ffffffffffffffffffffffffffffffffffffffff16612188612138565b73ffffffffffffffffffffffffffffffffffffffff16146121de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d5906144c0565b60405180910390fd5b8060108190555050565b6060600180546121f7906148ae565b80601f0160208091040260200160405190810160405280929190818152602001828054612223906148ae565b80156122705780601f1061224557610100808354040283529160200191612270565b820191906000526020600020905b81548152906001019060200180831161225357829003601f168201915b5050505050905090565b600e5481565b61229261228b6127d2565b8383612dd2565b5050565b61229e6127d2565b73ffffffffffffffffffffffffffffffffffffffff166122bc612138565b73ffffffffffffffffffffffffffffffffffffffff1614612312576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612309906144c0565b60405180910390fd5b80600c8190555050565b600d5481565b61233361232d6127d2565b836129b0565b612372576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236990614500565b60405180910390fd5b61237e84848484612f3f565b50505050565b600a8054612391906148ae565b80601f01602080910402602001604051908101604052809291908181526020018280546123bd906148ae565b801561240a5780601f106123df5761010080835404028352916020019161240a565b820191906000526020600020905b8154815290600101906020018083116123ed57829003601f168201915b505050505081565b606061241d8261288b565b61245c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245390614400565b60405180910390fd5b600961246783612f9b565b604051602001612478929190614174565b6040516020818303038152906040529050919050565b6124966127d2565b73ffffffffffffffffffffffffffffffffffffffff166124b4612138565b73ffffffffffffffffffffffffffffffffffffffff161461250a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612501906144c0565b60405180910390fd5b80600f8190555050565b61251c6127d2565b73ffffffffffffffffffffffffffffffffffffffff1661253a612138565b73ffffffffffffffffffffffffffffffffffffffff1614612590576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612587906144c0565b60405180910390fd5b80600b60026101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b60019054906101000a900460ff1681565b61265c6127d2565b73ffffffffffffffffffffffffffffffffffffffff1661267a612138565b73ffffffffffffffffffffffffffffffffffffffff16146126d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c7906144c0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612740576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612737906142c0565b60405180910390fd5b61274981612d0c565b50565b6127546127d2565b73ffffffffffffffffffffffffffffffffffffffff16612772612138565b73ffffffffffffffffffffffffffffffffffffffff16146127c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127bf906144c0565b60405180910390fd5b80600d8190555050565b600033905090565b600081600001549050919050565b60006127f460086130fc565b6127fe60086127da565b905090565b61281d828260405180602001604052806000815250613112565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661296a83611a13565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006129bb8261288b565b6129fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f190614380565b60405180910390fd5b6000612a0583611a13565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612a7457508373ffffffffffffffffffffffffffffffffffffffff16612a5c84610d6e565b73ffffffffffffffffffffffffffffffffffffffff16145b80612a855750612a8481856125ad565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612aae82611a13565b73ffffffffffffffffffffffffffffffffffffffff1614612b04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612afb906142e0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6b90614340565b60405180910390fd5b612b7f83838361316d565b612b8a6000826128f7565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bda919061479b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c3191906146ba565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612cf0838383613172565b505050565b600082612d028584613177565b1490509392505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612e41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3890614360565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612f329190614228565b60405180910390a3505050565b612f4a848484612a8e565b612f56848484846131ec565b612f95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f8c906142a0565b60405180910390fd5b50505050565b60606000821415612fe3576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506130f7565b600082905060005b60008214613015578080612ffe90614911565b915050600a8261300e9190614710565b9150612feb565b60008167ffffffffffffffff81111561303157613030614a6b565b5b6040519080825280601f01601f1916602001820160405280156130635781602001600182028036833780820191505090505b5090505b600085146130f05760018261307c919061479b565b9150600a8561308b919061497e565b603061309791906146ba565b60f81b8183815181106130ad576130ac614a3c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130e99190614710565b9450613067565b8093505050505b919050565b6001816000016000828254019250508190555050565b61311c8383613383565b61312960008484846131ec565b613168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315f906142a0565b60405180910390fd5b505050565b505050565b505050565b60008082905060005b84518110156131e157600085828151811061319e5761319d614a3c565b5b602002602001015190508083116131c0576131b9838261355d565b92506131cd565b6131ca818461355d565b92505b5080806131d990614911565b915050613180565b508091505092915050565b600061320d8473ffffffffffffffffffffffffffffffffffffffff16613574565b15613376578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026132366127d2565b8786866040518563ffffffff1660e01b815260040161325894939291906141b3565b602060405180830381600087803b15801561327257600080fd5b505af19250505080156132a357506040513d601f19601f820116820180604052508101906132a09190613ab9565b60015b613326573d80600081146132d3576040519150601f19603f3d011682016040523d82523d6000602084013e6132d8565b606091505b5060008151141561331e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613315906142a0565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061337b565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156133f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133ea90614460565b60405180910390fd5b6133fc8161288b565b1561343c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343390614300565b60405180910390fd5b6134486000838361316d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461349891906146ba565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461355960008383613172565b5050565b600082600052816020526040600020905092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546135a3906148ae565b90600052602060002090601f0160209004810192826135c5576000855561360c565b82601f106135de57805160ff191683800117855561360c565b8280016001018555821561360c579182015b8281111561360b5782518255916020019190600101906135f0565b5b509050613619919061361d565b5090565b5b8082111561363657600081600090555060010161361e565b5090565b600061364d61364884614600565b6145db565b90508281526020810184848401111561366957613668614aa9565b5b61367484828561486c565b509392505050565b600061368f61368a84614631565b6145db565b9050828152602081018484840111156136ab576136aa614aa9565b5b6136b684828561486c565b509392505050565b6000813590506136cd816150c8565b92915050565b60008083601f8401126136e9576136e8614a9f565b5b8235905067ffffffffffffffff81111561370657613705614a9a565b5b60208301915083602082028301111561372257613721614aa4565b5b9250929050565b600081359050613738816150df565b92915050565b60008151905061374d816150df565b92915050565b600081359050613762816150f6565b92915050565b6000813590506137778161510d565b92915050565b60008151905061378c8161510d565b92915050565b600082601f8301126137a7576137a6614a9f565b5b81356137b784826020860161363a565b91505092915050565b6000813590506137cf81615124565b92915050565b600082601f8301126137ea576137e9614a9f565b5b81356137fa84826020860161367c565b91505092915050565b6000813590506138128161513b565b92915050565b6000815190506138278161513b565b92915050565b60008135905061383c81615152565b92915050565b60006020828403121561385857613857614ab3565b5b6000613866848285016136be565b91505092915050565b6000806040838503121561388657613885614ab3565b5b6000613894858286016136be565b92505060206138a5858286016136be565b9150509250929050565b6000806000606084860312156138c8576138c7614ab3565b5b60006138d6868287016136be565b93505060206138e7868287016136be565b92505060406138f886828701613803565b9150509250925092565b6000806000806080858703121561391c5761391b614ab3565b5b600061392a878288016136be565b945050602061393b878288016136be565b935050604061394c87828801613803565b925050606085013567ffffffffffffffff81111561396d5761396c614aae565b5b61397987828801613792565b91505092959194509250565b6000806040838503121561399c5761399b614ab3565b5b60006139aa858286016136be565b92505060206139bb85828601613729565b9150509250929050565b600080604083850312156139dc576139db614ab3565b5b60006139ea858286016136be565b92505060206139fb85828601613803565b9150509250929050565b600060208284031215613a1b57613a1a614ab3565b5b6000613a2984828501613729565b91505092915050565b600060208284031215613a4857613a47614ab3565b5b6000613a568482850161373e565b91505092915050565b600060208284031215613a7557613a74614ab3565b5b6000613a8384828501613753565b91505092915050565b600060208284031215613aa257613aa1614ab3565b5b6000613ab084828501613768565b91505092915050565b600060208284031215613acf57613ace614ab3565b5b6000613add8482850161377d565b91505092915050565b600060208284031215613afc57613afb614ab3565b5b6000613b0a848285016137c0565b91505092915050565b600060208284031215613b2957613b28614ab3565b5b600082013567ffffffffffffffff811115613b4757613b46614aae565b5b613b53848285016137d5565b91505092915050565b600060208284031215613b7257613b71614ab3565b5b6000613b8084828501613803565b91505092915050565b600060208284031215613b9f57613b9e614ab3565b5b6000613bad84828501613818565b91505092915050565b60008060408385031215613bcd57613bcc614ab3565b5b6000613bdb85828601613803565b9250506020613bec858286016136be565b9150509250929050565b600080600060408486031215613c0f57613c0e614ab3565b5b6000613c1d8682870161382d565b935050602084013567ffffffffffffffff811115613c3e57613c3d614aae565b5b613c4a868287016136d3565b92509250509250925092565b613c5f816147cf565b82525050565b613c76613c71826147cf565b61495a565b82525050565b613c85816147e1565b82525050565b613c94816147ed565b82525050565b6000613ca582614677565b613caf818561468d565b9350613cbf81856020860161487b565b613cc881614ab8565b840191505092915050565b6000613cde82614682565b613ce8818561469e565b9350613cf881856020860161487b565b613d0181614ab8565b840191505092915050565b6000613d1782614682565b613d2181856146af565b9350613d3181856020860161487b565b80840191505092915050565b60008154613d4a816148ae565b613d5481866146af565b94506001821660008114613d6f5760018114613d8057613db3565b60ff19831686528186019350613db3565b613d8985614662565b60005b83811015613dab57815481890152600182019150602081019050613d8c565b838801955050505b50505092915050565b6000613dc9601b8361469e565b9150613dd482614ad6565b602082019050919050565b6000613dec60328361469e565b9150613df782614aff565b604082019050919050565b6000613e0f60268361469e565b9150613e1a82614b4e565b604082019050919050565b6000613e3260258361469e565b9150613e3d82614b9d565b604082019050919050565b6000613e55601c8361469e565b9150613e6082614bec565b602082019050919050565b6000613e78601b8361469e565b9150613e8382614c15565b602082019050919050565b6000613e9b60248361469e565b9150613ea682614c3e565b604082019050919050565b6000613ebe60198361469e565b9150613ec982614c8d565b602082019050919050565b6000613ee1602c8361469e565b9150613eec82614cb6565b604082019050919050565b6000613f04601e8361469e565b9150613f0f82614d05565b602082019050919050565b6000613f2760388361469e565b9150613f3282614d2e565b604082019050919050565b6000613f4a601b8361469e565b9150613f5582614d7d565b602082019050919050565b6000613f6d60118361469e565b9150613f7882614da6565b602082019050919050565b6000613f90602a8361469e565b9150613f9b82614dcf565b604082019050919050565b6000613fb360298361469e565b9150613fbe82614e1e565b604082019050919050565b6000613fd660208361469e565b9150613fe182614e6d565b602082019050919050565b6000613ff9602c8361469e565b915061400482614e96565b604082019050919050565b600061401c60168361469e565b915061402782614ee5565b602082019050919050565b600061403f60208361469e565b915061404a82614f0e565b602082019050919050565b600061406260218361469e565b915061406d82614f37565b604082019050919050565b600061408560318361469e565b915061409082614f86565b604082019050919050565b60006140a860218361469e565b91506140b382614fd5565b604082019050919050565b60006140cb60188361469e565b91506140d682615024565b602082019050919050565b60006140ee601f8361469e565b91506140f98261504d565b602082019050919050565b600061411160178361469e565b915061411c82615076565b602082019050919050565b600061413460148361469e565b915061413f8261509f565b602082019050919050565b61415381614855565b82525050565b60006141658284613c65565b60148201915081905092915050565b60006141808285613d3d565b915061418c8284613d0c565b91508190509392505050565b60006020820190506141ad6000830184613c56565b92915050565b60006080820190506141c86000830187613c56565b6141d56020830186613c56565b6141e2604083018561414a565b81810360608301526141f48184613c9a565b905095945050505050565b60006040820190506142146000830185613c56565b614221602083018461414a565b9392505050565b600060208201905061423d6000830184613c7c565b92915050565b60006020820190506142586000830184613c8b565b92915050565b600060208201905081810360008301526142788184613cd3565b905092915050565b6000602082019050818103600083015261429981613dbc565b9050919050565b600060208201905081810360008301526142b981613ddf565b9050919050565b600060208201905081810360008301526142d981613e02565b9050919050565b600060208201905081810360008301526142f981613e25565b9050919050565b6000602082019050818103600083015261431981613e48565b9050919050565b6000602082019050818103600083015261433981613e6b565b9050919050565b6000602082019050818103600083015261435981613e8e565b9050919050565b6000602082019050818103600083015261437981613eb1565b9050919050565b6000602082019050818103600083015261439981613ed4565b9050919050565b600060208201905081810360008301526143b981613ef7565b9050919050565b600060208201905081810360008301526143d981613f1a565b9050919050565b600060208201905081810360008301526143f981613f3d565b9050919050565b6000602082019050818103600083015261441981613f60565b9050919050565b6000602082019050818103600083015261443981613f83565b9050919050565b6000602082019050818103600083015261445981613fa6565b9050919050565b6000602082019050818103600083015261447981613fc9565b9050919050565b6000602082019050818103600083015261449981613fec565b9050919050565b600060208201905081810360008301526144b98161400f565b9050919050565b600060208201905081810360008301526144d981614032565b9050919050565b600060208201905081810360008301526144f981614055565b9050919050565b6000602082019050818103600083015261451981614078565b9050919050565b600060208201905081810360008301526145398161409b565b9050919050565b60006020820190508181036000830152614559816140be565b9050919050565b60006020820190508181036000830152614579816140e1565b9050919050565b6000602082019050818103600083015261459981614104565b9050919050565b600060208201905081810360008301526145b981614127565b9050919050565b60006020820190506145d5600083018461414a565b92915050565b60006145e56145f6565b90506145f182826148e0565b919050565b6000604051905090565b600067ffffffffffffffff82111561461b5761461a614a6b565b5b61462482614ab8565b9050602081019050919050565b600067ffffffffffffffff82111561464c5761464b614a6b565b5b61465582614ab8565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006146c582614855565b91506146d083614855565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614705576147046149af565b5b828201905092915050565b600061471b82614855565b915061472683614855565b925082614736576147356149de565b5b828204905092915050565b600061474c82614855565b915061475783614855565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156147905761478f6149af565b5b828202905092915050565b60006147a682614855565b91506147b183614855565b9250828210156147c4576147c36149af565b5b828203905092915050565b60006147da82614835565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061482e826147cf565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561489957808201518184015260208101905061487e565b838111156148a8576000848401525b50505050565b600060028204905060018216806148c657607f821691505b602082108114156148da576148d9614a0d565b5b50919050565b6148e982614ab8565b810181811067ffffffffffffffff8211171561490857614907614a6b565b5b80604052505050565b600061491c82614855565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561494f5761494e6149af565b5b600182019050919050565b60006149658261496c565b9050919050565b600061497782614ac9565b9050919050565b600061498982614855565b915061499483614855565b9250826149a4576149a36149de565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f524c3a2054776f2063617473206d6178207065722077616c6c65740000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f504d3a2054776f2063617473206d6178207065722077616c6c65740000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4164647265737320646f6573206e6f7420657869737420696e206c6973740000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4d4c3a2054776f2063617473206d6178207065722077616c6c65740000000000600082015250565b7f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5075626c69632073616c65206e6f742061637469766500000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820636174732072656d61696e696e6720746f206d696e60008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e636f7272656374204554482076616c75652073656e740000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f52657365727665206c697374206e6f7420616374697665000000000000000000600082015250565b7f4d696c6b206c697374206e6f7420616374697665000000000000000000000000600082015250565b6150d1816147cf565b81146150dc57600080fd5b50565b6150e8816147e1565b81146150f357600080fd5b50565b6150ff816147ed565b811461510a57600080fd5b50565b615116816147f7565b811461512157600080fd5b50565b61512d81614823565b811461513857600080fd5b50565b61514481614855565b811461514f57600080fd5b50565b61515b8161485f565b811461516657600080fd5b5056fea26469706673582212203b57a69493e2bbb7e834132002ed10a53bca32ca19e66df8b155708350286bfa64736f6c63430008070033

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

0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000270f000000000000000000000000000000000000000000000000000000000000004368747470733a2f2f75732d63656e7472616c312d636174626c6f782d31663465352e636c6f756466756e6374696f6e732e6e65742f6170692f70726572657665616c2f0000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _baseURI (string): https://us-central1-catblox-1f4e5.cloudfunctions.net/api/prereveal/
Arg [1] : _maxCats (uint256): 9999

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 000000000000000000000000000000000000000000000000000000000000270f
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [3] : 68747470733a2f2f75732d63656e7472616c312d636174626c6f782d31663465
Arg [4] : 352e636c6f756466756e6374696f6e732e6e65742f6170692f70726572657665
Arg [5] : 616c2f0000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

53993:7276:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56321:272;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40777:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41722:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43281:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42804:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59140:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54342:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58858:103;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54415:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44031:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54821:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54613:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58170:617;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54454:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54653:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60403:143;;;;;;;;;;;;;:::i;:::-;;57409:753;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44441:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60554:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54301:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59032:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59942:137;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41416:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54182:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41146:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21398:103;;;;;;;;;;;;;:::i;:::-;;54698:53;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59809:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59278:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56666:735;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54758:56;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54247:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20747:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60245:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41891:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54561:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43574:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59392:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54506:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44697:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54210:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60990:276;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60115:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59668:133;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43800:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54377:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21656:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59506:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56321:272;20978:12;:10;:12::i;:::-;20967:23;;:7;:5;:7::i;:::-;:23;;;20959:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56447:14:::1;55440:7;55422:14;55397:22;:12;:20;:22::i;:::-;:39;;;;:::i;:::-;:50;;55375:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;56484:9:::2;56479:107;56503:14;56499:1;:18;56479:107;;;56539:35;56549:9;56560:13;:11;:13::i;:::-;56539:9;:35::i;:::-;56519:3;;;;;:::i;:::-;;;;56479:107;;;;21038:1:::1;56321:272:::0;;:::o;40777:305::-;40879:4;40931:25;40916:40;;;:11;:40;;;;:105;;;;40988:33;40973:48;;;:11;:48;;;;40916:105;:158;;;;41038:36;41062:11;41038:23;:36::i;:::-;40916:158;40896:178;;40777:305;;;:::o;41722:100::-;41776:13;41809:5;41802:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41722:100;:::o;43281:221::-;43357:7;43385:16;43393:7;43385;:16::i;:::-;43377:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;43470:15;:24;43486:7;43470:24;;;;;;;;;;;;;;;;;;;;;43463:31;;43281:221;;;:::o;42804:411::-;42885:13;42901:23;42916:7;42901:14;:23::i;:::-;42885:39;;42949:5;42943:11;;:2;:11;;;;42935:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;43043:5;43027:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;43052:37;43069:5;43076:12;:10;:12::i;:::-;43052:16;:37::i;:::-;43027:62;43005:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;43186:21;43195:2;43199:7;43186:8;:21::i;:::-;42874:341;42804:411;;:::o;59140:108::-;20978:12;:10;:12::i;:::-;20967:23;;:7;:5;:7::i;:::-;:23;;;20959:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59235:5:::1;59218:14;:22;;;;;;;;;;;;:::i;:::-;;59140:108:::0;:::o;54342:28::-;;;;;;;;;;;;;:::o;58858:103::-;58904:7;58931:22;:12;:20;:22::i;:::-;58924:29;;58858:103;:::o;54415:30::-;;;;;;;;;;;;;:::o;44031:339::-;44226:41;44245:12;:10;:12::i;:::-;44259:7;44226:18;:41::i;:::-;44218:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;44334:28;44344:4;44350:2;44354:7;44334:9;:28::i;:::-;44031:339;;;:::o;54821:55::-;;;;;;;;;;;;;;;;;:::o;54613:33::-;;;;:::o;58170:617::-;12693:1;13291:7;;:19;;13283:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12693:1;13424:7;:18;;;;55241::::1;;;;;;;;;;;55233:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;58323:15:::2;;58340:14;55660:9;55642:14;55634:5;:22;;;;:::i;:::-;:35;55612:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;58382:14:::3;55440:7;55422:14;55397:22;:12;:20;:22::i;:::-;:39;;;;:::i;:::-;:50;;55375:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;58414:24:::4;58441:20;:32;58462:10;58441:32;;;;;;;;;;;;;;;;58414:59;;54293:1;58511:14;58492:16;:33;;;;:::i;:::-;:56;;58484:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;58645:14;58626:16;:33;;;;:::i;:::-;58591:20;:32;58612:10;58591:32;;;;;;;;;;;;;;;:68;;;;58677:9;58672:108;58696:14;58692:1;:18;58672:108;;;58732:36;58742:10;58754:13;:11;:13::i;:::-;58732:9;:36::i;:::-;58712:3;;;;;:::i;:::-;;;;58672:108;;;;58403:384;55732:1:::3;55297::::2;;12649::::0;13603:7;:22;;;;58170:617;:::o;54454:45::-;;;;:::o;54653:36::-;;;;:::o;60403:143::-;20978:12;:10;:12::i;:::-;20967:23;;:7;:5;:7::i;:::-;:23;;;20959:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60451:15:::1;60469:21;60451:39;;60509:10;60501:28;;:37;60530:7;60501:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;60440:106;60403:143::o:0;57409:753::-;12693:1;13291:7;;:19;;13283:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12693:1;13424:7;:18;;;;55119:19:::1;;;;;;;;;;;55111:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;57627:20:::2;;57649:14;55536:205;;55660:9;55642:14;55634:5;:22;;;;:::i;:::-;:35;55612:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;57691:14:::3;55314:214;;55440:7;55422:14;55397:22;:12;:20;:22::i;:::-;:39;;;;:::i;:::-;:50;;55375:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;57735:11:::4;;57748:21;;55856:144;55893:11;;55856:144;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55923:4;55973:10;55956:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;55946:39;;;;;;55856:18;:144::i;:::-;55834:224;;;;;;;;;;;;:::i;:::-;;;;;;;;;57787:24:::5;57814:21;:33;57836:10;57814:33;;;;;;;;;;;;;;;;57787:60;;54293:1;57885:14;57866:33;;:16;:33;;;;:::i;:::-;:56;;57858:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;58020:14;58001:33;;:16;:33;;;;:::i;:::-;57965:21;:33;57987:10;57965:33;;;;;;;;;;;;;;;:69;;;;58052:9;58047:108;58071:14;58067:18;;:1;:18;58047:108;;;58107:36;58117:10;58129:13;:11;:13::i;:::-;58107:9;:36::i;:::-;58087:3;;;;;:::i;:::-;;;;58047:108;;;;57776:386;55519:1:::4;;;55732::::3;55177::::2;;12649::::0;13603:7;:22;;;;57409:753;;;:::o;44441:185::-;44579:39;44596:4;44602:2;44606:7;44579:39;;;;;;;;;;;;:16;:39::i;:::-;44441:185;;;:::o;60554:168::-;20978:12;:10;:12::i;:::-;20967:23;;:7;:5;:7::i;:::-;:23;;;20959:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60620:15:::1;60638:5;:15;;;60662:4;60638:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60620:48;;60679:5;:14;;;60694:10;60706:7;60679:35;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;60609:113;60554:168:::0;:::o;54301:32::-;;;:::o;59032:100::-;20978:12;:10;:12::i;:::-;20967:23;;:7;:5;:7::i;:::-;:23;;;20959:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59116:8:::1;59106:7;:18;;;;;;;;;;;;:::i;:::-;;59032:100:::0;:::o;59942:137::-;20978:12;:10;:12::i;:::-;20967:23;;:7;:5;:7::i;:::-;:23;;;20959:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60051:20:::1;60029:19;;:42;;;;;;;;;;;;;;;;;;59942:137:::0;:::o;41416:239::-;41488:7;41508:13;41524:7;:16;41532:7;41524:16;;;;;;;;;;;;;;;;;;;;;41508:32;;41576:1;41559:19;;:5;:19;;;;41551:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41642:5;41635:12;;;41416:239;;;:::o;54182:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;41146:208::-;41218:7;41263:1;41246:19;;:5;:19;;;;41238:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;41330:9;:16;41340:5;41330:16;;;;;;;;;;;;;;;;41323:23;;41146:208;;;:::o;21398:103::-;20978:12;:10;:12::i;:::-;20967:23;;:7;:5;:7::i;:::-;:23;;;20959:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21463:30:::1;21490:1;21463:18;:30::i;:::-;21398:103::o:0;54698:53::-;;;;;;;;;;;;;;;;;:::o;59809:125::-;20978:12;:10;:12::i;:::-;20967:23;;:7;:5;:7::i;:::-;:23;;;20959:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59909:17:::1;59890:16;;:36;;;;;;;;;;;;;;;;;;59809:125:::0;:::o;59278:106::-;20978:12;:10;:12::i;:::-;20967:23;;:7;:5;:7::i;:::-;:23;;;20959:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59370:6:::1;59352:15;:24;;;;59278:106:::0;:::o;56666:735::-;12693:1;13291:7;;:19;;13283:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12693:1;13424:7;:18;;;;54998:16:::1;;;;;;;;;;;54990:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;56878:17:::2;;56897:14;55536:205;;55660:9;55642:14;55634:5;:22;;;;:::i;:::-;:35;55612:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;56939:14:::3;55314:214;;55440:7;55422:14;55397:22;:12;:20;:22::i;:::-;:39;;;;:::i;:::-;:50;;55375:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;56983:11:::4;;56996:18;;55856:144;55893:11;;55856:144;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55923:4;55973:10;55956:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;55946:39;;;;;;55856:18;:144::i;:::-;55834:224;;;;;;;;;;;;:::i;:::-;;;;;;;;;57032:24:::5;57059:18;:30;57078:10;57059:30;;;;;;;;;;;;;;;;57032:57;;54293:1;57127:14;57108:33;;:16;:33;;;;:::i;:::-;:56;;57100:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;57259:14;57240:33;;:16;:33;;;;:::i;:::-;57207:18;:30;57226:10;57207:30;;;;;;;;;;;;;;;:66;;;;57291:9;57286:108;57310:14;57306:18;;:1;:18;57286:108;;;57346:36;57356:10;57368:13;:11;:13::i;:::-;57346:9;:36::i;:::-;57326:3;;;;;:::i;:::-;;;;57286:108;;;;57021:380;55519:1:::4;;;55732::::3;55050::::2;;12649::::0;13603:7;:22;;;;56666:735;;;:::o;54758:56::-;;;;;;;;;;;;;;;;;:::o;54247:47::-;54293:1;54247:47;:::o;20747:87::-;20793:7;20820:6;;;;;;;;;;;20813:13;;20747:87;:::o;60245:128::-;20978:12;:10;:12::i;:::-;20967:23;;:7;:5;:7::i;:::-;:23;;;20959:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60354:11:::1;60330:21;:35;;;;60245:128:::0;:::o;41891:104::-;41947:13;41980:7;41973:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41891:104;:::o;54561:43::-;;;;:::o;43574:155::-;43669:52;43688:12;:10;:12::i;:::-;43702:8;43712;43669:18;:52::i;:::-;43574:155;;:::o;59392:106::-;20978:12;:10;:12::i;:::-;20967:23;;:7;:5;:7::i;:::-;:23;;;20959:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59484:6:::1;59464:17;:26;;;;59392:106:::0;:::o;54506:48::-;;;;:::o;44697:328::-;44872:41;44891:12;:10;:12::i;:::-;44905:7;44872:18;:41::i;:::-;44864:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;44978:39;44992:4;44998:2;45002:7;45011:5;44978:13;:39::i;:::-;44697:328;;;;:::o;54210:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;60990:276::-;61108:13;61147:16;61155:7;61147;:16::i;:::-;61139:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;61229:7;61238:18;:7;:16;:18::i;:::-;61212:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61198:60;;60990:276;;;:::o;60115:122::-;20978:12;:10;:12::i;:::-;20967:23;;:7;:5;:7::i;:::-;:23;;;20959:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60218:11:::1;60197:18;:32;;;;60115:122:::0;:::o;59668:133::-;20978:12;:10;:12::i;:::-;20967:23;;:7;:5;:7::i;:::-;:23;;;20959:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59774:19:::1;59753:18;;:40;;;;;;;;;;;;;;;;;;59668:133:::0;:::o;43800:164::-;43897:4;43921:18;:25;43940:5;43921:25;;;;;;;;;;;;;;;:35;43947:8;43921:35;;;;;;;;;;;;;;;;;;;;;;;;;43914:42;;43800:164;;;;:::o;54377:31::-;;;;;;;;;;;;;:::o;21656:201::-;20978:12;:10;:12::i;:::-;20967:23;;:7;:5;:7::i;:::-;:23;;;20959:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21765:1:::1;21745:22;;:8;:22;;;;21737:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21821:28;21840:8;21821:18;:28::i;:::-;21656:201:::0;:::o;59506:112::-;20978:12;:10;:12::i;:::-;20967:23;;:7;:5;:7::i;:::-;:23;;;20959:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59604:6:::1;59581:20;:29;;;;59506:112:::0;:::o;19471:98::-;19524:7;19551:10;19544:17;;19471:98;:::o;7899:114::-;7964:7;7991;:14;;;7984:21;;7899:114;;;:::o;60787:132::-;60827:7;60847:24;:12;:22;:24::i;:::-;60889:22;:12;:20;:22::i;:::-;60882:29;;60787:132;:::o;47519:110::-;47595:26;47605:2;47609:7;47595:26;;;;;;;;;;;;:9;:26::i;:::-;47519:110;;:::o;33531:157::-;33616:4;33655:25;33640:40;;;:11;:40;;;;33633:47;;33531:157;;;:::o;46535:127::-;46600:4;46652:1;46624:30;;:7;:16;46632:7;46624:16;;;;;;;;;;;;;;;;;;;;;:30;;;;46617:37;;46535:127;;;:::o;50681:174::-;50783:2;50756:15;:24;50772:7;50756:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;50839:7;50835:2;50801:46;;50810:23;50825:7;50810:14;:23::i;:::-;50801:46;;;;;;;;;;;;50681:174;;:::o;46829:348::-;46922:4;46947:16;46955:7;46947;:16::i;:::-;46939:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;47023:13;47039:23;47054:7;47039:14;:23::i;:::-;47023:39;;47092:5;47081:16;;:7;:16;;;:51;;;;47125:7;47101:31;;:20;47113:7;47101:11;:20::i;:::-;:31;;;47081:51;:87;;;;47136:32;47153:5;47160:7;47136:16;:32::i;:::-;47081:87;47073:96;;;46829:348;;;;:::o;49938:625::-;50097:4;50070:31;;:23;50085:7;50070:14;:23::i;:::-;:31;;;50062:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;50176:1;50162:16;;:2;:16;;;;50154:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;50232:39;50253:4;50259:2;50263:7;50232:20;:39::i;:::-;50336:29;50353:1;50357:7;50336:8;:29::i;:::-;50397:1;50378:9;:15;50388:4;50378:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;50426:1;50409:9;:13;50419:2;50409:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;50457:2;50438:7;:16;50446:7;50438:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;50496:7;50492:2;50477:27;;50486:4;50477:27;;;;;;;;;;;;50517:38;50537:4;50543:2;50547:7;50517:19;:38::i;:::-;49938:625;;;:::o;9415:190::-;9540:4;9593;9564:25;9577:5;9584:4;9564:12;:25::i;:::-;:33;9557:40;;9415:190;;;;;:::o;22017:191::-;22091:16;22110:6;;;;;;;;;;;22091:25;;22136:8;22127:6;;:17;;;;;;;;;;;;;;;;;;22191:8;22160:40;;22181:8;22160:40;;;;;;;;;;;;22080:128;22017:191;:::o;50997:315::-;51152:8;51143:17;;:5;:17;;;;51135:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;51239:8;51201:18;:25;51220:5;51201:25;;;;;;;;;;;;;;;:35;51227:8;51201:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;51285:8;51263:41;;51278:5;51263:41;;;51295:8;51263:41;;;;;;:::i;:::-;;;;;;;;50997:315;;;:::o;45907:::-;46064:28;46074:4;46080:2;46084:7;46064:9;:28::i;:::-;46111:48;46134:4;46140:2;46144:7;46153:5;46111:22;:48::i;:::-;46103:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;45907:315;;;;:::o;17033:723::-;17089:13;17319:1;17310:5;:10;17306:53;;;17337:10;;;;;;;;;;;;;;;;;;;;;17306:53;17369:12;17384:5;17369:20;;17400:14;17425:78;17440:1;17432:4;:9;17425:78;;17458:8;;;;;:::i;:::-;;;;17489:2;17481:10;;;;;:::i;:::-;;;17425:78;;;17513:19;17545:6;17535:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17513:39;;17563:154;17579:1;17570:5;:10;17563:154;;17607:1;17597:11;;;;;:::i;:::-;;;17674:2;17666:5;:10;;;;:::i;:::-;17653:2;:24;;;;:::i;:::-;17640:39;;17623:6;17630;17623:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;17703:2;17694:11;;;;;:::i;:::-;;;17563:154;;;17741:6;17727:21;;;;;17033:723;;;;:::o;8021:127::-;8128:1;8110:7;:14;;;:19;;;;;;;;;;;8021:127;:::o;47856:321::-;47986:18;47992:2;47996:7;47986:5;:18::i;:::-;48037:54;48068:1;48072:2;48076:7;48085:5;48037:22;:54::i;:::-;48015:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;47856:321;;;:::o;53248:126::-;;;;:::o;53759:125::-;;;;:::o;9967:675::-;10050:7;10070:20;10093:4;10070:27;;10113:9;10108:497;10132:5;:12;10128:1;:16;10108:497;;;10166:20;10189:5;10195:1;10189:8;;;;;;;;:::i;:::-;;;;;;;;10166:31;;10232:12;10216;:28;10212:382;;10359:42;10374:12;10388;10359:14;:42::i;:::-;10344:57;;10212:382;;;10536:42;10551:12;10565;10536:14;:42::i;:::-;10521:57;;10212:382;10151:454;10146:3;;;;;:::i;:::-;;;;10108:497;;;;10622:12;10615:19;;;9967:675;;;;:::o;51877:799::-;52032:4;52053:15;:2;:13;;;:15::i;:::-;52049:620;;;52105:2;52089:36;;;52126:12;:10;:12::i;:::-;52140:4;52146:7;52155:5;52089:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;52085:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52348:1;52331:6;:13;:18;52327:272;;;52374:60;;;;;;;;;;:::i;:::-;;;;;;;;52327:272;52549:6;52543:13;52534:6;52530:2;52526:15;52519:38;52085:529;52222:41;;;52212:51;;;:6;:51;;;;52205:58;;;;;52049:620;52653:4;52646:11;;51877:799;;;;;;;:::o;48513:439::-;48607:1;48593:16;;:2;:16;;;;48585:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;48666:16;48674:7;48666;:16::i;:::-;48665:17;48657:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;48728:45;48757:1;48761:2;48765:7;48728:20;:45::i;:::-;48803:1;48786:9;:13;48796:2;48786:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;48834:2;48815:7;:16;48823:7;48815:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;48879:7;48875:2;48854:33;;48871:1;48854:33;;;;;;;;;;;;48900:44;48928:1;48932:2;48936:7;48900:19;:44::i;:::-;48513:439;;:::o;10650:224::-;10718:13;10781:1;10775:4;10768:15;10810:1;10804:4;10797:15;10851:4;10845;10835:21;10826:30;;10650:224;;;;:::o;23448:326::-;23508:4;23765:1;23743:7;:19;;;:23;23736:30;;23448:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;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:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:137::-;1770:5;1801:6;1795:13;1786:22;;1817:30;1841:5;1817:30;:::i;:::-;1716:137;;;;:::o;1859:139::-;1905:5;1943:6;1930:20;1921:29;;1959:33;1986:5;1959:33;:::i;:::-;1859:139;;;;:::o;2004:137::-;2049:5;2087:6;2074:20;2065:29;;2103:32;2129:5;2103:32;:::i;:::-;2004:137;;;;:::o;2147:141::-;2203:5;2234:6;2228:13;2219:22;;2250:32;2276:5;2250:32;:::i;:::-;2147:141;;;;:::o;2307:338::-;2362:5;2411:3;2404:4;2396:6;2392:17;2388:27;2378:122;;2419:79;;:::i;:::-;2378:122;2536:6;2523:20;2561:78;2635:3;2627:6;2620:4;2612:6;2608:17;2561:78;:::i;:::-;2552:87;;2368:277;2307:338;;;;:::o;2651:167::-;2711:5;2749:6;2736:20;2727:29;;2765:47;2806:5;2765:47;:::i;:::-;2651:167;;;;:::o;2838:340::-;2894:5;2943:3;2936:4;2928:6;2924:17;2920:27;2910:122;;2951:79;;:::i;:::-;2910:122;3068:6;3055:20;3093:79;3168:3;3160:6;3153:4;3145:6;3141:17;3093:79;:::i;:::-;3084:88;;2900:278;2838:340;;;;:::o;3184:139::-;3230:5;3268:6;3255:20;3246:29;;3284:33;3311:5;3284:33;:::i;:::-;3184:139;;;;:::o;3329:143::-;3386:5;3417:6;3411:13;3402:22;;3433:33;3460:5;3433:33;:::i;:::-;3329:143;;;;:::o;3478:135::-;3522:5;3560:6;3547:20;3538:29;;3576:31;3601:5;3576:31;:::i;:::-;3478:135;;;;:::o;3619:329::-;3678:6;3727:2;3715:9;3706:7;3702:23;3698:32;3695:119;;;3733:79;;:::i;:::-;3695:119;3853:1;3878:53;3923:7;3914:6;3903:9;3899:22;3878:53;:::i;:::-;3868:63;;3824:117;3619:329;;;;:::o;3954:474::-;4022:6;4030;4079:2;4067:9;4058:7;4054:23;4050:32;4047:119;;;4085:79;;:::i;:::-;4047:119;4205:1;4230:53;4275:7;4266:6;4255:9;4251:22;4230:53;:::i;:::-;4220:63;;4176:117;4332:2;4358:53;4403:7;4394:6;4383:9;4379:22;4358:53;:::i;:::-;4348:63;;4303:118;3954:474;;;;;:::o;4434:619::-;4511:6;4519;4527;4576:2;4564:9;4555:7;4551:23;4547:32;4544:119;;;4582:79;;:::i;:::-;4544:119;4702:1;4727:53;4772:7;4763:6;4752:9;4748:22;4727:53;:::i;:::-;4717:63;;4673:117;4829:2;4855:53;4900:7;4891:6;4880:9;4876:22;4855:53;:::i;:::-;4845:63;;4800:118;4957:2;4983:53;5028:7;5019:6;5008:9;5004:22;4983:53;:::i;:::-;4973:63;;4928:118;4434:619;;;;;:::o;5059:943::-;5154:6;5162;5170;5178;5227:3;5215:9;5206:7;5202:23;5198:33;5195:120;;;5234:79;;:::i;:::-;5195:120;5354:1;5379:53;5424:7;5415:6;5404:9;5400:22;5379:53;:::i;:::-;5369:63;;5325:117;5481:2;5507:53;5552:7;5543:6;5532:9;5528:22;5507:53;:::i;:::-;5497:63;;5452:118;5609:2;5635:53;5680:7;5671:6;5660:9;5656:22;5635:53;:::i;:::-;5625:63;;5580:118;5765:2;5754:9;5750:18;5737:32;5796:18;5788:6;5785:30;5782:117;;;5818:79;;:::i;:::-;5782:117;5923:62;5977:7;5968:6;5957:9;5953:22;5923:62;:::i;:::-;5913:72;;5708:287;5059:943;;;;;;;:::o;6008:468::-;6073:6;6081;6130:2;6118:9;6109:7;6105:23;6101:32;6098:119;;;6136:79;;:::i;:::-;6098:119;6256:1;6281:53;6326:7;6317:6;6306:9;6302:22;6281:53;:::i;:::-;6271:63;;6227:117;6383:2;6409:50;6451:7;6442:6;6431:9;6427:22;6409:50;:::i;:::-;6399:60;;6354:115;6008:468;;;;;:::o;6482:474::-;6550:6;6558;6607:2;6595:9;6586:7;6582:23;6578:32;6575:119;;;6613:79;;:::i;:::-;6575:119;6733:1;6758:53;6803:7;6794:6;6783:9;6779:22;6758:53;:::i;:::-;6748:63;;6704:117;6860:2;6886:53;6931:7;6922:6;6911:9;6907:22;6886:53;:::i;:::-;6876:63;;6831:118;6482:474;;;;;:::o;6962:323::-;7018:6;7067:2;7055:9;7046:7;7042:23;7038:32;7035:119;;;7073:79;;:::i;:::-;7035:119;7193:1;7218:50;7260:7;7251:6;7240:9;7236:22;7218:50;:::i;:::-;7208:60;;7164:114;6962:323;;;;:::o;7291:345::-;7358:6;7407:2;7395:9;7386:7;7382:23;7378:32;7375:119;;;7413:79;;:::i;:::-;7375:119;7533:1;7558:61;7611:7;7602:6;7591:9;7587:22;7558:61;:::i;:::-;7548:71;;7504:125;7291:345;;;;:::o;7642:329::-;7701:6;7750:2;7738:9;7729:7;7725:23;7721:32;7718:119;;;7756:79;;:::i;:::-;7718:119;7876:1;7901:53;7946:7;7937:6;7926:9;7922:22;7901:53;:::i;:::-;7891:63;;7847:117;7642:329;;;;:::o;7977:327::-;8035:6;8084:2;8072:9;8063:7;8059:23;8055:32;8052:119;;;8090:79;;:::i;:::-;8052:119;8210:1;8235:52;8279:7;8270:6;8259:9;8255:22;8235:52;:::i;:::-;8225:62;;8181:116;7977:327;;;;:::o;8310:349::-;8379:6;8428:2;8416:9;8407:7;8403:23;8399:32;8396:119;;;8434:79;;:::i;:::-;8396:119;8554:1;8579:63;8634:7;8625:6;8614:9;8610:22;8579:63;:::i;:::-;8569:73;;8525:127;8310:349;;;;:::o;8665:357::-;8738:6;8787:2;8775:9;8766:7;8762:23;8758:32;8755:119;;;8793:79;;:::i;:::-;8755:119;8913:1;8938:67;8997:7;8988:6;8977:9;8973:22;8938:67;:::i;:::-;8928:77;;8884:131;8665:357;;;;:::o;9028:509::-;9097:6;9146:2;9134:9;9125:7;9121:23;9117:32;9114:119;;;9152:79;;:::i;:::-;9114:119;9300:1;9289:9;9285:17;9272:31;9330:18;9322:6;9319:30;9316:117;;;9352:79;;:::i;:::-;9316:117;9457:63;9512:7;9503:6;9492:9;9488:22;9457:63;:::i;:::-;9447:73;;9243:287;9028:509;;;;:::o;9543:329::-;9602:6;9651:2;9639:9;9630:7;9626:23;9622:32;9619:119;;;9657:79;;:::i;:::-;9619:119;9777:1;9802:53;9847:7;9838:6;9827:9;9823:22;9802:53;:::i;:::-;9792:63;;9748:117;9543:329;;;;:::o;9878:351::-;9948:6;9997:2;9985:9;9976:7;9972:23;9968:32;9965:119;;;10003:79;;:::i;:::-;9965:119;10123:1;10148:64;10204:7;10195:6;10184:9;10180:22;10148:64;:::i;:::-;10138:74;;10094:128;9878:351;;;;:::o;10235:474::-;10303:6;10311;10360:2;10348:9;10339:7;10335:23;10331:32;10328:119;;;10366:79;;:::i;:::-;10328:119;10486:1;10511:53;10556:7;10547:6;10536:9;10532:22;10511:53;:::i;:::-;10501:63;;10457:117;10613:2;10639:53;10684:7;10675:6;10664:9;10660:22;10639:53;:::i;:::-;10629:63;;10584:118;10235:474;;;;;:::o;10715:700::-;10808:6;10816;10824;10873:2;10861:9;10852:7;10848:23;10844:32;10841:119;;;10879:79;;:::i;:::-;10841:119;10999:1;11024:51;11067:7;11058:6;11047:9;11043:22;11024:51;:::i;:::-;11014:61;;10970:115;11152:2;11141:9;11137:18;11124:32;11183:18;11175:6;11172:30;11169:117;;;11205:79;;:::i;:::-;11169:117;11318:80;11390:7;11381:6;11370:9;11366:22;11318:80;:::i;:::-;11300:98;;;;11095:313;10715:700;;;;;:::o;11421:118::-;11508:24;11526:5;11508:24;:::i;:::-;11503:3;11496:37;11421:118;;:::o;11545:157::-;11650:45;11670:24;11688:5;11670:24;:::i;:::-;11650:45;:::i;:::-;11645:3;11638:58;11545:157;;:::o;11708:109::-;11789:21;11804:5;11789:21;:::i;:::-;11784:3;11777:34;11708:109;;:::o;11823:118::-;11910:24;11928:5;11910:24;:::i;:::-;11905:3;11898:37;11823:118;;:::o;11947:360::-;12033:3;12061:38;12093:5;12061:38;:::i;:::-;12115:70;12178:6;12173:3;12115:70;:::i;:::-;12108:77;;12194:52;12239:6;12234:3;12227:4;12220:5;12216:16;12194:52;:::i;:::-;12271:29;12293:6;12271:29;:::i;:::-;12266:3;12262:39;12255:46;;12037:270;11947:360;;;;:::o;12313:364::-;12401:3;12429:39;12462:5;12429:39;:::i;:::-;12484:71;12548:6;12543:3;12484:71;:::i;:::-;12477:78;;12564:52;12609:6;12604:3;12597:4;12590:5;12586:16;12564:52;:::i;:::-;12641:29;12663:6;12641:29;:::i;:::-;12636:3;12632:39;12625:46;;12405:272;12313:364;;;;:::o;12683:377::-;12789:3;12817:39;12850:5;12817:39;:::i;:::-;12872:89;12954:6;12949:3;12872:89;:::i;:::-;12865:96;;12970:52;13015:6;13010:3;13003:4;12996:5;12992:16;12970:52;:::i;:::-;13047:6;13042:3;13038:16;13031:23;;12793:267;12683:377;;;;:::o;13090:845::-;13193:3;13230:5;13224:12;13259:36;13285:9;13259:36;:::i;:::-;13311:89;13393:6;13388:3;13311:89;:::i;:::-;13304:96;;13431:1;13420:9;13416:17;13447:1;13442:137;;;;13593:1;13588:341;;;;13409:520;;13442:137;13526:4;13522:9;13511;13507:25;13502:3;13495:38;13562:6;13557:3;13553:16;13546:23;;13442:137;;13588:341;13655:38;13687:5;13655:38;:::i;:::-;13715:1;13729:154;13743:6;13740:1;13737:13;13729:154;;;13817:7;13811:14;13807:1;13802:3;13798:11;13791:35;13867:1;13858:7;13854:15;13843:26;;13765:4;13762:1;13758:12;13753:17;;13729:154;;;13912:6;13907:3;13903:16;13896:23;;13595:334;;13409:520;;13197:738;;13090:845;;;;:::o;13941:366::-;14083:3;14104:67;14168:2;14163:3;14104:67;:::i;:::-;14097:74;;14180:93;14269:3;14180:93;:::i;:::-;14298:2;14293:3;14289:12;14282:19;;13941:366;;;:::o;14313:::-;14455:3;14476:67;14540:2;14535:3;14476:67;:::i;:::-;14469:74;;14552:93;14641:3;14552:93;:::i;:::-;14670:2;14665:3;14661:12;14654:19;;14313:366;;;:::o;14685:::-;14827:3;14848:67;14912:2;14907:3;14848:67;:::i;:::-;14841:74;;14924:93;15013:3;14924:93;:::i;:::-;15042:2;15037:3;15033:12;15026:19;;14685:366;;;:::o;15057:::-;15199:3;15220:67;15284:2;15279:3;15220:67;:::i;:::-;15213:74;;15296:93;15385:3;15296:93;:::i;:::-;15414:2;15409:3;15405:12;15398:19;;15057:366;;;:::o;15429:::-;15571:3;15592:67;15656:2;15651:3;15592:67;:::i;:::-;15585:74;;15668:93;15757:3;15668:93;:::i;:::-;15786:2;15781:3;15777:12;15770:19;;15429:366;;;:::o;15801:::-;15943:3;15964:67;16028:2;16023:3;15964:67;:::i;:::-;15957:74;;16040:93;16129:3;16040:93;:::i;:::-;16158:2;16153:3;16149:12;16142:19;;15801:366;;;:::o;16173:::-;16315:3;16336:67;16400:2;16395:3;16336:67;:::i;:::-;16329:74;;16412:93;16501:3;16412:93;:::i;:::-;16530:2;16525:3;16521:12;16514:19;;16173:366;;;:::o;16545:::-;16687:3;16708:67;16772:2;16767:3;16708:67;:::i;:::-;16701:74;;16784:93;16873:3;16784:93;:::i;:::-;16902:2;16897:3;16893:12;16886:19;;16545:366;;;:::o;16917:::-;17059:3;17080:67;17144:2;17139:3;17080:67;:::i;:::-;17073:74;;17156:93;17245:3;17156:93;:::i;:::-;17274:2;17269:3;17265:12;17258:19;;16917:366;;;:::o;17289:::-;17431:3;17452:67;17516:2;17511:3;17452:67;:::i;:::-;17445:74;;17528:93;17617:3;17528:93;:::i;:::-;17646:2;17641:3;17637:12;17630:19;;17289:366;;;:::o;17661:::-;17803:3;17824:67;17888:2;17883:3;17824:67;:::i;:::-;17817:74;;17900:93;17989:3;17900:93;:::i;:::-;18018:2;18013:3;18009:12;18002:19;;17661:366;;;:::o;18033:::-;18175:3;18196:67;18260:2;18255:3;18196:67;:::i;:::-;18189:74;;18272:93;18361:3;18272:93;:::i;:::-;18390:2;18385:3;18381:12;18374:19;;18033:366;;;:::o;18405:::-;18547:3;18568:67;18632:2;18627:3;18568:67;:::i;:::-;18561:74;;18644:93;18733:3;18644:93;:::i;:::-;18762:2;18757:3;18753:12;18746:19;;18405:366;;;:::o;18777:::-;18919:3;18940:67;19004:2;18999:3;18940:67;:::i;:::-;18933:74;;19016:93;19105:3;19016:93;:::i;:::-;19134:2;19129:3;19125:12;19118:19;;18777:366;;;:::o;19149:::-;19291:3;19312:67;19376:2;19371:3;19312:67;:::i;:::-;19305:74;;19388:93;19477:3;19388:93;:::i;:::-;19506:2;19501:3;19497:12;19490:19;;19149:366;;;:::o;19521:::-;19663:3;19684:67;19748:2;19743:3;19684:67;:::i;:::-;19677:74;;19760:93;19849:3;19760:93;:::i;:::-;19878:2;19873:3;19869:12;19862:19;;19521:366;;;:::o;19893:::-;20035:3;20056:67;20120:2;20115:3;20056:67;:::i;:::-;20049:74;;20132:93;20221:3;20132:93;:::i;:::-;20250:2;20245:3;20241:12;20234:19;;19893:366;;;:::o;20265:::-;20407:3;20428:67;20492:2;20487:3;20428:67;:::i;:::-;20421:74;;20504:93;20593:3;20504:93;:::i;:::-;20622:2;20617:3;20613:12;20606:19;;20265:366;;;:::o;20637:::-;20779:3;20800:67;20864:2;20859:3;20800:67;:::i;:::-;20793:74;;20876:93;20965:3;20876:93;:::i;:::-;20994:2;20989:3;20985:12;20978:19;;20637:366;;;:::o;21009:::-;21151:3;21172:67;21236:2;21231:3;21172:67;:::i;:::-;21165:74;;21248:93;21337:3;21248:93;:::i;:::-;21366:2;21361:3;21357:12;21350:19;;21009:366;;;:::o;21381:::-;21523:3;21544:67;21608:2;21603:3;21544:67;:::i;:::-;21537:74;;21620:93;21709:3;21620:93;:::i;:::-;21738:2;21733:3;21729:12;21722:19;;21381:366;;;:::o;21753:::-;21895:3;21916:67;21980:2;21975:3;21916:67;:::i;:::-;21909:74;;21992:93;22081:3;21992:93;:::i;:::-;22110:2;22105:3;22101:12;22094:19;;21753:366;;;:::o;22125:::-;22267:3;22288:67;22352:2;22347:3;22288:67;:::i;:::-;22281:74;;22364:93;22453:3;22364:93;:::i;:::-;22482:2;22477:3;22473:12;22466:19;;22125:366;;;:::o;22497:::-;22639:3;22660:67;22724:2;22719:3;22660:67;:::i;:::-;22653:74;;22736:93;22825:3;22736:93;:::i;:::-;22854:2;22849:3;22845:12;22838:19;;22497:366;;;:::o;22869:::-;23011:3;23032:67;23096:2;23091:3;23032:67;:::i;:::-;23025:74;;23108:93;23197:3;23108:93;:::i;:::-;23226:2;23221:3;23217:12;23210:19;;22869:366;;;:::o;23241:::-;23383:3;23404:67;23468:2;23463:3;23404:67;:::i;:::-;23397:74;;23480:93;23569:3;23480:93;:::i;:::-;23598:2;23593:3;23589:12;23582:19;;23241:366;;;:::o;23613:118::-;23700:24;23718:5;23700:24;:::i;:::-;23695:3;23688:37;23613:118;;:::o;23737:256::-;23849:3;23864:75;23935:3;23926:6;23864:75;:::i;:::-;23964:2;23959:3;23955:12;23948:19;;23984:3;23977:10;;23737:256;;;;:::o;23999:429::-;24176:3;24198:92;24286:3;24277:6;24198:92;:::i;:::-;24191:99;;24307:95;24398:3;24389:6;24307:95;:::i;:::-;24300:102;;24419:3;24412:10;;23999:429;;;;;:::o;24434:222::-;24527:4;24565:2;24554:9;24550:18;24542:26;;24578:71;24646:1;24635:9;24631:17;24622:6;24578:71;:::i;:::-;24434:222;;;;:::o;24662:640::-;24857:4;24895:3;24884:9;24880:19;24872:27;;24909:71;24977:1;24966:9;24962:17;24953:6;24909:71;:::i;:::-;24990:72;25058:2;25047:9;25043:18;25034:6;24990:72;:::i;:::-;25072;25140:2;25129:9;25125:18;25116:6;25072:72;:::i;:::-;25191:9;25185:4;25181:20;25176:2;25165:9;25161:18;25154:48;25219:76;25290:4;25281:6;25219:76;:::i;:::-;25211:84;;24662:640;;;;;;;:::o;25308:332::-;25429:4;25467:2;25456:9;25452:18;25444:26;;25480:71;25548:1;25537:9;25533:17;25524:6;25480:71;:::i;:::-;25561:72;25629:2;25618:9;25614:18;25605:6;25561:72;:::i;:::-;25308:332;;;;;:::o;25646:210::-;25733:4;25771:2;25760:9;25756:18;25748:26;;25784:65;25846:1;25835:9;25831:17;25822:6;25784:65;:::i;:::-;25646:210;;;;:::o;25862:222::-;25955:4;25993:2;25982:9;25978:18;25970:26;;26006:71;26074:1;26063:9;26059:17;26050:6;26006:71;:::i;:::-;25862:222;;;;:::o;26090:313::-;26203:4;26241:2;26230:9;26226:18;26218:26;;26290:9;26284:4;26280:20;26276:1;26265:9;26261:17;26254:47;26318:78;26391:4;26382:6;26318:78;:::i;:::-;26310:86;;26090:313;;;;:::o;26409:419::-;26575:4;26613:2;26602:9;26598:18;26590:26;;26662:9;26656:4;26652:20;26648:1;26637:9;26633:17;26626:47;26690:131;26816:4;26690:131;:::i;:::-;26682:139;;26409:419;;;:::o;26834:::-;27000:4;27038:2;27027:9;27023:18;27015:26;;27087:9;27081:4;27077:20;27073:1;27062:9;27058:17;27051:47;27115:131;27241:4;27115:131;:::i;:::-;27107:139;;26834:419;;;:::o;27259:::-;27425:4;27463:2;27452:9;27448:18;27440:26;;27512:9;27506:4;27502:20;27498:1;27487:9;27483:17;27476:47;27540:131;27666:4;27540:131;:::i;:::-;27532:139;;27259:419;;;:::o;27684:::-;27850:4;27888:2;27877:9;27873:18;27865:26;;27937:9;27931:4;27927:20;27923:1;27912:9;27908:17;27901:47;27965:131;28091:4;27965:131;:::i;:::-;27957:139;;27684:419;;;:::o;28109:::-;28275:4;28313:2;28302:9;28298:18;28290:26;;28362:9;28356:4;28352:20;28348:1;28337:9;28333:17;28326:47;28390:131;28516:4;28390:131;:::i;:::-;28382:139;;28109:419;;;:::o;28534:::-;28700:4;28738:2;28727:9;28723:18;28715:26;;28787:9;28781:4;28777:20;28773:1;28762:9;28758:17;28751:47;28815:131;28941:4;28815:131;:::i;:::-;28807:139;;28534:419;;;:::o;28959:::-;29125:4;29163:2;29152:9;29148:18;29140:26;;29212:9;29206:4;29202:20;29198:1;29187:9;29183:17;29176:47;29240:131;29366:4;29240:131;:::i;:::-;29232:139;;28959:419;;;:::o;29384:::-;29550:4;29588:2;29577:9;29573:18;29565:26;;29637:9;29631:4;29627:20;29623:1;29612:9;29608:17;29601:47;29665:131;29791:4;29665:131;:::i;:::-;29657:139;;29384:419;;;:::o;29809:::-;29975:4;30013:2;30002:9;29998:18;29990:26;;30062:9;30056:4;30052:20;30048:1;30037:9;30033:17;30026:47;30090:131;30216:4;30090:131;:::i;:::-;30082:139;;29809:419;;;:::o;30234:::-;30400:4;30438:2;30427:9;30423:18;30415:26;;30487:9;30481:4;30477:20;30473:1;30462:9;30458:17;30451:47;30515:131;30641:4;30515:131;:::i;:::-;30507:139;;30234:419;;;:::o;30659:::-;30825:4;30863:2;30852:9;30848:18;30840:26;;30912:9;30906:4;30902:20;30898:1;30887:9;30883:17;30876:47;30940:131;31066:4;30940:131;:::i;:::-;30932:139;;30659:419;;;:::o;31084:::-;31250:4;31288:2;31277:9;31273:18;31265:26;;31337:9;31331:4;31327:20;31323:1;31312:9;31308:17;31301:47;31365:131;31491:4;31365:131;:::i;:::-;31357:139;;31084:419;;;:::o;31509:::-;31675:4;31713:2;31702:9;31698:18;31690:26;;31762:9;31756:4;31752:20;31748:1;31737:9;31733:17;31726:47;31790:131;31916:4;31790:131;:::i;:::-;31782:139;;31509:419;;;:::o;31934:::-;32100:4;32138:2;32127:9;32123:18;32115:26;;32187:9;32181:4;32177:20;32173:1;32162:9;32158:17;32151:47;32215:131;32341:4;32215:131;:::i;:::-;32207:139;;31934:419;;;:::o;32359:::-;32525:4;32563:2;32552:9;32548:18;32540:26;;32612:9;32606:4;32602:20;32598:1;32587:9;32583:17;32576:47;32640:131;32766:4;32640:131;:::i;:::-;32632:139;;32359:419;;;:::o;32784:::-;32950:4;32988:2;32977:9;32973:18;32965:26;;33037:9;33031:4;33027:20;33023:1;33012:9;33008:17;33001:47;33065:131;33191:4;33065:131;:::i;:::-;33057:139;;32784:419;;;:::o;33209:::-;33375:4;33413:2;33402:9;33398:18;33390:26;;33462:9;33456:4;33452:20;33448:1;33437:9;33433:17;33426:47;33490:131;33616:4;33490:131;:::i;:::-;33482:139;;33209:419;;;:::o;33634:::-;33800:4;33838:2;33827:9;33823:18;33815:26;;33887:9;33881:4;33877:20;33873:1;33862:9;33858:17;33851:47;33915:131;34041:4;33915:131;:::i;:::-;33907:139;;33634:419;;;:::o;34059:::-;34225:4;34263:2;34252:9;34248:18;34240:26;;34312:9;34306:4;34302:20;34298:1;34287:9;34283:17;34276:47;34340:131;34466:4;34340:131;:::i;:::-;34332:139;;34059:419;;;:::o;34484:::-;34650:4;34688:2;34677:9;34673:18;34665:26;;34737:9;34731:4;34727:20;34723:1;34712:9;34708:17;34701:47;34765:131;34891:4;34765:131;:::i;:::-;34757:139;;34484:419;;;:::o;34909:::-;35075:4;35113:2;35102:9;35098:18;35090:26;;35162:9;35156:4;35152:20;35148:1;35137:9;35133:17;35126:47;35190:131;35316:4;35190:131;:::i;:::-;35182:139;;34909:419;;;:::o;35334:::-;35500:4;35538:2;35527:9;35523:18;35515:26;;35587:9;35581:4;35577:20;35573:1;35562:9;35558:17;35551:47;35615:131;35741:4;35615:131;:::i;:::-;35607:139;;35334:419;;;:::o;35759:::-;35925:4;35963:2;35952:9;35948:18;35940:26;;36012:9;36006:4;36002:20;35998:1;35987:9;35983:17;35976:47;36040:131;36166:4;36040:131;:::i;:::-;36032:139;;35759:419;;;:::o;36184:::-;36350:4;36388:2;36377:9;36373:18;36365:26;;36437:9;36431:4;36427:20;36423:1;36412:9;36408:17;36401:47;36465:131;36591:4;36465:131;:::i;:::-;36457:139;;36184:419;;;:::o;36609:::-;36775:4;36813:2;36802:9;36798:18;36790:26;;36862:9;36856:4;36852:20;36848:1;36837:9;36833:17;36826:47;36890:131;37016:4;36890:131;:::i;:::-;36882:139;;36609:419;;;:::o;37034:::-;37200:4;37238:2;37227:9;37223:18;37215:26;;37287:9;37281:4;37277:20;37273:1;37262:9;37258:17;37251:47;37315:131;37441:4;37315:131;:::i;:::-;37307:139;;37034:419;;;:::o;37459:222::-;37552:4;37590:2;37579:9;37575:18;37567:26;;37603:71;37671:1;37660:9;37656:17;37647:6;37603:71;:::i;:::-;37459:222;;;;:::o;37687:129::-;37721:6;37748:20;;:::i;:::-;37738:30;;37777:33;37805:4;37797:6;37777:33;:::i;:::-;37687:129;;;:::o;37822:75::-;37855:6;37888:2;37882:9;37872:19;;37822:75;:::o;37903:307::-;37964:4;38054:18;38046:6;38043:30;38040:56;;;38076:18;;:::i;:::-;38040:56;38114:29;38136:6;38114:29;:::i;:::-;38106:37;;38198:4;38192;38188:15;38180:23;;37903:307;;;:::o;38216:308::-;38278:4;38368:18;38360:6;38357:30;38354:56;;;38390:18;;:::i;:::-;38354:56;38428:29;38450:6;38428:29;:::i;:::-;38420:37;;38512:4;38506;38502:15;38494:23;;38216:308;;;:::o;38530:141::-;38579:4;38602:3;38594:11;;38625:3;38622:1;38615:14;38659:4;38656:1;38646:18;38638:26;;38530:141;;;:::o;38677:98::-;38728:6;38762:5;38756:12;38746:22;;38677:98;;;:::o;38781:99::-;38833:6;38867:5;38861:12;38851:22;;38781:99;;;:::o;38886:168::-;38969:11;39003:6;38998:3;38991:19;39043:4;39038:3;39034:14;39019:29;;38886:168;;;;:::o;39060:169::-;39144:11;39178:6;39173:3;39166:19;39218:4;39213:3;39209:14;39194:29;;39060:169;;;;:::o;39235:148::-;39337:11;39374:3;39359:18;;39235:148;;;;:::o;39389:305::-;39429:3;39448:20;39466:1;39448:20;:::i;:::-;39443:25;;39482:20;39500:1;39482:20;:::i;:::-;39477:25;;39636:1;39568:66;39564:74;39561:1;39558:81;39555:107;;;39642:18;;:::i;:::-;39555:107;39686:1;39683;39679:9;39672:16;;39389:305;;;;:::o;39700:185::-;39740:1;39757:20;39775:1;39757:20;:::i;:::-;39752:25;;39791:20;39809:1;39791:20;:::i;:::-;39786:25;;39830:1;39820:35;;39835:18;;:::i;:::-;39820:35;39877:1;39874;39870:9;39865:14;;39700:185;;;;:::o;39891:348::-;39931:7;39954:20;39972:1;39954:20;:::i;:::-;39949:25;;39988:20;40006:1;39988:20;:::i;:::-;39983:25;;40176:1;40108:66;40104:74;40101:1;40098:81;40093:1;40086:9;40079:17;40075:105;40072:131;;;40183:18;;:::i;:::-;40072:131;40231:1;40228;40224:9;40213:20;;39891:348;;;;:::o;40245:191::-;40285:4;40305:20;40323:1;40305:20;:::i;:::-;40300:25;;40339:20;40357:1;40339:20;:::i;:::-;40334:25;;40378:1;40375;40372:8;40369:34;;;40383:18;;:::i;:::-;40369:34;40428:1;40425;40421:9;40413:17;;40245:191;;;;:::o;40442:96::-;40479:7;40508:24;40526:5;40508:24;:::i;:::-;40497:35;;40442:96;;;:::o;40544:90::-;40578:7;40621:5;40614:13;40607:21;40596:32;;40544:90;;;:::o;40640:77::-;40677:7;40706:5;40695:16;;40640:77;;;:::o;40723:149::-;40759:7;40799:66;40792:5;40788:78;40777:89;;40723:149;;;:::o;40878:110::-;40929:7;40958:24;40976:5;40958:24;:::i;:::-;40947:35;;40878:110;;;:::o;40994:126::-;41031:7;41071:42;41064:5;41060:54;41049:65;;40994:126;;;:::o;41126:77::-;41163:7;41192:5;41181:16;;41126:77;;;:::o;41209:86::-;41244:7;41284:4;41277:5;41273:16;41262:27;;41209:86;;;:::o;41301:154::-;41385:6;41380:3;41375;41362:30;41447:1;41438:6;41433:3;41429:16;41422:27;41301:154;;;:::o;41461:307::-;41529:1;41539:113;41553:6;41550:1;41547:13;41539:113;;;41638:1;41633:3;41629:11;41623:18;41619:1;41614:3;41610:11;41603:39;41575:2;41572:1;41568:10;41563:15;;41539:113;;;41670:6;41667:1;41664:13;41661:101;;;41750:1;41741:6;41736:3;41732:16;41725:27;41661:101;41510:258;41461:307;;;:::o;41774:320::-;41818:6;41855:1;41849:4;41845:12;41835:22;;41902:1;41896:4;41892:12;41923:18;41913:81;;41979:4;41971:6;41967:17;41957:27;;41913:81;42041:2;42033:6;42030:14;42010:18;42007:38;42004:84;;;42060:18;;:::i;:::-;42004:84;41825:269;41774:320;;;:::o;42100:281::-;42183:27;42205:4;42183:27;:::i;:::-;42175:6;42171:40;42313:6;42301:10;42298:22;42277:18;42265:10;42262:34;42259:62;42256:88;;;42324:18;;:::i;:::-;42256:88;42364:10;42360:2;42353:22;42143:238;42100:281;;:::o;42387:233::-;42426:3;42449:24;42467:5;42449:24;:::i;:::-;42440:33;;42495:66;42488:5;42485:77;42482:103;;;42565:18;;:::i;:::-;42482:103;42612:1;42605:5;42601:13;42594:20;;42387:233;;;:::o;42626:100::-;42665:7;42694:26;42714:5;42694:26;:::i;:::-;42683:37;;42626:100;;;:::o;42732:94::-;42771:7;42800:20;42814:5;42800:20;:::i;:::-;42789:31;;42732:94;;;:::o;42832:176::-;42864:1;42881:20;42899:1;42881:20;:::i;:::-;42876:25;;42915:20;42933:1;42915:20;:::i;:::-;42910:25;;42954:1;42944:35;;42959:18;;:::i;:::-;42944:35;43000:1;42997;42993:9;42988:14;;42832:176;;;;:::o;43014:180::-;43062:77;43059:1;43052:88;43159:4;43156:1;43149:15;43183:4;43180:1;43173:15;43200:180;43248:77;43245:1;43238:88;43345:4;43342:1;43335:15;43369:4;43366:1;43359:15;43386:180;43434:77;43431:1;43424:88;43531:4;43528:1;43521:15;43555:4;43552:1;43545:15;43572:180;43620:77;43617:1;43610:88;43717:4;43714:1;43707:15;43741:4;43738:1;43731:15;43758:180;43806:77;43803:1;43796:88;43903:4;43900:1;43893:15;43927:4;43924:1;43917:15;43944:117;44053:1;44050;44043:12;44067:117;44176:1;44173;44166:12;44190:117;44299:1;44296;44289:12;44313:117;44422:1;44419;44412:12;44436:117;44545:1;44542;44535:12;44559:117;44668:1;44665;44658:12;44682:102;44723:6;44774:2;44770:7;44765:2;44758:5;44754:14;44750:28;44740:38;;44682:102;;;:::o;44790:94::-;44823:8;44871:5;44867:2;44863:14;44842:35;;44790:94;;;:::o;44890:177::-;45030:29;45026:1;45018:6;45014:14;45007:53;44890:177;:::o;45073:237::-;45213:34;45209:1;45201:6;45197:14;45190:58;45282:20;45277:2;45269:6;45265:15;45258:45;45073:237;:::o;45316:225::-;45456:34;45452:1;45444:6;45440:14;45433:58;45525:8;45520:2;45512:6;45508:15;45501:33;45316:225;:::o;45547:224::-;45687:34;45683:1;45675:6;45671:14;45664:58;45756:7;45751:2;45743:6;45739:15;45732:32;45547:224;:::o;45777:178::-;45917:30;45913:1;45905:6;45901:14;45894:54;45777:178;:::o;45961:177::-;46101:29;46097:1;46089:6;46085:14;46078:53;45961:177;:::o;46144:223::-;46284:34;46280:1;46272:6;46268:14;46261:58;46353:6;46348:2;46340:6;46336:15;46329:31;46144:223;:::o;46373:175::-;46513:27;46509:1;46501:6;46497:14;46490:51;46373:175;:::o;46554:231::-;46694:34;46690:1;46682:6;46678:14;46671:58;46763:14;46758:2;46750:6;46746:15;46739:39;46554:231;:::o;46791:180::-;46931:32;46927:1;46919:6;46915:14;46908:56;46791:180;:::o;46977:243::-;47117:34;47113:1;47105:6;47101:14;47094:58;47186:26;47181:2;47173:6;47169:15;47162:51;46977:243;:::o;47226:177::-;47366:29;47362:1;47354:6;47350:14;47343:53;47226:177;:::o;47409:167::-;47549:19;47545:1;47537:6;47533:14;47526:43;47409:167;:::o;47582:229::-;47722:34;47718:1;47710:6;47706:14;47699:58;47791:12;47786:2;47778:6;47774:15;47767:37;47582:229;:::o;47817:228::-;47957:34;47953:1;47945:6;47941:14;47934:58;48026:11;48021:2;48013:6;48009:15;48002:36;47817:228;:::o;48051:182::-;48191:34;48187:1;48179:6;48175:14;48168:58;48051:182;:::o;48239:231::-;48379:34;48375:1;48367:6;48363:14;48356:58;48448:14;48443:2;48435:6;48431:15;48424:39;48239:231;:::o;48476:172::-;48616:24;48612:1;48604:6;48600:14;48593:48;48476:172;:::o;48654:182::-;48794:34;48790:1;48782:6;48778:14;48771:58;48654:182;:::o;48842:220::-;48982:34;48978:1;48970:6;48966:14;48959:58;49051:3;49046:2;49038:6;49034:15;49027:28;48842:220;:::o;49068:236::-;49208:34;49204:1;49196:6;49192:14;49185:58;49277:19;49272:2;49264:6;49260:15;49253:44;49068:236;:::o;49310:220::-;49450:34;49446:1;49438:6;49434:14;49427:58;49519:3;49514:2;49506:6;49502:15;49495:28;49310:220;:::o;49536:174::-;49676:26;49672:1;49664:6;49660:14;49653:50;49536:174;:::o;49716:181::-;49856:33;49852:1;49844:6;49840:14;49833:57;49716:181;:::o;49903:173::-;50043:25;50039:1;50031:6;50027:14;50020:49;49903:173;:::o;50082:170::-;50222:22;50218:1;50210:6;50206:14;50199:46;50082:170;:::o;50258:122::-;50331:24;50349:5;50331:24;:::i;:::-;50324:5;50321:35;50311:63;;50370:1;50367;50360:12;50311:63;50258:122;:::o;50386:116::-;50456:21;50471:5;50456:21;:::i;:::-;50449:5;50446:32;50436:60;;50492:1;50489;50482:12;50436:60;50386:116;:::o;50508:122::-;50581:24;50599:5;50581:24;:::i;:::-;50574:5;50571:35;50561:63;;50620:1;50617;50610:12;50561:63;50508:122;:::o;50636:120::-;50708:23;50725:5;50708:23;:::i;:::-;50701:5;50698:34;50688:62;;50746:1;50743;50736:12;50688:62;50636:120;:::o;50762:150::-;50849:38;50881:5;50849:38;:::i;:::-;50842:5;50839:49;50829:77;;50902:1;50899;50892:12;50829:77;50762:150;:::o;50918:122::-;50991:24;51009:5;50991:24;:::i;:::-;50984:5;50981:35;50971:63;;51030:1;51027;51020:12;50971:63;50918:122;:::o;51046:118::-;51117:22;51133:5;51117:22;:::i;:::-;51110:5;51107:33;51097:61;;51154:1;51151;51144:12;51097:61;51046:118;:::o

Swarm Source

ipfs://3b57a69493e2bbb7e834132002ed10a53bca32ca19e66df8b155708350286bfa
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.