ETH Price: $2,495.11 (+3.31%)

Token

Blind Bunny Society (BBS)
 

Overview

Max Total Supply

71 BBS

Holders

59

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
murderphace.eth
Balance
1 BBS
0x8921ee64608b692f4922b01c1a664f1a3a5848e0
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
BlindBunnySociety

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

// SPDX-License-Identifier: MIT
 
// File: @openzeppelin/contracts/utils/Context.sol

pragma solidity >=0.6.0 <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 GSN 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 payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

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



pragma solidity >=0.6.0 <0.8.0;

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

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



pragma solidity >=0.6.2 <0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity >=0.6.2 <0.8.0;


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

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

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

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

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



pragma solidity >=0.6.2 <0.8.0;


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

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

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

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

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



pragma solidity >=0.6.0 <0.8.0;

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

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



pragma solidity >=0.6.0 <0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
abstract contract ERC165 is IERC165 {
    /*
     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
     */
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor () internal {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(_INTERFACE_ID_ERC165);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     *
     * Time complexity O(1), guaranteed to always use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See {IERC165-supportsInterface}.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal virtual {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}

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



pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
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) {
        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) {
        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) {
        // 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) {
        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) {
        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) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    /**
     * @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) {
        require(b <= a, "SafeMath: subtraction overflow");
        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) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    /**
     * @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. 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) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        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) {
        require(b > 0, "SafeMath: modulo by zero");
        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) {
        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.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * 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) {
        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) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

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



pragma solidity >=0.6.2 <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);
            }
        }
    }
}

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



pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;

        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) { // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }


    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}

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



pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Library for managing an enumerable variant of Solidity's
 * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`]
 * type.
 *
 * Maps have the following properties:
 *
 * - Entries are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Entries are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableMap for EnumerableMap.UintToAddressMap;
 *
 *     // Declare a set state variable
 *     EnumerableMap.UintToAddressMap private myMap;
 * }
 * ```
 *
 * As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are
 * supported.
 */
library EnumerableMap {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Map type with
    // bytes32 keys and values.
    // The Map implementation uses private functions, and user-facing
    // implementations (such as Uint256ToAddressMap) are just wrappers around
    // the underlying Map.
    // This means that we can only create new EnumerableMaps for types that fit
    // in bytes32.

    struct MapEntry {
        bytes32 _key;
        bytes32 _value;
    }

    struct Map {
        // Storage of map keys and values
        MapEntry[] _entries;

        // Position of the entry defined by a key in the `entries` array, plus 1
        // because index 0 means a key is not in the map.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) {
        // We read and store the key's index to prevent multiple reads from the same storage slot
        uint256 keyIndex = map._indexes[key];

        if (keyIndex == 0) { // Equivalent to !contains(map, key)
            map._entries.push(MapEntry({ _key: key, _value: value }));
            // The entry is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            map._indexes[key] = map._entries.length;
            return true;
        } else {
            map._entries[keyIndex - 1]._value = value;
            return false;
        }
    }

    /**
     * @dev Removes a key-value pair from a map. O(1).
     *
     * Returns true if the key was removed from the map, that is if it was present.
     */
    function _remove(Map storage map, bytes32 key) private returns (bool) {
        // We read and store the key's index to prevent multiple reads from the same storage slot
        uint256 keyIndex = map._indexes[key];

        if (keyIndex != 0) { // Equivalent to contains(map, key)
            // To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one
            // in the array, and then remove the last entry (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = keyIndex - 1;
            uint256 lastIndex = map._entries.length - 1;

            // When the entry to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            MapEntry storage lastEntry = map._entries[lastIndex];

            // Move the last entry to the index where the entry to delete is
            map._entries[toDeleteIndex] = lastEntry;
            // Update the index for the moved entry
            map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved entry was stored
            map._entries.pop();

            // Delete the index for the deleted slot
            delete map._indexes[key];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the key is in the map. O(1).
     */
    function _contains(Map storage map, bytes32 key) private view returns (bool) {
        return map._indexes[key] != 0;
    }

    /**
     * @dev Returns the number of key-value pairs in the map. O(1).
     */
    function _length(Map storage map) private view returns (uint256) {
        return map._entries.length;
    }

   /**
    * @dev Returns the key-value pair stored at position `index` in the map. O(1).
    *
    * Note that there are no guarantees on the ordering of entries inside the
    * array, and it may change when more entries are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) {
        require(map._entries.length > index, "EnumerableMap: index out of bounds");

        MapEntry storage entry = map._entries[index];
        return (entry._key, entry._value);
    }

    /**
     * @dev Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     */
    function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) {
        uint256 keyIndex = map._indexes[key];
        if (keyIndex == 0) return (false, 0); // Equivalent to contains(map, key)
        return (true, map._entries[keyIndex - 1]._value); // All indexes are 1-based
    }

    /**
     * @dev Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function _get(Map storage map, bytes32 key) private view returns (bytes32) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, "EnumerableMap: nonexistent key"); // Equivalent to contains(map, key)
        return map._entries[keyIndex - 1]._value; // All indexes are 1-based
    }

    /**
     * @dev Same as {_get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {_tryGet}.
     */
    function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key)
        return map._entries[keyIndex - 1]._value; // All indexes are 1-based
    }

    // UintToAddressMap

    struct UintToAddressMap {
        Map _inner;
    }

    /**
     * @dev Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) {
        return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the key was removed from the map, that is if it was present.
     */
    function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) {
        return _remove(map._inner, bytes32(key));
    }

    /**
     * @dev Returns true if the key is in the map. O(1).
     */
    function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) {
        return _contains(map._inner, bytes32(key));
    }

    /**
     * @dev Returns the number of elements in the map. O(1).
     */
    function length(UintToAddressMap storage map) internal view returns (uint256) {
        return _length(map._inner);
    }

   /**
    * @dev Returns the element stored at position `index` in the set. O(1).
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) {
        (bytes32 key, bytes32 value) = _at(map._inner, index);
        return (uint256(key), address(uint160(uint256(value))));
    }

    /**
     * @dev Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     *
     * _Available since v3.4._
     */
    function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) {
        (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key));
        return (success, address(uint160(uint256(value))));
    }

    /**
     * @dev Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function get(UintToAddressMap storage map, uint256 key) internal view returns (address) {
        return address(uint160(uint256(_get(map._inner, bytes32(key)))));
    }

    /**
     * @dev Same as {get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryGet}.
     */
    function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) {
        return address(uint160(uint256(_get(map._inner, bytes32(key), errorMessage))));
    }
}

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



pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    /**
     * @dev Converts a `uint256` to its ASCII `string` 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);
        uint256 index = digits - 1;
        temp = value;
        while (temp != 0) {
            buffer[index--] = bytes1(uint8(48 + temp % 10));
            temp /= 10;
        }
        return string(buffer);
    }
}

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



pragma solidity >=0.6.0 <0.8.0;

/**
 * @title ERC721 Non-Fungible Token Standard basic implementation
 * @dev see https://eips.ethereum.org/EIPS/eip-721
 */
 
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using SafeMath for uint256;
    using Address for address;
    using EnumerableSet for EnumerableSet.UintSet;
    using EnumerableMap for EnumerableMap.UintToAddressMap;
    using Strings for uint256;

    // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector`
    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;

    // Mapping from holder address to their (enumerable) set of owned tokens
    mapping (address => EnumerableSet.UintSet) private _holderTokens;

    // Enumerable mapping from token ids to their owners
    EnumerableMap.UintToAddressMap private _tokenOwners;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

    // Base URI
    string private _baseURI;

    /*
     *     bytes4(keccak256('balanceOf(address)')) == 0x70a08231
     *     bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e
     *     bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3
     *     bytes4(keccak256('getApproved(uint256)')) == 0x081812fc
     *     bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465
     *     bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5
     *     bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde
     *
     *     => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^
     *        0xa22cb465 ^ 0xe985e9c5 ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd
     */
    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;

    /*
     *     bytes4(keccak256('name()')) == 0x06fdde03
     *     bytes4(keccak256('symbol()')) == 0x95d89b41
     *     bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd
     *
     *     => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f
     */
    bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;

    /*
     *     bytes4(keccak256('totalSupply()')) == 0x18160ddd
     *     bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59
     *     bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7
     *
     *     => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63
     */
    bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;

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

        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(_INTERFACE_ID_ERC721);
        _registerInterface(_INTERFACE_ID_ERC721_METADATA);
        _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE);
    }

    /**
     * @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 _holderTokens[owner].length();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return _tokenOwners.get(tokenId, "ERC721: owner query for nonexistent token");
    }

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

    /**
    * @dev Returns the base URI set via {_setBaseURI}. This will be
    * automatically added as a prefix in {tokenURI} to each token's URI, or
    * to the token ID if no specific URI is set for that token ID.
    */
    function baseURI() public view virtual returns (string memory) {
        return _baseURI;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        return _holderTokens[owner].at(index);
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds
        return _tokenOwners.length();
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        (uint256 tokenId, ) = _tokenOwners.at(index);
        return tokenId;
    }

    /**
     * @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 || ERC721.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 _tokenOwners.contains(tokenId);
    }

    /**
     * @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 || ERC721.isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     d*
     * - `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);

        _holderTokens[to].add(tokenId);

        _tokenOwners.set(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); // internal owner

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

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

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

        _holderTokens[owner].remove(tokenId);

        _tokenOwners.remove(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"); // internal owner
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

        _holderTokens[from].remove(tokenId);
        _holderTokens[to].add(tokenId);

        _tokenOwners.set(tokenId, to);

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Internal function to set the base URI for all token IDs. It is
     * automatically added as a prefix to the value returned in {tokenURI},
     * or to the token ID if {tokenURI} is empty.
     */
    function _setBaseURI(string memory baseURI_) internal virtual {
        _baseURI = baseURI_;
    }

    /**
     * @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()) {
            return true;
        }
        bytes memory returndata = to.functionCall(abi.encodeWithSelector(
            IERC721Receiver(to).onERC721Received.selector,
            _msgSender(),
            from,
            tokenId,
            _data
        ), "ERC721: transfer to non ERC721Receiver implementer");
        bytes4 retval = abi.decode(returndata, (bytes4));
        return (retval == _ERC721_RECEIVED);
    }

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

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

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



pragma solidity >=0.6.0 <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 () internal {
        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;
    }
}




// website (https://BlindBunnySociety.com)
// 0.7.6




pragma solidity ^0.7.0;
pragma abicoder v2;

contract BlindBunnySociety is ERC721, Ownable {
    using SafeMath for uint256;
    uint public constant maxBlindBunnySocietyPurchase = 20;
    uint public BlindBunnySocietyReserve = 250; // for events and giveaways
    uint public constant maxPreSale = 4111;
    uint256 public BlindBunnySocietyPrice = 55000000000000000; // 0.055 ETH
    uint256 public constant MAX_BlindBunnySociety = 11111;
    uint256 public presalePurchaseLimit = 5;
    bool public saleIsActive = false;
    bool public presaleLive;
    
    address private devAddr = 0x2e66b9Fc4D71b374ce09e2AeEE92c8738bA9c115;
    address private ownerAddr = 0xB2Dd427d8C4Ef90744D51667a9c4d4dE101B8037;
    
    mapping(address => bool) public presalerList;
    mapping(address => uint256) public presalerListPurchases;
    
    constructor() ERC721("Blind Bunny Society", "BBS") {
       for (uint256 i = 0; i < 11; i++) {
            uint256 mintIndex = totalSupply();
                _safeMint(msg.sender, mintIndex);
        }
        BlindBunnySocietyReserve = BlindBunnySocietyReserve.sub(11);
    }
    
    function withdraw() public onlyOwner {
        uint256 _onePerc = address(this).balance.div(100);
        // dev share 15%
        uint256 _devShare = _onePerc.mul(15);
        // rest to owner
        uint256 _ownerShare = _onePerc.mul(85);
        //send balance
        require(payable(devAddr).send(_devShare));
        require(payable(ownerAddr).send(_ownerShare));
    }
    
    function addToPresaleList(address[] calldata entries) external onlyOwner {
        for(uint256 i = 0; i < entries.length; i++) {
            address entry = entries[i];
            require(entry != address(0), "NULL_ADDRESS");
            require(!presalerList[entry], "DUPLICATE_ENTRY");

            presalerList[entry] = true;
        }   
    }
    
    function removeFromPresaleList(address[] calldata entries) external onlyOwner {
        for(uint256 i = 0; i < entries.length; i++) {
            address entry = entries[i];
            require(entry != address(0), "NULL_ADDRESS");
            
            presalerList[entry] = false;
        }
    }
    
    function _Price(uint256 newPrice) public onlyOwner {
        BlindBunnySocietyPrice = newPrice;
    }
    
    function mintBBS(uint numberOfTokens) public payable {
        require(saleIsActive, "Sale must be active to mint BlindBunnySociety");
        require(numberOfTokens > 0 && numberOfTokens <= maxBlindBunnySocietyPurchase, "Can only mint 20 tokens at a time");
        require(totalSupply().add(numberOfTokens) <= MAX_BlindBunnySociety, "Purchase would exceed max supply of BlindBunnySociety");
        require(msg.value >= BlindBunnySocietyPrice.mul(numberOfTokens), "Ether value sent is not correct");
        for(uint i = 0; i < numberOfTokens; i++) {
            uint mintIndex = totalSupply();
            if (totalSupply() < MAX_BlindBunnySociety) {
                _safeMint(msg.sender, mintIndex);
            }
        }
    }
    
    function mintPresale(uint256 numberOfTokens) external payable {
        require(!saleIsActive && presaleLive, "PRESALE_CLOSED");
        require(presalerList[msg.sender], "Address not in Whitelist");
        require(totalSupply() < maxPreSale, "OUT_OF_STOCK");
        require(totalSupply().add(numberOfTokens) <= maxPreSale, "Purchase would exceed max Presale supply of BlindBunnySociety");
        require(presalerListPurchases[msg.sender] + numberOfTokens <= presalePurchaseLimit, "only 5 you can mint in Presale");
        require(msg.value >= BlindBunnySocietyPrice.mul(numberOfTokens), "Ether value sent is not correct");
        
        for(uint i = 0; i < numberOfTokens; i++) {
            uint mintIndex = totalSupply();
            
            if (totalSupply() < maxPreSale) {
                presalerListPurchases[msg.sender]++;
                _safeMint(msg.sender, mintIndex);
            }
        }
    }

    function reserve(address _to, uint256 _reserveAmount) public onlyOwner {        
        uint supply = totalSupply();
        require(_reserveAmount > 0 && _reserveAmount <= BlindBunnySocietyReserve, "Not enough reserve left for team");
        for (uint i = 0; i < _reserveAmount; i++) {
            _safeMint(_to, supply + i);
        }
        BlindBunnySocietyReserve = BlindBunnySocietyReserve.sub(_reserveAmount);
    }

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

    function tokensOfOwner(address _owner) external view returns(uint256[] memory ) {
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount == 0) {
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 index;
            for (index = 0; index < tokenCount; index++) {
                result[index] = tokenOfOwnerByIndex(_owner, index);
            }
            return result;
        }
    }
    
    function flipSaleState() public onlyOwner {
        saleIsActive = !saleIsActive;
    }
    
    function isPresaler(address addr) external view returns (bool) {
        return presalerList[addr];
    }
    
    function presalePurchasedCount(address addr) external view returns (uint256) {
        return presalerListPurchases[addr];
    }
    
    
    function togglePresaleStatus() external onlyOwner {
        presaleLive = !presaleLive;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BlindBunnySocietyPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BlindBunnySocietyReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BlindBunnySociety","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"_Price","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"entries","type":"address[]"}],"name":"addToPresaleList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":[{"internalType":"address","name":"addr","type":"address"}],"name":"isPresaler","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBlindBunnySocietyPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPreSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintBBS","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintPresale","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":"presaleLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presalePurchaseLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"presalePurchasedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presalerList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presalerListPurchases","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"entries","type":"address[]"}],"name":"removeFromPresaleList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_reserveAmount","type":"uint256"}],"name":"reserve","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":"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":[],"name":"togglePresaleStatus","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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"}]

608060405260fa600b5566c3663566a58000600c556005600d556000600e60006101000a81548160ff021916908315150217905550732e66b9fc4d71b374ce09e2aeee92c8738ba9c115600e60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073b2dd427d8c4ef90744d51667a9c4d4de101b8037600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000eb57600080fd5b506040518060400160405280601381526020017f426c696e642042756e6e7920536f6369657479000000000000000000000000008152506040518060400160405280600381526020017f4242530000000000000000000000000000000000000000000000000000000000815250620001706301ffc9a760e01b6200030860201b60201c565b81600690805190602001906200018892919062000c6a565b508060079080519060200190620001a192919062000c6a565b50620001ba6380ac58cd60e01b6200030860201b60201c565b620001d2635b5e139f60e01b6200030860201b60201c565b620001ea63780e9d6360e01b6200030860201b60201c565b50506000620001fe620003e060201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35060005b600b811015620002df576000620002bc620003e860201b60201c565b9050620002d033826200040660201b60201c565b508080600101915050620002a0565b50620002fc600b80546200042c60201b620026621790919060201c565b600b819055506200130a565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141562000374576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200036b906200111c565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b60006200040160026200047f60201b620026b21760201c565b905090565b620004288282604051806020016040528060008152506200049c60201b60201c565b5050565b60008282111562000474576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200046b9062001160565b60405180910390fd5b818303905092915050565b600062000495826000016200050a60201b60201c565b9050919050565b620004ae83836200051b60201b60201c565b620004c36000848484620006cd60201b60201c565b62000505576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004fc90620010fa565b60405180910390fd5b505050565b600081600001805490509050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200058e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200058590620011a4565b60405180910390fd5b6200059f816200085460201b60201c565b15620005e2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005d9906200113e565b60405180910390fd5b620005f6600083836200087860201b60201c565b6200064e81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206200087d60201b620026c71790919060201c565b506200066c818360026200089f60201b620026e1179092919060201c565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000620006fb8473ffffffffffffffffffffffffffffffffffffffff16620008dc60201b620027161760201c565b6200070a57600190506200084c565b6000620007e363150b7a0260e01b62000728620003e060201b60201c565b88878760405160240162000740949392919062001082565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405180606001604052806032815260200162006515603291398773ffffffffffffffffffffffffffffffffffffffff16620008ef60201b62002729179092919060201c565b9050600081806020019051810190620007fd919062000d37565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b6000620008718260026200090f60201b620027411790919060201c565b9050919050565b505050565b600062000897836000018360001b6200093160201b60201c565b905092915050565b6000620008d3846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b620009ab60201b60201c565b90509392505050565b600080823b905060008111915050919050565b606062000906848460008562000a8a60201b60201c565b90509392505050565b600062000929836000018360001b62000bb860201b60201c565b905092915050565b600062000945838362000bdb60201b60201c565b620009a0578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050620009a5565b600090505b92915050565b600080846001016000858152602001908152602001600020549050600081141562000a545784600001604051806040016040528086815260200185815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000155602082015181600101555050846000018054905085600101600086815260200190815260200160002081905550600191505062000a83565b8285600001600183038154811062000a6857fe5b90600052602060002090600202016001018190555060009150505b9392505050565b60608247101562000ad2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000ac99062001182565b60405180910390fd5b62000ae385620008dc60201b60201c565b62000b25576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000b1c90620011c6565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405162000b50919062001069565b60006040518083038185875af1925050503d806000811462000b8f576040519150601f19603f3d011682016040523d82523d6000602084013e62000b94565b606091505b509150915062000bac82828662000bfe60201b60201c565b92505050949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b6060831562000c105782905062000c63565b60008351111562000c245782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000c5a9190620010d6565b60405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928262000ca2576000855562000cee565b82601f1062000cbd57805160ff191683800117855562000cee565b8280016001018555821562000cee579182015b8281111562000ced57825182559160200191906001019062000cd0565b5b50905062000cfd919062000d01565b5090565b5b8082111562000d1c57600081600090555060010162000d02565b5090565b60008151905062000d3181620012f0565b92915050565b60006020828403121562000d4a57600080fd5b600062000d5a8482850162000d20565b91505092915050565b62000d6e816200123f565b82525050565b62000d7f816200122b565b82525050565b600062000d9282620011e8565b62000d9e8185620011fe565b935062000db0818560208601620012a9565b62000dbb81620012df565b840191505092915050565b600062000dd382620011e8565b62000ddf81856200120f565b935062000df1818560208601620012a9565b80840191505092915050565b600062000e0a82620011f3565b62000e1681856200121a565b935062000e28818560208601620012a9565b62000e3381620012df565b840191505092915050565b600062000e4d6032836200121a565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600062000eb5601c836200121a565b91507f4552433136353a20696e76616c696420696e74657266616365206964000000006000830152602082019050919050565b600062000ef7601c836200121a565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b600062000f39601e836200121a565b91507f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006000830152602082019050919050565b600062000f7b6026836200121a565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b600062000fe36020836200121a565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600062001025601d836200121a565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b62001063816200129f565b82525050565b600062001077828462000dc6565b915081905092915050565b600060808201905062001099600083018762000d63565b620010a8602083018662000d74565b620010b7604083018562001058565b8181036060830152620010cb818462000d85565b905095945050505050565b60006020820190508181036000830152620010f2818462000dfd565b905092915050565b60006020820190508181036000830152620011158162000e3e565b9050919050565b60006020820190508181036000830152620011378162000ea6565b9050919050565b60006020820190508181036000830152620011598162000ee8565b9050919050565b600060208201905081810360008301526200117b8162000f2a565b9050919050565b600060208201905081810360008301526200119d8162000f6c565b9050919050565b60006020820190508181036000830152620011bf8162000fd4565b9050919050565b60006020820190508181036000830152620011e18162001016565b9050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600062001238826200127f565b9050919050565b60006200124c826200127f565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b83811015620012c9578082015181840152602081019050620012ac565b83811115620012d9576000848401525b50505050565b6000601f19601f8301169050919050565b620012fb8162001253565b81146200130757600080fd5b50565b6151fb806200131a6000396000f3fe60806040526004361061025c5760003560e01c806383a9e04911610144578063b88d4fde116100b6578063e985e9c51161007a578063e985e9c5146108fd578063eb8d24441461093a578063f2fde38b14610965578063f47430701461098e578063f759867a146109b9578063fad3f8f7146109d55761025c565b8063b88d4fde1461081a578063c5bdec3414610843578063c87b56dd1461086c578063cc47a40b146108a9578063e7de4222146108d25761025c565b80639bf80316116101085780639bf80316146106f55780639cf2e8d6146107325780639e273b2f1461076f578063a22cb465146107ac578063a7802e50146107d5578063b179e060146107f15761025c565b806383a9e0491461060c5780638462151c14610637578063862e0287146106745780638da5cb5b1461069f57806395d89b41146106ca5761025c565b806342842e0e116101dd5780636352211e116101a15780636352211e146105105780636c0360eb1461054d57806370a0823114610578578063715018a6146105b55780637204a3c9146105cc5780637bffb4ce146105f55761025c565b806342842e0e146104195780634acda54b146104425780634f6ccce71461046d57806355f804b3146104aa5780635ce7af1f146104d35761025c565b806318160ddd1161022457806318160ddd1461035a57806323b872dd146103855780632f745c59146103ae57806334918dfd146103eb5780633ccfd60b146104025761025c565b806301ffc9a71461026157806306fdde031461029e578063081812fc146102c9578063095ea7b3146103065780630af86d951461032f575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613bbc565b610a00565b6040516102959190614a63565b60405180910390f35b3480156102aa57600080fd5b506102b3610a67565b6040516102c09190614a7e565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb9190613c4f565b610b09565b6040516102fd91906149da565b60405180910390f35b34801561031257600080fd5b5061032d60048036038101906103289190613b3b565b610b8e565b005b34801561033b57600080fd5b50610344610ca6565b6040516103519190614f00565b60405180910390f35b34801561036657600080fd5b5061036f610cac565b60405161037c9190614f00565b60405180910390f35b34801561039157600080fd5b506103ac60048036038101906103a79190613a35565b610cbd565b005b3480156103ba57600080fd5b506103d560048036038101906103d09190613b3b565b610d1d565b6040516103e29190614f00565b60405180910390f35b3480156103f757600080fd5b50610400610d78565b005b34801561040e57600080fd5b50610417610e20565b005b34801561042557600080fd5b50610440600480360381019061043b9190613a35565b610fa9565b005b34801561044e57600080fd5b50610457610fc9565b6040516104649190614f00565b60405180910390f35b34801561047957600080fd5b50610494600480360381019061048f9190613c4f565b610fcf565b6040516104a19190614f00565b60405180910390f35b3480156104b657600080fd5b506104d160048036038101906104cc9190613c0e565b610ff2565b005b3480156104df57600080fd5b506104fa60048036038101906104f591906139d0565b61107a565b6040516105079190614f00565b60405180910390f35b34801561051c57600080fd5b5061053760048036038101906105329190613c4f565b6110c3565b60405161054491906149da565b60405180910390f35b34801561055957600080fd5b506105626110fa565b60405161056f9190614a7e565b60405180910390f35b34801561058457600080fd5b5061059f600480360381019061059a91906139d0565b61119c565b6040516105ac9190614f00565b60405180910390f35b3480156105c157600080fd5b506105ca61125b565b005b3480156105d857600080fd5b506105f360048036038101906105ee9190613b77565b611398565b005b34801561060157600080fd5b5061060a6115af565b005b34801561061857600080fd5b50610621611657565b60405161062e9190614a63565b60405180910390f35b34801561064357600080fd5b5061065e600480360381019061065991906139d0565b61166a565b60405161066b9190614a41565b60405180910390f35b34801561068057600080fd5b50610689611763565b6040516106969190614f00565b60405180910390f35b3480156106ab57600080fd5b506106b4611768565b6040516106c191906149da565b60405180910390f35b3480156106d657600080fd5b506106df611792565b6040516106ec9190614a7e565b60405180910390f35b34801561070157600080fd5b5061071c600480360381019061071791906139d0565b611834565b6040516107299190614f00565b60405180910390f35b34801561073e57600080fd5b50610759600480360381019061075491906139d0565b61184c565b6040516107669190614a63565b60405180910390f35b34801561077b57600080fd5b50610796600480360381019061079191906139d0565b61186c565b6040516107a39190614a63565b60405180910390f35b3480156107b857600080fd5b506107d360048036038101906107ce9190613aff565b6118c2565b005b6107ef60048036038101906107ea9190613c4f565b611a43565b005b3480156107fd57600080fd5b5061081860048036038101906108139190613b77565b611bdc565b005b34801561082657600080fd5b50610841600480360381019061083c9190613a84565b611d66565b005b34801561084f57600080fd5b5061086a60048036038101906108659190613c4f565b611dc8565b005b34801561087857600080fd5b50610893600480360381019061088e9190613c4f565b611e4e565b6040516108a09190614a7e565b60405180910390f35b3480156108b557600080fd5b506108d060048036038101906108cb9190613b3b565b611fd1565b005b3480156108de57600080fd5b506108e76120ef565b6040516108f49190614f00565b60405180910390f35b34801561090957600080fd5b50610924600480360381019061091f91906139f9565b6120f5565b6040516109319190614a63565b60405180910390f35b34801561094657600080fd5b5061094f612189565b60405161095c9190614a63565b60405180910390f35b34801561097157600080fd5b5061098c600480360381019061098791906139d0565b61219c565b005b34801561099a57600080fd5b506109a3612348565b6040516109b09190614f00565b60405180910390f35b6109d360048036038101906109ce9190613c4f565b61234e565b005b3480156109e157600080fd5b506109ea61265c565b6040516109f79190614f00565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610aff5780601f10610ad457610100808354040283529160200191610aff565b820191906000526020600020905b815481529060010190602001808311610ae257829003601f168201915b5050505050905090565b6000610b148261275b565b610b53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4a90614e00565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b99826110c3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0190614e80565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c29612778565b73ffffffffffffffffffffffffffffffffffffffff161480610c585750610c5781610c52612778565b6120f5565b5b610c97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8e90614d40565b60405180910390fd5b610ca18383612780565b505050565b600b5481565b6000610cb860026126b2565b905090565b610cce610cc8612778565b82612839565b610d0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0490614ec0565b60405180910390fd5b610d18838383612917565b505050565b6000610d7082600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612b2e90919063ffffffff16565b905092915050565b610d80612778565b73ffffffffffffffffffffffffffffffffffffffff16610d9e611768565b73ffffffffffffffffffffffffffffffffffffffff1614610df4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610deb90614e20565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b610e28612778565b73ffffffffffffffffffffffffffffffffffffffff16610e46611768565b73ffffffffffffffffffffffffffffffffffffffff1614610e9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9390614e20565b60405180910390fd5b6000610eb2606447612b4890919063ffffffff16565b90506000610eca600f83612b9e90919063ffffffff16565b90506000610ee2605584612b9e90919063ffffffff16565b9050600e60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050610f4457600080fd5b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050610fa457600080fd5b505050565b610fc483838360405180602001604052806000815250611d66565b505050565b600c5481565b600080610fe6836002612c0e90919063ffffffff16565b50905080915050919050565b610ffa612778565b73ffffffffffffffffffffffffffffffffffffffff16611018611768565b73ffffffffffffffffffffffffffffffffffffffff161461106e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106590614e20565b60405180910390fd5b61107781612c3a565b50565b6000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006110f38260405180606001604052806029815260200161519d602991396002612c549092919063ffffffff16565b9050919050565b606060098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156111925780601f1061116757610100808354040283529160200191611192565b820191906000526020600020905b81548152906001019060200180831161117557829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561120d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120490614d60565b60405180910390fd5b611254600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c73565b9050919050565b611263612778565b73ffffffffffffffffffffffffffffffffffffffff16611281611768565b73ffffffffffffffffffffffffffffffffffffffff16146112d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ce90614e20565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6113a0612778565b73ffffffffffffffffffffffffffffffffffffffff166113be611768565b73ffffffffffffffffffffffffffffffffffffffff1614611414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140b90614e20565b60405180910390fd5b60005b828290508110156115aa57600083838381811061143057fe5b905060200201602081019061144591906139d0565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ae90614ae0565b60405180910390fd5b601060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611544576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153b90614ce0565b60405180910390fd5b6001601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550508080600101915050611417565b505050565b6115b7612778565b73ffffffffffffffffffffffffffffffffffffffff166115d5611768565b73ffffffffffffffffffffffffffffffffffffffff161461162b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162290614e20565b60405180910390fd5b600e60019054906101000a900460ff1615600e60016101000a81548160ff021916908315150217905550565b600e60019054906101000a900460ff1681565b606060006116778361119c565b905060008114156116d257600067ffffffffffffffff8111801561169a57600080fd5b506040519080825280602002602001820160405280156116c95781602001602082028036833780820191505090505b5091505061175e565b60008167ffffffffffffffff811180156116eb57600080fd5b5060405190808252806020026020018201604052801561171a5781602001602082028036833780820191505090505b50905060005b82811015611757576117328582610d1d565b82828151811061173e57fe5b6020026020010181815250508080600101915050611720565b8193505050505b919050565b601481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060078054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561182a5780601f106117ff5761010080835404028352916020019161182a565b820191906000526020600020905b81548152906001019060200180831161180d57829003601f168201915b5050505050905090565b60116020528060005260406000206000915090505481565b60106020528060005260406000206000915054906101000a900460ff1681565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6118ca612778565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611938576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192f90614c00565b60405180910390fd5b8060056000611945612778565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166119f2612778565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a379190614a63565b60405180910390a35050565b600e60009054906101000a900460ff16611a92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8990614c60565b60405180910390fd5b600081118015611aa3575060148111155b611ae2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad990614d20565b60405180910390fd5b612b67611aff82611af1610cac565b612c8890919063ffffffff16565b1115611b40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3790614ea0565b60405180910390fd5b611b5581600c54612b9e90919063ffffffff16565b341015611b97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8e90614c40565b60405180910390fd5b60005b81811015611bd8576000611bac610cac565b9050612b67611bb9610cac565b1015611bca57611bc93382612cdd565b5b508080600101915050611b9a565b5050565b611be4612778565b73ffffffffffffffffffffffffffffffffffffffff16611c02611768565b73ffffffffffffffffffffffffffffffffffffffff1614611c58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4f90614e20565b60405180910390fd5b60005b82829050811015611d61576000838383818110611c7457fe5b9050602002016020810190611c8991906139d0565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611cfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf290614ae0565b60405180910390fd5b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550508080600101915050611c5b565b505050565b611d77611d71612778565b83612839565b611db6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dad90614ec0565b60405180910390fd5b611dc284848484612cfb565b50505050565b611dd0612778565b73ffffffffffffffffffffffffffffffffffffffff16611dee611768565b73ffffffffffffffffffffffffffffffffffffffff1614611e44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3b90614e20565b60405180910390fd5b80600c8190555050565b6060611e598261275b565b611e98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8f90614e60565b60405180910390fd5b6000600860008481526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611f415780601f10611f1657610100808354040283529160200191611f41565b820191906000526020600020905b815481529060010190602001808311611f2457829003601f168201915b505050505090506000611f526110fa565b9050600081511415611f68578192505050611fcc565b600082511115611f9d578082604051602001611f859291906149b6565b60405160208183030381529060405292505050611fcc565b80611fa785612d57565b604051602001611fb89291906149b6565b604051602081830303815290604052925050505b919050565b611fd9612778565b73ffffffffffffffffffffffffffffffffffffffff16611ff7611768565b73ffffffffffffffffffffffffffffffffffffffff161461204d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204490614e20565b60405180910390fd5b6000612057610cac565b905060008211801561206b5750600b548211155b6120aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a190614bc0565b60405180910390fd5b60005b828110156120ce576120c184828401612cdd565b80806001019150506120ad565b506120e482600b5461266290919063ffffffff16565b600b81905550505050565b612b6781565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e60009054906101000a900460ff1681565b6121a4612778565b73ffffffffffffffffffffffffffffffffffffffff166121c2611768565b73ffffffffffffffffffffffffffffffffffffffff1614612218576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220f90614e20565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612288576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227f90614b40565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600d5481565b600e60009054906101000a900460ff161580156123775750600e60019054906101000a900460ff165b6123b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ad90614ac0565b60405180910390fd5b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612442576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243990614ba0565b60405180910390fd5b61100f61244d610cac565b1061248d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248490614c20565b60405180910390fd5b61100f6124aa8261249c610cac565b612c8890919063ffffffff16565b11156124eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e290614b00565b60405180910390fd5b600d5481601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054011115612571576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256890614d80565b60405180910390fd5b61258681600c54612b9e90919063ffffffff16565b3410156125c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125bf90614c40565b60405180910390fd5b60005b818110156126585760006125dd610cac565b905061100f6125ea610cac565b101561264a57601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919060010191905055506126493382612cdd565b5b5080806001019150506125cb565b5050565b61100f81565b6000828211156126a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269e90614c80565b60405180910390fd5b818303905092915050565b60006126c082600001612e9e565b9050919050565b60006126d9836000018360001b612eaf565b905092915050565b600061270d846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b612f1f565b90509392505050565b600080823b905060008111915050919050565b60606127388484600085612ffb565b90509392505050565b6000612753836000018360001b61310f565b905092915050565b600061277182600261274190919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166127f3836110c3565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006128448261275b565b612883576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287a90614cc0565b60405180910390fd5b600061288e836110c3565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806128fd57508373ffffffffffffffffffffffffffffffffffffffff166128e584610b09565b73ffffffffffffffffffffffffffffffffffffffff16145b8061290e575061290d81856120f5565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612937826110c3565b73ffffffffffffffffffffffffffffffffffffffff161461298d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298490614e40565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f490614be0565b60405180910390fd5b612a08838383613132565b612a13600082612780565b612a6481600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061313790919063ffffffff16565b50612ab681600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206126c790919063ffffffff16565b50612acd818360026126e19092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000612b3d8360000183613151565b60001c905092915050565b6000808211612b8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8390614d00565b60405180910390fd5b818381612b9557fe5b04905092915050565b600080831415612bb15760009050612c08565b6000828402905082848281612bc257fe5b0414612c03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bfa90614de0565b60405180910390fd5b809150505b92915050565b600080600080612c2186600001866131be565b915091508160001c8160001c9350935050509250929050565b8060099080519060200190612c509291906137a2565b5050565b6000612c67846000018460001b84613241565b60001c90509392505050565b6000612c81826000016132d2565b9050919050565b600080828401905083811015612cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cca90614b80565b60405180910390fd5b8091505092915050565b612cf78282604051806020016040528060008152506132e3565b5050565b612d06848484612917565b612d128484848461333e565b612d51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4890614b20565b60405180910390fd5b50505050565b60606000821415612d9f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e99565b600082905060005b60008214612dc9578080600101915050600a8281612dc157fe5b049150612da7565b60008167ffffffffffffffff81118015612de257600080fd5b506040519080825280601f01601f191660200182016040528015612e155781602001600182028036833780820191505090505b50905060006001830390508593505b60008414612e9157600a8481612e3657fe5b0660300160f81b82828060019003935081518110612e5057fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8481612e8957fe5b049350612e24565b819450505050505b919050565b600081600001805490509050919050565b6000612ebb83836134a2565b612f14578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612f19565b600090505b92915050565b6000808460010160008581526020019081526020016000205490506000811415612fc657846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050612ff4565b82856000016001830381548110612fd957fe5b90600052602060002090600202016001018190555060009150505b9392505050565b606082471015613040576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303790614ca0565b60405180910390fd5b61304985612716565b613088576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161307f90614ee0565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516130b1919061499f565b60006040518083038185875af1925050503d80600081146130ee576040519150601f19603f3d011682016040523d82523d6000602084013e6130f3565b606091505b50915091506131038282866134c5565b92505050949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b505050565b6000613149836000018360001b61352c565b905092915050565b60008183600001805490501161319c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319390614aa0565b60405180910390fd5b8260000182815481106131ab57fe5b9060005260206000200154905092915050565b6000808284600001805490501161320a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161320190614da0565b60405180910390fd5b600084600001848154811061321b57fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b600080846001016000858152602001908152602001600020549050600081141583906132a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161329a9190614a7e565b60405180910390fd5b508460000160018203815481106132b657fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b6132ed8383613614565b6132fa600084848461333e565b613339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161333090614b20565b60405180910390fd5b505050565b600061335f8473ffffffffffffffffffffffffffffffffffffffff16612716565b61336c576001905061349a565b600061343363150b7a0260e01b613381612778565b88878760405160240161339794939291906149f5565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405180606001604052806032815260200161516b603291398773ffffffffffffffffffffffffffffffffffffffff166127299092919063ffffffff16565b905060008180602001905181019061344b9190613be5565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b606083156134d557829050613525565b6000835111156134e85782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161351c9190614a7e565b60405180910390fd5b9392505050565b60008083600101600084815260200190815260200160002054905060008114613608576000600182039050600060018660000180549050039050600086600001828154811061357757fe5b906000526020600020015490508087600001848154811061359457fe5b90600052602060002001819055506001830187600101600083815260200190815260200160002081905550866000018054806135cc57fe5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061360e565b60009150505b92915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613684576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161367b90614dc0565b60405180910390fd5b61368d8161275b565b156136cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136c490614b60565b60405180910390fd5b6136d960008383613132565b61372a81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206126c790919063ffffffff16565b50613741818360026126e19092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826137d8576000855561381f565b82601f106137f157805160ff191683800117855561381f565b8280016001018555821561381f579182015b8281111561381e578251825591602001919060010190613803565b5b50905061382c9190613830565b5090565b5b80821115613849576000816000905550600101613831565b5090565b600061386061385b84614f4c565b614f1b565b90508281526020810184848401111561387857600080fd5b6138838482856150b9565b509392505050565b600061389e61389984614f7c565b614f1b565b9050828152602081018484840111156138b657600080fd5b6138c18482856150b9565b509392505050565b6000813590506138d88161510e565b92915050565b60008083601f8401126138f057600080fd5b8235905067ffffffffffffffff81111561390957600080fd5b60208301915083602082028301111561392157600080fd5b9250929050565b60008135905061393781615125565b92915050565b60008135905061394c8161513c565b92915050565b6000815190506139618161513c565b92915050565b600082601f83011261397857600080fd5b813561398884826020860161384d565b91505092915050565b600082601f8301126139a257600080fd5b81356139b284826020860161388b565b91505092915050565b6000813590506139ca81615153565b92915050565b6000602082840312156139e257600080fd5b60006139f0848285016138c9565b91505092915050565b60008060408385031215613a0c57600080fd5b6000613a1a858286016138c9565b9250506020613a2b858286016138c9565b9150509250929050565b600080600060608486031215613a4a57600080fd5b6000613a58868287016138c9565b9350506020613a69868287016138c9565b9250506040613a7a868287016139bb565b9150509250925092565b60008060008060808587031215613a9a57600080fd5b6000613aa8878288016138c9565b9450506020613ab9878288016138c9565b9350506040613aca878288016139bb565b925050606085013567ffffffffffffffff811115613ae757600080fd5b613af387828801613967565b91505092959194509250565b60008060408385031215613b1257600080fd5b6000613b20858286016138c9565b9250506020613b3185828601613928565b9150509250929050565b60008060408385031215613b4e57600080fd5b6000613b5c858286016138c9565b9250506020613b6d858286016139bb565b9150509250929050565b60008060208385031215613b8a57600080fd5b600083013567ffffffffffffffff811115613ba457600080fd5b613bb0858286016138de565b92509250509250929050565b600060208284031215613bce57600080fd5b6000613bdc8482850161393d565b91505092915050565b600060208284031215613bf757600080fd5b6000613c0584828501613952565b91505092915050565b600060208284031215613c2057600080fd5b600082013567ffffffffffffffff811115613c3a57600080fd5b613c4684828501613991565b91505092915050565b600060208284031215613c6157600080fd5b6000613c6f848285016139bb565b91505092915050565b6000613c848383614981565b60208301905092915050565b613c9981615045565b82525050565b613ca881615033565b82525050565b6000613cb982614fbc565b613cc38185614fea565b9350613cce83614fac565b8060005b83811015613cff578151613ce68882613c78565b9750613cf183614fdd565b925050600181019050613cd2565b5085935050505092915050565b613d1581615057565b82525050565b6000613d2682614fc7565b613d308185614ffb565b9350613d408185602086016150c8565b613d49816150fd565b840191505092915050565b6000613d5f82614fc7565b613d69818561500c565b9350613d798185602086016150c8565b80840191505092915050565b6000613d9082614fd2565b613d9a8185615017565b9350613daa8185602086016150c8565b613db3816150fd565b840191505092915050565b6000613dc982614fd2565b613dd38185615028565b9350613de38185602086016150c8565b80840191505092915050565b6000613dfc602283615017565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e62600e83615017565b91507f50524553414c455f434c4f5345440000000000000000000000000000000000006000830152602082019050919050565b6000613ea2600c83615017565b91507f4e554c4c5f4144445245535300000000000000000000000000000000000000006000830152602082019050919050565b6000613ee2603d83615017565b91507f507572636861736520776f756c6420657863656564206d61782050726573616c60008301527f6520737570706c79206f6620426c696e6442756e6e79536f63696574790000006020830152604082019050919050565b6000613f48603283615017565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613fae602683615017565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614014601c83615017565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000614054601b83615017565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000614094601883615017565b91507f41646472657373206e6f7420696e2057686974656c69737400000000000000006000830152602082019050919050565b60006140d4602083615017565b91507f4e6f7420656e6f7567682072657365727665206c65667420666f72207465616d6000830152602082019050919050565b6000614114602483615017565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061417a601983615017565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006141ba600c83615017565b91507f4f55545f4f465f53544f434b00000000000000000000000000000000000000006000830152602082019050919050565b60006141fa601f83615017565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b600061423a602d83615017565b91507f53616c65206d7573742062652061637469766520746f206d696e7420426c696e60008301527f6442756e6e79536f6369657479000000000000000000000000000000000000006020830152604082019050919050565b60006142a0601e83615017565b91507f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006000830152602082019050919050565b60006142e0602683615017565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614346602c83615017565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006143ac600f83615017565b91507f4455504c49434154455f454e54525900000000000000000000000000000000006000830152602082019050919050565b60006143ec601a83615017565b91507f536166654d6174683a206469766973696f6e206279207a65726f0000000000006000830152602082019050919050565b600061442c602183615017565b91507f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d60008301527f65000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614492603883615017565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006144f8602a83615017565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600061455e601e83615017565b91507f6f6e6c79203520796f752063616e206d696e7420696e2050726573616c6500006000830152602082019050919050565b600061459e602283615017565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614604602083615017565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614644602183615017565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146aa602c83615017565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614710602083615017565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614750602983615017565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006147b6602f83615017565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b600061481c602183615017565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614882603583615017565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f6620426c696e6442756e6e79536f636965747900000000000000000000006020830152604082019050919050565b60006148e8603183615017565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b600061494e601d83615017565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b61498a816150af565b82525050565b614999816150af565b82525050565b60006149ab8284613d54565b915081905092915050565b60006149c28285613dbe565b91506149ce8284613dbe565b91508190509392505050565b60006020820190506149ef6000830184613c9f565b92915050565b6000608082019050614a0a6000830187613c90565b614a176020830186613c9f565b614a246040830185614990565b8181036060830152614a368184613d1b565b905095945050505050565b60006020820190508181036000830152614a5b8184613cae565b905092915050565b6000602082019050614a786000830184613d0c565b92915050565b60006020820190508181036000830152614a988184613d85565b905092915050565b60006020820190508181036000830152614ab981613def565b9050919050565b60006020820190508181036000830152614ad981613e55565b9050919050565b60006020820190508181036000830152614af981613e95565b9050919050565b60006020820190508181036000830152614b1981613ed5565b9050919050565b60006020820190508181036000830152614b3981613f3b565b9050919050565b60006020820190508181036000830152614b5981613fa1565b9050919050565b60006020820190508181036000830152614b7981614007565b9050919050565b60006020820190508181036000830152614b9981614047565b9050919050565b60006020820190508181036000830152614bb981614087565b9050919050565b60006020820190508181036000830152614bd9816140c7565b9050919050565b60006020820190508181036000830152614bf981614107565b9050919050565b60006020820190508181036000830152614c198161416d565b9050919050565b60006020820190508181036000830152614c39816141ad565b9050919050565b60006020820190508181036000830152614c59816141ed565b9050919050565b60006020820190508181036000830152614c798161422d565b9050919050565b60006020820190508181036000830152614c9981614293565b9050919050565b60006020820190508181036000830152614cb9816142d3565b9050919050565b60006020820190508181036000830152614cd981614339565b9050919050565b60006020820190508181036000830152614cf98161439f565b9050919050565b60006020820190508181036000830152614d19816143df565b9050919050565b60006020820190508181036000830152614d398161441f565b9050919050565b60006020820190508181036000830152614d5981614485565b9050919050565b60006020820190508181036000830152614d79816144eb565b9050919050565b60006020820190508181036000830152614d9981614551565b9050919050565b60006020820190508181036000830152614db981614591565b9050919050565b60006020820190508181036000830152614dd9816145f7565b9050919050565b60006020820190508181036000830152614df981614637565b9050919050565b60006020820190508181036000830152614e198161469d565b9050919050565b60006020820190508181036000830152614e3981614703565b9050919050565b60006020820190508181036000830152614e5981614743565b9050919050565b60006020820190508181036000830152614e79816147a9565b9050919050565b60006020820190508181036000830152614e998161480f565b9050919050565b60006020820190508181036000830152614eb981614875565b9050919050565b60006020820190508181036000830152614ed9816148db565b9050919050565b60006020820190508181036000830152614ef981614941565b9050919050565b6000602082019050614f156000830184614990565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614f4257614f416150fb565b5b8060405250919050565b600067ffffffffffffffff821115614f6757614f666150fb565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614f9757614f966150fb565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061503e8261508f565b9050919050565b60006150508261508f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156150e65780820151818401526020810190506150cb565b838111156150f5576000848401525b50505050565bfe5b6000601f19601f8301169050919050565b61511781615033565b811461512257600080fd5b50565b61512e81615057565b811461513957600080fd5b50565b61514581615063565b811461515057600080fd5b50565b61515c816150af565b811461516757600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220a2f1092fcbbef04aa12d1c954687197a6c78df8858e323b027cc8d9e82042e9264736f6c634300070600334552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e746572

Deployed Bytecode

0x60806040526004361061025c5760003560e01c806383a9e04911610144578063b88d4fde116100b6578063e985e9c51161007a578063e985e9c5146108fd578063eb8d24441461093a578063f2fde38b14610965578063f47430701461098e578063f759867a146109b9578063fad3f8f7146109d55761025c565b8063b88d4fde1461081a578063c5bdec3414610843578063c87b56dd1461086c578063cc47a40b146108a9578063e7de4222146108d25761025c565b80639bf80316116101085780639bf80316146106f55780639cf2e8d6146107325780639e273b2f1461076f578063a22cb465146107ac578063a7802e50146107d5578063b179e060146107f15761025c565b806383a9e0491461060c5780638462151c14610637578063862e0287146106745780638da5cb5b1461069f57806395d89b41146106ca5761025c565b806342842e0e116101dd5780636352211e116101a15780636352211e146105105780636c0360eb1461054d57806370a0823114610578578063715018a6146105b55780637204a3c9146105cc5780637bffb4ce146105f55761025c565b806342842e0e146104195780634acda54b146104425780634f6ccce71461046d57806355f804b3146104aa5780635ce7af1f146104d35761025c565b806318160ddd1161022457806318160ddd1461035a57806323b872dd146103855780632f745c59146103ae57806334918dfd146103eb5780633ccfd60b146104025761025c565b806301ffc9a71461026157806306fdde031461029e578063081812fc146102c9578063095ea7b3146103065780630af86d951461032f575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613bbc565b610a00565b6040516102959190614a63565b60405180910390f35b3480156102aa57600080fd5b506102b3610a67565b6040516102c09190614a7e565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb9190613c4f565b610b09565b6040516102fd91906149da565b60405180910390f35b34801561031257600080fd5b5061032d60048036038101906103289190613b3b565b610b8e565b005b34801561033b57600080fd5b50610344610ca6565b6040516103519190614f00565b60405180910390f35b34801561036657600080fd5b5061036f610cac565b60405161037c9190614f00565b60405180910390f35b34801561039157600080fd5b506103ac60048036038101906103a79190613a35565b610cbd565b005b3480156103ba57600080fd5b506103d560048036038101906103d09190613b3b565b610d1d565b6040516103e29190614f00565b60405180910390f35b3480156103f757600080fd5b50610400610d78565b005b34801561040e57600080fd5b50610417610e20565b005b34801561042557600080fd5b50610440600480360381019061043b9190613a35565b610fa9565b005b34801561044e57600080fd5b50610457610fc9565b6040516104649190614f00565b60405180910390f35b34801561047957600080fd5b50610494600480360381019061048f9190613c4f565b610fcf565b6040516104a19190614f00565b60405180910390f35b3480156104b657600080fd5b506104d160048036038101906104cc9190613c0e565b610ff2565b005b3480156104df57600080fd5b506104fa60048036038101906104f591906139d0565b61107a565b6040516105079190614f00565b60405180910390f35b34801561051c57600080fd5b5061053760048036038101906105329190613c4f565b6110c3565b60405161054491906149da565b60405180910390f35b34801561055957600080fd5b506105626110fa565b60405161056f9190614a7e565b60405180910390f35b34801561058457600080fd5b5061059f600480360381019061059a91906139d0565b61119c565b6040516105ac9190614f00565b60405180910390f35b3480156105c157600080fd5b506105ca61125b565b005b3480156105d857600080fd5b506105f360048036038101906105ee9190613b77565b611398565b005b34801561060157600080fd5b5061060a6115af565b005b34801561061857600080fd5b50610621611657565b60405161062e9190614a63565b60405180910390f35b34801561064357600080fd5b5061065e600480360381019061065991906139d0565b61166a565b60405161066b9190614a41565b60405180910390f35b34801561068057600080fd5b50610689611763565b6040516106969190614f00565b60405180910390f35b3480156106ab57600080fd5b506106b4611768565b6040516106c191906149da565b60405180910390f35b3480156106d657600080fd5b506106df611792565b6040516106ec9190614a7e565b60405180910390f35b34801561070157600080fd5b5061071c600480360381019061071791906139d0565b611834565b6040516107299190614f00565b60405180910390f35b34801561073e57600080fd5b50610759600480360381019061075491906139d0565b61184c565b6040516107669190614a63565b60405180910390f35b34801561077b57600080fd5b50610796600480360381019061079191906139d0565b61186c565b6040516107a39190614a63565b60405180910390f35b3480156107b857600080fd5b506107d360048036038101906107ce9190613aff565b6118c2565b005b6107ef60048036038101906107ea9190613c4f565b611a43565b005b3480156107fd57600080fd5b5061081860048036038101906108139190613b77565b611bdc565b005b34801561082657600080fd5b50610841600480360381019061083c9190613a84565b611d66565b005b34801561084f57600080fd5b5061086a60048036038101906108659190613c4f565b611dc8565b005b34801561087857600080fd5b50610893600480360381019061088e9190613c4f565b611e4e565b6040516108a09190614a7e565b60405180910390f35b3480156108b557600080fd5b506108d060048036038101906108cb9190613b3b565b611fd1565b005b3480156108de57600080fd5b506108e76120ef565b6040516108f49190614f00565b60405180910390f35b34801561090957600080fd5b50610924600480360381019061091f91906139f9565b6120f5565b6040516109319190614a63565b60405180910390f35b34801561094657600080fd5b5061094f612189565b60405161095c9190614a63565b60405180910390f35b34801561097157600080fd5b5061098c600480360381019061098791906139d0565b61219c565b005b34801561099a57600080fd5b506109a3612348565b6040516109b09190614f00565b60405180910390f35b6109d360048036038101906109ce9190613c4f565b61234e565b005b3480156109e157600080fd5b506109ea61265c565b6040516109f79190614f00565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610aff5780601f10610ad457610100808354040283529160200191610aff565b820191906000526020600020905b815481529060010190602001808311610ae257829003601f168201915b5050505050905090565b6000610b148261275b565b610b53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4a90614e00565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b99826110c3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0190614e80565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c29612778565b73ffffffffffffffffffffffffffffffffffffffff161480610c585750610c5781610c52612778565b6120f5565b5b610c97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8e90614d40565b60405180910390fd5b610ca18383612780565b505050565b600b5481565b6000610cb860026126b2565b905090565b610cce610cc8612778565b82612839565b610d0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0490614ec0565b60405180910390fd5b610d18838383612917565b505050565b6000610d7082600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612b2e90919063ffffffff16565b905092915050565b610d80612778565b73ffffffffffffffffffffffffffffffffffffffff16610d9e611768565b73ffffffffffffffffffffffffffffffffffffffff1614610df4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610deb90614e20565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b610e28612778565b73ffffffffffffffffffffffffffffffffffffffff16610e46611768565b73ffffffffffffffffffffffffffffffffffffffff1614610e9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9390614e20565b60405180910390fd5b6000610eb2606447612b4890919063ffffffff16565b90506000610eca600f83612b9e90919063ffffffff16565b90506000610ee2605584612b9e90919063ffffffff16565b9050600e60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050610f4457600080fd5b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050610fa457600080fd5b505050565b610fc483838360405180602001604052806000815250611d66565b505050565b600c5481565b600080610fe6836002612c0e90919063ffffffff16565b50905080915050919050565b610ffa612778565b73ffffffffffffffffffffffffffffffffffffffff16611018611768565b73ffffffffffffffffffffffffffffffffffffffff161461106e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106590614e20565b60405180910390fd5b61107781612c3a565b50565b6000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006110f38260405180606001604052806029815260200161519d602991396002612c549092919063ffffffff16565b9050919050565b606060098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156111925780601f1061116757610100808354040283529160200191611192565b820191906000526020600020905b81548152906001019060200180831161117557829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561120d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120490614d60565b60405180910390fd5b611254600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c73565b9050919050565b611263612778565b73ffffffffffffffffffffffffffffffffffffffff16611281611768565b73ffffffffffffffffffffffffffffffffffffffff16146112d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ce90614e20565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6113a0612778565b73ffffffffffffffffffffffffffffffffffffffff166113be611768565b73ffffffffffffffffffffffffffffffffffffffff1614611414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140b90614e20565b60405180910390fd5b60005b828290508110156115aa57600083838381811061143057fe5b905060200201602081019061144591906139d0565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ae90614ae0565b60405180910390fd5b601060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611544576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153b90614ce0565b60405180910390fd5b6001601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550508080600101915050611417565b505050565b6115b7612778565b73ffffffffffffffffffffffffffffffffffffffff166115d5611768565b73ffffffffffffffffffffffffffffffffffffffff161461162b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162290614e20565b60405180910390fd5b600e60019054906101000a900460ff1615600e60016101000a81548160ff021916908315150217905550565b600e60019054906101000a900460ff1681565b606060006116778361119c565b905060008114156116d257600067ffffffffffffffff8111801561169a57600080fd5b506040519080825280602002602001820160405280156116c95781602001602082028036833780820191505090505b5091505061175e565b60008167ffffffffffffffff811180156116eb57600080fd5b5060405190808252806020026020018201604052801561171a5781602001602082028036833780820191505090505b50905060005b82811015611757576117328582610d1d565b82828151811061173e57fe5b6020026020010181815250508080600101915050611720565b8193505050505b919050565b601481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060078054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561182a5780601f106117ff5761010080835404028352916020019161182a565b820191906000526020600020905b81548152906001019060200180831161180d57829003601f168201915b5050505050905090565b60116020528060005260406000206000915090505481565b60106020528060005260406000206000915054906101000a900460ff1681565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6118ca612778565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611938576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192f90614c00565b60405180910390fd5b8060056000611945612778565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166119f2612778565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a379190614a63565b60405180910390a35050565b600e60009054906101000a900460ff16611a92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8990614c60565b60405180910390fd5b600081118015611aa3575060148111155b611ae2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad990614d20565b60405180910390fd5b612b67611aff82611af1610cac565b612c8890919063ffffffff16565b1115611b40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3790614ea0565b60405180910390fd5b611b5581600c54612b9e90919063ffffffff16565b341015611b97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8e90614c40565b60405180910390fd5b60005b81811015611bd8576000611bac610cac565b9050612b67611bb9610cac565b1015611bca57611bc93382612cdd565b5b508080600101915050611b9a565b5050565b611be4612778565b73ffffffffffffffffffffffffffffffffffffffff16611c02611768565b73ffffffffffffffffffffffffffffffffffffffff1614611c58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4f90614e20565b60405180910390fd5b60005b82829050811015611d61576000838383818110611c7457fe5b9050602002016020810190611c8991906139d0565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611cfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf290614ae0565b60405180910390fd5b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550508080600101915050611c5b565b505050565b611d77611d71612778565b83612839565b611db6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dad90614ec0565b60405180910390fd5b611dc284848484612cfb565b50505050565b611dd0612778565b73ffffffffffffffffffffffffffffffffffffffff16611dee611768565b73ffffffffffffffffffffffffffffffffffffffff1614611e44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3b90614e20565b60405180910390fd5b80600c8190555050565b6060611e598261275b565b611e98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8f90614e60565b60405180910390fd5b6000600860008481526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611f415780601f10611f1657610100808354040283529160200191611f41565b820191906000526020600020905b815481529060010190602001808311611f2457829003601f168201915b505050505090506000611f526110fa565b9050600081511415611f68578192505050611fcc565b600082511115611f9d578082604051602001611f859291906149b6565b60405160208183030381529060405292505050611fcc565b80611fa785612d57565b604051602001611fb89291906149b6565b604051602081830303815290604052925050505b919050565b611fd9612778565b73ffffffffffffffffffffffffffffffffffffffff16611ff7611768565b73ffffffffffffffffffffffffffffffffffffffff161461204d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204490614e20565b60405180910390fd5b6000612057610cac565b905060008211801561206b5750600b548211155b6120aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a190614bc0565b60405180910390fd5b60005b828110156120ce576120c184828401612cdd565b80806001019150506120ad565b506120e482600b5461266290919063ffffffff16565b600b81905550505050565b612b6781565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e60009054906101000a900460ff1681565b6121a4612778565b73ffffffffffffffffffffffffffffffffffffffff166121c2611768565b73ffffffffffffffffffffffffffffffffffffffff1614612218576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220f90614e20565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612288576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227f90614b40565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600d5481565b600e60009054906101000a900460ff161580156123775750600e60019054906101000a900460ff165b6123b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ad90614ac0565b60405180910390fd5b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612442576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243990614ba0565b60405180910390fd5b61100f61244d610cac565b1061248d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248490614c20565b60405180910390fd5b61100f6124aa8261249c610cac565b612c8890919063ffffffff16565b11156124eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e290614b00565b60405180910390fd5b600d5481601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054011115612571576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256890614d80565b60405180910390fd5b61258681600c54612b9e90919063ffffffff16565b3410156125c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125bf90614c40565b60405180910390fd5b60005b818110156126585760006125dd610cac565b905061100f6125ea610cac565b101561264a57601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919060010191905055506126493382612cdd565b5b5080806001019150506125cb565b5050565b61100f81565b6000828211156126a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269e90614c80565b60405180910390fd5b818303905092915050565b60006126c082600001612e9e565b9050919050565b60006126d9836000018360001b612eaf565b905092915050565b600061270d846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b612f1f565b90509392505050565b600080823b905060008111915050919050565b60606127388484600085612ffb565b90509392505050565b6000612753836000018360001b61310f565b905092915050565b600061277182600261274190919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166127f3836110c3565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006128448261275b565b612883576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287a90614cc0565b60405180910390fd5b600061288e836110c3565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806128fd57508373ffffffffffffffffffffffffffffffffffffffff166128e584610b09565b73ffffffffffffffffffffffffffffffffffffffff16145b8061290e575061290d81856120f5565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612937826110c3565b73ffffffffffffffffffffffffffffffffffffffff161461298d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298490614e40565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f490614be0565b60405180910390fd5b612a08838383613132565b612a13600082612780565b612a6481600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061313790919063ffffffff16565b50612ab681600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206126c790919063ffffffff16565b50612acd818360026126e19092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000612b3d8360000183613151565b60001c905092915050565b6000808211612b8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8390614d00565b60405180910390fd5b818381612b9557fe5b04905092915050565b600080831415612bb15760009050612c08565b6000828402905082848281612bc257fe5b0414612c03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bfa90614de0565b60405180910390fd5b809150505b92915050565b600080600080612c2186600001866131be565b915091508160001c8160001c9350935050509250929050565b8060099080519060200190612c509291906137a2565b5050565b6000612c67846000018460001b84613241565b60001c90509392505050565b6000612c81826000016132d2565b9050919050565b600080828401905083811015612cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cca90614b80565b60405180910390fd5b8091505092915050565b612cf78282604051806020016040528060008152506132e3565b5050565b612d06848484612917565b612d128484848461333e565b612d51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4890614b20565b60405180910390fd5b50505050565b60606000821415612d9f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e99565b600082905060005b60008214612dc9578080600101915050600a8281612dc157fe5b049150612da7565b60008167ffffffffffffffff81118015612de257600080fd5b506040519080825280601f01601f191660200182016040528015612e155781602001600182028036833780820191505090505b50905060006001830390508593505b60008414612e9157600a8481612e3657fe5b0660300160f81b82828060019003935081518110612e5057fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8481612e8957fe5b049350612e24565b819450505050505b919050565b600081600001805490509050919050565b6000612ebb83836134a2565b612f14578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612f19565b600090505b92915050565b6000808460010160008581526020019081526020016000205490506000811415612fc657846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050612ff4565b82856000016001830381548110612fd957fe5b90600052602060002090600202016001018190555060009150505b9392505050565b606082471015613040576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303790614ca0565b60405180910390fd5b61304985612716565b613088576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161307f90614ee0565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516130b1919061499f565b60006040518083038185875af1925050503d80600081146130ee576040519150601f19603f3d011682016040523d82523d6000602084013e6130f3565b606091505b50915091506131038282866134c5565b92505050949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b505050565b6000613149836000018360001b61352c565b905092915050565b60008183600001805490501161319c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319390614aa0565b60405180910390fd5b8260000182815481106131ab57fe5b9060005260206000200154905092915050565b6000808284600001805490501161320a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161320190614da0565b60405180910390fd5b600084600001848154811061321b57fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b600080846001016000858152602001908152602001600020549050600081141583906132a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161329a9190614a7e565b60405180910390fd5b508460000160018203815481106132b657fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b6132ed8383613614565b6132fa600084848461333e565b613339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161333090614b20565b60405180910390fd5b505050565b600061335f8473ffffffffffffffffffffffffffffffffffffffff16612716565b61336c576001905061349a565b600061343363150b7a0260e01b613381612778565b88878760405160240161339794939291906149f5565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405180606001604052806032815260200161516b603291398773ffffffffffffffffffffffffffffffffffffffff166127299092919063ffffffff16565b905060008180602001905181019061344b9190613be5565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b606083156134d557829050613525565b6000835111156134e85782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161351c9190614a7e565b60405180910390fd5b9392505050565b60008083600101600084815260200190815260200160002054905060008114613608576000600182039050600060018660000180549050039050600086600001828154811061357757fe5b906000526020600020015490508087600001848154811061359457fe5b90600052602060002001819055506001830187600101600083815260200190815260200160002081905550866000018054806135cc57fe5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061360e565b60009150505b92915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613684576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161367b90614dc0565b60405180910390fd5b61368d8161275b565b156136cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136c490614b60565b60405180910390fd5b6136d960008383613132565b61372a81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206126c790919063ffffffff16565b50613741818360026126e19092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826137d8576000855561381f565b82601f106137f157805160ff191683800117855561381f565b8280016001018555821561381f579182015b8281111561381e578251825591602001919060010190613803565b5b50905061382c9190613830565b5090565b5b80821115613849576000816000905550600101613831565b5090565b600061386061385b84614f4c565b614f1b565b90508281526020810184848401111561387857600080fd5b6138838482856150b9565b509392505050565b600061389e61389984614f7c565b614f1b565b9050828152602081018484840111156138b657600080fd5b6138c18482856150b9565b509392505050565b6000813590506138d88161510e565b92915050565b60008083601f8401126138f057600080fd5b8235905067ffffffffffffffff81111561390957600080fd5b60208301915083602082028301111561392157600080fd5b9250929050565b60008135905061393781615125565b92915050565b60008135905061394c8161513c565b92915050565b6000815190506139618161513c565b92915050565b600082601f83011261397857600080fd5b813561398884826020860161384d565b91505092915050565b600082601f8301126139a257600080fd5b81356139b284826020860161388b565b91505092915050565b6000813590506139ca81615153565b92915050565b6000602082840312156139e257600080fd5b60006139f0848285016138c9565b91505092915050565b60008060408385031215613a0c57600080fd5b6000613a1a858286016138c9565b9250506020613a2b858286016138c9565b9150509250929050565b600080600060608486031215613a4a57600080fd5b6000613a58868287016138c9565b9350506020613a69868287016138c9565b9250506040613a7a868287016139bb565b9150509250925092565b60008060008060808587031215613a9a57600080fd5b6000613aa8878288016138c9565b9450506020613ab9878288016138c9565b9350506040613aca878288016139bb565b925050606085013567ffffffffffffffff811115613ae757600080fd5b613af387828801613967565b91505092959194509250565b60008060408385031215613b1257600080fd5b6000613b20858286016138c9565b9250506020613b3185828601613928565b9150509250929050565b60008060408385031215613b4e57600080fd5b6000613b5c858286016138c9565b9250506020613b6d858286016139bb565b9150509250929050565b60008060208385031215613b8a57600080fd5b600083013567ffffffffffffffff811115613ba457600080fd5b613bb0858286016138de565b92509250509250929050565b600060208284031215613bce57600080fd5b6000613bdc8482850161393d565b91505092915050565b600060208284031215613bf757600080fd5b6000613c0584828501613952565b91505092915050565b600060208284031215613c2057600080fd5b600082013567ffffffffffffffff811115613c3a57600080fd5b613c4684828501613991565b91505092915050565b600060208284031215613c6157600080fd5b6000613c6f848285016139bb565b91505092915050565b6000613c848383614981565b60208301905092915050565b613c9981615045565b82525050565b613ca881615033565b82525050565b6000613cb982614fbc565b613cc38185614fea565b9350613cce83614fac565b8060005b83811015613cff578151613ce68882613c78565b9750613cf183614fdd565b925050600181019050613cd2565b5085935050505092915050565b613d1581615057565b82525050565b6000613d2682614fc7565b613d308185614ffb565b9350613d408185602086016150c8565b613d49816150fd565b840191505092915050565b6000613d5f82614fc7565b613d69818561500c565b9350613d798185602086016150c8565b80840191505092915050565b6000613d9082614fd2565b613d9a8185615017565b9350613daa8185602086016150c8565b613db3816150fd565b840191505092915050565b6000613dc982614fd2565b613dd38185615028565b9350613de38185602086016150c8565b80840191505092915050565b6000613dfc602283615017565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e62600e83615017565b91507f50524553414c455f434c4f5345440000000000000000000000000000000000006000830152602082019050919050565b6000613ea2600c83615017565b91507f4e554c4c5f4144445245535300000000000000000000000000000000000000006000830152602082019050919050565b6000613ee2603d83615017565b91507f507572636861736520776f756c6420657863656564206d61782050726573616c60008301527f6520737570706c79206f6620426c696e6442756e6e79536f63696574790000006020830152604082019050919050565b6000613f48603283615017565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613fae602683615017565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614014601c83615017565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000614054601b83615017565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000614094601883615017565b91507f41646472657373206e6f7420696e2057686974656c69737400000000000000006000830152602082019050919050565b60006140d4602083615017565b91507f4e6f7420656e6f7567682072657365727665206c65667420666f72207465616d6000830152602082019050919050565b6000614114602483615017565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061417a601983615017565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006141ba600c83615017565b91507f4f55545f4f465f53544f434b00000000000000000000000000000000000000006000830152602082019050919050565b60006141fa601f83615017565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b600061423a602d83615017565b91507f53616c65206d7573742062652061637469766520746f206d696e7420426c696e60008301527f6442756e6e79536f6369657479000000000000000000000000000000000000006020830152604082019050919050565b60006142a0601e83615017565b91507f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006000830152602082019050919050565b60006142e0602683615017565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614346602c83615017565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006143ac600f83615017565b91507f4455504c49434154455f454e54525900000000000000000000000000000000006000830152602082019050919050565b60006143ec601a83615017565b91507f536166654d6174683a206469766973696f6e206279207a65726f0000000000006000830152602082019050919050565b600061442c602183615017565b91507f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d60008301527f65000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614492603883615017565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006144f8602a83615017565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600061455e601e83615017565b91507f6f6e6c79203520796f752063616e206d696e7420696e2050726573616c6500006000830152602082019050919050565b600061459e602283615017565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614604602083615017565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614644602183615017565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146aa602c83615017565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614710602083615017565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614750602983615017565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006147b6602f83615017565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b600061481c602183615017565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614882603583615017565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f6620426c696e6442756e6e79536f636965747900000000000000000000006020830152604082019050919050565b60006148e8603183615017565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b600061494e601d83615017565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b61498a816150af565b82525050565b614999816150af565b82525050565b60006149ab8284613d54565b915081905092915050565b60006149c28285613dbe565b91506149ce8284613dbe565b91508190509392505050565b60006020820190506149ef6000830184613c9f565b92915050565b6000608082019050614a0a6000830187613c90565b614a176020830186613c9f565b614a246040830185614990565b8181036060830152614a368184613d1b565b905095945050505050565b60006020820190508181036000830152614a5b8184613cae565b905092915050565b6000602082019050614a786000830184613d0c565b92915050565b60006020820190508181036000830152614a988184613d85565b905092915050565b60006020820190508181036000830152614ab981613def565b9050919050565b60006020820190508181036000830152614ad981613e55565b9050919050565b60006020820190508181036000830152614af981613e95565b9050919050565b60006020820190508181036000830152614b1981613ed5565b9050919050565b60006020820190508181036000830152614b3981613f3b565b9050919050565b60006020820190508181036000830152614b5981613fa1565b9050919050565b60006020820190508181036000830152614b7981614007565b9050919050565b60006020820190508181036000830152614b9981614047565b9050919050565b60006020820190508181036000830152614bb981614087565b9050919050565b60006020820190508181036000830152614bd9816140c7565b9050919050565b60006020820190508181036000830152614bf981614107565b9050919050565b60006020820190508181036000830152614c198161416d565b9050919050565b60006020820190508181036000830152614c39816141ad565b9050919050565b60006020820190508181036000830152614c59816141ed565b9050919050565b60006020820190508181036000830152614c798161422d565b9050919050565b60006020820190508181036000830152614c9981614293565b9050919050565b60006020820190508181036000830152614cb9816142d3565b9050919050565b60006020820190508181036000830152614cd981614339565b9050919050565b60006020820190508181036000830152614cf98161439f565b9050919050565b60006020820190508181036000830152614d19816143df565b9050919050565b60006020820190508181036000830152614d398161441f565b9050919050565b60006020820190508181036000830152614d5981614485565b9050919050565b60006020820190508181036000830152614d79816144eb565b9050919050565b60006020820190508181036000830152614d9981614551565b9050919050565b60006020820190508181036000830152614db981614591565b9050919050565b60006020820190508181036000830152614dd9816145f7565b9050919050565b60006020820190508181036000830152614df981614637565b9050919050565b60006020820190508181036000830152614e198161469d565b9050919050565b60006020820190508181036000830152614e3981614703565b9050919050565b60006020820190508181036000830152614e5981614743565b9050919050565b60006020820190508181036000830152614e79816147a9565b9050919050565b60006020820190508181036000830152614e998161480f565b9050919050565b60006020820190508181036000830152614eb981614875565b9050919050565b60006020820190508181036000830152614ed9816148db565b9050919050565b60006020820190508181036000830152614ef981614941565b9050919050565b6000602082019050614f156000830184614990565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614f4257614f416150fb565b5b8060405250919050565b600067ffffffffffffffff821115614f6757614f666150fb565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614f9757614f966150fb565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061503e8261508f565b9050919050565b60006150508261508f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156150e65780820151818401526020810190506150cb565b838111156150f5576000848401525b50505050565bfe5b6000601f19601f8301169050919050565b61511781615033565b811461512257600080fd5b50565b61512e81615057565b811461513957600080fd5b50565b61514581615063565b811461515057600080fd5b50565b61515c816150af565b811461516757600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220a2f1092fcbbef04aa12d1c954687197a6c78df8858e323b027cc8d9e82042e9264736f6c63430007060033

Deployed Bytecode Sourcemap

66973:5529:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10307:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51592:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54378:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53908:404;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67120:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53386:211;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55268:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53148:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72036:89;;;;;;;;;;;;;:::i;:::-;;68072:385;;;;;;;;;;;;;:::i;:::-;;55644:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67242:57;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53674:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71415:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72256:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51348:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52967:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51065:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66303:148;;;;;;;;;;;;;:::i;:::-;;68469:356;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72404:95;;;;;;;;;;;;;:::i;:::-;;67464:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71522:502;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67059:54;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65652:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51761:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67709:56;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67658:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72137:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54671:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69272:744;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68837:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55866:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69157:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51936:792;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70975:432;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67319:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55037:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67425:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66606:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67379:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70028:939;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67197:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10307:150;10392:4;10416:20;:33;10437:11;10416:33;;;;;;;;;;;;;;;;;;;;;;;;;;;10409:40;;10307:150;;;:::o;51592:100::-;51646:13;51679:5;51672:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51592:100;:::o;54378:221::-;54454:7;54482:16;54490:7;54482;:16::i;:::-;54474:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;54567:15;:24;54583:7;54567:24;;;;;;;;;;;;;;;;;;;;;54560:31;;54378:221;;;:::o;53908:404::-;53989:13;54005:23;54020:7;54005:14;:23::i;:::-;53989:39;;54053:5;54047:11;;:2;:11;;;;54039:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;54133:5;54117:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;54142:44;54166:5;54173:12;:10;:12::i;:::-;54142:23;:44::i;:::-;54117:69;54109:161;;;;;;;;;;;;:::i;:::-;;;;;;;;;54283:21;54292:2;54296:7;54283:8;:21::i;:::-;53908:404;;;:::o;67120:42::-;;;;:::o;53386:211::-;53447:7;53568:21;:12;:19;:21::i;:::-;53561:28;;53386:211;:::o;55268:305::-;55429:41;55448:12;:10;:12::i;:::-;55462:7;55429:18;:41::i;:::-;55421:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;55537:28;55547:4;55553:2;55557:7;55537:9;:28::i;:::-;55268:305;;;:::o;53148:162::-;53245:7;53272:30;53296:5;53272:13;:20;53286:5;53272:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;53265:37;;53148:162;;;;:::o;72036:89::-;65883:12;:10;:12::i;:::-;65872:23;;:7;:5;:7::i;:::-;:23;;;65864:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72105:12:::1;;;;;;;;;;;72104:13;72089:12;;:28;;;;;;;;;;;;;;;;;;72036:89::o:0;68072:385::-;65883:12;:10;:12::i;:::-;65872:23;;:7;:5;:7::i;:::-;:23;;;65864:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68120:16:::1;68139:30;68165:3;68139:21;:25;;:30;;;;:::i;:::-;68120:49;;68206:17;68226:16;68239:2;68226:8;:12;;:16;;;;:::i;:::-;68206:36;;68279:19;68301:16;68314:2;68301:8;:12;;:16;;;;:::i;:::-;68279:38;;68368:7;;;;;;;;;;;68360:21;;:32;68382:9;68360:32;;;;;;;;;;;;;;;;;;;;;;;68352:41;;;::::0;::::1;;68420:9;;;;;;;;;;;68412:23;;:36;68436:11;68412:36;;;;;;;;;;;;;;;;;;;;;;;68404:45;;;::::0;::::1;;65943:1;;;68072:385::o:0;55644:151::-;55748:39;55765:4;55771:2;55775:7;55748:39;;;;;;;;;;;;:16;:39::i;:::-;55644:151;;;:::o;67242:57::-;;;;:::o;53674:172::-;53749:7;53770:15;53791:22;53807:5;53791:12;:15;;:22;;;;:::i;:::-;53769:44;;;53831:7;53824:14;;;53674:172;;;:::o;71415:99::-;65883:12;:10;:12::i;:::-;65872:23;;:7;:5;:7::i;:::-;:23;;;65864:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71486:20:::1;71498:7;71486:11;:20::i;:::-;71415:99:::0;:::o;72256:130::-;72324:7;72351:21;:27;72373:4;72351:27;;;;;;;;;;;;;;;;72344:34;;72256:130;;;:::o;51348:177::-;51420:7;51447:70;51464:7;51447:70;;;;;;;;;;;;;;;;;:12;:16;;:70;;;;;:::i;:::-;51440:77;;51348:177;;;:::o;52967:97::-;53015:13;53048:8;53041:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52967:97;:::o;51065:221::-;51137:7;51182:1;51165:19;;:5;:19;;;;51157:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;51249:29;:13;:20;51263:5;51249:20;;;;;;;;;;;;;;;:27;:29::i;:::-;51242:36;;51065:221;;;:::o;66303:148::-;65883:12;:10;:12::i;:::-;65872:23;;:7;:5;:7::i;:::-;:23;;;65864:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66410:1:::1;66373:40;;66394:6;;;;;;;;;;;66373:40;;;;;;;;;;;;66441:1;66424:6;;:19;;;;;;;;;;;;;;;;;;66303:148::o:0;68469:356::-;65883:12;:10;:12::i;:::-;65872:23;;:7;:5;:7::i;:::-;:23;;;65864:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68557:9:::1;68553:262;68576:7;;:14;;68572:1;:18;68553:262;;;68612:13;68628:7;;68636:1;68628:10;;;;;;;;;;;;;;;;;;;;:::i;:::-;68612:26;;68678:1;68661:19;;:5;:19;;;;68653:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;68721:12;:19;68734:5;68721:19;;;;;;;;;;;;;;;;;;;;;;;;;68720:20;68712:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;68799:4;68777:12;:19;68790:5;68777:19;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;68553:262;68592:3;;;;;;;68553:262;;;;68469:356:::0;;:::o;72404:95::-;65883:12;:10;:12::i;:::-;65872:23;;:7;:5;:7::i;:::-;:23;;;65864:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72480:11:::1;;;;;;;;;;;72479:12;72465:11;;:26;;;;;;;;;;;;;;;;;;72404:95::o:0;67464:23::-;;;;;;;;;;;;;:::o;71522:502::-;71583:16;71613:18;71634:17;71644:6;71634:9;:17::i;:::-;71613:38;;71680:1;71666:10;:15;71662:355;;;71719:1;71705:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71698:23;;;;;71662:355;71754:23;71794:10;71780:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71754:51;;71820:13;71848:130;71872:10;71864:5;:18;71848:130;;;71928:34;71948:6;71956:5;71928:19;:34::i;:::-;71912:6;71919:5;71912:13;;;;;;;;;;;;;:50;;;;;71884:7;;;;;;;71848:130;;;71999:6;71992:13;;;;;71522:502;;;;:::o;67059:54::-;67111:2;67059:54;:::o;65652:87::-;65698:7;65725:6;;;;;;;;;;;65718:13;;65652:87;:::o;51761:104::-;51817:13;51850:7;51843:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51761:104;:::o;67709:56::-;;;;;;;;;;;;;;;;;:::o;67658:44::-;;;;;;;;;;;;;;;;;;;;;;:::o;72137:107::-;72194:4;72218:12;:18;72231:4;72218:18;;;;;;;;;;;;;;;;;;;;;;;;;72211:25;;72137:107;;;:::o;54671:295::-;54786:12;:10;:12::i;:::-;54774:24;;:8;:24;;;;54766:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;54886:8;54841:18;:32;54860:12;:10;:12::i;:::-;54841:32;;;;;;;;;;;;;;;:42;54874:8;54841:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;54939:8;54910:48;;54925:12;:10;:12::i;:::-;54910:48;;;54949:8;54910:48;;;;;;:::i;:::-;;;;;;;;54671:295;;:::o;69272:744::-;69344:12;;;;;;;;;;;69336:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;69442:1;69425:14;:18;:68;;;;;67111:2;69447:14;:46;;69425:68;69417:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;67367:5;69550:33;69568:14;69550:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:58;;69542:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;69698:42;69725:14;69698:22;;:26;;:42;;;;:::i;:::-;69685:9;:55;;69677:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;69791:6;69787:222;69807:14;69803:1;:18;69787:222;;;69843:14;69860:13;:11;:13::i;:::-;69843:30;;67367:5;69892:13;:11;:13::i;:::-;:37;69888:110;;;69950:32;69960:10;69972:9;69950;:32::i;:::-;69888:110;69787:222;69823:3;;;;;;;69787:222;;;;69272:744;:::o;68837:308::-;65883:12;:10;:12::i;:::-;65872:23;;:7;:5;:7::i;:::-;:23;;;65864:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68930:9:::1;68926:212;68949:7;;:14;;68945:1;:18;68926:212;;;68985:13;69001:7;;69009:1;69001:10;;;;;;;;;;;;;;;;;;;;:::i;:::-;68985:26;;69051:1;69034:19;;:5;:19;;;;69026:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;69121:5;69099:12;:19;69112:5;69099:19;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;68926:212;68965:3;;;;;;;68926:212;;;;68837:308:::0;;:::o;55866:285::-;55998:41;56017:12;:10;:12::i;:::-;56031:7;55998:18;:41::i;:::-;55990:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;56104:39;56118:4;56124:2;56128:7;56137:5;56104:13;:39::i;:::-;55866:285;;;;:::o;69157:103::-;65883:12;:10;:12::i;:::-;65872:23;;:7;:5;:7::i;:::-;:23;;;65864:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69244:8:::1;69219:22;:33;;;;69157:103:::0;:::o;51936:792::-;52009:13;52043:16;52051:7;52043;:16::i;:::-;52035:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;52124:23;52150:10;:19;52161:7;52150:19;;;;;;;;;;;52124:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52180:18;52201:9;:7;:9::i;:::-;52180:30;;52308:1;52292:4;52286:18;:23;52282:72;;;52333:9;52326:16;;;;;;52282:72;52484:1;52464:9;52458:23;:27;52454:108;;;52533:4;52539:9;52516:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52502:48;;;;;;52454:108;52694:4;52700:18;:7;:16;:18::i;:::-;52677:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52663:57;;;;51936:792;;;;:::o;70975:432::-;65883:12;:10;:12::i;:::-;65872:23;;:7;:5;:7::i;:::-;:23;;;65864:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71065:11:::1;71079:13;:11;:13::i;:::-;71065:27;;71128:1;71111:14;:18;:64;;;;;71151:24;;71133:14;:42;;71111:64;71103:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;71228:6;71223:95;71244:14;71240:1;:18;71223:95;;;71280:26;71290:3;71304:1;71295:6;:10;71280:9;:26::i;:::-;71260:3;;;;;;;71223:95;;;;71355:44;71384:14;71355:24;;:28;;:44;;;;:::i;:::-;71328:24;:71;;;;65943:1;70975:432:::0;;:::o;67319:53::-;67367:5;67319:53;:::o;55037:164::-;55134:4;55158:18;:25;55177:5;55158:25;;;;;;;;;;;;;;;:35;55184:8;55158:35;;;;;;;;;;;;;;;;;;;;;;;;;55151:42;;55037:164;;;;:::o;67425:32::-;;;;;;;;;;;;;:::o;66606:244::-;65883:12;:10;:12::i;:::-;65872:23;;:7;:5;:7::i;:::-;:23;;;65864:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66715:1:::1;66695:22;;:8;:22;;;;66687:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;66805:8;66776:38;;66797:6;;;;;;;;;;;66776:38;;;;;;;;;;;;66834:8;66825:6;;:17;;;;;;;;;;;;;;;;;;66606:244:::0;:::o;67379:39::-;;;;:::o;70028:939::-;70110:12;;;;;;;;;;;70109:13;:28;;;;;70126:11;;;;;;;;;;;70109:28;70101:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;70175:12;:24;70188:10;70175:24;;;;;;;;;;;;;;;;;;;;;;;;;70167:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;67231:4;70247:13;:11;:13::i;:::-;:26;70239:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;67231:4;70309:33;70327:14;70309:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:47;;70301:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;70495:20;;70477:14;70441:21;:33;70463:10;70441:33;;;;;;;;;;;;;;;;:50;:74;;70433:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;70582:42;70609:14;70582:22;;:26;;:42;;;;:::i;:::-;70569:9;:55;;70561:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;70685:6;70681:279;70701:14;70697:1;:18;70681:279;;;70737:14;70754:13;:11;:13::i;:::-;70737:30;;67231:4;70800:13;:11;:13::i;:::-;:26;70796:153;;;70847:21;:33;70869:10;70847:33;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;70901:32;70911:10;70923:9;70901;:32::i;:::-;70796:153;70681:279;70717:3;;;;;;;70681:279;;;;70028:939;:::o;67197:38::-;67231:4;67197:38;:::o;14331:158::-;14389:7;14422:1;14417;:6;;14409:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;14480:1;14476;:5;14469:12;;14331:158;;;;:::o;44350:123::-;44419:7;44446:19;44454:3;:10;;44446:7;:19::i;:::-;44439:26;;44350:123;;;:::o;34921:131::-;34988:4;35012:32;35017:3;:10;;35037:5;35029:14;;35012:4;:32::i;:::-;35005:39;;34921:131;;;;:::o;43534:185::-;43623:4;43647:64;43652:3;:10;;43672:3;43664:12;;43702:5;43686:23;;43678:32;;43647:4;:64::i;:::-;43640:71;;43534:185;;;;;:::o;19310:422::-;19370:4;19578:12;19689:7;19677:20;19669:28;;19723:1;19716:4;:8;19709:15;;;19310:422;;;:::o;22228:195::-;22331:12;22363:52;22385:6;22393:4;22399:1;22402:12;22363:21;:52::i;:::-;22356:59;;22228:195;;;;;:::o;44111:151::-;44195:4;44219:35;44229:3;:10;;44249:3;44241:12;;44219:9;:35::i;:::-;44212:42;;44111:151;;;;:::o;57618:127::-;57683:4;57707:30;57729:7;57707:12;:21;;:30;;;;:::i;:::-;57700:37;;57618:127;;;:::o;739:106::-;792:15;827:10;820:17;;739:106;:::o;63636:192::-;63738:2;63711:15;:24;63727:7;63711:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;63794:7;63790:2;63756:46;;63765:23;63780:7;63765:14;:23::i;:::-;63756:46;;;;;;;;;;;;63636:192;;:::o;57912:355::-;58005:4;58030:16;58038:7;58030;:16::i;:::-;58022:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;58106:13;58122:23;58137:7;58122:14;:23::i;:::-;58106:39;;58175:5;58164:16;;:7;:16;;;:51;;;;58208:7;58184:31;;:20;58196:7;58184:11;:20::i;:::-;:31;;;58164:51;:94;;;;58219:39;58243:5;58250:7;58219:23;:39::i;:::-;58164:94;58156:103;;;57912:355;;;;:::o;61048:599::-;61173:4;61146:31;;:23;61161:7;61146:14;:23::i;:::-;:31;;;61138:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;61274:1;61260:16;;:2;:16;;;;61252:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;61330:39;61351:4;61357:2;61361:7;61330:20;:39::i;:::-;61434:29;61451:1;61455:7;61434:8;:29::i;:::-;61476:35;61503:7;61476:13;:19;61490:4;61476:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;61522:30;61544:7;61522:13;:17;61536:2;61522:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;61565:29;61582:7;61591:2;61565:12;:16;;:29;;;;;:::i;:::-;;61631:7;61627:2;61612:27;;61621:4;61612:27;;;;;;;;;;;;61048:599;;;:::o;36141:137::-;36212:7;36247:22;36251:3;:10;;36263:5;36247:3;:22::i;:::-;36239:31;;36232:38;;36141:137;;;;:::o;15446:153::-;15504:7;15536:1;15532;:5;15524:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;15590:1;15586;:5;;;;;;15579:12;;15446:153;;;;:::o;14748:220::-;14806:7;14835:1;14830;:6;14826:20;;;14845:1;14838:8;;;;14826:20;14857:9;14873:1;14869;:5;14857:17;;14902:1;14897;14893;:5;;;;;;:10;14885:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;14959:1;14952:8;;;14748:220;;;;;:::o;44812:236::-;44892:7;44901;44922:11;44935:13;44952:22;44956:3;:10;;44968:5;44952:3;:22::i;:::-;44921:53;;;;45001:3;44993:12;;45031:5;45023:14;;44985:55;;;;;;44812:236;;;;;:::o;62248:100::-;62332:8;62321;:19;;;;;;;;;;;;:::i;:::-;;62248:100;:::o;46098:213::-;46205:7;46256:44;46261:3;:10;;46281:3;46273:12;;46287;46256:4;:44::i;:::-;46248:53;;46225:78;;46098:213;;;;;:::o;35683:114::-;35743:7;35770:19;35778:3;:10;;35770:7;:19::i;:::-;35763:26;;35683:114;;;:::o;13869:179::-;13927:7;13947:9;13963:1;13959;:5;13947:17;;13988:1;13983;:6;;13975:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;14039:1;14032:8;;;13869:179;;;;:::o;58610:110::-;58686:26;58696:2;58700:7;58686:26;;;;;;;;;;;;:9;:26::i;:::-;58610:110;;:::o;57033:272::-;57147:28;57157:4;57163:2;57167:7;57147:9;:28::i;:::-;57194:48;57217:4;57223:2;57227:7;57236:5;57194:22;:48::i;:::-;57186:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;57033:272;;;;:::o;46562:746::-;46618:13;46848:1;46839:5;:10;46835:53;;;46866:10;;;;;;;;;;;;;;;;;;;;;46835:53;46898:12;46913:5;46898:20;;46929:14;46954:78;46969:1;46961:4;:9;46954:78;;46987:8;;;;;;;47018:2;47010:10;;;;;;;;;46954:78;;;47042:19;47074:6;47064:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47042:39;;47092:13;47117:1;47108:6;:10;47092:26;;47136:5;47129:12;;47152:117;47167:1;47159:4;:9;47152:117;;47228:2;47221:4;:9;;;;;;47216:2;:14;47203:29;;47185:6;47192:7;;;;;;;47185:15;;;;;;;;;;;:47;;;;;;;;;;;47255:2;47247:10;;;;;;;;;47152:117;;;47293:6;47279:21;;;;;;46562:746;;;;:::o;40929:110::-;40985:7;41012:3;:12;;:19;;;;41005:26;;40929:110;;;:::o;28291:414::-;28354:4;28376:21;28386:3;28391:5;28376:9;:21::i;:::-;28371:327;;28414:3;:11;;28431:5;28414:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28597:3;:11;;:18;;;;28575:3;:12;;:19;28588:5;28575:19;;;;;;;;;;;:40;;;;28637:4;28630:11;;;;28371:327;28681:5;28674:12;;28291:414;;;;;:::o;38209:692::-;38285:4;38401:16;38420:3;:12;;:17;38433:3;38420:17;;;;;;;;;;;;38401:36;;38466:1;38454:8;:13;38450:444;;;38521:3;:12;;38539:38;;;;;;;;38556:3;38539:38;;;;38569:5;38539:38;;;38521:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38736:3;:12;;:19;;;;38716:3;:12;;:17;38729:3;38716:17;;;;;;;;;;;:39;;;;38777:4;38770:11;;;;;38450:444;38850:5;38814:3;:12;;38838:1;38827:8;:12;38814:26;;;;;;;;;;;;;;;;;;:33;;:41;;;;38877:5;38870:12;;;38209:692;;;;;;:::o;23280:530::-;23407:12;23465:5;23440:21;:30;;23432:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;23532:18;23543:6;23532:10;:18::i;:::-;23524:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;23658:12;23672:23;23699:6;:11;;23719:5;23727:4;23699:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23657:75;;;;23750:52;23768:7;23777:10;23789:12;23750:17;:52::i;:::-;23743:59;;;;23280:530;;;;;;:::o;40709:125::-;40780:4;40825:1;40804:3;:12;;:17;40817:3;40804:17;;;;;;;;;;;;:22;;40797:29;;40709:125;;;;:::o;64441:93::-;;;;:::o;35228:137::-;35298:4;35322:35;35330:3;:10;;35350:5;35342:14;;35322:7;:35::i;:::-;35315:42;;35228:137;;;;:::o;31179:204::-;31246:7;31295:5;31274:3;:11;;:18;;;;:26;31266:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31357:3;:11;;31369:5;31357:18;;;;;;;;;;;;;;;;31350:25;;31179:204;;;;:::o;41394:279::-;41461:7;41470;41520:5;41498:3;:12;;:19;;;;:27;41490:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;41577:22;41602:3;:12;;41615:5;41602:19;;;;;;;;;;;;;;;;;;41577:44;;41640:5;:10;;;41652:5;:12;;;41632:33;;;;;41394:279;;;;;:::o;42891:319::-;42985:7;43005:16;43024:3;:12;;:17;43037:3;43024:17;;;;;;;;;;;;43005:36;;43072:1;43060:8;:13;;43075:12;43052:36;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;43142:3;:12;;43166:1;43155:8;:12;43142:26;;;;;;;;;;;;;;;;;;:33;;;43135:40;;;42891:319;;;;;:::o;30726:109::-;30782:7;30809:3;:11;;:18;;;;30802:25;;30726:109;;;:::o;58947:250::-;59043:18;59049:2;59053:7;59043:5;:18::i;:::-;59080:54;59111:1;59115:2;59119:7;59128:5;59080:22;:54::i;:::-;59072:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;58947:250;;;:::o;62913:604::-;63034:4;63061:15;:2;:13;;;:15::i;:::-;63056:60;;63100:4;63093:11;;;;63056:60;63126:23;63152:252;63205:45;;;63265:12;:10;:12::i;:::-;63292:4;63311:7;63333:5;63168:181;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63152:252;;;;;;;;;;;;;;;;;:2;:15;;;;:252;;;;;:::i;:::-;63126:278;;63415:13;63442:10;63431:32;;;;;;;;;;;;:::i;:::-;63415:48;;48062:10;63492:16;;63482:26;;;:6;:26;;;;63474:35;;;;62913:604;;;;;;;:::o;30511:129::-;30584:4;30631:1;30608:3;:12;;:19;30621:5;30608:19;;;;;;;;;;;;:24;;30601:31;;30511:129;;;;:::o;25820:742::-;25935:12;25964:7;25960:595;;;25995:10;25988:17;;;;25960:595;26129:1;26109:10;:17;:21;26105:439;;;26372:10;26366:17;26433:15;26420:10;26416:2;26412:19;26405:44;26320:148;26515:12;26508:20;;;;;;;;;;;:::i;:::-;;;;;;;;25820:742;;;;;;:::o;28881:1544::-;28947:4;29065:18;29086:3;:12;;:19;29099:5;29086:19;;;;;;;;;;;;29065:40;;29136:1;29122:10;:15;29118:1300;;29484:21;29521:1;29508:10;:14;29484:38;;29537:17;29578:1;29557:3;:11;;:18;;;;:22;29537:42;;29824:17;29844:3;:11;;29856:9;29844:22;;;;;;;;;;;;;;;;29824:42;;29990:9;29961:3;:11;;29973:13;29961:26;;;;;;;;;;;;;;;:38;;;;30109:1;30093:13;:17;30067:3;:12;;:23;30080:9;30067:23;;;;;;;;;;;:43;;;;30219:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;30314:3;:12;;:19;30327:5;30314:19;;;;;;;;;;;30307:26;;;30357:4;30350:11;;;;;;;;29118:1300;30401:5;30394:12;;;28881:1544;;;;;:::o;59533:404::-;59627:1;59613:16;;:2;:16;;;;59605:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;59686:16;59694:7;59686;:16::i;:::-;59685:17;59677:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;59748:45;59777:1;59781:2;59785:7;59748:20;:45::i;:::-;59806:30;59828:7;59806:13;:17;59820:2;59806:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;59849:29;59866:7;59875:2;59849:12;:16;;:29;;;;;:::i;:::-;;59921:7;59917:2;59896:33;;59913:1;59896:33;;;;;;;;;;;;59533:404;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::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;867:367::-;;;1000:3;993:4;985:6;981:17;977:27;967:2;;1018:1;1015;1008:12;967:2;1054:6;1041:20;1031:30;;1084:18;1076:6;1073:30;1070:2;;;1116:1;1113;1106:12;1070:2;1153:4;1145:6;1141:17;1129:29;;1207:3;1199:4;1191:6;1187:17;1177:8;1173:32;1170:41;1167:2;;;1224:1;1221;1214:12;1167:2;957:277;;;;;:::o;1240:133::-;;1321:6;1308:20;1299:29;;1337:30;1361:5;1337:30;:::i;:::-;1289:84;;;;:::o;1379:137::-;;1462:6;1449:20;1440:29;;1478:32;1504:5;1478:32;:::i;:::-;1430:86;;;;:::o;1522:141::-;;1609:6;1603:13;1594:22;;1625:32;1651:5;1625:32;:::i;:::-;1584:79;;;;:::o;1682:271::-;;1786:3;1779:4;1771:6;1767:17;1763:27;1753:2;;1804:1;1801;1794:12;1753:2;1844:6;1831:20;1869:78;1943:3;1935:6;1928:4;1920:6;1916:17;1869:78;:::i;:::-;1860:87;;1743:210;;;;;:::o;1973:273::-;;2078:3;2071:4;2063:6;2059:17;2055:27;2045:2;;2096:1;2093;2086:12;2045:2;2136:6;2123:20;2161:79;2236:3;2228:6;2221:4;2213:6;2209:17;2161:79;:::i;:::-;2152:88;;2035:211;;;;;:::o;2252:139::-;;2336:6;2323:20;2314:29;;2352:33;2379:5;2352:33;:::i;:::-;2304:87;;;;:::o;2397:262::-;;2505:2;2493:9;2484:7;2480:23;2476:32;2473:2;;;2521:1;2518;2511:12;2473:2;2564:1;2589:53;2634:7;2625:6;2614:9;2610:22;2589:53;:::i;:::-;2579:63;;2535:117;2463:196;;;;:::o;2665:407::-;;;2790:2;2778:9;2769:7;2765:23;2761:32;2758:2;;;2806:1;2803;2796:12;2758:2;2849:1;2874:53;2919:7;2910:6;2899:9;2895:22;2874:53;:::i;:::-;2864:63;;2820:117;2976:2;3002:53;3047:7;3038:6;3027:9;3023:22;3002:53;:::i;:::-;2992:63;;2947:118;2748:324;;;;;:::o;3078:552::-;;;;3220:2;3208:9;3199:7;3195:23;3191:32;3188:2;;;3236:1;3233;3226:12;3188:2;3279:1;3304:53;3349:7;3340:6;3329:9;3325:22;3304:53;:::i;:::-;3294:63;;3250:117;3406:2;3432:53;3477:7;3468:6;3457:9;3453:22;3432:53;:::i;:::-;3422:63;;3377:118;3534:2;3560:53;3605:7;3596:6;3585:9;3581:22;3560:53;:::i;:::-;3550:63;;3505:118;3178:452;;;;;:::o;3636:809::-;;;;;3804:3;3792:9;3783:7;3779:23;3775:33;3772:2;;;3821:1;3818;3811:12;3772:2;3864:1;3889:53;3934:7;3925:6;3914:9;3910:22;3889:53;:::i;:::-;3879:63;;3835:117;3991:2;4017:53;4062:7;4053:6;4042:9;4038:22;4017:53;:::i;:::-;4007:63;;3962:118;4119:2;4145:53;4190:7;4181:6;4170:9;4166:22;4145:53;:::i;:::-;4135:63;;4090:118;4275:2;4264:9;4260:18;4247:32;4306:18;4298:6;4295:30;4292:2;;;4338:1;4335;4328:12;4292:2;4366:62;4420:7;4411:6;4400:9;4396:22;4366:62;:::i;:::-;4356:72;;4218:220;3762:683;;;;;;;:::o;4451:401::-;;;4573:2;4561:9;4552:7;4548:23;4544:32;4541:2;;;4589:1;4586;4579:12;4541:2;4632:1;4657:53;4702:7;4693:6;4682:9;4678:22;4657:53;:::i;:::-;4647:63;;4603:117;4759:2;4785:50;4827:7;4818:6;4807:9;4803:22;4785:50;:::i;:::-;4775:60;;4730:115;4531:321;;;;;:::o;4858:407::-;;;4983:2;4971:9;4962:7;4958:23;4954:32;4951:2;;;4999:1;4996;4989:12;4951:2;5042:1;5067:53;5112:7;5103:6;5092:9;5088:22;5067:53;:::i;:::-;5057:63;;5013:117;5169:2;5195:53;5240:7;5231:6;5220:9;5216:22;5195:53;:::i;:::-;5185:63;;5140:118;4941:324;;;;;:::o;5271:425::-;;;5414:2;5402:9;5393:7;5389:23;5385:32;5382:2;;;5430:1;5427;5420:12;5382:2;5501:1;5490:9;5486:17;5473:31;5531:18;5523:6;5520:30;5517:2;;;5563:1;5560;5553:12;5517:2;5599:80;5671:7;5662:6;5651:9;5647:22;5599:80;:::i;:::-;5581:98;;;;5444:245;5372:324;;;;;:::o;5702:260::-;;5809:2;5797:9;5788:7;5784:23;5780:32;5777:2;;;5825:1;5822;5815:12;5777:2;5868:1;5893:52;5937:7;5928:6;5917:9;5913:22;5893:52;:::i;:::-;5883:62;;5839:116;5767:195;;;;:::o;5968:282::-;;6086:2;6074:9;6065:7;6061:23;6057:32;6054:2;;;6102:1;6099;6092:12;6054:2;6145:1;6170:63;6225:7;6216:6;6205:9;6201:22;6170:63;:::i;:::-;6160:73;;6116:127;6044:206;;;;:::o;6256:375::-;;6374:2;6362:9;6353:7;6349:23;6345:32;6342:2;;;6390:1;6387;6380:12;6342:2;6461:1;6450:9;6446:17;6433:31;6491:18;6483:6;6480:30;6477:2;;;6523:1;6520;6513:12;6477:2;6551:63;6606:7;6597:6;6586:9;6582:22;6551:63;:::i;:::-;6541:73;;6404:220;6332:299;;;;:::o;6637:262::-;;6745:2;6733:9;6724:7;6720:23;6716:32;6713:2;;;6761:1;6758;6751:12;6713:2;6804:1;6829:53;6874:7;6865:6;6854:9;6850:22;6829:53;:::i;:::-;6819:63;;6775:117;6703:196;;;;:::o;6905:179::-;;6995:46;7037:3;7029:6;6995:46;:::i;:::-;7073:4;7068:3;7064:14;7050:28;;6985:99;;;;:::o;7090:142::-;7193:32;7219:5;7193:32;:::i;:::-;7188:3;7181:45;7171:61;;:::o;7238:118::-;7325:24;7343:5;7325:24;:::i;:::-;7320:3;7313:37;7303:53;;:::o;7392:732::-;;7540:54;7588:5;7540:54;:::i;:::-;7610:86;7689:6;7684:3;7610:86;:::i;:::-;7603:93;;7720:56;7770:5;7720:56;:::i;:::-;7799:7;7830:1;7815:284;7840:6;7837:1;7834:13;7815:284;;;7916:6;7910:13;7943:63;8002:3;7987:13;7943:63;:::i;:::-;7936:70;;8029:60;8082:6;8029:60;:::i;:::-;8019:70;;7875:224;7862:1;7859;7855:9;7850:14;;7815:284;;;7819:14;8115:3;8108:10;;7516:608;;;;;;;:::o;8130:109::-;8211:21;8226:5;8211:21;:::i;:::-;8206:3;8199:34;8189:50;;:::o;8245:360::-;;8359:38;8391:5;8359:38;:::i;:::-;8413:70;8476:6;8471:3;8413:70;:::i;:::-;8406:77;;8492:52;8537:6;8532:3;8525:4;8518:5;8514:16;8492:52;:::i;:::-;8569:29;8591:6;8569:29;:::i;:::-;8564:3;8560:39;8553:46;;8335:270;;;;;:::o;8611:373::-;;8743:38;8775:5;8743:38;:::i;:::-;8797:88;8878:6;8873:3;8797:88;:::i;:::-;8790:95;;8894:52;8939:6;8934:3;8927:4;8920:5;8916:16;8894:52;:::i;:::-;8971:6;8966:3;8962:16;8955:23;;8719:265;;;;;:::o;8990:364::-;;9106:39;9139:5;9106:39;:::i;:::-;9161:71;9225:6;9220:3;9161:71;:::i;:::-;9154:78;;9241:52;9286:6;9281:3;9274:4;9267:5;9263:16;9241:52;:::i;:::-;9318:29;9340:6;9318:29;:::i;:::-;9313:3;9309:39;9302:46;;9082:272;;;;;:::o;9360:377::-;;9494:39;9527:5;9494:39;:::i;:::-;9549:89;9631:6;9626:3;9549:89;:::i;:::-;9542:96;;9647:52;9692:6;9687:3;9680:4;9673:5;9669:16;9647:52;:::i;:::-;9724:6;9719:3;9715:16;9708:23;;9470:267;;;;;:::o;9743:366::-;;9906:67;9970:2;9965:3;9906:67;:::i;:::-;9899:74;;10003:34;9999:1;9994:3;9990:11;9983:55;10069:4;10064:2;10059:3;10055:12;10048:26;10100:2;10095:3;10091:12;10084:19;;9889:220;;;:::o;10115:312::-;;10278:67;10342:2;10337:3;10278:67;:::i;:::-;10271:74;;10375:16;10371:1;10366:3;10362:11;10355:37;10418:2;10413:3;10409:12;10402:19;;10261:166;;;:::o;10433:310::-;;10596:67;10660:2;10655:3;10596:67;:::i;:::-;10589:74;;10693:14;10689:1;10684:3;10680:11;10673:35;10734:2;10729:3;10725:12;10718:19;;10579:164;;;:::o;10749:393::-;;10912:67;10976:2;10971:3;10912:67;:::i;:::-;10905:74;;11009:34;11005:1;11000:3;10996:11;10989:55;11075:31;11070:2;11065:3;11061:12;11054:53;11133:2;11128:3;11124:12;11117:19;;10895:247;;;:::o;11148:382::-;;11311:67;11375:2;11370:3;11311:67;:::i;:::-;11304:74;;11408:34;11404:1;11399:3;11395:11;11388:55;11474:20;11469:2;11464:3;11460:12;11453:42;11521:2;11516:3;11512:12;11505:19;;11294:236;;;:::o;11536:370::-;;11699:67;11763:2;11758:3;11699:67;:::i;:::-;11692:74;;11796:34;11792:1;11787:3;11783:11;11776:55;11862:8;11857:2;11852:3;11848:12;11841:30;11897:2;11892:3;11888:12;11881:19;;11682:224;;;:::o;11912:326::-;;12075:67;12139:2;12134:3;12075:67;:::i;:::-;12068:74;;12172:30;12168:1;12163:3;12159:11;12152:51;12229:2;12224:3;12220:12;12213:19;;12058:180;;;:::o;12244:325::-;;12407:67;12471:2;12466:3;12407:67;:::i;:::-;12400:74;;12504:29;12500:1;12495:3;12491:11;12484:50;12560:2;12555:3;12551:12;12544:19;;12390:179;;;:::o;12575:322::-;;12738:67;12802:2;12797:3;12738:67;:::i;:::-;12731:74;;12835:26;12831:1;12826:3;12822:11;12815:47;12888:2;12883:3;12879:12;12872:19;;12721:176;;;:::o;12903:330::-;;13066:67;13130:2;13125:3;13066:67;:::i;:::-;13059:74;;13163:34;13159:1;13154:3;13150:11;13143:55;13224:2;13219:3;13215:12;13208:19;;13049:184;;;:::o;13239:368::-;;13402:67;13466:2;13461:3;13402:67;:::i;:::-;13395:74;;13499:34;13495:1;13490:3;13486:11;13479:55;13565:6;13560:2;13555:3;13551:12;13544:28;13598:2;13593:3;13589:12;13582:19;;13385:222;;;:::o;13613:323::-;;13776:67;13840:2;13835:3;13776:67;:::i;:::-;13769:74;;13873:27;13869:1;13864:3;13860:11;13853:48;13927:2;13922:3;13918:12;13911:19;;13759:177;;;:::o;13942:310::-;;14105:67;14169:2;14164:3;14105:67;:::i;:::-;14098:74;;14202:14;14198:1;14193:3;14189:11;14182:35;14243:2;14238:3;14234:12;14227:19;;14088:164;;;:::o;14258:329::-;;14421:67;14485:2;14480:3;14421:67;:::i;:::-;14414:74;;14518:33;14514:1;14509:3;14505:11;14498:54;14578:2;14573:3;14569:12;14562:19;;14404:183;;;:::o;14593:377::-;;14756:67;14820:2;14815:3;14756:67;:::i;:::-;14749:74;;14853:34;14849:1;14844:3;14840:11;14833:55;14919:15;14914:2;14909:3;14905:12;14898:37;14961:2;14956:3;14952:12;14945:19;;14739:231;;;:::o;14976:328::-;;15139:67;15203:2;15198:3;15139:67;:::i;:::-;15132:74;;15236:32;15232:1;15227:3;15223:11;15216:53;15295:2;15290:3;15286:12;15279:19;;15122:182;;;:::o;15310:370::-;;15473:67;15537:2;15532:3;15473:67;:::i;:::-;15466:74;;15570:34;15566:1;15561:3;15557:11;15550:55;15636:8;15631:2;15626:3;15622:12;15615:30;15671:2;15666:3;15662:12;15655:19;;15456:224;;;:::o;15686:376::-;;15849:67;15913:2;15908:3;15849:67;:::i;:::-;15842:74;;15946:34;15942:1;15937:3;15933:11;15926:55;16012:14;16007:2;16002:3;15998:12;15991:36;16053:2;16048:3;16044:12;16037:19;;15832:230;;;:::o;16068:313::-;;16231:67;16295:2;16290:3;16231:67;:::i;:::-;16224:74;;16328:17;16324:1;16319:3;16315:11;16308:38;16372:2;16367:3;16363:12;16356:19;;16214:167;;;:::o;16387:324::-;;16550:67;16614:2;16609:3;16550:67;:::i;:::-;16543:74;;16647:28;16643:1;16638:3;16634:11;16627:49;16702:2;16697:3;16693:12;16686:19;;16533:178;;;:::o;16717:365::-;;16880:67;16944:2;16939:3;16880:67;:::i;:::-;16873:74;;16977:34;16973:1;16968:3;16964:11;16957:55;17043:3;17038:2;17033:3;17029:12;17022:25;17073:2;17068:3;17064:12;17057:19;;16863:219;;;:::o;17088:388::-;;17251:67;17315:2;17310:3;17251:67;:::i;:::-;17244:74;;17348:34;17344:1;17339:3;17335:11;17328:55;17414:26;17409:2;17404:3;17400:12;17393:48;17467:2;17462:3;17458:12;17451:19;;17234:242;;;:::o;17482:374::-;;17645:67;17709:2;17704:3;17645:67;:::i;:::-;17638:74;;17742:34;17738:1;17733:3;17729:11;17722:55;17808:12;17803:2;17798:3;17794:12;17787:34;17847:2;17842:3;17838:12;17831:19;;17628:228;;;:::o;17862:328::-;;18025:67;18089:2;18084:3;18025:67;:::i;:::-;18018:74;;18122:32;18118:1;18113:3;18109:11;18102:53;18181:2;18176:3;18172:12;18165:19;;18008:182;;;:::o;18196:366::-;;18359:67;18423:2;18418:3;18359:67;:::i;:::-;18352:74;;18456:34;18452:1;18447:3;18443:11;18436:55;18522:4;18517:2;18512:3;18508:12;18501:26;18553:2;18548:3;18544:12;18537:19;;18342:220;;;:::o;18568:330::-;;18731:67;18795:2;18790:3;18731:67;:::i;:::-;18724:74;;18828:34;18824:1;18819:3;18815:11;18808:55;18889:2;18884:3;18880:12;18873:19;;18714:184;;;:::o;18904:365::-;;19067:67;19131:2;19126:3;19067:67;:::i;:::-;19060:74;;19164:34;19160:1;19155:3;19151:11;19144:55;19230:3;19225:2;19220:3;19216:12;19209:25;19260:2;19255:3;19251:12;19244:19;;19050:219;;;:::o;19275:376::-;;19438:67;19502:2;19497:3;19438:67;:::i;:::-;19431:74;;19535:34;19531:1;19526:3;19522:11;19515:55;19601:14;19596:2;19591:3;19587:12;19580:36;19642:2;19637:3;19633:12;19626:19;;19421:230;;;:::o;19657:330::-;;19820:67;19884:2;19879:3;19820:67;:::i;:::-;19813:74;;19917:34;19913:1;19908:3;19904:11;19897:55;19978:2;19973:3;19969:12;19962:19;;19803:184;;;:::o;19993:373::-;;20156:67;20220:2;20215:3;20156:67;:::i;:::-;20149:74;;20253:34;20249:1;20244:3;20240:11;20233:55;20319:11;20314:2;20309:3;20305:12;20298:33;20357:2;20352:3;20348:12;20341:19;;20139:227;;;:::o;20372:379::-;;20535:67;20599:2;20594:3;20535:67;:::i;:::-;20528:74;;20632:34;20628:1;20623:3;20619:11;20612:55;20698:17;20693:2;20688:3;20684:12;20677:39;20742:2;20737:3;20733:12;20726:19;;20518:233;;;:::o;20757:365::-;;20920:67;20984:2;20979:3;20920:67;:::i;:::-;20913:74;;21017:34;21013:1;21008:3;21004:11;20997:55;21083:3;21078:2;21073:3;21069:12;21062:25;21113:2;21108:3;21104:12;21097:19;;20903:219;;;:::o;21128:385::-;;21291:67;21355:2;21350:3;21291:67;:::i;:::-;21284:74;;21388:34;21384:1;21379:3;21375:11;21368:55;21454:23;21449:2;21444:3;21440:12;21433:45;21504:2;21499:3;21495:12;21488:19;;21274:239;;;:::o;21519:381::-;;21682:67;21746:2;21741:3;21682:67;:::i;:::-;21675:74;;21779:34;21775:1;21770:3;21766:11;21759:55;21845:19;21840:2;21835:3;21831:12;21824:41;21891:2;21886:3;21882:12;21875:19;;21665:235;;;:::o;21906:327::-;;22069:67;22133:2;22128:3;22069:67;:::i;:::-;22062:74;;22166:31;22162:1;22157:3;22153:11;22146:52;22224:2;22219:3;22215:12;22208:19;;22052:181;;;:::o;22239:108::-;22316:24;22334:5;22316:24;:::i;:::-;22311:3;22304:37;22294:53;;:::o;22353:118::-;22440:24;22458:5;22440:24;:::i;:::-;22435:3;22428:37;22418:53;;:::o;22477:271::-;;22629:93;22718:3;22709:6;22629:93;:::i;:::-;22622:100;;22739:3;22732:10;;22611:137;;;;:::o;22754:435::-;;22956:95;23047:3;23038:6;22956:95;:::i;:::-;22949:102;;23068:95;23159:3;23150:6;23068:95;:::i;:::-;23061:102;;23180:3;23173:10;;22938:251;;;;;:::o;23195:222::-;;23326:2;23315:9;23311:18;23303:26;;23339:71;23407:1;23396:9;23392:17;23383:6;23339:71;:::i;:::-;23293:124;;;;:::o;23423:672::-;;23672:3;23661:9;23657:19;23649:27;;23686:87;23770:1;23759:9;23755:17;23746:6;23686:87;:::i;:::-;23783:72;23851:2;23840:9;23836:18;23827:6;23783:72;:::i;:::-;23865;23933:2;23922:9;23918:18;23909:6;23865:72;:::i;:::-;23984:9;23978:4;23974:20;23969:2;23958:9;23954:18;23947:48;24012:76;24083:4;24074:6;24012:76;:::i;:::-;24004:84;;23639:456;;;;;;;:::o;24101:373::-;;24282:2;24271:9;24267:18;24259:26;;24331:9;24325:4;24321:20;24317:1;24306:9;24302:17;24295:47;24359:108;24462:4;24453:6;24359:108;:::i;:::-;24351:116;;24249:225;;;;:::o;24480:210::-;;24605:2;24594:9;24590:18;24582:26;;24618:65;24680:1;24669:9;24665:17;24656:6;24618:65;:::i;:::-;24572:118;;;;:::o;24696:313::-;;24847:2;24836:9;24832:18;24824:26;;24896:9;24890:4;24886:20;24882:1;24871:9;24867:17;24860:47;24924:78;24997:4;24988:6;24924:78;:::i;:::-;24916:86;;24814:195;;;;:::o;25015:419::-;;25219:2;25208:9;25204:18;25196:26;;25268:9;25262:4;25258:20;25254:1;25243:9;25239:17;25232:47;25296:131;25422:4;25296:131;:::i;:::-;25288:139;;25186:248;;;:::o;25440:419::-;;25644:2;25633:9;25629:18;25621:26;;25693:9;25687:4;25683:20;25679:1;25668:9;25664:17;25657:47;25721:131;25847:4;25721:131;:::i;:::-;25713:139;;25611:248;;;:::o;25865:419::-;;26069:2;26058:9;26054:18;26046:26;;26118:9;26112:4;26108:20;26104:1;26093:9;26089:17;26082:47;26146:131;26272:4;26146:131;:::i;:::-;26138:139;;26036:248;;;:::o;26290:419::-;;26494:2;26483:9;26479:18;26471:26;;26543:9;26537:4;26533:20;26529:1;26518:9;26514:17;26507:47;26571:131;26697:4;26571:131;:::i;:::-;26563:139;;26461:248;;;:::o;26715:419::-;;26919:2;26908:9;26904:18;26896:26;;26968:9;26962:4;26958:20;26954:1;26943:9;26939:17;26932:47;26996:131;27122:4;26996:131;:::i;:::-;26988:139;;26886:248;;;:::o;27140:419::-;;27344:2;27333:9;27329:18;27321:26;;27393:9;27387:4;27383:20;27379:1;27368:9;27364:17;27357:47;27421:131;27547:4;27421:131;:::i;:::-;27413:139;;27311:248;;;:::o;27565:419::-;;27769:2;27758:9;27754:18;27746:26;;27818:9;27812:4;27808:20;27804:1;27793:9;27789:17;27782:47;27846:131;27972:4;27846:131;:::i;:::-;27838:139;;27736:248;;;:::o;27990:419::-;;28194:2;28183:9;28179:18;28171:26;;28243:9;28237:4;28233:20;28229:1;28218:9;28214:17;28207:47;28271:131;28397:4;28271:131;:::i;:::-;28263:139;;28161:248;;;:::o;28415:419::-;;28619:2;28608:9;28604:18;28596:26;;28668:9;28662:4;28658:20;28654:1;28643:9;28639:17;28632:47;28696:131;28822:4;28696:131;:::i;:::-;28688:139;;28586:248;;;:::o;28840:419::-;;29044:2;29033:9;29029:18;29021:26;;29093:9;29087:4;29083:20;29079:1;29068:9;29064:17;29057:47;29121:131;29247:4;29121:131;:::i;:::-;29113:139;;29011:248;;;:::o;29265:419::-;;29469:2;29458:9;29454:18;29446:26;;29518:9;29512:4;29508:20;29504:1;29493:9;29489:17;29482:47;29546:131;29672:4;29546:131;:::i;:::-;29538:139;;29436:248;;;:::o;29690:419::-;;29894:2;29883:9;29879:18;29871:26;;29943:9;29937:4;29933:20;29929:1;29918:9;29914:17;29907:47;29971:131;30097:4;29971:131;:::i;:::-;29963:139;;29861:248;;;:::o;30115:419::-;;30319:2;30308:9;30304:18;30296:26;;30368:9;30362:4;30358:20;30354:1;30343:9;30339:17;30332:47;30396:131;30522:4;30396:131;:::i;:::-;30388:139;;30286:248;;;:::o;30540:419::-;;30744:2;30733:9;30729:18;30721:26;;30793:9;30787:4;30783:20;30779:1;30768:9;30764:17;30757:47;30821:131;30947:4;30821:131;:::i;:::-;30813:139;;30711:248;;;:::o;30965:419::-;;31169:2;31158:9;31154:18;31146:26;;31218:9;31212:4;31208:20;31204:1;31193:9;31189:17;31182:47;31246:131;31372:4;31246:131;:::i;:::-;31238:139;;31136:248;;;:::o;31390:419::-;;31594:2;31583:9;31579:18;31571:26;;31643:9;31637:4;31633:20;31629:1;31618:9;31614:17;31607:47;31671:131;31797:4;31671:131;:::i;:::-;31663:139;;31561:248;;;:::o;31815:419::-;;32019:2;32008:9;32004:18;31996:26;;32068:9;32062:4;32058:20;32054:1;32043:9;32039:17;32032:47;32096:131;32222:4;32096:131;:::i;:::-;32088:139;;31986:248;;;:::o;32240:419::-;;32444:2;32433:9;32429:18;32421:26;;32493:9;32487:4;32483:20;32479:1;32468:9;32464:17;32457:47;32521:131;32647:4;32521:131;:::i;:::-;32513:139;;32411:248;;;:::o;32665:419::-;;32869:2;32858:9;32854:18;32846:26;;32918:9;32912:4;32908:20;32904:1;32893:9;32889:17;32882:47;32946:131;33072:4;32946:131;:::i;:::-;32938:139;;32836:248;;;:::o;33090:419::-;;33294:2;33283:9;33279:18;33271:26;;33343:9;33337:4;33333:20;33329:1;33318:9;33314:17;33307:47;33371:131;33497:4;33371:131;:::i;:::-;33363:139;;33261:248;;;:::o;33515:419::-;;33719:2;33708:9;33704:18;33696:26;;33768:9;33762:4;33758:20;33754:1;33743:9;33739:17;33732:47;33796:131;33922:4;33796:131;:::i;:::-;33788:139;;33686:248;;;:::o;33940:419::-;;34144:2;34133:9;34129:18;34121:26;;34193:9;34187:4;34183:20;34179:1;34168:9;34164:17;34157:47;34221:131;34347:4;34221:131;:::i;:::-;34213:139;;34111:248;;;:::o;34365:419::-;;34569:2;34558:9;34554:18;34546:26;;34618:9;34612:4;34608:20;34604:1;34593:9;34589:17;34582:47;34646:131;34772:4;34646:131;:::i;:::-;34638:139;;34536:248;;;:::o;34790:419::-;;34994:2;34983:9;34979:18;34971:26;;35043:9;35037:4;35033:20;35029:1;35018:9;35014:17;35007:47;35071:131;35197:4;35071:131;:::i;:::-;35063:139;;34961:248;;;:::o;35215:419::-;;35419:2;35408:9;35404:18;35396:26;;35468:9;35462:4;35458:20;35454:1;35443:9;35439:17;35432:47;35496:131;35622:4;35496:131;:::i;:::-;35488:139;;35386:248;;;:::o;35640:419::-;;35844:2;35833:9;35829:18;35821:26;;35893:9;35887:4;35883:20;35879:1;35868:9;35864:17;35857:47;35921:131;36047:4;35921:131;:::i;:::-;35913:139;;35811:248;;;:::o;36065:419::-;;36269:2;36258:9;36254:18;36246:26;;36318:9;36312:4;36308:20;36304:1;36293:9;36289:17;36282:47;36346:131;36472:4;36346:131;:::i;:::-;36338:139;;36236:248;;;:::o;36490:419::-;;36694:2;36683:9;36679:18;36671:26;;36743:9;36737:4;36733:20;36729:1;36718:9;36714:17;36707:47;36771:131;36897:4;36771:131;:::i;:::-;36763:139;;36661:248;;;:::o;36915:419::-;;37119:2;37108:9;37104:18;37096:26;;37168:9;37162:4;37158:20;37154:1;37143:9;37139:17;37132:47;37196:131;37322:4;37196:131;:::i;:::-;37188:139;;37086:248;;;:::o;37340:419::-;;37544:2;37533:9;37529:18;37521:26;;37593:9;37587:4;37583:20;37579:1;37568:9;37564:17;37557:47;37621:131;37747:4;37621:131;:::i;:::-;37613:139;;37511:248;;;:::o;37765:419::-;;37969:2;37958:9;37954:18;37946:26;;38018:9;38012:4;38008:20;38004:1;37993:9;37989:17;37982:47;38046:131;38172:4;38046:131;:::i;:::-;38038:139;;37936:248;;;:::o;38190:419::-;;38394:2;38383:9;38379:18;38371:26;;38443:9;38437:4;38433:20;38429:1;38418:9;38414:17;38407:47;38471:131;38597:4;38471:131;:::i;:::-;38463:139;;38361:248;;;:::o;38615:419::-;;38819:2;38808:9;38804:18;38796:26;;38868:9;38862:4;38858:20;38854:1;38843:9;38839:17;38832:47;38896:131;39022:4;38896:131;:::i;:::-;38888:139;;38786:248;;;:::o;39040:419::-;;39244:2;39233:9;39229:18;39221:26;;39293:9;39287:4;39283:20;39279:1;39268:9;39264:17;39257:47;39321:131;39447:4;39321:131;:::i;:::-;39313:139;;39211:248;;;:::o;39465:419::-;;39669:2;39658:9;39654:18;39646:26;;39718:9;39712:4;39708:20;39704:1;39693:9;39689:17;39682:47;39746:131;39872:4;39746:131;:::i;:::-;39738:139;;39636:248;;;:::o;39890:222::-;;40021:2;40010:9;40006:18;39998:26;;40034:71;40102:1;40091:9;40087:17;40078:6;40034:71;:::i;:::-;39988:124;;;;:::o;40118:278::-;;40184:2;40178:9;40168:19;;40226:4;40218:6;40214:17;40333:6;40321:10;40318:22;40297:18;40285:10;40282:34;40279:62;40276:2;;;40344:13;;:::i;:::-;40276:2;40379:10;40375:2;40368:22;40158:238;;;;:::o;40402:326::-;;40553:18;40545:6;40542:30;40539:2;;;40575:13;;:::i;:::-;40539:2;40655:4;40651:9;40644:4;40636:6;40632:17;40628:33;40620:41;;40716:4;40710;40706:15;40698:23;;40468:260;;;:::o;40734:327::-;;40886:18;40878:6;40875:30;40872:2;;;40908:13;;:::i;:::-;40872:2;40988:4;40984:9;40977:4;40969:6;40965:17;40961:33;40953:41;;41049:4;41043;41039:15;41031:23;;40801:260;;;:::o;41067:132::-;;41157:3;41149:11;;41187:4;41182:3;41178:14;41170:22;;41139:60;;;:::o;41205:114::-;;41306:5;41300:12;41290:22;;41279:40;;;:::o;41325:98::-;;41410:5;41404:12;41394:22;;41383:40;;;:::o;41429:99::-;;41515:5;41509:12;41499:22;;41488:40;;;:::o;41534:113::-;;41636:4;41631:3;41627:14;41619:22;;41609:38;;;:::o;41653:184::-;;41786:6;41781:3;41774:19;41826:4;41821:3;41817:14;41802:29;;41764:73;;;;:::o;41843:168::-;;41960:6;41955:3;41948:19;42000:4;41995:3;41991:14;41976:29;;41938:73;;;;:::o;42017:147::-;;42155:3;42140:18;;42130:34;;;;:::o;42170:169::-;;42288:6;42283:3;42276:19;42328:4;42323:3;42319:14;42304:29;;42266:73;;;;:::o;42345:148::-;;42484:3;42469:18;;42459:34;;;;:::o;42499:96::-;;42565:24;42583:5;42565:24;:::i;:::-;42554:35;;42544:51;;;:::o;42601:104::-;;42675:24;42693:5;42675:24;:::i;:::-;42664:35;;42654:51;;;:::o;42711:90::-;;42788:5;42781:13;42774:21;42763:32;;42753:48;;;:::o;42807:149::-;;42883:66;42876:5;42872:78;42861:89;;42851:105;;;:::o;42962:126::-;;43039:42;43032:5;43028:54;43017:65;;43007:81;;;:::o;43094:77::-;;43160:5;43149:16;;43139:32;;;:::o;43177:154::-;43261:6;43256:3;43251;43238:30;43323:1;43314:6;43309:3;43305:16;43298:27;43228:103;;;:::o;43337:307::-;43405:1;43415:113;43429:6;43426:1;43423:13;43415:113;;;43514:1;43509:3;43505:11;43499:18;43495:1;43490:3;43486:11;43479:39;43451:2;43448:1;43444:10;43439:15;;43415:113;;;43546:6;43543:1;43540:13;43537:2;;;43626:1;43617:6;43612:3;43608:16;43601:27;43537:2;43386:258;;;;:::o;43650:48::-;43683:9;43704:102;;43796:2;43792:7;43787:2;43780:5;43776:14;43772:28;43762:38;;43752:54;;;:::o;43812:122::-;43885:24;43903:5;43885:24;:::i;:::-;43878:5;43875:35;43865:2;;43924:1;43921;43914:12;43865:2;43855:79;:::o;43940:116::-;44010:21;44025:5;44010:21;:::i;:::-;44003:5;44000:32;43990:2;;44046:1;44043;44036:12;43990:2;43980:76;:::o;44062:120::-;44134:23;44151:5;44134:23;:::i;:::-;44127:5;44124:34;44114:2;;44172:1;44169;44162:12;44114:2;44104:78;:::o;44188:122::-;44261:24;44279:5;44261:24;:::i;:::-;44254:5;44251:35;44241:2;;44300:1;44297;44290:12;44241:2;44231:79;:::o

Swarm Source

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