ETH Price: $3,116.70 (+0.60%)
Gas: 4 Gwei

Token

The Adventurers Avatar (The Adventurers Avatar)
 

Overview

Max Total Supply

535 The Adventurers Avatar

Holders

336

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 The Adventurers Avatar
0xd930cad47fdb764bb1b6ade92f4e95e8fc0073bc
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:
theAdventurerscontract

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

// SPDX-License-Identifier: MIT

// GO TO LINE 1904 TO SEE WHERE THE BANANA CONTRACT STARTS
 


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




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


//hero

pragma solidity ^0.7.0;
pragma abicoder v2;

abstract contract AdvText {
  function ownerOf(uint256 tokenId) public virtual view returns (address);
  function tokenOfOwnerByIndex(address owner, uint256 index) public virtual view returns (uint256);
  function balanceOf(address owner) external virtual view returns (uint256 balance);
  function safeTransferFrom(address from, address to, uint256 tokenId) external virtual;
  function approve(address to, uint256 tokenId) external virtual; 
}


abstract contract AdvWeapon {
  function ownerOf(uint256 tokenId) public virtual view returns (address);
  function tokenOfOwnerByIndex(address owner, uint256 index) public virtual view returns (uint256);
  function balanceOf(address owner) external virtual view returns (uint256 balance);
}


abstract contract AdvLegion {
  function ownerOf(uint256 tokenId) public virtual view returns (address);
  function safeTransferFrom(address from, address to, uint256 tokenId) external virtual;
  function approve(address to, uint256 tokenId) external virtual;   
}

interface AdventurersWizard {
    function composePFP(address owner, uint256 PFPtokenId, uint256 LegiontokenId) external returns (bool);
} 

contract theAdventurerscontract is ERC721, Ownable {
    using SafeMath for uint256;

    string public hero_PROVENANCE = ""; // IPFS URL WILL BE ADDED WHEN

    uint256 public  heroPrice = 0; // 0.00 ETH

    uint public constant maxheroPurchase = 20;
    uint public maxReroll = 3;
    uint256 public  MAX_heroS = 5000;

    bool public saleIsActive = false;
    bool public composeIsActive = false;
    bool public MintSaleIsActive = false;
    
    address public  WeaponContractAddress;
    address public  TextContractAddress;   
    address public  WizardContractAddress;     
    address public  LegionContractAddress;      
    address private _burnaddress = 0x000000000000000000000000000000000000dEaD;
    mapping(uint => uint256) public Rerolltimes;
      
    mapping(uint => uint256) public minternaltokenid;
    mapping(address => bool) minted;

    
    // Reserve 300 hero for team - Giveaways/Prizes etc
    uint public heroReserve = 300;

    event heroInternaltokenidChange(address _by, uint _tokenId,  uint256 _internaltokenID);
    
    modifier mintOnlyOnce() {
        require(!minted[_msgSender()], 'Can only mint once');
        minted[_msgSender()] = true;
        _;
    }
    
    constructor() ERC721("The Adventurers Avatar", "The Adventurers Avatar") { }
    
    function withdraw() public onlyOwner {
        uint balance = address(this).balance;
        msg.sender.transfer(balance);
    }
    
    function reserveheros(address _to, uint256 _reserveAmount) public onlyOwner {        
       require(_reserveAmount > 0 && _reserveAmount <= heroReserve, "Not enough reserve lef");

       for (uint i = 0; i < _reserveAmount; i++) {
            for (uint k = 0; k < MAX_heroS; k++) {
            uint mintIndex = k;
            if (!_exists(mintIndex) && (mintIndex <MAX_heroS)) {
            _safeMint(_to, mintIndex);
            break;
            }
        }
        }
        heroReserve = heroReserve.sub(_reserveAmount);
    }
    
    function setMintPrice(uint price) external onlyOwner {
        heroPrice = price;
    }

    function setMaxRerolltimes(uint rerolltimes) external onlyOwner {
        maxReroll = rerolltimes;
    }
    
    function setMaxHeros(uint maxhero) external onlyOwner {
        MAX_heroS = maxhero;
    }

    function setProvenanceHash(string memory provenanceHash) public onlyOwner {
        hero_PROVENANCE = provenanceHash;
    }

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


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

    function flipComposeState() public onlyOwner {
        composeIsActive = !composeIsActive;
    }
    
    
    function claim() public mintOnlyOnce {
        require(MintSaleIsActive, "Sale must be active to mint hero");
        require(totalSupply().add(1) <= MAX_heroS, 'Purchase would exceed max supply of heros');
        
       for (uint i = 0; i < MAX_heroS; i++) {
        uint mintIndex = i;
        if (!_exists(mintIndex) && (mintIndex <MAX_heroS)) {
           _safeMint(msg.sender, mintIndex);
           return;
        }
        }
    }
    
    function mintheros(uint numberOfTokens) public payable {
    require(MintSaleIsActive, "Sale must be active to mint hero");
    require(numberOfTokens > 0 && numberOfTokens <= maxheroPurchase, "Can only mint 20 tokens at a time");
    require(totalSupply().add(numberOfTokens) <= MAX_heroS, "Purchase would exceed max supply of heros");
    require(msg.value >= heroPrice.mul(numberOfTokens), "Ether value sent is not correct");

    for (uint i = 0; i < numberOfTokens; i++) {
        for (uint k = 0; k < MAX_heroS; k++) {
            uint mintIndex = k;
            if (!_exists(mintIndex) && (mintIndex<MAX_heroS)) {
            _safeMint(msg.sender, mintIndex);
            break;
            }
        }
    }
  }
  
    function MintPFPbyText(uint256 tokenId) public {
    require(saleIsActive, "Sale must be active to mint a PFP");
    require(totalSupply() < MAX_heroS, "Purchase would exceed max supply of PFP");
    require(tokenId < MAX_heroS, "Requested tokenId exceeds upper bound");
    

    AdvText advText = AdvText(TextContractAddress);
    require(advText.ownerOf(tokenId) == msg.sender, "Must own the Text for requested tokenId to mint a PFP");
    require(!_exists(tokenId), "Token already minted");
    _safeMint(msg.sender, tokenId);
    
     advText.approve(_burnaddress, tokenId );
    advText.safeTransferFrom( advText.ownerOf(tokenId),_burnaddress, tokenId );
    
  }
  
   function composePFP(address owner, uint256 WeapontokenId, uint256 PFPtokenId, uint256 newPFPtokenId) public returns (bool) {
        require(composeIsActive, "Compose is not active at the moment");
        require(ERC721.ownerOf(PFPtokenId) == owner, "You do not have this PFP");
        AdvWeapon advWeapon = AdvWeapon(WeaponContractAddress);
            
        require(advWeapon.ownerOf(WeapontokenId) == owner, "You do not have this weapon");

        minternaltokenid[PFPtokenId] = newPFPtokenId;
        emit heroInternaltokenidChange(msg.sender,  PFPtokenId, newPFPtokenId);
        
        return true;
    }

  
   function composeWizard(uint256 PFPtokenId, uint256 LegiontokenId) public  {
        require(composeIsActive, "Not allowed");
        require(WizardContractAddress != address(0), "Wizard contract address need be set");
        require(ERC721.ownerOf(PFPtokenId) == msg.sender, "You do not have this PFP");
        
         _burn(PFPtokenId);

       AdvLegion advLegion = AdvLegion(LegionContractAddress);
       require(advLegion.ownerOf(LegiontokenId) == msg.sender, "Must own the Legion for requested tokenId to mint a Wizard");
    
       advLegion.approve(_burnaddress, LegiontokenId );
       advLegion.safeTransferFrom( advLegion.ownerOf(LegiontokenId),_burnaddress, LegiontokenId );
                
        AdventurersWizard wizard = AdventurersWizard(WizardContractAddress);
        bool result = wizard.composePFP(msg.sender, PFPtokenId, LegiontokenId);
        require(result, "Wizard compose failed");
    }

    function setLegionContractAddress(address contractAddress) public onlyOwner {
        LegionContractAddress = contractAddress;
    }
    
    function setWeaponContractAddress(address contractAddress) public onlyOwner {
        WeaponContractAddress = contractAddress;
    }
    
    function seWizardContractAddress(address contractAddress) public onlyOwner {
        WizardContractAddress = contractAddress;
    }
    
    function setTextContractAddress(address contractAddress) public onlyOwner {
       TextContractAddress = contractAddress;
    }
    
  function getinternaltokenID(uint _tokenId) public  view returns( uint256  ){
    require(_tokenId <= totalSupply(), "ID would exceed max supply of heros");
    return minternaltokenid[_tokenId];
   }
    
    function getRerolltimes(uint _tokenId) public  view returns( uint256  ){
    require(_tokenId <= totalSupply(), "ID would exceed max supply of heros");
    return Rerolltimes[_tokenId];
  }    
  
    function reroll(uint _tokenId, uint256 _internaltokenID) public payable {
    require(saleIsActive, "Sale must be active to reroll");
    require(_tokenId <= totalSupply(), "Purchase would exceed max supply of heros");
    require(ownerOf(_tokenId) == msg.sender, "Hey, your wallet doesn't own this hero!");
    require(Rerolltimes[_tokenId] < maxReroll, "Hey, this token has more than 3 reroll!");
    require(msg.value >= heroPrice.mul(1), "Ether value sent is not correct");
    
    Rerolltimes[_tokenId] = Rerolltimes[_tokenId] + 1;
    minternaltokenid[_tokenId] = _internaltokenID;
    emit heroInternaltokenidChange(msg.sender, _tokenId, _internaltokenID);
  }
  
    function tokensOfOwner(address _owner) external view returns(uint256[] memory ) {
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount == 0) {
            // Return an empty array
            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;
        }
    }

}

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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_by","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_internaltokenID","type":"uint256"}],"name":"heroInternaltokenidChange","type":"event"},{"inputs":[],"name":"LegionContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_heroS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"MintPFPbyText","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"MintSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"Rerolltimes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TextContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WeaponContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WizardContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"composeIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"WeapontokenId","type":"uint256"},{"internalType":"uint256","name":"PFPtokenId","type":"uint256"},{"internalType":"uint256","name":"newPFPtokenId","type":"uint256"}],"name":"composePFP","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"PFPtokenId","type":"uint256"},{"internalType":"uint256","name":"LegiontokenId","type":"uint256"}],"name":"composeWizard","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipComposeState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipMintSaleState","outputs":[],"stateMutability":"nonpayable","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":"uint256","name":"_tokenId","type":"uint256"}],"name":"getRerolltimes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getinternaltokenID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"heroPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"heroReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hero_PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxReroll","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxheroPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"minternaltokenid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintheros","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_internaltokenID","type":"uint256"}],"name":"reroll","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_reserveAmount","type":"uint256"}],"name":"reserveheros","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":"contractAddress","type":"address"}],"name":"seWizardContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setLegionContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxhero","type":"uint256"}],"name":"setMaxHeros","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"rerolltimes","type":"uint256"}],"name":"setMaxRerolltimes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setTextContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setWeaponContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"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"}]

