ETH Price: $3,817.28 (-4.37%)

Token

Crazy Dragon Corps (Dragon)
 

Overview

Max Total Supply

1,249 Dragon

Holders

628

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
starkiller.eth
Balance
1 Dragon
0x9b536f2e9aaaaaf229d47714b71dee4e4a0b227a
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:
Dragon

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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


pragma solidity ^0.8.0;

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

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

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

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

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

}

pragma solidity ^0.8.0;

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

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

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

pragma solidity ^0.8.0;

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


pragma solidity ^0.8.0;

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


pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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




pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

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

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


pragma solidity ^0.8.0;

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping (uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping (address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping (uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping (address => mapping (address => bool)) private _operatorApprovals;

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

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

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

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0
        ? string(abi.encodePacked(baseURI, tokenId.toString()))
        : '';
    }

    /**
     * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden
     * in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;


contract Dragon is ERC721Enumerable, Ownable{
    using SafeMath for uint256;
    using Address for address;
    using Strings for uint256;

    string public DRAGON_PROVENANCE = "";
    string public LIZARD_PROVENANCE = "";

    address public lizardContract;

    uint256 public MAX_SUPPLY = 10000;
    bool public saleIsActive = false;
    bool public openBet = false;

    uint256 public startingIndex;
    uint256 public startingIndexBlock;

    string private _baseURIExtended;
    mapping (uint256 => string) _tokenURIs;

    constructor() ERC721("Crazy Dragon Corps","Dragon"){
    }

    function setLizardContractAddress(address contractAddress) public onlyOwner {
        lizardContract = contractAddress;
    }

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

    function flipBetState() public onlyOwner {
        openBet = !openBet;
    }

    function setLizardProvenanceHash(string memory provenanceHash) public onlyOwner {
        LIZARD_PROVENANCE = provenanceHash;
    }

    function setDragonProvenanceHash(string memory provenanceHash) public onlyOwner {
        DRAGON_PROVENANCE = provenanceHash;
    }

    function composeDragon(address owner) public returns (bool) {
        require(saleIsActive, "Dragon is not active at the moment");
        require(totalSupply().add(1) <= MAX_SUPPLY, "Compose would exceed max supply of Dragon");
        require(msg.sender == lizardContract, "wrong caller");

        _safeMint(owner, totalSupply());
        return true;
    }

    function betDragon(address owner) public returns (bool) {
        require(saleIsActive, "Dragon is not active at the moment");
        require(openBet, "The bet function is disabled");
        require(totalSupply().add(1) <= MAX_SUPPLY, "Compose would exceed max supply of Dragon");
        require(msg.sender == lizardContract, "wrong caller");
        require(!isContractAddress(owner), "owner should not be a contract");

        if (_rand() <= 33) {
            _safeMint(owner, totalSupply());
        }
        return true;
    }

    function isContractAddress(address _addr) private view returns (bool isContract){
        uint32 size;
        assembly {
            size := extcodesize(_addr)
        }
        return (size > 0);
    }

    function _rand() internal view returns(uint256) {
        uint256 seed = uint256(keccak256(abi.encodePacked(
                block.timestamp + block.difficulty +
                ((uint256(keccak256(abi.encodePacked(block.coinbase)))) / (block.timestamp)) +
                block.gaslimit +
                ((uint256(keccak256(abi.encodePacked(msg.sender)))) / (block.timestamp)) +
                block.number
            )));

        return seed % 100;
    }

    function calcStartingIndex() public onlyOwner {
        require(startingIndex == 0, "Starting index has already been set");
        require(startingIndexBlock != 0, "Starting index has not been set yet");

        startingIndex = uint(blockhash(startingIndexBlock)) % MAX_SUPPLY;
        // Just a sanity case in the worst case if this function is called late (EVM only stores last 256 block hashes)
        if(block.number.sub(startingIndexBlock) > 255) {
            startingIndex = uint(blockhash(block.number - 1)) % MAX_SUPPLY;
        }

        // To prevent original sequence
        if (startingIndex == 0) {
            startingIndex = startingIndex.add(1);
        }
    }

    function emergencySetStartingIndexBlock() public onlyOwner {
        require(startingIndex == 0, "Starting index is already set");
        startingIndexBlock = block.number;
    }

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

    // Sets base URI for all tokens, only able to be called by contract owner
    function setBaseURI(string memory baseURI_) external onlyOwner {
        _baseURIExtended = baseURI_;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DRAGON_PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LIZARD_PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"betDragon","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"calcStartingIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"composeDragon","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencySetStartingIndexBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipBetState","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":"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":"lizardContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openBet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setDragonProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setLizardContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setLizardProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startingIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startingIndexBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180602001604052806000815250600b90805190602001906200002b929190620001fd565b5060405180602001604052806000815250600c908051906020019062000053929190620001fd565b50612710600e556000600f60006101000a81548160ff0219169083151502179055506000600f60016101000a81548160ff0219169083151502179055503480156200009d57600080fd5b506040518060400160405280601281526020017f4372617a7920447261676f6e20436f72707300000000000000000000000000008152506040518060400160405280600681526020017f447261676f6e0000000000000000000000000000000000000000000000000000815250816000908051906020019062000122929190620001fd565b5080600190805190602001906200013b929190620001fd565b505050600062000150620001f560201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35062000312565b600033905090565b8280546200020b90620002ad565b90600052602060002090601f0160209004810192826200022f57600085556200027b565b82601f106200024a57805160ff19168380011785556200027b565b828001600101855582156200027b579182015b828111156200027a5782518255916020019190600101906200025d565b5b5090506200028a91906200028e565b5090565b5b80821115620002a95760008160009055506001016200028f565b5090565b60006002820490506001821680620002c657607f821691505b60208210811415620002dd57620002dc620002e3565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6148c180620003226000396000f3fe608060405234801561001057600080fd5b50600436106102275760003560e01c80637586dbec11610130578063ae6e060c116100b8578063e13f351a1161007c578063e13f351a1461062c578063e36d649814610636578063e985e9c514610654578063eb8d244414610684578063f2fde38b146106a257610227565b8063ae6e060c1461059a578063b88d4fde146105b8578063c87b56dd146105d4578063cb774d4714610604578063d48fc6af1461062257610227565b806395d89b41116100ff57806395d89b41146104f657806398cd638e146105145780639be2c12714610530578063a22cb4651461054e578063a96f7ef11461056a57610227565b80637586dbec146104965780637d17fcbe146104b25780638da5cb5b146104bc578063916a9a80146104da57610227565b806334918dfd116101b357806355f804b31161018257806355f804b3146103e05780636352211e146103fc57806370a082311461042c578063715018a61461045c578063725625a01461046657610227565b806334918dfd1461036c57806342842e0e146103765780634f5e9452146103925780634f6ccce7146103b057610227565b806318160ddd116101fa57806318160ddd146102c6578063225afdfc146102e457806323b872dd146103025780632f745c591461031e57806332cb6b0c1461034e57610227565b806301ffc9a71461022c57806306fdde031461025c578063081812fc1461027a578063095ea7b3146102aa575b600080fd5b610246600480360381019061024191906134a1565b6106be565b604051610253919061407a565b60405180910390f35b610264610738565b6040516102719190614095565b60405180910390f35b610294600480360381019061028f9190613534565b6107ca565b6040516102a19190614013565b60405180910390f35b6102c460048036038101906102bf9190613465565b61084f565b005b6102ce610967565b6040516102db91906143f7565b60405180910390f35b6102ec610974565b6040516102f9919061407a565b60405180910390f35b61031c6004803603810190610317919061335f565b610987565b005b61033860048036038101906103339190613465565b6109e7565b60405161034591906143f7565b60405180910390f35b610356610a8c565b60405161036391906143f7565b60405180910390f35b610374610a92565b005b610390600480360381019061038b919061335f565b610b3a565b005b61039a610b5a565b6040516103a79190614013565b60405180910390f35b6103ca60048036038101906103c59190613534565b610b80565b6040516103d791906143f7565b60405180910390f35b6103fa60048036038101906103f591906134f3565b610c17565b005b61041660048036038101906104119190613534565b610cad565b6040516104239190614013565b60405180910390f35b610446600480360381019061044191906132fa565b610d5f565b60405161045391906143f7565b60405180910390f35b610464610e17565b005b610480600480360381019061047b91906132fa565b610f54565b60405161048d919061407a565b60405180910390f35b6104b060048036038101906104ab91906134f3565b611156565b005b6104ba6111ec565b005b6104c46112b6565b6040516104d19190614013565b60405180910390f35b6104f460048036038101906104ef91906132fa565b6112e0565b005b6104fe6113a0565b60405161050b9190614095565b60405180910390f35b61052e600480360381019061052991906134f3565b611432565b005b6105386114c8565b6040516105459190614095565b60405180910390f35b61056860048036038101906105639190613429565b611556565b005b610584600480360381019061057f91906132fa565b6116d7565b604051610591919061407a565b60405180910390f35b6105a2611831565b6040516105af9190614095565b60405180910390f35b6105d260048036038101906105cd91906133ae565b6118bf565b005b6105ee60048036038101906105e99190613534565b611921565b6040516105fb9190614095565b60405180910390f35b61060c611a94565b60405161061991906143f7565b60405180910390f35b61062a611a9a565b005b610634611b42565b005b61063e611ccf565b60405161064b91906143f7565b60405180910390f35b61066e60048036038101906106699190613323565b611cd5565b60405161067b919061407a565b60405180910390f35b61068c611d69565b604051610699919061407a565b60405180910390f35b6106bc60048036038101906106b791906132fa565b611d7c565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610731575061073082611f28565b5b9050919050565b60606000805461074790614669565b80601f016020809104026020016040519081016040528092919081815260200182805461077390614669565b80156107c05780601f10610795576101008083540402835291602001916107c0565b820191906000526020600020905b8154815290600101906020018083116107a357829003601f168201915b5050505050905090565b60006107d58261200a565b610814576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080b906142d7565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061085a82610cad565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c290614357565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108ea612076565b73ffffffffffffffffffffffffffffffffffffffff161480610919575061091881610913612076565b611cd5565b5b610958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094f90614237565b60405180910390fd5b610962838361207e565b505050565b6000600880549050905090565b600f60019054906101000a900460ff1681565b610998610992612076565b82612137565b6109d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ce90614377565b60405180910390fd5b6109e2838383612215565b505050565b60006109f283610d5f565b8210610a33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2a90614117565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600e5481565b610a9a612076565b73ffffffffffffffffffffffffffffffffffffffff16610ab86112b6565b73ffffffffffffffffffffffffffffffffffffffff1614610b0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b05906142f7565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b610b55838383604051806020016040528060008152506118bf565b505050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610b8a610967565b8210610bcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc290614397565b60405180910390fd5b60088281548110610c05577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610c1f612076565b73ffffffffffffffffffffffffffffffffffffffff16610c3d6112b6565b73ffffffffffffffffffffffffffffffffffffffff1614610c93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8a906142f7565b60405180910390fd5b8060129080519060200190610ca992919061311e565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4d90614277565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610dd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc790614257565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e1f612076565b73ffffffffffffffffffffffffffffffffffffffff16610e3d6112b6565b73ffffffffffffffffffffffffffffffffffffffff1614610e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8a906142f7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600f60009054906101000a900460ff16610fa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9c90614297565b60405180910390fd5b600f60019054906101000a900460ff16610ff4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610feb906140b7565b60405180910390fd5b600e546110126001611004610967565b61247190919063ffffffff16565b1115611053576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104a906140d7565b60405180910390fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146110e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110da906143d7565b60405180910390fd5b6110ec82612487565b1561112c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611123906141f7565b60405180910390fd5b60216111366124a0565b1161114d5761114c82611147610967565b612581565b5b60019050919050565b61115e612076565b73ffffffffffffffffffffffffffffffffffffffff1661117c6112b6565b73ffffffffffffffffffffffffffffffffffffffff16146111d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c9906142f7565b60405180910390fd5b80600c90805190602001906111e892919061311e565b5050565b6111f4612076565b73ffffffffffffffffffffffffffffffffffffffff166112126112b6565b73ffffffffffffffffffffffffffffffffffffffff1614611268576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125f906142f7565b60405180910390fd5b6000601054146112ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a490614217565b60405180910390fd5b43601181905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6112e8612076565b73ffffffffffffffffffffffffffffffffffffffff166113066112b6565b73ffffffffffffffffffffffffffffffffffffffff161461135c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611353906142f7565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600180546113af90614669565b80601f01602080910402602001604051908101604052809291908181526020018280546113db90614669565b80156114285780601f106113fd57610100808354040283529160200191611428565b820191906000526020600020905b81548152906001019060200180831161140b57829003601f168201915b5050505050905090565b61143a612076565b73ffffffffffffffffffffffffffffffffffffffff166114586112b6565b73ffffffffffffffffffffffffffffffffffffffff16146114ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a5906142f7565b60405180910390fd5b80600b90805190602001906114c492919061311e565b5050565b600c80546114d590614669565b80601f016020809104026020016040519081016040528092919081815260200182805461150190614669565b801561154e5780601f106115235761010080835404028352916020019161154e565b820191906000526020600020905b81548152906001019060200180831161153157829003601f168201915b505050505081565b61155e612076565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c3906141b7565b60405180910390fd5b80600560006115d9612076565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611686612076565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116cb919061407a565b60405180910390a35050565b6000600f60009054906101000a900460ff16611728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171f90614297565b60405180910390fd5b600e546117466001611738610967565b61247190919063ffffffff16565b1115611787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177e906140d7565b60405180910390fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180e906143d7565b60405180910390fd5b61182882611823610967565b612581565b60019050919050565b600b805461183e90614669565b80601f016020809104026020016040519081016040528092919081815260200182805461186a90614669565b80156118b75780601f1061188c576101008083540402835291602001916118b7565b820191906000526020600020905b81548152906001019060200180831161189a57829003601f168201915b505050505081565b6118d06118ca612076565b83612137565b61190f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190690614377565b60405180910390fd5b61191b8484848461259f565b50505050565b606061192c8261200a565b61196b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196290614337565b60405180910390fd5b600060136000848152602001908152602001600020805461198b90614669565b80601f01602080910402602001604051908101604052809291908181526020018280546119b790614669565b8015611a045780601f106119d957610100808354040283529160200191611a04565b820191906000526020600020905b8154815290600101906020018083116119e757829003601f168201915b505050505090506000611a156125fb565b9050600081511415611a2b578192505050611a8f565b600082511115611a60578082604051602001611a48929190613fd4565b60405160208183030381529060405292505050611a8f565b80611a6a8561268d565b604051602001611a7b929190613fd4565b604051602081830303815290604052925050505b919050565b60105481565b611aa2612076565b73ffffffffffffffffffffffffffffffffffffffff16611ac06112b6565b73ffffffffffffffffffffffffffffffffffffffff1614611b16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0d906142f7565b60405180910390fd5b600f60019054906101000a900460ff1615600f60016101000a81548160ff021916908315150217905550565b611b4a612076565b73ffffffffffffffffffffffffffffffffffffffff16611b686112b6565b73ffffffffffffffffffffffffffffffffffffffff1614611bbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb5906142f7565b60405180910390fd5b600060105414611c03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfa906143b7565b60405180910390fd5b60006011541415611c49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c40906140f7565b60405180910390fd5b600e546011544060001c611c5d9190614724565b60108190555060ff611c7a6011544361283a90919063ffffffff16565b1115611ca557600e54600143611c90919061456d565b4060001c611c9e9190614724565b6010819055505b60006010541415611ccd57611cc6600160105461247190919063ffffffff16565b6010819055505b565b60115481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600f60009054906101000a900460ff1681565b611d84612076565b73ffffffffffffffffffffffffffffffffffffffff16611da26112b6565b73ffffffffffffffffffffffffffffffffffffffff1614611df8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611def906142f7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5f90614157565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ff357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612003575061200282612850565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166120f183610cad565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006121428261200a565b612181576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612178906141d7565b60405180910390fd5b600061218c83610cad565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806121fb57508373ffffffffffffffffffffffffffffffffffffffff166121e3846107ca565b73ffffffffffffffffffffffffffffffffffffffff16145b8061220c575061220b8185611cd5565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661223582610cad565b73ffffffffffffffffffffffffffffffffffffffff161461228b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228290614317565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f290614197565b60405180910390fd5b6123068383836128ba565b61231160008261207e565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612361919061456d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123b891906144e6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000818361247f91906144e6565b905092915050565b600080823b905060008163ffffffff1611915050919050565b6000804342336040516020016124b69190613f9e565b6040516020818303038152906040528051906020012060001c6124d9919061453c565b4542416040516020016124ec9190613fb9565b6040516020818303038152906040528051906020012060001c61250f919061453c565b444261251b91906144e6565b61252591906144e6565b61252f91906144e6565b61253991906144e6565b61254391906144e6565b6040516020016125539190613ff8565b6040516020818303038152906040528051906020012060001c905060648161257b9190614724565b91505090565b61259b8282604051806020016040528060008152506129ce565b5050565b6125aa848484612215565b6125b684848484612a29565b6125f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ec90614137565b60405180910390fd5b50505050565b60606012805461260a90614669565b80601f016020809104026020016040519081016040528092919081815260200182805461263690614669565b80156126835780601f1061265857610100808354040283529160200191612683565b820191906000526020600020905b81548152906001019060200180831161266657829003601f168201915b5050505050905090565b606060008214156126d5576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612835565b600082905060005b600082146127075780806126f09061469b565b915050600a82612700919061453c565b91506126dd565b60008167ffffffffffffffff811115612749577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561277b5781602001600182028036833780820191505090505b5090505b6000851461282e57600182612794919061456d565b9150600a856127a39190614724565b60306127af91906144e6565b60f81b8183815181106127eb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612827919061453c565b945061277f565b8093505050505b919050565b60008183612848919061456d565b905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6128c5838383612bc0565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129085761290381612bc5565b612947565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612946576129458382612c0e565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561298a5761298581612d7b565b6129c9565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146129c8576129c78282612ebe565b5b5b505050565b6129d88383612f3d565b6129e56000848484612a29565b612a24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1b90614137565b60405180910390fd5b505050565b6000612a4a8473ffffffffffffffffffffffffffffffffffffffff1661310b565b15612bb3578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a73612076565b8786866040518563ffffffff1660e01b8152600401612a95949392919061402e565b602060405180830381600087803b158015612aaf57600080fd5b505af1925050508015612ae057506040513d601f19601f82011682018060405250810190612add91906134ca565b60015b612b63573d8060008114612b10576040519150601f19603f3d011682016040523d82523d6000602084013e612b15565b606091505b50600081511415612b5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5290614137565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612bb8565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612c1b84610d5f565b612c25919061456d565b9050600060076000848152602001908152602001600020549050818114612d0a576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612d8f919061456d565b9050600060096000848152602001908152602001600020549050600060088381548110612de5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612e2d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612ea2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612ec983610d5f565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612fad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fa4906142b7565b60405180910390fd5b612fb68161200a565b15612ff6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fed90614177565b60405180910390fd5b613002600083836128ba565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461305291906144e6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461312a90614669565b90600052602060002090601f01602090048101928261314c5760008555613193565b82601f1061316557805160ff1916838001178555613193565b82800160010185558215613193579182015b82811115613192578251825591602001919060010190613177565b5b5090506131a091906131a4565b5090565b5b808211156131bd5760008160009055506001016131a5565b5090565b60006131d46131cf84614443565b614412565b9050828152602081018484840111156131ec57600080fd5b6131f7848285614627565b509392505050565b600061321261320d84614473565b614412565b90508281526020810184848401111561322a57600080fd5b613235848285614627565b509392505050565b60008135905061324c8161482f565b92915050565b60008135905061326181614846565b92915050565b6000813590506132768161485d565b92915050565b60008151905061328b8161485d565b92915050565b600082601f8301126132a257600080fd5b81356132b28482602086016131c1565b91505092915050565b600082601f8301126132cc57600080fd5b81356132dc8482602086016131ff565b91505092915050565b6000813590506132f481614874565b92915050565b60006020828403121561330c57600080fd5b600061331a8482850161323d565b91505092915050565b6000806040838503121561333657600080fd5b60006133448582860161323d565b92505060206133558582860161323d565b9150509250929050565b60008060006060848603121561337457600080fd5b60006133828682870161323d565b93505060206133938682870161323d565b92505060406133a4868287016132e5565b9150509250925092565b600080600080608085870312156133c457600080fd5b60006133d28782880161323d565b94505060206133e38782880161323d565b93505060406133f4878288016132e5565b925050606085013567ffffffffffffffff81111561341157600080fd5b61341d87828801613291565b91505092959194509250565b6000806040838503121561343c57600080fd5b600061344a8582860161323d565b925050602061345b85828601613252565b9150509250929050565b6000806040838503121561347857600080fd5b60006134868582860161323d565b9250506020613497858286016132e5565b9150509250929050565b6000602082840312156134b357600080fd5b60006134c184828501613267565b91505092915050565b6000602082840312156134dc57600080fd5b60006134ea8482850161327c565b91505092915050565b60006020828403121561350557600080fd5b600082013567ffffffffffffffff81111561351f57600080fd5b61352b848285016132bb565b91505092915050565b60006020828403121561354657600080fd5b6000613554848285016132e5565b91505092915050565b61356e613569826145b3565b6146f6565b82525050565b61357d816145a1565b82525050565b61359461358f826145a1565b6146e4565b82525050565b6135a3816145c5565b82525050565b60006135b4826144a3565b6135be81856144b9565b93506135ce818560208601614636565b6135d781614811565b840191505092915050565b60006135ed826144ae565b6135f781856144ca565b9350613607818560208601614636565b61361081614811565b840191505092915050565b6000613626826144ae565b61363081856144db565b9350613640818560208601614636565b80840191505092915050565b6000613659601c836144ca565b91507f546865206265742066756e6374696f6e2069732064697361626c6564000000006000830152602082019050919050565b60006136996029836144ca565b91507f436f6d706f736520776f756c6420657863656564206d617820737570706c792060008301527f6f6620447261676f6e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006136ff6023836144ca565b91507f5374617274696e6720696e64657820686173206e6f74206265656e207365742060008301527f79657400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613765602b836144ca565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006137cb6032836144ca565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006138316026836144ca565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613897601c836144ca565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006138d76024836144ca565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061393d6019836144ca565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b600061397d602c836144ca565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006139e3601e836144ca565b91507f6f776e65722073686f756c64206e6f74206265206120636f6e747261637400006000830152602082019050919050565b6000613a23601d836144ca565b91507f5374617274696e6720696e64657820697320616c7265616479207365740000006000830152602082019050919050565b6000613a636038836144ca565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613ac9602a836144ca565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b2f6029836144ca565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b956022836144ca565b91507f447261676f6e206973206e6f742061637469766520617420746865206d6f6d6560008301527f6e740000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613bfb6020836144ca565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613c3b602c836144ca565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613ca16020836144ca565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613ce16029836144ca565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d47602f836144ca565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613dad6021836144ca565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e136031836144ca565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613e79602c836144ca565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000613edf6023836144ca565b91507f5374617274696e6720696e6465782068617320616c7265616479206265656e2060008301527f73657400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f45600c836144ca565b91507f77726f6e672063616c6c657200000000000000000000000000000000000000006000830152602082019050919050565b613f818161461d565b82525050565b613f98613f938261461d565b61471a565b82525050565b6000613faa8284613583565b60148201915081905092915050565b6000613fc5828461355d565b60148201915081905092915050565b6000613fe0828561361b565b9150613fec828461361b565b91508190509392505050565b60006140048284613f87565b60208201915081905092915050565b60006020820190506140286000830184613574565b92915050565b60006080820190506140436000830187613574565b6140506020830186613574565b61405d6040830185613f78565b818103606083015261406f81846135a9565b905095945050505050565b600060208201905061408f600083018461359a565b92915050565b600060208201905081810360008301526140af81846135e2565b905092915050565b600060208201905081810360008301526140d08161364c565b9050919050565b600060208201905081810360008301526140f08161368c565b9050919050565b60006020820190508181036000830152614110816136f2565b9050919050565b6000602082019050818103600083015261413081613758565b9050919050565b60006020820190508181036000830152614150816137be565b9050919050565b6000602082019050818103600083015261417081613824565b9050919050565b600060208201905081810360008301526141908161388a565b9050919050565b600060208201905081810360008301526141b0816138ca565b9050919050565b600060208201905081810360008301526141d081613930565b9050919050565b600060208201905081810360008301526141f081613970565b9050919050565b60006020820190508181036000830152614210816139d6565b9050919050565b6000602082019050818103600083015261423081613a16565b9050919050565b6000602082019050818103600083015261425081613a56565b9050919050565b6000602082019050818103600083015261427081613abc565b9050919050565b6000602082019050818103600083015261429081613b22565b9050919050565b600060208201905081810360008301526142b081613b88565b9050919050565b600060208201905081810360008301526142d081613bee565b9050919050565b600060208201905081810360008301526142f081613c2e565b9050919050565b6000602082019050818103600083015261431081613c94565b9050919050565b6000602082019050818103600083015261433081613cd4565b9050919050565b6000602082019050818103600083015261435081613d3a565b9050919050565b6000602082019050818103600083015261437081613da0565b9050919050565b6000602082019050818103600083015261439081613e06565b9050919050565b600060208201905081810360008301526143b081613e6c565b9050919050565b600060208201905081810360008301526143d081613ed2565b9050919050565b600060208201905081810360008301526143f081613f38565b9050919050565b600060208201905061440c6000830184613f78565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614439576144386147e2565b5b8060405250919050565b600067ffffffffffffffff82111561445e5761445d6147e2565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561448e5761448d6147e2565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006144f18261461d565b91506144fc8361461d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561453157614530614755565b5b828201905092915050565b60006145478261461d565b91506145528361461d565b92508261456257614561614784565b5b828204905092915050565b60006145788261461d565b91506145838361461d565b92508282101561459657614595614755565b5b828203905092915050565b60006145ac826145fd565b9050919050565b60006145be826145fd565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614654578082015181840152602081019050614639565b83811115614663576000848401525b50505050565b6000600282049050600182168061468157607f821691505b60208210811415614695576146946147b3565b5b50919050565b60006146a68261461d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156146d9576146d8614755565b5b600182019050919050565b60006146ef82614708565b9050919050565b600061470182614708565b9050919050565b600061471382614822565b9050919050565b6000819050919050565b600061472f8261461d565b915061473a8361461d565b92508261474a57614749614784565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b614838816145a1565b811461484357600080fd5b50565b61484f816145c5565b811461485a57600080fd5b50565b614866816145d1565b811461487157600080fd5b50565b61487d8161461d565b811461488857600080fd5b5056fea2646970667358221220bbf8b8fcf48be650a4e76f0a08a2b17ca717fb027d39f31078d0da74e408a5c164736f6c63430008000033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102275760003560e01c80637586dbec11610130578063ae6e060c116100b8578063e13f351a1161007c578063e13f351a1461062c578063e36d649814610636578063e985e9c514610654578063eb8d244414610684578063f2fde38b146106a257610227565b8063ae6e060c1461059a578063b88d4fde146105b8578063c87b56dd146105d4578063cb774d4714610604578063d48fc6af1461062257610227565b806395d89b41116100ff57806395d89b41146104f657806398cd638e146105145780639be2c12714610530578063a22cb4651461054e578063a96f7ef11461056a57610227565b80637586dbec146104965780637d17fcbe146104b25780638da5cb5b146104bc578063916a9a80146104da57610227565b806334918dfd116101b357806355f804b31161018257806355f804b3146103e05780636352211e146103fc57806370a082311461042c578063715018a61461045c578063725625a01461046657610227565b806334918dfd1461036c57806342842e0e146103765780634f5e9452146103925780634f6ccce7146103b057610227565b806318160ddd116101fa57806318160ddd146102c6578063225afdfc146102e457806323b872dd146103025780632f745c591461031e57806332cb6b0c1461034e57610227565b806301ffc9a71461022c57806306fdde031461025c578063081812fc1461027a578063095ea7b3146102aa575b600080fd5b610246600480360381019061024191906134a1565b6106be565b604051610253919061407a565b60405180910390f35b610264610738565b6040516102719190614095565b60405180910390f35b610294600480360381019061028f9190613534565b6107ca565b6040516102a19190614013565b60405180910390f35b6102c460048036038101906102bf9190613465565b61084f565b005b6102ce610967565b6040516102db91906143f7565b60405180910390f35b6102ec610974565b6040516102f9919061407a565b60405180910390f35b61031c6004803603810190610317919061335f565b610987565b005b61033860048036038101906103339190613465565b6109e7565b60405161034591906143f7565b60405180910390f35b610356610a8c565b60405161036391906143f7565b60405180910390f35b610374610a92565b005b610390600480360381019061038b919061335f565b610b3a565b005b61039a610b5a565b6040516103a79190614013565b60405180910390f35b6103ca60048036038101906103c59190613534565b610b80565b6040516103d791906143f7565b60405180910390f35b6103fa60048036038101906103f591906134f3565b610c17565b005b61041660048036038101906104119190613534565b610cad565b6040516104239190614013565b60405180910390f35b610446600480360381019061044191906132fa565b610d5f565b60405161045391906143f7565b60405180910390f35b610464610e17565b005b610480600480360381019061047b91906132fa565b610f54565b60405161048d919061407a565b60405180910390f35b6104b060048036038101906104ab91906134f3565b611156565b005b6104ba6111ec565b005b6104c46112b6565b6040516104d19190614013565b60405180910390f35b6104f460048036038101906104ef91906132fa565b6112e0565b005b6104fe6113a0565b60405161050b9190614095565b60405180910390f35b61052e600480360381019061052991906134f3565b611432565b005b6105386114c8565b6040516105459190614095565b60405180910390f35b61056860048036038101906105639190613429565b611556565b005b610584600480360381019061057f91906132fa565b6116d7565b604051610591919061407a565b60405180910390f35b6105a2611831565b6040516105af9190614095565b60405180910390f35b6105d260048036038101906105cd91906133ae565b6118bf565b005b6105ee60048036038101906105e99190613534565b611921565b6040516105fb9190614095565b60405180910390f35b61060c611a94565b60405161061991906143f7565b60405180910390f35b61062a611a9a565b005b610634611b42565b005b61063e611ccf565b60405161064b91906143f7565b60405180910390f35b61066e60048036038101906106699190613323565b611cd5565b60405161067b919061407a565b60405180910390f35b61068c611d69565b604051610699919061407a565b60405180910390f35b6106bc60048036038101906106b791906132fa565b611d7c565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610731575061073082611f28565b5b9050919050565b60606000805461074790614669565b80601f016020809104026020016040519081016040528092919081815260200182805461077390614669565b80156107c05780601f10610795576101008083540402835291602001916107c0565b820191906000526020600020905b8154815290600101906020018083116107a357829003601f168201915b5050505050905090565b60006107d58261200a565b610814576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080b906142d7565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061085a82610cad565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c290614357565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108ea612076565b73ffffffffffffffffffffffffffffffffffffffff161480610919575061091881610913612076565b611cd5565b5b610958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094f90614237565b60405180910390fd5b610962838361207e565b505050565b6000600880549050905090565b600f60019054906101000a900460ff1681565b610998610992612076565b82612137565b6109d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ce90614377565b60405180910390fd5b6109e2838383612215565b505050565b60006109f283610d5f565b8210610a33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2a90614117565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600e5481565b610a9a612076565b73ffffffffffffffffffffffffffffffffffffffff16610ab86112b6565b73ffffffffffffffffffffffffffffffffffffffff1614610b0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b05906142f7565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b610b55838383604051806020016040528060008152506118bf565b505050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610b8a610967565b8210610bcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc290614397565b60405180910390fd5b60088281548110610c05577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610c1f612076565b73ffffffffffffffffffffffffffffffffffffffff16610c3d6112b6565b73ffffffffffffffffffffffffffffffffffffffff1614610c93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8a906142f7565b60405180910390fd5b8060129080519060200190610ca992919061311e565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4d90614277565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610dd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc790614257565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e1f612076565b73ffffffffffffffffffffffffffffffffffffffff16610e3d6112b6565b73ffffffffffffffffffffffffffffffffffffffff1614610e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8a906142f7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600f60009054906101000a900460ff16610fa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9c90614297565b60405180910390fd5b600f60019054906101000a900460ff16610ff4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610feb906140b7565b60405180910390fd5b600e546110126001611004610967565b61247190919063ffffffff16565b1115611053576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104a906140d7565b60405180910390fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146110e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110da906143d7565b60405180910390fd5b6110ec82612487565b1561112c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611123906141f7565b60405180910390fd5b60216111366124a0565b1161114d5761114c82611147610967565b612581565b5b60019050919050565b61115e612076565b73ffffffffffffffffffffffffffffffffffffffff1661117c6112b6565b73ffffffffffffffffffffffffffffffffffffffff16146111d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c9906142f7565b60405180910390fd5b80600c90805190602001906111e892919061311e565b5050565b6111f4612076565b73ffffffffffffffffffffffffffffffffffffffff166112126112b6565b73ffffffffffffffffffffffffffffffffffffffff1614611268576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125f906142f7565b60405180910390fd5b6000601054146112ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a490614217565b60405180910390fd5b43601181905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6112e8612076565b73ffffffffffffffffffffffffffffffffffffffff166113066112b6565b73ffffffffffffffffffffffffffffffffffffffff161461135c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611353906142f7565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600180546113af90614669565b80601f01602080910402602001604051908101604052809291908181526020018280546113db90614669565b80156114285780601f106113fd57610100808354040283529160200191611428565b820191906000526020600020905b81548152906001019060200180831161140b57829003601f168201915b5050505050905090565b61143a612076565b73ffffffffffffffffffffffffffffffffffffffff166114586112b6565b73ffffffffffffffffffffffffffffffffffffffff16146114ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a5906142f7565b60405180910390fd5b80600b90805190602001906114c492919061311e565b5050565b600c80546114d590614669565b80601f016020809104026020016040519081016040528092919081815260200182805461150190614669565b801561154e5780601f106115235761010080835404028352916020019161154e565b820191906000526020600020905b81548152906001019060200180831161153157829003601f168201915b505050505081565b61155e612076565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c3906141b7565b60405180910390fd5b80600560006115d9612076565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611686612076565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116cb919061407a565b60405180910390a35050565b6000600f60009054906101000a900460ff16611728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171f90614297565b60405180910390fd5b600e546117466001611738610967565b61247190919063ffffffff16565b1115611787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177e906140d7565b60405180910390fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180e906143d7565b60405180910390fd5b61182882611823610967565b612581565b60019050919050565b600b805461183e90614669565b80601f016020809104026020016040519081016040528092919081815260200182805461186a90614669565b80156118b75780601f1061188c576101008083540402835291602001916118b7565b820191906000526020600020905b81548152906001019060200180831161189a57829003601f168201915b505050505081565b6118d06118ca612076565b83612137565b61190f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190690614377565b60405180910390fd5b61191b8484848461259f565b50505050565b606061192c8261200a565b61196b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196290614337565b60405180910390fd5b600060136000848152602001908152602001600020805461198b90614669565b80601f01602080910402602001604051908101604052809291908181526020018280546119b790614669565b8015611a045780601f106119d957610100808354040283529160200191611a04565b820191906000526020600020905b8154815290600101906020018083116119e757829003601f168201915b505050505090506000611a156125fb565b9050600081511415611a2b578192505050611a8f565b600082511115611a60578082604051602001611a48929190613fd4565b60405160208183030381529060405292505050611a8f565b80611a6a8561268d565b604051602001611a7b929190613fd4565b604051602081830303815290604052925050505b919050565b60105481565b611aa2612076565b73ffffffffffffffffffffffffffffffffffffffff16611ac06112b6565b73ffffffffffffffffffffffffffffffffffffffff1614611b16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0d906142f7565b60405180910390fd5b600f60019054906101000a900460ff1615600f60016101000a81548160ff021916908315150217905550565b611b4a612076565b73ffffffffffffffffffffffffffffffffffffffff16611b686112b6565b73ffffffffffffffffffffffffffffffffffffffff1614611bbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb5906142f7565b60405180910390fd5b600060105414611c03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfa906143b7565b60405180910390fd5b60006011541415611c49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c40906140f7565b60405180910390fd5b600e546011544060001c611c5d9190614724565b60108190555060ff611c7a6011544361283a90919063ffffffff16565b1115611ca557600e54600143611c90919061456d565b4060001c611c9e9190614724565b6010819055505b60006010541415611ccd57611cc6600160105461247190919063ffffffff16565b6010819055505b565b60115481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600f60009054906101000a900460ff1681565b611d84612076565b73ffffffffffffffffffffffffffffffffffffffff16611da26112b6565b73ffffffffffffffffffffffffffffffffffffffff1614611df8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611def906142f7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5f90614157565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ff357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612003575061200282612850565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166120f183610cad565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006121428261200a565b612181576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612178906141d7565b60405180910390fd5b600061218c83610cad565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806121fb57508373ffffffffffffffffffffffffffffffffffffffff166121e3846107ca565b73ffffffffffffffffffffffffffffffffffffffff16145b8061220c575061220b8185611cd5565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661223582610cad565b73ffffffffffffffffffffffffffffffffffffffff161461228b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228290614317565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f290614197565b60405180910390fd5b6123068383836128ba565b61231160008261207e565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612361919061456d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123b891906144e6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000818361247f91906144e6565b905092915050565b600080823b905060008163ffffffff1611915050919050565b6000804342336040516020016124b69190613f9e565b6040516020818303038152906040528051906020012060001c6124d9919061453c565b4542416040516020016124ec9190613fb9565b6040516020818303038152906040528051906020012060001c61250f919061453c565b444261251b91906144e6565b61252591906144e6565b61252f91906144e6565b61253991906144e6565b61254391906144e6565b6040516020016125539190613ff8565b6040516020818303038152906040528051906020012060001c905060648161257b9190614724565b91505090565b61259b8282604051806020016040528060008152506129ce565b5050565b6125aa848484612215565b6125b684848484612a29565b6125f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ec90614137565b60405180910390fd5b50505050565b60606012805461260a90614669565b80601f016020809104026020016040519081016040528092919081815260200182805461263690614669565b80156126835780601f1061265857610100808354040283529160200191612683565b820191906000526020600020905b81548152906001019060200180831161266657829003601f168201915b5050505050905090565b606060008214156126d5576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612835565b600082905060005b600082146127075780806126f09061469b565b915050600a82612700919061453c565b91506126dd565b60008167ffffffffffffffff811115612749577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561277b5781602001600182028036833780820191505090505b5090505b6000851461282e57600182612794919061456d565b9150600a856127a39190614724565b60306127af91906144e6565b60f81b8183815181106127eb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612827919061453c565b945061277f565b8093505050505b919050565b60008183612848919061456d565b905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6128c5838383612bc0565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129085761290381612bc5565b612947565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612946576129458382612c0e565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561298a5761298581612d7b565b6129c9565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146129c8576129c78282612ebe565b5b5b505050565b6129d88383612f3d565b6129e56000848484612a29565b612a24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1b90614137565b60405180910390fd5b505050565b6000612a4a8473ffffffffffffffffffffffffffffffffffffffff1661310b565b15612bb3578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a73612076565b8786866040518563ffffffff1660e01b8152600401612a95949392919061402e565b602060405180830381600087803b158015612aaf57600080fd5b505af1925050508015612ae057506040513d601f19601f82011682018060405250810190612add91906134ca565b60015b612b63573d8060008114612b10576040519150601f19603f3d011682016040523d82523d6000602084013e612b15565b606091505b50600081511415612b5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5290614137565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612bb8565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612c1b84610d5f565b612c25919061456d565b9050600060076000848152602001908152602001600020549050818114612d0a576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612d8f919061456d565b9050600060096000848152602001908152602001600020549050600060088381548110612de5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612e2d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612ea2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612ec983610d5f565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612fad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fa4906142b7565b60405180910390fd5b612fb68161200a565b15612ff6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fed90614177565b60405180910390fd5b613002600083836128ba565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461305291906144e6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461312a90614669565b90600052602060002090601f01602090048101928261314c5760008555613193565b82601f1061316557805160ff1916838001178555613193565b82800160010185558215613193579182015b82811115613192578251825591602001919060010190613177565b5b5090506131a091906131a4565b5090565b5b808211156131bd5760008160009055506001016131a5565b5090565b60006131d46131cf84614443565b614412565b9050828152602081018484840111156131ec57600080fd5b6131f7848285614627565b509392505050565b600061321261320d84614473565b614412565b90508281526020810184848401111561322a57600080fd5b613235848285614627565b509392505050565b60008135905061324c8161482f565b92915050565b60008135905061326181614846565b92915050565b6000813590506132768161485d565b92915050565b60008151905061328b8161485d565b92915050565b600082601f8301126132a257600080fd5b81356132b28482602086016131c1565b91505092915050565b600082601f8301126132cc57600080fd5b81356132dc8482602086016131ff565b91505092915050565b6000813590506132f481614874565b92915050565b60006020828403121561330c57600080fd5b600061331a8482850161323d565b91505092915050565b6000806040838503121561333657600080fd5b60006133448582860161323d565b92505060206133558582860161323d565b9150509250929050565b60008060006060848603121561337457600080fd5b60006133828682870161323d565b93505060206133938682870161323d565b92505060406133a4868287016132e5565b9150509250925092565b600080600080608085870312156133c457600080fd5b60006133d28782880161323d565b94505060206133e38782880161323d565b93505060406133f4878288016132e5565b925050606085013567ffffffffffffffff81111561341157600080fd5b61341d87828801613291565b91505092959194509250565b6000806040838503121561343c57600080fd5b600061344a8582860161323d565b925050602061345b85828601613252565b9150509250929050565b6000806040838503121561347857600080fd5b60006134868582860161323d565b9250506020613497858286016132e5565b9150509250929050565b6000602082840312156134b357600080fd5b60006134c184828501613267565b91505092915050565b6000602082840312156134dc57600080fd5b60006134ea8482850161327c565b91505092915050565b60006020828403121561350557600080fd5b600082013567ffffffffffffffff81111561351f57600080fd5b61352b848285016132bb565b91505092915050565b60006020828403121561354657600080fd5b6000613554848285016132e5565b91505092915050565b61356e613569826145b3565b6146f6565b82525050565b61357d816145a1565b82525050565b61359461358f826145a1565b6146e4565b82525050565b6135a3816145c5565b82525050565b60006135b4826144a3565b6135be81856144b9565b93506135ce818560208601614636565b6135d781614811565b840191505092915050565b60006135ed826144ae565b6135f781856144ca565b9350613607818560208601614636565b61361081614811565b840191505092915050565b6000613626826144ae565b61363081856144db565b9350613640818560208601614636565b80840191505092915050565b6000613659601c836144ca565b91507f546865206265742066756e6374696f6e2069732064697361626c6564000000006000830152602082019050919050565b60006136996029836144ca565b91507f436f6d706f736520776f756c6420657863656564206d617820737570706c792060008301527f6f6620447261676f6e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006136ff6023836144ca565b91507f5374617274696e6720696e64657820686173206e6f74206265656e207365742060008301527f79657400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613765602b836144ca565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006137cb6032836144ca565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006138316026836144ca565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613897601c836144ca565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006138d76024836144ca565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061393d6019836144ca565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b600061397d602c836144ca565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006139e3601e836144ca565b91507f6f776e65722073686f756c64206e6f74206265206120636f6e747261637400006000830152602082019050919050565b6000613a23601d836144ca565b91507f5374617274696e6720696e64657820697320616c7265616479207365740000006000830152602082019050919050565b6000613a636038836144ca565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613ac9602a836144ca565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b2f6029836144ca565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b956022836144ca565b91507f447261676f6e206973206e6f742061637469766520617420746865206d6f6d6560008301527f6e740000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613bfb6020836144ca565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613c3b602c836144ca565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613ca16020836144ca565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613ce16029836144ca565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d47602f836144ca565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613dad6021836144ca565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e136031836144ca565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613e79602c836144ca565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000613edf6023836144ca565b91507f5374617274696e6720696e6465782068617320616c7265616479206265656e2060008301527f73657400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f45600c836144ca565b91507f77726f6e672063616c6c657200000000000000000000000000000000000000006000830152602082019050919050565b613f818161461d565b82525050565b613f98613f938261461d565b61471a565b82525050565b6000613faa8284613583565b60148201915081905092915050565b6000613fc5828461355d565b60148201915081905092915050565b6000613fe0828561361b565b9150613fec828461361b565b91508190509392505050565b60006140048284613f87565b60208201915081905092915050565b60006020820190506140286000830184613574565b92915050565b60006080820190506140436000830187613574565b6140506020830186613574565b61405d6040830185613f78565b818103606083015261406f81846135a9565b905095945050505050565b600060208201905061408f600083018461359a565b92915050565b600060208201905081810360008301526140af81846135e2565b905092915050565b600060208201905081810360008301526140d08161364c565b9050919050565b600060208201905081810360008301526140f08161368c565b9050919050565b60006020820190508181036000830152614110816136f2565b9050919050565b6000602082019050818103600083015261413081613758565b9050919050565b60006020820190508181036000830152614150816137be565b9050919050565b6000602082019050818103600083015261417081613824565b9050919050565b600060208201905081810360008301526141908161388a565b9050919050565b600060208201905081810360008301526141b0816138ca565b9050919050565b600060208201905081810360008301526141d081613930565b9050919050565b600060208201905081810360008301526141f081613970565b9050919050565b60006020820190508181036000830152614210816139d6565b9050919050565b6000602082019050818103600083015261423081613a16565b9050919050565b6000602082019050818103600083015261425081613a56565b9050919050565b6000602082019050818103600083015261427081613abc565b9050919050565b6000602082019050818103600083015261429081613b22565b9050919050565b600060208201905081810360008301526142b081613b88565b9050919050565b600060208201905081810360008301526142d081613bee565b9050919050565b600060208201905081810360008301526142f081613c2e565b9050919050565b6000602082019050818103600083015261431081613c94565b9050919050565b6000602082019050818103600083015261433081613cd4565b9050919050565b6000602082019050818103600083015261435081613d3a565b9050919050565b6000602082019050818103600083015261437081613da0565b9050919050565b6000602082019050818103600083015261439081613e06565b9050919050565b600060208201905081810360008301526143b081613e6c565b9050919050565b600060208201905081810360008301526143d081613ed2565b9050919050565b600060208201905081810360008301526143f081613f38565b9050919050565b600060208201905061440c6000830184613f78565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614439576144386147e2565b5b8060405250919050565b600067ffffffffffffffff82111561445e5761445d6147e2565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561448e5761448d6147e2565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006144f18261461d565b91506144fc8361461d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561453157614530614755565b5b828201905092915050565b60006145478261461d565b91506145528361461d565b92508261456257614561614784565b5b828204905092915050565b60006145788261461d565b91506145838361461d565b92508282101561459657614595614755565b5b828203905092915050565b60006145ac826145fd565b9050919050565b60006145be826145fd565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614654578082015181840152602081019050614639565b83811115614663576000848401525b50505050565b6000600282049050600182168061468157607f821691505b60208210811415614695576146946147b3565b5b50919050565b60006146a68261461d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156146d9576146d8614755565b5b600182019050919050565b60006146ef82614708565b9050919050565b600061470182614708565b9050919050565b600061471382614822565b9050919050565b6000819050919050565b600061472f8261461d565b915061473a8361461d565b92508261474a57614749614784565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b614838816145a1565b811461484357600080fd5b50565b61484f816145c5565b811461485a57600080fd5b50565b614866816145d1565b811461487157600080fd5b50565b61487d8161461d565b811461488857600080fd5b5056fea2646970667358221220bbf8b8fcf48be650a4e76f0a08a2b17ca717fb027d39f31078d0da74e408a5c164736f6c63430008000033

Deployed Bytecode Sourcemap

48782:4856:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42630:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30929:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32381:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31918:397;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43279:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49137:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33271:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42947:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49058:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49537:89;;;:::i;:::-;;33647:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49020:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43469:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52725:109;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30623:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30353:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28189:148;;;:::i;:::-;;50377:546;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49720:133;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52331:182;;;:::i;:::-;;27538:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49402:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31098:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49861:133;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48975:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32674:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50002:367;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48932:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33869:285;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52842:793;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49173:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49634:78;;;:::i;:::-;;51626:697;;;:::i;:::-;;49208:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33040:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49098:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28492:244;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42630:233;42732:4;42771:35;42756:50;;;:11;:50;;;;:99;;;;42819:36;42843:11;42819:23;:36::i;:::-;42756:99;42749:106;;42630:233;;;:::o;30929:100::-;30983:13;31016:5;31009:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30929:100;:::o;32381:221::-;32457:7;32485:16;32493:7;32485;:16::i;:::-;32477:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32570:15;:24;32586:7;32570:24;;;;;;;;;;;;;;;;;;;;;32563:31;;32381:221;;;:::o;31918:397::-;31999:13;32015:23;32030:7;32015:14;:23::i;:::-;31999:39;;32063:5;32057:11;;:2;:11;;;;32049:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;32143:5;32127:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;32152:37;32169:5;32176:12;:10;:12::i;:::-;32152:16;:37::i;:::-;32127:62;32119:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;32286:21;32295:2;32299:7;32286:8;:21::i;:::-;31918:397;;;:::o;43279:113::-;43340:7;43367:10;:17;;;;43360:24;;43279:113;:::o;49137:27::-;;;;;;;;;;;;;:::o;33271:305::-;33432:41;33451:12;:10;:12::i;:::-;33465:7;33432:18;:41::i;:::-;33424:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;33540:28;33550:4;33556:2;33560:7;33540:9;:28::i;:::-;33271:305;;;:::o;42947:256::-;43044:7;43080:23;43097:5;43080:16;:23::i;:::-;43072:5;:31;43064:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;43169:12;:19;43182:5;43169:19;;;;;;;;;;;;;;;:26;43189:5;43169:26;;;;;;;;;;;;43162:33;;42947:256;;;;:::o;49058:33::-;;;;:::o;49537:89::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49606:12:::1;;;;;;;;;;;49605:13;49590:12;;:28;;;;;;;;;;;;;;;;;;49537:89::o:0;33647:151::-;33751:39;33768:4;33774:2;33778:7;33751:39;;;;;;;;;;;;:16;:39::i;:::-;33647:151;;;:::o;49020:29::-;;;;;;;;;;;;;:::o;43469:233::-;43544:7;43580:30;:28;:30::i;:::-;43572:5;:38;43564:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;43677:10;43688:5;43677:17;;;;;;;;;;;;;;;;;;;;;;;;43670:24;;43469:233;;;:::o;52725:109::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52818:8:::1;52799:16;:27;;;;;;;;;;;;:::i;:::-;;52725:109:::0;:::o;30623:239::-;30695:7;30715:13;30731:7;:16;30739:7;30731:16;;;;;;;;;;;;;;;;;;;;;30715:32;;30783:1;30766:19;;:5;:19;;;;30758:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30849:5;30842:12;;;30623:239;;;:::o;30353:208::-;30425:7;30470:1;30453:19;;:5;:19;;;;30445:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;30537:9;:16;30547:5;30537:16;;;;;;;;;;;;;;;;30530:23;;30353:208;;;:::o;28189:148::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28296:1:::1;28259:40;;28280:6;;;;;;;;;;;28259:40;;;;;;;;;;;;28327:1;28310:6;;:19;;;;;;;;;;;;;;;;;;28189:148::o:0;50377:546::-;50427:4;50452:12;;;;;;;;;;;50444:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;50522:7;;;;;;;;;;;50514:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;50605:10;;50581:20;50599:1;50581:13;:11;:13::i;:::-;:17;;:20;;;;:::i;:::-;:34;;50573:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;50694:14;;;;;;;;;;;50680:28;;:10;:28;;;50672:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;50745:24;50763:5;50745:17;:24::i;:::-;50744:25;50736:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50832:2;50821:7;:5;:7::i;:::-;:13;50817:77;;50851:31;50861:5;50868:13;:11;:13::i;:::-;50851:9;:31::i;:::-;50817:77;50911:4;50904:11;;50377:546;;;:::o;49720:133::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49831:14:::1;49811:17;:34;;;;;;;;;;;;:::i;:::-;;49720:133:::0;:::o;52331:182::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52426:1:::1;52409:13;;:18;52401:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;52493:12;52472:18;:33;;;;52331:182::o:0;27538:87::-;27584:7;27611:6;;;;;;;;;;;27604:13;;27538:87;:::o;49402:127::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49506:15:::1;49489:14;;:32;;;;;;;;;;;;;;;;;;49402:127:::0;:::o;31098:104::-;31154:13;31187:7;31180:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31098:104;:::o;49861:133::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49972:14:::1;49952:17;:34;;;;;;;;;;;;:::i;:::-;;49861:133:::0;:::o;48975:36::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32674:295::-;32789:12;:10;:12::i;:::-;32777:24;;:8;:24;;;;32769:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;32889:8;32844:18;:32;32863:12;:10;:12::i;:::-;32844:32;;;;;;;;;;;;;;;:42;32877:8;32844:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;32942:8;32913:48;;32928:12;:10;:12::i;:::-;32913:48;;;32952:8;32913:48;;;;;;:::i;:::-;;;;;;;;32674:295;;:::o;50002:367::-;50056:4;50081:12;;;;;;;;;;;50073:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;50175:10;;50151:20;50169:1;50151:13;:11;:13::i;:::-;:17;;:20;;;;:::i;:::-;:34;;50143:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;50264:14;;;;;;;;;;;50250:28;;:10;:28;;;50242:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;50308:31;50318:5;50325:13;:11;:13::i;:::-;50308:9;:31::i;:::-;50357:4;50350:11;;50002:367;;;:::o;48932:36::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;33869:285::-;34001:41;34020:12;:10;:12::i;:::-;34034:7;34001:18;:41::i;:::-;33993:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;34107:39;34121:4;34127:2;34131:7;34140:5;34107:13;:39::i;:::-;33869:285;;;;:::o;52842:793::-;52915:13;52949:16;52957:7;52949;:16::i;:::-;52941:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;53030:23;53056:10;:19;53067:7;53056:19;;;;;;;;;;;53030:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53086:18;53107:10;:8;:10::i;:::-;53086:31;;53215:1;53199:4;53193:18;:23;53189:72;;;53240:9;53233:16;;;;;;53189:72;53391:1;53371:9;53365:23;:27;53361:108;;;53440:4;53446:9;53423:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53409:48;;;;;;53361:108;53601:4;53607:18;:7;:16;:18::i;:::-;53584:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53570:57;;;;52842:793;;;;:::o;49173:28::-;;;;:::o;49634:78::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49697:7:::1;;;;;;;;;;;49696:8;49686:7;;:18;;;;;;;;;;;;;;;;;;49634:78::o:0;51626:697::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51708:1:::1;51691:13;;:18;51683:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;51790:1;51768:18;;:23;;51760:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;51898:10;;51875:18;;51865:29;51860:35;;:48;;;;:::i;:::-;51844:13;:64;;;;52082:3;52043:36;52060:18;;52043:12;:16;;:36;;;;:::i;:::-;:42;52040:136;;;52154:10;;52148:1;52133:12;:16;;;;:::i;:::-;52123:27;52118:33;;:46;;;;:::i;:::-;52102:13;:62;;;;52040:136;52250:1;52233:13;;:18;52229:87;;;52284:20;52302:1;52284:13;;:17;;:20;;;;:::i;:::-;52268:13;:36;;;;52229:87;51626:697::o:0;49208:33::-;;;;:::o;33040:164::-;33137:4;33161:18;:25;33180:5;33161:25;;;;;;;;;;;;;;;:35;33187:8;33161:35;;;;;;;;;;;;;;;;;;;;;;;;;33154:42;;33040:164;;;;:::o;49098:32::-;;;;;;;;;;;;;:::o;28492:244::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28601:1:::1;28581:22;;:8;:22;;;;28573:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28691:8;28662:38;;28683:6;;;;;;;;;;;28662:38;;;;;;;;;;;;28720:8;28711:6;;:17;;;;;;;;;;;;;;;;;;28492:244:::0;:::o;30005:284::-;30107:4;30146:25;30131:40;;;:11;:40;;;;:101;;;;30199:33;30184:48;;;:11;:48;;;;30131:101;:150;;;;30245:36;30269:11;30245:23;:36::i;:::-;30131:150;30124:157;;30005:284;;;:::o;35621:127::-;35686:4;35738:1;35710:30;;:7;:16;35718:7;35710:16;;;;;;;;;;;;;;;;;;;;;:30;;;;35703:37;;35621:127;;;:::o;26155:98::-;26208:7;26235:10;26228:17;;26155:98;:::o;39498:174::-;39600:2;39573:15;:24;39589:7;39573:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39656:7;39652:2;39618:46;;39627:23;39642:7;39627:14;:23::i;:::-;39618:46;;;;;;;;;;;;39498:174;;:::o;35915:348::-;36008:4;36033:16;36041:7;36033;:16::i;:::-;36025:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36109:13;36125:23;36140:7;36125:14;:23::i;:::-;36109:39;;36178:5;36167:16;;:7;:16;;;:51;;;;36211:7;36187:31;;:20;36199:7;36187:11;:20::i;:::-;:31;;;36167:51;:87;;;;36222:32;36239:5;36246:7;36222:16;:32::i;:::-;36167:87;36159:96;;;35915:348;;;;:::o;38836:544::-;38961:4;38934:31;;:23;38949:7;38934:14;:23::i;:::-;:31;;;38926:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;39044:1;39030:16;;:2;:16;;;;39022:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;39100:39;39121:4;39127:2;39131:7;39100:20;:39::i;:::-;39204:29;39221:1;39225:7;39204:8;:29::i;:::-;39265:1;39246:9;:15;39256:4;39246:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;39294:1;39277:9;:13;39287:2;39277:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39325:2;39306:7;:16;39314:7;39306:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39364:7;39360:2;39345:27;;39354:4;39345:27;;;;;;;;;;;;38836:544;;;:::o;2659:98::-;2717:7;2748:1;2744;:5;;;;:::i;:::-;2737:12;;2659:98;;;;:::o;50931:209::-;50995:15;51022:11;51088:5;51076:18;51068:26;;51130:1;51123:4;:8;;;51115:17;;;50931:209;;;:::o;51148:470::-;51187:7;51207:12;51551;51514:15;51496:10;51479:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;51469:39;;;;;;51461:48;;51460:70;;;;:::i;:::-;51425:14;51388:15;51366:14;51349:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;51339:43;;;;;;51331:52;;51330:74;;;;:::i;:::-;51293:16;51275:15;:34;;;;:::i;:::-;:130;;;;:::i;:::-;:164;;;;:::i;:::-;:256;;;;:::i;:::-;:288;;;;:::i;:::-;51240:338;;;;;;;;:::i;:::-;;;;;;;;;;;;;51230:349;;;;;;51222:358;;51207:373;;51607:3;51600:4;:10;;;;:::i;:::-;51593:17;;;51148:470;:::o;36605:110::-;36681:26;36691:2;36695:7;36681:26;;;;;;;;;;;;:9;:26::i;:::-;36605:110;;:::o;35036:272::-;35150:28;35160:4;35166:2;35170:7;35150:9;:28::i;:::-;35197:48;35220:4;35226:2;35230:7;35239:5;35197:22;:48::i;:::-;35189:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;35036:272;;;;:::o;52521:117::-;52581:13;52614:16;52607:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52521:117;:::o;7152:723::-;7208:13;7438:1;7429:5;:10;7425:53;;;7456:10;;;;;;;;;;;;;;;;;;;;;7425:53;7488:12;7503:5;7488:20;;7519:14;7544:78;7559:1;7551:4;:9;7544:78;;7577:8;;;;;:::i;:::-;;;;7608:2;7600:10;;;;;:::i;:::-;;;7544:78;;;7632:19;7664:6;7654:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7632:39;;7682:154;7698:1;7689:5;:10;7682:154;;7726:1;7716:11;;;;;:::i;:::-;;;7793:2;7785:5;:10;;;;:::i;:::-;7772:2;:24;;;;:::i;:::-;7759:39;;7742:6;7749;7742:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;7822:2;7813:11;;;;;:::i;:::-;;;7682:154;;;7860:6;7846:21;;;;;7152:723;;;;:::o;3040:98::-;3098:7;3129:1;3125;:5;;;;:::i;:::-;3118:12;;3040:98;;;;:::o;19228:157::-;19313:4;19352:25;19337:40;;;:11;:40;;;;19330:47;;19228:157;;;:::o;44315:555::-;44425:45;44452:4;44458:2;44462:7;44425:26;:45::i;:::-;44503:1;44487:18;;:4;:18;;;44483:187;;;44522:40;44554:7;44522:31;:40::i;:::-;44483:187;;;44592:2;44584:10;;:4;:10;;;44580:90;;44611:47;44644:4;44650:7;44611:32;:47::i;:::-;44580:90;44483:187;44698:1;44684:16;;:2;:16;;;44680:183;;;44717:45;44754:7;44717:36;:45::i;:::-;44680:183;;;44790:4;44784:10;;:2;:10;;;44780:83;;44811:40;44839:2;44843:7;44811:27;:40::i;:::-;44780:83;44680:183;44315:555;;;:::o;36942:250::-;37038:18;37044:2;37048:7;37038:5;:18::i;:::-;37075:54;37106:1;37110:2;37114:7;37123:5;37075:22;:54::i;:::-;37067:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;36942:250;;;:::o;40237:839::-;40354:4;40380:15;:2;:13;;;:15::i;:::-;40376:693;;;40432:2;40416:36;;;40453:12;:10;:12::i;:::-;40467:4;40473:7;40482:5;40416:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40412:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40679:1;40662:6;:13;:18;40658:341;;;40705:60;;;;;;;;;;:::i;:::-;;;;;;;;40658:341;40949:6;40943:13;40934:6;40930:2;40926:15;40919:38;40412:602;40549:45;;;40539:55;;;:6;:55;;;;40532:62;;;;;40376:693;41053:4;41046:11;;40237:839;;;;;;;:::o;41689:93::-;;;;:::o;45593:164::-;45697:10;:17;;;;45670:15;:24;45686:7;45670:24;;;;;;;;;;;:44;;;;45725:10;45741:7;45725:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45593:164;:::o;46384:988::-;46650:22;46700:1;46675:22;46692:4;46675:16;:22::i;:::-;:26;;;;:::i;:::-;46650:51;;46712:18;46733:17;:26;46751:7;46733:26;;;;;;;;;;;;46712:47;;46880:14;46866:10;:28;46862:328;;46911:19;46933:12;:18;46946:4;46933:18;;;;;;;;;;;;;;;:34;46952:14;46933:34;;;;;;;;;;;;46911:56;;47017:11;46984:12;:18;46997:4;46984:18;;;;;;;;;;;;;;;:30;47003:10;46984:30;;;;;;;;;;;:44;;;;47134:10;47101:17;:30;47119:11;47101:30;;;;;;;;;;;:43;;;;46862:328;;47286:17;:26;47304:7;47286:26;;;;;;;;;;;47279:33;;;47330:12;:18;47343:4;47330:18;;;;;;;;;;;;;;;:34;47349:14;47330:34;;;;;;;;;;;47323:41;;;46384:988;;;;:::o;47667:1079::-;47920:22;47965:1;47945:10;:17;;;;:21;;;;:::i;:::-;47920:46;;47977:18;47998:15;:24;48014:7;47998:24;;;;;;;;;;;;47977:45;;48349:19;48371:10;48382:14;48371:26;;;;;;;;;;;;;;;;;;;;;;;;48349:48;;48435:11;48410:10;48421;48410:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;48546:10;48515:15;:28;48531:11;48515:28;;;;;;;;;;;:41;;;;48687:15;:24;48703:7;48687:24;;;;;;;;;;;48680:31;;;48722:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47667:1079;;;;:::o;45171:221::-;45256:14;45273:20;45290:2;45273:16;:20::i;:::-;45256:37;;45331:7;45304:12;:16;45317:2;45304:16;;;;;;;;;;;;;;;:24;45321:6;45304:24;;;;;;;;;;;:34;;;;45378:6;45349:17;:26;45367:7;45349:26;;;;;;;;;;;:35;;;;45171:221;;;:::o;37528:382::-;37622:1;37608:16;;:2;:16;;;;37600:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;37681:16;37689:7;37681;:16::i;:::-;37680:17;37672:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;37743:45;37772:1;37776:2;37780:7;37743:20;:45::i;:::-;37818:1;37801:9;:13;37811:2;37801:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;37849:2;37830:7;:16;37838:7;37830:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;37894:7;37890:2;37869:33;;37886:1;37869:33;;;;;;;;;;;;37528:382;;:::o;9617:422::-;9677:4;9885:12;9996:7;9984:20;9976:28;;10030:1;10023:4;:8;10016:15;;;9617:422;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:137::-;;1072:6;1059:20;1050:29;;1088:32;1114:5;1088:32;:::i;:::-;1040:86;;;;:::o;1132:141::-;;1219:6;1213:13;1204:22;;1235:32;1261:5;1235:32;:::i;:::-;1194:79;;;;:::o;1292:271::-;;1396:3;1389:4;1381:6;1377:17;1373:27;1363:2;;1414:1;1411;1404:12;1363:2;1454:6;1441:20;1479:78;1553:3;1545:6;1538:4;1530:6;1526:17;1479:78;:::i;:::-;1470:87;;1353:210;;;;;:::o;1583:273::-;;1688:3;1681:4;1673:6;1669:17;1665:27;1655:2;;1706:1;1703;1696:12;1655:2;1746:6;1733:20;1771:79;1846:3;1838:6;1831:4;1823:6;1819:17;1771:79;:::i;:::-;1762:88;;1645:211;;;;;:::o;1862:139::-;;1946:6;1933:20;1924:29;;1962:33;1989:5;1962:33;:::i;:::-;1914:87;;;;:::o;2007:262::-;;2115:2;2103:9;2094:7;2090:23;2086:32;2083:2;;;2131:1;2128;2121:12;2083:2;2174:1;2199:53;2244:7;2235:6;2224:9;2220:22;2199:53;:::i;:::-;2189:63;;2145:117;2073:196;;;;:::o;2275:407::-;;;2400:2;2388:9;2379:7;2375:23;2371:32;2368:2;;;2416:1;2413;2406:12;2368:2;2459:1;2484:53;2529:7;2520:6;2509:9;2505:22;2484:53;:::i;:::-;2474:63;;2430:117;2586:2;2612:53;2657:7;2648:6;2637:9;2633:22;2612:53;:::i;:::-;2602:63;;2557:118;2358:324;;;;;:::o;2688:552::-;;;;2830:2;2818:9;2809:7;2805:23;2801:32;2798:2;;;2846:1;2843;2836:12;2798:2;2889:1;2914:53;2959:7;2950:6;2939:9;2935:22;2914:53;:::i;:::-;2904:63;;2860:117;3016:2;3042:53;3087:7;3078:6;3067:9;3063:22;3042:53;:::i;:::-;3032:63;;2987:118;3144:2;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3115:118;2788:452;;;;;:::o;3246:809::-;;;;;3414:3;3402:9;3393:7;3389:23;3385:33;3382:2;;;3431:1;3428;3421:12;3382:2;3474:1;3499:53;3544:7;3535:6;3524:9;3520:22;3499:53;:::i;:::-;3489:63;;3445:117;3601:2;3627:53;3672:7;3663:6;3652:9;3648:22;3627:53;:::i;:::-;3617:63;;3572:118;3729:2;3755:53;3800:7;3791:6;3780:9;3776:22;3755:53;:::i;:::-;3745:63;;3700:118;3885:2;3874:9;3870:18;3857:32;3916:18;3908:6;3905:30;3902:2;;;3948:1;3945;3938:12;3902:2;3976:62;4030:7;4021:6;4010:9;4006:22;3976:62;:::i;:::-;3966:72;;3828:220;3372:683;;;;;;;:::o;4061:401::-;;;4183:2;4171:9;4162:7;4158:23;4154:32;4151:2;;;4199:1;4196;4189:12;4151:2;4242:1;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4213:117;4369:2;4395:50;4437:7;4428:6;4417:9;4413:22;4395:50;:::i;:::-;4385:60;;4340:115;4141:321;;;;;:::o;4468:407::-;;;4593:2;4581:9;4572:7;4568:23;4564:32;4561:2;;;4609:1;4606;4599:12;4561:2;4652:1;4677:53;4722:7;4713:6;4702:9;4698:22;4677:53;:::i;:::-;4667:63;;4623:117;4779:2;4805:53;4850:7;4841:6;4830:9;4826:22;4805:53;:::i;:::-;4795:63;;4750:118;4551:324;;;;;:::o;4881:260::-;;4988:2;4976:9;4967:7;4963:23;4959:32;4956:2;;;5004:1;5001;4994:12;4956:2;5047:1;5072:52;5116:7;5107:6;5096:9;5092:22;5072:52;:::i;:::-;5062:62;;5018:116;4946:195;;;;:::o;5147:282::-;;5265:2;5253:9;5244:7;5240:23;5236:32;5233:2;;;5281:1;5278;5271:12;5233:2;5324:1;5349:63;5404:7;5395:6;5384:9;5380:22;5349:63;:::i;:::-;5339:73;;5295:127;5223:206;;;;:::o;5435:375::-;;5553:2;5541:9;5532:7;5528:23;5524:32;5521:2;;;5569:1;5566;5559:12;5521:2;5640:1;5629:9;5625:17;5612:31;5670:18;5662:6;5659:30;5656:2;;;5702:1;5699;5692:12;5656:2;5730:63;5785:7;5776:6;5765:9;5761:22;5730:63;:::i;:::-;5720:73;;5583:220;5511:299;;;;:::o;5816:262::-;;5924:2;5912:9;5903:7;5899:23;5895:32;5892:2;;;5940:1;5937;5930:12;5892:2;5983:1;6008:53;6053:7;6044:6;6033:9;6029:22;6008:53;:::i;:::-;5998:63;;5954:117;5882:196;;;;:::o;6084:189::-;6205:61;6233:32;6259:5;6233:32;:::i;:::-;6205:61;:::i;:::-;6200:3;6193:74;6183:90;;:::o;6279:118::-;6366:24;6384:5;6366:24;:::i;:::-;6361:3;6354:37;6344:53;;:::o;6403:157::-;6508:45;6528:24;6546:5;6528:24;:::i;:::-;6508:45;:::i;:::-;6503:3;6496:58;6486:74;;:::o;6566:109::-;6647:21;6662:5;6647:21;:::i;:::-;6642:3;6635:34;6625:50;;:::o;6681:360::-;;6795:38;6827:5;6795:38;:::i;:::-;6849:70;6912:6;6907:3;6849:70;:::i;:::-;6842:77;;6928:52;6973:6;6968:3;6961:4;6954:5;6950:16;6928:52;:::i;:::-;7005:29;7027:6;7005:29;:::i;:::-;7000:3;6996:39;6989:46;;6771:270;;;;;:::o;7047:364::-;;7163:39;7196:5;7163:39;:::i;:::-;7218:71;7282:6;7277:3;7218:71;:::i;:::-;7211:78;;7298:52;7343:6;7338:3;7331:4;7324:5;7320:16;7298:52;:::i;:::-;7375:29;7397:6;7375:29;:::i;:::-;7370:3;7366:39;7359:46;;7139:272;;;;;:::o;7417:377::-;;7551:39;7584:5;7551:39;:::i;:::-;7606:89;7688:6;7683:3;7606:89;:::i;:::-;7599:96;;7704:52;7749:6;7744:3;7737:4;7730:5;7726:16;7704:52;:::i;:::-;7781:6;7776:3;7772:16;7765:23;;7527:267;;;;;:::o;7800:326::-;;7963:67;8027:2;8022:3;7963:67;:::i;:::-;7956:74;;8060:30;8056:1;8051:3;8047:11;8040:51;8117:2;8112:3;8108:12;8101:19;;7946:180;;;:::o;8132:373::-;;8295:67;8359:2;8354:3;8295:67;:::i;:::-;8288:74;;8392:34;8388:1;8383:3;8379:11;8372:55;8458:11;8453:2;8448:3;8444:12;8437:33;8496:2;8491:3;8487:12;8480:19;;8278:227;;;:::o;8511:367::-;;8674:67;8738:2;8733:3;8674:67;:::i;:::-;8667:74;;8771:34;8767:1;8762:3;8758:11;8751:55;8837:5;8832:2;8827:3;8823:12;8816:27;8869:2;8864:3;8860:12;8853:19;;8657:221;;;:::o;8884:375::-;;9047:67;9111:2;9106:3;9047:67;:::i;:::-;9040:74;;9144:34;9140:1;9135:3;9131:11;9124:55;9210:13;9205:2;9200:3;9196:12;9189:35;9250:2;9245:3;9241:12;9234:19;;9030:229;;;:::o;9265:382::-;;9428:67;9492:2;9487:3;9428:67;:::i;:::-;9421:74;;9525:34;9521:1;9516:3;9512:11;9505:55;9591:20;9586:2;9581:3;9577:12;9570:42;9638:2;9633:3;9629:12;9622:19;;9411:236;;;:::o;9653:370::-;;9816:67;9880:2;9875:3;9816:67;:::i;:::-;9809:74;;9913:34;9909:1;9904:3;9900:11;9893:55;9979:8;9974:2;9969:3;9965:12;9958:30;10014:2;10009:3;10005:12;9998:19;;9799:224;;;:::o;10029:326::-;;10192:67;10256:2;10251:3;10192:67;:::i;:::-;10185:74;;10289:30;10285:1;10280:3;10276:11;10269:51;10346:2;10341:3;10337:12;10330:19;;10175:180;;;:::o;10361:368::-;;10524:67;10588:2;10583:3;10524:67;:::i;:::-;10517:74;;10621:34;10617:1;10612:3;10608:11;10601:55;10687:6;10682:2;10677:3;10673:12;10666:28;10720:2;10715:3;10711:12;10704:19;;10507:222;;;:::o;10735:323::-;;10898:67;10962:2;10957:3;10898:67;:::i;:::-;10891:74;;10995:27;10991:1;10986:3;10982:11;10975:48;11049:2;11044:3;11040:12;11033:19;;10881:177;;;:::o;11064:376::-;;11227:67;11291:2;11286:3;11227:67;:::i;:::-;11220:74;;11324:34;11320:1;11315:3;11311:11;11304:55;11390:14;11385:2;11380:3;11376:12;11369:36;11431:2;11426:3;11422:12;11415:19;;11210:230;;;:::o;11446:328::-;;11609:67;11673:2;11668:3;11609:67;:::i;:::-;11602:74;;11706:32;11702:1;11697:3;11693:11;11686:53;11765:2;11760:3;11756:12;11749:19;;11592:182;;;:::o;11780:327::-;;11943:67;12007:2;12002:3;11943:67;:::i;:::-;11936:74;;12040:31;12036:1;12031:3;12027:11;12020:52;12098:2;12093:3;12089:12;12082:19;;11926:181;;;:::o;12113:388::-;;12276:67;12340:2;12335:3;12276:67;:::i;:::-;12269:74;;12373:34;12369:1;12364:3;12360:11;12353:55;12439:26;12434:2;12429:3;12425:12;12418:48;12492:2;12487:3;12483:12;12476:19;;12259:242;;;:::o;12507:374::-;;12670:67;12734:2;12729:3;12670:67;:::i;:::-;12663:74;;12767:34;12763:1;12758:3;12754:11;12747:55;12833:12;12828:2;12823:3;12819:12;12812:34;12872:2;12867:3;12863:12;12856:19;;12653:228;;;:::o;12887:373::-;;13050:67;13114:2;13109:3;13050:67;:::i;:::-;13043:74;;13147:34;13143:1;13138:3;13134:11;13127:55;13213:11;13208:2;13203:3;13199:12;13192:33;13251:2;13246:3;13242:12;13235:19;;13033:227;;;:::o;13266:366::-;;13429:67;13493:2;13488:3;13429:67;:::i;:::-;13422:74;;13526:34;13522:1;13517:3;13513:11;13506:55;13592:4;13587:2;13582:3;13578:12;13571:26;13623:2;13618:3;13614:12;13607:19;;13412:220;;;:::o;13638:330::-;;13801:67;13865:2;13860:3;13801:67;:::i;:::-;13794:74;;13898:34;13894:1;13889:3;13885:11;13878:55;13959:2;13954:3;13950:12;13943:19;;13784:184;;;:::o;13974:376::-;;14137:67;14201:2;14196:3;14137:67;:::i;:::-;14130:74;;14234:34;14230:1;14225:3;14221:11;14214:55;14300:14;14295:2;14290:3;14286:12;14279:36;14341:2;14336:3;14332:12;14325:19;;14120:230;;;:::o;14356:330::-;;14519:67;14583:2;14578:3;14519:67;:::i;:::-;14512:74;;14616:34;14612:1;14607:3;14603:11;14596:55;14677:2;14672:3;14668:12;14661:19;;14502:184;;;:::o;14692:373::-;;14855:67;14919:2;14914:3;14855:67;:::i;:::-;14848:74;;14952:34;14948:1;14943:3;14939:11;14932:55;15018:11;15013:2;15008:3;15004:12;14997:33;15056:2;15051:3;15047:12;15040:19;;14838:227;;;:::o;15071:379::-;;15234:67;15298:2;15293:3;15234:67;:::i;:::-;15227:74;;15331:34;15327:1;15322:3;15318:11;15311:55;15397:17;15392:2;15387:3;15383:12;15376:39;15441:2;15436:3;15432:12;15425:19;;15217:233;;;:::o;15456:365::-;;15619:67;15683:2;15678:3;15619:67;:::i;:::-;15612:74;;15716:34;15712:1;15707:3;15703:11;15696:55;15782:3;15777:2;15772:3;15768:12;15761:25;15812:2;15807:3;15803:12;15796:19;;15602:219;;;:::o;15827:381::-;;15990:67;16054:2;16049:3;15990:67;:::i;:::-;15983:74;;16087:34;16083:1;16078:3;16074:11;16067:55;16153:19;16148:2;16143:3;16139:12;16132:41;16199:2;16194:3;16190:12;16183:19;;15973:235;;;:::o;16214:376::-;;16377:67;16441:2;16436:3;16377:67;:::i;:::-;16370:74;;16474:34;16470:1;16465:3;16461:11;16454:55;16540:14;16535:2;16530:3;16526:12;16519:36;16581:2;16576:3;16572:12;16565:19;;16360:230;;;:::o;16596:367::-;;16759:67;16823:2;16818:3;16759:67;:::i;:::-;16752:74;;16856:34;16852:1;16847:3;16843:11;16836:55;16922:5;16917:2;16912:3;16908:12;16901:27;16954:2;16949:3;16945:12;16938:19;;16742:221;;;:::o;16969:310::-;;17132:67;17196:2;17191:3;17132:67;:::i;:::-;17125:74;;17229:14;17225:1;17220:3;17216:11;17209:35;17270:2;17265:3;17261:12;17254:19;;17115:164;;;:::o;17285:118::-;17372:24;17390:5;17372:24;:::i;:::-;17367:3;17360:37;17350:53;;:::o;17409:157::-;17514:45;17534:24;17552:5;17534:24;:::i;:::-;17514:45;:::i;:::-;17509:3;17502:58;17492:74;;:::o;17572:256::-;;17699:75;17770:3;17761:6;17699:75;:::i;:::-;17799:2;17794:3;17790:12;17783:19;;17819:3;17812:10;;17688:140;;;;:::o;17834:288::-;;17977:91;18064:3;18055:6;17977:91;:::i;:::-;18093:2;18088:3;18084:12;18077:19;;18113:3;18106:10;;17966:156;;;;:::o;18128:435::-;;18330:95;18421:3;18412:6;18330:95;:::i;:::-;18323:102;;18442:95;18533:3;18524:6;18442:95;:::i;:::-;18435:102;;18554:3;18547:10;;18312:251;;;;;:::o;18569:256::-;;18696:75;18767:3;18758:6;18696:75;:::i;:::-;18796:2;18791:3;18787:12;18780:19;;18816:3;18809:10;;18685:140;;;;:::o;18831:222::-;;18962:2;18951:9;18947:18;18939:26;;18975:71;19043:1;19032:9;19028:17;19019:6;18975:71;:::i;:::-;18929:124;;;;:::o;19059:640::-;;19292:3;19281:9;19277:19;19269:27;;19306:71;19374:1;19363:9;19359:17;19350:6;19306:71;:::i;:::-;19387:72;19455:2;19444:9;19440:18;19431:6;19387:72;:::i;:::-;19469;19537:2;19526:9;19522:18;19513:6;19469:72;:::i;:::-;19588:9;19582:4;19578:20;19573:2;19562:9;19558:18;19551:48;19616:76;19687:4;19678:6;19616:76;:::i;:::-;19608:84;;19259:440;;;;;;;:::o;19705:210::-;;19830:2;19819:9;19815:18;19807:26;;19843:65;19905:1;19894:9;19890:17;19881:6;19843:65;:::i;:::-;19797:118;;;;:::o;19921:313::-;;20072:2;20061:9;20057:18;20049:26;;20121:9;20115:4;20111:20;20107:1;20096:9;20092:17;20085:47;20149:78;20222:4;20213:6;20149:78;:::i;:::-;20141:86;;20039:195;;;;:::o;20240:419::-;;20444:2;20433:9;20429:18;20421:26;;20493:9;20487:4;20483:20;20479:1;20468:9;20464:17;20457:47;20521:131;20647:4;20521:131;:::i;:::-;20513:139;;20411:248;;;:::o;20665:419::-;;20869:2;20858:9;20854:18;20846:26;;20918:9;20912:4;20908:20;20904:1;20893:9;20889:17;20882:47;20946:131;21072:4;20946:131;:::i;:::-;20938:139;;20836:248;;;:::o;21090:419::-;;21294:2;21283:9;21279:18;21271:26;;21343:9;21337:4;21333:20;21329:1;21318:9;21314:17;21307:47;21371:131;21497:4;21371:131;:::i;:::-;21363:139;;21261:248;;;:::o;21515:419::-;;21719:2;21708:9;21704:18;21696:26;;21768:9;21762:4;21758:20;21754:1;21743:9;21739:17;21732:47;21796:131;21922:4;21796:131;:::i;:::-;21788:139;;21686:248;;;:::o;21940:419::-;;22144:2;22133:9;22129:18;22121:26;;22193:9;22187:4;22183:20;22179:1;22168:9;22164:17;22157:47;22221:131;22347:4;22221:131;:::i;:::-;22213:139;;22111:248;;;:::o;22365:419::-;;22569:2;22558:9;22554:18;22546:26;;22618:9;22612:4;22608:20;22604:1;22593:9;22589:17;22582:47;22646:131;22772:4;22646:131;:::i;:::-;22638:139;;22536:248;;;:::o;22790:419::-;;22994:2;22983:9;22979:18;22971:26;;23043:9;23037:4;23033:20;23029:1;23018:9;23014:17;23007:47;23071:131;23197:4;23071:131;:::i;:::-;23063:139;;22961:248;;;:::o;23215:419::-;;23419:2;23408:9;23404:18;23396:26;;23468:9;23462:4;23458:20;23454:1;23443:9;23439:17;23432:47;23496:131;23622:4;23496:131;:::i;:::-;23488:139;;23386:248;;;:::o;23640:419::-;;23844:2;23833:9;23829:18;23821:26;;23893:9;23887:4;23883:20;23879:1;23868:9;23864:17;23857:47;23921:131;24047:4;23921:131;:::i;:::-;23913:139;;23811:248;;;:::o;24065:419::-;;24269:2;24258:9;24254:18;24246:26;;24318:9;24312:4;24308:20;24304:1;24293:9;24289:17;24282:47;24346:131;24472:4;24346:131;:::i;:::-;24338:139;;24236:248;;;:::o;24490:419::-;;24694:2;24683:9;24679:18;24671:26;;24743:9;24737:4;24733:20;24729:1;24718:9;24714:17;24707:47;24771:131;24897:4;24771:131;:::i;:::-;24763:139;;24661:248;;;:::o;24915:419::-;;25119:2;25108:9;25104:18;25096:26;;25168:9;25162:4;25158:20;25154:1;25143:9;25139:17;25132:47;25196:131;25322:4;25196:131;:::i;:::-;25188:139;;25086:248;;;:::o;25340:419::-;;25544:2;25533:9;25529:18;25521:26;;25593:9;25587:4;25583:20;25579:1;25568:9;25564:17;25557:47;25621:131;25747:4;25621:131;:::i;:::-;25613:139;;25511:248;;;:::o;25765:419::-;;25969:2;25958:9;25954:18;25946:26;;26018:9;26012:4;26008:20;26004:1;25993:9;25989:17;25982:47;26046:131;26172:4;26046:131;:::i;:::-;26038:139;;25936:248;;;:::o;26190:419::-;;26394:2;26383:9;26379:18;26371:26;;26443:9;26437:4;26433:20;26429:1;26418:9;26414:17;26407:47;26471:131;26597:4;26471:131;:::i;:::-;26463:139;;26361:248;;;:::o;26615:419::-;;26819:2;26808:9;26804:18;26796:26;;26868:9;26862:4;26858:20;26854:1;26843:9;26839:17;26832:47;26896:131;27022:4;26896:131;:::i;:::-;26888:139;;26786:248;;;:::o;27040:419::-;;27244:2;27233:9;27229:18;27221:26;;27293:9;27287:4;27283:20;27279:1;27268:9;27264:17;27257:47;27321:131;27447:4;27321:131;:::i;:::-;27313:139;;27211:248;;;:::o;27465:419::-;;27669:2;27658:9;27654:18;27646:26;;27718:9;27712:4;27708:20;27704:1;27693:9;27689:17;27682:47;27746:131;27872:4;27746:131;:::i;:::-;27738:139;;27636:248;;;:::o;27890:419::-;;28094:2;28083:9;28079:18;28071:26;;28143:9;28137:4;28133:20;28129:1;28118:9;28114:17;28107:47;28171:131;28297:4;28171:131;:::i;:::-;28163:139;;28061:248;;;:::o;28315:419::-;;28519:2;28508:9;28504:18;28496:26;;28568:9;28562:4;28558:20;28554:1;28543:9;28539:17;28532:47;28596:131;28722:4;28596:131;:::i;:::-;28588:139;;28486:248;;;:::o;28740:419::-;;28944:2;28933:9;28929:18;28921:26;;28993:9;28987:4;28983:20;28979:1;28968:9;28964:17;28957:47;29021:131;29147:4;29021:131;:::i;:::-;29013:139;;28911:248;;;:::o;29165:419::-;;29369:2;29358:9;29354:18;29346:26;;29418:9;29412:4;29408:20;29404:1;29393:9;29389:17;29382:47;29446:131;29572:4;29446:131;:::i;:::-;29438:139;;29336:248;;;:::o;29590:419::-;;29794:2;29783:9;29779:18;29771:26;;29843:9;29837:4;29833:20;29829:1;29818:9;29814:17;29807:47;29871:131;29997:4;29871:131;:::i;:::-;29863:139;;29761:248;;;:::o;30015:419::-;;30219:2;30208:9;30204:18;30196:26;;30268:9;30262:4;30258:20;30254:1;30243:9;30239:17;30232:47;30296:131;30422:4;30296:131;:::i;:::-;30288:139;;30186:248;;;:::o;30440:419::-;;30644:2;30633:9;30629:18;30621:26;;30693:9;30687:4;30683:20;30679:1;30668:9;30664:17;30657:47;30721:131;30847:4;30721:131;:::i;:::-;30713:139;;30611:248;;;:::o;30865:419::-;;31069:2;31058:9;31054:18;31046:26;;31118:9;31112:4;31108:20;31104:1;31093:9;31089:17;31082:47;31146:131;31272:4;31146:131;:::i;:::-;31138:139;;31036:248;;;:::o;31290:222::-;;31421:2;31410:9;31406:18;31398:26;;31434:71;31502:1;31491:9;31487:17;31478:6;31434:71;:::i;:::-;31388:124;;;;:::o;31518:283::-;;31584:2;31578:9;31568:19;;31626:4;31618:6;31614:17;31733:6;31721:10;31718:22;31697:18;31685:10;31682:34;31679:62;31676:2;;;31744:18;;:::i;:::-;31676:2;31784:10;31780:2;31773:22;31558:243;;;;:::o;31807:331::-;;31958:18;31950:6;31947:30;31944:2;;;31980:18;;:::i;:::-;31944:2;32065:4;32061:9;32054:4;32046:6;32042:17;32038:33;32030:41;;32126:4;32120;32116:15;32108:23;;31873:265;;;:::o;32144:332::-;;32296:18;32288:6;32285:30;32282:2;;;32318:18;;:::i;:::-;32282:2;32403:4;32399:9;32392:4;32384:6;32380:17;32376:33;32368:41;;32464:4;32458;32454:15;32446:23;;32211:265;;;:::o;32482:98::-;;32567:5;32561:12;32551:22;;32540:40;;;:::o;32586:99::-;;32672:5;32666:12;32656:22;;32645:40;;;:::o;32691:168::-;;32808:6;32803:3;32796:19;32848:4;32843:3;32839:14;32824:29;;32786:73;;;;:::o;32865:169::-;;32983:6;32978:3;32971:19;33023:4;33018:3;33014:14;32999:29;;32961:73;;;;:::o;33040:148::-;;33179:3;33164:18;;33154:34;;;;:::o;33194:305::-;;33253:20;33271:1;33253:20;:::i;:::-;33248:25;;33287:20;33305:1;33287:20;:::i;:::-;33282:25;;33441:1;33373:66;33369:74;33366:1;33363:81;33360:2;;;33447:18;;:::i;:::-;33360:2;33491:1;33488;33484:9;33477:16;;33238:261;;;;:::o;33505:185::-;;33562:20;33580:1;33562:20;:::i;:::-;33557:25;;33596:20;33614:1;33596:20;:::i;:::-;33591:25;;33635:1;33625:2;;33640:18;;:::i;:::-;33625:2;33682:1;33679;33675:9;33670:14;;33547:143;;;;:::o;33696:191::-;;33756:20;33774:1;33756:20;:::i;:::-;33751:25;;33790:20;33808:1;33790:20;:::i;:::-;33785:25;;33829:1;33826;33823:8;33820:2;;;33834:18;;:::i;:::-;33820:2;33879:1;33876;33872:9;33864:17;;33741:146;;;;:::o;33893:96::-;;33959:24;33977:5;33959:24;:::i;:::-;33948:35;;33938:51;;;:::o;33995:104::-;;34069:24;34087:5;34069:24;:::i;:::-;34058:35;;34048:51;;;:::o;34105:90::-;;34182:5;34175:13;34168:21;34157:32;;34147:48;;;:::o;34201:149::-;;34277:66;34270:5;34266:78;34255:89;;34245:105;;;:::o;34356:126::-;;34433:42;34426:5;34422:54;34411:65;;34401:81;;;:::o;34488:77::-;;34554:5;34543:16;;34533:32;;;:::o;34571:154::-;34655:6;34650:3;34645;34632:30;34717:1;34708:6;34703:3;34699:16;34692:27;34622:103;;;:::o;34731:307::-;34799:1;34809:113;34823:6;34820:1;34817:13;34809:113;;;34908:1;34903:3;34899:11;34893:18;34889:1;34884:3;34880:11;34873:39;34845:2;34842:1;34838:10;34833:15;;34809:113;;;34940:6;34937:1;34934:13;34931:2;;;35020:1;35011:6;35006:3;35002:16;34995:27;34931:2;34780:258;;;;:::o;35044:320::-;;35125:1;35119:4;35115:12;35105:22;;35172:1;35166:4;35162:12;35193:18;35183:2;;35249:4;35241:6;35237:17;35227:27;;35183:2;35311;35303:6;35300:14;35280:18;35277:38;35274:2;;;35330:18;;:::i;:::-;35274:2;35095:269;;;;:::o;35370:233::-;;35432:24;35450:5;35432:24;:::i;:::-;35423:33;;35478:66;35471:5;35468:77;35465:2;;;35548:18;;:::i;:::-;35465:2;35595:1;35588:5;35584:13;35577:20;;35413:190;;;:::o;35609:100::-;;35677:26;35697:5;35677:26;:::i;:::-;35666:37;;35656:53;;;:::o;35715:108::-;;35791:26;35811:5;35791:26;:::i;:::-;35780:37;;35770:53;;;:::o;35829:94::-;;35897:20;35911:5;35897:20;:::i;:::-;35886:31;;35876:47;;;:::o;35929:79::-;;35997:5;35986:16;;35976:32;;;:::o;36014:176::-;;36063:20;36081:1;36063:20;:::i;:::-;36058:25;;36097:20;36115:1;36097:20;:::i;:::-;36092:25;;36136:1;36126:2;;36141:18;;:::i;:::-;36126:2;36182:1;36179;36175:9;36170:14;;36048:142;;;;:::o;36196:180::-;36244:77;36241:1;36234:88;36341:4;36338:1;36331:15;36365:4;36362:1;36355:15;36382:180;36430:77;36427:1;36420:88;36527:4;36524:1;36517:15;36551:4;36548:1;36541:15;36568:180;36616:77;36613:1;36606:88;36713:4;36710:1;36703:15;36737:4;36734:1;36727:15;36754:180;36802:77;36799:1;36792:88;36899:4;36896:1;36889:15;36923:4;36920:1;36913:15;36940:102;;37032:2;37028:7;37023:2;37016:5;37012:14;37008:28;36998:38;;36988:54;;;:::o;37048:94::-;;37129:5;37125:2;37121:14;37100:35;;37090:52;;;:::o;37148:122::-;37221:24;37239:5;37221:24;:::i;:::-;37214:5;37211:35;37201:2;;37260:1;37257;37250:12;37201:2;37191:79;:::o;37276:116::-;37346:21;37361:5;37346:21;:::i;:::-;37339:5;37336:32;37326:2;;37382:1;37379;37372:12;37326:2;37316:76;:::o;37398:120::-;37470:23;37487:5;37470:23;:::i;:::-;37463:5;37460:34;37450:2;;37508:1;37505;37498:12;37450:2;37440:78;:::o;37524:122::-;37597:24;37615:5;37597:24;:::i;:::-;37590:5;37587:35;37577:2;;37636:1;37633;37626:12;37577:2;37567:79;:::o

Swarm Source

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