ETH Price: $3,363.49 (-2.59%)

Token

Genesiz Shapez (SHAPEZ)
 

Overview

Max Total Supply

3,500 SHAPEZ

Holders

1,084

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
4 SHAPEZ
0xe8E7ff5eC4a73229E427Ad08DA49C0B95e40b778
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:
genesizShapez

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-12
*/

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

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


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

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) {
        return msg.data;
    }
}

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


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

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() {
        _transferOwnership(_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 {
        _transferOwnership(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");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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


// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

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

        (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");

        (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");

        (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");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal 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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

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

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


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

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

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


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol)

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}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. 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 {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @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.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    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` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// File: contracts/dynamic.sol




pragma solidity >=0.7.0 <0.9.0;

contract genesizShapez is ERC721, Ownable {
  using Strings for uint256;
  using Counters for Counters.Counter;

  Counters.Counter private supply;

  string public uriPrefix = "";
  string public uriSuffix = ".json";
  string public hiddenMetadataUri;
  
  uint256 public cost = 0.0555 ether;
  uint256 public maxSupply = 3500;
  uint256 public maxMintAmountPerTx = 20;

  bool public paused = false;
  bool public revealed = true;

  address public rooAddress;
  uint256 public roosMinted;
  uint256 public maxRooMints;

  constructor() ERC721("Genesiz Shapez", "SHAPEZ") {
    setHiddenMetadataUri("https://evolutionz.art/nft/hidden.json");
    setUriPrefix("https://evolutionz.art/nft/");

    // set the contract address to RooTroop Contract
    setRooAddress(0x928f072C009727FbAd81bBF3aAa885f9fEa65fcf);
    //set amount of max roo mints
    setMaxRooMints(100);
  }

  modifier mintCompliance(uint256 _mintAmount) {
    require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, "Invalid mint amount!");
    require(supply.current() + _mintAmount <= maxSupply, "Max supply exceeded!");
    _;
  }

  function totalSupply() public view returns (uint256) {
    return supply.current();
  }


  function mint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) {
    require(!paused, "The contract is paused!");

    // declare new custom token from address
    IERC721 rooToken = IERC721(rooAddress);
    // save roo tokens owned as variable
    uint256 rooAmountOwned = rooToken.balanceOf(msg.sender);

    // if roo holder, owns 0 Shapez and not fully free minted
    if (rooAmountOwned >= 1 && balanceOf(msg.sender) < 1 && roosMinted < maxRooMints) {
        require(msg.value >= cost * (_mintAmount - 1), "Insufficient funds!");
        roosMinted++;
    }   else {
        require(msg.value >= cost * _mintAmount, "Insufficient funds!");
    } 
    
    _mintLoop(msg.sender, _mintAmount);
  }

  
  
  function mintForAddress(uint256 _mintAmount, address _receiver) public mintCompliance(_mintAmount) onlyOwner {
    _mintLoop(_receiver, _mintAmount);
  }

  function walletOfOwner(address _owner)
    public
    view
    returns (uint256[] memory)
  {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
    uint256 currentTokenId = 1;
    uint256 ownedTokenIndex = 0;

    while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) {
      address currentTokenOwner = ownerOf(currentTokenId);

      if (currentTokenOwner == _owner) {
        ownedTokenIds[ownedTokenIndex] = currentTokenId;

        ownedTokenIndex++;
      }

      currentTokenId++;
    }

    return ownedTokenIds;
  }


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

    if (revealed == false) {
      return hiddenMetadataUri;
    }

    string memory currentBaseURI = _baseURI();
    return bytes(currentBaseURI).length > 0
        ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix))
        : "";
  }

  function setRevealed(bool _state) public onlyOwner {
    revealed = _state;
  }

  function setCost(uint256 _cost) public onlyOwner {
    cost = _cost;
  }

  function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner {
    maxMintAmountPerTx = _maxMintAmountPerTx;
  }

  function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner {
    hiddenMetadataUri = _hiddenMetadataUri;
  }

  function setUriPrefix(string memory _uriPrefix) public onlyOwner {
    uriPrefix = _uriPrefix;
  }

  function setUriSuffix(string memory _uriSuffix) public onlyOwner {
    uriSuffix = _uriSuffix;
  }

  function setPaused(bool _state) public onlyOwner {
    paused = _state;
  }

  function withdraw(uint256 _amount) public onlyOwner {

    (bool os, ) = payable(owner()).call{value: _amount }("");
    require(os);

  }

  function _mintLoop(address _receiver, uint256 _mintAmount) internal {
    for (uint256 i = 0; i < _mintAmount; i++) {
      supply.increment();
      _safeMint(_receiver, supply.current());
    }
  }

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


    // sets the contract address to Roo Troop
  function setRooAddress(address _newAddress) public onlyOwner{
    rooAddress = _newAddress;
  }

    //sets max amount of roos that can be minted
  function setMaxRooMints(uint256 _newAmount) public onlyOwner{
    maxRooMints = _newAmount;
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"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":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxRooMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","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":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rooAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"roosMinted","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":"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":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newAmount","type":"uint256"}],"name":"setMaxRooMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newAddress","type":"address"}],"name":"setRooAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_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":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180602001604052806000815250600890805190602001906200002b929190620005fb565b506040518060400160405280600581526020017f2e6a736f6e0000000000000000000000000000000000000000000000000000008152506009908051906020019062000079929190620005fb565b5066c52cf4b908c000600b55610dac600c556014600d556000600e60006101000a81548160ff0219169083151502179055506001600e60016101000a81548160ff021916908315150217905550348015620000d357600080fd5b506040518060400160405280600e81526020017f47656e6573697a2053686170657a0000000000000000000000000000000000008152506040518060400160405280600681526020017f53484150455a0000000000000000000000000000000000000000000000000000815250816000908051906020019062000158929190620005fb565b50806001908051906020019062000171929190620005fb565b50505062000194620001886200024160201b60201c565b6200024960201b60201c565b620001be60405180606001604052806026815260200162004da6602691396200030f60201b60201c565b620002046040518060400160405280601b81526020017f68747470733a2f2f65766f6c7574696f6e7a2e6172742f6e66742f0000000000815250620003ba60201b60201c565b6200022973928f072c009727fbad81bbf3aaa885f9fea65fcf6200046560201b60201c565b6200023b60646200053860201b60201c565b62000793565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200031f6200024160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000345620005d160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200039e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200039590620006d2565b60405180910390fd5b80600a9080519060200190620003b6929190620005fb565b5050565b620003ca6200024160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003f0620005d160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000449576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200044090620006d2565b60405180910390fd5b806008908051906020019062000461929190620005fb565b5050565b620004756200024160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200049b620005d160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620004f4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004eb90620006d2565b60405180910390fd5b80600e60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b620005486200024160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200056e620005d160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620005c7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005be90620006d2565b60405180910390fd5b8060108190555050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620006099062000705565b90600052602060002090601f0160209004810192826200062d576000855562000679565b82601f106200064857805160ff191683800117855562000679565b8280016001018555821562000679579182015b82811115620006785782518255916020019190600101906200065b565b5b5090506200068891906200068c565b5090565b5b80821115620006a75760008160009055506001016200068d565b5090565b6000620006ba602083620006f4565b9150620006c7826200076a565b602082019050919050565b60006020820190508181036000830152620006ed81620006ab565b9050919050565b600082825260208201905092915050565b600060028204905060018216806200071e57607f821691505b602082108114156200073557620007346200073b565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b61460380620007a36000396000f3fe6080604052600436106102465760003560e01c806362b99ad411610139578063a22cb465116100b6578063d5abeb011161007a578063d5abeb0114610859578063db53bc1b14610884578063e0a80853146108af578063e985e9c5146108d8578063efbd73f414610915578063f2fde38b1461093e57610246565b8063a22cb46514610776578063a45ba8e71461079f578063b071401b146107ca578063b88d4fde146107f3578063c87b56dd1461081c57610246565b80637ec4a659116100fd5780637ec4a659146106b05780638da5cb5b146106d957806394354fd01461070457806395d89b411461072f578063a0712d681461075a57610246565b806362b99ad4146105cb5780636352211e146105f6578063641b83c31461063357806370a082311461065c578063715018a61461069957610246565b80632935f978116101c75780634fdd43cb1161018b5780634fdd43cb146104f8578063518302271461052157806351aad1901461054c5780635503a0e8146105755780635c975abb146105a057610246565b80632935f978146104155780632e1a7d4d1461044057806342842e0e14610469578063438b63001461049257806344a0d68a146104cf57610246565b806313faede61161020e57806313faede61461034457806316ba10e01461036f57806316c38b3c1461039857806318160ddd146103c157806323b872dd146103ec57610246565b806301ffc9a71461024b57806306fdde0314610288578063081812fc146102b3578063095ea7b3146102f05780630d86f8d114610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613200565b610967565b60405161027f91906138bf565b60405180910390f35b34801561029457600080fd5b5061029d610a49565b6040516102aa91906138da565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d591906132a3565b610adb565b6040516102e79190613836565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190613193565b610b60565b005b34801561032557600080fd5b5061032e610c78565b60405161033b9190613b7c565b60405180910390f35b34801561035057600080fd5b50610359610c7e565b6040516103669190613b7c565b60405180910390f35b34801561037b57600080fd5b506103966004803603810190610391919061325a565b610c84565b005b3480156103a457600080fd5b506103bf60048036038101906103ba91906131d3565b610d1a565b005b3480156103cd57600080fd5b506103d6610db3565b6040516103e39190613b7c565b60405180910390f35b3480156103f857600080fd5b50610413600480360381019061040e919061307d565b610dc4565b005b34801561042157600080fd5b5061042a610e24565b6040516104379190613b7c565b60405180910390f35b34801561044c57600080fd5b50610467600480360381019061046291906132a3565b610e2a565b005b34801561047557600080fd5b50610490600480360381019061048b919061307d565b610f27565b005b34801561049e57600080fd5b506104b960048036038101906104b49190613010565b610f47565b6040516104c6919061389d565b60405180910390f35b3480156104db57600080fd5b506104f660048036038101906104f191906132a3565b611052565b005b34801561050457600080fd5b5061051f600480360381019061051a919061325a565b6110d8565b005b34801561052d57600080fd5b5061053661116e565b60405161054391906138bf565b60405180910390f35b34801561055857600080fd5b50610573600480360381019061056e91906132a3565b611181565b005b34801561058157600080fd5b5061058a611207565b60405161059791906138da565b60405180910390f35b3480156105ac57600080fd5b506105b5611295565b6040516105c291906138bf565b60405180910390f35b3480156105d757600080fd5b506105e06112a8565b6040516105ed91906138da565b60405180910390f35b34801561060257600080fd5b5061061d600480360381019061061891906132a3565b611336565b60405161062a9190613836565b60405180910390f35b34801561063f57600080fd5b5061065a60048036038101906106559190613010565b6113e8565b005b34801561066857600080fd5b50610683600480360381019061067e9190613010565b6114a8565b6040516106909190613b7c565b60405180910390f35b3480156106a557600080fd5b506106ae611560565b005b3480156106bc57600080fd5b506106d760048036038101906106d2919061325a565b6115e8565b005b3480156106e557600080fd5b506106ee61167e565b6040516106fb9190613836565b60405180910390f35b34801561071057600080fd5b506107196116a8565b6040516107269190613b7c565b60405180910390f35b34801561073b57600080fd5b506107446116ae565b60405161075191906138da565b60405180910390f35b610774600480360381019061076f91906132a3565b611740565b005b34801561078257600080fd5b5061079d60048036038101906107989190613153565b6119f6565b005b3480156107ab57600080fd5b506107b4611a0c565b6040516107c191906138da565b60405180910390f35b3480156107d657600080fd5b506107f160048036038101906107ec91906132a3565b611a9a565b005b3480156107ff57600080fd5b5061081a600480360381019061081591906130d0565b611b20565b005b34801561082857600080fd5b50610843600480360381019061083e91906132a3565b611b82565b60405161085091906138da565b60405180910390f35b34801561086557600080fd5b5061086e611cdb565b60405161087b9190613b7c565b60405180910390f35b34801561089057600080fd5b50610899611ce1565b6040516108a69190613836565b60405180910390f35b3480156108bb57600080fd5b506108d660048036038101906108d191906131d3565b611d07565b005b3480156108e457600080fd5b506108ff60048036038101906108fa919061303d565b611da0565b60405161090c91906138bf565b60405180910390f35b34801561092157600080fd5b5061093c600480360381019061093791906132fd565b611e34565b005b34801561094a57600080fd5b5061096560048036038101906109609190613010565b611f6a565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a3257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a425750610a4182612062565b5b9050919050565b606060008054610a5890613e85565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8490613e85565b8015610ad15780601f10610aa657610100808354040283529160200191610ad1565b820191906000526020600020905b815481529060010190602001808311610ab457829003601f168201915b5050505050905090565b6000610ae6826120cc565b610b25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1c90613a5c565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b6b82611336565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd390613afc565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bfb612138565b73ffffffffffffffffffffffffffffffffffffffff161480610c2a5750610c2981610c24612138565b611da0565b5b610c69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c60906139dc565b60405180910390fd5b610c738383612140565b505050565b600f5481565b600b5481565b610c8c612138565b73ffffffffffffffffffffffffffffffffffffffff16610caa61167e565b73ffffffffffffffffffffffffffffffffffffffff1614610d00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf790613a7c565b60405180910390fd5b8060099080519060200190610d16929190612e0f565b5050565b610d22612138565b73ffffffffffffffffffffffffffffffffffffffff16610d4061167e565b73ffffffffffffffffffffffffffffffffffffffff1614610d96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8d90613a7c565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b6000610dbf60076121f9565b905090565b610dd5610dcf612138565b82612207565b610e14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0b90613b3c565b60405180910390fd5b610e1f8383836122e5565b505050565b60105481565b610e32612138565b73ffffffffffffffffffffffffffffffffffffffff16610e5061167e565b73ffffffffffffffffffffffffffffffffffffffff1614610ea6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9d90613a7c565b60405180910390fd5b6000610eb061167e565b73ffffffffffffffffffffffffffffffffffffffff1682604051610ed390613821565b60006040518083038185875af1925050503d8060008114610f10576040519150601f19603f3d011682016040523d82523d6000602084013e610f15565b606091505b5050905080610f2357600080fd5b5050565b610f4283838360405180602001604052806000815250611b20565b505050565b60606000610f54836114a8565b905060008167ffffffffffffffff811115610f7257610f7161401e565b5b604051908082528060200260200182016040528015610fa05781602001602082028036833780820191505090505b50905060006001905060005b8381108015610fbd5750600c548211155b15611046576000610fcd83611336565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611032578284838151811061101757611016613fef565b5b602002602001018181525050818061102e90613ee8565b9250505b828061103d90613ee8565b93505050610fac565b82945050505050919050565b61105a612138565b73ffffffffffffffffffffffffffffffffffffffff1661107861167e565b73ffffffffffffffffffffffffffffffffffffffff16146110ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c590613a7c565b60405180910390fd5b80600b8190555050565b6110e0612138565b73ffffffffffffffffffffffffffffffffffffffff166110fe61167e565b73ffffffffffffffffffffffffffffffffffffffff1614611154576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114b90613a7c565b60405180910390fd5b80600a908051906020019061116a929190612e0f565b5050565b600e60019054906101000a900460ff1681565b611189612138565b73ffffffffffffffffffffffffffffffffffffffff166111a761167e565b73ffffffffffffffffffffffffffffffffffffffff16146111fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f490613a7c565b60405180910390fd5b8060108190555050565b6009805461121490613e85565b80601f016020809104026020016040519081016040528092919081815260200182805461124090613e85565b801561128d5780601f106112625761010080835404028352916020019161128d565b820191906000526020600020905b81548152906001019060200180831161127057829003601f168201915b505050505081565b600e60009054906101000a900460ff1681565b600880546112b590613e85565b80601f01602080910402602001604051908101604052809291908181526020018280546112e190613e85565b801561132e5780601f106113035761010080835404028352916020019161132e565b820191906000526020600020905b81548152906001019060200180831161131157829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d690613a1c565b60405180910390fd5b80915050919050565b6113f0612138565b73ffffffffffffffffffffffffffffffffffffffff1661140e61167e565b73ffffffffffffffffffffffffffffffffffffffff1614611464576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145b90613a7c565b60405180910390fd5b80600e60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611519576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611510906139fc565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611568612138565b73ffffffffffffffffffffffffffffffffffffffff1661158661167e565b73ffffffffffffffffffffffffffffffffffffffff16146115dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d390613a7c565b60405180910390fd5b6115e66000612541565b565b6115f0612138565b73ffffffffffffffffffffffffffffffffffffffff1661160e61167e565b73ffffffffffffffffffffffffffffffffffffffff1614611664576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165b90613a7c565b60405180910390fd5b806008908051906020019061167a929190612e0f565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d5481565b6060600180546116bd90613e85565b80601f01602080910402602001604051908101604052809291908181526020018280546116e990613e85565b80156117365780601f1061170b57610100808354040283529160200191611736565b820191906000526020600020905b81548152906001019060200180831161171957829003601f168201915b5050505050905090565b806000811180156117535750600d548111155b611792576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117899061395c565b60405180910390fd5b600c54816117a060076121f9565b6117aa9190613cba565b11156117eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e290613b1c565b60405180910390fd5b600e60009054906101000a900460ff161561183b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183290613a9c565b60405180910390fd5b6000600e60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b815260040161189d9190613836565b60206040518083038186803b1580156118b557600080fd5b505afa1580156118c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ed91906132d0565b90506001811015801561190857506001611906336114a8565b105b80156119175750601054600f54105b15611995576001846119299190613d9b565b600b546119369190613d41565b341015611978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196f90613b5c565b60405180910390fd5b600f600081548092919061198b90613ee8565b91905055506119e6565b83600b546119a39190613d41565b3410156119e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119dc90613b5c565b60405180910390fd5b5b6119f03385612607565b50505050565b611a08611a01612138565b8383612647565b5050565b600a8054611a1990613e85565b80601f0160208091040260200160405190810160405280929190818152602001828054611a4590613e85565b8015611a925780601f10611a6757610100808354040283529160200191611a92565b820191906000526020600020905b815481529060010190602001808311611a7557829003601f168201915b505050505081565b611aa2612138565b73ffffffffffffffffffffffffffffffffffffffff16611ac061167e565b73ffffffffffffffffffffffffffffffffffffffff1614611b16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0d90613a7c565b60405180910390fd5b80600d8190555050565b611b31611b2b612138565b83612207565b611b70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6790613b3c565b60405180910390fd5b611b7c848484846127b4565b50505050565b6060611b8d826120cc565b611bcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc390613adc565b60405180910390fd5b60001515600e60019054906101000a900460ff1615151415611c7a57600a8054611bf590613e85565b80601f0160208091040260200160405190810160405280929190818152602001828054611c2190613e85565b8015611c6e5780601f10611c4357610100808354040283529160200191611c6e565b820191906000526020600020905b815481529060010190602001808311611c5157829003601f168201915b50505050509050611cd6565b6000611c84612810565b90506000815111611ca45760405180602001604052806000815250611cd2565b80611cae846128a2565b6009604051602001611cc2939291906137f0565b6040516020818303038152906040525b9150505b919050565b600c5481565b600e60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611d0f612138565b73ffffffffffffffffffffffffffffffffffffffff16611d2d61167e565b73ffffffffffffffffffffffffffffffffffffffff1614611d83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7a90613a7c565b60405180910390fd5b80600e60016101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b81600081118015611e475750600d548111155b611e86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7d9061395c565b60405180910390fd5b600c5481611e9460076121f9565b611e9e9190613cba565b1115611edf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed690613b1c565b60405180910390fd5b611ee7612138565b73ffffffffffffffffffffffffffffffffffffffff16611f0561167e565b73ffffffffffffffffffffffffffffffffffffffff1614611f5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5290613a7c565b60405180910390fd5b611f658284612607565b505050565b611f72612138565b73ffffffffffffffffffffffffffffffffffffffff16611f9061167e565b73ffffffffffffffffffffffffffffffffffffffff1614611fe6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fdd90613a7c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612056576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204d9061391c565b60405180910390fd5b61205f81612541565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166121b383611336565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6000612212826120cc565b612251576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612248906139bc565b60405180910390fd5b600061225c83611336565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806122cb57508373ffffffffffffffffffffffffffffffffffffffff166122b384610adb565b73ffffffffffffffffffffffffffffffffffffffff16145b806122dc57506122db8185611da0565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661230582611336565b73ffffffffffffffffffffffffffffffffffffffff161461235b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235290613abc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c29061397c565b60405180910390fd5b6123d6838383612a03565b6123e1600082612140565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124319190613d9b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124889190613cba565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60005b818110156126425761261c6007612a08565b61262f8361262a60076121f9565b612a1e565b808061263a90613ee8565b91505061260a565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156126b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ad9061399c565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516127a791906138bf565b60405180910390a3505050565b6127bf8484846122e5565b6127cb84848484612a3c565b61280a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612801906138fc565b60405180910390fd5b50505050565b60606008805461281f90613e85565b80601f016020809104026020016040519081016040528092919081815260200182805461284b90613e85565b80156128985780601f1061286d57610100808354040283529160200191612898565b820191906000526020600020905b81548152906001019060200180831161287b57829003601f168201915b5050505050905090565b606060008214156128ea576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506129fe565b600082905060005b6000821461291c57808061290590613ee8565b915050600a826129159190613d10565b91506128f2565b60008167ffffffffffffffff8111156129385761293761401e565b5b6040519080825280601f01601f19166020018201604052801561296a5781602001600182028036833780820191505090505b5090505b600085146129f7576001826129839190613d9b565b9150600a856129929190613f31565b603061299e9190613cba565b60f81b8183815181106129b4576129b3613fef565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856129f09190613d10565b945061296e565b8093505050505b919050565b505050565b6001816000016000828254019250508190555050565b612a38828260405180602001604052806000815250612bd3565b5050565b6000612a5d8473ffffffffffffffffffffffffffffffffffffffff16612c2e565b15612bc6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a86612138565b8786866040518563ffffffff1660e01b8152600401612aa89493929190613851565b602060405180830381600087803b158015612ac257600080fd5b505af1925050508015612af357506040513d601f19601f82011682018060405250810190612af0919061322d565b60015b612b76573d8060008114612b23576040519150601f19603f3d011682016040523d82523d6000602084013e612b28565b606091505b50600081511415612b6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b65906138fc565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612bcb565b600190505b949350505050565b612bdd8383612c41565b612bea6000848484612a3c565b612c29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c20906138fc565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612cb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca890613a3c565b60405180910390fd5b612cba816120cc565b15612cfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cf19061393c565b60405180910390fd5b612d0660008383612a03565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d569190613cba565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612e1b90613e85565b90600052602060002090601f016020900481019282612e3d5760008555612e84565b82601f10612e5657805160ff1916838001178555612e84565b82800160010185558215612e84579182015b82811115612e83578251825591602001919060010190612e68565b5b509050612e919190612e95565b5090565b5b80821115612eae576000816000905550600101612e96565b5090565b6000612ec5612ec084613bbc565b613b97565b905082815260208101848484011115612ee157612ee0614052565b5b612eec848285613e43565b509392505050565b6000612f07612f0284613bed565b613b97565b905082815260208101848484011115612f2357612f22614052565b5b612f2e848285613e43565b509392505050565b600081359050612f4581614571565b92915050565b600081359050612f5a81614588565b92915050565b600081359050612f6f8161459f565b92915050565b600081519050612f848161459f565b92915050565b600082601f830112612f9f57612f9e61404d565b5b8135612faf848260208601612eb2565b91505092915050565b600082601f830112612fcd57612fcc61404d565b5b8135612fdd848260208601612ef4565b91505092915050565b600081359050612ff5816145b6565b92915050565b60008151905061300a816145b6565b92915050565b6000602082840312156130265761302561405c565b5b600061303484828501612f36565b91505092915050565b600080604083850312156130545761305361405c565b5b600061306285828601612f36565b925050602061307385828601612f36565b9150509250929050565b6000806000606084860312156130965761309561405c565b5b60006130a486828701612f36565b93505060206130b586828701612f36565b92505060406130c686828701612fe6565b9150509250925092565b600080600080608085870312156130ea576130e961405c565b5b60006130f887828801612f36565b945050602061310987828801612f36565b935050604061311a87828801612fe6565b925050606085013567ffffffffffffffff81111561313b5761313a614057565b5b61314787828801612f8a565b91505092959194509250565b6000806040838503121561316a5761316961405c565b5b600061317885828601612f36565b925050602061318985828601612f4b565b9150509250929050565b600080604083850312156131aa576131a961405c565b5b60006131b885828601612f36565b92505060206131c985828601612fe6565b9150509250929050565b6000602082840312156131e9576131e861405c565b5b60006131f784828501612f4b565b91505092915050565b6000602082840312156132165761321561405c565b5b600061322484828501612f60565b91505092915050565b6000602082840312156132435761324261405c565b5b600061325184828501612f75565b91505092915050565b6000602082840312156132705761326f61405c565b5b600082013567ffffffffffffffff81111561328e5761328d614057565b5b61329a84828501612fb8565b91505092915050565b6000602082840312156132b9576132b861405c565b5b60006132c784828501612fe6565b91505092915050565b6000602082840312156132e6576132e561405c565b5b60006132f484828501612ffb565b91505092915050565b600080604083850312156133145761331361405c565b5b600061332285828601612fe6565b925050602061333385828601612f36565b9150509250929050565b600061334983836137d2565b60208301905092915050565b61335e81613dcf565b82525050565b600061336f82613c43565b6133798185613c71565b935061338483613c1e565b8060005b838110156133b557815161339c888261333d565b97506133a783613c64565b925050600181019050613388565b5085935050505092915050565b6133cb81613de1565b82525050565b60006133dc82613c4e565b6133e68185613c82565b93506133f6818560208601613e52565b6133ff81614061565b840191505092915050565b600061341582613c59565b61341f8185613c9e565b935061342f818560208601613e52565b61343881614061565b840191505092915050565b600061344e82613c59565b6134588185613caf565b9350613468818560208601613e52565b80840191505092915050565b6000815461348181613e85565b61348b8186613caf565b945060018216600081146134a657600181146134b7576134ea565b60ff198316865281860193506134ea565b6134c085613c2e565b60005b838110156134e2578154818901526001820191506020810190506134c3565b838801955050505b50505092915050565b6000613500603283613c9e565b915061350b82614072565b604082019050919050565b6000613523602683613c9e565b915061352e826140c1565b604082019050919050565b6000613546601c83613c9e565b915061355182614110565b602082019050919050565b6000613569601483613c9e565b915061357482614139565b602082019050919050565b600061358c602483613c9e565b915061359782614162565b604082019050919050565b60006135af601983613c9e565b91506135ba826141b1565b602082019050919050565b60006135d2602c83613c9e565b91506135dd826141da565b604082019050919050565b60006135f5603883613c9e565b915061360082614229565b604082019050919050565b6000613618602a83613c9e565b915061362382614278565b604082019050919050565b600061363b602983613c9e565b9150613646826142c7565b604082019050919050565b600061365e602083613c9e565b915061366982614316565b602082019050919050565b6000613681602c83613c9e565b915061368c8261433f565b604082019050919050565b60006136a4602083613c9e565b91506136af8261438e565b602082019050919050565b60006136c7601783613c9e565b91506136d2826143b7565b602082019050919050565b60006136ea602983613c9e565b91506136f5826143e0565b604082019050919050565b600061370d602f83613c9e565b91506137188261442f565b604082019050919050565b6000613730602183613c9e565b915061373b8261447e565b604082019050919050565b6000613753600083613c93565b915061375e826144cd565b600082019050919050565b6000613776601483613c9e565b9150613781826144d0565b602082019050919050565b6000613799603183613c9e565b91506137a4826144f9565b604082019050919050565b60006137bc601383613c9e565b91506137c782614548565b602082019050919050565b6137db81613e39565b82525050565b6137ea81613e39565b82525050565b60006137fc8286613443565b91506138088285613443565b91506138148284613474565b9150819050949350505050565b600061382c82613746565b9150819050919050565b600060208201905061384b6000830184613355565b92915050565b60006080820190506138666000830187613355565b6138736020830186613355565b61388060408301856137e1565b818103606083015261389281846133d1565b905095945050505050565b600060208201905081810360008301526138b78184613364565b905092915050565b60006020820190506138d460008301846133c2565b92915050565b600060208201905081810360008301526138f4818461340a565b905092915050565b60006020820190508181036000830152613915816134f3565b9050919050565b6000602082019050818103600083015261393581613516565b9050919050565b6000602082019050818103600083015261395581613539565b9050919050565b600060208201905081810360008301526139758161355c565b9050919050565b600060208201905081810360008301526139958161357f565b9050919050565b600060208201905081810360008301526139b5816135a2565b9050919050565b600060208201905081810360008301526139d5816135c5565b9050919050565b600060208201905081810360008301526139f5816135e8565b9050919050565b60006020820190508181036000830152613a158161360b565b9050919050565b60006020820190508181036000830152613a358161362e565b9050919050565b60006020820190508181036000830152613a5581613651565b9050919050565b60006020820190508181036000830152613a7581613674565b9050919050565b60006020820190508181036000830152613a9581613697565b9050919050565b60006020820190508181036000830152613ab5816136ba565b9050919050565b60006020820190508181036000830152613ad5816136dd565b9050919050565b60006020820190508181036000830152613af581613700565b9050919050565b60006020820190508181036000830152613b1581613723565b9050919050565b60006020820190508181036000830152613b3581613769565b9050919050565b60006020820190508181036000830152613b558161378c565b9050919050565b60006020820190508181036000830152613b75816137af565b9050919050565b6000602082019050613b9160008301846137e1565b92915050565b6000613ba1613bb2565b9050613bad8282613eb7565b919050565b6000604051905090565b600067ffffffffffffffff821115613bd757613bd661401e565b5b613be082614061565b9050602081019050919050565b600067ffffffffffffffff821115613c0857613c0761401e565b5b613c1182614061565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613cc582613e39565b9150613cd083613e39565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d0557613d04613f62565b5b828201905092915050565b6000613d1b82613e39565b9150613d2683613e39565b925082613d3657613d35613f91565b5b828204905092915050565b6000613d4c82613e39565b9150613d5783613e39565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613d9057613d8f613f62565b5b828202905092915050565b6000613da682613e39565b9150613db183613e39565b925082821015613dc457613dc3613f62565b5b828203905092915050565b6000613dda82613e19565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613e70578082015181840152602081019050613e55565b83811115613e7f576000848401525b50505050565b60006002820490506001821680613e9d57607f821691505b60208210811415613eb157613eb0613fc0565b5b50919050565b613ec082614061565b810181811067ffffffffffffffff82111715613edf57613ede61401e565b5b80604052505050565b6000613ef382613e39565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f2657613f25613f62565b5b600182019050919050565b6000613f3c82613e39565b9150613f4783613e39565b925082613f5757613f56613f91565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b61457a81613dcf565b811461458557600080fd5b50565b61459181613de1565b811461459c57600080fd5b50565b6145a881613ded565b81146145b357600080fd5b50565b6145bf81613e39565b81146145ca57600080fd5b5056fea26469706673582212201ccd56d3b626dbb4cf26f2cdcc3daa3c52065d5efcb0aa9c27ca89b130028e3b64736f6c6343000807003368747470733a2f2f65766f6c7574696f6e7a2e6172742f6e66742f68696464656e2e6a736f6e

Deployed Bytecode

0x6080604052600436106102465760003560e01c806362b99ad411610139578063a22cb465116100b6578063d5abeb011161007a578063d5abeb0114610859578063db53bc1b14610884578063e0a80853146108af578063e985e9c5146108d8578063efbd73f414610915578063f2fde38b1461093e57610246565b8063a22cb46514610776578063a45ba8e71461079f578063b071401b146107ca578063b88d4fde146107f3578063c87b56dd1461081c57610246565b80637ec4a659116100fd5780637ec4a659146106b05780638da5cb5b146106d957806394354fd01461070457806395d89b411461072f578063a0712d681461075a57610246565b806362b99ad4146105cb5780636352211e146105f6578063641b83c31461063357806370a082311461065c578063715018a61461069957610246565b80632935f978116101c75780634fdd43cb1161018b5780634fdd43cb146104f8578063518302271461052157806351aad1901461054c5780635503a0e8146105755780635c975abb146105a057610246565b80632935f978146104155780632e1a7d4d1461044057806342842e0e14610469578063438b63001461049257806344a0d68a146104cf57610246565b806313faede61161020e57806313faede61461034457806316ba10e01461036f57806316c38b3c1461039857806318160ddd146103c157806323b872dd146103ec57610246565b806301ffc9a71461024b57806306fdde0314610288578063081812fc146102b3578063095ea7b3146102f05780630d86f8d114610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613200565b610967565b60405161027f91906138bf565b60405180910390f35b34801561029457600080fd5b5061029d610a49565b6040516102aa91906138da565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d591906132a3565b610adb565b6040516102e79190613836565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190613193565b610b60565b005b34801561032557600080fd5b5061032e610c78565b60405161033b9190613b7c565b60405180910390f35b34801561035057600080fd5b50610359610c7e565b6040516103669190613b7c565b60405180910390f35b34801561037b57600080fd5b506103966004803603810190610391919061325a565b610c84565b005b3480156103a457600080fd5b506103bf60048036038101906103ba91906131d3565b610d1a565b005b3480156103cd57600080fd5b506103d6610db3565b6040516103e39190613b7c565b60405180910390f35b3480156103f857600080fd5b50610413600480360381019061040e919061307d565b610dc4565b005b34801561042157600080fd5b5061042a610e24565b6040516104379190613b7c565b60405180910390f35b34801561044c57600080fd5b50610467600480360381019061046291906132a3565b610e2a565b005b34801561047557600080fd5b50610490600480360381019061048b919061307d565b610f27565b005b34801561049e57600080fd5b506104b960048036038101906104b49190613010565b610f47565b6040516104c6919061389d565b60405180910390f35b3480156104db57600080fd5b506104f660048036038101906104f191906132a3565b611052565b005b34801561050457600080fd5b5061051f600480360381019061051a919061325a565b6110d8565b005b34801561052d57600080fd5b5061053661116e565b60405161054391906138bf565b60405180910390f35b34801561055857600080fd5b50610573600480360381019061056e91906132a3565b611181565b005b34801561058157600080fd5b5061058a611207565b60405161059791906138da565b60405180910390f35b3480156105ac57600080fd5b506105b5611295565b6040516105c291906138bf565b60405180910390f35b3480156105d757600080fd5b506105e06112a8565b6040516105ed91906138da565b60405180910390f35b34801561060257600080fd5b5061061d600480360381019061061891906132a3565b611336565b60405161062a9190613836565b60405180910390f35b34801561063f57600080fd5b5061065a60048036038101906106559190613010565b6113e8565b005b34801561066857600080fd5b50610683600480360381019061067e9190613010565b6114a8565b6040516106909190613b7c565b60405180910390f35b3480156106a557600080fd5b506106ae611560565b005b3480156106bc57600080fd5b506106d760048036038101906106d2919061325a565b6115e8565b005b3480156106e557600080fd5b506106ee61167e565b6040516106fb9190613836565b60405180910390f35b34801561071057600080fd5b506107196116a8565b6040516107269190613b7c565b60405180910390f35b34801561073b57600080fd5b506107446116ae565b60405161075191906138da565b60405180910390f35b610774600480360381019061076f91906132a3565b611740565b005b34801561078257600080fd5b5061079d60048036038101906107989190613153565b6119f6565b005b3480156107ab57600080fd5b506107b4611a0c565b6040516107c191906138da565b60405180910390f35b3480156107d657600080fd5b506107f160048036038101906107ec91906132a3565b611a9a565b005b3480156107ff57600080fd5b5061081a600480360381019061081591906130d0565b611b20565b005b34801561082857600080fd5b50610843600480360381019061083e91906132a3565b611b82565b60405161085091906138da565b60405180910390f35b34801561086557600080fd5b5061086e611cdb565b60405161087b9190613b7c565b60405180910390f35b34801561089057600080fd5b50610899611ce1565b6040516108a69190613836565b60405180910390f35b3480156108bb57600080fd5b506108d660048036038101906108d191906131d3565b611d07565b005b3480156108e457600080fd5b506108ff60048036038101906108fa919061303d565b611da0565b60405161090c91906138bf565b60405180910390f35b34801561092157600080fd5b5061093c600480360381019061093791906132fd565b611e34565b005b34801561094a57600080fd5b5061096560048036038101906109609190613010565b611f6a565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a3257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a425750610a4182612062565b5b9050919050565b606060008054610a5890613e85565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8490613e85565b8015610ad15780601f10610aa657610100808354040283529160200191610ad1565b820191906000526020600020905b815481529060010190602001808311610ab457829003601f168201915b5050505050905090565b6000610ae6826120cc565b610b25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1c90613a5c565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b6b82611336565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd390613afc565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bfb612138565b73ffffffffffffffffffffffffffffffffffffffff161480610c2a5750610c2981610c24612138565b611da0565b5b610c69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c60906139dc565b60405180910390fd5b610c738383612140565b505050565b600f5481565b600b5481565b610c8c612138565b73ffffffffffffffffffffffffffffffffffffffff16610caa61167e565b73ffffffffffffffffffffffffffffffffffffffff1614610d00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf790613a7c565b60405180910390fd5b8060099080519060200190610d16929190612e0f565b5050565b610d22612138565b73ffffffffffffffffffffffffffffffffffffffff16610d4061167e565b73ffffffffffffffffffffffffffffffffffffffff1614610d96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8d90613a7c565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b6000610dbf60076121f9565b905090565b610dd5610dcf612138565b82612207565b610e14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0b90613b3c565b60405180910390fd5b610e1f8383836122e5565b505050565b60105481565b610e32612138565b73ffffffffffffffffffffffffffffffffffffffff16610e5061167e565b73ffffffffffffffffffffffffffffffffffffffff1614610ea6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9d90613a7c565b60405180910390fd5b6000610eb061167e565b73ffffffffffffffffffffffffffffffffffffffff1682604051610ed390613821565b60006040518083038185875af1925050503d8060008114610f10576040519150601f19603f3d011682016040523d82523d6000602084013e610f15565b606091505b5050905080610f2357600080fd5b5050565b610f4283838360405180602001604052806000815250611b20565b505050565b60606000610f54836114a8565b905060008167ffffffffffffffff811115610f7257610f7161401e565b5b604051908082528060200260200182016040528015610fa05781602001602082028036833780820191505090505b50905060006001905060005b8381108015610fbd5750600c548211155b15611046576000610fcd83611336565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611032578284838151811061101757611016613fef565b5b602002602001018181525050818061102e90613ee8565b9250505b828061103d90613ee8565b93505050610fac565b82945050505050919050565b61105a612138565b73ffffffffffffffffffffffffffffffffffffffff1661107861167e565b73ffffffffffffffffffffffffffffffffffffffff16146110ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c590613a7c565b60405180910390fd5b80600b8190555050565b6110e0612138565b73ffffffffffffffffffffffffffffffffffffffff166110fe61167e565b73ffffffffffffffffffffffffffffffffffffffff1614611154576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114b90613a7c565b60405180910390fd5b80600a908051906020019061116a929190612e0f565b5050565b600e60019054906101000a900460ff1681565b611189612138565b73ffffffffffffffffffffffffffffffffffffffff166111a761167e565b73ffffffffffffffffffffffffffffffffffffffff16146111fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f490613a7c565b60405180910390fd5b8060108190555050565b6009805461121490613e85565b80601f016020809104026020016040519081016040528092919081815260200182805461124090613e85565b801561128d5780601f106112625761010080835404028352916020019161128d565b820191906000526020600020905b81548152906001019060200180831161127057829003601f168201915b505050505081565b600e60009054906101000a900460ff1681565b600880546112b590613e85565b80601f01602080910402602001604051908101604052809291908181526020018280546112e190613e85565b801561132e5780601f106113035761010080835404028352916020019161132e565b820191906000526020600020905b81548152906001019060200180831161131157829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d690613a1c565b60405180910390fd5b80915050919050565b6113f0612138565b73ffffffffffffffffffffffffffffffffffffffff1661140e61167e565b73ffffffffffffffffffffffffffffffffffffffff1614611464576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145b90613a7c565b60405180910390fd5b80600e60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611519576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611510906139fc565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611568612138565b73ffffffffffffffffffffffffffffffffffffffff1661158661167e565b73ffffffffffffffffffffffffffffffffffffffff16146115dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d390613a7c565b60405180910390fd5b6115e66000612541565b565b6115f0612138565b73ffffffffffffffffffffffffffffffffffffffff1661160e61167e565b73ffffffffffffffffffffffffffffffffffffffff1614611664576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165b90613a7c565b60405180910390fd5b806008908051906020019061167a929190612e0f565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d5481565b6060600180546116bd90613e85565b80601f01602080910402602001604051908101604052809291908181526020018280546116e990613e85565b80156117365780601f1061170b57610100808354040283529160200191611736565b820191906000526020600020905b81548152906001019060200180831161171957829003601f168201915b5050505050905090565b806000811180156117535750600d548111155b611792576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117899061395c565b60405180910390fd5b600c54816117a060076121f9565b6117aa9190613cba565b11156117eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e290613b1c565b60405180910390fd5b600e60009054906101000a900460ff161561183b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183290613a9c565b60405180910390fd5b6000600e60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b815260040161189d9190613836565b60206040518083038186803b1580156118b557600080fd5b505afa1580156118c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ed91906132d0565b90506001811015801561190857506001611906336114a8565b105b80156119175750601054600f54105b15611995576001846119299190613d9b565b600b546119369190613d41565b341015611978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196f90613b5c565b60405180910390fd5b600f600081548092919061198b90613ee8565b91905055506119e6565b83600b546119a39190613d41565b3410156119e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119dc90613b5c565b60405180910390fd5b5b6119f03385612607565b50505050565b611a08611a01612138565b8383612647565b5050565b600a8054611a1990613e85565b80601f0160208091040260200160405190810160405280929190818152602001828054611a4590613e85565b8015611a925780601f10611a6757610100808354040283529160200191611a92565b820191906000526020600020905b815481529060010190602001808311611a7557829003601f168201915b505050505081565b611aa2612138565b73ffffffffffffffffffffffffffffffffffffffff16611ac061167e565b73ffffffffffffffffffffffffffffffffffffffff1614611b16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0d90613a7c565b60405180910390fd5b80600d8190555050565b611b31611b2b612138565b83612207565b611b70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6790613b3c565b60405180910390fd5b611b7c848484846127b4565b50505050565b6060611b8d826120cc565b611bcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc390613adc565b60405180910390fd5b60001515600e60019054906101000a900460ff1615151415611c7a57600a8054611bf590613e85565b80601f0160208091040260200160405190810160405280929190818152602001828054611c2190613e85565b8015611c6e5780601f10611c4357610100808354040283529160200191611c6e565b820191906000526020600020905b815481529060010190602001808311611c5157829003601f168201915b50505050509050611cd6565b6000611c84612810565b90506000815111611ca45760405180602001604052806000815250611cd2565b80611cae846128a2565b6009604051602001611cc2939291906137f0565b6040516020818303038152906040525b9150505b919050565b600c5481565b600e60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611d0f612138565b73ffffffffffffffffffffffffffffffffffffffff16611d2d61167e565b73ffffffffffffffffffffffffffffffffffffffff1614611d83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7a90613a7c565b60405180910390fd5b80600e60016101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b81600081118015611e475750600d548111155b611e86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7d9061395c565b60405180910390fd5b600c5481611e9460076121f9565b611e9e9190613cba565b1115611edf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed690613b1c565b60405180910390fd5b611ee7612138565b73ffffffffffffffffffffffffffffffffffffffff16611f0561167e565b73ffffffffffffffffffffffffffffffffffffffff1614611f5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5290613a7c565b60405180910390fd5b611f658284612607565b505050565b611f72612138565b73ffffffffffffffffffffffffffffffffffffffff16611f9061167e565b73ffffffffffffffffffffffffffffffffffffffff1614611fe6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fdd90613a7c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612056576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204d9061391c565b60405180910390fd5b61205f81612541565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166121b383611336565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6000612212826120cc565b612251576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612248906139bc565b60405180910390fd5b600061225c83611336565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806122cb57508373ffffffffffffffffffffffffffffffffffffffff166122b384610adb565b73ffffffffffffffffffffffffffffffffffffffff16145b806122dc57506122db8185611da0565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661230582611336565b73ffffffffffffffffffffffffffffffffffffffff161461235b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235290613abc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c29061397c565b60405180910390fd5b6123d6838383612a03565b6123e1600082612140565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124319190613d9b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124889190613cba565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60005b818110156126425761261c6007612a08565b61262f8361262a60076121f9565b612a1e565b808061263a90613ee8565b91505061260a565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156126b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ad9061399c565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516127a791906138bf565b60405180910390a3505050565b6127bf8484846122e5565b6127cb84848484612a3c565b61280a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612801906138fc565b60405180910390fd5b50505050565b60606008805461281f90613e85565b80601f016020809104026020016040519081016040528092919081815260200182805461284b90613e85565b80156128985780601f1061286d57610100808354040283529160200191612898565b820191906000526020600020905b81548152906001019060200180831161287b57829003601f168201915b5050505050905090565b606060008214156128ea576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506129fe565b600082905060005b6000821461291c57808061290590613ee8565b915050600a826129159190613d10565b91506128f2565b60008167ffffffffffffffff8111156129385761293761401e565b5b6040519080825280601f01601f19166020018201604052801561296a5781602001600182028036833780820191505090505b5090505b600085146129f7576001826129839190613d9b565b9150600a856129929190613f31565b603061299e9190613cba565b60f81b8183815181106129b4576129b3613fef565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856129f09190613d10565b945061296e565b8093505050505b919050565b505050565b6001816000016000828254019250508190555050565b612a38828260405180602001604052806000815250612bd3565b5050565b6000612a5d8473ffffffffffffffffffffffffffffffffffffffff16612c2e565b15612bc6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a86612138565b8786866040518563ffffffff1660e01b8152600401612aa89493929190613851565b602060405180830381600087803b158015612ac257600080fd5b505af1925050508015612af357506040513d601f19601f82011682018060405250810190612af0919061322d565b60015b612b76573d8060008114612b23576040519150601f19603f3d011682016040523d82523d6000602084013e612b28565b606091505b50600081511415612b6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b65906138fc565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612bcb565b600190505b949350505050565b612bdd8383612c41565b612bea6000848484612a3c565b612c29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c20906138fc565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612cb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca890613a3c565b60405180910390fd5b612cba816120cc565b15612cfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cf19061393c565b60405180910390fd5b612d0660008383612a03565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d569190613cba565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612e1b90613e85565b90600052602060002090601f016020900481019282612e3d5760008555612e84565b82601f10612e5657805160ff1916838001178555612e84565b82800160010185558215612e84579182015b82811115612e83578251825591602001919060010190612e68565b5b509050612e919190612e95565b5090565b5b80821115612eae576000816000905550600101612e96565b5090565b6000612ec5612ec084613bbc565b613b97565b905082815260208101848484011115612ee157612ee0614052565b5b612eec848285613e43565b509392505050565b6000612f07612f0284613bed565b613b97565b905082815260208101848484011115612f2357612f22614052565b5b612f2e848285613e43565b509392505050565b600081359050612f4581614571565b92915050565b600081359050612f5a81614588565b92915050565b600081359050612f6f8161459f565b92915050565b600081519050612f848161459f565b92915050565b600082601f830112612f9f57612f9e61404d565b5b8135612faf848260208601612eb2565b91505092915050565b600082601f830112612fcd57612fcc61404d565b5b8135612fdd848260208601612ef4565b91505092915050565b600081359050612ff5816145b6565b92915050565b60008151905061300a816145b6565b92915050565b6000602082840312156130265761302561405c565b5b600061303484828501612f36565b91505092915050565b600080604083850312156130545761305361405c565b5b600061306285828601612f36565b925050602061307385828601612f36565b9150509250929050565b6000806000606084860312156130965761309561405c565b5b60006130a486828701612f36565b93505060206130b586828701612f36565b92505060406130c686828701612fe6565b9150509250925092565b600080600080608085870312156130ea576130e961405c565b5b60006130f887828801612f36565b945050602061310987828801612f36565b935050604061311a87828801612fe6565b925050606085013567ffffffffffffffff81111561313b5761313a614057565b5b61314787828801612f8a565b91505092959194509250565b6000806040838503121561316a5761316961405c565b5b600061317885828601612f36565b925050602061318985828601612f4b565b9150509250929050565b600080604083850312156131aa576131a961405c565b5b60006131b885828601612f36565b92505060206131c985828601612fe6565b9150509250929050565b6000602082840312156131e9576131e861405c565b5b60006131f784828501612f4b565b91505092915050565b6000602082840312156132165761321561405c565b5b600061322484828501612f60565b91505092915050565b6000602082840312156132435761324261405c565b5b600061325184828501612f75565b91505092915050565b6000602082840312156132705761326f61405c565b5b600082013567ffffffffffffffff81111561328e5761328d614057565b5b61329a84828501612fb8565b91505092915050565b6000602082840312156132b9576132b861405c565b5b60006132c784828501612fe6565b91505092915050565b6000602082840312156132e6576132e561405c565b5b60006132f484828501612ffb565b91505092915050565b600080604083850312156133145761331361405c565b5b600061332285828601612fe6565b925050602061333385828601612f36565b9150509250929050565b600061334983836137d2565b60208301905092915050565b61335e81613dcf565b82525050565b600061336f82613c43565b6133798185613c71565b935061338483613c1e565b8060005b838110156133b557815161339c888261333d565b97506133a783613c64565b925050600181019050613388565b5085935050505092915050565b6133cb81613de1565b82525050565b60006133dc82613c4e565b6133e68185613c82565b93506133f6818560208601613e52565b6133ff81614061565b840191505092915050565b600061341582613c59565b61341f8185613c9e565b935061342f818560208601613e52565b61343881614061565b840191505092915050565b600061344e82613c59565b6134588185613caf565b9350613468818560208601613e52565b80840191505092915050565b6000815461348181613e85565b61348b8186613caf565b945060018216600081146134a657600181146134b7576134ea565b60ff198316865281860193506134ea565b6134c085613c2e565b60005b838110156134e2578154818901526001820191506020810190506134c3565b838801955050505b50505092915050565b6000613500603283613c9e565b915061350b82614072565b604082019050919050565b6000613523602683613c9e565b915061352e826140c1565b604082019050919050565b6000613546601c83613c9e565b915061355182614110565b602082019050919050565b6000613569601483613c9e565b915061357482614139565b602082019050919050565b600061358c602483613c9e565b915061359782614162565b604082019050919050565b60006135af601983613c9e565b91506135ba826141b1565b602082019050919050565b60006135d2602c83613c9e565b91506135dd826141da565b604082019050919050565b60006135f5603883613c9e565b915061360082614229565b604082019050919050565b6000613618602a83613c9e565b915061362382614278565b604082019050919050565b600061363b602983613c9e565b9150613646826142c7565b604082019050919050565b600061365e602083613c9e565b915061366982614316565b602082019050919050565b6000613681602c83613c9e565b915061368c8261433f565b604082019050919050565b60006136a4602083613c9e565b91506136af8261438e565b602082019050919050565b60006136c7601783613c9e565b91506136d2826143b7565b602082019050919050565b60006136ea602983613c9e565b91506136f5826143e0565b604082019050919050565b600061370d602f83613c9e565b91506137188261442f565b604082019050919050565b6000613730602183613c9e565b915061373b8261447e565b604082019050919050565b6000613753600083613c93565b915061375e826144cd565b600082019050919050565b6000613776601483613c9e565b9150613781826144d0565b602082019050919050565b6000613799603183613c9e565b91506137a4826144f9565b604082019050919050565b60006137bc601383613c9e565b91506137c782614548565b602082019050919050565b6137db81613e39565b82525050565b6137ea81613e39565b82525050565b60006137fc8286613443565b91506138088285613443565b91506138148284613474565b9150819050949350505050565b600061382c82613746565b9150819050919050565b600060208201905061384b6000830184613355565b92915050565b60006080820190506138666000830187613355565b6138736020830186613355565b61388060408301856137e1565b818103606083015261389281846133d1565b905095945050505050565b600060208201905081810360008301526138b78184613364565b905092915050565b60006020820190506138d460008301846133c2565b92915050565b600060208201905081810360008301526138f4818461340a565b905092915050565b60006020820190508181036000830152613915816134f3565b9050919050565b6000602082019050818103600083015261393581613516565b9050919050565b6000602082019050818103600083015261395581613539565b9050919050565b600060208201905081810360008301526139758161355c565b9050919050565b600060208201905081810360008301526139958161357f565b9050919050565b600060208201905081810360008301526139b5816135a2565b9050919050565b600060208201905081810360008301526139d5816135c5565b9050919050565b600060208201905081810360008301526139f5816135e8565b9050919050565b60006020820190508181036000830152613a158161360b565b9050919050565b60006020820190508181036000830152613a358161362e565b9050919050565b60006020820190508181036000830152613a5581613651565b9050919050565b60006020820190508181036000830152613a7581613674565b9050919050565b60006020820190508181036000830152613a9581613697565b9050919050565b60006020820190508181036000830152613ab5816136ba565b9050919050565b60006020820190508181036000830152613ad5816136dd565b9050919050565b60006020820190508181036000830152613af581613700565b9050919050565b60006020820190508181036000830152613b1581613723565b9050919050565b60006020820190508181036000830152613b3581613769565b9050919050565b60006020820190508181036000830152613b558161378c565b9050919050565b60006020820190508181036000830152613b75816137af565b9050919050565b6000602082019050613b9160008301846137e1565b92915050565b6000613ba1613bb2565b9050613bad8282613eb7565b919050565b6000604051905090565b600067ffffffffffffffff821115613bd757613bd661401e565b5b613be082614061565b9050602081019050919050565b600067ffffffffffffffff821115613c0857613c0761401e565b5b613c1182614061565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613cc582613e39565b9150613cd083613e39565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d0557613d04613f62565b5b828201905092915050565b6000613d1b82613e39565b9150613d2683613e39565b925082613d3657613d35613f91565b5b828204905092915050565b6000613d4c82613e39565b9150613d5783613e39565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613d9057613d8f613f62565b5b828202905092915050565b6000613da682613e39565b9150613db183613e39565b925082821015613dc457613dc3613f62565b5b828203905092915050565b6000613dda82613e19565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613e70578082015181840152602081019050613e55565b83811115613e7f576000848401525b50505050565b60006002820490506001821680613e9d57607f821691505b60208210811415613eb157613eb0613fc0565b5b50919050565b613ec082614061565b810181811067ffffffffffffffff82111715613edf57613ede61401e565b5b80604052505050565b6000613ef382613e39565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f2657613f25613f62565b5b600182019050919050565b6000613f3c82613e39565b9150613f4783613e39565b925082613f5757613f56613f91565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b61457a81613dcf565b811461458557600080fd5b50565b61459181613de1565b811461459c57600080fd5b50565b6145a881613ded565b81146145b357600080fd5b50565b6145bf81613e39565b81146145ca57600080fd5b5056fea26469706673582212201ccd56d3b626dbb4cf26f2cdcc3daa3c52065d5efcb0aa9c27ca89b130028e3b64736f6c63430008070033

Deployed Bytecode Sourcemap

37698:4802:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25183:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26128:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27687:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27210:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38181:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37966:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41540:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41646:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38845:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28437:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38211:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41729:143;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28847:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39850:635;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41080:74;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41296:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38117:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42400:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37888:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38086:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37855:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25822:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42247:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25552:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6171:103;;;;;;;;;;;;;:::i;:::-;;41434:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5520:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38041:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26297:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38942:733;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27980:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37926:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41160:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29103:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40493:494;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38005:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38151:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40993:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28206:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39689:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6429:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25183:305;25285:4;25337:25;25322:40;;;:11;:40;;;;:105;;;;25394:33;25379:48;;;:11;:48;;;;25322:105;:158;;;;25444:36;25468:11;25444:23;:36::i;:::-;25322:158;25302:178;;25183:305;;;:::o;26128:100::-;26182:13;26215:5;26208:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26128:100;:::o;27687:221::-;27763:7;27791:16;27799:7;27791;:16::i;:::-;27783:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27876:15;:24;27892:7;27876:24;;;;;;;;;;;;;;;;;;;;;27869:31;;27687:221;;;:::o;27210:411::-;27291:13;27307:23;27322:7;27307:14;:23::i;:::-;27291:39;;27355:5;27349:11;;:2;:11;;;;27341:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27449:5;27433:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27458:37;27475:5;27482:12;:10;:12::i;:::-;27458:16;:37::i;:::-;27433:62;27411:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;27592:21;27601:2;27605:7;27592:8;:21::i;:::-;27280:341;27210:411;;:::o;38181:25::-;;;;:::o;37966:34::-;;;;:::o;41540:100::-;5751:12;:10;:12::i;:::-;5740:23;;:7;:5;:7::i;:::-;:23;;;5732:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41624:10:::1;41612:9;:22;;;;;;;;;;;;:::i;:::-;;41540:100:::0;:::o;41646:77::-;5751:12;:10;:12::i;:::-;5740:23;;:7;:5;:7::i;:::-;:23;;;5732:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41711:6:::1;41702;;:15;;;;;;;;;;;;;;;;;;41646:77:::0;:::o;38845:89::-;38889:7;38912:16;:6;:14;:16::i;:::-;38905:23;;38845:89;:::o;28437:339::-;28632:41;28651:12;:10;:12::i;:::-;28665:7;28632:18;:41::i;:::-;28624:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28740:28;28750:4;28756:2;28760:7;28740:9;:28::i;:::-;28437:339;;;:::o;38211:26::-;;;;:::o;41729:143::-;5751:12;:10;:12::i;:::-;5740:23;;:7;:5;:7::i;:::-;:23;;;5732:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41791:7:::1;41812;:5;:7::i;:::-;41804:21;;41833:7;41804:42;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41790:56;;;41861:2;41853:11;;;::::0;::::1;;41781:91;41729:143:::0;:::o;28847:185::-;28985:39;29002:4;29008:2;29012:7;28985:39;;;;;;;;;;;;:16;:39::i;:::-;28847:185;;;:::o;39850:635::-;39925:16;39953:23;39979:17;39989:6;39979:9;:17::i;:::-;39953:43;;40003:30;40050:15;40036:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40003:63;;40073:22;40098:1;40073:26;;40106:23;40142:309;40167:15;40149;:33;:64;;;;;40204:9;;40186:14;:27;;40149:64;40142:309;;;40224:25;40252:23;40260:14;40252:7;:23::i;:::-;40224:51;;40311:6;40290:27;;:17;:27;;;40286:131;;;40363:14;40330:13;40344:15;40330:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;40390:17;;;;;:::i;:::-;;;;40286:131;40427:16;;;;;:::i;:::-;;;;40215:236;40142:309;;;40466:13;40459:20;;;;;;39850:635;;;:::o;41080:74::-;5751:12;:10;:12::i;:::-;5740:23;;:7;:5;:7::i;:::-;:23;;;5732:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41143:5:::1;41136:4;:12;;;;41080:74:::0;:::o;41296:132::-;5751:12;:10;:12::i;:::-;5740:23;;:7;:5;:7::i;:::-;:23;;;5732:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41404:18:::1;41384:17;:38;;;;;;;;;;;;:::i;:::-;;41296:132:::0;:::o;38117:27::-;;;;;;;;;;;;;:::o;42400:97::-;5751:12;:10;:12::i;:::-;5740:23;;:7;:5;:7::i;:::-;:23;;;5732:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42481:10:::1;42467:11;:24;;;;42400:97:::0;:::o;37888:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38086:26::-;;;;;;;;;;;;;:::o;37855:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25822:239::-;25894:7;25914:13;25930:7;:16;25938:7;25930:16;;;;;;;;;;;;;;;;;;;;;25914:32;;25982:1;25965:19;;:5;:19;;;;25957:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26048:5;26041:12;;;25822:239;;;:::o;42247:97::-;5751:12;:10;:12::i;:::-;5740:23;;:7;:5;:7::i;:::-;:23;;;5732:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42327:11:::1;42314:10;;:24;;;;;;;;;;;;;;;;;;42247:97:::0;:::o;25552:208::-;25624:7;25669:1;25652:19;;:5;:19;;;;25644:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;25736:9;:16;25746:5;25736:16;;;;;;;;;;;;;;;;25729:23;;25552:208;;;:::o;6171:103::-;5751:12;:10;:12::i;:::-;5740:23;;:7;:5;:7::i;:::-;:23;;;5732:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6236:30:::1;6263:1;6236:18;:30::i;:::-;6171:103::o:0;41434:100::-;5751:12;:10;:12::i;:::-;5740:23;;:7;:5;:7::i;:::-;:23;;;5732:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41518:10:::1;41506:9;:22;;;;;;;;;;;;:::i;:::-;;41434:100:::0;:::o;5520:87::-;5566:7;5593:6;;;;;;;;;;;5586:13;;5520:87;:::o;38041:38::-;;;;:::o;26297:104::-;26353:13;26386:7;26379:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26297:104;:::o;38942:733::-;39007:11;38679:1;38665:11;:15;:52;;;;;38699:18;;38684:11;:33;;38665:52;38657:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;38791:9;;38776:11;38757:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:43;;38749:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;39036:6:::1;;;;;;;;;;;39035:7;39027:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;39125:16;39152:10;;;;;;;;;;;39125:38;;39212:22;39237:8;:18;;;39256:10;39237:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39212:55;;39361:1;39343:14;:19;;:48;;;;;39390:1;39366:21;39376:10;39366:9;:21::i;:::-;:25;39343:48;:76;;;;;39408:11;;39395:10;;:24;39343:76;39339:283;;;39475:1;39461:11;:15;;;;:::i;:::-;39453:4;;:24;;;;:::i;:::-;39440:9;:37;;39432:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;39512:10;;:12;;;;;;;;;:::i;:::-;;;;;;39339:283;;;39579:11;39572:4;;:18;;;;:::i;:::-;39559:9;:31;;39551:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;39339:283;39635:34;39645:10;39657:11;39635:9;:34::i;:::-;39020:655;;38942:733:::0;;:::o;27980:155::-;28075:52;28094:12;:10;:12::i;:::-;28108:8;28118;28075:18;:52::i;:::-;27980:155;;:::o;37926:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;41160:130::-;5751:12;:10;:12::i;:::-;5740:23;;:7;:5;:7::i;:::-;:23;;;5732:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41265:19:::1;41244:18;:40;;;;41160:130:::0;:::o;29103:328::-;29278:41;29297:12;:10;:12::i;:::-;29311:7;29278:18;:41::i;:::-;29270:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29384:39;29398:4;29404:2;29408:7;29417:5;29384:13;:39::i;:::-;29103:328;;;;:::o;40493:494::-;40592:13;40633:17;40641:8;40633:7;:17::i;:::-;40617:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;40740:5;40728:17;;:8;;;;;;;;;;;:17;;;40724:64;;;40763:17;40756:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40724:64;40796:28;40827:10;:8;:10::i;:::-;40796:41;;40882:1;40857:14;40851:28;:32;:130;;;;;;;;;;;;;;;;;40919:14;40935:19;:8;:17;:19::i;:::-;40956:9;40902:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40851:130;40844:137;;;40493:494;;;;:::o;38005:31::-;;;;:::o;38151:25::-;;;;;;;;;;;;;:::o;40993:81::-;5751:12;:10;:12::i;:::-;5740:23;;:7;:5;:7::i;:::-;:23;;;5732:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41062:6:::1;41051:8;;:17;;;;;;;;;;;;;;;;;;40993:81:::0;:::o;28206:164::-;28303:4;28327:18;:25;28346:5;28327:25;;;;;;;;;;;;;;;:35;28353:8;28327:35;;;;;;;;;;;;;;;;;;;;;;;;;28320:42;;28206:164;;;;:::o;39689:155::-;39775:11;38679:1;38665:11;:15;:52;;;;;38699:18;;38684:11;:33;;38665:52;38657:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;38791:9;;38776:11;38757:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:43;;38749:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;5751:12:::1;:10;:12::i;:::-;5740:23;;:7;:5;:7::i;:::-;:23;;;5732:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39805:33:::2;39815:9;39826:11;39805:9;:33::i;:::-;39689:155:::0;;;:::o;6429:201::-;5751:12;:10;:12::i;:::-;5740:23;;:7;:5;:7::i;:::-;:23;;;5732:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6538:1:::1;6518:22;;:8;:22;;;;6510:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;6594:28;6613:8;6594:18;:28::i;:::-;6429:201:::0;:::o;17952:157::-;18037:4;18076:25;18061:40;;;:11;:40;;;;18054:47;;17952:157;;;:::o;30941:127::-;31006:4;31058:1;31030:30;;:7;:16;31038:7;31030:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31023:37;;30941:127;;;:::o;4244:98::-;4297:7;4324:10;4317:17;;4244:98;:::o;34923:174::-;35025:2;34998:15;:24;35014:7;34998:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35081:7;35077:2;35043:46;;35052:23;35067:7;35052:14;:23::i;:::-;35043:46;;;;;;;;;;;;34923:174;;:::o;848:114::-;913:7;940;:14;;;933:21;;848:114;;;:::o;31235:348::-;31328:4;31353:16;31361:7;31353;:16::i;:::-;31345:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31429:13;31445:23;31460:7;31445:14;:23::i;:::-;31429:39;;31498:5;31487:16;;:7;:16;;;:51;;;;31531:7;31507:31;;:20;31519:7;31507:11;:20::i;:::-;:31;;;31487:51;:87;;;;31542:32;31559:5;31566:7;31542:16;:32::i;:::-;31487:87;31479:96;;;31235:348;;;;:::o;34227:578::-;34386:4;34359:31;;:23;34374:7;34359:14;:23::i;:::-;:31;;;34351:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;34469:1;34455:16;;:2;:16;;;;34447:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34525:39;34546:4;34552:2;34556:7;34525:20;:39::i;:::-;34629:29;34646:1;34650:7;34629:8;:29::i;:::-;34690:1;34671:9;:15;34681:4;34671:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34719:1;34702:9;:13;34712:2;34702:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34750:2;34731:7;:16;34739:7;34731:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34789:7;34785:2;34770:27;;34779:4;34770:27;;;;;;;;;;;;34227:578;;;:::o;6790:191::-;6864:16;6883:6;;;;;;;;;;;6864:25;;6909:8;6900:6;;:17;;;;;;;;;;;;;;;;;;6964:8;6933:40;;6954:8;6933:40;;;;;;;;;;;;6853:128;6790:191;:::o;41878:204::-;41958:9;41953:124;41977:11;41973:1;:15;41953:124;;;42004:18;:6;:16;:18::i;:::-;42031:38;42041:9;42052:16;:6;:14;:16::i;:::-;42031:9;:38::i;:::-;41990:3;;;;;:::i;:::-;;;;41953:124;;;;41878:204;;:::o;35239:315::-;35394:8;35385:17;;:5;:17;;;;35377:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;35481:8;35443:18;:25;35462:5;35443:25;;;;;;;;;;;;;;;:35;35469:8;35443:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;35527:8;35505:41;;35520:5;35505:41;;;35537:8;35505:41;;;;;;:::i;:::-;;;;;;;;35239:315;;;:::o;30313:::-;30470:28;30480:4;30486:2;30490:7;30470:9;:28::i;:::-;30517:48;30540:4;30546:2;30550:7;30559:5;30517:22;:48::i;:::-;30509:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;30313:315;;;;:::o;42088:104::-;42148:13;42177:9;42170:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42088:104;:::o;1806:723::-;1862:13;2092:1;2083:5;:10;2079:53;;;2110:10;;;;;;;;;;;;;;;;;;;;;2079:53;2142:12;2157:5;2142:20;;2173:14;2198:78;2213:1;2205:4;:9;2198:78;;2231:8;;;;;:::i;:::-;;;;2262:2;2254:10;;;;;:::i;:::-;;;2198:78;;;2286:19;2318:6;2308:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2286:39;;2336:154;2352:1;2343:5;:10;2336:154;;2380:1;2370:11;;;;;:::i;:::-;;;2447:2;2439:5;:10;;;;:::i;:::-;2426:2;:24;;;;:::i;:::-;2413:39;;2396:6;2403;2396:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2476:2;2467:11;;;;;:::i;:::-;;;2336:154;;;2514:6;2500:21;;;;;1806:723;;;;:::o;37490:126::-;;;;:::o;970:127::-;1077:1;1059:7;:14;;;:19;;;;;;;;;;;970:127;:::o;31925:110::-;32001:26;32011:2;32015:7;32001:26;;;;;;;;;;;;:9;:26::i;:::-;31925:110;;:::o;36119:799::-;36274:4;36295:15;:2;:13;;;:15::i;:::-;36291:620;;;36347:2;36331:36;;;36368:12;:10;:12::i;:::-;36382:4;36388:7;36397:5;36331:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36327:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36590:1;36573:6;:13;:18;36569:272;;;36616:60;;;;;;;;;;:::i;:::-;;;;;;;;36569:272;36791:6;36785:13;36776:6;36772:2;36768:15;36761:38;36327:529;36464:41;;;36454:51;;;:6;:51;;;;36447:58;;;;;36291:620;36895:4;36888:11;;36119:799;;;;;;;:::o;32262:321::-;32392:18;32398:2;32402:7;32392:5;:18::i;:::-;32443:54;32474:1;32478:2;32482:7;32491:5;32443:22;:54::i;:::-;32421:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;32262:321;;;:::o;7808:387::-;7868:4;8076:12;8143:7;8131:20;8123:28;;8186:1;8179:4;:8;8172:15;;;7808:387;;;:::o;32919:382::-;33013:1;32999:16;;:2;:16;;;;32991:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33072:16;33080:7;33072;:16::i;:::-;33071:17;33063:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33134:45;33163:1;33167:2;33171:7;33134:20;:45::i;:::-;33209:1;33192:9;:13;33202:2;33192:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33240:2;33221:7;:16;33229:7;33221:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33285:7;33281:2;33260:33;;33277:1;33260:33;;;;;;;;;;;;32919:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:143::-;2334:5;2365:6;2359:13;2350:22;;2381:33;2408:5;2381:33;:::i;:::-;2277:143;;;;:::o;2426:329::-;2485:6;2534:2;2522:9;2513:7;2509:23;2505:32;2502:119;;;2540:79;;:::i;:::-;2502:119;2660:1;2685:53;2730:7;2721:6;2710:9;2706:22;2685:53;:::i;:::-;2675:63;;2631:117;2426:329;;;;:::o;2761:474::-;2829:6;2837;2886:2;2874:9;2865:7;2861:23;2857:32;2854:119;;;2892:79;;:::i;:::-;2854:119;3012:1;3037:53;3082:7;3073:6;3062:9;3058:22;3037:53;:::i;:::-;3027:63;;2983:117;3139:2;3165:53;3210:7;3201:6;3190:9;3186:22;3165:53;:::i;:::-;3155:63;;3110:118;2761:474;;;;;:::o;3241:619::-;3318:6;3326;3334;3383:2;3371:9;3362:7;3358:23;3354:32;3351:119;;;3389:79;;:::i;:::-;3351:119;3509:1;3534:53;3579:7;3570:6;3559:9;3555:22;3534:53;:::i;:::-;3524:63;;3480:117;3636:2;3662:53;3707:7;3698:6;3687:9;3683:22;3662:53;:::i;:::-;3652:63;;3607:118;3764:2;3790:53;3835:7;3826:6;3815:9;3811:22;3790:53;:::i;:::-;3780:63;;3735:118;3241:619;;;;;:::o;3866:943::-;3961:6;3969;3977;3985;4034:3;4022:9;4013:7;4009:23;4005:33;4002:120;;;4041:79;;:::i;:::-;4002:120;4161:1;4186:53;4231:7;4222:6;4211:9;4207:22;4186:53;:::i;:::-;4176:63;;4132:117;4288:2;4314:53;4359:7;4350:6;4339:9;4335:22;4314:53;:::i;:::-;4304:63;;4259:118;4416:2;4442:53;4487:7;4478:6;4467:9;4463:22;4442:53;:::i;:::-;4432:63;;4387:118;4572:2;4561:9;4557:18;4544:32;4603:18;4595:6;4592:30;4589:117;;;4625:79;;:::i;:::-;4589:117;4730:62;4784:7;4775:6;4764:9;4760:22;4730:62;:::i;:::-;4720:72;;4515:287;3866:943;;;;;;;:::o;4815:468::-;4880:6;4888;4937:2;4925:9;4916:7;4912:23;4908:32;4905:119;;;4943:79;;:::i;:::-;4905:119;5063:1;5088:53;5133:7;5124:6;5113:9;5109:22;5088:53;:::i;:::-;5078:63;;5034:117;5190:2;5216:50;5258:7;5249:6;5238:9;5234:22;5216:50;:::i;:::-;5206:60;;5161:115;4815:468;;;;;:::o;5289:474::-;5357:6;5365;5414:2;5402:9;5393:7;5389:23;5385:32;5382:119;;;5420:79;;:::i;:::-;5382:119;5540:1;5565:53;5610:7;5601:6;5590:9;5586:22;5565:53;:::i;:::-;5555:63;;5511:117;5667:2;5693:53;5738:7;5729:6;5718:9;5714:22;5693:53;:::i;:::-;5683:63;;5638:118;5289:474;;;;;:::o;5769:323::-;5825:6;5874:2;5862:9;5853:7;5849:23;5845:32;5842:119;;;5880:79;;:::i;:::-;5842:119;6000:1;6025:50;6067:7;6058:6;6047:9;6043:22;6025:50;:::i;:::-;6015:60;;5971:114;5769:323;;;;:::o;6098:327::-;6156:6;6205:2;6193:9;6184:7;6180:23;6176:32;6173:119;;;6211:79;;:::i;:::-;6173:119;6331:1;6356:52;6400:7;6391:6;6380:9;6376:22;6356:52;:::i;:::-;6346:62;;6302:116;6098:327;;;;:::o;6431:349::-;6500:6;6549:2;6537:9;6528:7;6524:23;6520:32;6517:119;;;6555:79;;:::i;:::-;6517:119;6675:1;6700:63;6755:7;6746:6;6735:9;6731:22;6700:63;:::i;:::-;6690:73;;6646:127;6431:349;;;;:::o;6786:509::-;6855:6;6904:2;6892:9;6883:7;6879:23;6875:32;6872:119;;;6910:79;;:::i;:::-;6872:119;7058:1;7047:9;7043:17;7030:31;7088:18;7080:6;7077:30;7074:117;;;7110:79;;:::i;:::-;7074:117;7215:63;7270:7;7261:6;7250:9;7246:22;7215:63;:::i;:::-;7205:73;;7001:287;6786:509;;;;:::o;7301:329::-;7360:6;7409:2;7397:9;7388:7;7384:23;7380:32;7377:119;;;7415:79;;:::i;:::-;7377:119;7535:1;7560:53;7605:7;7596:6;7585:9;7581:22;7560:53;:::i;:::-;7550:63;;7506:117;7301:329;;;;:::o;7636:351::-;7706:6;7755:2;7743:9;7734:7;7730:23;7726:32;7723:119;;;7761:79;;:::i;:::-;7723:119;7881:1;7906:64;7962:7;7953:6;7942:9;7938:22;7906:64;:::i;:::-;7896:74;;7852:128;7636:351;;;;:::o;7993:474::-;8061:6;8069;8118:2;8106:9;8097:7;8093:23;8089:32;8086:119;;;8124:79;;:::i;:::-;8086:119;8244:1;8269:53;8314:7;8305:6;8294:9;8290:22;8269:53;:::i;:::-;8259:63;;8215:117;8371:2;8397:53;8442:7;8433:6;8422:9;8418:22;8397:53;:::i;:::-;8387:63;;8342:118;7993:474;;;;;:::o;8473:179::-;8542:10;8563:46;8605:3;8597:6;8563:46;:::i;:::-;8641:4;8636:3;8632:14;8618:28;;8473:179;;;;:::o;8658:118::-;8745:24;8763:5;8745:24;:::i;:::-;8740:3;8733:37;8658:118;;:::o;8812:732::-;8931:3;8960:54;9008:5;8960:54;:::i;:::-;9030:86;9109:6;9104:3;9030:86;:::i;:::-;9023:93;;9140:56;9190:5;9140:56;:::i;:::-;9219:7;9250:1;9235:284;9260:6;9257:1;9254:13;9235:284;;;9336:6;9330:13;9363:63;9422:3;9407:13;9363:63;:::i;:::-;9356:70;;9449:60;9502:6;9449:60;:::i;:::-;9439:70;;9295:224;9282:1;9279;9275:9;9270:14;;9235:284;;;9239:14;9535:3;9528:10;;8936:608;;;8812:732;;;;:::o;9550:109::-;9631:21;9646:5;9631:21;:::i;:::-;9626:3;9619:34;9550:109;;:::o;9665:360::-;9751:3;9779:38;9811:5;9779:38;:::i;:::-;9833:70;9896:6;9891:3;9833:70;:::i;:::-;9826:77;;9912:52;9957:6;9952:3;9945:4;9938:5;9934:16;9912:52;:::i;:::-;9989:29;10011:6;9989:29;:::i;:::-;9984:3;9980:39;9973:46;;9755:270;9665:360;;;;:::o;10031:364::-;10119:3;10147:39;10180:5;10147:39;:::i;:::-;10202:71;10266:6;10261:3;10202:71;:::i;:::-;10195:78;;10282:52;10327:6;10322:3;10315:4;10308:5;10304:16;10282:52;:::i;:::-;10359:29;10381:6;10359:29;:::i;:::-;10354:3;10350:39;10343:46;;10123:272;10031:364;;;;:::o;10401:377::-;10507:3;10535:39;10568:5;10535:39;:::i;:::-;10590:89;10672:6;10667:3;10590:89;:::i;:::-;10583:96;;10688:52;10733:6;10728:3;10721:4;10714:5;10710:16;10688:52;:::i;:::-;10765:6;10760:3;10756:16;10749:23;;10511:267;10401:377;;;;:::o;10808:845::-;10911:3;10948:5;10942:12;10977:36;11003:9;10977:36;:::i;:::-;11029:89;11111:6;11106:3;11029:89;:::i;:::-;11022:96;;11149:1;11138:9;11134:17;11165:1;11160:137;;;;11311:1;11306:341;;;;11127:520;;11160:137;11244:4;11240:9;11229;11225:25;11220:3;11213:38;11280:6;11275:3;11271:16;11264:23;;11160:137;;11306:341;11373:38;11405:5;11373:38;:::i;:::-;11433:1;11447:154;11461:6;11458:1;11455:13;11447:154;;;11535:7;11529:14;11525:1;11520:3;11516:11;11509:35;11585:1;11576:7;11572:15;11561:26;;11483:4;11480:1;11476:12;11471:17;;11447:154;;;11630:6;11625:3;11621:16;11614:23;;11313:334;;11127:520;;10915:738;;10808:845;;;;:::o;11659:366::-;11801:3;11822:67;11886:2;11881:3;11822:67;:::i;:::-;11815:74;;11898:93;11987:3;11898:93;:::i;:::-;12016:2;12011:3;12007:12;12000:19;;11659:366;;;:::o;12031:::-;12173:3;12194:67;12258:2;12253:3;12194:67;:::i;:::-;12187:74;;12270:93;12359:3;12270:93;:::i;:::-;12388:2;12383:3;12379:12;12372:19;;12031:366;;;:::o;12403:::-;12545:3;12566:67;12630:2;12625:3;12566:67;:::i;:::-;12559:74;;12642:93;12731:3;12642:93;:::i;:::-;12760:2;12755:3;12751:12;12744:19;;12403:366;;;:::o;12775:::-;12917:3;12938:67;13002:2;12997:3;12938:67;:::i;:::-;12931:74;;13014:93;13103:3;13014:93;:::i;:::-;13132:2;13127:3;13123:12;13116:19;;12775:366;;;:::o;13147:::-;13289:3;13310:67;13374:2;13369:3;13310:67;:::i;:::-;13303:74;;13386:93;13475:3;13386:93;:::i;:::-;13504:2;13499:3;13495:12;13488:19;;13147:366;;;:::o;13519:::-;13661:3;13682:67;13746:2;13741:3;13682:67;:::i;:::-;13675:74;;13758:93;13847:3;13758:93;:::i;:::-;13876:2;13871:3;13867:12;13860:19;;13519:366;;;:::o;13891:::-;14033:3;14054:67;14118:2;14113:3;14054:67;:::i;:::-;14047:74;;14130:93;14219:3;14130:93;:::i;:::-;14248:2;14243:3;14239:12;14232:19;;13891:366;;;:::o;14263:::-;14405:3;14426:67;14490:2;14485:3;14426:67;:::i;:::-;14419:74;;14502:93;14591:3;14502:93;:::i;:::-;14620:2;14615:3;14611:12;14604:19;;14263:366;;;:::o;14635:::-;14777:3;14798:67;14862:2;14857:3;14798:67;:::i;:::-;14791:74;;14874:93;14963:3;14874:93;:::i;:::-;14992:2;14987:3;14983:12;14976:19;;14635:366;;;:::o;15007:::-;15149:3;15170:67;15234:2;15229:3;15170:67;:::i;:::-;15163:74;;15246:93;15335:3;15246:93;:::i;:::-;15364:2;15359:3;15355:12;15348:19;;15007:366;;;:::o;15379:::-;15521:3;15542:67;15606:2;15601:3;15542:67;:::i;:::-;15535:74;;15618:93;15707:3;15618:93;:::i;:::-;15736:2;15731:3;15727:12;15720:19;;15379:366;;;:::o;15751:::-;15893:3;15914:67;15978:2;15973:3;15914:67;:::i;:::-;15907:74;;15990:93;16079:3;15990:93;:::i;:::-;16108:2;16103:3;16099:12;16092:19;;15751:366;;;:::o;16123:::-;16265:3;16286:67;16350:2;16345:3;16286:67;:::i;:::-;16279:74;;16362:93;16451:3;16362:93;:::i;:::-;16480:2;16475:3;16471:12;16464:19;;16123:366;;;:::o;16495:::-;16637:3;16658:67;16722:2;16717:3;16658:67;:::i;:::-;16651:74;;16734:93;16823:3;16734:93;:::i;:::-;16852:2;16847:3;16843:12;16836:19;;16495:366;;;:::o;16867:::-;17009:3;17030:67;17094:2;17089:3;17030:67;:::i;:::-;17023:74;;17106:93;17195:3;17106:93;:::i;:::-;17224:2;17219:3;17215:12;17208:19;;16867:366;;;:::o;17239:::-;17381:3;17402:67;17466:2;17461:3;17402:67;:::i;:::-;17395:74;;17478:93;17567:3;17478:93;:::i;:::-;17596:2;17591:3;17587:12;17580:19;;17239:366;;;:::o;17611:::-;17753:3;17774:67;17838:2;17833:3;17774:67;:::i;:::-;17767:74;;17850:93;17939:3;17850:93;:::i;:::-;17968:2;17963:3;17959:12;17952:19;;17611:366;;;:::o;17983:398::-;18142:3;18163:83;18244:1;18239:3;18163:83;:::i;:::-;18156:90;;18255:93;18344:3;18255:93;:::i;:::-;18373:1;18368:3;18364:11;18357:18;;17983:398;;;:::o;18387:366::-;18529:3;18550:67;18614:2;18609:3;18550:67;:::i;:::-;18543:74;;18626:93;18715:3;18626:93;:::i;:::-;18744:2;18739:3;18735:12;18728:19;;18387:366;;;:::o;18759:::-;18901:3;18922:67;18986:2;18981:3;18922:67;:::i;:::-;18915:74;;18998:93;19087:3;18998:93;:::i;:::-;19116:2;19111:3;19107:12;19100:19;;18759:366;;;:::o;19131:::-;19273:3;19294:67;19358:2;19353:3;19294:67;:::i;:::-;19287:74;;19370:93;19459:3;19370:93;:::i;:::-;19488:2;19483:3;19479:12;19472:19;;19131:366;;;:::o;19503:108::-;19580:24;19598:5;19580:24;:::i;:::-;19575:3;19568:37;19503:108;;:::o;19617:118::-;19704:24;19722:5;19704:24;:::i;:::-;19699:3;19692:37;19617:118;;:::o;19741:589::-;19966:3;19988:95;20079:3;20070:6;19988:95;:::i;:::-;19981:102;;20100:95;20191:3;20182:6;20100:95;:::i;:::-;20093:102;;20212:92;20300:3;20291:6;20212:92;:::i;:::-;20205:99;;20321:3;20314:10;;19741:589;;;;;;:::o;20336:379::-;20520:3;20542:147;20685:3;20542:147;:::i;:::-;20535:154;;20706:3;20699:10;;20336:379;;;:::o;20721:222::-;20814:4;20852:2;20841:9;20837:18;20829:26;;20865:71;20933:1;20922:9;20918:17;20909:6;20865:71;:::i;:::-;20721:222;;;;:::o;20949:640::-;21144:4;21182:3;21171:9;21167:19;21159:27;;21196:71;21264:1;21253:9;21249:17;21240:6;21196:71;:::i;:::-;21277:72;21345:2;21334:9;21330:18;21321:6;21277:72;:::i;:::-;21359;21427:2;21416:9;21412:18;21403:6;21359:72;:::i;:::-;21478:9;21472:4;21468:20;21463:2;21452:9;21448:18;21441:48;21506:76;21577:4;21568:6;21506:76;:::i;:::-;21498:84;;20949:640;;;;;;;:::o;21595:373::-;21738:4;21776:2;21765:9;21761:18;21753:26;;21825:9;21819:4;21815:20;21811:1;21800:9;21796:17;21789:47;21853:108;21956:4;21947:6;21853:108;:::i;:::-;21845:116;;21595:373;;;;:::o;21974:210::-;22061:4;22099:2;22088:9;22084:18;22076:26;;22112:65;22174:1;22163:9;22159:17;22150:6;22112:65;:::i;:::-;21974:210;;;;:::o;22190:313::-;22303:4;22341:2;22330:9;22326:18;22318:26;;22390:9;22384:4;22380:20;22376:1;22365:9;22361:17;22354:47;22418:78;22491:4;22482:6;22418:78;:::i;:::-;22410:86;;22190:313;;;;:::o;22509:419::-;22675:4;22713:2;22702:9;22698:18;22690:26;;22762:9;22756:4;22752:20;22748:1;22737:9;22733:17;22726:47;22790:131;22916:4;22790:131;:::i;:::-;22782:139;;22509:419;;;:::o;22934:::-;23100:4;23138:2;23127:9;23123:18;23115:26;;23187:9;23181:4;23177:20;23173:1;23162:9;23158:17;23151:47;23215:131;23341:4;23215:131;:::i;:::-;23207:139;;22934:419;;;:::o;23359:::-;23525:4;23563:2;23552:9;23548:18;23540:26;;23612:9;23606:4;23602:20;23598:1;23587:9;23583:17;23576:47;23640:131;23766:4;23640:131;:::i;:::-;23632:139;;23359:419;;;:::o;23784:::-;23950:4;23988:2;23977:9;23973:18;23965:26;;24037:9;24031:4;24027:20;24023:1;24012:9;24008:17;24001:47;24065:131;24191:4;24065:131;:::i;:::-;24057:139;;23784:419;;;:::o;24209:::-;24375:4;24413:2;24402:9;24398:18;24390:26;;24462:9;24456:4;24452:20;24448:1;24437:9;24433:17;24426:47;24490:131;24616:4;24490:131;:::i;:::-;24482:139;;24209:419;;;:::o;24634:::-;24800:4;24838:2;24827:9;24823:18;24815:26;;24887:9;24881:4;24877:20;24873:1;24862:9;24858:17;24851:47;24915:131;25041:4;24915:131;:::i;:::-;24907:139;;24634:419;;;:::o;25059:::-;25225:4;25263:2;25252:9;25248:18;25240:26;;25312:9;25306:4;25302:20;25298:1;25287:9;25283:17;25276:47;25340:131;25466:4;25340:131;:::i;:::-;25332:139;;25059:419;;;:::o;25484:::-;25650:4;25688:2;25677:9;25673:18;25665:26;;25737:9;25731:4;25727:20;25723:1;25712:9;25708:17;25701:47;25765:131;25891:4;25765:131;:::i;:::-;25757:139;;25484:419;;;:::o;25909:::-;26075:4;26113:2;26102:9;26098:18;26090:26;;26162:9;26156:4;26152:20;26148:1;26137:9;26133:17;26126:47;26190:131;26316:4;26190:131;:::i;:::-;26182:139;;25909:419;;;:::o;26334:::-;26500:4;26538:2;26527:9;26523:18;26515:26;;26587:9;26581:4;26577:20;26573:1;26562:9;26558:17;26551:47;26615:131;26741:4;26615:131;:::i;:::-;26607:139;;26334:419;;;:::o;26759:::-;26925:4;26963:2;26952:9;26948:18;26940:26;;27012:9;27006:4;27002:20;26998:1;26987:9;26983:17;26976:47;27040:131;27166:4;27040:131;:::i;:::-;27032:139;;26759:419;;;:::o;27184:::-;27350:4;27388:2;27377:9;27373:18;27365:26;;27437:9;27431:4;27427:20;27423:1;27412:9;27408:17;27401:47;27465:131;27591:4;27465:131;:::i;:::-;27457:139;;27184:419;;;:::o;27609:::-;27775:4;27813:2;27802:9;27798:18;27790:26;;27862:9;27856:4;27852:20;27848:1;27837:9;27833:17;27826:47;27890:131;28016:4;27890:131;:::i;:::-;27882:139;;27609:419;;;:::o;28034:::-;28200:4;28238:2;28227:9;28223:18;28215:26;;28287:9;28281:4;28277:20;28273:1;28262:9;28258:17;28251:47;28315:131;28441:4;28315:131;:::i;:::-;28307:139;;28034:419;;;:::o;28459:::-;28625:4;28663:2;28652:9;28648:18;28640:26;;28712:9;28706:4;28702:20;28698:1;28687:9;28683:17;28676:47;28740:131;28866:4;28740:131;:::i;:::-;28732:139;;28459:419;;;:::o;28884:::-;29050:4;29088:2;29077:9;29073:18;29065:26;;29137:9;29131:4;29127:20;29123:1;29112:9;29108:17;29101:47;29165:131;29291:4;29165:131;:::i;:::-;29157:139;;28884:419;;;:::o;29309:::-;29475:4;29513:2;29502:9;29498:18;29490:26;;29562:9;29556:4;29552:20;29548:1;29537:9;29533:17;29526:47;29590:131;29716:4;29590:131;:::i;:::-;29582:139;;29309:419;;;:::o;29734:::-;29900:4;29938:2;29927:9;29923:18;29915:26;;29987:9;29981:4;29977:20;29973:1;29962:9;29958:17;29951:47;30015:131;30141:4;30015:131;:::i;:::-;30007:139;;29734:419;;;:::o;30159:::-;30325:4;30363:2;30352:9;30348:18;30340:26;;30412:9;30406:4;30402:20;30398:1;30387:9;30383:17;30376:47;30440:131;30566:4;30440:131;:::i;:::-;30432:139;;30159:419;;;:::o;30584:::-;30750:4;30788:2;30777:9;30773:18;30765:26;;30837:9;30831:4;30827:20;30823:1;30812:9;30808:17;30801:47;30865:131;30991:4;30865:131;:::i;:::-;30857:139;;30584:419;;;:::o;31009:222::-;31102:4;31140:2;31129:9;31125:18;31117:26;;31153:71;31221:1;31210:9;31206:17;31197:6;31153:71;:::i;:::-;31009:222;;;;:::o;31237:129::-;31271:6;31298:20;;:::i;:::-;31288:30;;31327:33;31355:4;31347:6;31327:33;:::i;:::-;31237:129;;;:::o;31372:75::-;31405:6;31438:2;31432:9;31422:19;;31372:75;:::o;31453:307::-;31514:4;31604:18;31596:6;31593:30;31590:56;;;31626:18;;:::i;:::-;31590:56;31664:29;31686:6;31664:29;:::i;:::-;31656:37;;31748:4;31742;31738:15;31730:23;;31453:307;;;:::o;31766:308::-;31828:4;31918:18;31910:6;31907:30;31904:56;;;31940:18;;:::i;:::-;31904:56;31978:29;32000:6;31978:29;:::i;:::-;31970:37;;32062:4;32056;32052:15;32044:23;;31766:308;;;:::o;32080:132::-;32147:4;32170:3;32162:11;;32200:4;32195:3;32191:14;32183:22;;32080:132;;;:::o;32218:141::-;32267:4;32290:3;32282:11;;32313:3;32310:1;32303:14;32347:4;32344:1;32334:18;32326:26;;32218:141;;;:::o;32365:114::-;32432:6;32466:5;32460:12;32450:22;;32365:114;;;:::o;32485:98::-;32536:6;32570:5;32564:12;32554:22;;32485:98;;;:::o;32589:99::-;32641:6;32675:5;32669:12;32659:22;;32589:99;;;:::o;32694:113::-;32764:4;32796;32791:3;32787:14;32779:22;;32694:113;;;:::o;32813:184::-;32912:11;32946:6;32941:3;32934:19;32986:4;32981:3;32977:14;32962:29;;32813:184;;;;:::o;33003:168::-;33086:11;33120:6;33115:3;33108:19;33160:4;33155:3;33151:14;33136:29;;33003:168;;;;:::o;33177:147::-;33278:11;33315:3;33300:18;;33177:147;;;;:::o;33330:169::-;33414:11;33448:6;33443:3;33436:19;33488:4;33483:3;33479:14;33464:29;;33330:169;;;;:::o;33505:148::-;33607:11;33644:3;33629:18;;33505:148;;;;:::o;33659:305::-;33699:3;33718:20;33736:1;33718:20;:::i;:::-;33713:25;;33752:20;33770:1;33752:20;:::i;:::-;33747:25;;33906:1;33838:66;33834:74;33831:1;33828:81;33825:107;;;33912:18;;:::i;:::-;33825:107;33956:1;33953;33949:9;33942:16;;33659:305;;;;:::o;33970:185::-;34010:1;34027:20;34045:1;34027:20;:::i;:::-;34022:25;;34061:20;34079:1;34061:20;:::i;:::-;34056:25;;34100:1;34090:35;;34105:18;;:::i;:::-;34090:35;34147:1;34144;34140:9;34135:14;;33970:185;;;;:::o;34161:348::-;34201:7;34224:20;34242:1;34224:20;:::i;:::-;34219:25;;34258:20;34276:1;34258:20;:::i;:::-;34253:25;;34446:1;34378:66;34374:74;34371:1;34368:81;34363:1;34356:9;34349:17;34345:105;34342:131;;;34453:18;;:::i;:::-;34342:131;34501:1;34498;34494:9;34483:20;;34161:348;;;;:::o;34515:191::-;34555:4;34575:20;34593:1;34575:20;:::i;:::-;34570:25;;34609:20;34627:1;34609:20;:::i;:::-;34604:25;;34648:1;34645;34642:8;34639:34;;;34653:18;;:::i;:::-;34639:34;34698:1;34695;34691:9;34683:17;;34515:191;;;;:::o;34712:96::-;34749:7;34778:24;34796:5;34778:24;:::i;:::-;34767:35;;34712:96;;;:::o;34814:90::-;34848:7;34891:5;34884:13;34877:21;34866:32;;34814:90;;;:::o;34910:149::-;34946:7;34986:66;34979:5;34975:78;34964:89;;34910:149;;;:::o;35065:126::-;35102:7;35142:42;35135:5;35131:54;35120:65;;35065:126;;;:::o;35197:77::-;35234:7;35263:5;35252:16;;35197:77;;;:::o;35280:154::-;35364:6;35359:3;35354;35341:30;35426:1;35417:6;35412:3;35408:16;35401:27;35280:154;;;:::o;35440:307::-;35508:1;35518:113;35532:6;35529:1;35526:13;35518:113;;;35617:1;35612:3;35608:11;35602:18;35598:1;35593:3;35589:11;35582:39;35554:2;35551:1;35547:10;35542:15;;35518:113;;;35649:6;35646:1;35643:13;35640:101;;;35729:1;35720:6;35715:3;35711:16;35704:27;35640:101;35489:258;35440:307;;;:::o;35753:320::-;35797:6;35834:1;35828:4;35824:12;35814:22;;35881:1;35875:4;35871:12;35902:18;35892:81;;35958:4;35950:6;35946:17;35936:27;;35892:81;36020:2;36012:6;36009:14;35989:18;35986:38;35983:84;;;36039:18;;:::i;:::-;35983:84;35804:269;35753:320;;;:::o;36079:281::-;36162:27;36184:4;36162:27;:::i;:::-;36154:6;36150:40;36292:6;36280:10;36277:22;36256:18;36244:10;36241:34;36238:62;36235:88;;;36303:18;;:::i;:::-;36235:88;36343:10;36339:2;36332:22;36122:238;36079:281;;:::o;36366:233::-;36405:3;36428:24;36446:5;36428:24;:::i;:::-;36419:33;;36474:66;36467:5;36464:77;36461:103;;;36544:18;;:::i;:::-;36461:103;36591:1;36584:5;36580:13;36573:20;;36366:233;;;:::o;36605:176::-;36637:1;36654:20;36672:1;36654:20;:::i;:::-;36649:25;;36688:20;36706:1;36688:20;:::i;:::-;36683:25;;36727:1;36717:35;;36732:18;;:::i;:::-;36717:35;36773:1;36770;36766:9;36761:14;;36605:176;;;;:::o;36787:180::-;36835:77;36832:1;36825:88;36932:4;36929:1;36922:15;36956:4;36953:1;36946:15;36973:180;37021:77;37018:1;37011:88;37118:4;37115:1;37108:15;37142:4;37139:1;37132:15;37159:180;37207:77;37204:1;37197:88;37304:4;37301:1;37294:15;37328:4;37325:1;37318:15;37345:180;37393:77;37390:1;37383:88;37490:4;37487:1;37480:15;37514:4;37511:1;37504:15;37531:180;37579:77;37576:1;37569:88;37676:4;37673:1;37666:15;37700:4;37697:1;37690:15;37717:117;37826:1;37823;37816:12;37840:117;37949:1;37946;37939:12;37963:117;38072:1;38069;38062:12;38086:117;38195:1;38192;38185:12;38209:102;38250:6;38301:2;38297:7;38292:2;38285:5;38281:14;38277:28;38267:38;;38209:102;;;:::o;38317:237::-;38457:34;38453:1;38445:6;38441:14;38434:58;38526:20;38521:2;38513:6;38509:15;38502:45;38317:237;:::o;38560:225::-;38700:34;38696:1;38688:6;38684:14;38677:58;38769:8;38764:2;38756:6;38752:15;38745:33;38560:225;:::o;38791:178::-;38931:30;38927:1;38919:6;38915:14;38908:54;38791:178;:::o;38975:170::-;39115:22;39111:1;39103:6;39099:14;39092:46;38975:170;:::o;39151:223::-;39291:34;39287:1;39279:6;39275:14;39268:58;39360:6;39355:2;39347:6;39343:15;39336:31;39151:223;:::o;39380:175::-;39520:27;39516:1;39508:6;39504:14;39497:51;39380:175;:::o;39561:231::-;39701:34;39697:1;39689:6;39685:14;39678:58;39770:14;39765:2;39757:6;39753:15;39746:39;39561:231;:::o;39798:243::-;39938:34;39934:1;39926:6;39922:14;39915:58;40007:26;40002:2;39994:6;39990:15;39983:51;39798:243;:::o;40047:229::-;40187:34;40183:1;40175:6;40171:14;40164:58;40256:12;40251:2;40243:6;40239:15;40232:37;40047:229;:::o;40282:228::-;40422:34;40418:1;40410:6;40406:14;40399:58;40491:11;40486:2;40478:6;40474:15;40467:36;40282:228;:::o;40516:182::-;40656:34;40652:1;40644:6;40640:14;40633:58;40516:182;:::o;40704:231::-;40844:34;40840:1;40832:6;40828:14;40821:58;40913:14;40908:2;40900:6;40896:15;40889:39;40704:231;:::o;40941:182::-;41081:34;41077:1;41069:6;41065:14;41058:58;40941:182;:::o;41129:173::-;41269:25;41265:1;41257:6;41253:14;41246:49;41129:173;:::o;41308:228::-;41448:34;41444:1;41436:6;41432:14;41425:58;41517:11;41512:2;41504:6;41500:15;41493:36;41308:228;:::o;41542:234::-;41682:34;41678:1;41670:6;41666:14;41659:58;41751:17;41746:2;41738:6;41734:15;41727:42;41542:234;:::o;41782:220::-;41922:34;41918:1;41910:6;41906:14;41899:58;41991:3;41986:2;41978:6;41974:15;41967:28;41782:220;:::o;42008:114::-;;:::o;42128:170::-;42268:22;42264:1;42256:6;42252:14;42245:46;42128:170;:::o;42304:236::-;42444:34;42440:1;42432:6;42428:14;42421:58;42513:19;42508:2;42500:6;42496:15;42489:44;42304:236;:::o;42546:169::-;42686:21;42682:1;42674:6;42670:14;42663:45;42546:169;:::o;42721:122::-;42794:24;42812:5;42794:24;:::i;:::-;42787:5;42784:35;42774:63;;42833:1;42830;42823:12;42774:63;42721:122;:::o;42849:116::-;42919:21;42934:5;42919:21;:::i;:::-;42912:5;42909:32;42899:60;;42955:1;42952;42945:12;42899:60;42849:116;:::o;42971:120::-;43043:23;43060:5;43043:23;:::i;:::-;43036:5;43033:34;43023:62;;43081:1;43078;43071:12;43023:62;42971:120;:::o;43097:122::-;43170:24;43188:5;43170:24;:::i;:::-;43163:5;43160:35;43150:63;;43209:1;43206;43199:12;43150:63;43097:122;:::o

Swarm Source

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