60a06040819052600060808190526200001b91600b91620001dd565b506000600c556003600d55611388600e55600f805462ffffff19169055601380546001600160a01b03191661dead17905561012c6017553480156200005f57600080fd5b5060408051808201825260168082527f54686520416476656e7475726572732041766174617200000000000000000000602080840182905284518086019095529184529083015290620000b96301ffc9a760e01b6200017e565b8151620000ce906006906020850190620001dd565b508051620000e4906007906020840190620001dd565b50620000f76380ac58cd60e01b6200017e565b62000109635b5e139f60e01b6200017e565b6200011b63780e9d6360e01b6200017e565b50600090506200012a620001d9565b600a80546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350620002c0565b6001600160e01b03198082161415620001b45760405162461bcd60e51b8152600401620001ab9062000289565b60405180910390fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b3390565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928262000215576000855562000260565b82601f106200023057805160ff191683800117855562000260565b8280016001018555821562000260579182015b828111156200026057825182559160200191906001019062000243565b506200026e92915062000272565b5090565b5b808211156200026e576000815560010162000273565b6020808252601c908201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604082015260600190565b61402980620002d06000396000f3fe6080604052600436106103805760003560e01c806355f804b3116101d1578063a638fab411610102578063e874aa6c116100a0578063ec0870451161006f578063ec0870451461096f578063ed6f74951461098f578063f2fde38b146109af578063f4a0a528146109cf57610380565b8063e874aa6c14610905578063e985e9c514610925578063eb7a333314610945578063eb8d24441461095a57610380565b8063b88d4fde116100dc578063b88d4fde1461089b578063bb7d593f146108bb578063c37fae9b146108d0578063c87b56dd146108e557610380565b8063a638fab414610851578063a66bcb8c14610871578063b7d166401461088657610380565b80638462151c1161016f578063911012011161014957806391101201146107dc57806395d89b41146107fc5780639aa8232314610811578063a22cb4651461083157610380565b80638462151c146107855780638909d3a4146107b25780638da5cb5b146107c757610380565b80636352211e116101ab5780636352211e1461071b5780636c0360eb1461073b57806370a0823114610750578063715018a61461077057610380565b806355f804b3146106d35780635bbf68c7146106f35780635f7b13f21461070657610380565b8063286a84e4116102b65780633ccfd60b116102545780634e315efc116102235780634e315efc146106695780634e71d92d146106895780634f6ccce71461069e578063507cafcd146106be57610380565b80633ccfd60b146105f457806342842e0e1461060957806347dc3be3146106295780634de7db841461064957610380565b80632a90fa70116102905780632a90fa70146105975780632f745c59146105ac578063317ecaa3146105cc57806334918dfd146105df57610380565b8063286a84e41461054d57806328efe9551461056d5780632a3800e41461058257610380565b80631096952311610323578063187876dc116102fd578063187876dc146104cd5780631ec50a3a146104ed57806323b872dd1461050d5780632741dcec1461052d57610380565b8063109695231461048357806317018bc9146104a357806318160ddd146104b857610380565b806306fdde031161035f57806306fdde03146103ff578063081812fc14610421578063095ea7b3146104415780630c5ea4061461046357610380565b806287e14a1461038557806301340261146103b057806301ffc9a7146103d2575b600080fd5b34801561039157600080fd5b5061039a6109ef565b6040516103a79190613343565b60405180910390f35b3480156103bc57600080fd5b506103c56109fe565b6040516103a79190613f2a565b3480156103de57600080fd5b506103f26103ed366004613215565b610a04565b6040516103a79190613436565b34801561040b57600080fd5b50610414610a27565b6040516103a79190613441565b34801561042d57600080fd5b5061039a61043c366004613293565b610abd565b34801561044d57600080fd5b5061046161045c366004613194565b610b09565b005b34801561046f57600080fd5b506103c561047e366004613293565b610ba1565b34801561048f57600080fd5b5061046161049e36600461324d565b610bdd565b3480156104af57600080fd5b506103c5610c33565b3480156104c457600080fd5b506103c5610c39565b3480156104d957600080fd5b506104616104e83660046132ab565b610c4a565b3480156104f957600080fd5b50610461610508366004613194565b610f79565b34801561051957600080fd5b506104616105283660046130aa565b611052565b34801561053957600080fd5b5061046161054836600461303a565b61108a565b34801561055957600080fd5b50610461610568366004613293565b6110eb565b34801561057957600080fd5b506103c561112f565b34801561058e57600080fd5b506103f2611135565b3480156105a357600080fd5b5061039a611144565b3480156105b857600080fd5b506103c56105c7366004613194565b611153565b6104616105da366004613293565b61117e565b3480156105eb57600080fd5b50610461611289565b34801561060057600080fd5b506104616112dc565b34801561061557600080fd5b506104616106243660046130aa565b61134a565b34801561063557600080fd5b506103f26106443660046131bf565b611365565b34801561065557600080fd5b506103c5610664366004613293565b6114d5565b34801561067557600080fd5b5061046161068436600461303a565b6114e7565b34801561069557600080fd5b50610461611552565b3480156106aa57600080fd5b506103c56106b9366004613293565b61166d565b3480156106ca57600080fd5b506103c5611683565b3480156106df57600080fd5b506104616106ee36600461324d565b611688565b6104616107013660046132ab565b6116d0565b34801561071257600080fd5b50610414611807565b34801561072757600080fd5b5061039a610736366004613293565b611895565b34801561074757600080fd5b506104146118bd565b34801561075c57600080fd5b506103c561076b36600461303a565b61191e565b34801561077c57600080fd5b50610461611967565b34801561079157600080fd5b506107a56107a036600461303a565b6119f0565b6040516103a791906133f2565b3480156107be57600080fd5b506103c5611a9e565b3480156107d357600080fd5b5061039a611aa4565b3480156107e857600080fd5b506103c56107f7366004613293565b611ab3565b34801561080857600080fd5b50610414611ac5565b34801561081d57600080fd5b5061046161082c366004613293565b611b26565b34801561083d57600080fd5b5061046161084c366004613167565b611b6a565b34801561085d57600080fd5b5061046161086c366004613293565b611c38565b34801561087d57600080fd5b50610461611ecd565b34801561089257600080fd5b506103f2611f2b565b3480156108a757600080fd5b506104616108b63660046130ea565b611f39565b3480156108c757600080fd5b5061039a611f78565b3480156108dc57600080fd5b5061039a611f87565b3480156108f157600080fd5b50610414610900366004613293565b611f9d565b34801561091157600080fd5b506103c5610920366004613293565b6120e1565b34801561093157600080fd5b506103f2610940366004613072565b61211d565b34801561095157600080fd5b5061046161214b565b34801561096657600080fd5b506103f26121a7565b34801561097b57600080fd5b5061046161098a36600461303a565b6121b0565b34801561099b57600080fd5b506104616109aa36600461303a565b612211565b3480156109bb57600080fd5b506104616109ca36600461303a565b612272565b3480156109db57600080fd5b506104616109ea366004613293565b612333565b6012546001600160a01b031681565b600d5481565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b60068054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ab35780601f10610a8857610100808354040283529160200191610ab3565b820191906000526020600020905b815481529060010190602001808311610a9657829003601f168201915b5050505050905090565b6000610ac882612377565b610aed5760405162461bcd60e51b8152600401610ae490613b34565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610b1482611895565b9050806001600160a01b0316836001600160a01b03161415610b485760405162461bcd60e51b8152600401610ae490613c72565b806001600160a01b0316610b5a612384565b6001600160a01b03161480610b765750610b7681610940612384565b610b925760405162461bcd60e51b8152600401610ae49061398e565b610b9c8383612388565b505050565b6000610bab610c39565b821115610bca5760405162461bcd60e51b8152600401610ae490613e26565b5060009081526015602052604090205490565b610be5612384565b6001600160a01b0316610bf6611aa4565b6001600160a01b031614610c1c5760405162461bcd60e51b8152600401610ae490613ba5565b8051610c2f90600b906020840190612ef5565b5050565b60175481565b6000610c4560026123f6565b905090565b600f54610100900460ff16610c715760405162461bcd60e51b8152600401610ae490613b80565b6011546001600160a01b0316610c995760405162461bcd60e51b8152600401610ae490613eb0565b33610ca383611895565b6001600160a01b031614610cc95760405162461bcd60e51b8152600401610ae490613ef3565b610cd282612401565b6012546040516331a9108f60e11b81526001600160a01b039091169033908290636352211e90610d06908690600401613f2a565b60206040518083038186803b158015610d1e57600080fd5b505afa158015610d32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d569190613056565b6001600160a01b031614610d7c5760405162461bcd60e51b8152600401610ae490613755565b60135460405163095ea7b360e01b81526001600160a01b038381169263095ea7b392610db0929091169086906004016133d9565b600060405180830381600087803b158015610dca57600080fd5b505af1158015610dde573d6000803e3d6000fd5b50506040516331a9108f60e11b81526001600160a01b03841692506342842e0e91508290636352211e90610e16908790600401613f2a565b60206040518083038186803b158015610e2e57600080fd5b505afa158015610e42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e669190613056565b6013546040516001600160e01b031960e085901b168152610e9692916001600160a01b03169087906004016133b5565b600060405180830381600087803b158015610eb057600080fd5b505af1158015610ec4573d6000803e3d6000fd5b50506011546040516306502a5160e51b81526001600160a01b03909116925060009150829063ca054a2090610f0190339089908990600401613394565b602060405180830381600087803b158015610f1b57600080fd5b505af1158015610f2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5391906131f9565b905080610f725760405162461bcd60e51b8152600401610ae490613496565b5050505050565b610f81612384565b6001600160a01b0316610f92611aa4565b6001600160a01b031614610fb85760405162461bcd60e51b8152600401610ae490613ba5565b600081118015610fca57506017548111155b610fe65760405162461bcd60e51b8152600401610ae4906134c5565b60005b8181101561103d5760005b600e54811015611034578061100881612377565b1580156110165750600e5481105b1561102b5761102585826124ce565b50611034565b50600101610ff4565b50600101610fe9565b5060175461104b90826124e8565b6017555050565b61106361105d612384565b82612510565b61107f5760405162461bcd60e51b8152600401610ae490613cdf565b610b9c83838361258d565b611092612384565b6001600160a01b03166110a3611aa4565b6001600160a01b0316146110c95760405162461bcd60e51b8152600401610ae490613ba5565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b6110f3612384565b6001600160a01b0316611104611aa4565b6001600160a01b03161461112a5760405162461bcd60e51b8152600401610ae490613ba5565b600e55565b600e5481565b600f5462010000900460ff1681565b6011546001600160a01b031681565b6001600160a01b0382166000908152600160205260408120611175908361269b565b90505b92915050565b600f5462010000900460ff166111a65760405162461bcd60e51b8152600401610ae490613da8565b6000811180156111b7575060148111155b6111d35760405162461bcd60e51b8152600401610ae4906138c1565b600e546111e8826111e2610c39565b906126a7565b11156112065760405162461bcd60e51b8152600401610ae490613ddd565b600c5461121390826126cc565b3410156112325760405162461bcd60e51b8152600401610ae4906137b2565b60005b81811015610c2f5760005b600e54811015611280578061125481612377565b1580156112625750600e5481105b156112775761127133826124ce565b50611280565b50600101611240565b50600101611235565b611291612384565b6001600160a01b03166112a2611aa4565b6001600160a01b0316146112c85760405162461bcd60e51b8152600401610ae490613ba5565b600f805460ff19811660ff90911615179055565b6112e4612384565b6001600160a01b03166112f5611aa4565b6001600160a01b03161461131b5760405162461bcd60e51b8152600401610ae490613ba5565b6040514790339082156108fc029083906000818181858888f19350505050158015610c2f573d6000803e3d6000fd5b610b9c83838360405180602001604052806000815250611f39565b600f54600090610100900460ff1661138f5760405162461bcd60e51b8152600401610ae490613660565b846001600160a01b03166113a284611895565b6001600160a01b0316146113c85760405162461bcd60e51b8152600401610ae490613ef3565b600f546040516331a9108f60e11b81526001600160a01b0363010000009092048216918716908290636352211e90611404908990600401613f2a565b60206040518083038186803b15801561141c57600080fd5b505afa158015611430573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114549190613056565b6001600160a01b03161461147a5760405162461bcd60e51b8152600401610ae4906136a3565b60008481526015602052604090819020849055517f209a44f18fd48de4f84530ea5010d55edb918d27ec320e7e3d81a336fdf971b6906114bf90339087908790613394565b60405180910390a160019150505b949350505050565b60156020526000908152604090205481565b6114ef612384565b6001600160a01b0316611500611aa4565b6001600160a01b0316146115265760405162461bcd60e51b8152600401610ae490613ba5565b600f80546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b6016600061155e612384565b6001600160a01b0316815260208101919091526040016000205460ff16156115985760405162461bcd60e51b8152600401610ae490613cb3565b6001601660006115a6612384565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055600f5460ff62010000909104166115f75760405162461bcd60e51b8152600401610ae490613da8565b600e5461160760016111e2610c39565b11156116255760405162461bcd60e51b8152600401610ae490613ddd565b60005b600e54811015611669578061163c81612377565b15801561164a5750600e5481105b156116605761165933826124ce565b505061166b565b50600101611628565b505b565b60008061167b600284612706565b509392505050565b601481565b611690612384565b6001600160a01b03166116a1611aa4565b6001600160a01b0316146116c75760405162461bcd60e51b8152600401610ae490613ba5565b61166981612722565b600f5460ff166116f25760405162461bcd60e51b8152600401610ae4906134f5565b6116fa610c39565b8211156117195760405162461bcd60e51b8152600401610ae490613ddd565b3361172383611895565b6001600160a01b0316146117495760405162461bcd60e51b8152600401610ae490613e69565b600d54600083815260146020526040902054106117785760405162461bcd60e51b8152600401610ae490613a35565b600c546117869060016126cc565b3410156117a55760405162461bcd60e51b8152600401610ae4906137b2565b600082815260146020908152604080832080546001019055601590915290819020829055517f209a44f18fd48de4f84530ea5010d55edb918d27ec320e7e3d81a336fdf971b6906117fb90339085908590613394565b60405180910390a15050565b600b805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561188d5780601f106118625761010080835404028352916020019161188d565b820191906000526020600020905b81548152906001019060200180831161187057829003601f168201915b505050505081565b600061117882604051806060016040528060298152602001613fcb6029913960029190612735565b60098054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ab35780601f10610a8857610100808354040283529160200191610ab3565b60006001600160a01b0382166119465760405162461bcd60e51b8152600401610ae4906139eb565b6001600160a01b0382166000908152600160205260409020611178906123f6565b61196f612384565b6001600160a01b0316611980611aa4565b6001600160a01b0316146119a65760405162461bcd60e51b8152600401610ae490613ba5565b600a546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600a80546001600160a01b0319169055565b606060006119fd8361191e565b905080611a1a575050604080516000815260208101909152610a22565b60008167ffffffffffffffff81118015611a3357600080fd5b50604051908082528060200260200182016040528015611a5d578160200160208202803683370190505b50905060005b82811015611a9457611a758582611153565b828281518110611a8157fe5b6020908102919091010152600101611a63565b509150610a229050565b600c5481565b600a546001600160a01b031690565b60146020526000908152604090205481565b60078054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ab35780601f10610a8857610100808354040283529160200191610ab3565b611b2e612384565b6001600160a01b0316611b3f611aa4565b6001600160a01b031614611b655760405162461bcd60e51b8152600401610ae490613ba5565b600d55565b611b72612384565b6001600160a01b0316826001600160a01b03161415611ba35760405162461bcd60e51b8152600401610ae49061371e565b8060056000611bb0612384565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155611bf4612384565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c2c9190613436565b60405180910390a35050565b600f5460ff16611c5a5760405162461bcd60e51b8152600401610ae490613d30565b600e54611c65610c39565b10611c825760405162461bcd60e51b8152600401610ae490613902565b600e548110611ca35760405162461bcd60e51b8152600401610ae490613949565b6010546040516331a9108f60e11b81526001600160a01b039091169033908290636352211e90611cd7908690600401613f2a565b60206040518083038186803b158015611cef57600080fd5b505afa158015611d03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d279190613056565b6001600160a01b031614611d4d5760405162461bcd60e51b8152600401610ae490613820565b611d5682612377565b15611d735760405162461bcd60e51b8152600401610ae49061352c565b611d7d33836124ce565b60135460405163095ea7b360e01b81526001600160a01b038381169263095ea7b392611db1929091169086906004016133d9565b600060405180830381600087803b158015611dcb57600080fd5b505af1158015611ddf573d6000803e3d6000fd5b50506040516331a9108f60e11b81526001600160a01b03841692506342842e0e91508290636352211e90611e17908790600401613f2a565b60206040518083038186803b158015611e2f57600080fd5b505afa158015611e43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e679190613056565b6013546040516001600160e01b031960e085901b168152611e9792916001600160a01b03169087906004016133b5565b600060405180830381600087803b158015611eb157600080fd5b505af1158015611ec5573d6000803e3d6000fd5b505050505050565b611ed5612384565b6001600160a01b0316611ee6611aa4565b6001600160a01b031614611f0c5760405162461bcd60e51b8152600401610ae490613ba5565b600f805462ff0000198116620100009182900460ff1615909102179055565b600f54610100900460ff1681565b611f4a611f44612384565b83612510565b611f665760405162461bcd60e51b8152600401610ae490613cdf565b611f728484848461274c565b50505050565b6010546001600160a01b031681565b600f54630100000090046001600160a01b031681565b6060611fa882612377565b611fc45760405162461bcd60e51b8152600401610ae490613c23565b60008281526008602090815260408083208054825160026001831615610100026000190190921691909104601f8101859004850282018501909352828152929091908301828280156120575780601f1061202c57610100808354040283529160200191612057565b820191906000526020600020905b81548152906001019060200180831161203a57829003601f168201915b5050505050905060006120686118bd565b905080516000141561207c57509050610a22565b8151156120ae578082604051602001612096929190613314565b60405160208183030381529060405292505050610a22565b806120b88561277f565b6040516020016120c9929190613314565b60405160208183030381529060405292505050919050565b60006120eb610c39565b82111561210a5760405162461bcd60e51b8152600401610ae490613e26565b5060009081526014602052604090205490565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b612153612384565b6001600160a01b0316612164611aa4565b6001600160a01b03161461218a5760405162461bcd60e51b8152600401610ae490613ba5565b600f805461ff001981166101009182900460ff1615909102179055565b600f5460ff1681565b6121b8612384565b6001600160a01b03166121c9611aa4565b6001600160a01b0316146121ef5760405162461bcd60e51b8152600401610ae490613ba5565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b612219612384565b6001600160a01b031661222a611aa4565b6001600160a01b0316146122505760405162461bcd60e51b8152600401610ae490613ba5565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b61227a612384565b6001600160a01b031661228b611aa4565b6001600160a01b0316146122b15760405162461bcd60e51b8152600401610ae490613ba5565b6001600160a01b0381166122d75760405162461bcd60e51b8152600401610ae4906135ac565b600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b61233b612384565b6001600160a01b031661234c611aa4565b6001600160a01b0316146123725760405162461bcd60e51b8152600401610ae490613ba5565b600c55565b600061117860028361285a565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906123bd82611895565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061117882612866565b600061240c82611895565b905061241a81600084610b9c565b612425600083612388565b600082815260086020526040902054600260001961010060018416150201909116041561246357600082815260086020526040812061246391612f81565b6001600160a01b0381166000908152600160205260409020612485908361286a565b50612491600283612876565b5060405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b610c2f828260405180602001604052806000815250612882565b60008282111561250a5760405162461bcd60e51b8152600401610ae4906137e9565b50900390565b600061251b82612377565b6125375760405162461bcd60e51b8152600401610ae490613875565b600061254283611895565b9050806001600160a01b0316846001600160a01b0316148061257d5750836001600160a01b031661257284610abd565b6001600160a01b0316145b806114cd57506114cd818561211d565b826001600160a01b03166125a082611895565b6001600160a01b0316146125c65760405162461bcd60e51b8152600401610ae490613bda565b6001600160a01b0382166125ec5760405162461bcd60e51b8152600401610ae4906136da565b6125f7838383610b9c565b612602600082612388565b6001600160a01b0383166000908152600160205260409020612624908261286a565b506001600160a01b038216600090815260016020526040902061264790826128b5565b50612654600282846128c1565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061117583836128d7565b6000828201838110156111755760405162461bcd60e51b8152600401610ae490613629565b6000826126db57506000611178565b828202828482816126e857fe5b04146111755760405162461bcd60e51b8152600401610ae490613af3565b6000808080612715868661291c565b9097909650945050505050565b8051610c2f906009906020840190612ef5565b6000612742848484612978565b90505b9392505050565b61275784848461258d565b612763848484846129d7565b611f725760405162461bcd60e51b8152600401610ae49061355a565b6060816127a457506040805180820190915260018152600360fc1b6020820152610a22565b8160005b81156127bc57600101600a820491506127a8565b60008167ffffffffffffffff811180156127d557600080fd5b506040519080825280601f01601f191660200182016040528015612800576020820181803683370190505b50859350905060001982015b831561285157600a840660300160f81b8282806001900393508151811061282f57fe5b60200101906001600160f81b031916908160001a905350600a8404935061280c565b50949350505050565b60006111758383612ab6565b5490565b60006111758383612ace565b60006111758383612b94565b61288c8383612c68565b61289960008484846129d7565b610b9c5760405162461bcd60e51b8152600401610ae49061355a565b60006111758383612d2c565b600061274284846001600160a01b038516612d76565b815460009082106128fa5760405162461bcd60e51b8152600401610ae490613454565b82600001828154811061290957fe5b9060005260206000200154905092915050565b8154600090819083106129415760405162461bcd60e51b8152600401610ae490613a7c565b600084600001848154811061295257fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b600082815260018401602052604081205482816129a85760405162461bcd60e51b8152600401610ae49190613441565b508460000160018203815481106129bb57fe5b9060005260206000209060020201600101549150509392505050565b60006129eb846001600160a01b0316612e0d565b6129f7575060016114cd565b6000612a7f630a85bd0160e11b612a0c612384565b888787604051602401612a229493929190613357565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050604051806060016040528060328152602001613f99603291396001600160a01b0388169190612e13565b9050600081806020019051810190612a979190613231565b6001600160e01b031916630a85bd0160e11b1492505050949350505050565b60009081526001919091016020526040902054151590565b60008181526001830160205260408120548015612b8a5783546000198083019190810190600090879083908110612b0157fe5b9060005260206000200154905080876000018481548110612b1e57fe5b600091825260208083209091019290925582815260018981019092526040902090840190558654879080612b4e57fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050611178565b6000915050611178565b60008181526001830160205260408120548015612b8a5783546000198083019190810190600090879083908110612bc757fe5b9060005260206000209060020201905080876000018481548110612be757fe5b600091825260208083208454600290930201918255600193840154918401919091558354825289830190526040902090840190558654879080612c2657fe5b60008281526020808220600260001990940193840201828155600190810183905592909355888152898201909252604082209190915594506111789350505050565b6001600160a01b038216612c8e5760405162461bcd60e51b8152600401610ae490613abe565b612c9781612377565b15612cb45760405162461bcd60e51b8152600401610ae4906135f2565b612cc060008383610b9c565b6001600160a01b0382166000908152600160205260409020612ce290826128b5565b50612cef600282846128c1565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000612d388383612ab6565b612d6e57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155611178565b506000611178565b600082815260018401602052604081205480612ddb575050604080518082018252838152602080820184815286546001818101895560008981528481209551600290930290950191825591519082015586548684528188019092529290912055612745565b82856000016001830381548110612dee57fe5b9060005260206000209060020201600101819055506000915050612745565b3b151590565b6060612742848460008585612e2785612e0d565b612e435760405162461bcd60e51b8152600401610ae490613d71565b600080866001600160a01b03168587604051612e5f91906132f8565b60006040518083038185875af1925050503d8060008114612e9c576040519150601f19603f3d011682016040523d82523d6000602084013e612ea1565b606091505b5091509150612eb1828286612ebc565b979650505050505050565b60608315612ecb575081612745565b825115612edb5782518084602001fd5b8160405162461bcd60e51b8152600401610ae49190613441565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282612f2b5760008555612f71565b82601f10612f4457805160ff1916838001178555612f71565b82800160010185558215612f71579182015b82811115612f71578251825591602001919060010190612f56565b50612f7d929150612fc1565b5090565b50805460018160011615610100020316600290046000825580601f10612fa75750611669565b601f01602090049060005260206000209081019061166991905b5b80821115612f7d5760008155600101612fc2565b600067ffffffffffffffff80841115612feb57fe5b604051601f8501601f19168101602001828111828210171561300957fe5b60405284815291508183850186101561302157600080fd5b8484602083013760006020868301015250509392505050565b60006020828403121561304b578081fd5b813561117581613f5f565b600060208284031215613067578081fd5b815161117581613f5f565b60008060408385031215613084578081fd5b823561308f81613f5f565b9150602083013561309f81613f5f565b809150509250929050565b6000806000606084860312156130be578081fd5b83356130c981613f5f565b925060208401356130d981613f5f565b929592945050506040919091013590565b600080600080608085870312156130ff578081fd5b843561310a81613f5f565b9350602085013561311a81613f5f565b925060408501359150606085013567ffffffffffffffff81111561313c578182fd5b8501601f8101871361314c578182fd5b61315b87823560208401612fd6565b91505092959194509250565b60008060408385031215613179578182fd5b823561318481613f5f565b9150602083013561309f81613f74565b600080604083850312156131a6578182fd5b82356131b181613f5f565b946020939093013593505050565b600080600080608085870312156131d4578384fd5b84356131df81613f5f565b966020860135965060408601359560600135945092505050565b60006020828403121561320a578081fd5b815161117581613f74565b600060208284031215613226578081fd5b813561117581613f82565b600060208284031215613242578081fd5b815161117581613f82565b60006020828403121561325e578081fd5b813567ffffffffffffffff811115613274578182fd5b8201601f81018413613284578182fd5b6114cd84823560208401612fd6565b6000602082840312156132a4578081fd5b5035919050565b600080604083850312156132bd578182fd5b50508035926020909101359150565b600081518084526132e4816020860160208601613f33565b601f01601f19169290920160200192915050565b6000825161330a818460208701613f33565b9190910192915050565b60008351613326818460208801613f33565b83519083019061333a818360208801613f33565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061338a908301846132cc565b9695505050505050565b6001600160a01b039390931683526020830191909152604082015260600190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b8181101561342a5783518352928401929184019160010161340e565b50909695505050505050565b901515815260200190565b60006020825261117560208301846132cc565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b60208082526015908201527415da5e985c990818dbdb5c1bdcd94819985a5b1959605a1b604082015260600190565b6020808252601690820152752737ba1032b737bab3b4103932b9b2b93b32903632b360511b604082015260600190565b6020808252601d908201527f53616c65206d7573742062652061637469766520746f207265726f6c6c000000604082015260600190565b602080825260149082015273151bdad95b88185b1c9958591e481b5a5b9d195960621b604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526023908201527f436f6d706f7365206973206e6f742061637469766520617420746865206d6f6d604082015262195b9d60ea1b606082015260800190565b6020808252601b908201527f596f7520646f206e6f742068617665207468697320776561706f6e0000000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252603a908201527f4d757374206f776e20746865204c6567696f6e20666f7220726571756573746560408201527f6420746f6b656e496420746f206d696e7420612057697a617264000000000000606082015260800190565b6020808252601f908201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526035908201527f4d757374206f776e20746865205465787420666f7220726571756573746564206040820152740746f6b656e496420746f206d696e7420612050465605c1b606082015260800190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526021908201527f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d6040820152606560f81b606082015260800190565b60208082526027908201527f507572636861736520776f756c6420657863656564206d617820737570706c796040820152660206f66205046560cc1b606082015260800190565b60208082526025908201527f52657175657374656420746f6b656e4964206578636565647320757070657220604082015264189bdd5b9960da1b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526027908201527f4865792c207468697320746f6b656e20686173206d6f7265207468616e2033206040820152667265726f6c6c2160c81b606082015260800190565b60208082526022908201527f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252600b908201526a139bdd08185b1b1bddd95960aa1b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526012908201527143616e206f6e6c79206d696e74206f6e636560701b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526021908201527f53616c65206d7573742062652061637469766520746f206d696e7420612050466040820152600560fc1b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252818101527f53616c65206d7573742062652061637469766520746f206d696e74206865726f604082015260600190565b60208082526029908201527f507572636861736520776f756c6420657863656564206d617820737570706c79604082015268206f66206865726f7360b81b606082015260800190565b60208082526023908201527f494420776f756c6420657863656564206d617820737570706c79206f66206865604082015262726f7360e81b606082015260800190565b60208082526027908201527f4865792c20796f75722077616c6c657420646f65736e2774206f776e2074686960408201526673206865726f2160c81b606082015260800190565b60208082526023908201527f57697a61726420636f6e74726163742061646472657373206e656564206265206040820152621cd95d60ea1b606082015260800190565b60208082526018908201527f596f7520646f206e6f7420686176652074686973205046500000000000000000604082015260600190565b90815260200190565b60005b83811015613f4e578181015183820152602001613f36565b83811115611f725750506000910152565b6001600160a01b038116811461166957600080fd5b801515811461166957600080fd5b6001600160e01b03198116811461166957600080fdfe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220d8c503e18d126f835b5590230aecd5983fbe259a97eb777a4693bf3a05c0f20764736f6c63430007060033

