ETH Price: $3,392.73 (+1.60%)

Token

PixelGans (PXLGANS0x)
 

Overview

Max Total Supply

100 PXLGANS0x

Holders

68

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 PXLGANS0x
0x26a6dc267e276fded7b40251c8fc08b1b40df367
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Pixel Art #NFT Drops generated using Python with A.I. & GAN.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
pixelGans

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * 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;
    }
    }
}


pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = "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] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

}

pragma solidity ^0.8.0;

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

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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

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


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


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

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {

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

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

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

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




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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


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}. Empty by default, can be overriden
     * in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function _burnSave(address owner, uint256 tokenId) internal virtual {

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId, true);

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

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

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data)
    private returns (bool)
    {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    // solhint-disable-next-line no-inline-assembly
                    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` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 tokenId, bool isDelete) internal virtual { }
}

pragma solidity ^0.8.0;

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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




pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented or decremented by one. 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;
        }
    }
}


contract pixelGans is ERC721Enumerable, Ownable{
    using SafeMath for uint256;
    using Address for address;
    using Strings for uint256;
    using Counters for Counters.Counter;
    
    
    Counters.Counter private _tokenIdCounter;

    uint256 public NFT_PRICE = 250000000000000000; // 0.25 ETH
    uint256 public MAX_SUPPLY = 100;
    bool public saleIsActive = false;

    string private _baseURIExtended;
    mapping (uint256 => string) _tokenURIs;
    
    
    
    //For Claiming NFT Royalties
    // Mapping from token ID to the amount of claimable eth in gwei
    mapping(uint256 => uint256) private _claimableEth;
    
    event PaymentReleased(address to, uint256 amount);

    event EthDeposited(uint256 amount);

    event EthClaimed(address to, uint256 amount);
    
    

    constructor() ERC721("PixelGans", "PXLGANS0x"){
    }


    function flipSaleState() public onlyOwner {
        saleIsActive = !saleIsActive;
    }

    function withdraw() public onlyOwner {
        uint balance = address(this).balance;
        payable(msg.sender).transfer(balance);
        
        for(uint256 i = 0; i < totalSupply(); i++) {
            // Empty out all the claimed amount so as to protect against re-entrancy attacks.
            _claimableEth[i] = 0;
        }
        
    }

    function setMaxTokenSupply(uint256 maxSupply) public onlyOwner {
        MAX_SUPPLY = maxSupply;
    }

    function mint() public payable {
        require(saleIsActive, "Sale is not active at the moment");
        require((totalSupply() + 1) <= MAX_SUPPLY, "Purchase would exceed max supply");
        require(NFT_PRICE == msg.value, "Sent ether value is incorrect, mint cost is 0.25 ether");
        
        if ((totalSupply() + 1) <= MAX_SUPPLY) {
            _safeMint(msg.sender, totalSupply());
            _tokenIdCounter.increment();
        }
        
    }
   
    /*
    * Deposit eth for distribution to token owners.
    */
    function deposit() public payable  {
        uint256 tokenCount = totalSupply();
        uint256 claimableAmountPerToken = msg.value / tokenCount;

        for(uint256 i = 0; i < tokenCount; i++) {
            // Iterate over all existing tokens (that have not been burnt)
            _claimableEth[tokenByIndex(i)] += claimableAmountPerToken;
        }

        emit EthDeposited(msg.value);
    }

    /*
    * Get the claimable balance of a token ID.
    */
    function claimableBalanceOfTokenId(uint256 tokenId) public view returns (uint256) {
        return _claimableEth[tokenId];
    }
    
    /*
    * Get the total claimable balance for an owner.
    */
    function claimableBalance(address owner) public view returns (uint256) {
        uint256 balance = 0;
        uint256 numTokens = balanceOf(owner);

        for(uint256 i = 0; i < numTokens; i++) {
            balance += claimableBalanceOfTokenId(tokenOfOwnerByIndex(owner, i));
        }

        return balance;
    }

    function claim() public {
        uint256 amount = 0;
        uint256 numTokens = balanceOf(msg.sender);

        for(uint256 i = 0; i < numTokens; i++) {
            uint256 tokenId = tokenOfOwnerByIndex(msg.sender, i);
            amount += _claimableEth[tokenId];
            // Empty out all the claimed amount so as to protect against re-entrancy attacks.
            _claimableEth[tokenId] = 0;
        }

        require(amount > 0, "There is no amount left to claim");

        emit EthClaimed(msg.sender, amount);

        // We must transfer at the very end to protect against re-entrancy.
        Address.sendValue(payable(msg.sender), amount);
    }


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

    // Sets base URI for all tokens, only able to be called by contract owner
    function setBaseURI(string memory baseURI_) external onlyOwner {
        _baseURIExtended = baseURI_;
    }
    
       
    function setCost(uint256 _amount) external onlyOwner {
        NFT_PRICE = _amount;
    }
    
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EthClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EthDeposited","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":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","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_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFT_PRICE","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":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"claimableBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claimableBalanceOfTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","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":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxSupply","type":"uint256"}],"name":"setMaxTokenSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526703782dace9d90000600c556064600d556000600e60006101000a81548160ff0219169083151502179055503480156200003d57600080fd5b506040518060400160405280600981526020017f506978656c47616e7300000000000000000000000000000000000000000000008152506040518060400160405280600981526020017f50584c47414e53307800000000000000000000000000000000000000000000008152508160009080519060200190620000c29291906200019d565b508060019080519060200190620000db9291906200019d565b5050506000620000f06200019560201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620002b2565b600033905090565b828054620001ab906200024d565b90600052602060002090601f016020900481019282620001cf57600085556200021b565b82601f10620001ea57805160ff19168380011785556200021b565b828001600101855582156200021b579182015b828111156200021a578251825591602001919060010190620001fd565b5b5090506200022a91906200022e565b5090565b5b80821115620002495760008160009055506001016200022f565b5090565b600060028204905060018216806200026657607f821691505b602082108114156200027d576200027c62000283565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61437680620002c26000396000f3fe6080604052600436106101e35760003560e01c806360f3309b11610102578063b07ed98211610095578063e0fbb86211610064578063e0fbb8621461068a578063e985e9c5146106c7578063eb8d244414610704578063f2fde38b1461072f576101e3565b8063b07ed982146105f1578063b88d4fde1461061a578063c87b56dd14610643578063d0e30db014610680576101e3565b8063715018a6116100d1578063715018a61461055b5780638da5cb5b1461057257806395d89b411461059d578063a22cb465146105c8576101e3565b806360f3309b146104795780636352211e146104b6578063676dd563146104f357806370a082311461051e576101e3565b806332cb6b0c1161017a57806344a0d68a1161014957806344a0d68a146103d35780634e71d92d146103fc5780634f6ccce71461041357806355f804b314610450576101e3565b806332cb6b0c1461035157806334918dfd1461037c5780633ccfd60b1461039357806342842e0e146103aa576101e3565b80631249c58b116101b65780631249c58b146102b657806318160ddd146102c057806323b872dd146102eb5780632f745c5914610314576101e3565b806301ffc9a7146101e857806306fdde0314610225578063081812fc14610250578063095ea7b31461028d575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a91906130f4565b610758565b60405161021c9190613bc3565b60405180910390f35b34801561023157600080fd5b5061023a6107d2565b6040516102479190613bde565b60405180910390f35b34801561025c57600080fd5b5061027760048036038101906102729190613187565b610864565b6040516102849190613b33565b60405180910390f35b34801561029957600080fd5b506102b460048036038101906102af91906130b8565b6108e9565b005b6102be610a01565b005b3480156102cc57600080fd5b506102d5610b26565b6040516102e29190613f00565b60405180910390f35b3480156102f757600080fd5b50610312600480360381019061030d9190612fb2565b610b33565b005b34801561032057600080fd5b5061033b600480360381019061033691906130b8565b610b93565b6040516103489190613f00565b60405180910390f35b34801561035d57600080fd5b50610366610c38565b6040516103739190613f00565b60405180910390f35b34801561038857600080fd5b50610391610c3e565b005b34801561039f57600080fd5b506103a8610ce6565b005b3480156103b657600080fd5b506103d160048036038101906103cc9190612fb2565b610df0565b005b3480156103df57600080fd5b506103fa60048036038101906103f59190613187565b610e10565b005b34801561040857600080fd5b50610411610e96565b005b34801561041f57600080fd5b5061043a60048036038101906104359190613187565b610f96565b6040516104479190613f00565b60405180910390f35b34801561045c57600080fd5b5061047760048036038101906104729190613146565b61102d565b005b34801561048557600080fd5b506104a0600480360381019061049b9190612f4d565b6110c3565b6040516104ad9190613f00565b60405180910390f35b3480156104c257600080fd5b506104dd60048036038101906104d89190613187565b61111f565b6040516104ea9190613b33565b60405180910390f35b3480156104ff57600080fd5b506105086111d1565b6040516105159190613f00565b60405180910390f35b34801561052a57600080fd5b5061054560048036038101906105409190612f4d565b6111d7565b6040516105529190613f00565b60405180910390f35b34801561056757600080fd5b5061057061128f565b005b34801561057e57600080fd5b506105876113cc565b6040516105949190613b33565b60405180910390f35b3480156105a957600080fd5b506105b26113f6565b6040516105bf9190613bde565b60405180910390f35b3480156105d457600080fd5b506105ef60048036038101906105ea919061307c565b611488565b005b3480156105fd57600080fd5b5061061860048036038101906106139190613187565b611609565b005b34801561062657600080fd5b50610641600480360381019061063c9190613001565b61168f565b005b34801561064f57600080fd5b5061066a60048036038101906106659190613187565b6116f1565b6040516106779190613bde565b60405180910390f35b610688611864565b005b34801561069657600080fd5b506106b160048036038101906106ac9190613187565b61190c565b6040516106be9190613f00565b60405180910390f35b3480156106d357600080fd5b506106ee60048036038101906106e99190612f76565b611929565b6040516106fb9190613bc3565b60405180910390f35b34801561071057600080fd5b506107196119bd565b6040516107269190613bc3565b60405180910390f35b34801561073b57600080fd5b5061075660048036038101906107519190612f4d565b6119d0565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107cb57506107ca82611b7c565b5b9050919050565b6060600080546107e19061416b565b80601f016020809104026020016040519081016040528092919081815260200182805461080d9061416b565b801561085a5780601f1061082f5761010080835404028352916020019161085a565b820191906000526020600020905b81548152906001019060200180831161083d57829003601f168201915b5050505050905090565b600061086f82611c5e565b6108ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a590613de0565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108f48261111f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610965576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095c90613e80565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610984611cca565b73ffffffffffffffffffffffffffffffffffffffff1614806109b357506109b2816109ad611cca565b611929565b5b6109f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e990613d40565b60405180910390fd5b6109fc8383611cd2565b505050565b600e60009054906101000a900460ff16610a50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4790613ee0565b60405180910390fd5b600d546001610a5d610b26565b610a679190613ffa565b1115610aa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9f90613da0565b60405180910390fd5b34600c5414610aec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae390613c00565b60405180910390fd5b600d546001610af9610b26565b610b039190613ffa565b11610b2457610b1933610b14610b26565b611d8b565b610b23600b611da9565b5b565b6000600880549050905090565b610b44610b3e611cca565b82611dbf565b610b83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7a90613ea0565b60405180910390fd5b610b8e838383611e9d565b505050565b6000610b9e836111d7565b8210610bdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd690613c20565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600d5481565b610c46611cca565b73ffffffffffffffffffffffffffffffffffffffff16610c646113cc565b73ffffffffffffffffffffffffffffffffffffffff1614610cba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb190613e00565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b610cee611cca565b73ffffffffffffffffffffffffffffffffffffffff16610d0c6113cc565b73ffffffffffffffffffffffffffffffffffffffff1614610d62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5990613e00565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610dad573d6000803e3d6000fd5b5060005b610db9610b26565b811015610dec57600060116000838152602001908152602001600020819055508080610de49061419d565b915050610db1565b5050565b610e0b8383836040518060200160405280600081525061168f565b505050565b610e18611cca565b73ffffffffffffffffffffffffffffffffffffffff16610e366113cc565b73ffffffffffffffffffffffffffffffffffffffff1614610e8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8390613e00565b60405180910390fd5b80600c8190555050565b600080610ea2336111d7565b905060005b81811015610f0b576000610ebb3383610b93565b9050601160008281526020019081526020016000205484610edc9190613ffa565b935060006011600083815260200190815260200160002081905550508080610f039061419d565b915050610ea7565b5060008211610f4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4690613e60565b60405180910390fd5b7f0d7976053781e071cecf47e898ad2a6dc87621ca33734e96eb4b92453319e8c93383604051610f80929190613b9a565b60405180910390a1610f9233836120fb565b5050565b6000610fa0610b26565b8210610fe1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd890613ec0565b60405180910390fd5b6008828154811061101b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b611035611cca565b73ffffffffffffffffffffffffffffffffffffffff166110536113cc565b73ffffffffffffffffffffffffffffffffffffffff16146110a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a090613e00565b60405180910390fd5b80600f90805190602001906110bf929190612d71565b5050565b6000806000905060006110d5846111d7565b905060005b81811015611114576110f46110ef8683610b93565b61190c565b836110ff9190613ffa565b9250808061110c9061419d565b9150506110da565b508192505050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bf90613d80565b60405180910390fd5b80915050919050565b600c5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611248576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123f90613d60565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611297611cca565b73ffffffffffffffffffffffffffffffffffffffff166112b56113cc565b73ffffffffffffffffffffffffffffffffffffffff161461130b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130290613e00565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546114059061416b565b80601f01602080910402602001604051908101604052809291908181526020018280546114319061416b565b801561147e5780601f106114535761010080835404028352916020019161147e565b820191906000526020600020905b81548152906001019060200180831161146157829003601f168201915b5050505050905090565b611490611cca565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f590613cc0565b60405180910390fd5b806005600061150b611cca565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115b8611cca565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115fd9190613bc3565b60405180910390a35050565b611611611cca565b73ffffffffffffffffffffffffffffffffffffffff1661162f6113cc565b73ffffffffffffffffffffffffffffffffffffffff1614611685576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167c90613e00565b60405180910390fd5b80600d8190555050565b6116a061169a611cca565b83611dbf565b6116df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d690613ea0565b60405180910390fd5b6116eb848484846121ef565b50505050565b60606116fc82611c5e565b61173b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173290613e40565b60405180910390fd5b600060106000848152602001908152602001600020805461175b9061416b565b80601f01602080910402602001604051908101604052809291908181526020018280546117879061416b565b80156117d45780601f106117a9576101008083540402835291602001916117d4565b820191906000526020600020905b8154815290600101906020018083116117b757829003601f168201915b5050505050905060006117e561224b565b90506000815114156117fb57819250505061185f565b600082511115611830578082604051602001611818929190613afa565b6040516020818303038152906040529250505061185f565b8061183a856122dd565b60405160200161184b929190613afa565b604051602081830303815290604052925050505b919050565b600061186e610b26565b90506000813461187e9190614050565b905060005b828110156118d057816011600061189984610f96565b815260200190815260200160002060008282546118b69190613ffa565b9250508190555080806118c89061419d565b915050611883565b507f44863bc9b335caf97ca3a3ab6fb67776965a88292ed53b0679f8eae4a67b630c346040516119009190613f00565b60405180910390a15050565b600060116000838152602001908152602001600020549050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e60009054906101000a900460ff1681565b6119d8611cca565b73ffffffffffffffffffffffffffffffffffffffff166119f66113cc565b73ffffffffffffffffffffffffffffffffffffffff1614611a4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4390613e00565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611abc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab390613c60565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611c4757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611c575750611c568261248a565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d458361111f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611da58282604051806020016040528060008152506124f4565b5050565b6001816000016000828254019250508190555050565b6000611dca82611c5e565b611e09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0090613d20565b60405180910390fd5b6000611e148361111f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e8357508373ffffffffffffffffffffffffffffffffffffffff16611e6b84610864565b73ffffffffffffffffffffffffffffffffffffffff16145b80611e945750611e938185611929565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ebd8261111f565b73ffffffffffffffffffffffffffffffffffffffff1614611f13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0a90613e20565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7a90613ca0565b60405180910390fd5b611f90838383600161254f565b611f9b600082611cd2565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611feb9190614081565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120429190613ffa565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b8047101561213e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213590613d00565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161216490613b1e565b60006040518083038185875af1925050503d80600081146121a1576040519150601f19603f3d011682016040523d82523d6000602084013e6121a6565b606091505b50509050806121ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e190613ce0565b60405180910390fd5b505050565b6121fa848484611e9d565b61220684848484612679565b612245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223c90613c40565b60405180910390fd5b50505050565b6060600f805461225a9061416b565b80601f01602080910402602001604051908101604052809291908181526020018280546122869061416b565b80156122d35780601f106122a8576101008083540402835291602001916122d3565b820191906000526020600020905b8154815290600101906020018083116122b657829003601f168201915b5050505050905090565b60606000821415612325576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612485565b600082905060005b600082146123575780806123409061419d565b915050600a826123509190614050565b915061232d565b60008167ffffffffffffffff811115612399577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156123cb5781602001600182028036833780820191505090505b5090505b6000851461247e576001826123e49190614081565b9150600a856123f391906141e6565b60306123ff9190613ffa565b60f81b81838151811061243b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856124779190614050565b94506123cf565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6124fe8383612810565b61250b6000848484612679565b61254a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254190613c40565b60405180910390fd5b505050565b61255b848484846129e0565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561259e57612599826129e6565b6125dd565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146125dc576125db8483612a2f565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480156126165750805b156126295761262482612b9c565b612673565b8373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156126625750805b15612672576126718383612cdf565b5b5b50505050565b600061269a8473ffffffffffffffffffffffffffffffffffffffff16612d5e565b15612803578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126c3611cca565b8786866040518563ffffffff1660e01b81526004016126e59493929190613b4e565b602060405180830381600087803b1580156126ff57600080fd5b505af192505050801561273057506040513d601f19601f8201168201806040525081019061272d919061311d565b60015b6127b3573d8060008114612760576040519150601f19603f3d011682016040523d82523d6000602084013e612765565b606091505b506000815114156127ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a290613c40565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612808565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612880576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287790613dc0565b60405180910390fd5b61288981611c5e565b156128c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c090613c80565b60405180910390fd5b6128d760008383600161254f565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129279190613ffa565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612a3c846111d7565b612a469190614081565b9050600060076000848152602001908152602001600020549050818114612b2b576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612bb09190614081565b9050600060096000848152602001908152602001600020549050600060088381548110612c06577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612c4e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612cc3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612cea836111d7565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b828054612d7d9061416b565b90600052602060002090601f016020900481019282612d9f5760008555612de6565b82601f10612db857805160ff1916838001178555612de6565b82800160010185558215612de6579182015b82811115612de5578251825591602001919060010190612dca565b5b509050612df39190612df7565b5090565b5b80821115612e10576000816000905550600101612df8565b5090565b6000612e27612e2284613f4c565b613f1b565b905082815260208101848484011115612e3f57600080fd5b612e4a848285614129565b509392505050565b6000612e65612e6084613f7c565b613f1b565b905082815260208101848484011115612e7d57600080fd5b612e88848285614129565b509392505050565b600081359050612e9f816142e4565b92915050565b600081359050612eb4816142fb565b92915050565b600081359050612ec981614312565b92915050565b600081519050612ede81614312565b92915050565b600082601f830112612ef557600080fd5b8135612f05848260208601612e14565b91505092915050565b600082601f830112612f1f57600080fd5b8135612f2f848260208601612e52565b91505092915050565b600081359050612f4781614329565b92915050565b600060208284031215612f5f57600080fd5b6000612f6d84828501612e90565b91505092915050565b60008060408385031215612f8957600080fd5b6000612f9785828601612e90565b9250506020612fa885828601612e90565b9150509250929050565b600080600060608486031215612fc757600080fd5b6000612fd586828701612e90565b9350506020612fe686828701612e90565b9250506040612ff786828701612f38565b9150509250925092565b6000806000806080858703121561301757600080fd5b600061302587828801612e90565b945050602061303687828801612e90565b935050604061304787828801612f38565b925050606085013567ffffffffffffffff81111561306457600080fd5b61307087828801612ee4565b91505092959194509250565b6000806040838503121561308f57600080fd5b600061309d85828601612e90565b92505060206130ae85828601612ea5565b9150509250929050565b600080604083850312156130cb57600080fd5b60006130d985828601612e90565b92505060206130ea85828601612f38565b9150509250929050565b60006020828403121561310657600080fd5b600061311484828501612eba565b91505092915050565b60006020828403121561312f57600080fd5b600061313d84828501612ecf565b91505092915050565b60006020828403121561315857600080fd5b600082013567ffffffffffffffff81111561317257600080fd5b61317e84828501612f0e565b91505092915050565b60006020828403121561319957600080fd5b60006131a784828501612f38565b91505092915050565b6131b9816140b5565b82525050565b6131c8816140c7565b82525050565b60006131d982613fac565b6131e38185613fc2565b93506131f3818560208601614138565b6131fc816142d3565b840191505092915050565b600061321282613fb7565b61321c8185613fde565b935061322c818560208601614138565b613235816142d3565b840191505092915050565b600061324b82613fb7565b6132558185613fef565b9350613265818560208601614138565b80840191505092915050565b600061327e603683613fde565b91507f53656e742065746865722076616c756520697320696e636f72726563742c206d60008301527f696e7420636f737420697320302e3235206574686572000000000000000000006020830152604082019050919050565b60006132e4602b83613fde565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b600061334a603283613fde565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006133b0602683613fde565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613416601c83613fde565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613456602483613fde565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006134bc601983613fde565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006134fc603a83613fde565b91507f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008301527f6563697069656e74206d617920686176652072657665727465640000000000006020830152604082019050919050565b6000613562601d83613fde565b91507f416464726573733a20696e73756666696369656e742062616c616e63650000006000830152602082019050919050565b60006135a2602c83613fde565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613608603883613fde565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b600061366e602a83613fde565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006136d4602983613fde565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061373a602083613fde565b91507f507572636861736520776f756c6420657863656564206d617820737570706c796000830152602082019050919050565b600061377a602083613fde565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006137ba602c83613fde565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613820602083613fde565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613860602983613fde565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006138c6602f83613fde565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b600061392c602083613fde565b91507f5468657265206973206e6f20616d6f756e74206c65667420746f20636c61696d6000830152602082019050919050565b600061396c602183613fde565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006139d2600083613fd3565b9150600082019050919050565b60006139ec603183613fde565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613a52602c83613fde565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000613ab8602083613fde565b91507f53616c65206973206e6f742061637469766520617420746865206d6f6d656e746000830152602082019050919050565b613af48161411f565b82525050565b6000613b068285613240565b9150613b128284613240565b91508190509392505050565b6000613b29826139c5565b9150819050919050565b6000602082019050613b4860008301846131b0565b92915050565b6000608082019050613b6360008301876131b0565b613b7060208301866131b0565b613b7d6040830185613aeb565b8181036060830152613b8f81846131ce565b905095945050505050565b6000604082019050613baf60008301856131b0565b613bbc6020830184613aeb565b9392505050565b6000602082019050613bd860008301846131bf565b92915050565b60006020820190508181036000830152613bf88184613207565b905092915050565b60006020820190508181036000830152613c1981613271565b9050919050565b60006020820190508181036000830152613c39816132d7565b9050919050565b60006020820190508181036000830152613c598161333d565b9050919050565b60006020820190508181036000830152613c79816133a3565b9050919050565b60006020820190508181036000830152613c9981613409565b9050919050565b60006020820190508181036000830152613cb981613449565b9050919050565b60006020820190508181036000830152613cd9816134af565b9050919050565b60006020820190508181036000830152613cf9816134ef565b9050919050565b60006020820190508181036000830152613d1981613555565b9050919050565b60006020820190508181036000830152613d3981613595565b9050919050565b60006020820190508181036000830152613d59816135fb565b9050919050565b60006020820190508181036000830152613d7981613661565b9050919050565b60006020820190508181036000830152613d99816136c7565b9050919050565b60006020820190508181036000830152613db98161372d565b9050919050565b60006020820190508181036000830152613dd98161376d565b9050919050565b60006020820190508181036000830152613df9816137ad565b9050919050565b60006020820190508181036000830152613e1981613813565b9050919050565b60006020820190508181036000830152613e3981613853565b9050919050565b60006020820190508181036000830152613e59816138b9565b9050919050565b60006020820190508181036000830152613e798161391f565b9050919050565b60006020820190508181036000830152613e998161395f565b9050919050565b60006020820190508181036000830152613eb9816139df565b9050919050565b60006020820190508181036000830152613ed981613a45565b9050919050565b60006020820190508181036000830152613ef981613aab565b9050919050565b6000602082019050613f156000830184613aeb565b92915050565b6000604051905081810181811067ffffffffffffffff82111715613f4257613f416142a4565b5b8060405250919050565b600067ffffffffffffffff821115613f6757613f666142a4565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613f9757613f966142a4565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006140058261411f565b91506140108361411f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561404557614044614217565b5b828201905092915050565b600061405b8261411f565b91506140668361411f565b92508261407657614075614246565b5b828204905092915050565b600061408c8261411f565b91506140978361411f565b9250828210156140aa576140a9614217565b5b828203905092915050565b60006140c0826140ff565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561415657808201518184015260208101905061413b565b83811115614165576000848401525b50505050565b6000600282049050600182168061418357607f821691505b6020821081141561419757614196614275565b5b50919050565b60006141a88261411f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156141db576141da614217565b5b600182019050919050565b60006141f18261411f565b91506141fc8361411f565b92508261420c5761420b614246565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6142ed816140b5565b81146142f857600080fd5b50565b614304816140c7565b811461430f57600080fd5b50565b61431b816140d3565b811461432657600080fd5b50565b6143328161411f565b811461433d57600080fd5b5056fea26469706673582212205e9b8a5a732e8f7a9ba7b96b4dfc33638edf1d23600a55ad67b5e8a422c3bda964736f6c63430008000033

Deployed Bytecode

0x6080604052600436106101e35760003560e01c806360f3309b11610102578063b07ed98211610095578063e0fbb86211610064578063e0fbb8621461068a578063e985e9c5146106c7578063eb8d244414610704578063f2fde38b1461072f576101e3565b8063b07ed982146105f1578063b88d4fde1461061a578063c87b56dd14610643578063d0e30db014610680576101e3565b8063715018a6116100d1578063715018a61461055b5780638da5cb5b1461057257806395d89b411461059d578063a22cb465146105c8576101e3565b806360f3309b146104795780636352211e146104b6578063676dd563146104f357806370a082311461051e576101e3565b806332cb6b0c1161017a57806344a0d68a1161014957806344a0d68a146103d35780634e71d92d146103fc5780634f6ccce71461041357806355f804b314610450576101e3565b806332cb6b0c1461035157806334918dfd1461037c5780633ccfd60b1461039357806342842e0e146103aa576101e3565b80631249c58b116101b65780631249c58b146102b657806318160ddd146102c057806323b872dd146102eb5780632f745c5914610314576101e3565b806301ffc9a7146101e857806306fdde0314610225578063081812fc14610250578063095ea7b31461028d575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a91906130f4565b610758565b60405161021c9190613bc3565b60405180910390f35b34801561023157600080fd5b5061023a6107d2565b6040516102479190613bde565b60405180910390f35b34801561025c57600080fd5b5061027760048036038101906102729190613187565b610864565b6040516102849190613b33565b60405180910390f35b34801561029957600080fd5b506102b460048036038101906102af91906130b8565b6108e9565b005b6102be610a01565b005b3480156102cc57600080fd5b506102d5610b26565b6040516102e29190613f00565b60405180910390f35b3480156102f757600080fd5b50610312600480360381019061030d9190612fb2565b610b33565b005b34801561032057600080fd5b5061033b600480360381019061033691906130b8565b610b93565b6040516103489190613f00565b60405180910390f35b34801561035d57600080fd5b50610366610c38565b6040516103739190613f00565b60405180910390f35b34801561038857600080fd5b50610391610c3e565b005b34801561039f57600080fd5b506103a8610ce6565b005b3480156103b657600080fd5b506103d160048036038101906103cc9190612fb2565b610df0565b005b3480156103df57600080fd5b506103fa60048036038101906103f59190613187565b610e10565b005b34801561040857600080fd5b50610411610e96565b005b34801561041f57600080fd5b5061043a60048036038101906104359190613187565b610f96565b6040516104479190613f00565b60405180910390f35b34801561045c57600080fd5b5061047760048036038101906104729190613146565b61102d565b005b34801561048557600080fd5b506104a0600480360381019061049b9190612f4d565b6110c3565b6040516104ad9190613f00565b60405180910390f35b3480156104c257600080fd5b506104dd60048036038101906104d89190613187565b61111f565b6040516104ea9190613b33565b60405180910390f35b3480156104ff57600080fd5b506105086111d1565b6040516105159190613f00565b60405180910390f35b34801561052a57600080fd5b5061054560048036038101906105409190612f4d565b6111d7565b6040516105529190613f00565b60405180910390f35b34801561056757600080fd5b5061057061128f565b005b34801561057e57600080fd5b506105876113cc565b6040516105949190613b33565b60405180910390f35b3480156105a957600080fd5b506105b26113f6565b6040516105bf9190613bde565b60405180910390f35b3480156105d457600080fd5b506105ef60048036038101906105ea919061307c565b611488565b005b3480156105fd57600080fd5b5061061860048036038101906106139190613187565b611609565b005b34801561062657600080fd5b50610641600480360381019061063c9190613001565b61168f565b005b34801561064f57600080fd5b5061066a60048036038101906106659190613187565b6116f1565b6040516106779190613bde565b60405180910390f35b610688611864565b005b34801561069657600080fd5b506106b160048036038101906106ac9190613187565b61190c565b6040516106be9190613f00565b60405180910390f35b3480156106d357600080fd5b506106ee60048036038101906106e99190612f76565b611929565b6040516106fb9190613bc3565b60405180910390f35b34801561071057600080fd5b506107196119bd565b6040516107269190613bc3565b60405180910390f35b34801561073b57600080fd5b5061075660048036038101906107519190612f4d565b6119d0565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107cb57506107ca82611b7c565b5b9050919050565b6060600080546107e19061416b565b80601f016020809104026020016040519081016040528092919081815260200182805461080d9061416b565b801561085a5780601f1061082f5761010080835404028352916020019161085a565b820191906000526020600020905b81548152906001019060200180831161083d57829003601f168201915b5050505050905090565b600061086f82611c5e565b6108ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a590613de0565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108f48261111f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610965576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095c90613e80565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610984611cca565b73ffffffffffffffffffffffffffffffffffffffff1614806109b357506109b2816109ad611cca565b611929565b5b6109f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e990613d40565b60405180910390fd5b6109fc8383611cd2565b505050565b600e60009054906101000a900460ff16610a50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4790613ee0565b60405180910390fd5b600d546001610a5d610b26565b610a679190613ffa565b1115610aa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9f90613da0565b60405180910390fd5b34600c5414610aec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae390613c00565b60405180910390fd5b600d546001610af9610b26565b610b039190613ffa565b11610b2457610b1933610b14610b26565b611d8b565b610b23600b611da9565b5b565b6000600880549050905090565b610b44610b3e611cca565b82611dbf565b610b83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7a90613ea0565b60405180910390fd5b610b8e838383611e9d565b505050565b6000610b9e836111d7565b8210610bdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd690613c20565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600d5481565b610c46611cca565b73ffffffffffffffffffffffffffffffffffffffff16610c646113cc565b73ffffffffffffffffffffffffffffffffffffffff1614610cba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb190613e00565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b610cee611cca565b73ffffffffffffffffffffffffffffffffffffffff16610d0c6113cc565b73ffffffffffffffffffffffffffffffffffffffff1614610d62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5990613e00565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610dad573d6000803e3d6000fd5b5060005b610db9610b26565b811015610dec57600060116000838152602001908152602001600020819055508080610de49061419d565b915050610db1565b5050565b610e0b8383836040518060200160405280600081525061168f565b505050565b610e18611cca565b73ffffffffffffffffffffffffffffffffffffffff16610e366113cc565b73ffffffffffffffffffffffffffffffffffffffff1614610e8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8390613e00565b60405180910390fd5b80600c8190555050565b600080610ea2336111d7565b905060005b81811015610f0b576000610ebb3383610b93565b9050601160008281526020019081526020016000205484610edc9190613ffa565b935060006011600083815260200190815260200160002081905550508080610f039061419d565b915050610ea7565b5060008211610f4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4690613e60565b60405180910390fd5b7f0d7976053781e071cecf47e898ad2a6dc87621ca33734e96eb4b92453319e8c93383604051610f80929190613b9a565b60405180910390a1610f9233836120fb565b5050565b6000610fa0610b26565b8210610fe1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd890613ec0565b60405180910390fd5b6008828154811061101b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b611035611cca565b73ffffffffffffffffffffffffffffffffffffffff166110536113cc565b73ffffffffffffffffffffffffffffffffffffffff16146110a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a090613e00565b60405180910390fd5b80600f90805190602001906110bf929190612d71565b5050565b6000806000905060006110d5846111d7565b905060005b81811015611114576110f46110ef8683610b93565b61190c565b836110ff9190613ffa565b9250808061110c9061419d565b9150506110da565b508192505050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bf90613d80565b60405180910390fd5b80915050919050565b600c5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611248576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123f90613d60565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611297611cca565b73ffffffffffffffffffffffffffffffffffffffff166112b56113cc565b73ffffffffffffffffffffffffffffffffffffffff161461130b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130290613e00565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546114059061416b565b80601f01602080910402602001604051908101604052809291908181526020018280546114319061416b565b801561147e5780601f106114535761010080835404028352916020019161147e565b820191906000526020600020905b81548152906001019060200180831161146157829003601f168201915b5050505050905090565b611490611cca565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f590613cc0565b60405180910390fd5b806005600061150b611cca565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115b8611cca565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115fd9190613bc3565b60405180910390a35050565b611611611cca565b73ffffffffffffffffffffffffffffffffffffffff1661162f6113cc565b73ffffffffffffffffffffffffffffffffffffffff1614611685576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167c90613e00565b60405180910390fd5b80600d8190555050565b6116a061169a611cca565b83611dbf565b6116df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d690613ea0565b60405180910390fd5b6116eb848484846121ef565b50505050565b60606116fc82611c5e565b61173b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173290613e40565b60405180910390fd5b600060106000848152602001908152602001600020805461175b9061416b565b80601f01602080910402602001604051908101604052809291908181526020018280546117879061416b565b80156117d45780601f106117a9576101008083540402835291602001916117d4565b820191906000526020600020905b8154815290600101906020018083116117b757829003601f168201915b5050505050905060006117e561224b565b90506000815114156117fb57819250505061185f565b600082511115611830578082604051602001611818929190613afa565b6040516020818303038152906040529250505061185f565b8061183a856122dd565b60405160200161184b929190613afa565b604051602081830303815290604052925050505b919050565b600061186e610b26565b90506000813461187e9190614050565b905060005b828110156118d057816011600061189984610f96565b815260200190815260200160002060008282546118b69190613ffa565b9250508190555080806118c89061419d565b915050611883565b507f44863bc9b335caf97ca3a3ab6fb67776965a88292ed53b0679f8eae4a67b630c346040516119009190613f00565b60405180910390a15050565b600060116000838152602001908152602001600020549050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e60009054906101000a900460ff1681565b6119d8611cca565b73ffffffffffffffffffffffffffffffffffffffff166119f66113cc565b73ffffffffffffffffffffffffffffffffffffffff1614611a4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4390613e00565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611abc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab390613c60565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611c4757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611c575750611c568261248a565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d458361111f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611da58282604051806020016040528060008152506124f4565b5050565b6001816000016000828254019250508190555050565b6000611dca82611c5e565b611e09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0090613d20565b60405180910390fd5b6000611e148361111f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e8357508373ffffffffffffffffffffffffffffffffffffffff16611e6b84610864565b73ffffffffffffffffffffffffffffffffffffffff16145b80611e945750611e938185611929565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ebd8261111f565b73ffffffffffffffffffffffffffffffffffffffff1614611f13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0a90613e20565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7a90613ca0565b60405180910390fd5b611f90838383600161254f565b611f9b600082611cd2565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611feb9190614081565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120429190613ffa565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b8047101561213e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213590613d00565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161216490613b1e565b60006040518083038185875af1925050503d80600081146121a1576040519150601f19603f3d011682016040523d82523d6000602084013e6121a6565b606091505b50509050806121ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e190613ce0565b60405180910390fd5b505050565b6121fa848484611e9d565b61220684848484612679565b612245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223c90613c40565b60405180910390fd5b50505050565b6060600f805461225a9061416b565b80601f01602080910402602001604051908101604052809291908181526020018280546122869061416b565b80156122d35780601f106122a8576101008083540402835291602001916122d3565b820191906000526020600020905b8154815290600101906020018083116122b657829003601f168201915b5050505050905090565b60606000821415612325576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612485565b600082905060005b600082146123575780806123409061419d565b915050600a826123509190614050565b915061232d565b60008167ffffffffffffffff811115612399577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156123cb5781602001600182028036833780820191505090505b5090505b6000851461247e576001826123e49190614081565b9150600a856123f391906141e6565b60306123ff9190613ffa565b60f81b81838151811061243b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856124779190614050565b94506123cf565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6124fe8383612810565b61250b6000848484612679565b61254a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254190613c40565b60405180910390fd5b505050565b61255b848484846129e0565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561259e57612599826129e6565b6125dd565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146125dc576125db8483612a2f565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480156126165750805b156126295761262482612b9c565b612673565b8373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156126625750805b15612672576126718383612cdf565b5b5b50505050565b600061269a8473ffffffffffffffffffffffffffffffffffffffff16612d5e565b15612803578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126c3611cca565b8786866040518563ffffffff1660e01b81526004016126e59493929190613b4e565b602060405180830381600087803b1580156126ff57600080fd5b505af192505050801561273057506040513d601f19601f8201168201806040525081019061272d919061311d565b60015b6127b3573d8060008114612760576040519150601f19603f3d011682016040523d82523d6000602084013e612765565b606091505b506000815114156127ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a290613c40565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612808565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612880576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287790613dc0565b60405180910390fd5b61288981611c5e565b156128c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c090613c80565b60405180910390fd5b6128d760008383600161254f565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129279190613ffa565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612a3c846111d7565b612a469190614081565b9050600060076000848152602001908152602001600020549050818114612b2b576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612bb09190614081565b9050600060096000848152602001908152602001600020549050600060088381548110612c06577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612c4e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612cc3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612cea836111d7565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b828054612d7d9061416b565b90600052602060002090601f016020900481019282612d9f5760008555612de6565b82601f10612db857805160ff1916838001178555612de6565b82800160010185558215612de6579182015b82811115612de5578251825591602001919060010190612dca565b5b509050612df39190612df7565b5090565b5b80821115612e10576000816000905550600101612df8565b5090565b6000612e27612e2284613f4c565b613f1b565b905082815260208101848484011115612e3f57600080fd5b612e4a848285614129565b509392505050565b6000612e65612e6084613f7c565b613f1b565b905082815260208101848484011115612e7d57600080fd5b612e88848285614129565b509392505050565b600081359050612e9f816142e4565b92915050565b600081359050612eb4816142fb565b92915050565b600081359050612ec981614312565b92915050565b600081519050612ede81614312565b92915050565b600082601f830112612ef557600080fd5b8135612f05848260208601612e14565b91505092915050565b600082601f830112612f1f57600080fd5b8135612f2f848260208601612e52565b91505092915050565b600081359050612f4781614329565b92915050565b600060208284031215612f5f57600080fd5b6000612f6d84828501612e90565b91505092915050565b60008060408385031215612f8957600080fd5b6000612f9785828601612e90565b9250506020612fa885828601612e90565b9150509250929050565b600080600060608486031215612fc757600080fd5b6000612fd586828701612e90565b9350506020612fe686828701612e90565b9250506040612ff786828701612f38565b9150509250925092565b6000806000806080858703121561301757600080fd5b600061302587828801612e90565b945050602061303687828801612e90565b935050604061304787828801612f38565b925050606085013567ffffffffffffffff81111561306457600080fd5b61307087828801612ee4565b91505092959194509250565b6000806040838503121561308f57600080fd5b600061309d85828601612e90565b92505060206130ae85828601612ea5565b9150509250929050565b600080604083850312156130cb57600080fd5b60006130d985828601612e90565b92505060206130ea85828601612f38565b9150509250929050565b60006020828403121561310657600080fd5b600061311484828501612eba565b91505092915050565b60006020828403121561312f57600080fd5b600061313d84828501612ecf565b91505092915050565b60006020828403121561315857600080fd5b600082013567ffffffffffffffff81111561317257600080fd5b61317e84828501612f0e565b91505092915050565b60006020828403121561319957600080fd5b60006131a784828501612f38565b91505092915050565b6131b9816140b5565b82525050565b6131c8816140c7565b82525050565b60006131d982613fac565b6131e38185613fc2565b93506131f3818560208601614138565b6131fc816142d3565b840191505092915050565b600061321282613fb7565b61321c8185613fde565b935061322c818560208601614138565b613235816142d3565b840191505092915050565b600061324b82613fb7565b6132558185613fef565b9350613265818560208601614138565b80840191505092915050565b600061327e603683613fde565b91507f53656e742065746865722076616c756520697320696e636f72726563742c206d60008301527f696e7420636f737420697320302e3235206574686572000000000000000000006020830152604082019050919050565b60006132e4602b83613fde565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b600061334a603283613fde565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006133b0602683613fde565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613416601c83613fde565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613456602483613fde565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006134bc601983613fde565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006134fc603a83613fde565b91507f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008301527f6563697069656e74206d617920686176652072657665727465640000000000006020830152604082019050919050565b6000613562601d83613fde565b91507f416464726573733a20696e73756666696369656e742062616c616e63650000006000830152602082019050919050565b60006135a2602c83613fde565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613608603883613fde565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b600061366e602a83613fde565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006136d4602983613fde565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061373a602083613fde565b91507f507572636861736520776f756c6420657863656564206d617820737570706c796000830152602082019050919050565b600061377a602083613fde565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006137ba602c83613fde565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613820602083613fde565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613860602983613fde565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006138c6602f83613fde565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b600061392c602083613fde565b91507f5468657265206973206e6f20616d6f756e74206c65667420746f20636c61696d6000830152602082019050919050565b600061396c602183613fde565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006139d2600083613fd3565b9150600082019050919050565b60006139ec603183613fde565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613a52602c83613fde565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000613ab8602083613fde565b91507f53616c65206973206e6f742061637469766520617420746865206d6f6d656e746000830152602082019050919050565b613af48161411f565b82525050565b6000613b068285613240565b9150613b128284613240565b91508190509392505050565b6000613b29826139c5565b9150819050919050565b6000602082019050613b4860008301846131b0565b92915050565b6000608082019050613b6360008301876131b0565b613b7060208301866131b0565b613b7d6040830185613aeb565b8181036060830152613b8f81846131ce565b905095945050505050565b6000604082019050613baf60008301856131b0565b613bbc6020830184613aeb565b9392505050565b6000602082019050613bd860008301846131bf565b92915050565b60006020820190508181036000830152613bf88184613207565b905092915050565b60006020820190508181036000830152613c1981613271565b9050919050565b60006020820190508181036000830152613c39816132d7565b9050919050565b60006020820190508181036000830152613c598161333d565b9050919050565b60006020820190508181036000830152613c79816133a3565b9050919050565b60006020820190508181036000830152613c9981613409565b9050919050565b60006020820190508181036000830152613cb981613449565b9050919050565b60006020820190508181036000830152613cd9816134af565b9050919050565b60006020820190508181036000830152613cf9816134ef565b9050919050565b60006020820190508181036000830152613d1981613555565b9050919050565b60006020820190508181036000830152613d3981613595565b9050919050565b60006020820190508181036000830152613d59816135fb565b9050919050565b60006020820190508181036000830152613d7981613661565b9050919050565b60006020820190508181036000830152613d99816136c7565b9050919050565b60006020820190508181036000830152613db98161372d565b9050919050565b60006020820190508181036000830152613dd98161376d565b9050919050565b60006020820190508181036000830152613df9816137ad565b9050919050565b60006020820190508181036000830152613e1981613813565b9050919050565b60006020820190508181036000830152613e3981613853565b9050919050565b60006020820190508181036000830152613e59816138b9565b9050919050565b60006020820190508181036000830152613e798161391f565b9050919050565b60006020820190508181036000830152613e998161395f565b9050919050565b60006020820190508181036000830152613eb9816139df565b9050919050565b60006020820190508181036000830152613ed981613a45565b9050919050565b60006020820190508181036000830152613ef981613aab565b9050919050565b6000602082019050613f156000830184613aeb565b92915050565b6000604051905081810181811067ffffffffffffffff82111715613f4257613f416142a4565b5b8060405250919050565b600067ffffffffffffffff821115613f6757613f666142a4565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613f9757613f966142a4565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006140058261411f565b91506140108361411f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561404557614044614217565b5b828201905092915050565b600061405b8261411f565b91506140668361411f565b92508261407657614075614246565b5b828204905092915050565b600061408c8261411f565b91506140978361411f565b9250828210156140aa576140a9614217565b5b828203905092915050565b60006140c0826140ff565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561415657808201518184015260208101905061413b565b83811115614165576000848401525b50505050565b6000600282049050600182168061418357607f821691505b6020821081141561419757614196614275565b5b50919050565b60006141a88261411f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156141db576141da614217565b5b600182019050919050565b60006141f18261411f565b91506141fc8361411f565b92508261420c5761420b614246565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6142ed816140b5565b81146142f857600080fd5b50565b614304816140c7565b811461430f57600080fd5b50565b61431b816140d3565b811461432657600080fd5b50565b6143328161411f565b811461433d57600080fd5b5056fea26469706673582212205e9b8a5a732e8f7a9ba7b96b4dfc33638edf1d23600a55ad67b5e8a422c3bda964736f6c63430008000033

Deployed Bytecode Sourcemap

50444:4963:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43007:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30929:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32381:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31918:397;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51909:470;;;:::i;:::-;;43656:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33271:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43324:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50762:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51337:89;;;;;;;;;;;;;:::i;:::-;;51434:355;;;;;;;;;;;;;:::i;:::-;;33647:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54508:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53486:678;;;;;;;;;;;;;:::i;:::-;;43846:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54378:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53150:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30623:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50698:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30353:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28189:148;;;;;;;;;;;;;:::i;:::-;;27538:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31098:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32674:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51797:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33869:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54611:793;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52459:408;;;:::i;:::-;;52939:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33040:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50800:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28492:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43007:233;43109:4;43148:35;43133:50;;;:11;:50;;;;:99;;;;43196:36;43220:11;43196:23;:36::i;:::-;43133:99;43126:106;;43007:233;;;:::o;30929:100::-;30983:13;31016:5;31009:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30929:100;:::o;32381:221::-;32457:7;32485:16;32493:7;32485;:16::i;:::-;32477:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32570:15;:24;32586:7;32570:24;;;;;;;;;;;;;;;;;;;;;32563:31;;32381:221;;;:::o;31918:397::-;31999:13;32015:23;32030:7;32015:14;:23::i;:::-;31999:39;;32063:5;32057:11;;:2;:11;;;;32049:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;32143:5;32127:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;32152:37;32169:5;32176:12;:10;:12::i;:::-;32152:16;:37::i;:::-;32127:62;32119:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;32286:21;32295:2;32299:7;32286:8;:21::i;:::-;31918:397;;;:::o;51909:470::-;51959:12;;;;;;;;;;;51951:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;52050:10;;52044:1;52028:13;:11;:13::i;:::-;:17;;;;:::i;:::-;52027:33;;52019:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;52129:9;52116;;:22;52108:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;52245:10;;52239:1;52223:13;:11;:13::i;:::-;:17;;;;:::i;:::-;52222:33;52218:144;;52272:36;52282:10;52294:13;:11;:13::i;:::-;52272:9;:36::i;:::-;52323:27;:15;:25;:27::i;:::-;52218:144;51909:470::o;43656:113::-;43717:7;43744:10;:17;;;;43737:24;;43656:113;:::o;33271:305::-;33432:41;33451:12;:10;:12::i;:::-;33465:7;33432:18;:41::i;:::-;33424:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;33540:28;33550:4;33556:2;33560:7;33540:9;:28::i;:::-;33271:305;;;:::o;43324:256::-;43421:7;43457:23;43474:5;43457:16;:23::i;:::-;43449:5;:31;43441:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;43546:12;:19;43559:5;43546:19;;;;;;;;;;;;;;;:26;43566:5;43546:26;;;;;;;;;;;;43539:33;;43324:256;;;;:::o;50762:31::-;;;;:::o;51337:89::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51406:12:::1;;;;;;;;;;;51405:13;51390:12;;:28;;;;;;;;;;;;;;;;;;51337:89::o:0;51434:355::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51482:12:::1;51497:21;51482:36;;51537:10;51529:28;;:37;51558:7;51529:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;51591:9;51587:185;51610:13;:11;:13::i;:::-;51606:1;:17;51587:185;;;51759:1;51740:13;:16;51754:1;51740:16;;;;;;;;;;;:20;;;;51625:3;;;;;:::i;:::-;;;;51587:185;;;;27829:1;51434:355::o:0;33647:151::-;33751:39;33768:4;33774:2;33778:7;33751:39;;;;;;;;;;;;:16;:39::i;:::-;33647:151;;;:::o;54508:91::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54584:7:::1;54572:9;:19;;;;54508:91:::0;:::o;53486:678::-;53521:14;53550:17;53570:21;53580:10;53570:9;:21::i;:::-;53550:41;;53608:9;53604:301;53627:9;53623:1;:13;53604:301;;;53658:15;53676:34;53696:10;53708:1;53676:19;:34::i;:::-;53658:52;;53735:13;:22;53749:7;53735:22;;;;;;;;;;;;53725:32;;;;;:::i;:::-;;;53892:1;53867:13;:22;53881:7;53867:22;;;;;;;;;;;:26;;;;53604:301;53638:3;;;;;:::i;:::-;;;;53604:301;;;;53934:1;53925:6;:10;53917:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;53990:30;54001:10;54013:6;53990:30;;;;;;;:::i;:::-;;;;;;;;54110:46;54136:10;54149:6;54110:17;:46::i;:::-;53486:678;;:::o;43846:233::-;43921:7;43957:30;:28;:30::i;:::-;43949:5;:38;43941:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;44054:10;44065:5;44054:17;;;;;;;;;;;;;;;;;;;;;;;;44047:24;;43846:233;;;:::o;54378:109::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54471:8:::1;54452:16;:27;;;;;;;;;;;;:::i;:::-;;54378:109:::0;:::o;53150:328::-;53212:7;53232:15;53250:1;53232:19;;53262:17;53282:16;53292:5;53282:9;:16::i;:::-;53262:36;;53315:9;53311:133;53334:9;53330:1;:13;53311:133;;;53376:56;53402:29;53422:5;53429:1;53402:19;:29::i;:::-;53376:25;:56::i;:::-;53365:67;;;;;:::i;:::-;;;53345:3;;;;;:::i;:::-;;;;53311:133;;;;53463:7;53456:14;;;;53150:328;;;:::o;30623:239::-;30695:7;30715:13;30731:7;:16;30739:7;30731:16;;;;;;;;;;;;;;;;;;;;;30715:32;;30783:1;30766:19;;:5;:19;;;;30758:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30849:5;30842:12;;;30623:239;;;:::o;50698:45::-;;;;:::o;30353:208::-;30425:7;30470:1;30453:19;;:5;:19;;;;30445:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;30537:9;:16;30547:5;30537:16;;;;;;;;;;;;;;;;30530:23;;30353:208;;;:::o;28189:148::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28296:1:::1;28259:40;;28280:6;;;;;;;;;;;28259:40;;;;;;;;;;;;28327:1;28310:6;;:19;;;;;;;;;;;;;;;;;;28189:148::o:0;27538:87::-;27584:7;27611:6;;;;;;;;;;;27604:13;;27538:87;:::o;31098:104::-;31154:13;31187:7;31180:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31098:104;:::o;32674:295::-;32789:12;:10;:12::i;:::-;32777:24;;:8;:24;;;;32769:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;32889:8;32844:18;:32;32863:12;:10;:12::i;:::-;32844:32;;;;;;;;;;;;;;;:42;32877:8;32844:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;32942:8;32913:48;;32928:12;:10;:12::i;:::-;32913:48;;;32952:8;32913:48;;;;;;:::i;:::-;;;;;;;;32674:295;;:::o;51797:104::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51884:9:::1;51871:10;:22;;;;51797:104:::0;:::o;33869:285::-;34001:41;34020:12;:10;:12::i;:::-;34034:7;34001:18;:41::i;:::-;33993:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;34107:39;34121:4;34127:2;34131:7;34140:5;34107:13;:39::i;:::-;33869:285;;;;:::o;54611:793::-;54684:13;54718:16;54726:7;54718;:16::i;:::-;54710:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;54799:23;54825:10;:19;54836:7;54825:19;;;;;;;;;;;54799:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54855:18;54876:10;:8;:10::i;:::-;54855:31;;54984:1;54968:4;54962:18;:23;54958:72;;;55009:9;55002:16;;;;;;54958:72;55160:1;55140:9;55134:23;:27;55130:108;;;55209:4;55215:9;55192:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55178:48;;;;;;55130:108;55370:4;55376:18;:7;:16;:18::i;:::-;55353:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55339:57;;;;54611:793;;;;:::o;52459:408::-;52505:18;52526:13;:11;:13::i;:::-;52505:34;;52550:31;52596:10;52584:9;:22;;;;:::i;:::-;52550:56;;52623:9;52619:200;52642:10;52638:1;:14;52619:200;;;52784:23;52750:13;:30;52764:15;52777:1;52764:12;:15::i;:::-;52750:30;;;;;;;;;;;;:57;;;;;;;:::i;:::-;;;;;;;;52654:3;;;;;:::i;:::-;;;;52619:200;;;;52836:23;52849:9;52836:23;;;;;;:::i;:::-;;;;;;;;52459:408;;:::o;52939:130::-;53012:7;53039:13;:22;53053:7;53039:22;;;;;;;;;;;;53032:29;;52939:130;;;:::o;33040:164::-;33137:4;33161:18;:25;33180:5;33161:25;;;;;;;;;;;;;;;:35;33187:8;33161:35;;;;;;;;;;;;;;;;;;;;;;;;;33154:42;;33040:164;;;;:::o;50800:32::-;;;;;;;;;;;;;:::o;28492:244::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28601:1:::1;28581:22;;:8;:22;;;;28573:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28691:8;28662:38;;28683:6;;;;;;;;;;;28662:38;;;;;;;;;;;;28720:8;28711:6;;:17;;;;;;;;;;;;;;;;;;28492:244:::0;:::o;30005:284::-;30107:4;30146:25;30131:40;;;:11;:40;;;;:101;;;;30199:33;30184:48;;;:11;:48;;;;30131:101;:150;;;;30245:36;30269:11;30245:23;:36::i;:::-;30131:150;30124:157;;30005:284;;;:::o;35621:127::-;35686:4;35738:1;35710:30;;:7;:16;35718:7;35710:16;;;;;;;;;;;;;;;;;;;;;:30;;;;35703:37;;35621:127;;;:::o;26155:98::-;26208:7;26235:10;26228:17;;26155:98;:::o;39860:174::-;39962:2;39935:15;:24;39951:7;39935:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;40018:7;40014:2;39980:46;;39989:23;40004:7;39989:14;:23::i;:::-;39980:46;;;;;;;;;;;;39860:174;;:::o;36605:110::-;36681:26;36691:2;36695:7;36681:26;;;;;;;;;;;;:9;:26::i;:::-;36605:110;;:::o;50065:127::-;50172:1;50154:7;:14;;;:19;;;;;;;;;;;50065:127;:::o;35915:348::-;36008:4;36033:16;36041:7;36033;:16::i;:::-;36025:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36109:13;36125:23;36140:7;36125:14;:23::i;:::-;36109:39;;36178:5;36167:16;;:7;:16;;;:51;;;;36211:7;36187:31;;:20;36199:7;36187:11;:20::i;:::-;:31;;;36167:51;:87;;;;36222:32;36239:5;36246:7;36222:16;:32::i;:::-;36167:87;36159:96;;;35915:348;;;;:::o;39192:550::-;39317:4;39290:31;;:23;39305:7;39290:14;:23::i;:::-;:31;;;39282:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;39400:1;39386:16;;:2;:16;;;;39378:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;39456:45;39477:4;39483:2;39487:7;39496:4;39456:20;:45::i;:::-;39566:29;39583:1;39587:7;39566:8;:29::i;:::-;39627:1;39608:9;:15;39618:4;39608:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;39656:1;39639:9;:13;39649:2;39639:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39687:2;39668:7;:16;39676:7;39668:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39726:7;39722:2;39707:27;;39716:4;39707:27;;;;;;;;;;;;39192:550;;;:::o;10974:397::-;11089:6;11064:21;:31;;11056:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;11221:12;11239:9;:14;;11262:6;11239:35;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11220:54;;;11293:7;11285:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;10974:397;;;:::o;35036:272::-;35150:28;35160:4;35166:2;35170:7;35150:9;:28::i;:::-;35197:48;35220:4;35226:2;35230:7;35239:5;35197:22;:48::i;:::-;35189:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;35036:272;;;;:::o;54174:117::-;54234:13;54267:16;54260:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54174:117;:::o;7152:723::-;7208:13;7438:1;7429:5;:10;7425:53;;;7456:10;;;;;;;;;;;;;;;;;;;;;7425:53;7488:12;7503:5;7488:20;;7519:14;7544:78;7559:1;7551:4;:9;7544:78;;7577:8;;;;;:::i;:::-;;;;7608:2;7600:10;;;;;:::i;:::-;;;7544:78;;;7632:19;7664:6;7654:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7632:39;;7682:154;7698:1;7689:5;:10;7682:154;;7726:1;7716:11;;;;;:::i;:::-;;;7793:2;7785:5;:10;;;;:::i;:::-;7772:2;:24;;;;:::i;:::-;7759:39;;7742:6;7749;7742:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;7822:2;7813:11;;;;;:::i;:::-;;;7682:154;;;7860:6;7846:21;;;;;7152:723;;;;:::o;19228:157::-;19313:4;19352:25;19337:40;;;:11;:40;;;;19330:47;;19228:157;;;:::o;36942:250::-;37038:18;37044:2;37048:7;37038:5;:18::i;:::-;37075:54;37106:1;37110:2;37114:7;37123:5;37075:22;:54::i;:::-;37067:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;36942:250;;;:::o;44692:604::-;44817:55;44844:4;44850:2;44854:7;44863:8;44817:26;:55::i;:::-;44905:1;44889:18;;:4;:18;;;44885:187;;;44924:40;44956:7;44924:31;:40::i;:::-;44885:187;;;44994:2;44986:10;;:4;:10;;;44982:90;;45013:47;45046:4;45052:7;45013:32;:47::i;:::-;44982:90;44885:187;45100:1;45086:16;;:2;:16;;;:28;;;;;45106:8;45086:28;45082:207;;;45131:45;45168:7;45131:36;:45::i;:::-;45082:207;;;45204:4;45198:10;;:2;:10;;;;:22;;;;;45212:8;45198:22;45194:95;;;45237:40;45265:2;45269:7;45237:27;:40::i;:::-;45194:95;45082:207;44692:604;;;;:::o;40599:839::-;40716:4;40742:15;:2;:13;;;:15::i;:::-;40738:693;;;40794:2;40778:36;;;40815:12;:10;:12::i;:::-;40829:4;40835:7;40844:5;40778:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40774:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41041:1;41024:6;:13;:18;41020:341;;;41067:60;;;;;;;;;;:::i;:::-;;;;;;;;41020:341;41311:6;41305:13;41296:6;41292:2;41288:15;41281:38;40774:602;40911:45;;;40901:55;;;:6;:55;;;;40894:62;;;;;40738:693;41415:4;41408:11;;40599:839;;;;;;;:::o;37528:388::-;37622:1;37608:16;;:2;:16;;;;37600:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;37681:16;37689:7;37681;:16::i;:::-;37680:17;37672:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;37743:51;37772:1;37776:2;37780:7;37789:4;37743:20;:51::i;:::-;37824:1;37807:9;:13;37817:2;37807:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;37855:2;37836:7;:16;37844:7;37836:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;37900:7;37896:2;37875:33;;37892:1;37875:33;;;;;;;;;;;;37528:388;;:::o;42051:108::-;;;;;:::o;46019:164::-;46123:10;:17;;;;46096:15;:24;46112:7;46096:24;;;;;;;;;;;:44;;;;46151:10;46167:7;46151:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46019:164;:::o;46810:988::-;47076:22;47126:1;47101:22;47118:4;47101:16;:22::i;:::-;:26;;;;:::i;:::-;47076:51;;47138:18;47159:17;:26;47177:7;47159:26;;;;;;;;;;;;47138:47;;47306:14;47292:10;:28;47288:328;;47337:19;47359:12;:18;47372:4;47359:18;;;;;;;;;;;;;;;:34;47378:14;47359:34;;;;;;;;;;;;47337:56;;47443:11;47410:12;:18;47423:4;47410:18;;;;;;;;;;;;;;;:30;47429:10;47410:30;;;;;;;;;;;:44;;;;47560:10;47527:17;:30;47545:11;47527:30;;;;;;;;;;;:43;;;;47288:328;;47712:17;:26;47730:7;47712:26;;;;;;;;;;;47705:33;;;47756:12;:18;47769:4;47756:18;;;;;;;;;;;;;;;:34;47775:14;47756:34;;;;;;;;;;;47749:41;;;46810:988;;;;:::o;48093:1079::-;48346:22;48391:1;48371:10;:17;;;;:21;;;;:::i;:::-;48346:46;;48403:18;48424:15;:24;48440:7;48424:24;;;;;;;;;;;;48403:45;;48775:19;48797:10;48808:14;48797:26;;;;;;;;;;;;;;;;;;;;;;;;48775:48;;48861:11;48836:10;48847;48836:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;48972:10;48941:15;:28;48957:11;48941:28;;;;;;;;;;;:41;;;;49113:15;:24;49129:7;49113:24;;;;;;;;;;;49106:31;;;49148:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48093:1079;;;;:::o;45597:221::-;45682:14;45699:20;45716:2;45699:16;:20::i;:::-;45682:37;;45757:7;45730:12;:16;45743:2;45730:16;;;;;;;;;;;;;;;:24;45747:6;45730:24;;;;;;;;;;;:34;;;;45804:6;45775:17;:26;45793:7;45775:26;;;;;;;;;;;:35;;;;45597:221;;;:::o;9617:422::-;9677:4;9885:12;9996:7;9984:20;9976:28;;10030:1;10023:4;:8;10016:15;;;9617:422;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:137::-;;1072:6;1059:20;1050:29;;1088:32;1114:5;1088:32;:::i;:::-;1040:86;;;;:::o;1132:141::-;;1219:6;1213:13;1204:22;;1235:32;1261:5;1235:32;:::i;:::-;1194:79;;;;:::o;1292:271::-;;1396:3;1389:4;1381:6;1377:17;1373:27;1363:2;;1414:1;1411;1404:12;1363:2;1454:6;1441:20;1479:78;1553:3;1545:6;1538:4;1530:6;1526:17;1479:78;:::i;:::-;1470:87;;1353:210;;;;;:::o;1583:273::-;;1688:3;1681:4;1673:6;1669:17;1665:27;1655:2;;1706:1;1703;1696:12;1655:2;1746:6;1733:20;1771:79;1846:3;1838:6;1831:4;1823:6;1819:17;1771:79;:::i;:::-;1762:88;;1645:211;;;;;:::o;1862:139::-;;1946:6;1933:20;1924:29;;1962:33;1989:5;1962:33;:::i;:::-;1914:87;;;;:::o;2007:262::-;;2115:2;2103:9;2094:7;2090:23;2086:32;2083:2;;;2131:1;2128;2121:12;2083:2;2174:1;2199:53;2244:7;2235:6;2224:9;2220:22;2199:53;:::i;:::-;2189:63;;2145:117;2073:196;;;;:::o;2275:407::-;;;2400:2;2388:9;2379:7;2375:23;2371:32;2368:2;;;2416:1;2413;2406:12;2368:2;2459:1;2484:53;2529:7;2520:6;2509:9;2505:22;2484:53;:::i;:::-;2474:63;;2430:117;2586:2;2612:53;2657:7;2648:6;2637:9;2633:22;2612:53;:::i;:::-;2602:63;;2557:118;2358:324;;;;;:::o;2688:552::-;;;;2830:2;2818:9;2809:7;2805:23;2801:32;2798:2;;;2846:1;2843;2836:12;2798:2;2889:1;2914:53;2959:7;2950:6;2939:9;2935:22;2914:53;:::i;:::-;2904:63;;2860:117;3016:2;3042:53;3087:7;3078:6;3067:9;3063:22;3042:53;:::i;:::-;3032:63;;2987:118;3144:2;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3115:118;2788:452;;;;;:::o;3246:809::-;;;;;3414:3;3402:9;3393:7;3389:23;3385:33;3382:2;;;3431:1;3428;3421:12;3382:2;3474:1;3499:53;3544:7;3535:6;3524:9;3520:22;3499:53;:::i;:::-;3489:63;;3445:117;3601:2;3627:53;3672:7;3663:6;3652:9;3648:22;3627:53;:::i;:::-;3617:63;;3572:118;3729:2;3755:53;3800:7;3791:6;3780:9;3776:22;3755:53;:::i;:::-;3745:63;;3700:118;3885:2;3874:9;3870:18;3857:32;3916:18;3908:6;3905:30;3902:2;;;3948:1;3945;3938:12;3902:2;3976:62;4030:7;4021:6;4010:9;4006:22;3976:62;:::i;:::-;3966:72;;3828:220;3372:683;;;;;;;:::o;4061:401::-;;;4183:2;4171:9;4162:7;4158:23;4154:32;4151:2;;;4199:1;4196;4189:12;4151:2;4242:1;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4213:117;4369:2;4395:50;4437:7;4428:6;4417:9;4413:22;4395:50;:::i;:::-;4385:60;;4340:115;4141:321;;;;;:::o;4468:407::-;;;4593:2;4581:9;4572:7;4568:23;4564:32;4561:2;;;4609:1;4606;4599:12;4561:2;4652:1;4677:53;4722:7;4713:6;4702:9;4698:22;4677:53;:::i;:::-;4667:63;;4623:117;4779:2;4805:53;4850:7;4841:6;4830:9;4826:22;4805:53;:::i;:::-;4795:63;;4750:118;4551:324;;;;;:::o;4881:260::-;;4988:2;4976:9;4967:7;4963:23;4959:32;4956:2;;;5004:1;5001;4994:12;4956:2;5047:1;5072:52;5116:7;5107:6;5096:9;5092:22;5072:52;:::i;:::-;5062:62;;5018:116;4946:195;;;;:::o;5147:282::-;;5265:2;5253:9;5244:7;5240:23;5236:32;5233:2;;;5281:1;5278;5271:12;5233:2;5324:1;5349:63;5404:7;5395:6;5384:9;5380:22;5349:63;:::i;:::-;5339:73;;5295:127;5223:206;;;;:::o;5435:375::-;;5553:2;5541:9;5532:7;5528:23;5524:32;5521:2;;;5569:1;5566;5559:12;5521:2;5640:1;5629:9;5625:17;5612:31;5670:18;5662:6;5659:30;5656:2;;;5702:1;5699;5692:12;5656:2;5730:63;5785:7;5776:6;5765:9;5761:22;5730:63;:::i;:::-;5720:73;;5583:220;5511:299;;;;:::o;5816:262::-;;5924:2;5912:9;5903:7;5899:23;5895:32;5892:2;;;5940:1;5937;5930:12;5892:2;5983:1;6008:53;6053:7;6044:6;6033:9;6029:22;6008:53;:::i;:::-;5998:63;;5954:117;5882:196;;;;:::o;6084:118::-;6171:24;6189:5;6171:24;:::i;:::-;6166:3;6159:37;6149:53;;:::o;6208:109::-;6289:21;6304:5;6289:21;:::i;:::-;6284:3;6277:34;6267:50;;:::o;6323:360::-;;6437:38;6469:5;6437:38;:::i;:::-;6491:70;6554:6;6549:3;6491:70;:::i;:::-;6484:77;;6570:52;6615:6;6610:3;6603:4;6596:5;6592:16;6570:52;:::i;:::-;6647:29;6669:6;6647:29;:::i;:::-;6642:3;6638:39;6631:46;;6413:270;;;;;:::o;6689:364::-;;6805:39;6838:5;6805:39;:::i;:::-;6860:71;6924:6;6919:3;6860:71;:::i;:::-;6853:78;;6940:52;6985:6;6980:3;6973:4;6966:5;6962:16;6940:52;:::i;:::-;7017:29;7039:6;7017:29;:::i;:::-;7012:3;7008:39;7001:46;;6781:272;;;;;:::o;7059:377::-;;7193:39;7226:5;7193:39;:::i;:::-;7248:89;7330:6;7325:3;7248:89;:::i;:::-;7241:96;;7346:52;7391:6;7386:3;7379:4;7372:5;7368:16;7346:52;:::i;:::-;7423:6;7418:3;7414:16;7407:23;;7169:267;;;;;:::o;7442:386::-;;7605:67;7669:2;7664:3;7605:67;:::i;:::-;7598:74;;7702:34;7698:1;7693:3;7689:11;7682:55;7768:24;7763:2;7758:3;7754:12;7747:46;7819:2;7814:3;7810:12;7803:19;;7588:240;;;:::o;7834:375::-;;7997:67;8061:2;8056:3;7997:67;:::i;:::-;7990:74;;8094:34;8090:1;8085:3;8081:11;8074:55;8160:13;8155:2;8150:3;8146:12;8139:35;8200:2;8195:3;8191:12;8184:19;;7980:229;;;:::o;8215:382::-;;8378:67;8442:2;8437:3;8378:67;:::i;:::-;8371:74;;8475:34;8471:1;8466:3;8462:11;8455:55;8541:20;8536:2;8531:3;8527:12;8520:42;8588:2;8583:3;8579:12;8572:19;;8361:236;;;:::o;8603:370::-;;8766:67;8830:2;8825:3;8766:67;:::i;:::-;8759:74;;8863:34;8859:1;8854:3;8850:11;8843:55;8929:8;8924:2;8919:3;8915:12;8908:30;8964:2;8959:3;8955:12;8948:19;;8749:224;;;:::o;8979:326::-;;9142:67;9206:2;9201:3;9142:67;:::i;:::-;9135:74;;9239:30;9235:1;9230:3;9226:11;9219:51;9296:2;9291:3;9287:12;9280:19;;9125:180;;;:::o;9311:368::-;;9474:67;9538:2;9533:3;9474:67;:::i;:::-;9467:74;;9571:34;9567:1;9562:3;9558:11;9551:55;9637:6;9632:2;9627:3;9623:12;9616:28;9670:2;9665:3;9661:12;9654:19;;9457:222;;;:::o;9685:323::-;;9848:67;9912:2;9907:3;9848:67;:::i;:::-;9841:74;;9945:27;9941:1;9936:3;9932:11;9925:48;9999:2;9994:3;9990:12;9983:19;;9831:177;;;:::o;10014:390::-;;10177:67;10241:2;10236:3;10177:67;:::i;:::-;10170:74;;10274:34;10270:1;10265:3;10261:11;10254:55;10340:28;10335:2;10330:3;10326:12;10319:50;10395:2;10390:3;10386:12;10379:19;;10160:244;;;:::o;10410:327::-;;10573:67;10637:2;10632:3;10573:67;:::i;:::-;10566:74;;10670:31;10666:1;10661:3;10657:11;10650:52;10728:2;10723:3;10719:12;10712:19;;10556:181;;;:::o;10743:376::-;;10906:67;10970:2;10965:3;10906:67;:::i;:::-;10899:74;;11003:34;10999:1;10994:3;10990:11;10983:55;11069:14;11064:2;11059:3;11055:12;11048:36;11110:2;11105:3;11101:12;11094:19;;10889:230;;;:::o;11125:388::-;;11288:67;11352:2;11347:3;11288:67;:::i;:::-;11281:74;;11385:34;11381:1;11376:3;11372:11;11365:55;11451:26;11446:2;11441:3;11437:12;11430:48;11504:2;11499:3;11495:12;11488:19;;11271:242;;;:::o;11519:374::-;;11682:67;11746:2;11741:3;11682:67;:::i;:::-;11675:74;;11779:34;11775:1;11770:3;11766:11;11759:55;11845:12;11840:2;11835:3;11831:12;11824:34;11884:2;11879:3;11875:12;11868:19;;11665:228;;;:::o;11899:373::-;;12062:67;12126:2;12121:3;12062:67;:::i;:::-;12055:74;;12159:34;12155:1;12150:3;12146:11;12139:55;12225:11;12220:2;12215:3;12211:12;12204:33;12263:2;12258:3;12254:12;12247:19;;12045:227;;;:::o;12278:330::-;;12441:67;12505:2;12500:3;12441:67;:::i;:::-;12434:74;;12538:34;12534:1;12529:3;12525:11;12518:55;12599:2;12594:3;12590:12;12583:19;;12424:184;;;:::o;12614:330::-;;12777:67;12841:2;12836:3;12777:67;:::i;:::-;12770:74;;12874:34;12870:1;12865:3;12861:11;12854:55;12935:2;12930:3;12926:12;12919:19;;12760:184;;;:::o;12950:376::-;;13113:67;13177:2;13172:3;13113:67;:::i;:::-;13106:74;;13210:34;13206:1;13201:3;13197:11;13190:55;13276:14;13271:2;13266:3;13262:12;13255:36;13317:2;13312:3;13308:12;13301:19;;13096:230;;;:::o;13332:330::-;;13495:67;13559:2;13554:3;13495:67;:::i;:::-;13488:74;;13592:34;13588:1;13583:3;13579:11;13572:55;13653:2;13648:3;13644:12;13637:19;;13478:184;;;:::o;13668:373::-;;13831:67;13895:2;13890:3;13831:67;:::i;:::-;13824:74;;13928:34;13924:1;13919:3;13915:11;13908:55;13994:11;13989:2;13984:3;13980:12;13973:33;14032:2;14027:3;14023:12;14016:19;;13814:227;;;:::o;14047:379::-;;14210:67;14274:2;14269:3;14210:67;:::i;:::-;14203:74;;14307:34;14303:1;14298:3;14294:11;14287:55;14373:17;14368:2;14363:3;14359:12;14352:39;14417:2;14412:3;14408:12;14401:19;;14193:233;;;:::o;14432:330::-;;14595:67;14659:2;14654:3;14595:67;:::i;:::-;14588:74;;14692:34;14688:1;14683:3;14679:11;14672:55;14753:2;14748:3;14744:12;14737:19;;14578:184;;;:::o;14768:365::-;;14931:67;14995:2;14990:3;14931:67;:::i;:::-;14924:74;;15028:34;15024:1;15019:3;15015:11;15008:55;15094:3;15089:2;15084:3;15080:12;15073:25;15124:2;15119:3;15115:12;15108:19;;14914:219;;;:::o;15139:297::-;;15319:83;15400:1;15395:3;15319:83;:::i;:::-;15312:90;;15428:1;15423:3;15419:11;15412:18;;15302:134;;;:::o;15442:381::-;;15605:67;15669:2;15664:3;15605:67;:::i;:::-;15598:74;;15702:34;15698:1;15693:3;15689:11;15682:55;15768:19;15763:2;15758:3;15754:12;15747:41;15814:2;15809:3;15805:12;15798:19;;15588:235;;;:::o;15829:376::-;;15992:67;16056:2;16051:3;15992:67;:::i;:::-;15985:74;;16089:34;16085:1;16080:3;16076:11;16069:55;16155:14;16150:2;16145:3;16141:12;16134:36;16196:2;16191:3;16187:12;16180:19;;15975:230;;;:::o;16211:330::-;;16374:67;16438:2;16433:3;16374:67;:::i;:::-;16367:74;;16471:34;16467:1;16462:3;16458:11;16451:55;16532:2;16527:3;16523:12;16516:19;;16357:184;;;:::o;16547:118::-;16634:24;16652:5;16634:24;:::i;:::-;16629:3;16622:37;16612:53;;:::o;16671:435::-;;16873:95;16964:3;16955:6;16873:95;:::i;:::-;16866:102;;16985:95;17076:3;17067:6;16985:95;:::i;:::-;16978:102;;17097:3;17090:10;;16855:251;;;;;:::o;17112:379::-;;17318:147;17461:3;17318:147;:::i;:::-;17311:154;;17482:3;17475:10;;17300:191;;;:::o;17497:222::-;;17628:2;17617:9;17613:18;17605:26;;17641:71;17709:1;17698:9;17694:17;17685:6;17641:71;:::i;:::-;17595:124;;;;:::o;17725:640::-;;17958:3;17947:9;17943:19;17935:27;;17972:71;18040:1;18029:9;18025:17;18016:6;17972:71;:::i;:::-;18053:72;18121:2;18110:9;18106:18;18097:6;18053:72;:::i;:::-;18135;18203:2;18192:9;18188:18;18179:6;18135:72;:::i;:::-;18254:9;18248:4;18244:20;18239:2;18228:9;18224:18;18217:48;18282:76;18353:4;18344:6;18282:76;:::i;:::-;18274:84;;17925:440;;;;;;;:::o;18371:332::-;;18530:2;18519:9;18515:18;18507:26;;18543:71;18611:1;18600:9;18596:17;18587:6;18543:71;:::i;:::-;18624:72;18692:2;18681:9;18677:18;18668:6;18624:72;:::i;:::-;18497:206;;;;;:::o;18709:210::-;;18834:2;18823:9;18819:18;18811:26;;18847:65;18909:1;18898:9;18894:17;18885:6;18847:65;:::i;:::-;18801:118;;;;:::o;18925:313::-;;19076:2;19065:9;19061:18;19053:26;;19125:9;19119:4;19115:20;19111:1;19100:9;19096:17;19089:47;19153:78;19226:4;19217:6;19153:78;:::i;:::-;19145:86;;19043:195;;;;:::o;19244:419::-;;19448:2;19437:9;19433:18;19425:26;;19497:9;19491:4;19487:20;19483:1;19472:9;19468:17;19461:47;19525:131;19651:4;19525:131;:::i;:::-;19517:139;;19415:248;;;:::o;19669:419::-;;19873:2;19862:9;19858:18;19850:26;;19922:9;19916:4;19912:20;19908:1;19897:9;19893:17;19886:47;19950:131;20076:4;19950:131;:::i;:::-;19942:139;;19840:248;;;:::o;20094:419::-;;20298:2;20287:9;20283:18;20275:26;;20347:9;20341:4;20337:20;20333:1;20322:9;20318:17;20311:47;20375:131;20501:4;20375:131;:::i;:::-;20367:139;;20265:248;;;:::o;20519:419::-;;20723:2;20712:9;20708:18;20700:26;;20772:9;20766:4;20762:20;20758:1;20747:9;20743:17;20736:47;20800:131;20926:4;20800:131;:::i;:::-;20792:139;;20690:248;;;:::o;20944:419::-;;21148:2;21137:9;21133:18;21125:26;;21197:9;21191:4;21187:20;21183:1;21172:9;21168:17;21161:47;21225:131;21351:4;21225:131;:::i;:::-;21217:139;;21115:248;;;:::o;21369:419::-;;21573:2;21562:9;21558:18;21550:26;;21622:9;21616:4;21612:20;21608:1;21597:9;21593:17;21586:47;21650:131;21776:4;21650:131;:::i;:::-;21642:139;;21540:248;;;:::o;21794:419::-;;21998:2;21987:9;21983:18;21975:26;;22047:9;22041:4;22037:20;22033:1;22022:9;22018:17;22011:47;22075:131;22201:4;22075:131;:::i;:::-;22067:139;;21965:248;;;:::o;22219:419::-;;22423:2;22412:9;22408:18;22400:26;;22472:9;22466:4;22462:20;22458:1;22447:9;22443:17;22436:47;22500:131;22626:4;22500:131;:::i;:::-;22492:139;;22390:248;;;:::o;22644:419::-;;22848:2;22837:9;22833:18;22825:26;;22897:9;22891:4;22887:20;22883:1;22872:9;22868:17;22861:47;22925:131;23051:4;22925:131;:::i;:::-;22917:139;;22815:248;;;:::o;23069:419::-;;23273:2;23262:9;23258:18;23250:26;;23322:9;23316:4;23312:20;23308:1;23297:9;23293:17;23286:47;23350:131;23476:4;23350:131;:::i;:::-;23342:139;;23240:248;;;:::o;23494:419::-;;23698:2;23687:9;23683:18;23675:26;;23747:9;23741:4;23737:20;23733:1;23722:9;23718:17;23711:47;23775:131;23901:4;23775:131;:::i;:::-;23767:139;;23665:248;;;:::o;23919:419::-;;24123:2;24112:9;24108:18;24100:26;;24172:9;24166:4;24162:20;24158:1;24147:9;24143:17;24136:47;24200:131;24326:4;24200:131;:::i;:::-;24192:139;;24090:248;;;:::o;24344:419::-;;24548:2;24537:9;24533:18;24525:26;;24597:9;24591:4;24587:20;24583:1;24572:9;24568:17;24561:47;24625:131;24751:4;24625:131;:::i;:::-;24617:139;;24515:248;;;:::o;24769:419::-;;24973:2;24962:9;24958:18;24950:26;;25022:9;25016:4;25012:20;25008:1;24997:9;24993:17;24986:47;25050:131;25176:4;25050:131;:::i;:::-;25042:139;;24940:248;;;:::o;25194:419::-;;25398:2;25387:9;25383:18;25375:26;;25447:9;25441:4;25437:20;25433:1;25422:9;25418:17;25411:47;25475:131;25601:4;25475:131;:::i;:::-;25467:139;;25365:248;;;:::o;25619:419::-;;25823:2;25812:9;25808:18;25800:26;;25872:9;25866:4;25862:20;25858:1;25847:9;25843:17;25836:47;25900:131;26026:4;25900:131;:::i;:::-;25892:139;;25790:248;;;:::o;26044:419::-;;26248:2;26237:9;26233:18;26225:26;;26297:9;26291:4;26287:20;26283:1;26272:9;26268:17;26261:47;26325:131;26451:4;26325:131;:::i;:::-;26317:139;;26215:248;;;:::o;26469:419::-;;26673:2;26662:9;26658:18;26650:26;;26722:9;26716:4;26712:20;26708:1;26697:9;26693:17;26686:47;26750:131;26876:4;26750:131;:::i;:::-;26742:139;;26640:248;;;:::o;26894:419::-;;27098:2;27087:9;27083:18;27075:26;;27147:9;27141:4;27137:20;27133:1;27122:9;27118:17;27111:47;27175:131;27301:4;27175:131;:::i;:::-;27167:139;;27065:248;;;:::o;27319:419::-;;27523:2;27512:9;27508:18;27500:26;;27572:9;27566:4;27562:20;27558:1;27547:9;27543:17;27536:47;27600:131;27726:4;27600:131;:::i;:::-;27592:139;;27490:248;;;:::o;27744:419::-;;27948:2;27937:9;27933:18;27925:26;;27997:9;27991:4;27987:20;27983:1;27972:9;27968:17;27961:47;28025:131;28151:4;28025:131;:::i;:::-;28017:139;;27915:248;;;:::o;28169:419::-;;28373:2;28362:9;28358:18;28350:26;;28422:9;28416:4;28412:20;28408:1;28397:9;28393:17;28386:47;28450:131;28576:4;28450:131;:::i;:::-;28442:139;;28340:248;;;:::o;28594:419::-;;28798:2;28787:9;28783:18;28775:26;;28847:9;28841:4;28837:20;28833:1;28822:9;28818:17;28811:47;28875:131;29001:4;28875:131;:::i;:::-;28867:139;;28765:248;;;:::o;29019:419::-;;29223:2;29212:9;29208:18;29200:26;;29272:9;29266:4;29262:20;29258:1;29247:9;29243:17;29236:47;29300:131;29426:4;29300:131;:::i;:::-;29292:139;;29190:248;;;:::o;29444:222::-;;29575:2;29564:9;29560:18;29552:26;;29588:71;29656:1;29645:9;29641:17;29632:6;29588:71;:::i;:::-;29542:124;;;;:::o;29672:283::-;;29738:2;29732:9;29722:19;;29780:4;29772:6;29768:17;29887:6;29875:10;29872:22;29851:18;29839:10;29836:34;29833:62;29830:2;;;29898:18;;:::i;:::-;29830:2;29938:10;29934:2;29927:22;29712:243;;;;:::o;29961:331::-;;30112:18;30104:6;30101:30;30098:2;;;30134:18;;:::i;:::-;30098:2;30219:4;30215:9;30208:4;30200:6;30196:17;30192:33;30184:41;;30280:4;30274;30270:15;30262:23;;30027:265;;;:::o;30298:332::-;;30450:18;30442:6;30439:30;30436:2;;;30472:18;;:::i;:::-;30436:2;30557:4;30553:9;30546:4;30538:6;30534:17;30530:33;30522:41;;30618:4;30612;30608:15;30600:23;;30365:265;;;:::o;30636:98::-;;30721:5;30715:12;30705:22;;30694:40;;;:::o;30740:99::-;;30826:5;30820:12;30810:22;;30799:40;;;:::o;30845:168::-;;30962:6;30957:3;30950:19;31002:4;30997:3;30993:14;30978:29;;30940:73;;;;:::o;31019:147::-;;31157:3;31142:18;;31132:34;;;;:::o;31172:169::-;;31290:6;31285:3;31278:19;31330:4;31325:3;31321:14;31306:29;;31268:73;;;;:::o;31347:148::-;;31486:3;31471:18;;31461:34;;;;:::o;31501:305::-;;31560:20;31578:1;31560:20;:::i;:::-;31555:25;;31594:20;31612:1;31594:20;:::i;:::-;31589:25;;31748:1;31680:66;31676:74;31673:1;31670:81;31667:2;;;31754:18;;:::i;:::-;31667:2;31798:1;31795;31791:9;31784:16;;31545:261;;;;:::o;31812:185::-;;31869:20;31887:1;31869:20;:::i;:::-;31864:25;;31903:20;31921:1;31903:20;:::i;:::-;31898:25;;31942:1;31932:2;;31947:18;;:::i;:::-;31932:2;31989:1;31986;31982:9;31977:14;;31854:143;;;;:::o;32003:191::-;;32063:20;32081:1;32063:20;:::i;:::-;32058:25;;32097:20;32115:1;32097:20;:::i;:::-;32092:25;;32136:1;32133;32130:8;32127:2;;;32141:18;;:::i;:::-;32127:2;32186:1;32183;32179:9;32171:17;;32048:146;;;;:::o;32200:96::-;;32266:24;32284:5;32266:24;:::i;:::-;32255:35;;32245:51;;;:::o;32302:90::-;;32379:5;32372:13;32365:21;32354:32;;32344:48;;;:::o;32398:149::-;;32474:66;32467:5;32463:78;32452:89;;32442:105;;;:::o;32553:126::-;;32630:42;32623:5;32619:54;32608:65;;32598:81;;;:::o;32685:77::-;;32751:5;32740:16;;32730:32;;;:::o;32768:154::-;32852:6;32847:3;32842;32829:30;32914:1;32905:6;32900:3;32896:16;32889:27;32819:103;;;:::o;32928:307::-;32996:1;33006:113;33020:6;33017:1;33014:13;33006:113;;;33105:1;33100:3;33096:11;33090:18;33086:1;33081:3;33077:11;33070:39;33042:2;33039:1;33035:10;33030:15;;33006:113;;;33137:6;33134:1;33131:13;33128:2;;;33217:1;33208:6;33203:3;33199:16;33192:27;33128:2;32977:258;;;;:::o;33241:320::-;;33322:1;33316:4;33312:12;33302:22;;33369:1;33363:4;33359:12;33390:18;33380:2;;33446:4;33438:6;33434:17;33424:27;;33380:2;33508;33500:6;33497:14;33477:18;33474:38;33471:2;;;33527:18;;:::i;:::-;33471:2;33292:269;;;;:::o;33567:233::-;;33629:24;33647:5;33629:24;:::i;:::-;33620:33;;33675:66;33668:5;33665:77;33662:2;;;33745:18;;:::i;:::-;33662:2;33792:1;33785:5;33781:13;33774:20;;33610:190;;;:::o;33806:176::-;;33855:20;33873:1;33855:20;:::i;:::-;33850:25;;33889:20;33907:1;33889:20;:::i;:::-;33884:25;;33928:1;33918:2;;33933:18;;:::i;:::-;33918:2;33974:1;33971;33967:9;33962:14;;33840:142;;;;:::o;33988:180::-;34036:77;34033:1;34026:88;34133:4;34130:1;34123:15;34157:4;34154:1;34147:15;34174:180;34222:77;34219:1;34212:88;34319:4;34316:1;34309:15;34343:4;34340:1;34333:15;34360:180;34408:77;34405:1;34398:88;34505:4;34502:1;34495:15;34529:4;34526:1;34519:15;34546:180;34594:77;34591:1;34584:88;34691:4;34688:1;34681:15;34715:4;34712:1;34705:15;34732:102;;34824:2;34820:7;34815:2;34808:5;34804:14;34800:28;34790:38;;34780:54;;;:::o;34840:122::-;34913:24;34931:5;34913:24;:::i;:::-;34906:5;34903:35;34893:2;;34952:1;34949;34942:12;34893:2;34883:79;:::o;34968:116::-;35038:21;35053:5;35038:21;:::i;:::-;35031:5;35028:32;35018:2;;35074:1;35071;35064:12;35018:2;35008:76;:::o;35090:120::-;35162:23;35179:5;35162:23;:::i;:::-;35155:5;35152:34;35142:2;;35200:1;35197;35190:12;35142:2;35132:78;:::o;35216:122::-;35289:24;35307:5;35289:24;:::i;:::-;35282:5;35279:35;35269:2;;35328:1;35325;35318:12;35269:2;35259:79;:::o

Swarm Source

ipfs://5e9b8a5a732e8f7a9ba7b96b4dfc33638edf1d23600a55ad67b5e8a422c3bda9
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.