ETH Price: $3,670.02 (+0.82%)

Token

ERC-20: The Adventurers PFP (PFP)
 

Overview

Max Total Supply

793 PFP

Holders

348

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 PFP
0x5406748098c1cc3A6946a76D7862297cc4CcaB4e
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:
AdventurersPFP

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-10-01
*/

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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


pragma solidity ^0.8.0;

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

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

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

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

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

}

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

pragma solidity ^0.8.0;

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


pragma solidity ^0.8.0;

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


pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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




pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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


pragma solidity ^0.8.0;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId, true);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;
abstract contract AdvText {
  function ownerOf(uint256 tokenId) public virtual view returns (address);
  function tokenOfOwnerByIndex(address owner, uint256 index) public virtual view returns (uint256);
  function balanceOf(address owner) external virtual view returns (uint256 balance);
}


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

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

    uint256 public NFT_PRICE = 50000000000000000; // 0.05 ETH
    uint public constant MAX_NFT_PURCHASE = 20;
    uint256 public MAX_SUPPLY = 9999;
    uint256 public Startindex_PFP = 5000;  
    bool public saleIsActive = false;
    bool public composeIsActive = false;
    uint public PFPReserve = 300;
     
    address public  WeaponContractAddress;
    address public  TextContractAddress;    

    uint256 public startingIndex;
    uint256 public startingIndexBlock;

    bool public preSaleIsActive = false;

    mapping (address => bool) whitelist;

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

    mapping(uint => uint256) public minternaltokenid;
    event heroInternaltokenidChange(address _by, uint _tokenId,  uint256 _internaltokenID);

    constructor() ERC721("The Adventurers PFP","PFP"){
    }

    function setTextContractAddress(address contractAddress) public onlyOwner {
       TextContractAddress = contractAddress;
    }

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

    function flipComposeState() public onlyOwner {
        composeIsActive = !composeIsActive;
    }

    function isEligiblePrivateSale(address _wallet) public view virtual returns (bool){
        return whitelist[_wallet];
    }

    function addWalletsToWhiteList(address[] memory _wallets) public onlyOwner{
        for(uint i = 0; i < _wallets.length; i++) {
            whitelist[_wallets[i]] = true;
        }
    }

    function setMintPrice(uint price) external onlyOwner {
        NFT_PRICE = price;
    }

    function setMaxHeros(uint maxhero) external onlyOwner {
        MAX_SUPPLY = maxhero;
    }

    function setWeaponContractAddress(address contractAddress) public onlyOwner {
        WeaponContractAddress = contractAddress;
    }
    
  function setStartIndexPFP(uint StartIndexPFP) external onlyOwner {
    Startindex_PFP = StartIndexPFP;
  }

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

  function reservePFP(address _to, uint256 _reserveAmount) public onlyOwner {
    uint supply = Startindex_PFP +  totalSupply();
    require(_reserveAmount > 0 && _reserveAmount <= PFPReserve, "Not enough reserve left for team");
    require(totalSupply().add(_reserveAmount+Startindex_PFP) <= MAX_SUPPLY, "Purchase would exceed max supply of zales");
    for (uint i = 0; i < _reserveAmount; i++) {
      _safeMint(_to, supply + i);
    }
    PFPReserve = PFPReserve.sub(_reserveAmount);
  }

  function mintAdvPFP(uint numberOfTokens) public payable {
        require(saleIsActive || preSaleIsActive, "Sale must be active to mint PFP");
        require(numberOfTokens > 0 && numberOfTokens <= MAX_NFT_PURCHASE, "Can only mint 20 tokens at a time");
        require(totalSupply().add(numberOfTokens + Startindex_PFP) <= MAX_SUPPLY, "Purchase would exceed max supply of PFP");
        require(msg.value >= NFT_PRICE.mul(numberOfTokens), "Ether value sent is not correct");
    
        for (uint i = 0; i < numberOfTokens; i++) {
          uint mintIndex = Startindex_PFP + totalSupply();
          if (mintIndex < MAX_SUPPLY) {
            _safeMint(msg.sender, mintIndex);
          }
        }
      }
    
  function MintPFPbyText(uint256 tokenId) public {
    require(saleIsActive, "Sale must be active to mint a PFP");
    require(totalSupply() < MAX_SUPPLY, "Purchase would exceed max supply of PFP");
    require(tokenId < MAX_SUPPLY, "Requested tokenId exceeds upper bound");
    

    AdvText advText = AdvText(TextContractAddress);
    require(advText.ownerOf(tokenId) == msg.sender, "Must own the Text for requested tokenId to mint a PFP");
    require(!_exists(tokenId), "Token already minted");
    _safeMint(msg.sender, tokenId);
  }

    function composePFP(address owner, uint256 WeapontokenId, uint256 PFPtokenId, uint256 newPFPtokenId) public returns (bool) {
        require(composeIsActive, "Compose is not active at the moment");
        require(ERC721.ownerOf(PFPtokenId) == owner, "You do not have this PFP");
        AdvWeapon advWeapon = AdvWeapon(WeaponContractAddress);
            
        require(advWeapon.ownerOf(WeapontokenId) == owner, "You do not have this weapon");
        minternaltokenid[PFPtokenId] = newPFPtokenId;
        emit heroInternaltokenidChange(msg.sender, PFPtokenId, newPFPtokenId);
        return true;
    }

    function getinternaltokenID(uint _tokenId) public  view returns( uint256 ){
       require(_tokenId <= totalSupply(), "ID would exceed max supply of heros");
        return minternaltokenid[_tokenId];
     }
  
    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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_by","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_internaltokenID","type":"uint256"}],"name":"heroInternaltokenidChange","type":"event"},{"inputs":[],"name":"MAX_NFT_PURCHASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"MintPFPbyText","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"NFT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PFPReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Startindex_PFP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TextContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WeaponContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_wallets","type":"address[]"}],"name":"addWalletsToWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"composeIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"WeapontokenId","type":"uint256"},{"internalType":"uint256","name":"PFPtokenId","type":"uint256"},{"internalType":"uint256","name":"newPFPtokenId","type":"uint256"}],"name":"composePFP","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencySetStartingIndexBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipComposeState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipPreSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getinternaltokenID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"isEligiblePrivateSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintAdvPFP","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"minternaltokenid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_reserveAmount","type":"uint256"}],"name":"reservePFP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxhero","type":"uint256"}],"name":"setMaxHeros","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"StartIndexPFP","type":"uint256"}],"name":"setStartIndexPFP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setTextContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setWeaponContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"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"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405266b1a2bc2ec50000600b5561270f600c55611388600d556000600e60006101000a81548160ff0219169083151502179055506000600e60016101000a81548160ff02191690831515021790555061012c600f556000601460006101000a81548160ff0219169083151502179055503480156200007f57600080fd5b506040518060400160405280601381526020017f54686520416476656e74757265727320504650000000000000000000000000008152506040518060400160405280600381526020017f5046500000000000000000000000000000000000000000000000000000000000815250816000908051906020019062000104929190620001df565b5080600190805190602001906200011d929190620001df565b505050600062000132620001d760201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620002f4565b600033905090565b828054620001ed906200028f565b90600052602060002090601f0160209004810192826200021157600085556200025d565b82601f106200022c57805160ff19168380011785556200025d565b828001600101855582156200025d579182015b828111156200025c5782518255916020019190600101906200023f565b5b5090506200026c919062000270565b5090565b5b808211156200028b57600081600090555060010162000271565b5090565b60006002820490506001821680620002a857607f821691505b60208210811415620002bf57620002be620002c5565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61580d80620003046000396000f3fe6080604052600436106102c95760003560e01c8063770e9c5a11610175578063c87b56dd116100dc578063e985e9c511610095578063ec0870451161006f578063ec08704514610ad5578063f032554914610afe578063f2fde38b14610b15578063f4a0a52814610b3e576102c9565b8063e985e9c514610a56578063eb7a333314610a93578063eb8d244414610aaa576102c9565b8063c87b56dd14610946578063cb774d4714610983578063d17675a0146109ae578063e2e17963146109d9578063e36d649814610a02578063e76f67ab14610a2d576102c9565b8063a638fab41161012e578063a638fab414610836578063af7420a31461085f578063b7d166401461089c578063b88d4fde146108c7578063bb7d593f146108f0578063c37fae9b1461091b576102c9565b8063770e9c5a1461075b5780637d17fcbe1461078457806381f33af31461079b5780638da5cb5b146107b757806395d89b41146107e2578063a22cb4651461080d576102c9565b806332cb6b0c116102345780634e315efc116101ed5780636352211e116101c75780636352211e1461069f578063676dd563146106dc57806370a0823114610707578063715018a614610744576102c9565b80634e315efc146106105780634f6ccce71461063957806355f804b314610676576102c9565b806332cb6b0c1461051457806334918dfd1461053f5780633ccfd60b1461055657806342842e0e1461056d57806347dc3be3146105965780634de7db84146105d3576102c9565b80630c5ea406116102865780630c5ea406146103f257806318160ddd1461042f5780631f0234d81461045a57806323b872dd14610485578063286a84e4146104ae5780632f745c59146104d7576102c9565b806301ffc9a7146102ce578063020b39cc1461030b57806306fdde0314610336578063081812fc14610361578063095ea7b31461039e5780630b81d261146103c7575b600080fd5b3480156102da57600080fd5b506102f560048036038101906102f091906140ed565b610b67565b6040516103029190614ebf565b60405180910390f35b34801561031757600080fd5b50610320610be1565b60405161032d919061531c565b60405180910390f35b34801561034257600080fd5b5061034b610be6565b6040516103589190614eda565b60405180910390f35b34801561036d57600080fd5b5061038860048036038101906103839190614180565b610c78565b6040516103959190614e21565b60405180910390f35b3480156103aa57600080fd5b506103c560048036038101906103c0919061400d565b610cfd565b005b3480156103d357600080fd5b506103dc610e15565b6040516103e9919061531c565b60405180910390f35b3480156103fe57600080fd5b5061041960048036038101906104149190614180565b610e1b565b604051610426919061531c565b60405180910390f35b34801561043b57600080fd5b50610444610e82565b604051610451919061531c565b60405180910390f35b34801561046657600080fd5b5061046f610e8f565b60405161047c9190614ebf565b60405180910390f35b34801561049157600080fd5b506104ac60048036038101906104a79190613f07565b610ea2565b005b3480156104ba57600080fd5b506104d560048036038101906104d09190614180565b610f02565b005b3480156104e357600080fd5b506104fe60048036038101906104f9919061400d565b610f88565b60405161050b919061531c565b60405180910390f35b34801561052057600080fd5b5061052961102d565b604051610536919061531c565b60405180910390f35b34801561054b57600080fd5b50610554611033565b005b34801561056257600080fd5b5061056b6110db565b005b34801561057957600080fd5b50610594600480360381019061058f9190613f07565b6111a6565b005b3480156105a257600080fd5b506105bd60048036038101906105b89190614049565b6111c6565b6040516105ca9190614ebf565b60405180910390f35b3480156105df57600080fd5b506105fa60048036038101906105f59190614180565b61140a565b604051610607919061531c565b60405180910390f35b34801561061c57600080fd5b5061063760048036038101906106329190613e79565b611422565b005b34801561064557600080fd5b50610660600480360381019061065b9190614180565b6114e2565b60405161066d919061531c565b60405180910390f35b34801561068257600080fd5b5061069d6004803603810190610698919061413f565b611579565b005b3480156106ab57600080fd5b506106c660048036038101906106c19190614180565b61160f565b6040516106d39190614e21565b60405180910390f35b3480156106e857600080fd5b506106f16116c1565b6040516106fe919061531c565b60405180910390f35b34801561071357600080fd5b5061072e60048036038101906107299190613e79565b6116c7565b60405161073b919061531c565b60405180910390f35b34801561075057600080fd5b5061075961177f565b005b34801561076757600080fd5b50610782600480360381019061077d919061400d565b6118bc565b005b34801561079057600080fd5b50610799611a61565b005b6107b560048036038101906107b09190614180565b611b2b565b005b3480156107c357600080fd5b506107cc611cf4565b6040516107d99190614e21565b60405180910390f35b3480156107ee57600080fd5b506107f7611d1e565b6040516108049190614eda565b60405180910390f35b34801561081957600080fd5b50610834600480360381019061082f9190613fd1565b611db0565b005b34801561084257600080fd5b5061085d60048036038101906108589190614180565b611f31565b005b34801561086b57600080fd5b5061088660048036038101906108819190613e79565b612183565b6040516108939190614ebf565b60405180910390f35b3480156108a857600080fd5b506108b16121d9565b6040516108be9190614ebf565b60405180910390f35b3480156108d357600080fd5b506108ee60048036038101906108e99190613f56565b6121ec565b005b3480156108fc57600080fd5b5061090561224e565b6040516109129190614e21565b60405180910390f35b34801561092757600080fd5b50610930612274565b60405161093d9190614e21565b60405180910390f35b34801561095257600080fd5b5061096d60048036038101906109689190614180565b61229a565b60405161097a9190614eda565b60405180910390f35b34801561098f57600080fd5b5061099861240d565b6040516109a5919061531c565b60405180910390f35b3480156109ba57600080fd5b506109c3612413565b6040516109d0919061531c565b60405180910390f35b3480156109e557600080fd5b50610a0060048036038101906109fb91906140ac565b612419565b005b348015610a0e57600080fd5b50610a17612550565b604051610a24919061531c565b60405180910390f35b348015610a3957600080fd5b50610a546004803603810190610a4f9190614180565b612556565b005b348015610a6257600080fd5b50610a7d6004803603810190610a789190613ecb565b6125dc565b604051610a8a9190614ebf565b60405180910390f35b348015610a9f57600080fd5b50610aa8612670565b005b348015610ab657600080fd5b50610abf612718565b604051610acc9190614ebf565b60405180910390f35b348015610ae157600080fd5b50610afc6004803603810190610af79190613e79565b61272b565b005b348015610b0a57600080fd5b50610b136127eb565b005b348015610b2157600080fd5b50610b3c6004803603810190610b379190613e79565b612893565b005b348015610b4a57600080fd5b50610b656004803603810190610b609190614180565b612a3f565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610bda5750610bd982612ac5565b5b9050919050565b601481565b606060008054610bf590615602565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2190615602565b8015610c6e5780601f10610c4357610100808354040283529160200191610c6e565b820191906000526020600020905b815481529060010190602001808311610c5157829003601f168201915b5050505050905090565b6000610c8382612ba7565b610cc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb99061519c565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d088261160f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d709061521c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d98612c13565b73ffffffffffffffffffffffffffffffffffffffff161480610dc75750610dc681610dc1612c13565b6125dc565b5b610e06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfd9061511c565b60405180910390fd5b610e108383612c1b565b505050565b600f5481565b6000610e25610e82565b821115610e67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5e906152bc565b60405180910390fd5b60186000838152602001908152602001600020549050919050565b6000600880549050905090565b601460009054906101000a900460ff1681565b610eb3610ead612c13565b82612cd4565b610ef2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee99061523c565b60405180910390fd5b610efd838383612db2565b505050565b610f0a612c13565b73ffffffffffffffffffffffffffffffffffffffff16610f28611cf4565b73ffffffffffffffffffffffffffffffffffffffff1614610f7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f75906151bc565b60405180910390fd5b80600c8190555050565b6000610f93836116c7565b8210610fd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcb90614f1c565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600c5481565b61103b612c13565b73ffffffffffffffffffffffffffffffffffffffff16611059611cf4565b73ffffffffffffffffffffffffffffffffffffffff16146110af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a6906151bc565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b6110e3612c13565b73ffffffffffffffffffffffffffffffffffffffff16611101611cf4565b73ffffffffffffffffffffffffffffffffffffffff1614611157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114e906151bc565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156111a2573d6000803e3d6000fd5b5050565b6111c1838383604051806020016040528060008152506121ec565b505050565b6000600e60019054906101000a900460ff16611217576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120e90614fbc565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff166112378461160f565b73ffffffffffffffffffffffffffffffffffffffff161461128d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611284906152fc565b60405180910390fd5b6000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e876040518263ffffffff1660e01b8152600401611304919061531c565b60206040518083038186803b15801561131c57600080fd5b505afa158015611330573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113549190613ea2565b73ffffffffffffffffffffffffffffffffffffffff16146113aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a190614fdc565b60405180910390fd5b8260186000868152602001908152602001600020819055507f209a44f18fd48de4f84530ea5010d55edb918d27ec320e7e3d81a336fdf971b63385856040516113f593929190614e88565b60405180910390a16001915050949350505050565b60186020528060005260406000206000915090505481565b61142a612c13565b73ffffffffffffffffffffffffffffffffffffffff16611448611cf4565b73ffffffffffffffffffffffffffffffffffffffff161461149e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611495906151bc565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006114ec610e82565b821061152d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115249061527c565b60405180910390fd5b60088281548110611567577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b611581612c13565b73ffffffffffffffffffffffffffffffffffffffff1661159f611cf4565b73ffffffffffffffffffffffffffffffffffffffff16146115f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ec906151bc565b60405180910390fd5b806016908051906020019061160b929190613bf2565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116af9061515c565b60405180910390fd5b80915050919050565b600b5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611738576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172f9061513c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611787612c13565b73ffffffffffffffffffffffffffffffffffffffff166117a5611cf4565b73ffffffffffffffffffffffffffffffffffffffff16146117fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f2906151bc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6118c4612c13565b73ffffffffffffffffffffffffffffffffffffffff166118e2611cf4565b73ffffffffffffffffffffffffffffffffffffffff1614611938576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192f906151bc565b60405180910390fd5b6000611942610e82565b600d5461194f9190615437565b90506000821180156119635750600f548211155b6119a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199990614f9c565b60405180910390fd5b600c546119cc600d54846119b69190615437565b6119be610e82565b61301090919063ffffffff16565b1115611a0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a049061529c565b60405180910390fd5b60005b82811015611a4057611a2d848284611a289190615437565b613026565b8080611a3890615634565b915050611a10565b50611a5682600f5461304490919063ffffffff16565b600f81905550505050565b611a69612c13565b73ffffffffffffffffffffffffffffffffffffffff16611a87611cf4565b73ffffffffffffffffffffffffffffffffffffffff1614611add576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad4906151bc565b60405180910390fd5b600060125414611b22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b19906150dc565b60405180910390fd5b43601381905550565b600e60009054906101000a900460ff1680611b525750601460009054906101000a900460ff165b611b91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b88906152dc565b60405180910390fd5b600081118015611ba2575060148111155b611be1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd89061509c565b60405180910390fd5b600c54611c0b600d5483611bf59190615437565b611bfd610e82565b61301090919063ffffffff16565b1115611c4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c43906150bc565b60405180910390fd5b611c6181600b5461305a90919063ffffffff16565b341015611ca3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9a9061503c565b60405180910390fd5b60005b81811015611cf0576000611cb8610e82565b600d54611cc59190615437565b9050600c54811015611cdc57611cdb3382613026565b5b508080611ce890615634565b915050611ca6565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611d2d90615602565b80601f0160208091040260200160405190810160405280929190818152602001828054611d5990615602565b8015611da65780601f10611d7b57610100808354040283529160200191611da6565b820191906000526020600020905b815481529060010190602001808311611d8957829003601f168201915b5050505050905090565b611db8612c13565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1d9061501c565b60405180910390fd5b8060056000611e33612c13565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ee0612c13565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f259190614ebf565b60405180910390a35050565b600e60009054906101000a900460ff16611f80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f779061525c565b60405180910390fd5b600c54611f8b610e82565b10611fcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc2906150bc565b60405180910390fd5b600c54811061200f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612006906150fc565b60405180910390fd5b6000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b8152600401612086919061531c565b60206040518083038186803b15801561209e57600080fd5b505afa1580156120b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120d69190613ea2565b73ffffffffffffffffffffffffffffffffffffffff161461212c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121239061505c565b60405180910390fd5b61213582612ba7565b15612175576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216c90614efc565b60405180910390fd5b61217f3383613026565b5050565b6000601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600e60019054906101000a900460ff1681565b6121fd6121f7612c13565b83612cd4565b61223c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122339061523c565b60405180910390fd5b61224884848484613070565b50505050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606122a582612ba7565b6122e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122db906151fc565b60405180910390fd5b600060176000848152602001908152602001600020805461230490615602565b80601f016020809104026020016040519081016040528092919081815260200182805461233090615602565b801561237d5780601f106123525761010080835404028352916020019161237d565b820191906000526020600020905b81548152906001019060200180831161236057829003601f168201915b50505050509050600061238e6130cc565b90506000815114156123a4578192505050612408565b6000825111156123d95780826040516020016123c1929190614dfd565b60405160208183030381529060405292505050612408565b806123e38561315e565b6040516020016123f4929190614dfd565b604051602081830303815290604052925050505b919050565b60125481565b600d5481565b612421612c13565b73ffffffffffffffffffffffffffffffffffffffff1661243f611cf4565b73ffffffffffffffffffffffffffffffffffffffff1614612495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248c906151bc565b60405180910390fd5b60005b815181101561254c576001601560008484815181106124e0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061254490615634565b915050612498565b5050565b60135481565b61255e612c13565b73ffffffffffffffffffffffffffffffffffffffff1661257c611cf4565b73ffffffffffffffffffffffffffffffffffffffff16146125d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c9906151bc565b60405180910390fd5b80600d8190555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612678612c13565b73ffffffffffffffffffffffffffffffffffffffff16612696611cf4565b73ffffffffffffffffffffffffffffffffffffffff16146126ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e3906151bc565b60405180910390fd5b600e60019054906101000a900460ff1615600e60016101000a81548160ff021916908315150217905550565b600e60009054906101000a900460ff1681565b612733612c13565b73ffffffffffffffffffffffffffffffffffffffff16612751611cf4565b73ffffffffffffffffffffffffffffffffffffffff16146127a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279e906151bc565b60405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6127f3612c13565b73ffffffffffffffffffffffffffffffffffffffff16612811611cf4565b73ffffffffffffffffffffffffffffffffffffffff1614612867576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285e906151bc565b60405180910390fd5b601460009054906101000a900460ff1615601460006101000a81548160ff021916908315150217905550565b61289b612c13565b73ffffffffffffffffffffffffffffffffffffffff166128b9611cf4565b73ffffffffffffffffffffffffffffffffffffffff161461290f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612906906151bc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561297f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297690614f5c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b612a47612c13565b73ffffffffffffffffffffffffffffffffffffffff16612a65611cf4565b73ffffffffffffffffffffffffffffffffffffffff1614612abb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab2906151bc565b60405180910390fd5b80600b8190555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612b9057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612ba05750612b9f8261330b565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612c8e8361160f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612cdf82612ba7565b612d1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d159061507c565b60405180910390fd5b6000612d298361160f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612d9857508373ffffffffffffffffffffffffffffffffffffffff16612d8084610c78565b73ffffffffffffffffffffffffffffffffffffffff16145b80612da95750612da881856125dc565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612dd28261160f565b73ffffffffffffffffffffffffffffffffffffffff1614612e28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1f906151dc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e8f90614ffc565b60405180910390fd5b612ea58383836001613375565b612eb0600082612c1b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f009190615518565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f579190615437565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000818361301e9190615437565b905092915050565b61304082826040518060200160405280600081525061349f565b5050565b600081836130529190615518565b905092915050565b6000818361306891906154be565b905092915050565b61307b848484612db2565b613087848484846134fa565b6130c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130bd90614f3c565b60405180910390fd5b50505050565b6060601680546130db90615602565b80601f016020809104026020016040519081016040528092919081815260200182805461310790615602565b80156131545780601f1061312957610100808354040283529160200191613154565b820191906000526020600020905b81548152906001019060200180831161313757829003601f168201915b5050505050905090565b606060008214156131a6576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613306565b600082905060005b600082146131d85780806131c190615634565b915050600a826131d1919061548d565b91506131ae565b60008167ffffffffffffffff81111561321a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561324c5781602001600182028036833780820191505090505b5090505b600085146132ff576001826132659190615518565b9150600a85613274919061567d565b60306132809190615437565b60f81b8183815181106132bc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856132f8919061548d565b9450613250565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61338184848484613691565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156133c4576133bf82613697565b613403565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146134025761340184836136e0565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614801561343c5750805b1561344f5761344a8261384d565b613499565b8373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156134885750805b15613498576134978383613990565b5b5b50505050565b6134a98383613a0f565b6134b660008484846134fa565b6134f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ec90614f3c565b60405180910390fd5b505050565b600061351b8473ffffffffffffffffffffffffffffffffffffffff16613bdf565b15613684578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613544612c13565b8786866040518563ffffffff1660e01b81526004016135669493929190614e3c565b602060405180830381600087803b15801561358057600080fd5b505af19250505080156135b157506040513d601f19601f820116820180604052508101906135ae9190614116565b60015b613634573d80600081146135e1576040519150601f19603f3d011682016040523d82523d6000602084013e6135e6565b606091505b5060008151141561362c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161362390614f3c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613689565b600190505b949350505050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016136ed846116c7565b6136f79190615518565b90506000600760008481526020019081526020016000205490508181146137dc576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506138619190615518565b90506000600960008481526020019081526020016000205490506000600883815481106138b7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106138ff577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613974577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061399b836116c7565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613a7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a769061517c565b60405180910390fd5b613a8881612ba7565b15613ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613abf90614f7c565b60405180910390fd5b613ad6600083836001613375565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613b269190615437565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054613bfe90615602565b90600052602060002090601f016020900481019282613c205760008555613c67565b82601f10613c3957805160ff1916838001178555613c67565b82800160010185558215613c67579182015b82811115613c66578251825591602001919060010190613c4b565b5b509050613c749190613c78565b5090565b5b80821115613c91576000816000905550600101613c79565b5090565b6000613ca8613ca384615368565b615337565b90508083825260208201905082856020860282011115613cc757600080fd5b60005b85811015613cf75781613cdd8882613d7d565b845260208401935060208301925050600181019050613cca565b5050509392505050565b6000613d14613d0f84615394565b615337565b905082815260208101848484011115613d2c57600080fd5b613d378482856155c0565b509392505050565b6000613d52613d4d846153c4565b615337565b905082815260208101848484011115613d6a57600080fd5b613d758482856155c0565b509392505050565b600081359050613d8c8161577b565b92915050565b600081519050613da18161577b565b92915050565b600082601f830112613db857600080fd5b8135613dc8848260208601613c95565b91505092915050565b600081359050613de081615792565b92915050565b600081359050613df5816157a9565b92915050565b600081519050613e0a816157a9565b92915050565b600082601f830112613e2157600080fd5b8135613e31848260208601613d01565b91505092915050565b600082601f830112613e4b57600080fd5b8135613e5b848260208601613d3f565b91505092915050565b600081359050613e73816157c0565b92915050565b600060208284031215613e8b57600080fd5b6000613e9984828501613d7d565b91505092915050565b600060208284031215613eb457600080fd5b6000613ec284828501613d92565b91505092915050565b60008060408385031215613ede57600080fd5b6000613eec85828601613d7d565b9250506020613efd85828601613d7d565b9150509250929050565b600080600060608486031215613f1c57600080fd5b6000613f2a86828701613d7d565b9350506020613f3b86828701613d7d565b9250506040613f4c86828701613e64565b9150509250925092565b60008060008060808587031215613f6c57600080fd5b6000613f7a87828801613d7d565b9450506020613f8b87828801613d7d565b9350506040613f9c87828801613e64565b925050606085013567ffffffffffffffff811115613fb957600080fd5b613fc587828801613e10565b91505092959194509250565b60008060408385031215613fe457600080fd5b6000613ff285828601613d7d565b925050602061400385828601613dd1565b9150509250929050565b6000806040838503121561402057600080fd5b600061402e85828601613d7d565b925050602061403f85828601613e64565b9150509250929050565b6000806000806080858703121561405f57600080fd5b600061406d87828801613d7d565b945050602061407e87828801613e64565b935050604061408f87828801613e64565b92505060606140a087828801613e64565b91505092959194509250565b6000602082840312156140be57600080fd5b600082013567ffffffffffffffff8111156140d857600080fd5b6140e484828501613da7565b91505092915050565b6000602082840312156140ff57600080fd5b600061410d84828501613de6565b91505092915050565b60006020828403121561412857600080fd5b600061413684828501613dfb565b91505092915050565b60006020828403121561415157600080fd5b600082013567ffffffffffffffff81111561416b57600080fd5b61417784828501613e3a565b91505092915050565b60006020828403121561419257600080fd5b60006141a084828501613e64565b91505092915050565b6141b28161554c565b82525050565b6141c18161555e565b82525050565b60006141d2826153f4565b6141dc818561540a565b93506141ec8185602086016155cf565b6141f58161576a565b840191505092915050565b600061420b826153ff565b614215818561541b565b93506142258185602086016155cf565b61422e8161576a565b840191505092915050565b6000614244826153ff565b61424e818561542c565b935061425e8185602086016155cf565b80840191505092915050565b600061427760148361541b565b91507f546f6b656e20616c7265616479206d696e7465640000000000000000000000006000830152602082019050919050565b60006142b7602b8361541b565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b600061431d60328361541b565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061438360268361541b565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006143e9601c8361541b565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b600061442960208361541b565b91507f4e6f7420656e6f7567682072657365727665206c65667420666f72207465616d6000830152602082019050919050565b600061446960238361541b565b91507f436f6d706f7365206973206e6f742061637469766520617420746865206d6f6d60008301527f656e7400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006144cf601b8361541b565b91507f596f7520646f206e6f742068617665207468697320776561706f6e00000000006000830152602082019050919050565b600061450f60248361541b565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061457560198361541b565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006145b5601f8361541b565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b60006145f560358361541b565b91507f4d757374206f776e20746865205465787420666f72207265717565737465642060008301527f746f6b656e496420746f206d696e7420612050465000000000000000000000006020830152604082019050919050565b600061465b602c8361541b565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006146c160218361541b565b91507f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d60008301527f65000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061472760278361541b565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f6620504650000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061478d601d8361541b565b91507f5374617274696e6720696e64657820697320616c7265616479207365740000006000830152602082019050919050565b60006147cd60258361541b565b91507f52657175657374656420746f6b656e496420657863656564732075707065722060008301527f626f756e640000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061483360388361541b565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614899602a8361541b565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006148ff60298361541b565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061496560208361541b565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006149a5602c8361541b565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614a0b60208361541b565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614a4b60298361541b565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614ab1602f8361541b565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614b1760218361541b565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614b7d60318361541b565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614be360218361541b565b91507f53616c65206d7573742062652061637469766520746f206d696e74206120504660008301527f50000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614c49602c8361541b565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000614caf60298361541b565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f66207a616c657300000000000000000000000000000000000000000000006020830152604082019050919050565b6000614d1560238361541b565b91507f494420776f756c6420657863656564206d617820737570706c79206f6620686560008301527f726f7300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614d7b601f8361541b565b91507f53616c65206d7573742062652061637469766520746f206d696e7420504650006000830152602082019050919050565b6000614dbb60188361541b565b91507f596f7520646f206e6f74206861766520746869732050465000000000000000006000830152602082019050919050565b614df7816155b6565b82525050565b6000614e098285614239565b9150614e158284614239565b91508190509392505050565b6000602082019050614e3660008301846141a9565b92915050565b6000608082019050614e5160008301876141a9565b614e5e60208301866141a9565b614e6b6040830185614dee565b8181036060830152614e7d81846141c7565b905095945050505050565b6000606082019050614e9d60008301866141a9565b614eaa6020830185614dee565b614eb76040830184614dee565b949350505050565b6000602082019050614ed460008301846141b8565b92915050565b60006020820190508181036000830152614ef48184614200565b905092915050565b60006020820190508181036000830152614f158161426a565b9050919050565b60006020820190508181036000830152614f35816142aa565b9050919050565b60006020820190508181036000830152614f5581614310565b9050919050565b60006020820190508181036000830152614f7581614376565b9050919050565b60006020820190508181036000830152614f95816143dc565b9050919050565b60006020820190508181036000830152614fb58161441c565b9050919050565b60006020820190508181036000830152614fd58161445c565b9050919050565b60006020820190508181036000830152614ff5816144c2565b9050919050565b6000602082019050818103600083015261501581614502565b9050919050565b6000602082019050818103600083015261503581614568565b9050919050565b60006020820190508181036000830152615055816145a8565b9050919050565b60006020820190508181036000830152615075816145e8565b9050919050565b600060208201905081810360008301526150958161464e565b9050919050565b600060208201905081810360008301526150b5816146b4565b9050919050565b600060208201905081810360008301526150d58161471a565b9050919050565b600060208201905081810360008301526150f581614780565b9050919050565b60006020820190508181036000830152615115816147c0565b9050919050565b6000602082019050818103600083015261513581614826565b9050919050565b600060208201905081810360008301526151558161488c565b9050919050565b60006020820190508181036000830152615175816148f2565b9050919050565b6000602082019050818103600083015261519581614958565b9050919050565b600060208201905081810360008301526151b581614998565b9050919050565b600060208201905081810360008301526151d5816149fe565b9050919050565b600060208201905081810360008301526151f581614a3e565b9050919050565b6000602082019050818103600083015261521581614aa4565b9050919050565b6000602082019050818103600083015261523581614b0a565b9050919050565b6000602082019050818103600083015261525581614b70565b9050919050565b6000602082019050818103600083015261527581614bd6565b9050919050565b6000602082019050818103600083015261529581614c3c565b9050919050565b600060208201905081810360008301526152b581614ca2565b9050919050565b600060208201905081810360008301526152d581614d08565b9050919050565b600060208201905081810360008301526152f581614d6e565b9050919050565b6000602082019050818103600083015261531581614dae565b9050919050565b60006020820190506153316000830184614dee565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561535e5761535d61573b565b5b8060405250919050565b600067ffffffffffffffff8211156153835761538261573b565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156153af576153ae61573b565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156153df576153de61573b565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000615442826155b6565b915061544d836155b6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615482576154816156ae565b5b828201905092915050565b6000615498826155b6565b91506154a3836155b6565b9250826154b3576154b26156dd565b5b828204905092915050565b60006154c9826155b6565b91506154d4836155b6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561550d5761550c6156ae565b5b828202905092915050565b6000615523826155b6565b915061552e836155b6565b925082821015615541576155406156ae565b5b828203905092915050565b600061555782615596565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156155ed5780820151818401526020810190506155d2565b838111156155fc576000848401525b50505050565b6000600282049050600182168061561a57607f821691505b6020821081141561562e5761562d61570c565b5b50919050565b600061563f826155b6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615672576156716156ae565b5b600182019050919050565b6000615688826155b6565b9150615693836155b6565b9250826156a3576156a26156dd565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6157848161554c565b811461578f57600080fd5b50565b61579b8161555e565b81146157a657600080fd5b50565b6157b28161556a565b81146157bd57600080fd5b50565b6157c9816155b6565b81146157d457600080fd5b5056fea26469706673582212207e0591a194e5cbea70014f3a5f0cf8f680349178cd37440e2d5372bc4aa1691664736f6c63430008000033