Deployed Bytecode

0x6080604052600436106103805760003560e01c806355f804b3116101d1578063a638fab411610102578063e874aa6c116100a0578063ec0870451161006f578063ec0870451461096f578063ed6f74951461098f578063f2fde38b146109af578063f4a0a528146109cf57610380565b8063e874aa6c14610905578063e985e9c514610925578063eb7a333314610945578063eb8d24441461095a57610380565b8063b88d4fde116100dc578063b88d4fde1461089b578063bb7d593f146108bb578063c37fae9b146108d0578063c87b56dd146108e557610380565b8063a638fab414610851578063a66bcb8c14610871578063b7d166401461088657610380565b80638462151c1161016f578063911012011161014957806391101201146107dc57806395d89b41146107fc5780639aa8232314610811578063a22cb4651461083157610380565b80638462151c146107855780638909d3a4146107b25780638da5cb5b146107c757610380565b80636352211e116101ab5780636352211e1461071b5780636c0360eb1461073b57806370a0823114610750578063715018a61461077057610380565b806355f804b3146106d35780635bbf68c7146106f35780635f7b13f21461070657610380565b8063286a84e4116102b65780633ccfd60b116102545780634e315efc116102235780634e315efc146106695780634e71d92d146106895780634f6ccce71461069e578063507cafcd146106be57610380565b80633ccfd60b146105f457806342842e0e1461060957806347dc3be3146106295780634de7db841461064957610380565b80632a90fa70116102905780632a90fa70146105975780632f745c59146105ac578063317ecaa3146105cc57806334918dfd146105df57610380565b8063286a84e41461054d57806328efe9551461056d5780632a3800e41461058257610380565b80631096952311610323578063187876dc116102fd578063187876dc146104cd5780631ec50a3a146104ed57806323b872dd1461050d5780632741dcec1461052d57610380565b8063109695231461048357806317018bc9146104a357806318160ddd146104b857610380565b806306fdde031161035f57806306fdde03146103ff578063081812fc14610421578063095ea7b3146104415780630c5ea4061461046357610380565b806287e14a1461038557806301340261146103b057806301ffc9a7146103d2575b600080fd5b34801561039157600080fd5b5061039a6109ef565b6040516103a79190613343565b60405180910390f35b3480156103bc57600080fd5b506103c56109fe565b6040516103a79190613f2a565b3480156103de57600080fd5b506103f26103ed366004613215565b610a04565b6040516103a79190613436565b34801561040b57600080fd5b50610414610a27565b6040516103a79190613441565b34801561042d57600080fd5b5061039a61043c366004613293565b610abd565b34801561044d57600080fd5b5061046161045c366004613194565b610b09565b005b34801561046f57600080fd5b506103c561047e366004613293565b610ba1565b34801561048f57600080fd5b5061046161049e36600461324d565b610bdd565b3480156104af57600080fd5b506103c5610c33565b3480156104c457600080fd5b506103c5610c39565b3480156104d957600080fd5b506104616104e83660046132ab565b610c4a565b3480156104f957600080fd5b50610461610508366004613194565b610f79565b34801561051957600080fd5b506104616105283660046130aa565b611052565b34801561053957600080fd5b5061046161054836600461303a565b61108a565b34801561055957600080fd5b50610461610568366004613293565b6110eb565b34801561057957600080fd5b506103c561112f565b34801561058e57600080fd5b506103f2611135565b3480156105a357600080fd5b5061039a611144565b3480156105b857600080fd5b506103c56105c7366004613194565b611153565b6104616105da366004613293565b61117e565b3480156105eb57600080fd5b50610461611289565b34801561060057600080fd5b506104616112dc565b34801561061557600080fd5b506104616106243660046130aa565b61134a565b34801561063557600080fd5b506103f26106443660046131bf565b611365565b34801561065557600080fd5b506103c5610664366004613293565b6114d5565b34801561067557600080fd5b5061046161068436600461303a565b6114e7565b34801561069557600080fd5b50610461611552565b3480156106aa57600080fd5b506103c56106b9366004613293565b61166d565b3480156106ca57600080fd5b506103c5611683565b3480156106df57600080fd5b506104616106ee36600461324d565b611688565b6104616107013660046132ab565b6116d0565b34801561071257600080fd5b50610414611807565b34801561072757600080fd5b5061039a610736366004613293565b611895565b34801561074757600080fd5b506104146118bd565b34801561075c57600080fd5b506103c561076b36600461303a565b61191e565b34801561077c57600080fd5b50610461611967565b34801561079157600080fd5b506107a56107a036600461303a565b6119f0565b6040516103a791906133f2565b3480156107be57600080fd5b506103c5611a9e565b3480156107d357600080fd5b5061039a611aa4565b3480156107e857600080fd5b506103c56107f7366004613293565b611ab3565b34801561080857600080fd5b50610414611ac5565b34801561081d57600080fd5b5061046161082c366004613293565b611b26565b34801561083d57600080fd5b5061046161084c366004613167565b611b6a565b34801561085d57600080fd5b5061046161086c366004613293565b611c38565b34801561087d57600080fd5b50610461611ecd565b34801561089257600080fd5b506103f2611f2b565b3480156108a757600080fd5b506104616108b63660046130ea565b611f39565b3480156108c757600080fd5b5061039a611f78565b3480156108dc57600080fd5b5061039a611f87565b3480156108f157600080fd5b50610414610900366004613293565b611f9d565b34801561091157600080fd5b506103c5610920366004613293565b6120e1565b34801561093157600080fd5b506103f2610940366004613072565b61211d565b34801561095157600080fd5b5061046161214b565b34801561096657600080fd5b506103f26121a7565b34801561097b57600080fd5b5061046161098a36600461303a565b6121b0565b34801561099b57600080fd5b506104616109aa36600461303a565b612211565b3480156109bb57600080fd5b506104616109ca36600461303a565b612272565b3480156109db57600080fd5b506104616109ea366004613293565b612333565b6012546001600160a01b031681565b600d5481565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b60068054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ab35780601f10610a8857610100808354040283529160200191610ab3565b820191906000526020600020905b815481529060010190602001808311610a9657829003601f168201915b5050505050905090565b6000610ac882612377565b610aed5760405162461bcd60e51b8152600401610ae490613b34565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610b1482611895565b9050806001600160a01b0316836001600160a01b03161415610b485760405162461bcd60e51b8152600401610ae490613c72565b806001600160a01b0316610b5a612384565b6001600160a01b03161480610b765750610b7681610940612384565b610b925760405162461bcd60e51b8152600401610ae49061398e565b610b9c8383612388565b505050565b6000610bab610c39565b821115610bca5760405162461bcd60e51b8152600401610ae490613e26565b5060009081526015602052604090205490565b610be5612384565b6001600160a01b0316610bf6611aa4565b6001600160a01b031614610c1c5760405162461bcd60e51b8152600401610ae490613ba5565b8051610c2f90600b906020840190612ef5565b5050565b60175481565b6000610c4560026123f6565b905090565b600f54610100900460ff16610c715760405162461bcd60e51b8152600401610ae490613b80565b6011546001600160a01b0316610c995760405162461bcd60e51b8152600401610ae490613eb0565b33610ca383611895565b6001600160a01b031614610cc95760405162461bcd60e51b8152600401610ae490613ef3565b610cd282612401565b6012546040516331a9108f60e11b81526001600160a01b039091169033908290636352211e90610d06908690600401613f2a565b60206040518083038186803b158015610d1e57600080fd5b505afa158015610d32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d569190613056565b6001600160a01b031614610d7c5760405162461bcd60e51b8152600401610ae490613755565b60135460405163095ea7b360e01b81526001600160a01b038381169263095ea7b392610db0929091169086906004016133d9565b600060405180830381600087803b158015610dca57600080fd5b505af1158015610dde573d6000803e3d6000fd5b50506040516331a9108f60e11b81526001600160a01b03841692506342842e0e91508290636352211e90610e16908790600401613f2a565b60206040518083038186803b158015610e2e57600080fd5b505afa158015610e42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e669190613056565b6013546040516001600160e01b031960e085901b168152610e9692916001600160a01b03169087906004016133b5565b600060405180830381600087803b158015610eb057600080fd5b505af1158015610ec4573d6000803e3d6000fd5b50506011546040516306502a5160e51b81526001600160a01b03909116925060009150829063ca054a2090610f0190339089908990600401613394565b602060405180830381600087803b158015610f1b57600080fd5b505af1158015610f2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5391906131f9565b905080610f725760405162461bcd60e51b8152600401610ae490613496565b5050505050565b610f81612384565b6001600160a01b0316610f92611aa4565b6001600160a01b031614610fb85760405162461bcd60e51b8152600401610ae490613ba5565b600081118015610fca57506017548111155b610fe65760405162461bcd60e51b8152600401610ae4906134c5565b60005b8181101561103d5760005b600e54811015611034578061100881612377565b1580156110165750600e5481105b1561102b5761102585826124ce565b50611034565b50600101610ff4565b50600101610fe9565b5060175461104b90826124e8565b6017555050565b61106361105d612384565b82612510565b61107f5760405162461bcd60e51b8152600401610ae490613cdf565b610b9c83838361258d565b611092612384565b6001600160a01b03166110a3611aa4565b6001600160a01b0316146110c95760405162461bcd60e51b8152600401610ae490613ba5565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b6110f3612384565b6001600160a01b0316611104611aa4565b6001600160a01b03161461112a5760405162461bcd60e51b8152600401610ae490613ba5565b600e55565b600e5481565b600f5462010000900460ff1681565b6011546001600160a01b031681565b6001600160a01b0382166000908152600160205260408120611175908361269b565b90505b92915050565b600f5462010000900460ff166111a65760405162461bcd60e51b8152600401610ae490613da8565b6000811180156111b7575060148111155b6111d35760405162461bcd60e51b8152600401610ae4906138c1565b600e546111e8826111e2610c39565b906126a7565b11156112065760405162461bcd60e51b8152600401610ae490613ddd565b600c5461121390826126cc565b3410156112325760405162461bcd60e51b8152600401610ae4906137b2565b60005b81811015610c2f5760005b600e54811015611280578061125481612377565b1580156112625750600e5481105b156112775761127133826124ce565b50611280565b50600101611240565b50600101611235565b611291612384565b6001600160a01b03166112a2611aa4565b6001600160a01b0316146112c85760405162461bcd60e51b8152600401610ae490613ba5565b600f805460ff19811660ff90911615179055565b6112e4612384565b6001600160a01b03166112f5611aa4565b6001600160a01b03161461131b5760405162461bcd60e51b8152600401610ae490613ba5565b6040514790339082156108fc029083906000818181858888f19350505050158015610c2f573d6000803e3d6000fd5b610b9c83838360405180602001604052806000815250611f39565b600f54600090610100900460ff1661138f5760405162461bcd60e51b8152600401610ae490613660565b846001600160a01b03166113a284611895565b6001600160a01b0316146113c85760405162461bcd60e51b8152600401610ae490613ef3565b600f546040516331a9108f60e11b81526001600160a01b0363010000009092048216918716908290636352211e90611404908990600401613f2a565b60206040518083038186803b15801561141c57600080fd5b505afa158015611430573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114549190613056565b6001600160a01b03161461147a5760405162461bcd60e51b8152600401610ae4906136a3565b60008481526015602052604090819020849055517f209a44f18fd48de4f84530ea5010d55edb918d27ec320e7e3d81a336fdf971b6906114bf90339087908790613394565b60405180910390a160019150505b949350505050565b60156020526000908152604090205481565b6114ef612384565b6001600160a01b0316611500611aa4565b6001600160a01b0316146115265760405162461bcd60e51b8152600401610ae490613ba5565b600f80546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b6016600061155e612384565b6001600160a01b0316815260208101919091526040016000205460ff16156115985760405162461bcd60e51b8152600401610ae490613cb3565b6001601660006115a6612384565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055600f5460ff62010000909104166115f75760405162461bcd60e51b8152600401610ae490613da8565b600e5461160760016111e2610c39565b11156116255760405162461bcd60e51b8152600401610ae490613ddd565b60005b600e54811015611669578061163c81612377565b15801561164a5750600e5481105b156116605761165933826124ce565b505061166b565b50600101611628565b505b565b60008061167b600284612706565b509392505050565b601481565b611690612384565b6001600160a01b03166116a1611aa4565b6001600160a01b0316146116c75760405162461bcd60e51b8152600401610ae490613ba5565b61166981612722565b600f5460ff166116f25760405162461bcd60e51b8152600401610ae4906134f5565b6116fa610c39565b8211156117195760405162461bcd60e51b8152600401610ae490613ddd565b3361172383611895565b6001600160a01b0316146117495760405162461bcd60e51b8152600401610ae490613e69565b600d54600083815260146020526040902054106117785760405162461bcd60e51b8152600401610ae490613a35565b600c546117869060016126cc565b3410156117a55760405162461bcd60e51b8152600401610ae4906137b2565b600082815260146020908152604080832080546001019055601590915290819020829055517f209a44f18fd48de4f84530ea5010d55edb918d27ec320e7e3d81a336fdf971b6906117fb90339085908590613394565b60405180910390a15050565b600b805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561188d5780601f106118625761010080835404028352916020019161188d565b820191906000526020600020905b81548152906001019060200180831161187057829003601f168201915b505050505081565b600061117882604051806060016040528060298152602001613fcb6029913960029190612735565b60098054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ab35780601f10610a8857610100808354040283529160200191610ab3565b60006001600160a01b0382166119465760405162461bcd60e51b8152600401610ae4906139eb565b6001600160a01b0382166000908152600160205260409020611178906123f6565b61196f612384565b6001600160a01b0316611980611aa4565b6001600160a01b0316146119a65760405162461bcd60e51b8152600401610ae490613ba5565b600a546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600a80546001600160a01b0319169055565b606060006119fd8361191e565b905080611a1a575050604080516000815260208101909152610a22565b60008167ffffffffffffffff81118015611a3357600080fd5b50604051908082528060200260200182016040528015611a5d578160200160208202803683370190505b50905060005b82811015611a9457611a758582611153565b828281518110611a8157fe5b6020908102919091010152600101611a63565b509150610a229050565b600c5481565b600a546001600160a01b031690565b60146020526000908152604090205481565b60078054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ab35780601f10610a8857610100808354040283529160200191610ab3565b611b2e612384565b6001600160a01b0316611b3f611aa4565b6001600160a01b031614611b655760405162461bcd60e51b8152600401610ae490613ba5565b600d55565b611b72612384565b6001600160a01b0316826001600160a01b03161415611ba35760405162461bcd60e51b8152600401610ae49061371e565b8060056000611bb0612384565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155611bf4612384565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c2c9190613436565b60405180910390a35050565b600f5460ff16611c5a5760405162461bcd60e51b8152600401610ae490613d30565b600e54611c65610c39565b10611c825760405162461bcd60e51b8152600401610ae490613902565b600e548110611ca35760405162461bcd60e51b8152600401610ae490613949565b6010546040516331a9108f60e11b81526001600160a01b039091169033908290636352211e90611cd7908690600401613f2a565b60206040518083038186803b158015611cef57600080fd5b505afa158015611d03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d279190613056565b6001600160a01b031614611d4d5760405162461bcd60e51b8152600401610ae490613820565b611d5682612377565b15611d735760405162461bcd60e51b8152600401610ae49061352c565b611d7d33836124ce565b60135460405163095ea7b360e01b81526001600160a01b038381169263095ea7b392611db1929091169086906004016133d9565b600060405180830381600087803b158015611dcb57600080fd5b505af1158015611ddf573d6000803e3d6000fd5b50506040516331a9108f60e11b81526001600160a01b03841692506342842e0e91508290636352211e90611e17908790600401613f2a565b60206040518083038186803b158015611e2f57600080fd5b505afa158015611e43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e679190613056565b6013546040516001600160e01b031960e085901b168152611e9792916001600160a01b03169087906004016133b5565b600060405180830381600087803b158015611eb157600080fd5b505af1158015611ec5573d6000803e3d6000fd5b505050505050565b611ed5612384565b6001600160a01b0316611ee6611aa4565b6001600160a01b031614611f0c5760405162461bcd60e51b8152600401610ae490613ba5565b600f805462ff0000198116620100009182900460ff1615909102179055565b600f54610100900460ff1681565b611f4a611f44612384565b83612510565b611f665760405162461bcd60e51b8152600401610ae490613cdf565b611f728484848461274c565b50505050565b6010546001600160a01b031681565b600f54630100000090046001600160a01b031681565b6060611fa882612377565b611fc45760405162461bcd60e51b8152600401610ae490613c23565b60008281526008602090815260408083208054825160026001831615610100026000190190921691909104601f8101859004850282018501909352828152929091908301828280156120575780601f1061202c57610100808354040283529160200191612057565b820191906000526020600020905b81548152906001019060200180831161203a57829003601f168201915b5050505050905060006120686118bd565b905080516000141561207c57509050610a22565b8151156120ae578082604051602001612096929190613314565b60405160208183030381529060405292505050610a22565b806120b88561277f565b6040516020016120c9929190613314565b60405160208183030381529060405292505050919050565b60006120eb610c39565b82111561210a5760405162461bcd60e51b8152600401610ae490613e26565b5060009081526014602052604090205490565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b612153612384565b6001600160a01b0316612164611aa4565b6001600160a01b03161461218a5760405162461bcd60e51b8152600401610ae490613ba5565b600f805461ff001981166101009182900460ff1615909102179055565b600f5460ff1681565b6121b8612384565b6001600160a01b03166121c9611aa4565b6001600160a01b0316146121ef5760405162461bcd60e51b8152600401610ae490613ba5565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b612219612384565b6001600160a01b031661222a611aa4565b6001600160a01b0316146122505760405162461bcd60e51b8152600401610ae490613ba5565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b61227a612384565b6001600160a01b031661228b611aa4565b6001600160a01b0316146122b15760405162461bcd60e51b8152600401610ae490613ba5565b6001600160a01b0381166122d75760405162461bcd60e51b8152600401610ae4906135ac565b600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b61233b612384565b6001600160a01b031661234c611aa4565b6001600160a01b0316146123725760405162461bcd60e51b8152600401610ae490613ba5565b600c55565b600061117860028361285a565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906123bd82611895565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061117882612866565b600061240c82611895565b905061241a81600084610b9c565b612425600083612388565b600082815260086020526040902054600260001961010060018416150201909116041561246357600082815260086020526040812061246391612f81565b6001600160a01b0381166000908152600160205260409020612485908361286a565b50612491600283612876565b5060405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b610c2f828260405180602001604052806000815250612882565b60008282111561250a5760405162461bcd60e51b8152600401610ae4906137e9565b50900390565b600061251b82612377565b6125375760405162461bcd60e51b8152600401610ae490613875565b600061254283611895565b9050806001600160a01b0316846001600160a01b0316148061257d5750836001600160a01b031661257284610abd565b6001600160a01b0316145b806114cd57506114cd818561211d565b826001600160a01b03166125a082611895565b6001600160a01b0316146125c65760405162461bcd60e51b8152600401610ae490613bda565b6001600160a01b0382166125ec5760405162461bcd60e51b8152600401610ae4906136da565b6125f7838383610b9c565b612602600082612388565b6001600160a01b0383166000908152600160205260409020612624908261286a565b506001600160a01b038216600090815260016020526040902061264790826128b5565b50612654600282846128c1565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061117583836128d7565b6000828201838110156111755760405162461bcd60e51b8152600401610ae490613629565b6000826126db57506000611178565b828202828482816126e857fe5b04146111755760405162461bcd60e51b8152600401610ae490613af3565b6000808080612715868661291c565b9097909650945050505050565b8051610c2f906009906020840190612ef5565b6000612742848484612978565b90505b9392505050565b61275784848461258d565b612763848484846129d7565b611f725760405162461bcd60e51b8152600401610ae49061355a565b6060816127a457506040805180820190915260018152600360fc1b6020820152610a22565b8160005b81156127bc57600101600a820491506127a8565b60008167ffffffffffffffff811180156127d557600080fd5b506040519080825280601f01601f191660200182016040528015612800576020820181803683370190505b50859350905060001982015b831561285157600a840660300160f81b8282806001900393508151811061282f57fe5b60200101906001600160f81b031916908160001a905350600a8404935061280c565b50949350505050565b60006111758383612ab6565b5490565b60006111758383612ace565b60006111758383612b94565b61288c8383612c68565b61289960008484846129d7565b610b9c5760405162461bcd60e51b8152600401610ae49061355a565b60006111758383612d2c565b600061274284846001600160a01b038516612d76565b815460009082106128fa5760405162461bcd60e51b8152600401610ae490613454565b82600001828154811061290957fe5b9060005260206000200154905092915050565b8154600090819083106129415760405162461bcd60e51b8152600401610ae490613a7c565b600084600001848154811061295257fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b600082815260018401602052604081205482816129a85760405162461bcd60e51b8152600401610ae49190613441565b508460000160018203815481106129bb57fe5b9060005260206000209060020201600101549150509392505050565b60006129eb846001600160a01b0316612e0d565b6129f7575060016114cd565b6000612a7f630a85bd0160e11b612a0c612384565b888787604051602401612a229493929190613357565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050604051806060016040528060328152602001613f99603291396001600160a01b0388169190612e13565b9050600081806020019051810190612a979190613231565b6001600160e01b031916630a85bd0160e11b1492505050949350505050565b60009081526001919091016020526040902054151590565b60008181526001830160205260408120548015612b8a5783546000198083019190810190600090879083908110612b0157fe5b9060005260206000200154905080876000018481548110612b1e57fe5b600091825260208083209091019290925582815260018981019092526040902090840190558654879080612b4e57fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050611178565b6000915050611178565b60008181526001830160205260408120548015612b8a5783546000198083019190810190600090879083908110612bc757fe5b9060005260206000209060020201905080876000018481548110612be757fe5b600091825260208083208454600290930201918255600193840154918401919091558354825289830190526040902090840190558654879080612c2657fe5b60008281526020808220600260001990940193840201828155600190810183905592909355888152898201909252604082209190915594506111789350505050565b6001600160a01b038216612c8e5760405162461bcd60e51b8152600401610ae490613abe565b612c9781612377565b15612cb45760405162461bcd60e51b8152600401610ae4906135f2565b612cc060008383610b9c565b6001600160a01b0382166000908152600160205260409020612ce290826128b5565b50612cef600282846128c1565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000612d388383612ab6565b612d6e57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155611178565b506000611178565b600082815260018401602052604081205480612ddb575050604080518082018252838152602080820184815286546001818101895560008981528481209551600290930290950191825591519082015586548684528188019092529290912055612745565b82856000016001830381548110612dee57fe5b9060005260206000209060020201600101819055506000915050612745565b3b151590565b6060612742848460008585612e2785612e0d565b612e435760405162461bcd60e51b8152600401610ae490613d71565b600080866001600160a01b03168587604051612e5f91906132f8565b60006040518083038185875af1925050503d8060008114612e9c576040519150601f19603f3d011682016040523d82523d6000602084013e612ea1565b606091505b5091509150612eb1828286612ebc565b979650505050505050565b60608315612ecb575081612745565b825115612edb5782518084602001fd5b8160405162461bcd60e51b8152600401610ae49190613441565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282612f2b5760008555612f71565b82601f10612f4457805160ff1916838001178555612f71565b82800160010185558215612f71579182015b82811115612f71578251825591602001919060010190612f56565b50612f7d929150612fc1565b5090565b50805460018160011615610100020316600290046000825580601f10612fa75750611669565b601f01602090049060005260206000209081019061166991905b5b80821115612f7d5760008155600101612fc2565b600067ffffffffffffffff80841115612feb57fe5b604051601f8501601f19168101602001828111828210171561300957fe5b60405284815291508183850186101561302157600080fd5b8484602083013760006020868301015250509392505050565b60006020828403121561304b578081fd5b813561117581613f5f565b600060208284031215613067578081fd5b815161117581613f5f565b60008060408385031215613084578081fd5b823561308f81613f5f565b9150602083013561309f81613f5f565b809150509250929050565b6000806000606084860312156130be578081fd5b83356130c981613f5f565b925060208401356130d981613f5f565b929592945050506040919091013590565b600080600080608085870312156130ff578081fd5b843561310a81613f5f565b9350602085013561311a81613f5f565b925060408501359150606085013567ffffffffffffffff81111561313c578182fd5b8501601f8101871361314c578182fd5b61315b87823560208401612fd6565b91505092959194509250565b60008060408385031215613179578182fd5b823561318481613f5f565b9150602083013561309f81613f74565b600080604083850312156131a6578182fd5b82356131b181613f5f565b946020939093013593505050565b600080600080608085870312156131d4578384fd5b84356131df81613f5f565b966020860135965060408601359560600135945092505050565b60006020828403121561320a578081fd5b815161117581613f74565b600060208284031215613226578081fd5b813561117581613f82565b600060208284031215613242578081fd5b815161117581613f82565b60006020828403121561325e578081fd5b813567ffffffffffffffff811115613274578182fd5b8201601f81018413613284578182fd5b6114cd84823560208401612fd6565b6000602082840312156132a4578081fd5b5035919050565b600080604083850312156132bd578182fd5b50508035926020909101359150565b600081518084526132e4816020860160208601613f33565b601f01601f19169290920160200192915050565b6000825161330a818460208701613f33565b9190910192915050565b60008351613326818460208801613f33565b83519083019061333a818360208801613f33565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061338a908301846132cc565b9695505050505050565b6001600160a01b039390931683526020830191909152604082015260600190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b8181101561342a5783518352928401929184019160010161340e565b50909695505050505050565b901515815260200190565b60006020825261117560208301846132cc565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b60208082526015908201527415da5e985c990818dbdb5c1bdcd94819985a5b1959605a1b604082015260600190565b6020808252601690820152752737ba1032b737bab3b4103932b9b2b93b32903632b360511b604082015260600190565b6020808252601d908201527f53616c65206d7573742062652061637469766520746f207265726f6c6c000000604082015260600190565b602080825260149082015273151bdad95b88185b1c9958591e481b5a5b9d195960621b604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526023908201527f436f6d706f7365206973206e6f742061637469766520617420746865206d6f6d604082015262195b9d60ea1b606082015260800190565b6020808252601b908201527f596f7520646f206e6f742068617665207468697320776561706f6e0000000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252603a908201527f4d757374206f776e20746865204c6567696f6e20666f7220726571756573746560408201527f6420746f6b656e496420746f206d696e7420612057697a617264000000000000606082015260800190565b6020808252601f908201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526035908201527f4d757374206f776e20746865205465787420666f7220726571756573746564206040820152740746f6b656e496420746f206d696e7420612050465605c1b606082015260800190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526021908201527f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d6040820152606560f81b606082015260800190565b60208082526027908201527f507572636861736520776f756c6420657863656564206d617820737570706c796040820152660206f66205046560cc1b606082015260800190565b60208082526025908201527f52657175657374656420746f6b656e4964206578636565647320757070657220604082015264189bdd5b9960da1b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526027908201527f4865792c207468697320746f6b656e20686173206d6f7265207468616e2033206040820152667265726f6c6c2160c81b606082015260800190565b60208082526022908201527f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252600b908201526a139bdd08185b1b1bddd95960aa1b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526012908201527143616e206f6e6c79206d696e74206f6e636560701b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526021908201527f53616c65206d7573742062652061637469766520746f206d696e7420612050466040820152600560fc1b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252818101527f53616c65206d7573742062652061637469766520746f206d696e74206865726f604082015260600190565b60208082526029908201527f507572636861736520776f756c6420657863656564206d617820737570706c79604082015268206f66206865726f7360b81b606082015260800190565b60208082526023908201527f494420776f756c6420657863656564206d617820737570706c79206f66206865604082015262726f7360e81b606082015260800190565b60208082526027908201527f4865792c20796f75722077616c6c657420646f65736e2774206f776e2074686960408201526673206865726f2160c81b606082015260800190565b60208082526023908201527f57697a61726420636f6e74726163742061646472657373206e656564206265206040820152621cd95d60ea1b606082015260800190565b60208082526018908201527f596f7520646f206e6f7420686176652074686973205046500000000000000000604082015260600190565b90815260200190565b60005b83811015613f4e578181015183820152602001613f36565b83811115611f725750506000910152565b6001600160a01b038116811461166957600080fd5b801515811461166957600080fd5b6001600160e01b03198116811461166957600080fdfe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220d8c503e18d126f835b5590230aecd5983fbe259a97eb777a4693bf3a05c0f20764736f6c63430007060033