Deployed Bytecode

0x6080604052600436106102c95760003560e01c8063770e9c5a11610175578063c87b56dd116100dc578063e985e9c511610095578063ec0870451161006f578063ec08704514610ad5578063f032554914610afe578063f2fde38b14610b15578063f4a0a52814610b3e576102c9565b8063e985e9c514610a56578063eb7a333314610a93578063eb8d244414610aaa576102c9565b8063c87b56dd14610946578063cb774d4714610983578063d17675a0146109ae578063e2e17963146109d9578063e36d649814610a02578063e76f67ab14610a2d576102c9565b8063a638fab41161012e578063a638fab414610836578063af7420a31461085f578063b7d166401461089c578063b88d4fde146108c7578063bb7d593f146108f0578063c37fae9b1461091b576102c9565b8063770e9c5a1461075b5780637d17fcbe1461078457806381f33af31461079b5780638da5cb5b146107b757806395d89b41146107e2578063a22cb4651461080d576102c9565b806332cb6b0c116102345780634e315efc116101ed5780636352211e116101c75780636352211e1461069f578063676dd563146106dc57806370a0823114610707578063715018a614610744576102c9565b80634e315efc146106105780634f6ccce71461063957806355f804b314610676576102c9565b806332cb6b0c1461051457806334918dfd1461053f5780633ccfd60b1461055657806342842e0e1461056d57806347dc3be3146105965780634de7db84146105d3576102c9565b80630c5ea406116102865780630c5ea406146103f257806318160ddd1461042f5780631f0234d81461045a57806323b872dd14610485578063286a84e4146104ae5780632f745c59146104d7576102c9565b806301ffc9a7146102ce578063020b39cc1461030b57806306fdde0314610336578063081812fc14610361578063095ea7b31461039e5780630b81d261146103c7575b600080fd5b3480156102da57600080fd5b506102f560048036038101906102f091906140ed565b610b67565b6040516103029190614ebf565b60405180910390f35b34801561031757600080fd5b50610320610be1565b60405161032d919061531c565b60405180910390f35b34801561034257600080fd5b5061034b610be6565b6040516103589190614eda565b60405180910390f35b34801561036d57600080fd5b5061038860048036038101906103839190614180565b610c78565b6040516103959190614e21565b60405180910390f35b3480156103aa57600080fd5b506103c560048036038101906103c0919061400d565b610cfd565b005b3480156103d357600080fd5b506103dc610e15565b6040516103e9919061531c565b60405180910390f35b3480156103fe57600080fd5b5061041960048036038101906104149190614180565b610e1b565b604051610426919061531c565b60405180910390f35b34801561043b57600080fd5b50610444610e82565b604051610451919061531c565b60405180910390f35b34801561046657600080fd5b5061046f610e8f565b60405161047c9190614ebf565b60405180910390f35b34801561049157600080fd5b506104ac60048036038101906104a79190613f07565b610ea2565b005b3480156104ba57600080fd5b506104d560048036038101906104d09190614180565b610f02565b005b3480156104e357600080fd5b506104fe60048036038101906104f9919061400d565b610f88565b60405161050b919061531c565b60405180910390f35b34801561052057600080fd5b5061052961102d565b604051610536919061531c565b60405180910390f35b34801561054b57600080fd5b50610554611033565b005b34801561056257600080fd5b5061056b6110db565b005b34801561057957600080fd5b50610594600480360381019061058f9190613f07565b6111a6565b005b3480156105a257600080fd5b506105bd60048036038101906105b89190614049565b6111c6565b6040516105ca9190614ebf565b60405180910390f35b3480156105df57600080fd5b506105fa60048036038101906105f59190614180565b61140a565b604051610607919061531c565b60405180910390f35b34801561061c57600080fd5b5061063760048036038101906106329190613e79565b611422565b005b34801561064557600080fd5b50610660600480360381019061065b9190614180565b6114e2565b60405161066d919061531c565b60405180910390f35b34801561068257600080fd5b5061069d6004803603810190610698919061413f565b611579565b005b3480156106ab57600080fd5b506106c660048036038101906106c19190614180565b61160f565b6040516106d39190614e21565b60405180910390f35b3480156106e857600080fd5b506106f16116c1565b6040516106fe919061531c565b60405180910390f35b34801561071357600080fd5b5061072e60048036038101906107299190613e79565b6116c7565b60405161073b919061531c565b60405180910390f35b34801561075057600080fd5b5061075961177f565b005b34801561076757600080fd5b50610782600480360381019061077d919061400d565b6118bc565b005b34801561079057600080fd5b50610799611a61565b005b6107b560048036038101906107b09190614180565b611b2b565b005b3480156107c357600080fd5b506107cc611cf4565b6040516107d99190614e21565b60405180910390f35b3480156107ee57600080fd5b506107f7611d1e565b6040516108049190614eda565b60405180910390f35b34801561081957600080fd5b50610834600480360381019061082f9190613fd1565b611db0565b005b34801561084257600080fd5b5061085d60048036038101906108589190614180565b611f31565b005b34801561086b57600080fd5b5061088660048036038101906108819190613e79565b612183565b6040516108939190614ebf565b60405180910390f35b3480156108a857600080fd5b506108b16121d9565b6040516108be9190614ebf565b60405180910390f35b3480156108d357600080fd5b506108ee60048036038101906108e99190613f56565b6121ec565b005b3480156108fc57600080fd5b5061090561224e565b6040516109129190614e21565b60405180910390f35b34801561092757600080fd5b50610930612274565b60405161093d9190614e21565b60405180910390f35b34801561095257600080fd5b5061096d60048036038101906109689190614180565b61229a565b60405161097a9190614eda565b60405180910390f35b34801561098f57600080fd5b5061099861240d565b6040516109a5919061531c565b60405180910390f35b3480156109ba57600080fd5b506109c3612413565b6040516109d0919061531c565b60405180910390f35b3480156109e557600080fd5b50610a0060048036038101906109fb91906140ac565b612419565b005b348015610a0e57600080fd5b50610a17612550565b604051610a24919061531c565b60405180910390f35b348015610a3957600080fd5b50610a546004803603810190610a4f9190614180565b612556565b005b348015610a6257600080fd5b50610a7d6004803603810190610a789190613ecb565b6125dc565b604051610a8a9190614ebf565b60405180910390f35b348015610a9f57600080fd5b50610aa8612670565b005b348015610ab657600080fd5b50610abf612718565b604051610acc9190614ebf565b60405180910390f35b348015610ae157600080fd5b50610afc6004803603810190610af79190613e79565b61272b565b005b348015610b0a57600080fd5b50610b136127eb565b005b348015610b2157600080fd5b50610b3c6004803603810190610b379190613e79565b612893565b005b348015610b4a57600080fd5b50610b656004803603810190610b609190614180565b612a3f565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610bda5750610bd982612ac5565b5b9050919050565b601481565b606060008054610bf590615602565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2190615602565b8015610c6e5780601f10610c4357610100808354040283529160200191610c6e565b820191906000526020600020905b815481529060010190602001808311610c5157829003601f168201915b5050505050905090565b6000610c8382612ba7565b610cc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb99061519c565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d088261160f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d709061521c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d98612c13565b73ffffffffffffffffffffffffffffffffffffffff161480610dc75750610dc681610dc1612c13565b6125dc565b5b610e06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfd9061511c565b60405180910390fd5b610e108383612c1b565b505050565b600f5481565b6000610e25610e82565b821115610e67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5e906152bc565b60405180910390fd5b60186000838152602001908152602001600020549050919050565b6000600880549050905090565b601460009054906101000a900460ff1681565b610eb3610ead612c13565b82612cd4565b610ef2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee99061523c565b60405180910390fd5b610efd838383612db2565b505050565b610f0a612c13565b73ffffffffffffffffffffffffffffffffffffffff16610f28611cf4565b73ffffffffffffffffffffffffffffffffffffffff1614610f7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f75906151bc565b60405180910390fd5b80600c8190555050565b6000610f93836116c7565b8210610fd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcb90614f1c565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600c5481565b61103b612c13565b73ffffffffffffffffffffffffffffffffffffffff16611059611cf4565b73ffffffffffffffffffffffffffffffffffffffff16146110af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a6906151bc565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b6110e3612c13565b73ffffffffffffffffffffffffffffffffffffffff16611101611cf4565b73ffffffffffffffffffffffffffffffffffffffff1614611157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114e906151bc565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156111a2573d6000803e3d6000fd5b5050565b6111c1838383604051806020016040528060008152506121ec565b505050565b6000600e60019054906101000a900460ff16611217576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120e90614fbc565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff166112378461160f565b73ffffffffffffffffffffffffffffffffffffffff161461128d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611284906152fc565b60405180910390fd5b6000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e876040518263ffffffff1660e01b8152600401611304919061531c565b60206040518083038186803b15801561131c57600080fd5b505afa158015611330573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113549190613ea2565b73ffffffffffffffffffffffffffffffffffffffff16146113aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a190614fdc565b60405180910390fd5b8260186000868152602001908152602001600020819055507f209a44f18fd48de4f84530ea5010d55edb918d27ec320e7e3d81a336fdf971b63385856040516113f593929190614e88565b60405180910390a16001915050949350505050565b60186020528060005260406000206000915090505481565b61142a612c13565b73ffffffffffffffffffffffffffffffffffffffff16611448611cf4565b73ffffffffffffffffffffffffffffffffffffffff161461149e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611495906151bc565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006114ec610e82565b821061152d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115249061527c565b60405180910390fd5b60088281548110611567577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b611581612c13565b73ffffffffffffffffffffffffffffffffffffffff1661159f611cf4565b73ffffffffffffffffffffffffffffffffffffffff16146115f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ec906151bc565b60405180910390fd5b806016908051906020019061160b929190613bf2565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116af9061515c565b60405180910390fd5b80915050919050565b600b5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611738576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172f9061513c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611787612c13565b73ffffffffffffffffffffffffffffffffffffffff166117a5611cf4565b73ffffffffffffffffffffffffffffffffffffffff16146117fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f2906151bc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6118c4612c13565b73ffffffffffffffffffffffffffffffffffffffff166118e2611cf4565b73ffffffffffffffffffffffffffffffffffffffff1614611938576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192f906151bc565b60405180910390fd5b6000611942610e82565b600d5461194f9190615437565b90506000821180156119635750600f548211155b6119a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199990614f9c565b60405180910390fd5b600c546119cc600d54846119b69190615437565b6119be610e82565b61301090919063ffffffff16565b1115611a0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a049061529c565b60405180910390fd5b60005b82811015611a4057611a2d848284611a289190615437565b613026565b8080611a3890615634565b915050611a10565b50611a5682600f5461304490919063ffffffff16565b600f81905550505050565b611a69612c13565b73ffffffffffffffffffffffffffffffffffffffff16611a87611cf4565b73ffffffffffffffffffffffffffffffffffffffff1614611add576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad4906151bc565b60405180910390fd5b600060125414611b22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b19906150dc565b60405180910390fd5b43601381905550565b600e60009054906101000a900460ff1680611b525750601460009054906101000a900460ff165b611b91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b88906152dc565b60405180910390fd5b600081118015611ba2575060148111155b611be1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd89061509c565b60405180910390fd5b600c54611c0b600d5483611bf59190615437565b611bfd610e82565b61301090919063ffffffff16565b1115611c4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c43906150bc565b60405180910390fd5b611c6181600b5461305a90919063ffffffff16565b341015611ca3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9a9061503c565b60405180910390fd5b60005b81811015611cf0576000611cb8610e82565b600d54611cc59190615437565b9050600c54811015611cdc57611cdb3382613026565b5b508080611ce890615634565b915050611ca6565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611d2d90615602565b80601f0160208091040260200160405190810160405280929190818152602001828054611d5990615602565b8015611da65780601f10611d7b57610100808354040283529160200191611da6565b820191906000526020600020905b815481529060010190602001808311611d8957829003601f168201915b5050505050905090565b611db8612c13565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1d9061501c565b60405180910390fd5b8060056000611e33612c13565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ee0612c13565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f259190614ebf565b60405180910390a35050565b600e60009054906101000a900460ff16611f80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f779061525c565b60405180910390fd5b600c54611f8b610e82565b10611fcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc2906150bc565b60405180910390fd5b600c54811061200f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612006906150fc565b60405180910390fd5b6000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b8152600401612086919061531c565b60206040518083038186803b15801561209e57600080fd5b505afa1580156120b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120d69190613ea2565b73ffffffffffffffffffffffffffffffffffffffff161461212c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121239061505c565b60405180910390fd5b61213582612ba7565b15612175576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216c90614efc565b60405180910390fd5b61217f3383613026565b5050565b6000601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600e60019054906101000a900460ff1681565b6121fd6121f7612c13565b83612cd4565b61223c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122339061523c565b60405180910390fd5b61224884848484613070565b50505050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606122a582612ba7565b6122e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122db906151fc565b60405180910390fd5b600060176000848152602001908152602001600020805461230490615602565b80601f016020809104026020016040519081016040528092919081815260200182805461233090615602565b801561237d5780601f106123525761010080835404028352916020019161237d565b820191906000526020600020905b81548152906001019060200180831161236057829003601f168201915b50505050509050600061238e6130cc565b90506000815114156123a4578192505050612408565b6000825111156123d95780826040516020016123c1929190614dfd565b60405160208183030381529060405292505050612408565b806123e38561315e565b6040516020016123f4929190614dfd565b604051602081830303815290604052925050505b919050565b60125481565b600d5481565b612421612c13565b73ffffffffffffffffffffffffffffffffffffffff1661243f611cf4565b73ffffffffffffffffffffffffffffffffffffffff1614612495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248c906151bc565b60405180910390fd5b60005b815181101561254c576001601560008484815181106124e0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061254490615634565b915050612498565b5050565b60135481565b61255e612c13565b73ffffffffffffffffffffffffffffffffffffffff1661257c611cf4565b73ffffffffffffffffffffffffffffffffffffffff16146125d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c9906151bc565b60405180910390fd5b80600d8190555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612678612c13565b73ffffffffffffffffffffffffffffffffffffffff16612696611cf4565b73ffffffffffffffffffffffffffffffffffffffff16146126ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e3906151bc565b60405180910390fd5b600e60019054906101000a900460ff1615600e60016101000a81548160ff021916908315150217905550565b600e60009054906101000a900460ff1681565b612733612c13565b73ffffffffffffffffffffffffffffffffffffffff16612751611cf4565b73ffffffffffffffffffffffffffffffffffffffff16146127a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279e906151bc565b60405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6127f3612c13565b73ffffffffffffffffffffffffffffffffffffffff16612811611cf4565b73ffffffffffffffffffffffffffffffffffffffff1614612867576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285e906151bc565b60405180910390fd5b601460009054906101000a900460ff1615601460006101000a81548160ff021916908315150217905550565b61289b612c13565b73ffffffffffffffffffffffffffffffffffffffff166128b9611cf4565b73ffffffffffffffffffffffffffffffffffffffff161461290f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612906906151bc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561297f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297690614f5c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b612a47612c13565b73ffffffffffffffffffffffffffffffffffffffff16612a65611cf4565b73ffffffffffffffffffffffffffffffffffffffff1614612abb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab2906151bc565b60405180910390fd5b80600b8190555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612b9057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612ba05750612b9f8261330b565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612c8e8361160f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612cdf82612ba7565b612d1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d159061507c565b60405180910390fd5b6000612d298361160f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612d9857508373ffffffffffffffffffffffffffffffffffffffff16612d8084610c78565b73ffffffffffffffffffffffffffffffffffffffff16145b80612da95750612da881856125dc565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612dd28261160f565b73ffffffffffffffffffffffffffffffffffffffff1614612e28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1f906151dc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e8f90614ffc565b60405180910390fd5b612ea58383836001613375565b612eb0600082612c1b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f009190615518565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f579190615437565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000818361301e9190615437565b905092915050565b61304082826040518060200160405280600081525061349f565b5050565b600081836130529190615518565b905092915050565b6000818361306891906154be565b905092915050565b61307b848484612db2565b613087848484846134fa565b6130c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130bd90614f3c565b60405180910390fd5b50505050565b6060601680546130db90615602565b80601f016020809104026020016040519081016040528092919081815260200182805461310790615602565b80156131545780601f1061312957610100808354040283529160200191613154565b820191906000526020600020905b81548152906001019060200180831161313757829003601f168201915b5050505050905090565b606060008214156131a6576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613306565b600082905060005b600082146131d85780806131c190615634565b915050600a826131d1919061548d565b91506131ae565b60008167ffffffffffffffff81111561321a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561324c5781602001600182028036833780820191505090505b5090505b600085146132ff576001826132659190615518565b9150600a85613274919061567d565b60306132809190615437565b60f81b8183815181106132bc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856132f8919061548d565b9450613250565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61338184848484613691565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156133c4576133bf82613697565b613403565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146134025761340184836136e0565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614801561343c5750805b1561344f5761344a8261384d565b613499565b8373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156134885750805b15613498576134978383613990565b5b5b50505050565b6134a98383613a0f565b6134b660008484846134fa565b6134f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ec90614f3c565b60405180910390fd5b505050565b600061351b8473ffffffffffffffffffffffffffffffffffffffff16613bdf565b15613684578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613544612c13565b8786866040518563ffffffff1660e01b81526004016135669493929190614e3c565b602060405180830381600087803b15801561358057600080fd5b505af19250505080156135b157506040513d601f19601f820116820180604052508101906135ae9190614116565b60015b613634573d80600081146135e1576040519150601f19603f3d011682016040523d82523d6000602084013e6135e6565b606091505b5060008151141561362c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161362390614f3c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613689565b600190505b949350505050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016136ed846116c7565b6136f79190615518565b90506000600760008481526020019081526020016000205490508181146137dc576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506138619190615518565b90506000600960008481526020019081526020016000205490506000600883815481106138b7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106138ff577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613974577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061399b836116c7565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613a7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a769061517c565b60405180910390fd5b613a8881612ba7565b15613ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613abf90614f7c565b60405180910390fd5b613ad6600083836001613375565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613b269190615437565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054613bfe90615602565b90600052602060002090601f016020900481019282613c205760008555613c67565b82601f10613c3957805160ff1916838001178555613c67565b82800160010185558215613c67579182015b82811115613c66578251825591602001919060010190613c4b565b5b509050613c749190613c78565b5090565b5b80821115613c91576000816000905550600101613c79565b5090565b6000613ca8613ca384615368565b615337565b90508083825260208201905082856020860282011115613cc757600080fd5b60005b85811015613cf75781613cdd8882613d7d565b845260208401935060208301925050600181019050613cca565b5050509392505050565b6000613d14613d0f84615394565b615337565b905082815260208101848484011115613d2c57600080fd5b613d378482856155c0565b509392505050565b6000613d52613d4d846153c4565b615337565b905082815260208101848484011115613d6a57600080fd5b613d758482856155c0565b509392505050565b600081359050613d8c8161577b565b92915050565b600081519050613da18161577b565b92915050565b600082601f830112613db857600080fd5b8135613dc8848260208601613c95565b91505092915050565b600081359050613de081615792565b92915050565b600081359050613df5816157a9565b92915050565b600081519050613e0a816157a9565b92915050565b600082601f830112613e2157600080fd5b8135613e31848260208601613d01565b91505092915050565b600082601f830112613e4b57600080fd5b8135613e5b848260208601613d3f565b91505092915050565b600081359050613e73816157c0565b92915050565b600060208284031215613e8b57600080fd5b6000613e9984828501613d7d565b91505092915050565b600060208284031215613eb457600080fd5b6000613ec284828501613d92565b91505092915050565b60008060408385031215613ede57600080fd5b6000613eec85828601613d7d565b9250506020613efd85828601613d7d565b9150509250929050565b600080600060608486031215613f1c57600080fd5b6000613f2a86828701613d7d565b9350506020613f3b86828701613d7d565b9250506040613f4c86828701613e64565b9150509250925092565b60008060008060808587031215613f6c57600080fd5b6000613f7a87828801613d7d565b9450506020613f8b87828801613d7d565b9350506040613f9c87828801613e64565b925050606085013567ffffffffffffffff811115613fb957600080fd5b613fc587828801613e10565b91505092959194509250565b60008060408385031215613fe457600080fd5b6000613ff285828601613d7d565b925050602061400385828601613dd1565b9150509250929050565b6000806040838503121561402057600080fd5b600061402e85828601613d7d565b925050602061403f85828601613e64565b9150509250929050565b6000806000806080858703121561405f57600080fd5b600061406d87828801613d7d565b945050602061407e87828801613e64565b935050604061408f87828801613e64565b92505060606140a087828801613e64565b91505092959194509250565b6000602082840312156140be57600080fd5b600082013567ffffffffffffffff8111156140d857600080fd5b6140e484828501613da7565b91505092915050565b6000602082840312156140ff57600080fd5b600061410d84828501613de6565b91505092915050565b60006020828403121561412857600080fd5b600061413684828501613dfb565b91505092915050565b60006020828403121561415157600080fd5b600082013567ffffffffffffffff81111561416b57600080fd5b61417784828501613e3a565b91505092915050565b60006020828403121561419257600080fd5b60006141a084828501613e64565b91505092915050565b6141b28161554c565b82525050565b6141c18161555e565b82525050565b60006141d2826153f4565b6141dc818561540a565b93506141ec8185602086016155cf565b6141f58161576a565b840191505092915050565b600061420b826153ff565b614215818561541b565b93506142258185602086016155cf565b61422e8161576a565b840191505092915050565b6000614244826153ff565b61424e818561542c565b935061425e8185602086016155cf565b80840191505092915050565b600061427760148361541b565b91507f546f6b656e20616c7265616479206d696e7465640000000000000000000000006000830152602082019050919050565b60006142b7602b8361541b565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b600061431d60328361541b565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061438360268361541b565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006143e9601c8361541b565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b600061442960208361541b565b91507f4e6f7420656e6f7567682072657365727665206c65667420666f72207465616d6000830152602082019050919050565b600061446960238361541b565b91507f436f6d706f7365206973206e6f742061637469766520617420746865206d6f6d60008301527f656e7400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006144cf601b8361541b565b91507f596f7520646f206e6f742068617665207468697320776561706f6e00000000006000830152602082019050919050565b600061450f60248361541b565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061457560198361541b565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006145b5601f8361541b565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b60006145f560358361541b565b91507f4d757374206f776e20746865205465787420666f72207265717565737465642060008301527f746f6b656e496420746f206d696e7420612050465000000000000000000000006020830152604082019050919050565b600061465b602c8361541b565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006146c160218361541b565b91507f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d60008301527f65000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061472760278361541b565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f6620504650000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061478d601d8361541b565b91507f5374617274696e6720696e64657820697320616c7265616479207365740000006000830152602082019050919050565b60006147cd60258361541b565b91507f52657175657374656420746f6b656e496420657863656564732075707065722060008301527f626f756e640000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061483360388361541b565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614899602a8361541b565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006148ff60298361541b565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061496560208361541b565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006149a5602c8361541b565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614a0b60208361541b565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614a4b60298361541b565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614ab1602f8361541b565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614b1760218361541b565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614b7d60318361541b565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614be360218361541b565b91507f53616c65206d7573742062652061637469766520746f206d696e74206120504660008301527f50000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614c49602c8361541b565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000614caf60298361541b565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f66207a616c657300000000000000000000000000000000000000000000006020830152604082019050919050565b6000614d1560238361541b565b91507f494420776f756c6420657863656564206d617820737570706c79206f6620686560008301527f726f7300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614d7b601f8361541b565b91507f53616c65206d7573742062652061637469766520746f206d696e7420504650006000830152602082019050919050565b6000614dbb60188361541b565b91507f596f7520646f206e6f74206861766520746869732050465000000000000000006000830152602082019050919050565b614df7816155b6565b82525050565b6000614e098285614239565b9150614e158284614239565b91508190509392505050565b6000602082019050614e3660008301846141a9565b92915050565b6000608082019050614e5160008301876141a9565b614e5e60208301866141a9565b614e6b6040830185614dee565b8181036060830152614e7d81846141c7565b905095945050505050565b6000606082019050614e9d60008301866141a9565b614eaa6020830185614dee565b614eb76040830184614dee565b949350505050565b6000602082019050614ed460008301846141b8565b92915050565b60006020820190508181036000830152614ef48184614200565b905092915050565b60006020820190508181036000830152614f158161426a565b9050919050565b60006020820190508181036000830152614f35816142aa565b9050919050565b60006020820190508181036000830152614f5581614310565b9050919050565b60006020820190508181036000830152614f7581614376565b9050919050565b60006020820190508181036000830152614f95816143dc565b9050919050565b60006020820190508181036000830152614fb58161441c565b9050919050565b60006020820190508181036000830152614fd58161445c565b9050919050565b60006020820190508181036000830152614ff5816144c2565b9050919050565b6000602082019050818103600083015261501581614502565b9050919050565b6000602082019050818103600083015261503581614568565b9050919050565b60006020820190508181036000830152615055816145a8565b9050919050565b60006020820190508181036000830152615075816145e8565b9050919050565b600060208201905081810360008301526150958161464e565b9050919050565b600060208201905081810360008301526150b5816146b4565b9050919050565b600060208201905081810360008301526150d58161471a565b9050919050565b600060208201905081810360008301526150f581614780565b9050919050565b60006020820190508181036000830152615115816147c0565b9050919050565b6000602082019050818103600083015261513581614826565b9050919050565b600060208201905081810360008301526151558161488c565b9050919050565b60006020820190508181036000830152615175816148f2565b9050919050565b6000602082019050818103600083015261519581614958565b9050919050565b600060208201905081810360008301526151b581614998565b9050919050565b600060208201905081810360008301526151d5816149fe565b9050919050565b600060208201905081810360008301526151f581614a3e565b9050919050565b6000602082019050818103600083015261521581614aa4565b9050919050565b6000602082019050818103600083015261523581614b0a565b9050919050565b6000602082019050818103600083015261525581614b70565b9050919050565b6000602082019050818103600083015261527581614bd6565b9050919050565b6000602082019050818103600083015261529581614c3c565b9050919050565b600060208201905081810360008301526152b581614ca2565b9050919050565b600060208201905081810360008301526152d581614d08565b9050919050565b600060208201905081810360008301526152f581614d6e565b9050919050565b6000602082019050818103600083015261531581614dae565b9050919050565b60006020820190506153316000830184614dee565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561535e5761535d61573b565b5b8060405250919050565b600067ffffffffffffffff8211156153835761538261573b565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156153af576153ae61573b565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156153df576153de61573b565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000615442826155b6565b915061544d836155b6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615482576154816156ae565b5b828201905092915050565b6000615498826155b6565b91506154a3836155b6565b9250826154b3576154b26156dd565b5b828204905092915050565b60006154c9826155b6565b91506154d4836155b6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561550d5761550c6156ae565b5b828202905092915050565b6000615523826155b6565b915061552e836155b6565b925082821015615541576155406156ae565b5b828203905092915050565b600061555782615596565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156155ed5780820151818401526020810190506155d2565b838111156155fc576000848401525b50505050565b6000600282049050600182168061561a57607f821691505b6020821081141561562e5761562d61570c565b5b50919050565b600061563f826155b6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615672576156716156ae565b5b600182019050919050565b6000615688826155b6565b9150615693836155b6565b9250826156a3576156a26156dd565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6157848161554c565b811461578f57600080fd5b50565b61579b8161555e565b81146157a657600080fd5b50565b6157b28161556a565b81146157bd57600080fd5b50565b6157c9816155b6565b81146157d457600080fd5b5056fea26469706673582212207e0591a194e5cbea70014f3a5f0cf8f680349178cd37440e2d5372bc4aa1691664736f6c63430008000033

Deployed Bytecode Sourcemap

49873:6357:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43078:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50094:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31000:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32452:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31989:397;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50308:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54703:210;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43727:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50519:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33342:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51786:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43395:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50143:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51044:89;;;;;;;;;;;;;:::i;:::-;;52145:140;;;;;;;;;;;;;:::i;:::-;;33718:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54079:616;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50692:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51887:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43917:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55317:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30694:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50031:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30424:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28260:148;;;;;;;;;;;;;:::i;:::-;;52291:498;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54923:182;;;;;;;;;;;;;:::i;:::-;;52795:720;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27609:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31169:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32745:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53525:546;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51357:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50266:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33940:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50394:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50350:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55434:793;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50442:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50182:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51491:190;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50477:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52031:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33111:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51251:98;;;;;;;;;;;;;:::i;:::-;;50227:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50907:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51145:98;;;;;;;;;;;;;:::i;:::-;;28563:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51689:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43078:233;43180:4;43219:35;43204:50;;;:11;:50;;;;:99;;;;43267:36;43291:11;43267:23;:36::i;:::-;43204:99;43197:106;;43078:233;;;:::o;50094:42::-;50134:2;50094:42;:::o;31000:100::-;31054:13;31087:5;31080:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31000:100;:::o;32452:221::-;32528:7;32556:16;32564:7;32556;:16::i;:::-;32548:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32641:15;:24;32657:7;32641:24;;;;;;;;;;;;;;;;;;;;;32634:31;;32452:221;;;:::o;31989:397::-;32070:13;32086:23;32101:7;32086:14;:23::i;:::-;32070:39;;32134:5;32128:11;;:2;:11;;;;32120:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;32214:5;32198:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;32223:37;32240:5;32247:12;:10;:12::i;:::-;32223:16;:37::i;:::-;32198:62;32190:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;32357:21;32366:2;32370:7;32357:8;:21::i;:::-;31989:397;;;:::o;50308:28::-;;;;:::o;54703:210::-;54768:7;54807:13;:11;:13::i;:::-;54795:8;:25;;54787:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;54878:16;:26;54895:8;54878:26;;;;;;;;;;;;54871:33;;54703:210;;;:::o;43727:113::-;43788:7;43815:10;:17;;;;43808:24;;43727:113;:::o;50519:35::-;;;;;;;;;;;;;:::o;33342:305::-;33503:41;33522:12;:10;:12::i;:::-;33536:7;33503:18;:41::i;:::-;33495:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;33611:28;33621:4;33627:2;33631:7;33611:9;:28::i;:::-;33342:305;;;:::o;51786:93::-;27840:12;:10;:12::i;:::-;27829:23;;:7;:5;:7::i;:::-;:23;;;27821:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51864:7:::1;51851:10;:20;;;;51786:93:::0;:::o;43395:256::-;43492:7;43528:23;43545:5;43528:16;:23::i;:::-;43520:5;:31;43512:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;43617:12;:19;43630:5;43617:19;;;;;;;;;;;;;;;:26;43637:5;43617:26;;;;;;;;;;;;43610:33;;43395:256;;;;:::o;50143:32::-;;;;:::o;51044:89::-;27840:12;:10;:12::i;:::-;27829:23;;:7;:5;:7::i;:::-;:23;;;27821:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51113:12:::1;;;;;;;;;;;51112:13;51097:12;;:28;;;;;;;;;;;;;;;;;;51044:89::o:0;52145:140::-;27840:12;:10;:12::i;:::-;27829:23;;:7;:5;:7::i;:::-;:23;;;27821:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52193:12:::1;52208:21;52193:36;;52248:10;52240:28;;:37;52269:7;52240:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;27900:1;52145:140::o:0;33718:151::-;33822:39;33839:4;33845:2;33849:7;33822:39;;;;;;;;;;;;:16;:39::i;:::-;33718:151;;;:::o;54079:616::-;54196:4;54221:15;;;;;;;;;;;54213:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;54325:5;54295:35;;:26;54310:10;54295:14;:26::i;:::-;:35;;;54287:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;54370:19;54402:21;;;;;;;;;;;54370:54;;54493:5;54457:41;;:9;:17;;;54475:13;54457:32;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;;54449:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;54572:13;54541:16;:28;54558:10;54541:28;;;;;;;;;;;:44;;;;54601:64;54627:10;54639;54651:13;54601:64;;;;;;;;:::i;:::-;;;;;;;;54683:4;54676:11;;;54079:616;;;;;;:::o;50692:48::-;;;;;;;;;;;;;;;;;:::o;51887:134::-;27840:12;:10;:12::i;:::-;27829:23;;:7;:5;:7::i;:::-;:23;;;27821:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51998:15:::1;51974:21;;:39;;;;;;;;;;;;;;;;;;51887:134:::0;:::o;43917:233::-;43992:7;44028:30;:28;:30::i;:::-;44020:5;:38;44012:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;44125:10;44136:5;44125:17;;;;;;;;;;;;;;;;;;;;;;;;44118:24;;43917:233;;;:::o;55317:109::-;27840:12;:10;:12::i;:::-;27829:23;;:7;:5;:7::i;:::-;:23;;;27821:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55410:8:::1;55391:16;:27;;;;;;;;;;;;:::i;:::-;;55317:109:::0;:::o;30694:239::-;30766:7;30786:13;30802:7;:16;30810:7;30802:16;;;;;;;;;;;;;;;;;;;;;30786:32;;30854:1;30837:19;;:5;:19;;;;30829:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30920:5;30913:12;;;30694:239;;;:::o;50031:44::-;;;;:::o;30424:208::-;30496:7;30541:1;30524:19;;:5;:19;;;;30516:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;30608:9;:16;30618:5;30608:16;;;;;;;;;;;;;;;;30601:23;;30424:208;;;:::o;28260:148::-;27840:12;:10;:12::i;:::-;27829:23;;:7;:5;:7::i;:::-;:23;;;27821:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28367:1:::1;28330:40;;28351:6;;;;;;;;;;;28330:40;;;;;;;;;;;;28398:1;28381:6;;:19;;;;;;;;;;;;;;;;;;28260:148::o:0;52291:498::-;27840:12;:10;:12::i;:::-;27829:23;;:7;:5;:7::i;:::-;:23;;;27821:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52372:11:::1;52404:13;:11;:13::i;:::-;52386:14;;:31;;;;:::i;:::-;52372:45;;52449:1;52432:14;:18;:50;;;;;52472:10;;52454:14;:28;;52432:50;52424:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;52586:10;;52534:48;52567:14;;52552;:29;;;;:::i;:::-;52534:13;:11;:13::i;:::-;:17;;:48;;;;:::i;:::-;:62;;52526:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;52654:6;52649:85;52670:14;52666:1;:18;52649:85;;;52700:26;52710:3;52724:1;52715:6;:10;;;;:::i;:::-;52700:9;:26::i;:::-;52686:3;;;;;:::i;:::-;;;;52649:85;;;;52753:30;52768:14;52753:10;;:14;;:30;;;;:::i;:::-;52740:10;:43;;;;27900:1;52291:498:::0;;:::o;54923:182::-;27840:12;:10;:12::i;:::-;27829:23;;:7;:5;:7::i;:::-;:23;;;27821:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55018:1:::1;55001:13;;:18;54993:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;55085:12;55064:18;:33;;;;54923:182::o:0;52795:720::-;52870:12;;;;;;;;;;;:31;;;;52886:15;;;;;;;;;;;52870:31;52862:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;52973:1;52956:14;:18;:56;;;;;50134:2;52978:14;:34;;52956:56;52948:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;53123:10;;53069:50;53104:14;;53087;:31;;;;:::i;:::-;53069:13;:11;:13::i;:::-;:17;;:50;;;;:::i;:::-;:64;;53061:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;53209:29;53223:14;53209:9;;:13;;:29;;;;:::i;:::-;53196:9;:42;;53188:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;53296:6;53291:215;53312:14;53308:1;:18;53291:215;;;53346:14;53380:13;:11;:13::i;:::-;53363:14;;:30;;;;:::i;:::-;53346:47;;53422:10;;53410:9;:22;53406:89;;;53449:32;53459:10;53471:9;53449;:32::i;:::-;53406:89;53291:215;53328:3;;;;;:::i;:::-;;;;53291:215;;;;52795:720;:::o;27609:87::-;27655:7;27682:6;;;;;;;;;;;27675:13;;27609:87;:::o;31169:104::-;31225:13;31258:7;31251:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31169:104;:::o;32745:295::-;32860:12;:10;:12::i;:::-;32848:24;;:8;:24;;;;32840:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;32960:8;32915:18;:32;32934:12;:10;:12::i;:::-;32915:32;;;;;;;;;;;;;;;:42;32948:8;32915:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;33013:8;32984:48;;32999:12;:10;:12::i;:::-;32984:48;;;33023:8;32984:48;;;;;;:::i;:::-;;;;;;;;32745:295;;:::o;53525:546::-;53587:12;;;;;;;;;;;53579:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;53668:10;;53652:13;:11;:13::i;:::-;:26;53644:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;53747:10;;53737:7;:20;53729:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;53814:15;53840:19;;;;;;;;;;;53814:46;;53903:10;53875:38;;:7;:15;;;53891:7;53875:24;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:38;;;53867:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;53987:16;53995:7;53987;:16::i;:::-;53986:17;53978:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;54035:30;54045:10;54057:7;54035:9;:30::i;:::-;53525:546;;:::o;51357:126::-;51434:4;51457:9;:18;51467:7;51457:18;;;;;;;;;;;;;;;;;;;;;;;;;51450:25;;51357:126;;;:::o;50266:35::-;;;;;;;;;;;;;:::o;33940:285::-;34072:41;34091:12;:10;:12::i;:::-;34105:7;34072:18;:41::i;:::-;34064:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;34178:39;34192:4;34198:2;34202:7;34211:5;34178:13;:39::i;:::-;33940:285;;;;:::o;50394:35::-;;;;;;;;;;;;;:::o;50350:37::-;;;;;;;;;;;;;:::o;55434:793::-;55507:13;55541:16;55549:7;55541;:16::i;:::-;55533:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;55622:23;55648:10;:19;55659:7;55648:19;;;;;;;;;;;55622:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55678:18;55699:10;:8;:10::i;:::-;55678:31;;55807:1;55791:4;55785:18;:23;55781:72;;;55832:9;55825:16;;;;;;55781:72;55983:1;55963:9;55957:23;:27;55953:108;;;56032:4;56038:9;56015:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56001:48;;;;;;55953:108;56193:4;56199:18;:7;:16;:18::i;:::-;56176:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56162:57;;;;55434:793;;;;:::o;50442:28::-;;;;:::o;50182:36::-;;;;:::o;51491:190::-;27840:12;:10;:12::i;:::-;27829:23;;:7;:5;:7::i;:::-;:23;;;27821:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51580:6:::1;51576:98;51596:8;:15;51592:1;:19;51576:98;;;51658:4;51633:9;:22;51643:8;51652:1;51643:11;;;;;;;;;;;;;;;;;;;;;;51633:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;51613:3;;;;;:::i;:::-;;;;51576:98;;;;51491:190:::0;:::o;50477:33::-;;;;:::o;52031:108::-;27840:12;:10;:12::i;:::-;27829:23;;:7;:5;:7::i;:::-;:23;;;27821:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52120:13:::1;52103:14;:30;;;;52031:108:::0;:::o;33111:164::-;33208:4;33232:18;:25;33251:5;33232:25;;;;;;;;;;;;;;;:35;33258:8;33232:35;;;;;;;;;;;;;;;;;;;;;;;;;33225:42;;33111:164;;;;:::o;51251:98::-;27840:12;:10;:12::i;:::-;27829:23;;:7;:5;:7::i;:::-;:23;;;27821:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51326:15:::1;;;;;;;;;;;51325:16;51307:15;;:34;;;;;;;;;;;;;;;;;;51251:98::o:0;50227:32::-;;;;;;;;;;;;;:::o;50907:129::-;27840:12;:10;:12::i;:::-;27829:23;;:7;:5;:7::i;:::-;:23;;;27821:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51013:15:::1;50991:19;;:37;;;;;;;;;;;;;;;;;;50907:129:::0;:::o;51145:98::-;27840:12;:10;:12::i;:::-;27829:23;;:7;:5;:7::i;:::-;:23;;;27821:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51220:15:::1;;;;;;;;;;;51219:16;51201:15;;:34;;;;;;;;;;;;;;;;;;51145:98::o:0;28563:244::-;27840:12;:10;:12::i;:::-;27829:23;;:7;:5;:7::i;:::-;:23;;;27821:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28672:1:::1;28652:22;;:8;:22;;;;28644:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28762:8;28733:38;;28754:6;;;;;;;;;;;28733:38;;;;;;;;;;;;28791:8;28782:6;;:17;;;;;;;;;;;;;;;;;;28563:244:::0;:::o;51689:89::-;27840:12;:10;:12::i;:::-;27829:23;;:7;:5;:7::i;:::-;:23;;;27821:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51765:5:::1;51753:9;:17;;;;51689:89:::0;:::o;30076:284::-;30178:4;30217:25;30202:40;;;:11;:40;;;;:101;;;;30270:33;30255:48;;;:11;:48;;;;30202:101;:150;;;;30316:36;30340:11;30316:23;:36::i;:::-;30202:150;30195:157;;30076:284;;;:::o;35692:127::-;35757:4;35809:1;35781:30;;:7;:16;35789:7;35781:16;;;;;;;;;;;;;;;;;;;;;:30;;;;35774:37;;35692:127;;;:::o;26226:98::-;26279:7;26306:10;26299:17;;26226:98;:::o;39931:174::-;40033:2;40006:15;:24;40022:7;40006:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;40089:7;40085:2;40051:46;;40060:23;40075:7;40060:14;:23::i;:::-;40051:46;;;;;;;;;;;;39931:174;;:::o;35986:348::-;36079:4;36104:16;36112:7;36104;:16::i;:::-;36096:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36180:13;36196:23;36211:7;36196:14;:23::i;:::-;36180:39;;36249:5;36238:16;;:7;:16;;;:51;;;;36282:7;36258:31;;:20;36270:7;36258:11;:20::i;:::-;:31;;;36238:51;:87;;;;36293:32;36310:5;36317:7;36293:16;:32::i;:::-;36238:87;36230:96;;;35986:348;;;;:::o;39263:550::-;39388:4;39361:31;;:23;39376:7;39361:14;:23::i;:::-;:31;;;39353:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;39471:1;39457:16;;:2;:16;;;;39449:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;39527:45;39548:4;39554:2;39558:7;39567:4;39527:20;:45::i;:::-;39637:29;39654:1;39658:7;39637:8;:29::i;:::-;39698:1;39679:9;:15;39689:4;39679:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;39727:1;39710:9;:13;39720:2;39710:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39758:2;39739:7;:16;39747:7;39739:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39797:7;39793:2;39778:27;;39787:4;39778:27;;;;;;;;;;;;39263:550;;;:::o;2730:98::-;2788:7;2819:1;2815;:5;;;;:::i;:::-;2808:12;;2730:98;;;;:::o;36676:110::-;36752:26;36762:2;36766:7;36752:26;;;;;;;;;;;;:9;:26::i;:::-;36676:110;;:::o;3111:98::-;3169:7;3200:1;3196;:5;;;;:::i;:::-;3189:12;;3111:98;;;;:::o;3468:::-;3526:7;3557:1;3553;:5;;;;:::i;:::-;3546:12;;3468:98;;;;:::o;35107:272::-;35221:28;35231:4;35237:2;35241:7;35221:9;:28::i;:::-;35268:48;35291:4;35297:2;35301:7;35310:5;35268:22;:48::i;:::-;35260:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;35107:272;;;;:::o;55113:117::-;55173:13;55206:16;55199:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55113:117;:::o;7223:723::-;7279:13;7509:1;7500:5;:10;7496:53;;;7527:10;;;;;;;;;;;;;;;;;;;;;7496:53;7559:12;7574:5;7559:20;;7590:14;7615:78;7630:1;7622:4;:9;7615:78;;7648:8;;;;;:::i;:::-;;;;7679:2;7671:10;;;;;:::i;:::-;;;7615:78;;;7703:19;7735:6;7725:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7703:39;;7753:154;7769:1;7760:5;:10;7753:154;;7797:1;7787:11;;;;;:::i;:::-;;;7864:2;7856:5;:10;;;;:::i;:::-;7843:2;:24;;;;:::i;:::-;7830:39;;7813:6;7820;7813:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;7893:2;7884:11;;;;;:::i;:::-;;;7753:154;;;7931:6;7917:21;;;;;7223:723;;;;:::o;19299:157::-;19384:4;19423:25;19408:40;;;:11;:40;;;;19401:47;;19299:157;;;:::o;44763:604::-;44888:55;44915:4;44921:2;44925:7;44934:8;44888:26;:55::i;:::-;44976:1;44960:18;;:4;:18;;;44956:187;;;44995:40;45027:7;44995:31;:40::i;:::-;44956:187;;;45065:2;45057:10;;:4;:10;;;45053:90;;45084:47;45117:4;45123:7;45084:32;:47::i;:::-;45053:90;44956:187;45171:1;45157:16;;:2;:16;;;:28;;;;;45177:8;45157:28;45153:207;;;45202:45;45239:7;45202:36;:45::i;:::-;45153:207;;;45275:4;45269:10;;:2;:10;;;;:22;;;;;45283:8;45269:22;45265:95;;;45308:40;45336:2;45340:7;45308:27;:40::i;:::-;45265:95;45153:207;44763:604;;;;:::o;37013:250::-;37109:18;37115:2;37119:7;37109:5;:18::i;:::-;37146:54;37177:1;37181:2;37185:7;37194:5;37146:22;:54::i;:::-;37138:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;37013:250;;;:::o;40670:839::-;40787:4;40813:15;:2;:13;;;:15::i;:::-;40809:693;;;40865:2;40849:36;;;40886:12;:10;:12::i;:::-;40900:4;40906:7;40915:5;40849:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40845:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41112:1;41095:6;:13;:18;41091:341;;;41138:60;;;;;;;;;;:::i;:::-;;;;;;;;41091:341;41382:6;41376:13;41367:6;41363:2;41359:15;41352:38;40845:602;40982:45;;;40972:55;;;:6;:55;;;;40965:62;;;;;40809:693;41486:4;41479:11;;40670:839;;;;;;;:::o;42122:108::-;;;;;:::o;46090:164::-;46194:10;:17;;;;46167:15;:24;46183:7;46167:24;;;;;;;;;;;:44;;;;46222:10;46238:7;46222:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46090:164;:::o;46881:988::-;47147:22;47197:1;47172:22;47189:4;47172:16;:22::i;:::-;:26;;;;:::i;:::-;47147:51;;47209:18;47230:17;:26;47248:7;47230:26;;;;;;;;;;;;47209:47;;47377:14;47363:10;:28;47359:328;;47408:19;47430:12;:18;47443:4;47430:18;;;;;;;;;;;;;;;:34;47449:14;47430:34;;;;;;;;;;;;47408:56;;47514:11;47481:12;:18;47494:4;47481:18;;;;;;;;;;;;;;;:30;47500:10;47481:30;;;;;;;;;;;:44;;;;47631:10;47598:17;:30;47616:11;47598:30;;;;;;;;;;;:43;;;;47359:328;;47783:17;:26;47801:7;47783:26;;;;;;;;;;;47776:33;;;47827:12;:18;47840:4;47827:18;;;;;;;;;;;;;;;:34;47846:14;47827:34;;;;;;;;;;;47820:41;;;46881:988;;;;:::o;48164:1079::-;48417:22;48462:1;48442:10;:17;;;;:21;;;;:::i;:::-;48417:46;;48474:18;48495:15;:24;48511:7;48495:24;;;;;;;;;;;;48474:45;;48846:19;48868:10;48879:14;48868:26;;;;;;;;;;;;;;;;;;;;;;;;48846:48;;48932:11;48907:10;48918;48907:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;49043:10;49012:15;:28;49028:11;49012:28;;;;;;;;;;;:41;;;;49184:15;:24;49200:7;49184:24;;;;;;;;;;;49177:31;;;49219:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48164:1079;;;;:::o;45668:221::-;45753:14;45770:20;45787:2;45770:16;:20::i;:::-;45753:37;;45828:7;45801:12;:16;45814:2;45801:16;;;;;;;;;;;;;;;:24;45818:6;45801:24;;;;;;;;;;;:34;;;;45875:6;45846:17;:26;45864:7;45846:26;;;;;;;;;;;:35;;;;45668:221;;;:::o;37599:388::-;37693:1;37679:16;;:2;:16;;;;37671:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;37752:16;37760:7;37752;:16::i;:::-;37751:17;37743:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;37814:51;37843:1;37847:2;37851:7;37860:4;37814:20;:51::i;:::-;37895:1;37878:9;:13;37888:2;37878:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;37926:2;37907:7;:16;37915:7;37907:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;37971:7;37967:2;37946:33;;37963:1;37946:33;;;;;;;;;;;;37599:388;;:::o;9688:422::-;9748:4;9956:12;10067:7;10055:20;10047:28;;10101:1;10094:4;:8;10087:15;;;9688:422;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:622:1:-;;145:80;160:64;217:6;160:64;:::i;:::-;145:80;:::i;:::-;136:89;;245:5;273:6;266:5;259:21;299:4;292:5;288:16;281:23;;324:6;374:3;366:4;358:6;354:17;349:3;345:27;342:36;339:2;;;391:1;388;381:12;339:2;419:1;404:236;429:6;426:1;423:13;404:236;;;496:3;524:37;557:3;545:10;524:37;:::i;:::-;519:3;512:50;591:4;586:3;582:14;575:21;;625:4;620:3;616:14;609:21;;464:176;451:1;448;444:9;439:14;;404:236;;;408:14;126:520;;;;;;;:::o;652:342::-;;754:64;769:48;810:6;769:48;:::i;:::-;754:64;:::i;:::-;745:73;;841:6;834:5;827:21;879:4;872:5;868:16;917:3;908:6;903:3;899:16;896:25;893:2;;;934:1;931;924:12;893:2;947:41;981:6;976:3;971;947:41;:::i;:::-;735:259;;;;;;:::o;1000:344::-;;1103:65;1118:49;1160:6;1118:49;:::i;:::-;1103:65;:::i;:::-;1094:74;;1191:6;1184:5;1177:21;1229:4;1222:5;1218:16;1267:3;1258:6;1253:3;1249:16;1246:25;1243:2;;;1284:1;1281;1274:12;1243:2;1297:41;1331:6;1326:3;1321;1297:41;:::i;:::-;1084:260;;;;;;:::o;1350:139::-;;1434:6;1421:20;1412:29;;1450:33;1477:5;1450:33;:::i;:::-;1402:87;;;;:::o;1495:143::-;;1583:6;1577:13;1568:22;;1599:33;1626:5;1599:33;:::i;:::-;1558:80;;;;:::o;1661:303::-;;1781:3;1774:4;1766:6;1762:17;1758:27;1748:2;;1799:1;1796;1789:12;1748:2;1839:6;1826:20;1864:94;1954:3;1946:6;1939:4;1931:6;1927:17;1864:94;:::i;:::-;1855:103;;1738:226;;;;;:::o;1970:133::-;;2051:6;2038:20;2029:29;;2067:30;2091:5;2067:30;:::i;:::-;2019:84;;;;:::o;2109:137::-;;2192:6;2179:20;2170:29;;2208:32;2234:5;2208:32;:::i;:::-;2160:86;;;;:::o;2252:141::-;;2339:6;2333:13;2324:22;;2355:32;2381:5;2355:32;:::i;:::-;2314:79;;;;:::o;2412:271::-;;2516:3;2509:4;2501:6;2497:17;2493:27;2483:2;;2534:1;2531;2524:12;2483:2;2574:6;2561:20;2599:78;2673:3;2665:6;2658:4;2650:6;2646:17;2599:78;:::i;:::-;2590:87;;2473:210;;;;;:::o;2703:273::-;;2808:3;2801:4;2793:6;2789:17;2785:27;2775:2;;2826:1;2823;2816:12;2775:2;2866:6;2853:20;2891:79;2966:3;2958:6;2951:4;2943:6;2939:17;2891:79;:::i;:::-;2882:88;;2765:211;;;;;:::o;2982:139::-;;3066:6;3053:20;3044:29;;3082:33;3109:5;3082:33;:::i;:::-;3034:87;;;;:::o;3127:262::-;;3235:2;3223:9;3214:7;3210:23;3206:32;3203:2;;;3251:1;3248;3241:12;3203:2;3294:1;3319:53;3364:7;3355:6;3344:9;3340:22;3319:53;:::i;:::-;3309:63;;3265:117;3193:196;;;;:::o;3395:284::-;;3514:2;3502:9;3493:7;3489:23;3485:32;3482:2;;;3530:1;3527;3520:12;3482:2;3573:1;3598:64;3654:7;3645:6;3634:9;3630:22;3598:64;:::i;:::-;3588:74;;3544:128;3472:207;;;;:::o;3685:407::-;;;3810:2;3798:9;3789:7;3785:23;3781:32;3778:2;;;3826:1;3823;3816:12;3778:2;3869:1;3894:53;3939:7;3930:6;3919:9;3915:22;3894:53;:::i;:::-;3884:63;;3840:117;3996:2;4022:53;4067:7;4058:6;4047:9;4043:22;4022:53;:::i;:::-;4012:63;;3967:118;3768:324;;;;;:::o;4098:552::-;;;;4240:2;4228:9;4219:7;4215:23;4211:32;4208:2;;;4256:1;4253;4246:12;4208:2;4299:1;4324:53;4369:7;4360:6;4349:9;4345:22;4324:53;:::i;:::-;4314:63;;4270:117;4426:2;4452:53;4497:7;4488:6;4477:9;4473:22;4452:53;:::i;:::-;4442:63;;4397:118;4554:2;4580:53;4625:7;4616:6;4605:9;4601:22;4580:53;:::i;:::-;4570:63;;4525:118;4198:452;;;;;:::o;4656:809::-;;;;;4824:3;4812:9;4803:7;4799:23;4795:33;4792:2;;;4841:1;4838;4831:12;4792:2;4884:1;4909:53;4954:7;4945:6;4934:9;4930:22;4909:53;:::i;:::-;4899:63;;4855:117;5011:2;5037:53;5082:7;5073:6;5062:9;5058:22;5037:53;:::i;:::-;5027:63;;4982:118;5139:2;5165:53;5210:7;5201:6;5190:9;5186:22;5165:53;:::i;:::-;5155:63;;5110:118;5295:2;5284:9;5280:18;5267:32;5326:18;5318:6;5315:30;5312:2;;;5358:1;5355;5348:12;5312:2;5386:62;5440:7;5431:6;5420:9;5416:22;5386:62;:::i;:::-;5376:72;;5238:220;4782:683;;;;;;;:::o;5471:401::-;;;5593:2;5581:9;5572:7;5568:23;5564:32;5561:2;;;5609:1;5606;5599:12;5561:2;5652:1;5677:53;5722:7;5713:6;5702:9;5698:22;5677:53;:::i;:::-;5667:63;;5623:117;5779:2;5805:50;5847:7;5838:6;5827:9;5823:22;5805:50;:::i;:::-;5795:60;;5750:115;5551:321;;;;;:::o;5878:407::-;;;6003:2;5991:9;5982:7;5978:23;5974:32;5971:2;;;6019:1;6016;6009:12;5971:2;6062:1;6087:53;6132:7;6123:6;6112:9;6108:22;6087:53;:::i;:::-;6077:63;;6033:117;6189:2;6215:53;6260:7;6251:6;6240:9;6236:22;6215:53;:::i;:::-;6205:63;;6160:118;5961:324;;;;;:::o;6291:698::-;;;;;6450:3;6438:9;6429:7;6425:23;6421:33;6418:2;;;6467:1;6464;6457:12;6418:2;6510:1;6535:53;6580:7;6571:6;6560:9;6556:22;6535:53;:::i;:::-;6525:63;;6481:117;6637:2;6663:53;6708:7;6699:6;6688:9;6684:22;6663:53;:::i;:::-;6653:63;;6608:118;6765:2;6791:53;6836:7;6827:6;6816:9;6812:22;6791:53;:::i;:::-;6781:63;;6736:118;6893:2;6919:53;6964:7;6955:6;6944:9;6940:22;6919:53;:::i;:::-;6909:63;;6864:118;6408:581;;;;;;;:::o;6995:405::-;;7128:2;7116:9;7107:7;7103:23;7099:32;7096:2;;;7144:1;7141;7134:12;7096:2;7215:1;7204:9;7200:17;7187:31;7245:18;7237:6;7234:30;7231:2;;;7277:1;7274;7267:12;7231:2;7305:78;7375:7;7366:6;7355:9;7351:22;7305:78;:::i;:::-;7295:88;;7158:235;7086:314;;;;:::o;7406:260::-;;7513:2;7501:9;7492:7;7488:23;7484:32;7481:2;;;7529:1;7526;7519:12;7481:2;7572:1;7597:52;7641:7;7632:6;7621:9;7617:22;7597:52;:::i;:::-;7587:62;;7543:116;7471:195;;;;:::o;7672:282::-;;7790:2;7778:9;7769:7;7765:23;7761:32;7758:2;;;7806:1;7803;7796:12;7758:2;7849:1;7874:63;7929:7;7920:6;7909:9;7905:22;7874:63;:::i;:::-;7864:73;;7820:127;7748:206;;;;:::o;7960:375::-;;8078:2;8066:9;8057:7;8053:23;8049:32;8046:2;;;8094:1;8091;8084:12;8046:2;8165:1;8154:9;8150:17;8137:31;8195:18;8187:6;8184:30;8181:2;;;8227:1;8224;8217:12;8181:2;8255:63;8310:7;8301:6;8290:9;8286:22;8255:63;:::i;:::-;8245:73;;8108:220;8036:299;;;;:::o;8341:262::-;;8449:2;8437:9;8428:7;8424:23;8420:32;8417:2;;;8465:1;8462;8455:12;8417:2;8508:1;8533:53;8578:7;8569:6;8558:9;8554:22;8533:53;:::i;:::-;8523:63;;8479:117;8407:196;;;;:::o;8609:118::-;8696:24;8714:5;8696:24;:::i;:::-;8691:3;8684:37;8674:53;;:::o;8733:109::-;8814:21;8829:5;8814:21;:::i;:::-;8809:3;8802:34;8792:50;;:::o;8848:360::-;;8962:38;8994:5;8962:38;:::i;:::-;9016:70;9079:6;9074:3;9016:70;:::i;:::-;9009:77;;9095:52;9140:6;9135:3;9128:4;9121:5;9117:16;9095:52;:::i;:::-;9172:29;9194:6;9172:29;:::i;:::-;9167:3;9163:39;9156:46;;8938:270;;;;;:::o;9214:364::-;;9330:39;9363:5;9330:39;:::i;:::-;9385:71;9449:6;9444:3;9385:71;:::i;:::-;9378:78;;9465:52;9510:6;9505:3;9498:4;9491:5;9487:16;9465:52;:::i;:::-;9542:29;9564:6;9542:29;:::i;:::-;9537:3;9533:39;9526:46;;9306:272;;;;;:::o;9584:377::-;;9718:39;9751:5;9718:39;:::i;:::-;9773:89;9855:6;9850:3;9773:89;:::i;:::-;9766:96;;9871:52;9916:6;9911:3;9904:4;9897:5;9893:16;9871:52;:::i;:::-;9948:6;9943:3;9939:16;9932:23;;9694:267;;;;;:::o;9967:318::-;;10130:67;10194:2;10189:3;10130:67;:::i;:::-;10123:74;;10227:22;10223:1;10218:3;10214:11;10207:43;10276:2;10271:3;10267:12;10260:19;;10113:172;;;:::o;10291:375::-;;10454:67;10518:2;10513:3;10454:67;:::i;:::-;10447:74;;10551:34;10547:1;10542:3;10538:11;10531:55;10617:13;10612:2;10607:3;10603:12;10596:35;10657:2;10652:3;10648:12;10641:19;;10437:229;;;:::o;10672:382::-;;10835:67;10899:2;10894:3;10835:67;:::i;:::-;10828:74;;10932:34;10928:1;10923:3;10919:11;10912:55;10998:20;10993:2;10988:3;10984:12;10977:42;11045:2;11040:3;11036:12;11029:19;;10818:236;;;:::o;11060:370::-;;11223:67;11287:2;11282:3;11223:67;:::i;:::-;11216:74;;11320:34;11316:1;11311:3;11307:11;11300:55;11386:8;11381:2;11376:3;11372:12;11365:30;11421:2;11416:3;11412:12;11405:19;;11206:224;;;:::o;11436:326::-;;11599:67;11663:2;11658:3;11599:67;:::i;:::-;11592:74;;11696:30;11692:1;11687:3;11683:11;11676:51;11753:2;11748:3;11744:12;11737:19;;11582:180;;;:::o;11768:330::-;;11931:67;11995:2;11990:3;11931:67;:::i;:::-;11924:74;;12028:34;12024:1;12019:3;12015:11;12008:55;12089:2;12084:3;12080:12;12073:19;;11914:184;;;:::o;12104:367::-;;12267:67;12331:2;12326:3;12267:67;:::i;:::-;12260:74;;12364:34;12360:1;12355:3;12351:11;12344:55;12430:5;12425:2;12420:3;12416:12;12409:27;12462:2;12457:3;12453:12;12446:19;;12250:221;;;:::o;12477:325::-;;12640:67;12704:2;12699:3;12640:67;:::i;:::-;12633:74;;12737:29;12733:1;12728:3;12724:11;12717:50;12793:2;12788:3;12784:12;12777:19;;12623:179;;;:::o;12808:368::-;;12971:67;13035:2;13030:3;12971:67;:::i;:::-;12964:74;;13068:34;13064:1;13059:3;13055:11;13048:55;13134:6;13129:2;13124:3;13120:12;13113:28;13167:2;13162:3;13158:12;13151:19;;12954:222;;;:::o;13182:323::-;;13345:67;13409:2;13404:3;13345:67;:::i;:::-;13338:74;;13442:27;13438:1;13433:3;13429:11;13422:48;13496:2;13491:3;13487:12;13480:19;;13328:177;;;:::o;13511:329::-;;13674:67;13738:2;13733:3;13674:67;:::i;:::-;13667:74;;13771:33;13767:1;13762:3;13758:11;13751:54;13831:2;13826:3;13822:12;13815:19;;13657:183;;;:::o;13846:385::-;;14009:67;14073:2;14068:3;14009:67;:::i;:::-;14002:74;;14106:34;14102:1;14097:3;14093:11;14086:55;14172:23;14167:2;14162:3;14158:12;14151:45;14222:2;14217:3;14213:12;14206:19;;13992:239;;;:::o;14237:376::-;;14400:67;14464:2;14459:3;14400:67;:::i;:::-;14393:74;;14497:34;14493:1;14488:3;14484:11;14477:55;14563:14;14558:2;14553:3;14549:12;14542:36;14604:2;14599:3;14595:12;14588:19;;14383:230;;;:::o;14619:365::-;;14782:67;14846:2;14841:3;14782:67;:::i;:::-;14775:74;;14879:34;14875:1;14870:3;14866:11;14859:55;14945:3;14940:2;14935:3;14931:12;14924:25;14975:2;14970:3;14966:12;14959:19;;14765:219;;;:::o;14990:371::-;;15153:67;15217:2;15212:3;15153:67;:::i;:::-;15146:74;;15250:34;15246:1;15241:3;15237:11;15230:55;15316:9;15311:2;15306:3;15302:12;15295:31;15352:2;15347:3;15343:12;15336:19;;15136:225;;;:::o;15367:327::-;;15530:67;15594:2;15589:3;15530:67;:::i;:::-;15523:74;;15627:31;15623:1;15618:3;15614:11;15607:52;15685:2;15680:3;15676:12;15669:19;;15513:181;;;:::o;15700:369::-;;15863:67;15927:2;15922:3;15863:67;:::i;:::-;15856:74;;15960:34;15956:1;15951:3;15947:11;15940:55;16026:7;16021:2;16016:3;16012:12;16005:29;16060:2;16055:3;16051:12;16044:19;;15846:223;;;:::o;16075:388::-;;16238:67;16302:2;16297:3;16238:67;:::i;:::-;16231:74;;16335:34;16331:1;16326:3;16322:11;16315:55;16401:26;16396:2;16391:3;16387:12;16380:48;16454:2;16449:3;16445:12;16438:19;;16221:242;;;:::o;16469:374::-;;16632:67;16696:2;16691:3;16632:67;:::i;:::-;16625:74;;16729:34;16725:1;16720:3;16716:11;16709:55;16795:12;16790:2;16785:3;16781:12;16774:34;16834:2;16829:3;16825:12;16818:19;;16615:228;;;:::o;16849:373::-;;17012:67;17076:2;17071:3;17012:67;:::i;:::-;17005:74;;17109:34;17105:1;17100:3;17096:11;17089:55;17175:11;17170:2;17165:3;17161:12;17154:33;17213:2;17208:3;17204:12;17197:19;;16995:227;;;:::o;17228:330::-;;17391:67;17455:2;17450:3;17391:67;:::i;:::-;17384:74;;17488:34;17484:1;17479:3;17475:11;17468:55;17549:2;17544:3;17540:12;17533:19;;17374:184;;;:::o;17564:376::-;;17727:67;17791:2;17786:3;17727:67;:::i;:::-;17720:74;;17824:34;17820:1;17815:3;17811:11;17804:55;17890:14;17885:2;17880:3;17876:12;17869:36;17931:2;17926:3;17922:12;17915:19;;17710:230;;;:::o;17946:330::-;;18109:67;18173:2;18168:3;18109:67;:::i;:::-;18102:74;;18206:34;18202:1;18197:3;18193:11;18186:55;18267:2;18262:3;18258:12;18251:19;;18092:184;;;:::o;18282:373::-;;18445:67;18509:2;18504:3;18445:67;:::i;:::-;18438:74;;18542:34;18538:1;18533:3;18529:11;18522:55;18608:11;18603:2;18598:3;18594:12;18587:33;18646:2;18641:3;18637:12;18630:19;;18428:227;;;:::o;18661:379::-;;18824:67;18888:2;18883:3;18824:67;:::i;:::-;18817:74;;18921:34;18917:1;18912:3;18908:11;18901:55;18987:17;18982:2;18977:3;18973:12;18966:39;19031:2;19026:3;19022:12;19015:19;;18807:233;;;:::o;19046:365::-;;19209:67;19273:2;19268:3;19209:67;:::i;:::-;19202:74;;19306:34;19302:1;19297:3;19293:11;19286:55;19372:3;19367:2;19362:3;19358:12;19351:25;19402:2;19397:3;19393:12;19386:19;;19192:219;;;:::o;19417:381::-;;19580:67;19644:2;19639:3;19580:67;:::i;:::-;19573:74;;19677:34;19673:1;19668:3;19664:11;19657:55;19743:19;19738:2;19733:3;19729:12;19722:41;19789:2;19784:3;19780:12;19773:19;;19563:235;;;:::o;19804:365::-;;19967:67;20031:2;20026:3;19967:67;:::i;:::-;19960:74;;20064:34;20060:1;20055:3;20051:11;20044:55;20130:3;20125:2;20120:3;20116:12;20109:25;20160:2;20155:3;20151:12;20144:19;;19950:219;;;:::o;20175:376::-;;20338:67;20402:2;20397:3;20338:67;:::i;:::-;20331:74;;20435:34;20431:1;20426:3;20422:11;20415:55;20501:14;20496:2;20491:3;20487:12;20480:36;20542:2;20537:3;20533:12;20526:19;;20321:230;;;:::o;20557:373::-;;20720:67;20784:2;20779:3;20720:67;:::i;:::-;20713:74;;20817:34;20813:1;20808:3;20804:11;20797:55;20883:11;20878:2;20873:3;20869:12;20862:33;20921:2;20916:3;20912:12;20905:19;;20703:227;;;:::o;20936:367::-;;21099:67;21163:2;21158:3;21099:67;:::i;:::-;21092:74;;21196:34;21192:1;21187:3;21183:11;21176:55;21262:5;21257:2;21252:3;21248:12;21241:27;21294:2;21289:3;21285:12;21278:19;;21082:221;;;:::o;21309:329::-;;21472:67;21536:2;21531:3;21472:67;:::i;:::-;21465:74;;21569:33;21565:1;21560:3;21556:11;21549:54;21629:2;21624:3;21620:12;21613:19;;21455:183;;;:::o;21644:322::-;;21807:67;21871:2;21866:3;21807:67;:::i;:::-;21800:74;;21904:26;21900:1;21895:3;21891:11;21884:47;21957:2;21952:3;21948:12;21941:19;;21790:176;;;:::o;21972:118::-;22059:24;22077:5;22059:24;:::i;:::-;22054:3;22047:37;22037:53;;:::o;22096:435::-;;22298:95;22389:3;22380:6;22298:95;:::i;:::-;22291:102;;22410:95;22501:3;22492:6;22410:95;:::i;:::-;22403:102;;22522:3;22515:10;;22280:251;;;;;:::o;22537:222::-;;22668:2;22657:9;22653:18;22645:26;;22681:71;22749:1;22738:9;22734:17;22725:6;22681:71;:::i;:::-;22635:124;;;;:::o;22765:640::-;;22998:3;22987:9;22983:19;22975:27;;23012:71;23080:1;23069:9;23065:17;23056:6;23012:71;:::i;:::-;23093:72;23161:2;23150:9;23146:18;23137:6;23093:72;:::i;:::-;23175;23243:2;23232:9;23228:18;23219:6;23175:72;:::i;:::-;23294:9;23288:4;23284:20;23279:2;23268:9;23264:18;23257:48;23322:76;23393:4;23384:6;23322:76;:::i;:::-;23314:84;;22965:440;;;;;;;:::o;23411:442::-;;23598:2;23587:9;23583:18;23575:26;;23611:71;23679:1;23668:9;23664:17;23655:6;23611:71;:::i;:::-;23692:72;23760:2;23749:9;23745:18;23736:6;23692:72;:::i;:::-;23774;23842:2;23831:9;23827:18;23818:6;23774:72;:::i;:::-;23565:288;;;;;;:::o;23859:210::-;;23984:2;23973:9;23969:18;23961:26;;23997:65;24059:1;24048:9;24044:17;24035:6;23997:65;:::i;:::-;23951:118;;;;:::o;24075:313::-;;24226:2;24215:9;24211:18;24203:26;;24275:9;24269:4;24265:20;24261:1;24250:9;24246:17;24239:47;24303:78;24376:4;24367:6;24303:78;:::i;:::-;24295:86;;24193:195;;;;:::o;24394:419::-;;24598:2;24587:9;24583:18;24575:26;;24647:9;24641:4;24637:20;24633:1;24622:9;24618:17;24611:47;24675:131;24801:4;24675:131;:::i;:::-;24667:139;;24565:248;;;:::o;24819:419::-;;25023:2;25012:9;25008:18;25000:26;;25072:9;25066:4;25062:20;25058:1;25047:9;25043:17;25036:47;25100:131;25226:4;25100:131;:::i;:::-;25092:139;;24990:248;;;:::o;25244:419::-;;25448:2;25437:9;25433:18;25425:26;;25497:9;25491:4;25487:20;25483:1;25472:9;25468:17;25461:47;25525:131;25651:4;25525:131;:::i;:::-;25517:139;;25415:248;;;:::o;25669:419::-;;25873:2;25862:9;25858:18;25850:26;;25922:9;25916:4;25912:20;25908:1;25897:9;25893:17;25886:47;25950:131;26076:4;25950:131;:::i;:::-;25942:139;;25840:248;;;:::o;26094:419::-;;26298:2;26287:9;26283:18;26275:26;;26347:9;26341:4;26337:20;26333:1;26322:9;26318:17;26311:47;26375:131;26501:4;26375:131;:::i;:::-;26367:139;;26265:248;;;:::o;26519:419::-;;26723:2;26712:9;26708:18;26700:26;;26772:9;26766:4;26762:20;26758:1;26747:9;26743:17;26736:47;26800:131;26926:4;26800:131;:::i;:::-;26792:139;;26690:248;;;:::o;26944:419::-;;27148:2;27137:9;27133:18;27125:26;;27197:9;27191:4;27187:20;27183:1;27172:9;27168:17;27161:47;27225:131;27351:4;27225:131;:::i;:::-;27217:139;;27115:248;;;:::o;27369:419::-;;27573:2;27562:9;27558:18;27550:26;;27622:9;27616:4;27612:20;27608:1;27597:9;27593:17;27586:47;27650:131;27776:4;27650:131;:::i;:::-;27642:139;;27540:248;;;:::o;27794:419::-;;27998:2;27987:9;27983:18;27975:26;;28047:9;28041:4;28037:20;28033:1;28022:9;28018:17;28011:47;28075:131;28201:4;28075:131;:::i;:::-;28067:139;;27965:248;;;:::o;28219:419::-;;28423:2;28412:9;28408:18;28400:26;;28472:9;28466:4;28462:20;28458:1;28447:9;28443:17;28436:47;28500:131;28626:4;28500:131;:::i;:::-;28492:139;;28390:248;;;:::o;28644:419::-;;28848:2;28837:9;28833:18;28825:26;;28897:9;28891:4;28887:20;28883:1;28872:9;28868:17;28861:47;28925:131;29051:4;28925:131;:::i;:::-;28917:139;;28815:248;;;:::o;29069:419::-;;29273:2;29262:9;29258:18;29250:26;;29322:9;29316:4;29312:20;29308:1;29297:9;29293:17;29286:47;29350:131;29476:4;29350:131;:::i;:::-;29342:139;;29240:248;;;:::o;29494:419::-;;29698:2;29687:9;29683:18;29675:26;;29747:9;29741:4;29737:20;29733:1;29722:9;29718:17;29711:47;29775:131;29901:4;29775:131;:::i;:::-;29767:139;;29665:248;;;:::o;29919:419::-;;30123:2;30112:9;30108:18;30100:26;;30172:9;30166:4;30162:20;30158:1;30147:9;30143:17;30136:47;30200:131;30326:4;30200:131;:::i;:::-;30192:139;;30090:248;;;:::o;30344:419::-;;30548:2;30537:9;30533:18;30525:26;;30597:9;30591:4;30587:20;30583:1;30572:9;30568:17;30561:47;30625:131;30751:4;30625:131;:::i;:::-;30617:139;;30515:248;;;:::o;30769:419::-;;30973:2;30962:9;30958:18;30950:26;;31022:9;31016:4;31012:20;31008:1;30997:9;30993:17;30986:47;31050:131;31176:4;31050:131;:::i;:::-;31042:139;;30940:248;;;:::o;31194:419::-;;31398:2;31387:9;31383:18;31375:26;;31447:9;31441:4;31437:20;31433:1;31422:9;31418:17;31411:47;31475:131;31601:4;31475:131;:::i;:::-;31467:139;;31365:248;;;:::o;31619:419::-;;31823:2;31812:9;31808:18;31800:26;;31872:9;31866:4;31862:20;31858:1;31847:9;31843:17;31836:47;31900:131;32026:4;31900:131;:::i;:::-;31892:139;;31790:248;;;:::o;32044:419::-;;32248:2;32237:9;32233:18;32225:26;;32297:9;32291:4;32287:20;32283:1;32272:9;32268:17;32261:47;32325:131;32451:4;32325:131;:::i;:::-;32317:139;;32215:248;;;:::o;32469:419::-;;32673:2;32662:9;32658:18;32650:26;;32722:9;32716:4;32712:20;32708:1;32697:9;32693:17;32686:47;32750:131;32876:4;32750:131;:::i;:::-;32742:139;;32640:248;;;:::o;32894:419::-;;33098:2;33087:9;33083:18;33075:26;;33147:9;33141:4;33137:20;33133:1;33122:9;33118:17;33111:47;33175:131;33301:4;33175:131;:::i;:::-;33167:139;;33065:248;;;:::o;33319:419::-;;33523:2;33512:9;33508:18;33500:26;;33572:9;33566:4;33562:20;33558:1;33547:9;33543:17;33536:47;33600:131;33726:4;33600:131;:::i;:::-;33592:139;;33490:248;;;:::o;33744:419::-;;33948:2;33937:9;33933:18;33925:26;;33997:9;33991:4;33987:20;33983:1;33972:9;33968:17;33961:47;34025:131;34151:4;34025:131;:::i;:::-;34017:139;;33915:248;;;:::o;34169:419::-;;34373:2;34362:9;34358:18;34350:26;;34422:9;34416:4;34412:20;34408:1;34397:9;34393:17;34386:47;34450:131;34576:4;34450:131;:::i;:::-;34442:139;;34340:248;;;:::o;34594:419::-;;34798:2;34787:9;34783:18;34775:26;;34847:9;34841:4;34837:20;34833:1;34822:9;34818:17;34811:47;34875:131;35001:4;34875:131;:::i;:::-;34867:139;;34765:248;;;:::o;35019:419::-;;35223:2;35212:9;35208:18;35200:26;;35272:9;35266:4;35262:20;35258:1;35247:9;35243:17;35236:47;35300:131;35426:4;35300:131;:::i;:::-;35292:139;;35190:248;;;:::o;35444:419::-;;35648:2;35637:9;35633:18;35625:26;;35697:9;35691:4;35687:20;35683:1;35672:9;35668:17;35661:47;35725:131;35851:4;35725:131;:::i;:::-;35717:139;;35615:248;;;:::o;35869:419::-;;36073:2;36062:9;36058:18;36050:26;;36122:9;36116:4;36112:20;36108:1;36097:9;36093:17;36086:47;36150:131;36276:4;36150:131;:::i;:::-;36142:139;;36040:248;;;:::o;36294:419::-;;36498:2;36487:9;36483:18;36475:26;;36547:9;36541:4;36537:20;36533:1;36522:9;36518:17;36511:47;36575:131;36701:4;36575:131;:::i;:::-;36567:139;;36465:248;;;:::o;36719:419::-;;36923:2;36912:9;36908:18;36900:26;;36972:9;36966:4;36962:20;36958:1;36947:9;36943:17;36936:47;37000:131;37126:4;37000:131;:::i;:::-;36992:139;;36890:248;;;:::o;37144:419::-;;37348:2;37337:9;37333:18;37325:26;;37397:9;37391:4;37387:20;37383:1;37372:9;37368:17;37361:47;37425:131;37551:4;37425:131;:::i;:::-;37417:139;;37315:248;;;:::o;37569:419::-;;37773:2;37762:9;37758:18;37750:26;;37822:9;37816:4;37812:20;37808:1;37797:9;37793:17;37786:47;37850:131;37976:4;37850:131;:::i;:::-;37842:139;;37740:248;;;:::o;37994:419::-;;38198:2;38187:9;38183:18;38175:26;;38247:9;38241:4;38237:20;38233:1;38222:9;38218:17;38211:47;38275:131;38401:4;38275:131;:::i;:::-;38267:139;;38165:248;;;:::o;38419:222::-;;38550:2;38539:9;38535:18;38527:26;;38563:71;38631:1;38620:9;38616:17;38607:6;38563:71;:::i;:::-;38517:124;;;;:::o;38647:283::-;;38713:2;38707:9;38697:19;;38755:4;38747:6;38743:17;38862:6;38850:10;38847:22;38826:18;38814:10;38811:34;38808:62;38805:2;;;38873:18;;:::i;:::-;38805:2;38913:10;38909:2;38902:22;38687:243;;;;:::o;38936:311::-;;39103:18;39095:6;39092:30;39089:2;;;39125:18;;:::i;:::-;39089:2;39175:4;39167:6;39163:17;39155:25;;39235:4;39229;39225:15;39217:23;;39018:229;;;:::o;39253:331::-;;39404:18;39396:6;39393:30;39390:2;;;39426:18;;:::i;:::-;39390:2;39511:4;39507:9;39500:4;39492:6;39488:17;39484:33;39476:41;;39572:4;39566;39562:15;39554:23;;39319:265;;;:::o;39590:332::-;;39742:18;39734:6;39731:30;39728:2;;;39764:18;;:::i;:::-;39728:2;39849:4;39845:9;39838:4;39830:6;39826:17;39822:33;39814:41;;39910:4;39904;39900:15;39892:23;;39657:265;;;:::o;39928:98::-;;40013:5;40007:12;39997:22;;39986:40;;;:::o;40032:99::-;;40118:5;40112:12;40102:22;;40091:40;;;:::o;40137:168::-;;40254:6;40249:3;40242:19;40294:4;40289:3;40285:14;40270:29;;40232:73;;;;:::o;40311:169::-;;40429:6;40424:3;40417:19;40469:4;40464:3;40460:14;40445:29;;40407:73;;;;:::o;40486:148::-;;40625:3;40610:18;;40600:34;;;;:::o;40640:305::-;;40699:20;40717:1;40699:20;:::i;:::-;40694:25;;40733:20;40751:1;40733:20;:::i;:::-;40728:25;;40887:1;40819:66;40815:74;40812:1;40809:81;40806:2;;;40893:18;;:::i;:::-;40806:2;40937:1;40934;40930:9;40923:16;;40684:261;;;;:::o;40951:185::-;;41008:20;41026:1;41008:20;:::i;:::-;41003:25;;41042:20;41060:1;41042:20;:::i;:::-;41037:25;;41081:1;41071:2;;41086:18;;:::i;:::-;41071:2;41128:1;41125;41121:9;41116:14;;40993:143;;;;:::o;41142:348::-;;41205:20;41223:1;41205:20;:::i;:::-;41200:25;;41239:20;41257:1;41239:20;:::i;:::-;41234:25;;41427:1;41359:66;41355:74;41352:1;41349:81;41344:1;41337:9;41330:17;41326:105;41323:2;;;41434:18;;:::i;:::-;41323:2;41482:1;41479;41475:9;41464:20;;41190:300;;;;:::o;41496:191::-;;41556:20;41574:1;41556:20;:::i;:::-;41551:25;;41590:20;41608:1;41590:20;:::i;:::-;41585:25;;41629:1;41626;41623:8;41620:2;;;41634:18;;:::i;:::-;41620:2;41679:1;41676;41672:9;41664:17;;41541:146;;;;:::o;41693:96::-;;41759:24;41777:5;41759:24;:::i;:::-;41748:35;;41738:51;;;:::o;41795:90::-;;41872:5;41865:13;41858:21;41847:32;;41837:48;;;:::o;41891:149::-;;41967:66;41960:5;41956:78;41945:89;;41935:105;;;:::o;42046:126::-;;42123:42;42116:5;42112:54;42101:65;;42091:81;;;:::o;42178:77::-;;42244:5;42233:16;;42223:32;;;:::o;42261:154::-;42345:6;42340:3;42335;42322:30;42407:1;42398:6;42393:3;42389:16;42382:27;42312:103;;;:::o;42421:307::-;42489:1;42499:113;42513:6;42510:1;42507:13;42499:113;;;42598:1;42593:3;42589:11;42583:18;42579:1;42574:3;42570:11;42563:39;42535:2;42532:1;42528:10;42523:15;;42499:113;;;42630:6;42627:1;42624:13;42621:2;;;42710:1;42701:6;42696:3;42692:16;42685:27;42621:2;42470:258;;;;:::o;42734:320::-;;42815:1;42809:4;42805:12;42795:22;;42862:1;42856:4;42852:12;42883:18;42873:2;;42939:4;42931:6;42927:17;42917:27;;42873:2;43001;42993:6;42990:14;42970:18;42967:38;42964:2;;;43020:18;;:::i;:::-;42964:2;42785:269;;;;:::o;43060:233::-;;43122:24;43140:5;43122:24;:::i;:::-;43113:33;;43168:66;43161:5;43158:77;43155:2;;;43238:18;;:::i;:::-;43155:2;43285:1;43278:5;43274:13;43267:20;;43103:190;;;:::o;43299:176::-;;43348:20;43366:1;43348:20;:::i;:::-;43343:25;;43382:20;43400:1;43382:20;:::i;:::-;43377:25;;43421:1;43411:2;;43426:18;;:::i;:::-;43411:2;43467:1;43464;43460:9;43455:14;;43333:142;;;;:::o;43481:180::-;43529:77;43526:1;43519:88;43626:4;43623:1;43616:15;43650:4;43647:1;43640:15;43667:180;43715:77;43712:1;43705:88;43812:4;43809:1;43802:15;43836:4;43833:1;43826:15;43853:180;43901:77;43898:1;43891:88;43998:4;43995:1;43988:15;44022:4;44019:1;44012:15;44039:180;44087:77;44084:1;44077:88;44184:4;44181:1;44174:15;44208:4;44205:1;44198:15;44225:102;;44317:2;44313:7;44308:2;44301:5;44297:14;44293:28;44283:38;;44273:54;;;:::o;44333:122::-;44406:24;44424:5;44406:24;:::i;:::-;44399:5;44396:35;44386:2;;44445:1;44442;44435:12;44386:2;44376:79;:::o;44461:116::-;44531:21;44546:5;44531:21;:::i;:::-;44524:5;44521:32;44511:2;;44567:1;44564;44557:12;44511:2;44501:76;:::o;44583:120::-;44655:23;44672:5;44655:23;:::i;:::-;44648:5;44645:34;44635:2;;44693:1;44690;44683:12;44635:2;44625:78;:::o;44709:122::-;44782:24;44800:5;44782:24;:::i;:::-;44775:5;44772:35;44762:2;;44821:1;44818;44811:12;44762:2;44752:79;:::o

Swarm Source

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