Deployed Bytecode Sourcemap

68047:8632:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68653:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68312:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;10262:150::-;;;;;;;;;;-1:-1:-1;10262:150:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;51547:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;54333:221::-;;;;;;;;;;-1:-1:-1;54333:221:0;;;;;:::i;:::-;;:::i;53863:404::-;;;;;;;;;;-1:-1:-1;53863:404:0;;;;;:::i;:::-;;:::i;:::-;;75026:202;;;;;;;;;;-1:-1:-1;75026:202:0;;;;;:::i;:::-;;:::i;70397:125::-;;;;;;;;;;-1:-1:-1;70397:125:0;;;;;:::i;:::-;;:::i;68999:29::-;;;;;;;;;;;;;:::i;53341:211::-;;;;;;;;;;;;;:::i;73505:937::-;;;;;;;;;;-1:-1:-1;73505:937:0;;;;;:::i;:::-;;:::i;69524:546::-;;;;;;;;;;-1:-1:-1;69524:546:0;;;;;:::i;:::-;;:::i;55223:305::-;;;;;;;;;;-1:-1:-1;55223:305:0;;;;;:::i;:::-;;:::i;74742:133::-;;;;;;;;;;-1:-1:-1;74742:133:0;;;;;:::i;:::-;;:::i;70297:92::-;;;;;;;;;;-1:-1:-1;70297:92:0;;;;;:::i;:::-;;:::i;68344:32::-;;;;;;;;;;;;;:::i;68466:36::-;;;;;;;;;;;;;:::i;68604:37::-;;;;;;;;;;;;;:::i;53103:162::-;;;;;;;;;;-1:-1:-1;53103:162:0;;;;;:::i;:::-;;:::i;71428:734::-;;;;;;:::i;:::-;;:::i;70639:89::-;;;;;;;;;;;;;:::i;69381:131::-;;;;;;;;;;;;;:::i;55599:151::-;;;;;;;;;;-1:-1:-1;55599:151:0;;;;;:::i;:::-;;:::i;72865:629::-;;;;;;;;;;-1:-1:-1;72865:629:0;;;;;:::i;:::-;;:::i;68841:48::-;;;;;;;;;;-1:-1:-1;68841:48:0;;;;;:::i;:::-;;:::i;74596:134::-;;;;;;;;;;-1:-1:-1;74596:134:0;;;;;:::i;:::-;;:::i;70965:451::-;;;;;;;;;;;;;:::i;53629:172::-;;;;;;;;;;-1:-1:-1;53629:172:0;;;;;:::i;:::-;;:::i;68264:41::-;;;;;;;;;;;;;:::i;70530:99::-;;;;;;;;;;-1:-1:-1;70530:99:0;;;;;:::i;:::-;;:::i;75446:678::-;;;;;;:::i;:::-;;:::i;68140:34::-;;;;;;;;;;;;;:::i;51303:177::-;;;;;;;;;;-1:-1:-1;51303:177:0;;;;;:::i;:::-;;:::i;52922:97::-;;;;;;;;;;;;;:::i;51020:221::-;;;;;;;;;;-1:-1:-1;51020:221:0;;;;;:::i;:::-;;:::i;66258:148::-;;;;;;;;;;;;;:::i;76134:540::-;;;;;;;;;;-1:-1:-1;76134:540:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;68214:29::-;;;;;;;;;;;;;:::i;65607:87::-;;;;;;;;;;;;;:::i;68783:43::-;;;;;;;;;;-1:-1:-1;68783:43:0;;;;;:::i;:::-;;:::i;51716:104::-;;;;;;;;;;;;;:::i;70179:106::-;;;;;;;;;;-1:-1:-1;70179:106:0;;;;;:::i;:::-;;:::i;54626:295::-;;;;;;;;;;-1:-1:-1;54626:295:0;;;;;:::i;:::-;;:::i;72172:684::-;;;;;;;;;;-1:-1:-1;72172:684:0;;;;;:::i;:::-;;:::i;70740:101::-;;;;;;;;;;;;;:::i;68424:35::-;;;;;;;;;;;;;:::i;55821:285::-;;;;;;;;;;-1:-1:-1;55821:285:0;;;;;:::i;:::-;;:::i;68559:35::-;;;;;;;;;;;;;:::i;68515:37::-;;;;;;;;;;;;;:::i;51891:792::-;;;;;;;;;;-1:-1:-1;51891:792:0;;;;;:::i;:::-;;:::i;75240:192::-;;;;;;;;;;-1:-1:-1;75240:192:0;;;;;:::i;:::-;;:::i;54992:164::-;;;;;;;;;;-1:-1:-1;54992:164:0;;;;;:::i;:::-;;:::i;70849:98::-;;;;;;;;;;;;;:::i;68385:32::-;;;;;;;;;;;;;:::i;74887:129::-;;;;;;;;;;-1:-1:-1;74887:129:0;;;;;:::i;:::-;;:::i;74450:134::-;;;;;;;;;;-1:-1:-1;74450:134:0;;;;;:::i;:::-;;:::i;66561:244::-;;;;;;;;;;-1:-1:-1;66561:244:0;;;;;:::i;:::-;;:::i;70082:89::-;;;;;;;;;;-1:-1:-1;70082:89:0;;;;;:::i;:::-;;:::i;68653:37::-;;;-1:-1:-1;;;;;68653:37:0;;:::o;68312:25::-;;;;:::o;10262:150::-;-1:-1:-1;;;;;;10371:33:0;;10347:4;10371:33;;;;;;;;;;;;;10262:150;;;;:::o;51547:100::-;51634:5;51627:12;;;;;;;;-1:-1:-1;;51627:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51601:13;;51627:12;;51634:5;;51627:12;;51634:5;51627:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51547:100;:::o;54333:221::-;54409:7;54437:16;54445:7;54437;:16::i;:::-;54429:73;;;;-1:-1:-1;;;54429:73:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;54522:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;54522:24:0;;54333:221::o;53863:404::-;53944:13;53960:23;53975:7;53960:14;:23::i;:::-;53944:39;;54008:5;-1:-1:-1;;;;;54002:11:0;:2;-1:-1:-1;;;;;54002:11:0;;;53994:57;;;;-1:-1:-1;;;53994:57:0;;;;;;;:::i;:::-;54088:5;-1:-1:-1;;;;;54072:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;54072:21:0;;:69;;;;54097:44;54121:5;54128:12;:10;:12::i;54097:44::-;54064:161;;;;-1:-1:-1;;;54064:161:0;;;;;;;:::i;:::-;54238:21;54247:2;54251:7;54238:8;:21::i;:::-;53863:404;;;:::o;75026:202::-;75091:7;75128:13;:11;:13::i;:::-;75116:8;:25;;75108:73;;;;-1:-1:-1;;;75108:73:0;;;;;;;:::i;:::-;-1:-1:-1;75195:26:0;;;;:16;:26;;;;;;;75026:202::o;70397:125::-;65838:12;:10;:12::i;:::-;-1:-1:-1;;;;;65827:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65827:23:0;;65819:68;;;;-1:-1:-1;;;65819:68:0;;;;;;;:::i;:::-;70482:32;;::::1;::::0;:15:::1;::::0;:32:::1;::::0;::::1;::::0;::::1;:::i;:::-;;70397:125:::0;:::o;68999:29::-;;;;:::o;53341:211::-;53402:7;53523:21;:12;:19;:21::i;:::-;53516:28;;53341:211;:::o;73505:937::-;73598:15;;;;;;;73590:39;;;;-1:-1:-1;;;73590:39:0;;;;;;;:::i;:::-;73648:21;;-1:-1:-1;;;;;73648:21:0;73640:83;;;;-1:-1:-1;;;73640:83:0;;;;;;;:::i;:::-;73772:10;73742:26;73757:10;73742:14;:26::i;:::-;-1:-1:-1;;;;;73742:40:0;;73734:77;;;;-1:-1:-1;;;73734:77:0;;;;;;;:::i;:::-;73833:17;73839:10;73833:5;:17::i;:::-;73894:21;;73934:32;;-1:-1:-1;;;73934:32:0;;-1:-1:-1;;;;;73894:21:0;;;;73970:10;;73894:21;;73934:17;;:32;;73952:13;;73934:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;73934:46:0;;73926:117;;;;-1:-1:-1;;;73926:117:0;;;;;;;:::i;:::-;74077:12;;74059:47;;-1:-1:-1;;;74059:47:0;;-1:-1:-1;;;;;74059:17:0;;;;;;:47;;74077:12;;;;74091:13;;74059:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;74144:32:0;;-1:-1:-1;;;74144:32:0;;-1:-1:-1;;;;;74116:26:0;;;-1:-1:-1;74116:26:0;;-1:-1:-1;74116:26:0;;74144:17;;:32;;74162:13;;74144:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;74177:12;;74116:90;;-1:-1:-1;;;;;;74116:90:0;;;;;;;;;;-1:-1:-1;;;;;74177:12:0;;74191:13;;74116:90;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;74280:21:0;;74327:56;;-1:-1:-1;;;74327:56:0;;-1:-1:-1;;;;;74280:21:0;;;;-1:-1:-1;74235:24:0;;-1:-1:-1;74280:21:0;;74327:17;;:56;;74345:10;;74357;;74369:13;;74327:56;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;74313:70;;74402:6;74394:40;;;;-1:-1:-1;;;74394:40:0;;;;;;;:::i;:::-;73505:937;;;;;:::o;69524:546::-;65838:12;:10;:12::i;:::-;-1:-1:-1;;;;;65827:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65827:23:0;;65819:68;;;;-1:-1:-1;;;65819:68:0;;;;;;;:::i;:::-;69643:1:::1;69626:14;:18;:51;;;;;69666:11;;69648:14;:29;;69626:51;69618:86;;;;-1:-1:-1::0;;;69618:86:0::1;;;;;;;:::i;:::-;69721:6;69716:291;69737:14;69733:1;:18;69716:291;;;69778:6;69773:223;69794:9;;69790:1;:13;69773:223;;;69842:1:::0;69863:18:::1;69842:1:::0;69863:7:::1;:18::i;:::-;69862:19;:45;;;;;69897:9;;69886;:20;69862:45;69858:127;;;69924:25;69934:3;69939:9;69924;:25::i;:::-;69964:5;;;69858:127;-1:-1:-1::0;69805:3:0::1;;69773:223;;;-1:-1:-1::0;69753:3:0::1;;69716:291;;;-1:-1:-1::0;70031:11:0::1;::::0;:31:::1;::::0;70047:14;70031:15:::1;:31::i;:::-;70017:11;:45:::0;-1:-1:-1;;69524:546:0:o;55223:305::-;55384:41;55403:12;:10;:12::i;:::-;55417:7;55384:18;:41::i;:::-;55376:103;;;;-1:-1:-1;;;55376:103:0;;;;;;;:::i;:::-;55492:28;55502:4;55508:2;55512:7;55492:9;:28::i;74742:133::-;65838:12;:10;:12::i;:::-;-1:-1:-1;;;;;65827:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65827:23:0;;65819:68;;;;-1:-1:-1;;;65819:68:0;;;;;;;:::i;:::-;74828:21:::1;:39:::0;;-1:-1:-1;;;;;;74828:39:0::1;-1:-1:-1::0;;;;;74828:39:0;;;::::1;::::0;;;::::1;::::0;;74742:133::o;70297:92::-;65838:12;:10;:12::i;:::-;-1:-1:-1;;;;;65827:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65827:23:0;;65819:68;;;;-1:-1:-1;;;65819:68:0;;;;;;;:::i;:::-;70362:9:::1;:19:::0;70297:92::o;68344:32::-;;;;:::o;68466:36::-;;;;;;;;;:::o;68604:37::-;;;-1:-1:-1;;;;;68604:37:0;;:::o;53103:162::-;-1:-1:-1;;;;;53227:20:0;;53200:7;53227:20;;;:13;:20;;;;;:30;;53251:5;53227:23;:30::i;:::-;53220:37;;53103:162;;;;;:::o;71428:734::-;71498:16;;;;;;;71490:61;;;;-1:-1:-1;;;71490:61:0;;;;;;;:::i;:::-;71583:1;71566:14;:18;:55;;;;;68303:2;71588:14;:33;;71566:55;71558:101;;;;-1:-1:-1;;;71558:101:0;;;;;;;:::i;:::-;71711:9;;71674:33;71692:14;71674:13;:11;:13::i;:::-;:17;;:33::i;:::-;:46;;71666:100;;;;-1:-1:-1;;;71666:100:0;;;;;;;:::i;:::-;71794:9;;:29;;71808:14;71794:13;:29::i;:::-;71781:9;:42;;71773:86;;;;-1:-1:-1;;;71773:86:0;;;;;;;:::i;:::-;71873:6;71868:289;71889:14;71885:1;:18;71868:289;;;71926:6;71921:229;71942:9;;71938:1;:13;71921:229;;;71990:1;72011:18;71990:1;72011:7;:18::i;:::-;72010:19;:44;;;;;72044:9;;72034;:19;72010:44;72006:133;;;72071:32;72081:10;72093:9;72071;:32::i;:::-;72118:5;;;72006:133;-1:-1:-1;71953:3:0;;71921:229;;;-1:-1:-1;71905:3:0;;71868:289;;70639:89;65838:12;:10;:12::i;:::-;-1:-1:-1;;;;;65827:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65827:23:0;;65819:68;;;;-1:-1:-1;;;65819:68:0;;;;;;;:::i;:::-;70708:12:::1;::::0;;-1:-1:-1;;70692:28:0;::::1;70708:12;::::0;;::::1;70707:13;70692:28;::::0;;70639:89::o;69381:131::-;65838:12;:10;:12::i;:::-;-1:-1:-1;;;;;65827:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65827:23:0;;65819:68;;;;-1:-1:-1;;;65819:68:0;;;;;;;:::i;:::-;69476:28:::1;::::0;69444:21:::1;::::0;69476:10:::1;::::0;:28;::::1;;;::::0;69444:21;;69429:12:::1;69476:28:::0;69429:12;69476:28;69444:21;69476:10;:28;::::1;;;;;;;;;;;;;::::0;::::1;;;;55599:151:::0;55703:39;55720:4;55726:2;55730:7;55703:39;;;;;;;;;;;;:16;:39::i;72865:629::-;73007:15;;72982:4;;73007:15;;;;;72999:63;;;;-1:-1:-1;;;72999:63:0;;;;;;;:::i;:::-;73111:5;-1:-1:-1;;;;;73081:35:0;:26;73096:10;73081:14;:26::i;:::-;-1:-1:-1;;;;;73081:35:0;;73073:72;;;;-1:-1:-1;;;73073:72:0;;;;;;;:::i;:::-;73188:21;;73243:32;;-1:-1:-1;;;73243:32:0;;-1:-1:-1;;;;;73188:21:0;;;;;;;73243:41;;;73188:21;;73243:17;;:32;;73261:13;;73243:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;73243:41:0;;73235:81;;;;-1:-1:-1;;;73235:81:0;;;;;;;:::i;:::-;73329:28;;;;:16;:28;;;;;;;:44;;;73389:65;;;;;73415:10;;73346;;73360:13;;73389:65;:::i;:::-;;;;;;;;73482:4;73475:11;;;72865:629;;;;;;;:::o;68841:48::-;;;;;;;;;;;;;:::o;74596:134::-;65838:12;:10;:12::i;:::-;-1:-1:-1;;;;;65827:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65827:23:0;;65819:68;;;;-1:-1:-1;;;65819:68:0;;;;;;;:::i;:::-;74683:21:::1;:39:::0;;-1:-1:-1;;;;;74683:39:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;74683:39:0;;::::1;::::0;;;::::1;::::0;;74596:134::o;70965:451::-;69180:6;:20;69187:12;:10;:12::i;:::-;-1:-1:-1;;;;;69180:20:0;;;;;;;;;;;;-1:-1:-1;69180:20:0;;;;69179:21;69171:52;;;;-1:-1:-1;;;69171:52:0;;;;;;;:::i;:::-;69257:4;69234:6;:20;69241:12;:10;:12::i;:::-;-1:-1:-1;;;;;69234:20:0;;;;;;;;;;;;-1:-1:-1;69234:20:0;:27;;-1:-1:-1;;69234:27:0;;;;;;;;;;71021:16:::1;::::0;69234:27;71021:16;;;::::1;;71013:61;;;;-1:-1:-1::0;;;71013:61:0::1;;;;;;;:::i;:::-;71117:9;;71093:20;71111:1;71093:13;:11;:13::i;:20::-;:33;;71085:87;;;;-1:-1:-1::0;;;71085:87:0::1;;;;;;;:::i;:::-;71197:6;71192:217;71213:9;;71209:1;:13;71192:217;;;71257:1:::0;71274:18:::1;71257:1:::0;71274:7:::1;:18::i;:::-;71273:19;:45;;;;;71308:9;;71297;:20;71273:45;71269:129;;;71334:32;71344:10;71356:9;71334;:32::i;:::-;71380:7;;;;71269:129;-1:-1:-1::0;71224:3:0::1;;71192:217;;;;69272:1;70965:451::o:0;53629:172::-;53704:7;;53746:22;:12;53762:5;53746:15;:22::i;:::-;-1:-1:-1;53724:44:0;53629:172;-1:-1:-1;;;53629:172:0:o;68264:41::-;68303:2;68264:41;:::o;70530:99::-;65838:12;:10;:12::i;:::-;-1:-1:-1;;;;;65827:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65827:23:0;;65819:68;;;;-1:-1:-1;;;65819:68:0;;;;;;;:::i;:::-;70601:20:::1;70613:7;70601:11;:20::i;75446:678::-:0;75533:12;;;;75525:54;;;;-1:-1:-1;;;75525:54:0;;;;;;;:::i;:::-;75606:13;:11;:13::i;:::-;75594:8;:25;;75586:79;;;;-1:-1:-1;;;75586:79:0;;;;;;;:::i;:::-;75701:10;75680:17;75688:8;75680:7;:17::i;:::-;-1:-1:-1;;;;;75680:31:0;;75672:83;;;;-1:-1:-1;;;75672:83:0;;;;;;;:::i;:::-;75794:9;;75770:21;;;;:11;:21;;;;;;:33;75762:85;;;;-1:-1:-1;;;75762:85:0;;;;;;;:::i;:::-;75875:9;;:16;;75889:1;75875:13;:16::i;:::-;75862:9;:29;;75854:73;;;;-1:-1:-1;;;75854:73:0;;;;;;;:::i;:::-;75964:21;;;;:11;:21;;;;;;;;;;75988:1;75964:25;75940:49;;75996:16;:26;;;;;;;:45;;;76053:65;;;;;76079:10;;75976:8;;76025:16;;76053:65;:::i;:::-;;;;;;;;75446:678;;:::o;68140:34::-;;;;;;;;;;;;;;;-1:-1:-1;;68140:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51303:177::-;51375:7;51402:70;51419:7;51402:70;;;;;;;;;;;;;;;;;:12;;:70;:16;:70::i;52922:97::-;53003:8;52996:15;;;;;;;;-1:-1:-1;;52996:15:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52970:13;;52996:15;;53003:8;;52996:15;;53003:8;52996:15;;;;;;;;;;;;;;;;;;;;;;;;51020:221;51092:7;-1:-1:-1;;;;;51120:19:0;;51112:74;;;;-1:-1:-1;;;51112:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;51204:20:0;;;;;;:13;:20;;;;;:29;;:27;:29::i;66258:148::-;65838:12;:10;:12::i;:::-;-1:-1:-1;;;;;65827:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65827:23:0;;65819:68;;;;-1:-1:-1;;;65819:68:0;;;;;;;:::i;:::-;66349:6:::1;::::0;66328:40:::1;::::0;66365:1:::1;::::0;-1:-1:-1;;;;;66349:6:0::1;::::0;66328:40:::1;::::0;66365:1;;66328:40:::1;66379:6;:19:::0;;-1:-1:-1;;;;;;66379:19:0::1;::::0;;66258:148::o;76134:540::-;76195:16;76225:18;76246:17;76256:6;76246:9;:17::i;:::-;76225:38;-1:-1:-1;76278:15:0;76274:393;;-1:-1:-1;;76355:16:0;;;76369:1;76355:16;;;;;;;;76348:23;;76274:393;76404:23;76444:10;76430:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;76430:25:0;;76404:51;;76470:13;76498:130;76522:10;76514:5;:18;76498:130;;;76578:34;76598:6;76606:5;76578:19;:34::i;:::-;76562:6;76569:5;76562:13;;;;;;;;;;;;;;;;;:50;76534:7;;76498:130;;;-1:-1:-1;76649:6:0;-1:-1:-1;76642:13:0;;-1:-1:-1;76642:13:0;68214:29;;;;:::o;65607:87::-;65680:6;;-1:-1:-1;;;;;65680:6:0;65607:87;:::o;68783:43::-;;;;;;;;;;;;;:::o;51716:104::-;51805:7;51798:14;;;;;;;;-1:-1:-1;;51798:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51772:13;;51798:14;;51805:7;;51798:14;;51805:7;51798:14;;;;;;;;;;;;;;;;;;;;;;;;70179:106;65838:12;:10;:12::i;:::-;-1:-1:-1;;;;;65827:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65827:23:0;;65819:68;;;;-1:-1:-1;;;65819:68:0;;;;;;;:::i;:::-;70254:9:::1;:23:::0;70179:106::o;54626:295::-;54741:12;:10;:12::i;:::-;-1:-1:-1;;;;;54729:24:0;:8;-1:-1:-1;;;;;54729:24:0;;;54721:62;;;;-1:-1:-1;;;54721:62:0;;;;;;;:::i;:::-;54841:8;54796:18;:32;54815:12;:10;:12::i;:::-;-1:-1:-1;;;;;54796:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;54796:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;54796:53:0;;;;;;;;;;;54880:12;:10;:12::i;:::-;-1:-1:-1;;;;;54865:48:0;;54904:8;54865:48;;;;;;:::i;:::-;;;;;;;;54626:295;;:::o;72172:684::-;72234:12;;;;72226:58;;;;-1:-1:-1;;;72226:58:0;;;;;;;:::i;:::-;72315:9;;72299:13;:11;:13::i;:::-;:25;72291:77;;;;-1:-1:-1;;;72291:77:0;;;;;;;:::i;:::-;72393:9;;72383:7;:19;72375:69;;;;-1:-1:-1;;;72375:69:0;;;;;;;:::i;:::-;72485:19;;72520:24;;-1:-1:-1;;;72520:24:0;;-1:-1:-1;;;;;72485:19:0;;;;72548:10;;72485:19;;72520:15;;:24;;72536:7;;72520:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;72520:38:0;;72512:104;;;;-1:-1:-1;;;72512:104:0;;;;;;;:::i;:::-;72632:16;72640:7;72632;:16::i;:::-;72631:17;72623:50;;;;-1:-1:-1;;;72623:50:0;;;;;;;:::i;:::-;72680:30;72690:10;72702:7;72680:9;:30::i;:::-;72740:12;;72724:39;;-1:-1:-1;;;72724:39:0;;-1:-1:-1;;;;;72724:15:0;;;;;;:39;;72740:12;;;;72754:7;;72724:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;72796:24:0;;-1:-1:-1;;;72796:24:0;;-1:-1:-1;;;;;72770:24:0;;;-1:-1:-1;72770:24:0;;-1:-1:-1;72770:24:0;;72796:15;;:24;;72812:7;;72796:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72821:12;;72770:74;;-1:-1:-1;;;;;;72770:74:0;;;;;;;;;;-1:-1:-1;;;;;72821:12:0;;72835:7;;72770:74;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72172:684;;:::o;70740:101::-;65838:12;:10;:12::i;:::-;-1:-1:-1;;;;;65827:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65827:23:0;;65819:68;;;;-1:-1:-1;;;65819:68:0;;;;;;;:::i;:::-;70817:16:::1;::::0;;-1:-1:-1;;70797:36:0;::::1;70817:16:::0;;;;::::1;;;70816:17;70797:36:::0;;::::1;;::::0;;70740:101::o;68424:35::-;;;;;;;;;:::o;55821:285::-;55953:41;55972:12;:10;:12::i;:::-;55986:7;55953:18;:41::i;:::-;55945:103;;;;-1:-1:-1;;;55945:103:0;;;;;;;:::i;:::-;56059:39;56073:4;56079:2;56083:7;56092:5;56059:13;:39::i;:::-;55821:285;;;;:::o;68559:35::-;;;-1:-1:-1;;;;;68559:35:0;;:::o;68515:37::-;;;;;;-1:-1:-1;;;;;68515:37:0;;:::o;51891:792::-;51964:13;51998:16;52006:7;51998;:16::i;:::-;51990:76;;;;-1:-1:-1;;;51990:76:0;;;;;;;:::i;:::-;52079:23;52105:19;;;:10;:19;;;;;;;;52079:45;;;;;;;;;;;-1:-1:-1;;52079:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;52105:19;;52079:45;;;52105:19;52079:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52135:18;52156:9;:7;:9::i;:::-;52135:30;;52247:4;52241:18;52263:1;52241:23;52237:72;;;-1:-1:-1;52288:9:0;-1:-1:-1;52281:16:0;;52237:72;52413:23;;:27;52409:108;;52488:4;52494:9;52471:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52457:48;;;;;;52409:108;52649:4;52655:18;:7;:16;:18::i;:::-;52632:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52618:57;;;;51891:792;;;:::o;75240:192::-;75301:7;75338:13;:11;:13::i;:::-;75326:8;:25;;75318:73;;;;-1:-1:-1;;;75318:73:0;;;;;;;:::i;:::-;-1:-1:-1;75405:21:0;;;;:11;:21;;;;;;;75240:192::o;54992:164::-;-1:-1:-1;;;;;55113:25:0;;;55089:4;55113:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;54992:164::o;70849:98::-;65838:12;:10;:12::i;:::-;-1:-1:-1;;;;;65827:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65827:23:0;;65819:68;;;;-1:-1:-1;;;65819:68:0;;;;;;;:::i;:::-;70924:15:::1;::::0;;-1:-1:-1;;70905:34:0;::::1;70924:15;::::0;;;::::1;;;70923:16;70905:34:::0;;::::1;;::::0;;70849:98::o;68385:32::-;;;;;;:::o;74887:129::-;65838:12;:10;:12::i;:::-;-1:-1:-1;;;;;65827:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65827:23:0;;65819:68;;;;-1:-1:-1;;;65819:68:0;;;;;;;:::i;:::-;74971:19:::1;:37:::0;;-1:-1:-1;;;;;;74971:37:0::1;-1:-1:-1::0;;;;;74971:37:0;;;::::1;::::0;;;::::1;::::0;;74887:129::o;74450:134::-;65838:12;:10;:12::i;:::-;-1:-1:-1;;;;;65827:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65827:23:0;;65819:68;;;;-1:-1:-1;;;65819:68:0;;;;;;;:::i;:::-;74537:21:::1;:39:::0;;-1:-1:-1;;;;;;74537:39:0::1;-1:-1:-1::0;;;;;74537:39:0;;;::::1;::::0;;;::::1;::::0;;74450:134::o;66561:244::-;65838:12;:10;:12::i;:::-;-1:-1:-1;;;;;65827:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65827:23:0;;65819:68;;;;-1:-1:-1;;;65819:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;66650:22:0;::::1;66642:73;;;;-1:-1:-1::0;;;66642:73:0::1;;;;;;;:::i;:::-;66752:6;::::0;66731:38:::1;::::0;-1:-1:-1;;;;;66731:38:0;;::::1;::::0;66752:6:::1;::::0;66731:38:::1;::::0;66752:6:::1;::::0;66731:38:::1;66780:6;:17:::0;;-1:-1:-1;;;;;;66780:17:0::1;-1:-1:-1::0;;;;;66780:17:0;;;::::1;::::0;;;::::1;::::0;;66561:244::o;70082:89::-;65838:12;:10;:12::i;:::-;-1:-1:-1;;;;;65827:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;65827:23:0;;65819:68;;;;-1:-1:-1;;;65819:68:0;;;;;;;:::i;:::-;70146:9:::1;:17:::0;70082:89::o;57573:127::-;57638:4;57662:30;:12;57684:7;57662:21;:30::i;751:106::-;839:10;751:106;:::o;63591:192::-;63666:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;63666:29:0;-1:-1:-1;;;;;63666:29:0;;;;;;;;:24;;63720:23;63666:24;63720:14;:23::i;:::-;-1:-1:-1;;;;;63711:46:0;;;;;;;;;;;63591:192;;:::o;44305:123::-;44374:7;44401:19;44409:3;44401:7;:19::i;60121:545::-;60181:13;60197:23;60212:7;60197:14;:23::i;:::-;60181:39;;60251:48;60272:5;60287:1;60291:7;60251:20;:48::i;:::-;60340:29;60357:1;60361:7;60340:8;:29::i;:::-;60428:19;;;;:10;:19;;;;;60422:33;;-1:-1:-1;;60422:33:0;;;;;;;;;;;:38;60418:97;;60484:19;;;;:10;:19;;;;;60477:26;;;:::i;:::-;-1:-1:-1;;;;;60527:20:0;;;;;;:13;:20;;;;;:36;;60555:7;60527:27;:36::i;:::-;-1:-1:-1;60576:28:0;:12;60596:7;60576:19;:28::i;:::-;-1:-1:-1;60622:36:0;;60650:7;;60646:1;;-1:-1:-1;;;;;60622:36:0;;;;;60646:1;;60622:36;60121:545;;:::o;58565:110::-;58641:26;58651:2;58655:7;58641:26;;;;;;;;;;;;:9;:26::i;14286:158::-;14344:7;14377:1;14372;:6;;14364:49;;;;-1:-1:-1;;;14364:49:0;;;;;;;:::i;:::-;-1:-1:-1;14431:5:0;;;14286:158::o;57867:355::-;57960:4;57985:16;57993:7;57985;:16::i;:::-;57977:73;;;;-1:-1:-1;;;57977:73:0;;;;;;;:::i;:::-;58061:13;58077:23;58092:7;58077:14;:23::i;:::-;58061:39;;58130:5;-1:-1:-1;;;;;58119:16:0;:7;-1:-1:-1;;;;;58119:16:0;;:51;;;;58163:7;-1:-1:-1;;;;;58139:31:0;:20;58151:7;58139:11;:20::i;:::-;-1:-1:-1;;;;;58139:31:0;;58119:51;:94;;;;58174:39;58198:5;58205:7;58174:23;:39::i;61003:599::-;61128:4;-1:-1:-1;;;;;61101:31:0;:23;61116:7;61101:14;:23::i;:::-;-1:-1:-1;;;;;61101:31:0;;61093:85;;;;-1:-1:-1;;;61093:85:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;61215:16:0;;61207:65;;;;-1:-1:-1;;;61207:65:0;;;;;;;:::i;:::-;61285:39;61306:4;61312:2;61316:7;61285:20;:39::i;:::-;61389:29;61406:1;61410:7;61389:8;:29::i;:::-;-1:-1:-1;;;;;61431:19:0;;;;;;:13;:19;;;;;:35;;61458:7;61431:26;:35::i;:::-;-1:-1:-1;;;;;;61477:17:0;;;;;;:13;:17;;;;;:30;;61499:7;61477:21;:30::i;:::-;-1:-1:-1;61520:29:0;:12;61537:7;61546:2;61520:16;:29::i;:::-;;61586:7;61582:2;-1:-1:-1;;;;;61567:27:0;61576:4;-1:-1:-1;;;;;61567:27:0;;;;;;;;;;;61003:599;;;:::o;36096:137::-;36167:7;36202:22;36206:3;36218:5;36202:3;:22::i;13824:179::-;13882:7;13914:5;;;13938:6;;;;13930:46;;;;-1:-1:-1;;;13930:46:0;;;;;;;:::i;14703:220::-;14761:7;14785:6;14781:20;;-1:-1:-1;14800:1:0;14793:8;;14781:20;14824:5;;;14828:1;14824;:5;:1;14848:5;;;;;:10;14840:56;;;;-1:-1:-1;;;14840:56:0;;;;;;;:::i;44767:236::-;44847:7;;;;44907:22;44911:3;44923:5;44907:3;:22::i;:::-;44876:53;;;;-1:-1:-1;44767:236:0;-1:-1:-1;;;;;44767:236:0:o;62203:100::-;62276:19;;;;:8;;:19;;;;;:::i;46053:213::-;46160:7;46211:44;46216:3;46236;46242:12;46211:4;:44::i;:::-;46203:53;-1:-1:-1;46053:213:0;;;;;;:::o;56988:272::-;57102:28;57112:4;57118:2;57122:7;57102:9;:28::i;:::-;57149:48;57172:4;57178:2;57182:7;57191:5;57149:22;:48::i;:::-;57141:111;;;;-1:-1:-1;;;57141:111:0;;;;;;;:::i;46517:746::-;46573:13;46794:10;46790:53;;-1:-1:-1;46821:10:0;;;;;;;;;;;;-1:-1:-1;;;46821:10:0;;;;;;46790:53;46868:5;46853:12;46909:78;46916:9;;46909:78;;46942:8;;46973:2;46965:10;;;;46909:78;;;46997:19;47029:6;47019:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47019:17:0;-1:-1:-1;47091:5:0;;-1:-1:-1;46997:39:0;-1:-1:-1;;;47063:10:0;;47107:117;47114:9;;47107:117;;47183:2;47176:4;:9;47171:2;:14;47158:29;;47140:6;47147:7;;;;;;;47140:15;;;;;;;;;;;:47;-1:-1:-1;;;;;47140:47:0;;;;;;;;-1:-1:-1;47210:2:0;47202:10;;;;47107:117;;;-1:-1:-1;47248:6:0;46517:746;-1:-1:-1;;;;46517:746:0:o;44066:151::-;44150:4;44174:35;44184:3;44204;44174:9;:35::i;40884:110::-;40967:19;;40884:110::o;35183:137::-;35253:4;35277:35;35285:3;35305:5;35277:7;:35::i;43840:142::-;43917:4;43941:33;43949:3;43969;43941:7;:33::i;58902:250::-;58998:18;59004:2;59008:7;58998:5;:18::i;:::-;59035:54;59066:1;59070:2;59074:7;59083:5;59035:22;:54::i;:::-;59027:117;;;;-1:-1:-1;;;59027:117:0;;;;;;;:::i;34876:131::-;34943:4;34967:32;34972:3;34992:5;34967:4;:32::i;43489:185::-;43578:4;43602:64;43607:3;43627;-1:-1:-1;;;;;43641:23:0;;43602:4;:64::i;31134:204::-;31229:18;;31201:7;;31229:26;-1:-1:-1;31221:73:0;;;;-1:-1:-1;;;31221:73:0;;;;;;;:::i;:::-;31312:3;:11;;31324:5;31312:18;;;;;;;;;;;;;;;;31305:25;;31134:204;;;;:::o;41349:279::-;41453:19;;41416:7;;;;41453:27;-1:-1:-1;41445:74:0;;;;-1:-1:-1;;;41445:74:0;;;;;;;:::i;:::-;41532:22;41557:3;:12;;41570:5;41557:19;;;;;;;;;;;;;;;;;;41532:44;;41595:5;:10;;;41607:5;:12;;;41587:33;;;;;41349:279;;;;;:::o;42846:319::-;42940:7;42979:17;;;:12;;;:17;;;;;;43030:12;43015:13;43007:36;;;;-1:-1:-1;;;43007:36:0;;;;;;;;:::i;:::-;;43097:3;:12;;43121:1;43110:8;:12;43097:26;;;;;;;;;;;;;;;;;;:33;;;43090:40;;;42846:319;;;;;:::o;62868:604::-;62989:4;63016:15;:2;-1:-1:-1;;;;;63016:13:0;;:15::i;:::-;63011:60;;-1:-1:-1;63055:4:0;63048:11;;63011:60;63081:23;63107:252;-1:-1:-1;;;63220:12:0;:10;:12::i;:::-;63247:4;63266:7;63288:5;63123:181;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;63123:181:0;;;;;;;-1:-1:-1;;;;;63123:181:0;;;;;;;;;;;63107:252;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;63107:15:0;;;:252;:15;:252::i;:::-;63081:278;;63370:13;63397:10;63386:32;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;63437:26:0;-1:-1:-1;;;63437:26:0;;-1:-1:-1;;;62868:604:0;;;;;;:::o;40664:125::-;40735:4;40759:17;;;:12;;;;;:17;;;;;;:22;;;40664:125::o;28836:1544::-;28902:4;29041:19;;;:12;;;:19;;;;;;29077:15;;29073:1300;;29512:18;;-1:-1:-1;;29463:14:0;;;;29512:22;;;;29439:21;;29512:3;;:22;;29799;;;;;;;;;;;;;;29779:42;;29945:9;29916:3;:11;;29928:13;29916:26;;;;;;;;;;;;;;;;;;;:38;;;;30022:23;;;30064:1;30022:12;;;:23;;;;;;30048:17;;;30022:43;;30174:17;;30022:3;;30174:17;;;;;;;;;;;;;;;;;;;;;;30269:3;:12;;:19;30282:5;30269:19;;;;;;;;;;;30262:26;;;30312:4;30305:11;;;;;;;;29073:1300;30356:5;30349:12;;;;;39031:1549;39095:4;39230:17;;;:12;;;:17;;;;;;39264:13;;39260:1313;;39696:19;;-1:-1:-1;;39649:12:0;;;;39696:23;;;;39625:21;;39696:3;;:23;;39993;;;;;;;;;;;;;;;;39964:52;;40141:9;40111:3;:12;;40124:13;40111:27;;;;;;;;;;;;;;;;:39;;:27;;;;;:39;;;;;;;;;;;;;;;40231:14;;40218:28;;:12;;;:28;;;;;40249:17;;;40218:48;;40375:18;;40218:3;;40375:18;;;;;;;;;;;;;;-1:-1:-1;;40375:18:0;;;;;;;;;;;;;;;;;;;;;40471:17;;;:12;;;:17;;;;;;40464:24;;;;40375:18;-1:-1:-1;40505:11:0;;-1:-1:-1;;;;40505:11:0;59488:404;-1:-1:-1;;;;;59568:16:0;;59560:61;;;;-1:-1:-1;;;59560:61:0;;;;;;;:::i;:::-;59641:16;59649:7;59641;:16::i;:::-;59640:17;59632:58;;;;-1:-1:-1;;;59632:58:0;;;;;;;:::i;:::-;59703:45;59732:1;59736:2;59740:7;59703:20;:45::i;:::-;-1:-1:-1;;;;;59761:17:0;;;;;;:13;:17;;;;;:30;;59783:7;59761:21;:30::i;:::-;-1:-1:-1;59804:29:0;:12;59821:7;59830:2;59804:16;:29::i;:::-;-1:-1:-1;59851:33:0;;59876:7;;-1:-1:-1;;;;;59851:33:0;;;59868:1;;59851:33;;59868:1;;59851:33;59488:404;;:::o;28246:414::-;28309:4;28331:21;28341:3;28346:5;28331:9;:21::i;:::-;28326:327;;-1:-1:-1;28369:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;28552:18;;28530:19;;;:12;;;:19;;;;;;:40;;;;28585:11;;28326:327;-1:-1:-1;28636:5:0;28629:12;;38164:692;38240:4;38375:17;;;:12;;;:17;;;;;;38409:13;38405:444;;-1:-1:-1;;38494:38:0;;;;;;;;;;;;;;;;;;38476:57;;;;;;;;:12;:57;;;;;;;;;;;;;;;;;;;;;;;;38691:19;;38671:17;;;:12;;;:17;;;;;;;:39;38725:11;;38405:444;38805:5;38769:3;:12;;38793:1;38782:8;:12;38769:26;;;;;;;;;;;;;;;;;;:33;;:41;;;;38832:5;38825:12;;;;;19265:422;19632:20;19671:8;;;19265:422::o;22183:195::-;22286:12;22318:52;22340:6;22348:4;22354:1;22357:12;22286;23487:18;23498:6;23487:10;:18::i;:::-;23479:60;;;;-1:-1:-1;;;23479:60:0;;;;;;;:::i;:::-;23613:12;23627:23;23654:6;-1:-1:-1;;;;;23654:11:0;23674:5;23682:4;23654:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23612:75;;;;23705:52;23723:7;23732:10;23744:12;23705:17;:52::i;:::-;23698:59;23235:530;-1:-1:-1;;;;;;;23235:530:0:o;25775:742::-;25890:12;25919:7;25915:595;;;-1:-1:-1;25950:10:0;25943:17;;25915:595;26064:17;;:21;26060:439;;26327:10;26321:17;26388:15;26375:10;26371:2;26367:19;26360:44;26275:148;26470:12;26463:20;;-1:-1:-1;;;26463:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:589:1;;110:18;151:2;143:6;140:14;137:2;;;157:9;137:2;197;191:9;270:2;247:17;;-1:-1:-1;;243:31:1;231:44;;277:4;227:55;297:18;;;317:22;;;294:46;291:2;;;343:9;291:2;370;363:22;418;;;403:6;-1:-1:-1;403:6:1;455:16;;;452:25;-1:-1:-1;449:2:1;;;490:1;487;480:12;449:2;540:6;535:3;528:4;520:6;516:17;503:44;595:1;588:4;579:6;571;567:19;563:30;556:41;;;90:513;;;;;:::o;608:259::-;;720:2;708:9;699:7;695:23;691:32;688:2;;;741:6;733;726:22;688:2;785:9;772:23;804:33;831:5;804:33;:::i;872:263::-;;995:2;983:9;974:7;970:23;966:32;963:2;;;1016:6;1008;1001:22;963:2;1053:9;1047:16;1072:33;1099:5;1072:33;:::i;1140:402::-;;;1269:2;1257:9;1248:7;1244:23;1240:32;1237:2;;;1290:6;1282;1275:22;1237:2;1334:9;1321:23;1353:33;1380:5;1353:33;:::i;:::-;1405:5;-1:-1:-1;1462:2:1;1447:18;;1434:32;1475:35;1434:32;1475:35;:::i;:::-;1529:7;1519:17;;;1227:315;;;;;:::o;1547:470::-;;;;1693:2;1681:9;1672:7;1668:23;1664:32;1661:2;;;1714:6;1706;1699:22;1661:2;1758:9;1745:23;1777:33;1804:5;1777:33;:::i;:::-;1829:5;-1:-1:-1;1886:2:1;1871:18;;1858:32;1899:35;1858:32;1899:35;:::i;:::-;1651:366;;1953:7;;-1:-1:-1;;;2007:2:1;1992:18;;;;1979:32;;1651:366::o;2022:830::-;;;;;2194:3;2182:9;2173:7;2169:23;2165:33;2162:2;;;2216:6;2208;2201:22;2162:2;2260:9;2247:23;2279:33;2306:5;2279:33;:::i;:::-;2331:5;-1:-1:-1;2388:2:1;2373:18;;2360:32;2401:35;2360:32;2401:35;:::i;:::-;2455:7;-1:-1:-1;2509:2:1;2494:18;;2481:32;;-1:-1:-1;2564:2:1;2549:18;;2536:32;2591:18;2580:30;;2577:2;;;2628:6;2620;2613:22;2577:2;2656:22;;2709:4;2701:13;;2697:27;-1:-1:-1;2687:2:1;;2743:6;2735;2728:22;2687:2;2771:75;2838:7;2833:2;2820:16;2815:2;2811;2807:11;2771:75;:::i;:::-;2761:85;;;2152:700;;;;;;;:::o;2857:396::-;;;2983:2;2971:9;2962:7;2958:23;2954:32;2951:2;;;3004:6;2996;2989:22;2951:2;3048:9;3035:23;3067:33;3094:5;3067:33;:::i;:::-;3119:5;-1:-1:-1;3176:2:1;3161:18;;3148:32;3189;3148;3189;:::i;3258:327::-;;;3387:2;3375:9;3366:7;3362:23;3358:32;3355:2;;;3408:6;3400;3393:22;3355:2;3452:9;3439:23;3471:33;3498:5;3471:33;:::i;:::-;3523:5;3575:2;3560:18;;;;3547:32;;-1:-1:-1;;;3345:240:1:o;3590:464::-;;;;;3753:3;3741:9;3732:7;3728:23;3724:33;3721:2;;;3775:6;3767;3760:22;3721:2;3819:9;3806:23;3838:33;3865:5;3838:33;:::i;:::-;3890:5;3942:2;3927:18;;3914:32;;-1:-1:-1;3993:2:1;3978:18;;3965:32;;4044:2;4029:18;4016:32;;-1:-1:-1;3711:343:1;-1:-1:-1;;;3711:343:1:o;4059:257::-;;4179:2;4167:9;4158:7;4154:23;4150:32;4147:2;;;4200:6;4192;4185:22;4147:2;4237:9;4231:16;4256:30;4280:5;4256:30;:::i;4321:257::-;;4432:2;4420:9;4411:7;4407:23;4403:32;4400:2;;;4453:6;4445;4438:22;4400:2;4497:9;4484:23;4516:32;4542:5;4516:32;:::i;4583:261::-;;4705:2;4693:9;4684:7;4680:23;4676:32;4673:2;;;4726:6;4718;4711:22;4673:2;4763:9;4757:16;4782:32;4808:5;4782:32;:::i;4849:482::-;;4971:2;4959:9;4950:7;4946:23;4942:32;4939:2;;;4992:6;4984;4977:22;4939:2;5037:9;5024:23;5070:18;5062:6;5059:30;5056:2;;;5107:6;5099;5092:22;5056:2;5135:22;;5188:4;5180:13;;5176:27;-1:-1:-1;5166:2:1;;5222:6;5214;5207:22;5166:2;5250:75;5317:7;5312:2;5299:16;5294:2;5290;5286:11;5250:75;:::i;5336:190::-;;5448:2;5436:9;5427:7;5423:23;5419:32;5416:2;;;5469:6;5461;5454:22;5416:2;-1:-1:-1;5497:23:1;;5406:120;-1:-1:-1;5406:120:1:o;5531:258::-;;;5660:2;5648:9;5639:7;5635:23;5631:32;5628:2;;;5681:6;5673;5666:22;5628:2;-1:-1:-1;;5709:23:1;;;5779:2;5764:18;;;5751:32;;-1:-1:-1;5618:171:1:o;5794:259::-;;5875:5;5869:12;5902:6;5897:3;5890:19;5918:63;5974:6;5967:4;5962:3;5958:14;5951:4;5944:5;5940:16;5918:63;:::i;:::-;6035:2;6014:15;-1:-1:-1;;6010:29:1;6001:39;;;;6042:4;5997:50;;5845:208;-1:-1:-1;;5845:208:1:o;6058:274::-;;6225:6;6219:13;6241:53;6287:6;6282:3;6275:4;6267:6;6263:17;6241:53;:::i;:::-;6310:16;;;;;6195:137;-1:-1:-1;;6195:137:1:o;6337:470::-;;6554:6;6548:13;6570:53;6616:6;6611:3;6604:4;6596:6;6592:17;6570:53;:::i;:::-;6686:13;;6645:16;;;;6708:57;6686:13;6645:16;6742:4;6730:17;;6708:57;:::i;:::-;6781:20;;6524:283;-1:-1:-1;;;;6524:283:1:o;6812:203::-;-1:-1:-1;;;;;6976:32:1;;;;6958:51;;6946:2;6931:18;;6913:102::o;7020:506::-;-1:-1:-1;;;;;7305:15:1;;;7287:34;;7357:15;;7352:2;7337:18;;7330:43;7404:2;7389:18;;7382:34;;;7452:3;7447:2;7432:18;;7425:31;;;7020:506;;7473:47;;7500:19;;7492:6;7473:47;:::i;:::-;7465:55;7239:287;-1:-1:-1;;;;;;7239:287:1:o;7531:353::-;-1:-1:-1;;;;;7759:32:1;;;;7741:51;;7823:2;7808:18;;7801:34;;;;7866:2;7851:18;;7844:34;7729:2;7714:18;;7696:188::o;7889:375::-;-1:-1:-1;;;;;8147:15:1;;;8129:34;;8199:15;;;;8194:2;8179:18;;8172:43;8246:2;8231:18;;8224:34;;;;8079:2;8064:18;;8046:218::o;8269:274::-;-1:-1:-1;;;;;8461:32:1;;;;8443:51;;8525:2;8510:18;;8503:34;8431:2;8416:18;;8398:145::o;8548:635::-;8719:2;8771:21;;;8841:13;;8744:18;;;8863:22;;;8548:635;;8719:2;8942:15;;;;8916:2;8901:18;;;8548:635;8988:169;9002:6;8999:1;8996:13;8988:169;;;9063:13;;9051:26;;9132:15;;;;9097:12;;;;9024:1;9017:9;8988:169;;;-1:-1:-1;9174:3:1;;8699:484;-1:-1:-1;;;;;;8699:484:1:o;9188:187::-;9353:14;;9346:22;9328:41;;9316:2;9301:18;;9283:92::o;9380:221::-;;9529:2;9518:9;9511:21;9549:46;9591:2;9580:9;9576:18;9568:6;9549:46;:::i;9606:398::-;9808:2;9790:21;;;9847:2;9827:18;;;9820:30;9886:34;9881:2;9866:18;;9859:62;-1:-1:-1;;;9952:2:1;9937:18;;9930:32;9994:3;9979:19;;9780:224::o;10009:345::-;10211:2;10193:21;;;10250:2;10230:18;;;10223:30;-1:-1:-1;;;10284:2:1;10269:18;;10262:51;10345:2;10330:18;;10183:171::o;10359:346::-;10561:2;10543:21;;;10600:2;10580:18;;;10573:30;-1:-1:-1;;;10634:2:1;10619:18;;10612:52;10696:2;10681:18;;10533:172::o;10710:353::-;10912:2;10894:21;;;10951:2;10931:18;;;10924:30;10990:31;10985:2;10970:18;;10963:59;11054:2;11039:18;;10884:179::o;11068:344::-;11270:2;11252:21;;;11309:2;11289:18;;;11282:30;-1:-1:-1;;;11343:2:1;11328:18;;11321:50;11403:2;11388:18;;11242:170::o;11417:414::-;11619:2;11601:21;;;11658:2;11638:18;;;11631:30;11697:34;11692:2;11677:18;;11670:62;-1:-1:-1;;;11763:2:1;11748:18;;11741:48;11821:3;11806:19;;11591:240::o;11836:402::-;12038:2;12020:21;;;12077:2;12057:18;;;12050:30;12116:34;12111:2;12096:18;;12089:62;-1:-1:-1;;;12182:2:1;12167:18;;12160:36;12228:3;12213:19;;12010:228::o;12243:352::-;12445:2;12427:21;;;12484:2;12464:18;;;12457:30;12523;12518:2;12503:18;;12496:58;12586:2;12571:18;;12417:178::o;12600:351::-;12802:2;12784:21;;;12841:2;12821:18;;;12814:30;12880:29;12875:2;12860:18;;12853:57;12942:2;12927:18;;12774:177::o;12956:399::-;13158:2;13140:21;;;13197:2;13177:18;;;13170:30;13236:34;13231:2;13216:18;;13209:62;-1:-1:-1;;;13302:2:1;13287:18;;13280:33;13345:3;13330:19;;13130:225::o;13360:351::-;13562:2;13544:21;;;13601:2;13581:18;;;13574:30;13640:29;13635:2;13620:18;;13613:57;13702:2;13687:18;;13534:177::o;13716:400::-;13918:2;13900:21;;;13957:2;13937:18;;;13930:30;13996:34;13991:2;13976:18;;13969:62;-1:-1:-1;;;14062:2:1;14047:18;;14040:34;14106:3;14091:19;;13890:226::o;14121:349::-;14323:2;14305:21;;;14362:2;14342:18;;;14335:30;14401:27;14396:2;14381:18;;14374:55;14461:2;14446:18;;14295:175::o;14475:422::-;14677:2;14659:21;;;14716:2;14696:18;;;14689:30;14755:34;14750:2;14735:18;;14728:62;14826:28;14821:2;14806:18;;14799:56;14887:3;14872:19;;14649:248::o;14902:355::-;15104:2;15086:21;;;15143:2;15123:18;;;15116:30;15182:33;15177:2;15162:18;;15155:61;15248:2;15233:18;;15076:181::o;15262:354::-;15464:2;15446:21;;;15503:2;15483:18;;;15476:30;15542:32;15537:2;15522:18;;15515:60;15607:2;15592:18;;15436:180::o;15621:417::-;15823:2;15805:21;;;15862:2;15842:18;;;15835:30;15901:34;15896:2;15881:18;;15874:62;-1:-1:-1;;;15967:2:1;15952:18;;15945:51;16028:3;16013:19;;15795:243::o;16450:408::-;16652:2;16634:21;;;16691:2;16671:18;;;16664:30;16730:34;16725:2;16710:18;;16703:62;-1:-1:-1;;;16796:2:1;16781:18;;16774:42;16848:3;16833:19;;16624:234::o;16863:397::-;17065:2;17047:21;;;17104:2;17084:18;;;17077:30;17143:34;17138:2;17123:18;;17116:62;-1:-1:-1;;;17209:2:1;17194:18;;17187:31;17250:3;17235:19;;17037:223::o;17265:403::-;17467:2;17449:21;;;17506:2;17486:18;;;17479:30;17545:34;17540:2;17525:18;;17518:62;-1:-1:-1;;;17611:2:1;17596:18;;17589:37;17658:3;17643:19;;17439:229::o;17673:401::-;17875:2;17857:21;;;17914:2;17894:18;;;17887:30;17953:34;17948:2;17933:18;;17926:62;-1:-1:-1;;;18019:2:1;18004:18;;17997:35;18064:3;18049:19;;17847:227::o;18079:420::-;18281:2;18263:21;;;18320:2;18300:18;;;18293:30;18359:34;18354:2;18339:18;;18332:62;18430:26;18425:2;18410:18;;18403:54;18489:3;18474:19;;18253:246::o;18504:406::-;18706:2;18688:21;;;18745:2;18725:18;;;18718:30;18784:34;18779:2;18764:18;;18757:62;-1:-1:-1;;;18850:2:1;18835:18;;18828:40;18900:3;18885:19;;18678:232::o;18915:403::-;19117:2;19099:21;;;19156:2;19136:18;;;19129:30;19195:34;19190:2;19175:18;;19168:62;-1:-1:-1;;;19261:2:1;19246:18;;19239:37;19308:3;19293:19;;19089:229::o;19323:398::-;19525:2;19507:21;;;19564:2;19544:18;;;19537:30;19603:34;19598:2;19583:18;;19576:62;-1:-1:-1;;;19669:2:1;19654:18;;19647:32;19711:3;19696:19;;19497:224::o;19726:356::-;19928:2;19910:21;;;19947:18;;;19940:30;20006:34;20001:2;19986:18;;19979:62;20073:2;20058:18;;19900:182::o;20087:397::-;20289:2;20271:21;;;20328:2;20308:18;;;20301:30;20367:34;20362:2;20347:18;;20340:62;-1:-1:-1;;;20433:2:1;20418:18;;20411:31;20474:3;20459:19;;20261:223::o;20489:408::-;20691:2;20673:21;;;20730:2;20710:18;;;20703:30;20769:34;20764:2;20749:18;;20742:62;-1:-1:-1;;;20835:2:1;20820:18;;20813:42;20887:3;20872:19;;20663:234::o;20902:335::-;21104:2;21086:21;;;21143:2;21123:18;;;21116:30;-1:-1:-1;;;21177:2:1;21162:18;;21155:41;21228:2;21213:18;;21076:161::o;21242:356::-;21444:2;21426:21;;;21463:18;;;21456:30;21522:34;21517:2;21502:18;;21495:62;21589:2;21574:18;;21416:182::o;21603:405::-;21805:2;21787:21;;;21844:2;21824:18;;;21817:30;21883:34;21878:2;21863:18;;21856:62;-1:-1:-1;;;21949:2:1;21934:18;;21927:39;21998:3;21983:19;;21777:231::o;22013:411::-;22215:2;22197:21;;;22254:2;22234:18;;;22227:30;22293:34;22288:2;22273:18;;22266:62;-1:-1:-1;;;22359:2:1;22344:18;;22337:45;22414:3;22399:19;;22187:237::o;22429:397::-;22631:2;22613:21;;;22670:2;22650:18;;;22643:30;22709:34;22704:2;22689:18;;22682:62;-1:-1:-1;;;22775:2:1;22760:18;;22753:31;22816:3;22801:19;;22603:223::o;22831:342::-;23033:2;23015:21;;;23072:2;23052:18;;;23045:30;-1:-1:-1;;;23106:2:1;23091:18;;23084:48;23164:2;23149:18;;23005:168::o;23178:413::-;23380:2;23362:21;;;23419:2;23399:18;;;23392:30;23458:34;23453:2;23438:18;;23431:62;-1:-1:-1;;;23524:2:1;23509:18;;23502:47;23581:3;23566:19;;23352:239::o;23596:397::-;23798:2;23780:21;;;23837:2;23817:18;;;23810:30;23876:34;23871:2;23856:18;;23849:62;-1:-1:-1;;;23942:2:1;23927:18;;23920:31;23983:3;23968:19;;23770:223::o;23998:353::-;24200:2;24182:21;;;24239:2;24219:18;;;24212:30;24278:31;24273:2;24258:18;;24251:59;24342:2;24327:18;;24172:179::o;24356:356::-;24558:2;24540:21;;;24577:18;;;24570:30;24636:34;24631:2;24616:18;;24609:62;24703:2;24688:18;;24530:182::o;24717:405::-;24919:2;24901:21;;;24958:2;24938:18;;;24931:30;24997:34;24992:2;24977:18;;24970:62;-1:-1:-1;;;25063:2:1;25048:18;;25041:39;25112:3;25097:19;;24891:231::o;25127:399::-;25329:2;25311:21;;;25368:2;25348:18;;;25341:30;25407:34;25402:2;25387:18;;25380:62;-1:-1:-1;;;25473:2:1;25458:18;;25451:33;25516:3;25501:19;;25301:225::o;25531:403::-;25733:2;25715:21;;;25772:2;25752:18;;;25745:30;25811:34;25806:2;25791:18;;25784:62;-1:-1:-1;;;25877:2:1;25862:18;;25855:37;25924:3;25909:19;;25705:229::o;25939:399::-;26141:2;26123:21;;;26180:2;26160:18;;;26153:30;26219:34;26214:2;26199:18;;26192:62;-1:-1:-1;;;26285:2:1;26270:18;;26263:33;26328:3;26313:19;;26113:225::o;26343:348::-;26545:2;26527:21;;;26584:2;26564:18;;;26557:30;26623:26;26618:2;26603:18;;26596:54;26682:2;26667:18;;26517:174::o;26696:177::-;26842:25;;;26830:2;26815:18;;26797:76::o;26878:258::-;26950:1;26960:113;26974:6;26971:1;26968:13;26960:113;;;27050:11;;;27044:18;27031:11;;;27024:39;26996:2;26989:10;26960:113;;;27091:6;27088:1;27085:13;27082:2;;;-1:-1:-1;;27126:1:1;27108:16;;27101:27;26931:205::o;27141:133::-;-1:-1:-1;;;;;27218:31:1;;27208:42;;27198:2;;27264:1;27261;27254:12;27279:120;27367:5;27360:13;27353:21;27346:5;27343:32;27333:2;;27389:1;27386;27379:12;27404:133;-1:-1:-1;;;;;;27480:32:1;;27470:43;;27460:2;;27527:1;27524;27517:12

Swarm Source

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