ETH Price: $3,965.24 (+1.88%)

Token

55Unity (55Unity)
 

Overview

Max Total Supply

3,000 55Unity

Holders

766

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
6 55Unity
0x69601044a0ffc1c1f03235ad0af322404773558d
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:
Unity

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// 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/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/IERC721Enumerable.sol


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

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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

// 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/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// 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: contracts/ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;









error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintedQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerIndexOutOfBounds();
error OwnerQueryForNonexistentToken();
error TokenIndexOutOfBounds();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error UnableDetermineTokenOwner();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Does not support burning tokens to address(0).
 *
 * Assumes that an owner cannot have more than the 2**128 - 1 (max value of uint128) of supply
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal _currentIndex;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        if (index >= totalSupply()) revert TokenIndexOutOfBounds();
        return index;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        if (index >= balanceOf(owner)) revert OwnerIndexOutOfBounds();
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        // Execution should never reach this point.
        assert(false);
    }

    /**
     * @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 ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert MintedQueryForZeroAddress();
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        if (!_exists(tokenId)) revert OwnerQueryForNonexistentToken();

        unchecked {
            for (uint256 curr = tokenId;; curr--) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (ownership.addr != address(0)) {
                    return ownership;
                }
            }
        }
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return ownershipOf(tokenId).addr;
    }

    /**
     * @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) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        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 override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) revert ApprovalCallerNotOwnerNorApproved();

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public override {
        if (operator == _msgSender()) revert ApproveToCaller();

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _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 override {
        _transfer(from, to, tokenId);
        if (!_checkOnERC721Received(from, to, tokenId, _data)) revert TransferToNonERC721ReceiverImplementer();
    }

    /**
     * @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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < _currentIndex;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *w
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.56e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint128(quantity);
            _addressData[to].numberMinted += uint128(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe && !_checkOnERC721Received(address(0), to, updatedIndex, _data)) {
                    revert TransferToNonERC721ReceiverImplementer();
                }

                updatedIndex++;
            }

            _currentIndex = updatedIndex;
        }

        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            isApprovedForAll(prevOwnership.addr, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                if (_exists(nextTokenId)) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

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

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

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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`.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}
// 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: contracts/nft-azuki.sol



pragma solidity ^0.8.4;





contract Unity is Ownable, ERC721A, ReentrancyGuard {
    using Strings for uint256;
    // Addresses
    address public signerRole;
    address private address1;
    address private address2;
    address private address3;
    // Sales configs
    uint256 public maxPerAddressPreSale = 2;
    uint256 public maxPerAddressPublic = 3;
    uint256 public reserved = 150;
    uint256 public maxSupply = 4999;
    uint256 public cost = 0.115 ether;
    uint256 public maxBatchSize = 3;
    // Timeframes
    uint256 public preSaleWindowOpens = 1645801200;
    uint256 public preSaleWindowCloses  = 1645974000;
    uint256 public publicWindowOpens = 1645975800;
    uint256 public publicWindowCloses = 1646062200;
    uint256 public ogWindowOpens = 1645866000;
    // Metadata uris
    string public unrevealedURI;
    string public baseURI;
    // State variables
    bool public paused = false;
    bool public revealed = false;
    // Amount minted at phases
    mapping(address => uint256) public preSaleMintedBalance;
    mapping(address => uint256) public publicSaleMintedBalance;
    mapping(address => uint256) public ogs;
    
    constructor(
    string memory _unrevealedURI,
    address _signerRole,
    address _address1,
    address _address2,
    address _address3
    ) ERC721A("55Unity", "55Unity") {
        unrevealedURI = _unrevealedURI;
        signerRole = _signerRole;
        address1 = _address1;
        address2 = _address2;
        address3 = _address3;
    }

    // Modifiers
    modifier onlyValidAccess(uint8 _v, bytes32 _r, bytes32 _s) {
        require(isValidAccessMessage(msg.sender, _v, _r, _s), "Invalid singature for address calling the function, account not in presale.");
        _;
    }

    // Mint functions ( Presale, public, giveaways)
    function mintPreSale(uint256 quantity, uint8 _v, bytes32 _r, bytes32 _s) external payable onlyValidAccess(_v, _r, _s) {
        require(block.timestamp >= preSaleWindowOpens && block.timestamp <= preSaleWindowCloses, "Presale: purchase window closed.");
        // OGs in the last 6 hours have one more to mint.
        if(ogs[msg.sender] == 1 && (preSaleMintedBalance[msg.sender] + quantity) > maxPerAddressPreSale){
            require(block.timestamp >= ogWindowOpens, "OG are only allowed to mint their plus one in the last 6 hours.");
        }
        require(preSaleMintedBalance[msg.sender] + quantity <= (maxPerAddressPreSale + ogs[msg.sender]), "You can only mint 2 (3) tokens during presale (OG role has one more).");
       
        preSaleMintedBalance[msg.sender] += quantity;
        mint(quantity);
    }

    function mintPublicSale(uint256 quantity) external payable {
        require(block.timestamp >= publicWindowOpens && block.timestamp <= publicWindowCloses, "Public sale: purchase window closed.");
        require(publicSaleMintedBalance[msg.sender] + quantity <= maxPerAddressPublic, "You can only mint 3 tokens during public sale.");
        
        publicSaleMintedBalance[msg.sender] += quantity;
        mint(quantity);
    }

    function mint(uint256 quantity) private {
        require(tx.origin == msg.sender, "No bots allowed.");
        require(totalSupply() + quantity <= maxSupply, "This amount of tokens would surpass the max supply (4999).");
        require(msg.value >= cost * quantity, "Invalid purchase, the amount of eth sent is insufficient to process the mint.");
        require(quantity <= maxBatchSize, "You're only allowed to mint 3 tokens at a time.");
        require(!paused, "Minting not available, the contract is paused.");

        _safeMint(msg.sender, quantity);
    }

    function giveaway(address to, uint256 quantity) external onlyOwner {
        require(quantity <= reserved, "This amount exceeds reserved supply. 100" );
        require(totalSupply() + quantity <= maxSupply, "This amount of tokens would surpass the max supply (4999).");

        _safeMint(to, quantity);
        reserved -= quantity;
    }
    
    // Uri token functions
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token.");    
        
        if(revealed == false) {
            return unrevealedURI;
        }

        return string(abi.encodePacked(baseURI, tokenId.toString(), ".json"));  
    }

    function setBaseURI(string calldata _baseURI) external onlyOwner {
        baseURI = _baseURI;
    }
    
    function setUnrevealedURI(string calldata _unrevealedURI) external onlyOwner {
        unrevealedURI = _unrevealedURI;
    }

    function reveal(string memory _baseURI) external onlyOwner {
        baseURI = _baseURI;
        revealed = true;
    }

    // Functions to change contract settings
    function setMaxSupply( uint256 _newReservedSupply, uint256 _maxPublicSupply) external onlyOwner {
        maxSupply = _maxPublicSupply;
        reserved = _newReservedSupply;
    }
    
    function pause(bool _state) external onlyOwner {
        paused = _state;
    }
    
    function setWindows(uint256 _preSaleWindowOpens, uint256 _preSaleWindowCloses, uint256 _publicWindowOpens, uint256 _publicWindowCloses)  external onlyOwner {
        preSaleWindowOpens = _preSaleWindowOpens;
        preSaleWindowCloses= _preSaleWindowCloses;
        publicWindowOpens = _publicWindowOpens;
        publicWindowCloses = _publicWindowCloses;
    }

    function setOGWindow(uint256 _OGWindowOpens)  external onlyOwner{
        ogWindowOpens = _OGWindowOpens;
    }

    function setMaxEarly(uint256 _maxTxEarly) external onlyOwner {
        maxPerAddressPreSale = _maxTxEarly;
    }

    function setMaxPublic(uint256 _maxTxPublic) external onlyOwner {
        maxPerAddressPublic = _maxTxPublic;
    }

    function setMaxTxs(uint256 _maxPerTx) external onlyOwner {
        maxBatchSize = _maxPerTx;
    }

    function setOgs(address[] calldata _ogs) external onlyOwner {
        for (uint256 i; i < _ogs.length; i++) {
            ogs[_ogs[i]] = 1;
        }
    }

    function newCost(uint256 _newCost) external onlyOwner {
        // Important to set value in wei
        cost = _newCost;
    }

    // WL signature, only users allowed.
    function isValidAccessMessage(address _add, uint8 _v, bytes32 _r, bytes32 _s) view public returns (bool) {
        bytes32 hash = keccak256(abi.encodePacked(this, _add));
        return signerRole == ecrecover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)), _v, _r, _s);
    }

    function walletOfOwner(address _owner) public view returns (uint256[] memory) {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory tokenIds = new uint256[](ownerTokenCount);

        for (uint256 i; i < ownerTokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
        }
        
        return tokenIds;
    }

    function withdrawMoney() external onlyOwner nonReentrant {
        uint256 amount1 = address(this).balance / 100 * 20;
        uint256 amount2 = address(this).balance / 100 * 30;
        uint256 amount3 = address(this).balance / 100 * 50;

        (bool success, ) = address1.call{value: amount1}("");
        (success, ) = address2.call{value: amount2}("");
        (success, ) = address3.call{value: amount3}("");
        require(success, "Transfer failed.");
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_unrevealedURI","type":"string"},{"internalType":"address","name":"_signerRole","type":"address"},{"internalType":"address","name":"_address1","type":"address"},{"internalType":"address","name":"_address2","type":"address"},{"internalType":"address","name":"_address3","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerIndexOutOfBounds","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TokenIndexOutOfBounds","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"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":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"giveaway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_add","type":"address"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"isValidAccessMessage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBatchSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerAddressPreSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerAddressPublic","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":"quantity","type":"uint256"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"mintPreSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintPublicSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"newCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ogWindowOpens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ogs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"preSaleMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSaleWindowCloses","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSaleWindowOpens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"publicSaleMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicWindowCloses","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicWindowOpens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTxEarly","type":"uint256"}],"name":"setMaxEarly","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTxPublic","type":"uint256"}],"name":"setMaxPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newReservedSupply","type":"uint256"},{"internalType":"uint256","name":"_maxPublicSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPerTx","type":"uint256"}],"name":"setMaxTxs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_OGWindowOpens","type":"uint256"}],"name":"setOGWindow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_ogs","type":"address[]"}],"name":"setOgs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_unrevealedURI","type":"string"}],"name":"setUnrevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_preSaleWindowOpens","type":"uint256"},{"internalType":"uint256","name":"_preSaleWindowCloses","type":"uint256"},{"internalType":"uint256","name":"_publicWindowOpens","type":"uint256"},{"internalType":"uint256","name":"_publicWindowCloses","type":"uint256"}],"name":"setWindows","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signerRole","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unrevealedURI","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":[],"name":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526002600d556003600e556096600f556113876010556701988fe4052b80006011556003601255636218eef060135563621b91f060145563621b98f860155563621cea78601655636219ec106017556000601a60006101000a81548160ff0219169083151502179055506000601a60016101000a81548160ff0219169083151502179055503480156200009557600080fd5b50604051620061cd380380620061cd8339818101604052810190620000bb9190620004bc565b6040518060400160405280600781526020017f3535556e697479000000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f3535556e69747900000000000000000000000000000000000000000000000000815250620001476200013b620002ab60201b60201c565b620002b360201b60201c565b81600290805190602001906200015f92919062000377565b5080600390805190602001906200017892919062000377565b505050600160088190555084601890805190602001906200019b92919062000377565b5083600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050505062000735565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82805462000385906200062c565b90600052602060002090601f016020900481019282620003a95760008555620003f5565b82601f10620003c457805160ff1916838001178555620003f5565b82800160010185558215620003f5579182015b82811115620003f4578251825591602001919060010190620003d7565b5b50905062000404919062000408565b5090565b5b808211156200042357600081600090555060010162000409565b5090565b60006200043e62000438846200058c565b62000563565b9050828152602081018484840111156200045d576200045c620006fb565b5b6200046a848285620005f6565b509392505050565b60008151905062000483816200071b565b92915050565b600082601f830112620004a157620004a0620006f6565b5b8151620004b384826020860162000427565b91505092915050565b600080600080600060a08688031215620004db57620004da62000705565b5b600086015167ffffffffffffffff811115620004fc57620004fb62000700565b5b6200050a8882890162000489565b95505060206200051d8882890162000472565b9450506040620005308882890162000472565b9350506060620005438882890162000472565b9250506080620005568882890162000472565b9150509295509295909350565b60006200056f62000582565b90506200057d828262000662565b919050565b6000604051905090565b600067ffffffffffffffff821115620005aa57620005a9620006c7565b5b620005b5826200070a565b9050602081019050919050565b6000620005cf82620005d6565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b8381101562000616578082015181840152602081019050620005f9565b8381111562000626576000848401525b50505050565b600060028204905060018216806200064557607f821691505b602082108114156200065c576200065b62000698565b5b50919050565b6200066d826200070a565b810181811067ffffffffffffffff821117156200068f576200068e620006c7565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b6200072681620005c2565b81146200073257600080fd5b50565b615a8880620007456000396000f3fe60806040526004361061036a5760003560e01c80634f6ccce7116101c657806395d89b41116100f7578063f0e8b9fc11610095578063fbf9e7a61161006f578063fbf9e7a614610c99578063fe2c7fee14610cc4578063fe60d12c14610ced578063fedf229d14610d185761036a565b8063f0e8b9fc14610c1c578063f2fde38b14610c47578063fbdb849414610c705761036a565b8063b88d4fde116100d1578063b88d4fde14610b4e578063c87b56dd14610b77578063d5abeb0114610bb4578063e985e9c514610bdf5761036a565b806395d89b4114610ae3578063a22cb46514610b0e578063ac44600214610b375761036a565b80636c0360eb1161016457806370a082311161013e57806370a0823114610a39578063715018a614610a765780637b1a4b0e14610a8d5780638da5cb5b14610ab85761036a565b80636c0360eb146109b85780636c2d481f146109e35780637035bf1814610a0e5761036a565b80635a5e5d58116101a05780635a5e5d58146108f75780635c975abb146109135780635d31865f1461093e5780636352211e1461097b5761036a565b80634f6ccce71461086657806351830227146108a357806355f804b3146108ce5761036a565b806323b872dd116102a057806337da577c1161023e57806342842e0e1161021857806342842e0e146107ac578063438b6300146107d5578063447781b2146108125780634c2612471461083d5761036a565b806337da577c146107315780633e18e33f1461075a578063400839ad146107835761036a565b80632913daa01161027a5780632913daa0146106705780632d6dc9431461069b5780632f745c59146106b757806332624114146106f45761036a565b806323b872dd146105f557806327a811801461061e578063291168ab146106475761036a565b8063095ea7b31161030d5780631597cb00116102e75780631597cb001461054b57806316f6ebcf1461057657806318160ddd146105a15780631c43fede146105cc5761036a565b8063095ea7b3146104ce57806313faede6146104f757806314118453146105225761036a565b806304e32e331161034957806304e32e3314610400578063050225ea1461043d57806306fdde0314610466578063081812fc146104915761036a565b8062c1e5cf1461036f57806301ffc9a71461039a57806302329a29146103d7575b600080fd5b34801561037b57600080fd5b50610384610d55565b6040516103919190614ec9565b60405180910390f35b3480156103a657600080fd5b506103c160048036038101906103bc91906143ea565b610d5b565b6040516103ce9190614c27565b60405180910390f35b3480156103e357600080fd5b506103fe60048036038101906103f991906143bd565b610ea5565b005b34801561040c57600080fd5b5061042760048036038101906104229190614146565b610f3e565b6040516104349190614ec9565b60405180910390f35b34801561044957600080fd5b50610464600480360381019061045f91906142c9565b610f56565b005b34801561047257600080fd5b5061047b611095565b6040516104889190614c87565b60405180910390f35b34801561049d57600080fd5b506104b860048036038101906104b391906144da565b611127565b6040516104c59190614b9e565b60405180910390f35b3480156104da57600080fd5b506104f560048036038101906104f091906142c9565b6111a3565b005b34801561050357600080fd5b5061050c6112ae565b6040516105199190614ec9565b60405180910390f35b34801561052e57600080fd5b50610549600480360381019061054491906144da565b6112b4565b005b34801561055757600080fd5b5061056061133a565b60405161056d9190614ec9565b60405180910390f35b34801561058257600080fd5b5061058b611340565b6040516105989190614ec9565b60405180910390f35b3480156105ad57600080fd5b506105b6611346565b6040516105c39190614ec9565b60405180910390f35b3480156105d857600080fd5b506105f360048036038101906105ee91906144da565b611350565b005b34801561060157600080fd5b5061061c600480360381019061061791906141b3565b6113d6565b005b34801561062a57600080fd5b5061064560048036038101906106409190614547565b6113e6565b005b34801561065357600080fd5b5061066e60048036038101906106699190614370565b611484565b005b34801561067c57600080fd5b50610685611592565b6040516106929190614ec9565b60405180910390f35b6106b560048036038101906106b091906145ae565b611598565b005b3480156106c357600080fd5b506106de60048036038101906106d991906142c9565b61185f565b6040516106eb9190614ec9565b60405180910390f35b34801561070057600080fd5b5061071b60048036038101906107169190614309565b611a20565b6040516107289190614c27565b60405180910390f35b34801561073d57600080fd5b5061075860048036038101906107539190614507565b611b1e565b005b34801561076657600080fd5b50610781600480360381019061077c91906144da565b611bac565b005b34801561078f57600080fd5b506107aa60048036038101906107a591906144da565b611c32565b005b3480156107b857600080fd5b506107d360048036038101906107ce91906141b3565b611cb8565b005b3480156107e157600080fd5b506107fc60048036038101906107f79190614146565b611cd8565b6040516108099190614c05565b60405180910390f35b34801561081e57600080fd5b50610827611d86565b6040516108349190614ec9565b60405180910390f35b34801561084957600080fd5b50610864600480360381019061085f9190614491565b611d8c565b005b34801561087257600080fd5b5061088d600480360381019061088891906144da565b611e3d565b60405161089a9190614ec9565b60405180910390f35b3480156108af57600080fd5b506108b8611e87565b6040516108c59190614c27565b60405180910390f35b3480156108da57600080fd5b506108f560048036038101906108f09190614444565b611e9a565b005b610911600480360381019061090c91906144da565b611f2c565b005b34801561091f57600080fd5b50610928612070565b6040516109359190614c27565b60405180910390f35b34801561094a57600080fd5b5061096560048036038101906109609190614146565b612083565b6040516109729190614ec9565b60405180910390f35b34801561098757600080fd5b506109a2600480360381019061099d91906144da565b61209b565b6040516109af9190614b9e565b60405180910390f35b3480156109c457600080fd5b506109cd6120b1565b6040516109da9190614c87565b60405180910390f35b3480156109ef57600080fd5b506109f861213f565b604051610a059190614b9e565b60405180910390f35b348015610a1a57600080fd5b50610a23612165565b604051610a309190614c87565b60405180910390f35b348015610a4557600080fd5b50610a606004803603810190610a5b9190614146565b6121f3565b604051610a6d9190614ec9565b60405180910390f35b348015610a8257600080fd5b50610a8b6122d3565b005b348015610a9957600080fd5b50610aa261235b565b604051610aaf9190614ec9565b60405180910390f35b348015610ac457600080fd5b50610acd612361565b604051610ada9190614b9e565b60405180910390f35b348015610aef57600080fd5b50610af861238a565b604051610b059190614c87565b60405180910390f35b348015610b1a57600080fd5b50610b356004803603810190610b309190614289565b61241c565b005b348015610b4357600080fd5b50610b4c612594565b005b348015610b5a57600080fd5b50610b756004803603810190610b709190614206565b6128ad565b005b348015610b8357600080fd5b50610b9e6004803603810190610b9991906144da565b612900565b604051610bab9190614c87565b60405180910390f35b348015610bc057600080fd5b50610bc9612a2b565b604051610bd69190614ec9565b60405180910390f35b348015610beb57600080fd5b50610c066004803603810190610c019190614173565b612a31565b604051610c139190614c27565b60405180910390f35b348015610c2857600080fd5b50610c31612ac5565b604051610c3e9190614ec9565b60405180910390f35b348015610c5357600080fd5b50610c6e6004803603810190610c699190614146565b612acb565b005b348015610c7c57600080fd5b50610c976004803603810190610c9291906144da565b612bc3565b005b348015610ca557600080fd5b50610cae612c49565b604051610cbb9190614ec9565b60405180910390f35b348015610cd057600080fd5b50610ceb6004803603810190610ce69190614444565b612c4f565b005b348015610cf957600080fd5b50610d02612ce1565b604051610d0f9190614ec9565b60405180910390f35b348015610d2457600080fd5b50610d3f6004803603810190610d3a9190614146565b612ce7565b604051610d4c9190614ec9565b60405180910390f35b60165481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610e2657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e8e57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e9e5750610e9d82612cff565b5b9050919050565b610ead612d69565b73ffffffffffffffffffffffffffffffffffffffff16610ecb612361565b73ffffffffffffffffffffffffffffffffffffffff1614610f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1890614d69565b60405180910390fd5b80601a60006101000a81548160ff02191690831515021790555050565b601c6020528060005260406000206000915090505481565b610f5e612d69565b73ffffffffffffffffffffffffffffffffffffffff16610f7c612361565b73ffffffffffffffffffffffffffffffffffffffff1614610fd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc990614d69565b60405180910390fd5b600f54811115611017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100e90614ce9565b60405180910390fd5b60105481611023611346565b61102d9190615007565b111561106e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106590614e89565b60405180910390fd5b6110788282612d71565b80600f600082825461108a91906150e8565b925050819055505050565b6060600280546110a49061521f565b80601f01602080910402602001604051908101604052809291908181526020018280546110d09061521f565b801561111d5780601f106110f25761010080835404028352916020019161111d565b820191906000526020600020905b81548152906001019060200180831161110057829003601f168201915b5050505050905090565b600061113282612d8f565b611168576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006111ae8261209b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611216576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611235612d69565b73ffffffffffffffffffffffffffffffffffffffff1614158015611267575061126581611260612d69565b612a31565b155b1561129e576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112a9838383612d9d565b505050565b60115481565b6112bc612d69565b73ffffffffffffffffffffffffffffffffffffffff166112da612361565b73ffffffffffffffffffffffffffffffffffffffff1614611330576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132790614d69565b60405180910390fd5b8060128190555050565b600e5481565b60175481565b6000600154905090565b611358612d69565b73ffffffffffffffffffffffffffffffffffffffff16611376612361565b73ffffffffffffffffffffffffffffffffffffffff16146113cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c390614d69565b60405180910390fd5b80600d8190555050565b6113e1838383612e4f565b505050565b6113ee612d69565b73ffffffffffffffffffffffffffffffffffffffff1661140c612361565b73ffffffffffffffffffffffffffffffffffffffff1614611462576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145990614d69565b60405180910390fd5b8360138190555082601481905550816015819055508060168190555050505050565b61148c612d69565b73ffffffffffffffffffffffffffffffffffffffff166114aa612361565b73ffffffffffffffffffffffffffffffffffffffff1614611500576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f790614d69565b60405180910390fd5b60005b8282905081101561158d576001601d6000858585818110611527576115266153e6565b5b905060200201602081019061153c9190614146565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808061158590615282565b915050611503565b505050565b60125481565b8282826115a733848484611a20565b6115e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115dd90614de9565b60405180910390fd5b60135442101580156115fa57506014544211155b611639576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163090614da9565b60405180910390fd5b6001601d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541480156116d35750600d5487601b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116d19190615007565b115b1561171e5760175442101561171d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171490614d89565b60405180910390fd5b5b601d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600d5461176b9190615007565b87601b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546117b69190615007565b11156117f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ee90614dc9565b60405180910390fd5b86601b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118469190615007565b9250508190555061185687613374565b50505050505050565b600061186a836121f3565b82106118a2576040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006118ac611346565b905060008060005b83811015611a06576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146119a657806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156119f857868414156119ef578195505050505050611a1a565b83806001019450505b5080806001019150506118b4565b506000611a1657611a1561532a565b5b5050505b92915050565b6000803086604051602001611a36929190614b08565b604051602081830303815290604052805190602001209050600181604051602001611a619190614b63565b6040516020818303038152906040528051906020012086868660405160008152602001604052604051611a979493929190614c42565b6020604051602081039080840390855afa158015611ab9573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614915050949350505050565b611b26612d69565b73ffffffffffffffffffffffffffffffffffffffff16611b44612361565b73ffffffffffffffffffffffffffffffffffffffff1614611b9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9190614d69565b60405180910390fd5b8060108190555081600f819055505050565b611bb4612d69565b73ffffffffffffffffffffffffffffffffffffffff16611bd2612361565b73ffffffffffffffffffffffffffffffffffffffff1614611c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1f90614d69565b60405180910390fd5b8060178190555050565b611c3a612d69565b73ffffffffffffffffffffffffffffffffffffffff16611c58612361565b73ffffffffffffffffffffffffffffffffffffffff1614611cae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca590614d69565b60405180910390fd5b8060118190555050565b611cd3838383604051806020016040528060008152506128ad565b505050565b60606000611ce5836121f3565b905060008167ffffffffffffffff811115611d0357611d02615415565b5b604051908082528060200260200182016040528015611d315781602001602082028036833780820191505090505b50905060005b82811015611d7b57611d49858261185f565b828281518110611d5c57611d5b6153e6565b5b6020026020010181815250508080611d7390615282565b915050611d37565b508092505050919050565b60135481565b611d94612d69565b73ffffffffffffffffffffffffffffffffffffffff16611db2612361565b73ffffffffffffffffffffffffffffffffffffffff1614611e08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dff90614d69565b60405180910390fd5b8060199080519060200190611e1e929190613dc4565b506001601a60016101000a81548160ff02191690831515021790555050565b6000611e47611346565b8210611e7f576040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b819050919050565b601a60019054906101000a900460ff1681565b611ea2612d69565b73ffffffffffffffffffffffffffffffffffffffff16611ec0612361565b73ffffffffffffffffffffffffffffffffffffffff1614611f16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0d90614d69565b60405180910390fd5b818160199190611f27929190613e4a565b505050565b6015544210158015611f4057506016544211155b611f7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7690614cc9565b60405180910390fd5b600e5481601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611fcd9190615007565b111561200e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200590614d29565b60405180910390fd5b80601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461205d9190615007565b9250508190555061206d81613374565b50565b601a60009054906101000a900460ff1681565b601b6020528060005260406000206000915090505481565b60006120a68261352b565b600001519050919050565b601980546120be9061521f565b80601f01602080910402602001604051908101604052809291908181526020018280546120ea9061521f565b80156121375780601f1061210c57610100808354040283529160200191612137565b820191906000526020600020905b81548152906001019060200180831161211a57829003601f168201915b505050505081565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601880546121729061521f565b80601f016020809104026020016040519081016040528092919081815260200182805461219e9061521f565b80156121eb5780601f106121c0576101008083540402835291602001916121eb565b820191906000526020600020905b8154815290600101906020018083116121ce57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561225b576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6122db612d69565b73ffffffffffffffffffffffffffffffffffffffff166122f9612361565b73ffffffffffffffffffffffffffffffffffffffff161461234f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234690614d69565b60405180910390fd5b6123596000613678565b565b60155481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546123999061521f565b80601f01602080910402602001604051908101604052809291908181526020018280546123c59061521f565b80156124125780601f106123e757610100808354040283529160200191612412565b820191906000526020600020905b8154815290600101906020018083116123f557829003601f168201915b5050505050905090565b612424612d69565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612489576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000612496612d69565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612543612d69565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516125889190614c27565b60405180910390a35050565b61259c612d69565b73ffffffffffffffffffffffffffffffffffffffff166125ba612361565b73ffffffffffffffffffffffffffffffffffffffff1614612610576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260790614d69565b60405180910390fd5b60026008541415612656576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264d90614e69565b60405180910390fd5b60026008819055506000601460644761266f919061505d565b612679919061508e565b90506000601e60644761268c919061505d565b612696919061508e565b9050600060326064476126a9919061505d565b6126b3919061508e565b90506000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16846040516126fd90614b89565b60006040518083038185875af1925050503d806000811461273a576040519150601f19603f3d011682016040523d82523d6000602084013e61273f565b606091505b50509050600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168360405161278990614b89565b60006040518083038185875af1925050503d80600081146127c6576040519150601f19603f3d011682016040523d82523d6000602084013e6127cb565b606091505b505080915050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260405161281790614b89565b60006040518083038185875af1925050503d8060008114612854576040519150601f19603f3d011682016040523d82523d6000602084013e612859565b606091505b5050809150508061289f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289690614e49565b60405180910390fd5b505050506001600881905550565b6128b8848484612e4f565b6128c48484848461373c565b6128fa576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b606061290b82612d8f565b61294a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294190614ea9565b60405180910390fd5b60001515601a60019054906101000a900460ff16151514156129f857601880546129739061521f565b80601f016020809104026020016040519081016040528092919081815260200182805461299f9061521f565b80156129ec5780601f106129c1576101008083540402835291602001916129ec565b820191906000526020600020905b8154815290600101906020018083116129cf57829003601f168201915b50505050509050612a26565b6019612a03836138ca565b604051602001612a14929190614b34565b60405160208183030381529060405290505b919050565b60105481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d5481565b612ad3612d69565b73ffffffffffffffffffffffffffffffffffffffff16612af1612361565b73ffffffffffffffffffffffffffffffffffffffff1614612b47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3e90614d69565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612bb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bae90614ca9565b60405180910390fd5b612bc081613678565b50565b612bcb612d69565b73ffffffffffffffffffffffffffffffffffffffff16612be9612361565b73ffffffffffffffffffffffffffffffffffffffff1614612c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3690614d69565b60405180910390fd5b80600e8190555050565b60145481565b612c57612d69565b73ffffffffffffffffffffffffffffffffffffffff16612c75612361565b73ffffffffffffffffffffffffffffffffffffffff1614612ccb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc290614d69565b60405180910390fd5b818160189190612cdc929190613e4a565b505050565b600f5481565b601d6020528060005260406000206000915090505481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b612d8b828260405180602001604052806000815250613a2b565b5050565b600060015482109050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000612e5a8261352b565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612e81612d69565b73ffffffffffffffffffffffffffffffffffffffff161480612eb45750612eb38260000151612eae612d69565b612a31565b5b80612ef95750612ec2612d69565b73ffffffffffffffffffffffffffffffffffffffff16612ee184611127565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612f32576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612f9b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613002576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61300f8585856001613a3d565b61301f6000848460000151612d9d565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156133045761326381612d8f565b156133035782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461336d8585856001613a43565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146133e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133d990614e29565b60405180910390fd5b601054816133ee611346565b6133f89190615007565b1115613439576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343090614e89565b60405180910390fd5b80601154613447919061508e565b341015613489576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161348090614d09565b60405180910390fd5b6012548111156134ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134c590614d49565b60405180910390fd5b601a60009054906101000a900460ff161561351e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161351590614e09565b60405180910390fd5b6135283382612d71565b50565b613533613ed0565b61353c82612d8f565b613572576040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008290505b6000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614613664578092505050613673565b50808060019003915050613578565b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600061375d8473ffffffffffffffffffffffffffffffffffffffff16613a49565b156138bd578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613786612d69565b8786866040518563ffffffff1660e01b81526004016137a89493929190614bb9565b602060405180830381600087803b1580156137c257600080fd5b505af19250505080156137f357506040513d601f19601f820116820180604052508101906137f09190614417565b60015b61386d573d8060008114613823576040519150601f19603f3d011682016040523d82523d6000602084013e613828565b606091505b50600081511415613865576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506138c2565b600190505b949350505050565b60606000821415613912576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613a26565b600082905060005b6000821461394457808061392d90615282565b915050600a8261393d919061505d565b915061391a565b60008167ffffffffffffffff8111156139605761395f615415565b5b6040519080825280601f01601f1916602001820160405280156139925781602001600182028036833780820191505090505b5090505b60008514613a1f576001826139ab91906150e8565b9150600a856139ba91906152f9565b60306139c69190615007565b60f81b8183815181106139dc576139db6153e6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613a18919061505d565b9450613996565b8093505050505b919050565b613a388383836001613a5c565b505050565b50505050565b50505050565b600080823b905060008111915050919050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613aca576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415613b05576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613b126000868387613a3d565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b85811015613da757818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4838015613d5b5750613d59600088848861373c565b155b15613d92576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81806001019250508080600101915050613ce0565b508060018190555050613dbd6000868387613a43565b5050505050565b828054613dd09061521f565b90600052602060002090601f016020900481019282613df25760008555613e39565b82601f10613e0b57805160ff1916838001178555613e39565b82800160010185558215613e39579182015b82811115613e38578251825591602001919060010190613e1d565b5b509050613e469190613f0a565b5090565b828054613e569061521f565b90600052602060002090601f016020900481019282613e785760008555613ebf565b82601f10613e9157803560ff1916838001178555613ebf565b82800160010185558215613ebf579182015b82811115613ebe578235825591602001919060010190613ea3565b5b509050613ecc9190613f0a565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613f23576000816000905550600101613f0b565b5090565b6000613f3a613f3584614f09565b614ee4565b905082815260208101848484011115613f5657613f55615453565b5b613f618482856151dd565b509392505050565b6000613f7c613f7784614f3a565b614ee4565b905082815260208101848484011115613f9857613f97615453565b5b613fa38482856151dd565b509392505050565b600081359050613fba816159c8565b92915050565b60008083601f840112613fd657613fd5615449565b5b8235905067ffffffffffffffff811115613ff357613ff2615444565b5b60208301915083602082028301111561400f5761400e61544e565b5b9250929050565b600081359050614025816159df565b92915050565b60008135905061403a816159f6565b92915050565b60008135905061404f81615a0d565b92915050565b60008151905061406481615a0d565b92915050565b600082601f83011261407f5761407e615449565b5b813561408f848260208601613f27565b91505092915050565b60008083601f8401126140ae576140ad615449565b5b8235905067ffffffffffffffff8111156140cb576140ca615444565b5b6020830191508360018202830111156140e7576140e661544e565b5b9250929050565b600082601f83011261410357614102615449565b5b8135614113848260208601613f69565b91505092915050565b60008135905061412b81615a24565b92915050565b60008135905061414081615a3b565b92915050565b60006020828403121561415c5761415b61545d565b5b600061416a84828501613fab565b91505092915050565b6000806040838503121561418a5761418961545d565b5b600061419885828601613fab565b92505060206141a985828601613fab565b9150509250929050565b6000806000606084860312156141cc576141cb61545d565b5b60006141da86828701613fab565b93505060206141eb86828701613fab565b92505060406141fc8682870161411c565b9150509250925092565b600080600080608085870312156142205761421f61545d565b5b600061422e87828801613fab565b945050602061423f87828801613fab565b93505060406142508782880161411c565b925050606085013567ffffffffffffffff81111561427157614270615458565b5b61427d8782880161406a565b91505092959194509250565b600080604083850312156142a05761429f61545d565b5b60006142ae85828601613fab565b92505060206142bf85828601614016565b9150509250929050565b600080604083850312156142e0576142df61545d565b5b60006142ee85828601613fab565b92505060206142ff8582860161411c565b9150509250929050565b600080600080608085870312156143235761432261545d565b5b600061433187828801613fab565b945050602061434287828801614131565b93505060406143538782880161402b565b92505060606143648782880161402b565b91505092959194509250565b600080602083850312156143875761438661545d565b5b600083013567ffffffffffffffff8111156143a5576143a4615458565b5b6143b185828601613fc0565b92509250509250929050565b6000602082840312156143d3576143d261545d565b5b60006143e184828501614016565b91505092915050565b600060208284031215614400576143ff61545d565b5b600061440e84828501614040565b91505092915050565b60006020828403121561442d5761442c61545d565b5b600061443b84828501614055565b91505092915050565b6000806020838503121561445b5761445a61545d565b5b600083013567ffffffffffffffff81111561447957614478615458565b5b61448585828601614098565b92509250509250929050565b6000602082840312156144a7576144a661545d565b5b600082013567ffffffffffffffff8111156144c5576144c4615458565b5b6144d1848285016140ee565b91505092915050565b6000602082840312156144f0576144ef61545d565b5b60006144fe8482850161411c565b91505092915050565b6000806040838503121561451e5761451d61545d565b5b600061452c8582860161411c565b925050602061453d8582860161411c565b9150509250929050565b600080600080608085870312156145615761456061545d565b5b600061456f8782880161411c565b94505060206145808782880161411c565b93505060406145918782880161411c565b92505060606145a28782880161411c565b91505092959194509250565b600080600080608085870312156145c8576145c761545d565b5b60006145d68782880161411c565b94505060206145e787828801614131565b93505060406145f88782880161402b565b92505060606146098782880161402b565b91505092959194509250565b60006146218383614adb565b60208301905092915050565b6146368161511c565b82525050565b61464d6146488261511c565b6152cb565b82525050565b600061465e82614f90565b6146688185614fbe565b935061467383614f6b565b8060005b838110156146a457815161468b8882614615565b975061469683614fb1565b925050600181019050614677565b5085935050505092915050565b6146ba8161512e565b82525050565b6146c98161513a565b82525050565b6146e06146db8261513a565b6152dd565b82525050565b60006146f182614f9b565b6146fb8185614fcf565b935061470b8185602086016151ec565b61471481615462565b840191505092915050565b61473061472b826151a7565b6152cb565b82525050565b600061474182614fa6565b61474b8185614feb565b935061475b8185602086016151ec565b61476481615462565b840191505092915050565b600061477a82614fa6565b6147848185614ffc565b93506147948185602086016151ec565b80840191505092915050565b600081546147ad8161521f565b6147b78186614ffc565b945060018216600081146147d257600181146147e357614816565b60ff19831686528186019350614816565b6147ec85614f7b565b60005b8381101561480e578154818901526001820191506020810190506147ef565b838801955050505b50505092915050565b600061482c601c83614ffc565b915061483782615480565b601c82019050919050565b600061484f602683614feb565b915061485a826154a9565b604082019050919050565b6000614872602483614feb565b915061487d826154f8565b604082019050919050565b6000614895602883614feb565b91506148a082615547565b604082019050919050565b60006148b8604d83614feb565b91506148c382615596565b606082019050919050565b60006148db602e83614feb565b91506148e68261560b565b604082019050919050565b60006148fe600583614ffc565b91506149098261565a565b600582019050919050565b6000614921602f83614feb565b915061492c82615683565b604082019050919050565b6000614944602083614feb565b915061494f826156d2565b602082019050919050565b6000614967603f83614feb565b9150614972826156fb565b604082019050919050565b600061498a602083614feb565b91506149958261574a565b602082019050919050565b60006149ad604583614feb565b91506149b882615773565b606082019050919050565b60006149d0604b83614feb565b91506149db826157e8565b606082019050919050565b60006149f3602e83614feb565b91506149fe8261585d565b604082019050919050565b6000614a16601083614feb565b9150614a21826158ac565b602082019050919050565b6000614a39600083614fe0565b9150614a44826158d5565b600082019050919050565b6000614a5c601083614feb565b9150614a67826158d8565b602082019050919050565b6000614a7f601f83614feb565b9150614a8a82615901565b602082019050919050565b6000614aa2603a83614feb565b9150614aad8261592a565b604082019050919050565b6000614ac5603083614feb565b9150614ad082615979565b604082019050919050565b614ae481615190565b82525050565b614af381615190565b82525050565b614b028161519a565b82525050565b6000614b14828561471f565b601482019150614b24828461463c565b6014820191508190509392505050565b6000614b4082856147a0565b9150614b4c828461476f565b9150614b57826148f1565b91508190509392505050565b6000614b6e8261481f565b9150614b7a82846146cf565b60208201915081905092915050565b6000614b9482614a2c565b9150819050919050565b6000602082019050614bb3600083018461462d565b92915050565b6000608082019050614bce600083018761462d565b614bdb602083018661462d565b614be86040830185614aea565b8181036060830152614bfa81846146e6565b905095945050505050565b60006020820190508181036000830152614c1f8184614653565b905092915050565b6000602082019050614c3c60008301846146b1565b92915050565b6000608082019050614c5760008301876146c0565b614c646020830186614af9565b614c7160408301856146c0565b614c7e60608301846146c0565b95945050505050565b60006020820190508181036000830152614ca18184614736565b905092915050565b60006020820190508181036000830152614cc281614842565b9050919050565b60006020820190508181036000830152614ce281614865565b9050919050565b60006020820190508181036000830152614d0281614888565b9050919050565b60006020820190508181036000830152614d22816148ab565b9050919050565b60006020820190508181036000830152614d42816148ce565b9050919050565b60006020820190508181036000830152614d6281614914565b9050919050565b60006020820190508181036000830152614d8281614937565b9050919050565b60006020820190508181036000830152614da28161495a565b9050919050565b60006020820190508181036000830152614dc28161497d565b9050919050565b60006020820190508181036000830152614de2816149a0565b9050919050565b60006020820190508181036000830152614e02816149c3565b9050919050565b60006020820190508181036000830152614e22816149e6565b9050919050565b60006020820190508181036000830152614e4281614a09565b9050919050565b60006020820190508181036000830152614e6281614a4f565b9050919050565b60006020820190508181036000830152614e8281614a72565b9050919050565b60006020820190508181036000830152614ea281614a95565b9050919050565b60006020820190508181036000830152614ec281614ab8565b9050919050565b6000602082019050614ede6000830184614aea565b92915050565b6000614eee614eff565b9050614efa8282615251565b919050565b6000604051905090565b600067ffffffffffffffff821115614f2457614f23615415565b5b614f2d82615462565b9050602081019050919050565b600067ffffffffffffffff821115614f5557614f54615415565b5b614f5e82615462565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061501282615190565b915061501d83615190565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561505257615051615359565b5b828201905092915050565b600061506882615190565b915061507383615190565b92508261508357615082615388565b5b828204905092915050565b600061509982615190565b91506150a483615190565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156150dd576150dc615359565b5b828202905092915050565b60006150f382615190565b91506150fe83615190565b92508282101561511157615110615359565b5b828203905092915050565b600061512782615170565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006151b2826151b9565b9050919050565b60006151c4826151cb565b9050919050565b60006151d682615170565b9050919050565b82818337600083830152505050565b60005b8381101561520a5780820151818401526020810190506151ef565b83811115615219576000848401525b50505050565b6000600282049050600182168061523757607f821691505b6020821081141561524b5761524a6153b7565b5b50919050565b61525a82615462565b810181811067ffffffffffffffff8211171561527957615278615415565b5b80604052505050565b600061528d82615190565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156152c0576152bf615359565b5b600182019050919050565b60006152d6826152e7565b9050919050565b6000819050919050565b60006152f282615473565b9050919050565b600061530482615190565b915061530f83615190565b92508261531f5761531e615388565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5075626c69632073616c653a2070757263686173652077696e646f7720636c6f60008201527f7365642e00000000000000000000000000000000000000000000000000000000602082015250565b7f5468697320616d6f756e7420657863656564732072657365727665642073757060008201527f706c792e20313030000000000000000000000000000000000000000000000000602082015250565b7f496e76616c69642070757263686173652c2074686520616d6f756e74206f662060008201527f6574682073656e7420697320696e73756666696369656e7420746f2070726f6360208201527f65737320746865206d696e742e00000000000000000000000000000000000000604082015250565b7f596f752063616e206f6e6c79206d696e74203320746f6b656e7320647572696e60008201527f67207075626c69632073616c652e000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f596f75277265206f6e6c7920616c6c6f77656420746f206d696e74203320746f60008201527f6b656e7320617420612074696d652e0000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4f4720617265206f6e6c7920616c6c6f77656420746f206d696e74207468656960008201527f7220706c7573206f6e6520696e20746865206c617374203620686f7572732e00602082015250565b7f50726573616c653a2070757263686173652077696e646f7720636c6f7365642e600082015250565b7f596f752063616e206f6e6c79206d696e7420322028332920746f6b656e73206460008201527f7572696e672070726573616c6520284f4720726f6c6520686173206f6e65206d60208201527f6f7265292e000000000000000000000000000000000000000000000000000000604082015250565b7f496e76616c69642073696e67617475726520666f72206164647265737320636160008201527f6c6c696e67207468652066756e6374696f6e2c206163636f756e74206e6f742060208201527f696e2070726573616c652e000000000000000000000000000000000000000000604082015250565b7f4d696e74696e67206e6f7420617661696c61626c652c2074686520636f6e747260008201527f616374206973207061757365642e000000000000000000000000000000000000602082015250565b7f4e6f20626f747320616c6c6f7765642e00000000000000000000000000000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f5468697320616d6f756e74206f6620746f6b656e7320776f756c64207375727060008201527f61737320746865206d617820737570706c79202834393939292e000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e2e00000000000000000000000000000000602082015250565b6159d18161511c565b81146159dc57600080fd5b50565b6159e88161512e565b81146159f357600080fd5b50565b6159ff8161513a565b8114615a0a57600080fd5b50565b615a1681615144565b8114615a2157600080fd5b50565b615a2d81615190565b8114615a3857600080fd5b50565b615a448161519a565b8114615a4f57600080fd5b5056fea26469706673582212200934a0758a35e3a1d0287d151bd3e2c9f9e9cefccdc8e2a7058933536aba993e64736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000a65aae78edef916d4102ba7b5672068c0d35fbff00000000000000000000000026ac68037c202b8ac2d1cfcc487651dad41b68e00000000000000000000000004e3c4cb1c2ecc0005c5980a5c09ac5146529ccb2000000000000000000000000128dbbc9a8e0f1c9c5b28faca391891fcdc707f7000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d4e6a4c4e393873354e3134574e69703635766f45647054566e534d39796945695231654c4358774a4a56563800000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061036a5760003560e01c80634f6ccce7116101c657806395d89b41116100f7578063f0e8b9fc11610095578063fbf9e7a61161006f578063fbf9e7a614610c99578063fe2c7fee14610cc4578063fe60d12c14610ced578063fedf229d14610d185761036a565b8063f0e8b9fc14610c1c578063f2fde38b14610c47578063fbdb849414610c705761036a565b8063b88d4fde116100d1578063b88d4fde14610b4e578063c87b56dd14610b77578063d5abeb0114610bb4578063e985e9c514610bdf5761036a565b806395d89b4114610ae3578063a22cb46514610b0e578063ac44600214610b375761036a565b80636c0360eb1161016457806370a082311161013e57806370a0823114610a39578063715018a614610a765780637b1a4b0e14610a8d5780638da5cb5b14610ab85761036a565b80636c0360eb146109b85780636c2d481f146109e35780637035bf1814610a0e5761036a565b80635a5e5d58116101a05780635a5e5d58146108f75780635c975abb146109135780635d31865f1461093e5780636352211e1461097b5761036a565b80634f6ccce71461086657806351830227146108a357806355f804b3146108ce5761036a565b806323b872dd116102a057806337da577c1161023e57806342842e0e1161021857806342842e0e146107ac578063438b6300146107d5578063447781b2146108125780634c2612471461083d5761036a565b806337da577c146107315780633e18e33f1461075a578063400839ad146107835761036a565b80632913daa01161027a5780632913daa0146106705780632d6dc9431461069b5780632f745c59146106b757806332624114146106f45761036a565b806323b872dd146105f557806327a811801461061e578063291168ab146106475761036a565b8063095ea7b31161030d5780631597cb00116102e75780631597cb001461054b57806316f6ebcf1461057657806318160ddd146105a15780631c43fede146105cc5761036a565b8063095ea7b3146104ce57806313faede6146104f757806314118453146105225761036a565b806304e32e331161034957806304e32e3314610400578063050225ea1461043d57806306fdde0314610466578063081812fc146104915761036a565b8062c1e5cf1461036f57806301ffc9a71461039a57806302329a29146103d7575b600080fd5b34801561037b57600080fd5b50610384610d55565b6040516103919190614ec9565b60405180910390f35b3480156103a657600080fd5b506103c160048036038101906103bc91906143ea565b610d5b565b6040516103ce9190614c27565b60405180910390f35b3480156103e357600080fd5b506103fe60048036038101906103f991906143bd565b610ea5565b005b34801561040c57600080fd5b5061042760048036038101906104229190614146565b610f3e565b6040516104349190614ec9565b60405180910390f35b34801561044957600080fd5b50610464600480360381019061045f91906142c9565b610f56565b005b34801561047257600080fd5b5061047b611095565b6040516104889190614c87565b60405180910390f35b34801561049d57600080fd5b506104b860048036038101906104b391906144da565b611127565b6040516104c59190614b9e565b60405180910390f35b3480156104da57600080fd5b506104f560048036038101906104f091906142c9565b6111a3565b005b34801561050357600080fd5b5061050c6112ae565b6040516105199190614ec9565b60405180910390f35b34801561052e57600080fd5b50610549600480360381019061054491906144da565b6112b4565b005b34801561055757600080fd5b5061056061133a565b60405161056d9190614ec9565b60405180910390f35b34801561058257600080fd5b5061058b611340565b6040516105989190614ec9565b60405180910390f35b3480156105ad57600080fd5b506105b6611346565b6040516105c39190614ec9565b60405180910390f35b3480156105d857600080fd5b506105f360048036038101906105ee91906144da565b611350565b005b34801561060157600080fd5b5061061c600480360381019061061791906141b3565b6113d6565b005b34801561062a57600080fd5b5061064560048036038101906106409190614547565b6113e6565b005b34801561065357600080fd5b5061066e60048036038101906106699190614370565b611484565b005b34801561067c57600080fd5b50610685611592565b6040516106929190614ec9565b60405180910390f35b6106b560048036038101906106b091906145ae565b611598565b005b3480156106c357600080fd5b506106de60048036038101906106d991906142c9565b61185f565b6040516106eb9190614ec9565b60405180910390f35b34801561070057600080fd5b5061071b60048036038101906107169190614309565b611a20565b6040516107289190614c27565b60405180910390f35b34801561073d57600080fd5b5061075860048036038101906107539190614507565b611b1e565b005b34801561076657600080fd5b50610781600480360381019061077c91906144da565b611bac565b005b34801561078f57600080fd5b506107aa60048036038101906107a591906144da565b611c32565b005b3480156107b857600080fd5b506107d360048036038101906107ce91906141b3565b611cb8565b005b3480156107e157600080fd5b506107fc60048036038101906107f79190614146565b611cd8565b6040516108099190614c05565b60405180910390f35b34801561081e57600080fd5b50610827611d86565b6040516108349190614ec9565b60405180910390f35b34801561084957600080fd5b50610864600480360381019061085f9190614491565b611d8c565b005b34801561087257600080fd5b5061088d600480360381019061088891906144da565b611e3d565b60405161089a9190614ec9565b60405180910390f35b3480156108af57600080fd5b506108b8611e87565b6040516108c59190614c27565b60405180910390f35b3480156108da57600080fd5b506108f560048036038101906108f09190614444565b611e9a565b005b610911600480360381019061090c91906144da565b611f2c565b005b34801561091f57600080fd5b50610928612070565b6040516109359190614c27565b60405180910390f35b34801561094a57600080fd5b5061096560048036038101906109609190614146565b612083565b6040516109729190614ec9565b60405180910390f35b34801561098757600080fd5b506109a2600480360381019061099d91906144da565b61209b565b6040516109af9190614b9e565b60405180910390f35b3480156109c457600080fd5b506109cd6120b1565b6040516109da9190614c87565b60405180910390f35b3480156109ef57600080fd5b506109f861213f565b604051610a059190614b9e565b60405180910390f35b348015610a1a57600080fd5b50610a23612165565b604051610a309190614c87565b60405180910390f35b348015610a4557600080fd5b50610a606004803603810190610a5b9190614146565b6121f3565b604051610a6d9190614ec9565b60405180910390f35b348015610a8257600080fd5b50610a8b6122d3565b005b348015610a9957600080fd5b50610aa261235b565b604051610aaf9190614ec9565b60405180910390f35b348015610ac457600080fd5b50610acd612361565b604051610ada9190614b9e565b60405180910390f35b348015610aef57600080fd5b50610af861238a565b604051610b059190614c87565b60405180910390f35b348015610b1a57600080fd5b50610b356004803603810190610b309190614289565b61241c565b005b348015610b4357600080fd5b50610b4c612594565b005b348015610b5a57600080fd5b50610b756004803603810190610b709190614206565b6128ad565b005b348015610b8357600080fd5b50610b9e6004803603810190610b9991906144da565b612900565b604051610bab9190614c87565b60405180910390f35b348015610bc057600080fd5b50610bc9612a2b565b604051610bd69190614ec9565b60405180910390f35b348015610beb57600080fd5b50610c066004803603810190610c019190614173565b612a31565b604051610c139190614c27565b60405180910390f35b348015610c2857600080fd5b50610c31612ac5565b604051610c3e9190614ec9565b60405180910390f35b348015610c5357600080fd5b50610c6e6004803603810190610c699190614146565b612acb565b005b348015610c7c57600080fd5b50610c976004803603810190610c9291906144da565b612bc3565b005b348015610ca557600080fd5b50610cae612c49565b604051610cbb9190614ec9565b60405180910390f35b348015610cd057600080fd5b50610ceb6004803603810190610ce69190614444565b612c4f565b005b348015610cf957600080fd5b50610d02612ce1565b604051610d0f9190614ec9565b60405180910390f35b348015610d2457600080fd5b50610d3f6004803603810190610d3a9190614146565b612ce7565b604051610d4c9190614ec9565b60405180910390f35b60165481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610e2657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e8e57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e9e5750610e9d82612cff565b5b9050919050565b610ead612d69565b73ffffffffffffffffffffffffffffffffffffffff16610ecb612361565b73ffffffffffffffffffffffffffffffffffffffff1614610f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1890614d69565b60405180910390fd5b80601a60006101000a81548160ff02191690831515021790555050565b601c6020528060005260406000206000915090505481565b610f5e612d69565b73ffffffffffffffffffffffffffffffffffffffff16610f7c612361565b73ffffffffffffffffffffffffffffffffffffffff1614610fd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc990614d69565b60405180910390fd5b600f54811115611017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100e90614ce9565b60405180910390fd5b60105481611023611346565b61102d9190615007565b111561106e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106590614e89565b60405180910390fd5b6110788282612d71565b80600f600082825461108a91906150e8565b925050819055505050565b6060600280546110a49061521f565b80601f01602080910402602001604051908101604052809291908181526020018280546110d09061521f565b801561111d5780601f106110f25761010080835404028352916020019161111d565b820191906000526020600020905b81548152906001019060200180831161110057829003601f168201915b5050505050905090565b600061113282612d8f565b611168576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006111ae8261209b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611216576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611235612d69565b73ffffffffffffffffffffffffffffffffffffffff1614158015611267575061126581611260612d69565b612a31565b155b1561129e576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112a9838383612d9d565b505050565b60115481565b6112bc612d69565b73ffffffffffffffffffffffffffffffffffffffff166112da612361565b73ffffffffffffffffffffffffffffffffffffffff1614611330576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132790614d69565b60405180910390fd5b8060128190555050565b600e5481565b60175481565b6000600154905090565b611358612d69565b73ffffffffffffffffffffffffffffffffffffffff16611376612361565b73ffffffffffffffffffffffffffffffffffffffff16146113cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c390614d69565b60405180910390fd5b80600d8190555050565b6113e1838383612e4f565b505050565b6113ee612d69565b73ffffffffffffffffffffffffffffffffffffffff1661140c612361565b73ffffffffffffffffffffffffffffffffffffffff1614611462576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145990614d69565b60405180910390fd5b8360138190555082601481905550816015819055508060168190555050505050565b61148c612d69565b73ffffffffffffffffffffffffffffffffffffffff166114aa612361565b73ffffffffffffffffffffffffffffffffffffffff1614611500576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f790614d69565b60405180910390fd5b60005b8282905081101561158d576001601d6000858585818110611527576115266153e6565b5b905060200201602081019061153c9190614146565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808061158590615282565b915050611503565b505050565b60125481565b8282826115a733848484611a20565b6115e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115dd90614de9565b60405180910390fd5b60135442101580156115fa57506014544211155b611639576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163090614da9565b60405180910390fd5b6001601d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541480156116d35750600d5487601b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116d19190615007565b115b1561171e5760175442101561171d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171490614d89565b60405180910390fd5b5b601d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600d5461176b9190615007565b87601b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546117b69190615007565b11156117f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ee90614dc9565b60405180910390fd5b86601b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118469190615007565b9250508190555061185687613374565b50505050505050565b600061186a836121f3565b82106118a2576040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006118ac611346565b905060008060005b83811015611a06576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146119a657806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156119f857868414156119ef578195505050505050611a1a565b83806001019450505b5080806001019150506118b4565b506000611a1657611a1561532a565b5b5050505b92915050565b6000803086604051602001611a36929190614b08565b604051602081830303815290604052805190602001209050600181604051602001611a619190614b63565b6040516020818303038152906040528051906020012086868660405160008152602001604052604051611a979493929190614c42565b6020604051602081039080840390855afa158015611ab9573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614915050949350505050565b611b26612d69565b73ffffffffffffffffffffffffffffffffffffffff16611b44612361565b73ffffffffffffffffffffffffffffffffffffffff1614611b9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9190614d69565b60405180910390fd5b8060108190555081600f819055505050565b611bb4612d69565b73ffffffffffffffffffffffffffffffffffffffff16611bd2612361565b73ffffffffffffffffffffffffffffffffffffffff1614611c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1f90614d69565b60405180910390fd5b8060178190555050565b611c3a612d69565b73ffffffffffffffffffffffffffffffffffffffff16611c58612361565b73ffffffffffffffffffffffffffffffffffffffff1614611cae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca590614d69565b60405180910390fd5b8060118190555050565b611cd3838383604051806020016040528060008152506128ad565b505050565b60606000611ce5836121f3565b905060008167ffffffffffffffff811115611d0357611d02615415565b5b604051908082528060200260200182016040528015611d315781602001602082028036833780820191505090505b50905060005b82811015611d7b57611d49858261185f565b828281518110611d5c57611d5b6153e6565b5b6020026020010181815250508080611d7390615282565b915050611d37565b508092505050919050565b60135481565b611d94612d69565b73ffffffffffffffffffffffffffffffffffffffff16611db2612361565b73ffffffffffffffffffffffffffffffffffffffff1614611e08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dff90614d69565b60405180910390fd5b8060199080519060200190611e1e929190613dc4565b506001601a60016101000a81548160ff02191690831515021790555050565b6000611e47611346565b8210611e7f576040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b819050919050565b601a60019054906101000a900460ff1681565b611ea2612d69565b73ffffffffffffffffffffffffffffffffffffffff16611ec0612361565b73ffffffffffffffffffffffffffffffffffffffff1614611f16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0d90614d69565b60405180910390fd5b818160199190611f27929190613e4a565b505050565b6015544210158015611f4057506016544211155b611f7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7690614cc9565b60405180910390fd5b600e5481601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611fcd9190615007565b111561200e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200590614d29565b60405180910390fd5b80601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461205d9190615007565b9250508190555061206d81613374565b50565b601a60009054906101000a900460ff1681565b601b6020528060005260406000206000915090505481565b60006120a68261352b565b600001519050919050565b601980546120be9061521f565b80601f01602080910402602001604051908101604052809291908181526020018280546120ea9061521f565b80156121375780601f1061210c57610100808354040283529160200191612137565b820191906000526020600020905b81548152906001019060200180831161211a57829003601f168201915b505050505081565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601880546121729061521f565b80601f016020809104026020016040519081016040528092919081815260200182805461219e9061521f565b80156121eb5780601f106121c0576101008083540402835291602001916121eb565b820191906000526020600020905b8154815290600101906020018083116121ce57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561225b576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6122db612d69565b73ffffffffffffffffffffffffffffffffffffffff166122f9612361565b73ffffffffffffffffffffffffffffffffffffffff161461234f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234690614d69565b60405180910390fd5b6123596000613678565b565b60155481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546123999061521f565b80601f01602080910402602001604051908101604052809291908181526020018280546123c59061521f565b80156124125780601f106123e757610100808354040283529160200191612412565b820191906000526020600020905b8154815290600101906020018083116123f557829003601f168201915b5050505050905090565b612424612d69565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612489576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000612496612d69565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612543612d69565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516125889190614c27565b60405180910390a35050565b61259c612d69565b73ffffffffffffffffffffffffffffffffffffffff166125ba612361565b73ffffffffffffffffffffffffffffffffffffffff1614612610576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260790614d69565b60405180910390fd5b60026008541415612656576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264d90614e69565b60405180910390fd5b60026008819055506000601460644761266f919061505d565b612679919061508e565b90506000601e60644761268c919061505d565b612696919061508e565b9050600060326064476126a9919061505d565b6126b3919061508e565b90506000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16846040516126fd90614b89565b60006040518083038185875af1925050503d806000811461273a576040519150601f19603f3d011682016040523d82523d6000602084013e61273f565b606091505b50509050600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168360405161278990614b89565b60006040518083038185875af1925050503d80600081146127c6576040519150601f19603f3d011682016040523d82523d6000602084013e6127cb565b606091505b505080915050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260405161281790614b89565b60006040518083038185875af1925050503d8060008114612854576040519150601f19603f3d011682016040523d82523d6000602084013e612859565b606091505b5050809150508061289f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289690614e49565b60405180910390fd5b505050506001600881905550565b6128b8848484612e4f565b6128c48484848461373c565b6128fa576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b606061290b82612d8f565b61294a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294190614ea9565b60405180910390fd5b60001515601a60019054906101000a900460ff16151514156129f857601880546129739061521f565b80601f016020809104026020016040519081016040528092919081815260200182805461299f9061521f565b80156129ec5780601f106129c1576101008083540402835291602001916129ec565b820191906000526020600020905b8154815290600101906020018083116129cf57829003601f168201915b50505050509050612a26565b6019612a03836138ca565b604051602001612a14929190614b34565b60405160208183030381529060405290505b919050565b60105481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d5481565b612ad3612d69565b73ffffffffffffffffffffffffffffffffffffffff16612af1612361565b73ffffffffffffffffffffffffffffffffffffffff1614612b47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3e90614d69565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612bb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bae90614ca9565b60405180910390fd5b612bc081613678565b50565b612bcb612d69565b73ffffffffffffffffffffffffffffffffffffffff16612be9612361565b73ffffffffffffffffffffffffffffffffffffffff1614612c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3690614d69565b60405180910390fd5b80600e8190555050565b60145481565b612c57612d69565b73ffffffffffffffffffffffffffffffffffffffff16612c75612361565b73ffffffffffffffffffffffffffffffffffffffff1614612ccb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc290614d69565b60405180910390fd5b818160189190612cdc929190613e4a565b505050565b600f5481565b601d6020528060005260406000206000915090505481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b612d8b828260405180602001604052806000815250613a2b565b5050565b600060015482109050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000612e5a8261352b565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612e81612d69565b73ffffffffffffffffffffffffffffffffffffffff161480612eb45750612eb38260000151612eae612d69565b612a31565b5b80612ef95750612ec2612d69565b73ffffffffffffffffffffffffffffffffffffffff16612ee184611127565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612f32576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612f9b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613002576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61300f8585856001613a3d565b61301f6000848460000151612d9d565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156133045761326381612d8f565b156133035782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461336d8585856001613a43565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146133e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133d990614e29565b60405180910390fd5b601054816133ee611346565b6133f89190615007565b1115613439576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343090614e89565b60405180910390fd5b80601154613447919061508e565b341015613489576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161348090614d09565b60405180910390fd5b6012548111156134ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134c590614d49565b60405180910390fd5b601a60009054906101000a900460ff161561351e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161351590614e09565b60405180910390fd5b6135283382612d71565b50565b613533613ed0565b61353c82612d8f565b613572576040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008290505b6000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614613664578092505050613673565b50808060019003915050613578565b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600061375d8473ffffffffffffffffffffffffffffffffffffffff16613a49565b156138bd578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613786612d69565b8786866040518563ffffffff1660e01b81526004016137a89493929190614bb9565b602060405180830381600087803b1580156137c257600080fd5b505af19250505080156137f357506040513d601f19601f820116820180604052508101906137f09190614417565b60015b61386d573d8060008114613823576040519150601f19603f3d011682016040523d82523d6000602084013e613828565b606091505b50600081511415613865576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506138c2565b600190505b949350505050565b60606000821415613912576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613a26565b600082905060005b6000821461394457808061392d90615282565b915050600a8261393d919061505d565b915061391a565b60008167ffffffffffffffff8111156139605761395f615415565b5b6040519080825280601f01601f1916602001820160405280156139925781602001600182028036833780820191505090505b5090505b60008514613a1f576001826139ab91906150e8565b9150600a856139ba91906152f9565b60306139c69190615007565b60f81b8183815181106139dc576139db6153e6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613a18919061505d565b9450613996565b8093505050505b919050565b613a388383836001613a5c565b505050565b50505050565b50505050565b600080823b905060008111915050919050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613aca576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415613b05576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613b126000868387613a3d565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b85811015613da757818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4838015613d5b5750613d59600088848861373c565b155b15613d92576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81806001019250508080600101915050613ce0565b508060018190555050613dbd6000868387613a43565b5050505050565b828054613dd09061521f565b90600052602060002090601f016020900481019282613df25760008555613e39565b82601f10613e0b57805160ff1916838001178555613e39565b82800160010185558215613e39579182015b82811115613e38578251825591602001919060010190613e1d565b5b509050613e469190613f0a565b5090565b828054613e569061521f565b90600052602060002090601f016020900481019282613e785760008555613ebf565b82601f10613e9157803560ff1916838001178555613ebf565b82800160010185558215613ebf579182015b82811115613ebe578235825591602001919060010190613ea3565b5b509050613ecc9190613f0a565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613f23576000816000905550600101613f0b565b5090565b6000613f3a613f3584614f09565b614ee4565b905082815260208101848484011115613f5657613f55615453565b5b613f618482856151dd565b509392505050565b6000613f7c613f7784614f3a565b614ee4565b905082815260208101848484011115613f9857613f97615453565b5b613fa38482856151dd565b509392505050565b600081359050613fba816159c8565b92915050565b60008083601f840112613fd657613fd5615449565b5b8235905067ffffffffffffffff811115613ff357613ff2615444565b5b60208301915083602082028301111561400f5761400e61544e565b5b9250929050565b600081359050614025816159df565b92915050565b60008135905061403a816159f6565b92915050565b60008135905061404f81615a0d565b92915050565b60008151905061406481615a0d565b92915050565b600082601f83011261407f5761407e615449565b5b813561408f848260208601613f27565b91505092915050565b60008083601f8401126140ae576140ad615449565b5b8235905067ffffffffffffffff8111156140cb576140ca615444565b5b6020830191508360018202830111156140e7576140e661544e565b5b9250929050565b600082601f83011261410357614102615449565b5b8135614113848260208601613f69565b91505092915050565b60008135905061412b81615a24565b92915050565b60008135905061414081615a3b565b92915050565b60006020828403121561415c5761415b61545d565b5b600061416a84828501613fab565b91505092915050565b6000806040838503121561418a5761418961545d565b5b600061419885828601613fab565b92505060206141a985828601613fab565b9150509250929050565b6000806000606084860312156141cc576141cb61545d565b5b60006141da86828701613fab565b93505060206141eb86828701613fab565b92505060406141fc8682870161411c565b9150509250925092565b600080600080608085870312156142205761421f61545d565b5b600061422e87828801613fab565b945050602061423f87828801613fab565b93505060406142508782880161411c565b925050606085013567ffffffffffffffff81111561427157614270615458565b5b61427d8782880161406a565b91505092959194509250565b600080604083850312156142a05761429f61545d565b5b60006142ae85828601613fab565b92505060206142bf85828601614016565b9150509250929050565b600080604083850312156142e0576142df61545d565b5b60006142ee85828601613fab565b92505060206142ff8582860161411c565b9150509250929050565b600080600080608085870312156143235761432261545d565b5b600061433187828801613fab565b945050602061434287828801614131565b93505060406143538782880161402b565b92505060606143648782880161402b565b91505092959194509250565b600080602083850312156143875761438661545d565b5b600083013567ffffffffffffffff8111156143a5576143a4615458565b5b6143b185828601613fc0565b92509250509250929050565b6000602082840312156143d3576143d261545d565b5b60006143e184828501614016565b91505092915050565b600060208284031215614400576143ff61545d565b5b600061440e84828501614040565b91505092915050565b60006020828403121561442d5761442c61545d565b5b600061443b84828501614055565b91505092915050565b6000806020838503121561445b5761445a61545d565b5b600083013567ffffffffffffffff81111561447957614478615458565b5b61448585828601614098565b92509250509250929050565b6000602082840312156144a7576144a661545d565b5b600082013567ffffffffffffffff8111156144c5576144c4615458565b5b6144d1848285016140ee565b91505092915050565b6000602082840312156144f0576144ef61545d565b5b60006144fe8482850161411c565b91505092915050565b6000806040838503121561451e5761451d61545d565b5b600061452c8582860161411c565b925050602061453d8582860161411c565b9150509250929050565b600080600080608085870312156145615761456061545d565b5b600061456f8782880161411c565b94505060206145808782880161411c565b93505060406145918782880161411c565b92505060606145a28782880161411c565b91505092959194509250565b600080600080608085870312156145c8576145c761545d565b5b60006145d68782880161411c565b94505060206145e787828801614131565b93505060406145f88782880161402b565b92505060606146098782880161402b565b91505092959194509250565b60006146218383614adb565b60208301905092915050565b6146368161511c565b82525050565b61464d6146488261511c565b6152cb565b82525050565b600061465e82614f90565b6146688185614fbe565b935061467383614f6b565b8060005b838110156146a457815161468b8882614615565b975061469683614fb1565b925050600181019050614677565b5085935050505092915050565b6146ba8161512e565b82525050565b6146c98161513a565b82525050565b6146e06146db8261513a565b6152dd565b82525050565b60006146f182614f9b565b6146fb8185614fcf565b935061470b8185602086016151ec565b61471481615462565b840191505092915050565b61473061472b826151a7565b6152cb565b82525050565b600061474182614fa6565b61474b8185614feb565b935061475b8185602086016151ec565b61476481615462565b840191505092915050565b600061477a82614fa6565b6147848185614ffc565b93506147948185602086016151ec565b80840191505092915050565b600081546147ad8161521f565b6147b78186614ffc565b945060018216600081146147d257600181146147e357614816565b60ff19831686528186019350614816565b6147ec85614f7b565b60005b8381101561480e578154818901526001820191506020810190506147ef565b838801955050505b50505092915050565b600061482c601c83614ffc565b915061483782615480565b601c82019050919050565b600061484f602683614feb565b915061485a826154a9565b604082019050919050565b6000614872602483614feb565b915061487d826154f8565b604082019050919050565b6000614895602883614feb565b91506148a082615547565b604082019050919050565b60006148b8604d83614feb565b91506148c382615596565b606082019050919050565b60006148db602e83614feb565b91506148e68261560b565b604082019050919050565b60006148fe600583614ffc565b91506149098261565a565b600582019050919050565b6000614921602f83614feb565b915061492c82615683565b604082019050919050565b6000614944602083614feb565b915061494f826156d2565b602082019050919050565b6000614967603f83614feb565b9150614972826156fb565b604082019050919050565b600061498a602083614feb565b91506149958261574a565b602082019050919050565b60006149ad604583614feb565b91506149b882615773565b606082019050919050565b60006149d0604b83614feb565b91506149db826157e8565b606082019050919050565b60006149f3602e83614feb565b91506149fe8261585d565b604082019050919050565b6000614a16601083614feb565b9150614a21826158ac565b602082019050919050565b6000614a39600083614fe0565b9150614a44826158d5565b600082019050919050565b6000614a5c601083614feb565b9150614a67826158d8565b602082019050919050565b6000614a7f601f83614feb565b9150614a8a82615901565b602082019050919050565b6000614aa2603a83614feb565b9150614aad8261592a565b604082019050919050565b6000614ac5603083614feb565b9150614ad082615979565b604082019050919050565b614ae481615190565b82525050565b614af381615190565b82525050565b614b028161519a565b82525050565b6000614b14828561471f565b601482019150614b24828461463c565b6014820191508190509392505050565b6000614b4082856147a0565b9150614b4c828461476f565b9150614b57826148f1565b91508190509392505050565b6000614b6e8261481f565b9150614b7a82846146cf565b60208201915081905092915050565b6000614b9482614a2c565b9150819050919050565b6000602082019050614bb3600083018461462d565b92915050565b6000608082019050614bce600083018761462d565b614bdb602083018661462d565b614be86040830185614aea565b8181036060830152614bfa81846146e6565b905095945050505050565b60006020820190508181036000830152614c1f8184614653565b905092915050565b6000602082019050614c3c60008301846146b1565b92915050565b6000608082019050614c5760008301876146c0565b614c646020830186614af9565b614c7160408301856146c0565b614c7e60608301846146c0565b95945050505050565b60006020820190508181036000830152614ca18184614736565b905092915050565b60006020820190508181036000830152614cc281614842565b9050919050565b60006020820190508181036000830152614ce281614865565b9050919050565b60006020820190508181036000830152614d0281614888565b9050919050565b60006020820190508181036000830152614d22816148ab565b9050919050565b60006020820190508181036000830152614d42816148ce565b9050919050565b60006020820190508181036000830152614d6281614914565b9050919050565b60006020820190508181036000830152614d8281614937565b9050919050565b60006020820190508181036000830152614da28161495a565b9050919050565b60006020820190508181036000830152614dc28161497d565b9050919050565b60006020820190508181036000830152614de2816149a0565b9050919050565b60006020820190508181036000830152614e02816149c3565b9050919050565b60006020820190508181036000830152614e22816149e6565b9050919050565b60006020820190508181036000830152614e4281614a09565b9050919050565b60006020820190508181036000830152614e6281614a4f565b9050919050565b60006020820190508181036000830152614e8281614a72565b9050919050565b60006020820190508181036000830152614ea281614a95565b9050919050565b60006020820190508181036000830152614ec281614ab8565b9050919050565b6000602082019050614ede6000830184614aea565b92915050565b6000614eee614eff565b9050614efa8282615251565b919050565b6000604051905090565b600067ffffffffffffffff821115614f2457614f23615415565b5b614f2d82615462565b9050602081019050919050565b600067ffffffffffffffff821115614f5557614f54615415565b5b614f5e82615462565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061501282615190565b915061501d83615190565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561505257615051615359565b5b828201905092915050565b600061506882615190565b915061507383615190565b92508261508357615082615388565b5b828204905092915050565b600061509982615190565b91506150a483615190565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156150dd576150dc615359565b5b828202905092915050565b60006150f382615190565b91506150fe83615190565b92508282101561511157615110615359565b5b828203905092915050565b600061512782615170565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006151b2826151b9565b9050919050565b60006151c4826151cb565b9050919050565b60006151d682615170565b9050919050565b82818337600083830152505050565b60005b8381101561520a5780820151818401526020810190506151ef565b83811115615219576000848401525b50505050565b6000600282049050600182168061523757607f821691505b6020821081141561524b5761524a6153b7565b5b50919050565b61525a82615462565b810181811067ffffffffffffffff8211171561527957615278615415565b5b80604052505050565b600061528d82615190565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156152c0576152bf615359565b5b600182019050919050565b60006152d6826152e7565b9050919050565b6000819050919050565b60006152f282615473565b9050919050565b600061530482615190565b915061530f83615190565b92508261531f5761531e615388565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5075626c69632073616c653a2070757263686173652077696e646f7720636c6f60008201527f7365642e00000000000000000000000000000000000000000000000000000000602082015250565b7f5468697320616d6f756e7420657863656564732072657365727665642073757060008201527f706c792e20313030000000000000000000000000000000000000000000000000602082015250565b7f496e76616c69642070757263686173652c2074686520616d6f756e74206f662060008201527f6574682073656e7420697320696e73756666696369656e7420746f2070726f6360208201527f65737320746865206d696e742e00000000000000000000000000000000000000604082015250565b7f596f752063616e206f6e6c79206d696e74203320746f6b656e7320647572696e60008201527f67207075626c69632073616c652e000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f596f75277265206f6e6c7920616c6c6f77656420746f206d696e74203320746f60008201527f6b656e7320617420612074696d652e0000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4f4720617265206f6e6c7920616c6c6f77656420746f206d696e74207468656960008201527f7220706c7573206f6e6520696e20746865206c617374203620686f7572732e00602082015250565b7f50726573616c653a2070757263686173652077696e646f7720636c6f7365642e600082015250565b7f596f752063616e206f6e6c79206d696e7420322028332920746f6b656e73206460008201527f7572696e672070726573616c6520284f4720726f6c6520686173206f6e65206d60208201527f6f7265292e000000000000000000000000000000000000000000000000000000604082015250565b7f496e76616c69642073696e67617475726520666f72206164647265737320636160008201527f6c6c696e67207468652066756e6374696f6e2c206163636f756e74206e6f742060208201527f696e2070726573616c652e000000000000000000000000000000000000000000604082015250565b7f4d696e74696e67206e6f7420617661696c61626c652c2074686520636f6e747260008201527f616374206973207061757365642e000000000000000000000000000000000000602082015250565b7f4e6f20626f747320616c6c6f7765642e00000000000000000000000000000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f5468697320616d6f756e74206f6620746f6b656e7320776f756c64207375727060008201527f61737320746865206d617820737570706c79202834393939292e000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e2e00000000000000000000000000000000602082015250565b6159d18161511c565b81146159dc57600080fd5b50565b6159e88161512e565b81146159f357600080fd5b50565b6159ff8161513a565b8114615a0a57600080fd5b50565b615a1681615144565b8114615a2157600080fd5b50565b615a2d81615190565b8114615a3857600080fd5b50565b615a448161519a565b8114615a4f57600080fd5b5056fea26469706673582212200934a0758a35e3a1d0287d151bd3e2c9f9e9cefccdc8e2a7058933536aba993e64736f6c63430008070033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000a65aae78edef916d4102ba7b5672068c0d35fbff00000000000000000000000026ac68037c202b8ac2d1cfcc487651dad41b68e00000000000000000000000004e3c4cb1c2ecc0005c5980a5c09ac5146529ccb2000000000000000000000000128dbbc9a8e0f1c9c5b28faca391891fcdc707f7000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d4e6a4c4e393873354e3134574e69703635766f45647054566e534d39796945695231654c4358774a4a56563800000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _unrevealedURI (string): https://gateway.pinata.cloud/ipfs/QmNjLN98s5N14WNip65voEdpTVnSM9yiEiR1eLCXwJJVV8
Arg [1] : _signerRole (address): 0xA65aae78EdEF916d4102BA7b5672068C0D35fbff
Arg [2] : _address1 (address): 0x26ac68037C202B8AC2D1CFcc487651daD41B68E0
Arg [3] : _address2 (address): 0x4E3c4cB1c2ecc0005C5980A5C09Ac5146529Ccb2
Arg [4] : _address3 (address): 0x128Dbbc9A8E0F1c9c5b28FacA391891Fcdc707F7

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 000000000000000000000000a65aae78edef916d4102ba7b5672068c0d35fbff
Arg [2] : 00000000000000000000000026ac68037c202b8ac2d1cfcc487651dad41b68e0
Arg [3] : 0000000000000000000000004e3c4cb1c2ecc0005c5980a5c09ac5146529ccb2
Arg [4] : 000000000000000000000000128dbbc9a8e0f1c9c5b28faca391891fcdc707f7
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000050
Arg [6] : 68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066
Arg [7] : 732f516d4e6a4c4e393873354e3134574e69703635766f45647054566e534d39
Arg [8] : 796945695231654c4358774a4a56563800000000000000000000000000000000


Deployed Bytecode Sourcemap

43085:7531:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43763:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27815:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48157:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44134:58;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46783:346;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29574:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31051:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30640:345;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43506:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48992:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43387:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43816:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26082:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48746:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31908:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48250:367;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49100:159;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43546:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44918:830;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26736:1007;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49447:302;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47962:183;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48625:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49267:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32149:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49757:370;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43603:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47786:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26260:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44005:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47538:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45756:436;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43972:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44072:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29383:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43920:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43194:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43886:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28251:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42193:103;;;;;;;;;;;;;:::i;:::-;;43711:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41542:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29743:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31327:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50135:476;;;;;;;;;;;;;:::i;:::-;;32405:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47169:361;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43468:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31677:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43341:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42451:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48868:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43656:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47652:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43432:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44199:38;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43763:46;;;;:::o;27815:372::-;27917:4;27969:25;27954:40;;;:11;:40;;;;:105;;;;28026:33;28011:48;;;:11;:48;;;;27954:105;:172;;;;28091:35;28076:50;;;:11;:50;;;;27954:172;:225;;;;28143:36;28167:11;28143:23;:36::i;:::-;27954:225;27934:245;;27815:372;;;:::o;48157:81::-;41773:12;:10;:12::i;:::-;41762:23;;:7;:5;:7::i;:::-;:23;;;41754:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48224:6:::1;48215;;:15;;;;;;;;;;;;;;;;;;48157:81:::0;:::o;44134:58::-;;;;;;;;;;;;;;;;;:::o;46783:346::-;41773:12;:10;:12::i;:::-;41762:23;;:7;:5;:7::i;:::-;:23;;;41754:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46881:8:::1;;46869;:20;;46861:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;46982:9;;46970:8;46954:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:37;;46946:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;47067:23;47077:2;47081:8;47067:9;:23::i;:::-;47113:8;47101;;:20;;;;;;;:::i;:::-;;;;;;;;46783:346:::0;;:::o;29574:100::-;29628:13;29661:5;29654:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29574:100;:::o;31051:204::-;31119:7;31144:16;31152:7;31144;:16::i;:::-;31139:64;;31169:34;;;;;;;;;;;;;;31139:64;31223:15;:24;31239:7;31223:24;;;;;;;;;;;;;;;;;;;;;31216:31;;31051:204;;;:::o;30640:345::-;30713:13;30729:24;30745:7;30729:15;:24::i;:::-;30713:40;;30774:5;30768:11;;:2;:11;;;30764:48;;;30788:24;;;;;;;;;;;;;;30764:48;30845:5;30829:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;30855:37;30872:5;30879:12;:10;:12::i;:::-;30855:16;:37::i;:::-;30854:38;30829:63;30825:111;;;30901:35;;;;;;;;;;;;;;30825:111;30949:28;30958:2;30962:7;30971:5;30949:8;:28::i;:::-;30702:283;30640:345;;:::o;43506:33::-;;;;:::o;48992:100::-;41773:12;:10;:12::i;:::-;41762:23;;:7;:5;:7::i;:::-;:23;;;41754:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49075:9:::1;49060:12;:24;;;;48992:100:::0;:::o;43387:38::-;;;;:::o;43816:41::-;;;;:::o;26082:101::-;26135:7;26162:13;;26155:20;;26082:101;:::o;48746:114::-;41773:12;:10;:12::i;:::-;41762:23;;:7;:5;:7::i;:::-;:23;;;41754:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48841:11:::1;48818:20;:34;;;;48746:114:::0;:::o;31908:170::-;32042:28;32052:4;32058:2;32062:7;32042:9;:28::i;:::-;31908:170;;;:::o;48250:367::-;41773:12;:10;:12::i;:::-;41762:23;;:7;:5;:7::i;:::-;:23;;;41754:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48438:19:::1;48417:18;:40;;;;48489:20;48468:19;:41;;;;48540:18;48520:17;:38;;;;48590:19;48569:18;:40;;;;48250:367:::0;;;;:::o;49100:159::-;41773:12;:10;:12::i;:::-;41762:23;;:7;:5;:7::i;:::-;:23;;;41754:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49176:9:::1;49171:81;49191:4;;:11;;49187:1;:15;49171:81;;;49239:1;49224:3;:12;49228:4;;49233:1;49228:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;49224:12;;;;;;;;;;;;;;;:16;;;;49204:3;;;;;:::i;:::-;;;;49171:81;;;;49100:159:::0;;:::o;43546:31::-;;;;:::o;44918:830::-;45024:2;45028;45032;44713:44;44734:10;44746:2;44750;44754;44713:20;:44::i;:::-;44705:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;45074:18:::1;;45055:15;:37;;:79;;;;;45115:19;;45096:15;:38;;45055:79;45047:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;45263:1;45244:3;:15;45248:10;45244:15;;;;;;;;;;;;;;;;:20;:92;;;;;45316:20;;45304:8;45269:20;:32;45290:10;45269:32;;;;;;;;;;;;;;;;:43;;;;:::i;:::-;45268:68;45244:92;45241:231;;;45379:13;;45360:15;:32;;45352:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;45241:231;45561:3;:15;45565:10;45561:15;;;;;;;;;;;;;;;;45538:20;;:38;;;;:::i;:::-;45525:8;45490:20;:32;45511:10;45490:32;;;;;;;;;;;;;;;;:43;;;;:::i;:::-;:87;;45482:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;45707:8;45671:20;:32;45692:10;45671:32;;;;;;;;;;;;;;;;:44;;;;;;;:::i;:::-;;;;;;;;45726:14;45731:8;45726:4;:14::i;:::-;44918:830:::0;;;;;;;:::o;26736:1007::-;26825:7;26858:16;26868:5;26858:9;:16::i;:::-;26849:5;:25;26845:61;;26883:23;;;;;;;;;;;;;;26845:61;26917:22;26942:13;:11;:13::i;:::-;26917:38;;26966:19;26996:25;27185:9;27180:466;27200:14;27196:1;:18;27180:466;;;27240:31;27274:11;:14;27286:1;27274:14;;;;;;;;;;;27240:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27337:1;27311:28;;:9;:14;;;:28;;;27307:111;;27384:9;:14;;;27364:34;;27307:111;27461:5;27440:26;;:17;:26;;;27436:195;;;27510:5;27495:11;:20;27491:85;;;27551:1;27544:8;;;;;;;;;27491:85;27598:13;;;;;;;27436:195;27221:425;27216:3;;;;;;;27180:466;;;;27729:5;27722:13;;;;:::i;:::-;;26834:909;;;26736:1007;;;;;:::o;49447:302::-;49546:4;49563:12;49605:4;49611;49588:28;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49578:39;;;;;;49563:54;;49649:92;49722:4;49669:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;49659:69;;;;;;49730:2;49734;49738;49649:92;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49635:106;;:10;;;;;;;;;;;:106;;;49628:113;;;49447:302;;;;;;:::o;47962:183::-;41773:12;:10;:12::i;:::-;41762:23;;:7;:5;:7::i;:::-;:23;;;41754:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48081:16:::1;48069:9;:28;;;;48119:18;48108:8;:29;;;;47962:183:::0;;:::o;48625:113::-;41773:12;:10;:12::i;:::-;41762:23;;:7;:5;:7::i;:::-;:23;;;41754:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48716:14:::1;48700:13;:30;;;;48625:113:::0;:::o;49267:130::-;41773:12;:10;:12::i;:::-;41762:23;;:7;:5;:7::i;:::-;:23;;;41754:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49381:8:::1;49374:4;:15;;;;49267:130:::0;:::o;32149:185::-;32287:39;32304:4;32310:2;32314:7;32287:39;;;;;;;;;;;;:16;:39::i;:::-;32149:185;;;:::o;49757:370::-;49817:16;49846:23;49872:17;49882:6;49872:9;:17::i;:::-;49846:43;;49900:25;49942:15;49928:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49900:58;;49976:9;49971:113;49991:15;49987:1;:19;49971:113;;;50042:30;50062:6;50070:1;50042:19;:30::i;:::-;50028:8;50037:1;50028:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;50008:3;;;;;:::i;:::-;;;;49971:113;;;;50111:8;50104:15;;;;49757:370;;;:::o;43603:46::-;;;;:::o;47786:122::-;41773:12;:10;:12::i;:::-;41762:23;;:7;:5;:7::i;:::-;:23;;;41754:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47866:8:::1;47856:7;:18;;;;;;;;;;;;:::i;:::-;;47896:4;47885:8;;:15;;;;;;;;;;;;;;;;;;47786:122:::0;:::o;26260:176::-;26327:7;26360:13;:11;:13::i;:::-;26351:5;:22;26347:58;;26382:23;;;;;;;;;;;;;;26347:58;26423:5;26416:12;;26260:176;;;:::o;44005:28::-;;;;;;;;;;;;;:::o;47538:102::-;41773:12;:10;:12::i;:::-;41762:23;;:7;:5;:7::i;:::-;:23;;;41754:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47624:8:::1;;47614:7;:18;;;;;;;:::i;:::-;;47538:102:::0;;:::o;45756:436::-;45853:17;;45834:15;:36;;:77;;;;;45893:18;;45874:15;:37;;45834:77;45826:126;;;;;;;;;;;;:::i;:::-;;;;;;;;;46021:19;;46009:8;45971:23;:35;45995:10;45971:35;;;;;;;;;;;;;;;;:46;;;;:::i;:::-;:69;;45963:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;46151:8;46112:23;:35;46136:10;46112:35;;;;;;;;;;;;;;;;:47;;;;;;;:::i;:::-;;;;;;;;46170:14;46175:8;46170:4;:14::i;:::-;45756:436;:::o;43972:26::-;;;;;;;;;;;;;:::o;44072:55::-;;;;;;;;;;;;;;;;;:::o;29383:124::-;29447:7;29474:20;29486:7;29474:11;:20::i;:::-;:25;;;29467:32;;29383:124;;;:::o;43920:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43194:25::-;;;;;;;;;;;;;:::o;43886:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28251:206::-;28315:7;28356:1;28339:19;;:5;:19;;;28335:60;;;28367:28;;;;;;;;;;;;;;28335:60;28421:12;:19;28434:5;28421:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;28413:36;;28406:43;;28251:206;;;:::o;42193:103::-;41773:12;:10;:12::i;:::-;41762:23;;:7;:5;:7::i;:::-;:23;;;41754:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42258:30:::1;42285:1;42258:18;:30::i;:::-;42193:103::o:0;43711:45::-;;;;:::o;41542:87::-;41588:7;41615:6;;;;;;;;;;;41608:13;;41542:87;:::o;29743:104::-;29799:13;29832:7;29825:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29743:104;:::o;31327:279::-;31430:12;:10;:12::i;:::-;31418:24;;:8;:24;;;31414:54;;;31451:17;;;;;;;;;;;;;;31414:54;31526:8;31481:18;:32;31500:12;:10;:12::i;:::-;31481:32;;;;;;;;;;;;;;;:42;31514:8;31481:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;31579:8;31550:48;;31565:12;:10;:12::i;:::-;31550:48;;;31589:8;31550:48;;;;;;:::i;:::-;;;;;;;;31327:279;;:::o;50135:476::-;41773:12;:10;:12::i;:::-;41762:23;;:7;:5;:7::i;:::-;:23;;;41754:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21812:1:::1;22410:7;;:19;;22402:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;21812:1;22543:7;:18;;;;50203:15:::2;50251:2;50245:3;50221:21;:27;;;;:::i;:::-;:32;;;;:::i;:::-;50203:50;;50264:15;50312:2;50306:3;50282:21;:27;;;;:::i;:::-;:32;;;;:::i;:::-;50264:50;;50325:15;50373:2;50367:3;50343:21;:27;;;;:::i;:::-;:32;;;;:::i;:::-;50325:50;;50389:12;50407:8;;;;;;;;;;;:13;;50428:7;50407:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50388:52;;;50465:8;;;;;;;;;;;:13;;50486:7;50465:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50451:47;;;;;50523:8;;;;;;;;;;;:13;;50544:7;50523:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50509:47;;;;;50575:7;50567:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;50192:419;;;;21768:1:::1;22722:7;:22;;;;50135:476::o:0;32405:308::-;32564:28;32574:4;32580:2;32584:7;32564:9;:28::i;:::-;32608:48;32631:4;32637:2;32641:7;32650:5;32608:22;:48::i;:::-;32603:102;;32665:40;;;;;;;;;;;;;;32603:102;32405:308;;;;:::o;47169:361::-;47242:13;47276:16;47284:7;47276;:16::i;:::-;47268:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;47385:5;47373:17;;:8;;;;;;;;;;;:17;;;47370:69;;;47414:13;47407:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47370:69;47482:7;47491:18;:7;:16;:18::i;:::-;47465:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47451:69;;47169:361;;;;:::o;43468:31::-;;;;:::o;31677:164::-;31774:4;31798:18;:25;31817:5;31798:25;;;;;;;;;;;;;;;:35;31824:8;31798:35;;;;;;;;;;;;;;;;;;;;;;;;;31791:42;;31677:164;;;;:::o;43341:39::-;;;;:::o;42451:201::-;41773:12;:10;:12::i;:::-;41762:23;;:7;:5;:7::i;:::-;:23;;;41754:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42560:1:::1;42540:22;;:8;:22;;;;42532:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42616:28;42635:8;42616:18;:28::i;:::-;42451:201:::0;:::o;48868:116::-;41773:12;:10;:12::i;:::-;41762:23;;:7;:5;:7::i;:::-;:23;;;41754:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48964:12:::1;48942:19;:34;;;;48868:116:::0;:::o;43656:48::-;;;;:::o;47652:126::-;41773:12;:10;:12::i;:::-;41762:23;;:7;:5;:7::i;:::-;:23;;;41754:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47756:14:::1;;47740:13;:30;;;;;;;:::i;:::-;;47652:126:::0;;:::o;43432:29::-;;;;:::o;44199:38::-;;;;;;;;;;;;;;;;;:::o;13088:157::-;13173:4;13212:25;13197:40;;;:11;:40;;;;13190:47;;13088:157;;;:::o;23438:98::-;23491:7;23518:10;23511:17;;23438:98;:::o;33088:104::-;33157:27;33167:2;33171:8;33157:27;;;;;;;;;;;;:9;:27::i;:::-;33088:104;;:::o;32968:112::-;33025:4;33059:13;;33049:7;:23;33042:30;;32968:112;;;:::o;37732:196::-;37874:2;37847:15;:24;37863:7;37847:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;37912:7;37908:2;37892:28;;37901:5;37892:28;;;;;;;;;;;;37732:196;;;:::o;35652:1962::-;35767:35;35805:20;35817:7;35805:11;:20::i;:::-;35767:58;;35838:22;35880:13;:18;;;35864:34;;:12;:10;:12::i;:::-;:34;;;:101;;;;35915:50;35932:13;:18;;;35952:12;:10;:12::i;:::-;35915:16;:50::i;:::-;35864:101;:154;;;;36006:12;:10;:12::i;:::-;35982:36;;:20;35994:7;35982:11;:20::i;:::-;:36;;;35864:154;35838:181;;36037:17;36032:66;;36063:35;;;;;;;;;;;;;;36032:66;36135:4;36113:26;;:13;:18;;;:26;;;36109:67;;36148:28;;;;;;;;;;;;;;36109:67;36205:1;36191:16;;:2;:16;;;36187:52;;;36216:23;;;;;;;;;;;;;;36187:52;36252:43;36274:4;36280:2;36284:7;36293:1;36252:21;:43::i;:::-;36360:49;36377:1;36381:7;36390:13;:18;;;36360:8;:49::i;:::-;36735:1;36705:12;:18;36718:4;36705:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36779:1;36751:12;:16;36764:2;36751:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36825:2;36797:11;:20;36809:7;36797:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;36887:15;36842:11;:20;36854:7;36842:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;37155:19;37187:1;37177:7;:11;37155:33;;37248:1;37207:43;;:11;:24;37219:11;37207:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;37203:295;;;37275:20;37283:11;37275:7;:20::i;:::-;37271:212;;;37352:13;:18;;;37320:11;:24;37332:11;37320:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;37435:13;:28;;;37393:11;:24;37405:11;37393:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;37271:212;37203:295;36680:829;37545:7;37541:2;37526:27;;37535:4;37526:27;;;;;;;;;;;;37564:42;37585:4;37591:2;37595:7;37604:1;37564:20;:42::i;:::-;35756:1858;;35652:1962;;;:::o;46200:575::-;46272:10;46259:23;;:9;:23;;;46251:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;46350:9;;46338:8;46322:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:37;;46314:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;46461:8;46454:4;;:15;;;;:::i;:::-;46441:9;:28;;46433:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;46582:12;;46570:8;:24;;46562:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;46666:6;;;;;;;;;;;46665:7;46657:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;46736:31;46746:10;46758:8;46736:9;:31::i;:::-;46200:575;:::o;28874:447::-;28935:21;;:::i;:::-;28974:16;28982:7;28974;:16::i;:::-;28969:61;;28999:31;;;;;;;;;;;;;;28969:61;29073:12;29088:7;29073:22;;29068:235;29125:31;29159:11;:17;29171:4;29159:17;;;;;;;;;;;29125:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29225:1;29199:28;;:9;:14;;;:28;;;29195:93;;29259:9;29252:16;;;;;;29195:93;29106:197;29098:6;;;;;;;;29068:235;;28874:447;;;;:::o;42812:191::-;42886:16;42905:6;;;;;;;;;;;42886:25;;42931:8;42922:6;;:17;;;;;;;;;;;;;;;;;;42986:8;42955:40;;42976:8;42955:40;;;;;;;;;;;;42875:128;42812:191;:::o;38493:765::-;38648:4;38669:15;:2;:13;;;:15::i;:::-;38665:586;;;38721:2;38705:36;;;38742:12;:10;:12::i;:::-;38756:4;38762:7;38771:5;38705:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38701:495;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38968:1;38951:6;:13;:18;38947:234;;;38978:40;;;;;;;;;;;;;;38947:234;39131:6;39125:13;39116:6;39112:2;39108:15;39101:38;38701:495;38838:45;;;38828:55;;;:6;:55;;;;38821:62;;;;;38665:586;39235:4;39228:11;;38493:765;;;;;;;:::o;365:723::-;421:13;651:1;642:5;:10;638:53;;;669:10;;;;;;;;;;;;;;;;;;;;;638:53;701:12;716:5;701:20;;732:14;757:78;772:1;764:4;:9;757:78;;790:8;;;;;:::i;:::-;;;;821:2;813:10;;;;;:::i;:::-;;;757:78;;;845:19;877:6;867:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;845:39;;895:154;911:1;902:5;:10;895:154;;939:1;929:11;;;;;:::i;:::-;;;1006:2;998:5;:10;;;;:::i;:::-;985:2;:24;;;;:::i;:::-;972:39;;955:6;962;955:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1035:2;1026:11;;;;;:::i;:::-;;;895:154;;;1073:6;1059:21;;;;;365:723;;;;:::o;33555:163::-;33678:32;33684:2;33688:8;33698:5;33705:4;33678:5;:32::i;:::-;33555:163;;;:::o;39746:159::-;;;;;:::o;40317:158::-;;;;;:::o;2944:387::-;3004:4;3212:12;3279:7;3267:20;3259:28;;3322:1;3315:4;:8;3308:15;;;2944:387;;;:::o;33978:1420::-;34117:20;34140:13;;34117:36;;34182:1;34168:16;;:2;:16;;;34164:48;;;34193:19;;;;;;;;;;;;;;34164:48;34239:1;34227:8;:13;34223:44;;;34249:18;;;;;;;;;;;;;;34223:44;34280:61;34310:1;34314:2;34318:12;34332:8;34280:21;:61::i;:::-;34656:8;34620:12;:16;34633:2;34620:16;;;;;;;;;;;;;;;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34721:8;34680:12;:16;34693:2;34680:16;;;;;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34780:2;34747:11;:25;34759:12;34747:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;34847:15;34797:11;:25;34809:12;34797:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;34880:20;34903:12;34880:35;;34937:9;34932:330;34952:8;34948:1;:12;34932:330;;;35016:12;35012:2;34991:38;;35008:1;34991:38;;;;;;;;;;;;35052:4;:68;;;;;35061:59;35092:1;35096:2;35100:12;35114:5;35061:22;:59::i;:::-;35060:60;35052:68;35048:164;;;35152:40;;;;;;;;;;;;;;35048:164;35232:14;;;;;;;34962:3;;;;;;;34932:330;;;;35294:12;35278:13;:28;;;;34595:723;35330:60;35359:1;35363:2;35367:12;35381:8;35330:20;:60::i;:::-;34106:1292;33978:1420;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::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;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:139::-;1762:5;1800:6;1787:20;1778:29;;1816:33;1843:5;1816:33;:::i;:::-;1716:139;;;;:::o;1861:137::-;1906:5;1944:6;1931:20;1922:29;;1960:32;1986:5;1960:32;:::i;:::-;1861:137;;;;:::o;2004:141::-;2060:5;2091:6;2085:13;2076:22;;2107:32;2133:5;2107:32;:::i;:::-;2004:141;;;;:::o;2164:338::-;2219:5;2268:3;2261:4;2253:6;2249:17;2245:27;2235:122;;2276:79;;:::i;:::-;2235:122;2393:6;2380:20;2418:78;2492:3;2484:6;2477:4;2469:6;2465:17;2418:78;:::i;:::-;2409:87;;2225:277;2164:338;;;;:::o;2522:553::-;2580:8;2590:6;2640:3;2633:4;2625:6;2621:17;2617:27;2607:122;;2648:79;;:::i;:::-;2607:122;2761:6;2748:20;2738:30;;2791:18;2783:6;2780:30;2777:117;;;2813:79;;:::i;:::-;2777:117;2927:4;2919:6;2915:17;2903:29;;2981:3;2973:4;2965:6;2961:17;2951:8;2947:32;2944:41;2941:128;;;2988:79;;:::i;:::-;2941:128;2522:553;;;;;:::o;3095:340::-;3151:5;3200:3;3193:4;3185:6;3181:17;3177:27;3167:122;;3208:79;;:::i;:::-;3167:122;3325:6;3312:20;3350:79;3425:3;3417:6;3410:4;3402:6;3398:17;3350:79;:::i;:::-;3341:88;;3157:278;3095:340;;;;:::o;3441:139::-;3487:5;3525:6;3512:20;3503:29;;3541:33;3568:5;3541:33;:::i;:::-;3441:139;;;;:::o;3586:135::-;3630:5;3668:6;3655:20;3646:29;;3684:31;3709:5;3684:31;:::i;:::-;3586:135;;;;:::o;3727:329::-;3786:6;3835:2;3823:9;3814:7;3810:23;3806:32;3803:119;;;3841:79;;:::i;:::-;3803:119;3961:1;3986:53;4031:7;4022:6;4011:9;4007:22;3986:53;:::i;:::-;3976:63;;3932:117;3727:329;;;;:::o;4062:474::-;4130:6;4138;4187:2;4175:9;4166:7;4162:23;4158:32;4155:119;;;4193:79;;:::i;:::-;4155:119;4313:1;4338:53;4383:7;4374:6;4363:9;4359:22;4338:53;:::i;:::-;4328:63;;4284:117;4440:2;4466:53;4511:7;4502:6;4491:9;4487:22;4466:53;:::i;:::-;4456:63;;4411:118;4062:474;;;;;:::o;4542:619::-;4619:6;4627;4635;4684:2;4672:9;4663:7;4659:23;4655:32;4652:119;;;4690:79;;:::i;:::-;4652:119;4810:1;4835:53;4880:7;4871:6;4860:9;4856:22;4835:53;:::i;:::-;4825:63;;4781:117;4937:2;4963:53;5008:7;4999:6;4988:9;4984:22;4963:53;:::i;:::-;4953:63;;4908:118;5065:2;5091:53;5136:7;5127:6;5116:9;5112:22;5091:53;:::i;:::-;5081:63;;5036:118;4542:619;;;;;:::o;5167:943::-;5262:6;5270;5278;5286;5335:3;5323:9;5314:7;5310:23;5306:33;5303:120;;;5342:79;;:::i;:::-;5303:120;5462:1;5487:53;5532:7;5523:6;5512:9;5508:22;5487:53;:::i;:::-;5477:63;;5433:117;5589:2;5615:53;5660:7;5651:6;5640:9;5636:22;5615:53;:::i;:::-;5605:63;;5560:118;5717:2;5743:53;5788:7;5779:6;5768:9;5764:22;5743:53;:::i;:::-;5733:63;;5688:118;5873:2;5862:9;5858:18;5845:32;5904:18;5896:6;5893:30;5890:117;;;5926:79;;:::i;:::-;5890:117;6031:62;6085:7;6076:6;6065:9;6061:22;6031:62;:::i;:::-;6021:72;;5816:287;5167:943;;;;;;;:::o;6116:468::-;6181:6;6189;6238:2;6226:9;6217:7;6213:23;6209:32;6206:119;;;6244:79;;:::i;:::-;6206:119;6364:1;6389:53;6434:7;6425:6;6414:9;6410:22;6389:53;:::i;:::-;6379:63;;6335:117;6491:2;6517:50;6559:7;6550:6;6539:9;6535:22;6517:50;:::i;:::-;6507:60;;6462:115;6116:468;;;;;:::o;6590:474::-;6658:6;6666;6715:2;6703:9;6694:7;6690:23;6686:32;6683:119;;;6721:79;;:::i;:::-;6683:119;6841:1;6866:53;6911:7;6902:6;6891:9;6887:22;6866:53;:::i;:::-;6856:63;;6812:117;6968:2;6994:53;7039:7;7030:6;7019:9;7015:22;6994:53;:::i;:::-;6984:63;;6939:118;6590:474;;;;;:::o;7070:761::-;7154:6;7162;7170;7178;7227:3;7215:9;7206:7;7202:23;7198:33;7195:120;;;7234:79;;:::i;:::-;7195:120;7354:1;7379:53;7424:7;7415:6;7404:9;7400:22;7379:53;:::i;:::-;7369:63;;7325:117;7481:2;7507:51;7550:7;7541:6;7530:9;7526:22;7507:51;:::i;:::-;7497:61;;7452:116;7607:2;7633:53;7678:7;7669:6;7658:9;7654:22;7633:53;:::i;:::-;7623:63;;7578:118;7735:2;7761:53;7806:7;7797:6;7786:9;7782:22;7761:53;:::i;:::-;7751:63;;7706:118;7070:761;;;;;;;:::o;7837:559::-;7923:6;7931;7980:2;7968:9;7959:7;7955:23;7951:32;7948:119;;;7986:79;;:::i;:::-;7948:119;8134:1;8123:9;8119:17;8106:31;8164:18;8156:6;8153:30;8150:117;;;8186:79;;:::i;:::-;8150:117;8299:80;8371:7;8362:6;8351:9;8347:22;8299:80;:::i;:::-;8281:98;;;;8077:312;7837:559;;;;;:::o;8402:323::-;8458:6;8507:2;8495:9;8486:7;8482:23;8478:32;8475:119;;;8513:79;;:::i;:::-;8475:119;8633:1;8658:50;8700:7;8691:6;8680:9;8676:22;8658:50;:::i;:::-;8648:60;;8604:114;8402:323;;;;:::o;8731:327::-;8789:6;8838:2;8826:9;8817:7;8813:23;8809:32;8806:119;;;8844:79;;:::i;:::-;8806:119;8964:1;8989:52;9033:7;9024:6;9013:9;9009:22;8989:52;:::i;:::-;8979:62;;8935:116;8731:327;;;;:::o;9064:349::-;9133:6;9182:2;9170:9;9161:7;9157:23;9153:32;9150:119;;;9188:79;;:::i;:::-;9150:119;9308:1;9333:63;9388:7;9379:6;9368:9;9364:22;9333:63;:::i;:::-;9323:73;;9279:127;9064:349;;;;:::o;9419:529::-;9490:6;9498;9547:2;9535:9;9526:7;9522:23;9518:32;9515:119;;;9553:79;;:::i;:::-;9515:119;9701:1;9690:9;9686:17;9673:31;9731:18;9723:6;9720:30;9717:117;;;9753:79;;:::i;:::-;9717:117;9866:65;9923:7;9914:6;9903:9;9899:22;9866:65;:::i;:::-;9848:83;;;;9644:297;9419:529;;;;;:::o;9954:509::-;10023:6;10072:2;10060:9;10051:7;10047:23;10043:32;10040:119;;;10078:79;;:::i;:::-;10040:119;10226:1;10215:9;10211:17;10198:31;10256:18;10248:6;10245:30;10242:117;;;10278:79;;:::i;:::-;10242:117;10383:63;10438:7;10429:6;10418:9;10414:22;10383:63;:::i;:::-;10373:73;;10169:287;9954:509;;;;:::o;10469:329::-;10528:6;10577:2;10565:9;10556:7;10552:23;10548:32;10545:119;;;10583:79;;:::i;:::-;10545:119;10703:1;10728:53;10773:7;10764:6;10753:9;10749:22;10728:53;:::i;:::-;10718:63;;10674:117;10469:329;;;;:::o;10804:474::-;10872:6;10880;10929:2;10917:9;10908:7;10904:23;10900:32;10897:119;;;10935:79;;:::i;:::-;10897:119;11055:1;11080:53;11125:7;11116:6;11105:9;11101:22;11080:53;:::i;:::-;11070:63;;11026:117;11182:2;11208:53;11253:7;11244:6;11233:9;11229:22;11208:53;:::i;:::-;11198:63;;11153:118;10804:474;;;;;:::o;11284:765::-;11370:6;11378;11386;11394;11443:3;11431:9;11422:7;11418:23;11414:33;11411:120;;;11450:79;;:::i;:::-;11411:120;11570:1;11595:53;11640:7;11631:6;11620:9;11616:22;11595:53;:::i;:::-;11585:63;;11541:117;11697:2;11723:53;11768:7;11759:6;11748:9;11744:22;11723:53;:::i;:::-;11713:63;;11668:118;11825:2;11851:53;11896:7;11887:6;11876:9;11872:22;11851:53;:::i;:::-;11841:63;;11796:118;11953:2;11979:53;12024:7;12015:6;12004:9;12000:22;11979:53;:::i;:::-;11969:63;;11924:118;11284:765;;;;;;;:::o;12055:761::-;12139:6;12147;12155;12163;12212:3;12200:9;12191:7;12187:23;12183:33;12180:120;;;12219:79;;:::i;:::-;12180:120;12339:1;12364:53;12409:7;12400:6;12389:9;12385:22;12364:53;:::i;:::-;12354:63;;12310:117;12466:2;12492:51;12535:7;12526:6;12515:9;12511:22;12492:51;:::i;:::-;12482:61;;12437:116;12592:2;12618:53;12663:7;12654:6;12643:9;12639:22;12618:53;:::i;:::-;12608:63;;12563:118;12720:2;12746:53;12791:7;12782:6;12771:9;12767:22;12746:53;:::i;:::-;12736:63;;12691:118;12055:761;;;;;;;:::o;12822:179::-;12891:10;12912:46;12954:3;12946:6;12912:46;:::i;:::-;12990:4;12985:3;12981:14;12967:28;;12822:179;;;;:::o;13007:118::-;13094:24;13112:5;13094:24;:::i;:::-;13089:3;13082:37;13007:118;;:::o;13131:157::-;13236:45;13256:24;13274:5;13256:24;:::i;:::-;13236:45;:::i;:::-;13231:3;13224:58;13131:157;;:::o;13324:732::-;13443:3;13472:54;13520:5;13472:54;:::i;:::-;13542:86;13621:6;13616:3;13542:86;:::i;:::-;13535:93;;13652:56;13702:5;13652:56;:::i;:::-;13731:7;13762:1;13747:284;13772:6;13769:1;13766:13;13747:284;;;13848:6;13842:13;13875:63;13934:3;13919:13;13875:63;:::i;:::-;13868:70;;13961:60;14014:6;13961:60;:::i;:::-;13951:70;;13807:224;13794:1;13791;13787:9;13782:14;;13747:284;;;13751:14;14047:3;14040:10;;13448:608;;;13324:732;;;;:::o;14062:109::-;14143:21;14158:5;14143:21;:::i;:::-;14138:3;14131:34;14062:109;;:::o;14177:118::-;14264:24;14282:5;14264:24;:::i;:::-;14259:3;14252:37;14177:118;;:::o;14301:157::-;14406:45;14426:24;14444:5;14426:24;:::i;:::-;14406:45;:::i;:::-;14401:3;14394:58;14301:157;;:::o;14464:360::-;14550:3;14578:38;14610:5;14578:38;:::i;:::-;14632:70;14695:6;14690:3;14632:70;:::i;:::-;14625:77;;14711:52;14756:6;14751:3;14744:4;14737:5;14733:16;14711:52;:::i;:::-;14788:29;14810:6;14788:29;:::i;:::-;14783:3;14779:39;14772:46;;14554:270;14464:360;;;;:::o;14830:198::-;14949:72;14969:51;15014:5;14969:51;:::i;:::-;14949:72;:::i;:::-;14944:3;14937:85;14830:198;;:::o;15034:364::-;15122:3;15150:39;15183:5;15150:39;:::i;:::-;15205:71;15269:6;15264:3;15205:71;:::i;:::-;15198:78;;15285:52;15330:6;15325:3;15318:4;15311:5;15307:16;15285:52;:::i;:::-;15362:29;15384:6;15362:29;:::i;:::-;15357:3;15353:39;15346:46;;15126:272;15034:364;;;;:::o;15404:377::-;15510:3;15538:39;15571:5;15538:39;:::i;:::-;15593:89;15675:6;15670:3;15593:89;:::i;:::-;15586:96;;15691:52;15736:6;15731:3;15724:4;15717:5;15713:16;15691:52;:::i;:::-;15768:6;15763:3;15759:16;15752:23;;15514:267;15404:377;;;;:::o;15811:845::-;15914:3;15951:5;15945:12;15980:36;16006:9;15980:36;:::i;:::-;16032:89;16114:6;16109:3;16032:89;:::i;:::-;16025:96;;16152:1;16141:9;16137:17;16168:1;16163:137;;;;16314:1;16309:341;;;;16130:520;;16163:137;16247:4;16243:9;16232;16228:25;16223:3;16216:38;16283:6;16278:3;16274:16;16267:23;;16163:137;;16309:341;16376:38;16408:5;16376:38;:::i;:::-;16436:1;16450:154;16464:6;16461:1;16458:13;16450:154;;;16538:7;16532:14;16528:1;16523:3;16519:11;16512:35;16588:1;16579:7;16575:15;16564:26;;16486:4;16483:1;16479:12;16474:17;;16450:154;;;16633:6;16628:3;16624:16;16617:23;;16316:334;;16130:520;;15918:738;;15811:845;;;;:::o;16662:402::-;16822:3;16843:85;16925:2;16920:3;16843:85;:::i;:::-;16836:92;;16937:93;17026:3;16937:93;:::i;:::-;17055:2;17050:3;17046:12;17039:19;;16662:402;;;:::o;17070:366::-;17212:3;17233:67;17297:2;17292:3;17233:67;:::i;:::-;17226:74;;17309:93;17398:3;17309:93;:::i;:::-;17427:2;17422:3;17418:12;17411:19;;17070:366;;;:::o;17442:::-;17584:3;17605:67;17669:2;17664:3;17605:67;:::i;:::-;17598:74;;17681:93;17770:3;17681:93;:::i;:::-;17799:2;17794:3;17790:12;17783:19;;17442:366;;;:::o;17814:::-;17956:3;17977:67;18041:2;18036:3;17977:67;:::i;:::-;17970:74;;18053:93;18142:3;18053:93;:::i;:::-;18171:2;18166:3;18162:12;18155:19;;17814:366;;;:::o;18186:::-;18328:3;18349:67;18413:2;18408:3;18349:67;:::i;:::-;18342:74;;18425:93;18514:3;18425:93;:::i;:::-;18543:2;18538:3;18534:12;18527:19;;18186:366;;;:::o;18558:::-;18700:3;18721:67;18785:2;18780:3;18721:67;:::i;:::-;18714:74;;18797:93;18886:3;18797:93;:::i;:::-;18915:2;18910:3;18906:12;18899:19;;18558:366;;;:::o;18930:400::-;19090:3;19111:84;19193:1;19188:3;19111:84;:::i;:::-;19104:91;;19204:93;19293:3;19204:93;:::i;:::-;19322:1;19317:3;19313:11;19306:18;;18930:400;;;:::o;19336:366::-;19478:3;19499:67;19563:2;19558:3;19499:67;:::i;:::-;19492:74;;19575:93;19664:3;19575:93;:::i;:::-;19693:2;19688:3;19684:12;19677:19;;19336:366;;;:::o;19708:::-;19850:3;19871:67;19935:2;19930:3;19871:67;:::i;:::-;19864:74;;19947:93;20036:3;19947:93;:::i;:::-;20065:2;20060:3;20056:12;20049:19;;19708:366;;;:::o;20080:::-;20222:3;20243:67;20307:2;20302:3;20243:67;:::i;:::-;20236:74;;20319:93;20408:3;20319:93;:::i;:::-;20437:2;20432:3;20428:12;20421:19;;20080:366;;;:::o;20452:::-;20594:3;20615:67;20679:2;20674:3;20615:67;:::i;:::-;20608:74;;20691:93;20780:3;20691:93;:::i;:::-;20809:2;20804:3;20800:12;20793:19;;20452:366;;;:::o;20824:::-;20966:3;20987:67;21051:2;21046:3;20987:67;:::i;:::-;20980:74;;21063:93;21152:3;21063:93;:::i;:::-;21181:2;21176:3;21172:12;21165:19;;20824:366;;;:::o;21196:::-;21338:3;21359:67;21423:2;21418:3;21359:67;:::i;:::-;21352:74;;21435:93;21524:3;21435:93;:::i;:::-;21553:2;21548:3;21544:12;21537:19;;21196:366;;;:::o;21568:::-;21710:3;21731:67;21795:2;21790:3;21731:67;:::i;:::-;21724:74;;21807:93;21896:3;21807:93;:::i;:::-;21925:2;21920:3;21916:12;21909:19;;21568:366;;;:::o;21940:::-;22082:3;22103:67;22167:2;22162:3;22103:67;:::i;:::-;22096:74;;22179:93;22268:3;22179:93;:::i;:::-;22297:2;22292:3;22288:12;22281:19;;21940:366;;;:::o;22312:398::-;22471:3;22492:83;22573:1;22568:3;22492:83;:::i;:::-;22485:90;;22584:93;22673:3;22584:93;:::i;:::-;22702:1;22697:3;22693:11;22686:18;;22312:398;;;:::o;22716:366::-;22858:3;22879:67;22943:2;22938:3;22879:67;:::i;:::-;22872:74;;22955:93;23044:3;22955:93;:::i;:::-;23073:2;23068:3;23064:12;23057:19;;22716:366;;;:::o;23088:::-;23230:3;23251:67;23315:2;23310:3;23251:67;:::i;:::-;23244:74;;23327:93;23416:3;23327:93;:::i;:::-;23445:2;23440:3;23436:12;23429:19;;23088:366;;;:::o;23460:::-;23602:3;23623:67;23687:2;23682:3;23623:67;:::i;:::-;23616:74;;23699:93;23788:3;23699:93;:::i;:::-;23817:2;23812:3;23808:12;23801:19;;23460:366;;;:::o;23832:::-;23974:3;23995:67;24059:2;24054:3;23995:67;:::i;:::-;23988:74;;24071:93;24160:3;24071:93;:::i;:::-;24189:2;24184:3;24180:12;24173:19;;23832:366;;;:::o;24204:108::-;24281:24;24299:5;24281:24;:::i;:::-;24276:3;24269:37;24204:108;;:::o;24318:118::-;24405:24;24423:5;24405:24;:::i;:::-;24400:3;24393:37;24318:118;;:::o;24442:112::-;24525:22;24541:5;24525:22;:::i;:::-;24520:3;24513:35;24442:112;;:::o;24560:425::-;24714:3;24729:89;24814:3;24805:6;24729:89;:::i;:::-;24843:2;24838:3;24834:12;24827:19;;24856:75;24927:3;24918:6;24856:75;:::i;:::-;24956:2;24951:3;24947:12;24940:19;;24976:3;24969:10;;24560:425;;;;;:::o;24991:695::-;25269:3;25291:92;25379:3;25370:6;25291:92;:::i;:::-;25284:99;;25400:95;25491:3;25482:6;25400:95;:::i;:::-;25393:102;;25512:148;25656:3;25512:148;:::i;:::-;25505:155;;25677:3;25670:10;;24991:695;;;;;:::o;25692:522::-;25905:3;25927:148;26071:3;25927:148;:::i;:::-;25920:155;;26085:75;26156:3;26147:6;26085:75;:::i;:::-;26185:2;26180:3;26176:12;26169:19;;26205:3;26198:10;;25692:522;;;;:::o;26220:379::-;26404:3;26426:147;26569:3;26426:147;:::i;:::-;26419:154;;26590:3;26583:10;;26220:379;;;:::o;26605:222::-;26698:4;26736:2;26725:9;26721:18;26713:26;;26749:71;26817:1;26806:9;26802:17;26793:6;26749:71;:::i;:::-;26605:222;;;;:::o;26833:640::-;27028:4;27066:3;27055:9;27051:19;27043:27;;27080:71;27148:1;27137:9;27133:17;27124:6;27080:71;:::i;:::-;27161:72;27229:2;27218:9;27214:18;27205:6;27161:72;:::i;:::-;27243;27311:2;27300:9;27296:18;27287:6;27243:72;:::i;:::-;27362:9;27356:4;27352:20;27347:2;27336:9;27332:18;27325:48;27390:76;27461:4;27452:6;27390:76;:::i;:::-;27382:84;;26833:640;;;;;;;:::o;27479:373::-;27622:4;27660:2;27649:9;27645:18;27637:26;;27709:9;27703:4;27699:20;27695:1;27684:9;27680:17;27673:47;27737:108;27840:4;27831:6;27737:108;:::i;:::-;27729:116;;27479:373;;;;:::o;27858:210::-;27945:4;27983:2;27972:9;27968:18;27960:26;;27996:65;28058:1;28047:9;28043:17;28034:6;27996:65;:::i;:::-;27858:210;;;;:::o;28074:545::-;28247:4;28285:3;28274:9;28270:19;28262:27;;28299:71;28367:1;28356:9;28352:17;28343:6;28299:71;:::i;:::-;28380:68;28444:2;28433:9;28429:18;28420:6;28380:68;:::i;:::-;28458:72;28526:2;28515:9;28511:18;28502:6;28458:72;:::i;:::-;28540;28608:2;28597:9;28593:18;28584:6;28540:72;:::i;:::-;28074:545;;;;;;;:::o;28625:313::-;28738:4;28776:2;28765:9;28761:18;28753:26;;28825:9;28819:4;28815:20;28811:1;28800:9;28796:17;28789:47;28853:78;28926:4;28917:6;28853:78;:::i;:::-;28845:86;;28625:313;;;;:::o;28944:419::-;29110:4;29148:2;29137:9;29133:18;29125:26;;29197:9;29191:4;29187:20;29183:1;29172:9;29168:17;29161:47;29225:131;29351:4;29225:131;:::i;:::-;29217:139;;28944:419;;;:::o;29369:::-;29535:4;29573:2;29562:9;29558:18;29550:26;;29622:9;29616:4;29612:20;29608:1;29597:9;29593:17;29586:47;29650:131;29776:4;29650:131;:::i;:::-;29642:139;;29369:419;;;:::o;29794:::-;29960:4;29998:2;29987:9;29983:18;29975:26;;30047:9;30041:4;30037:20;30033:1;30022:9;30018:17;30011:47;30075:131;30201:4;30075:131;:::i;:::-;30067:139;;29794:419;;;:::o;30219:::-;30385:4;30423:2;30412:9;30408:18;30400:26;;30472:9;30466:4;30462:20;30458:1;30447:9;30443:17;30436:47;30500:131;30626:4;30500:131;:::i;:::-;30492:139;;30219:419;;;:::o;30644:::-;30810:4;30848:2;30837:9;30833:18;30825:26;;30897:9;30891:4;30887:20;30883:1;30872:9;30868:17;30861:47;30925:131;31051:4;30925:131;:::i;:::-;30917:139;;30644:419;;;:::o;31069:::-;31235:4;31273:2;31262:9;31258:18;31250:26;;31322:9;31316:4;31312:20;31308:1;31297:9;31293:17;31286:47;31350:131;31476:4;31350:131;:::i;:::-;31342:139;;31069:419;;;:::o;31494:::-;31660:4;31698:2;31687:9;31683:18;31675:26;;31747:9;31741:4;31737:20;31733:1;31722:9;31718:17;31711:47;31775:131;31901:4;31775:131;:::i;:::-;31767:139;;31494:419;;;:::o;31919:::-;32085:4;32123:2;32112:9;32108:18;32100:26;;32172:9;32166:4;32162:20;32158:1;32147:9;32143:17;32136:47;32200:131;32326:4;32200:131;:::i;:::-;32192:139;;31919:419;;;:::o;32344:::-;32510:4;32548:2;32537:9;32533:18;32525:26;;32597:9;32591:4;32587:20;32583:1;32572:9;32568:17;32561:47;32625:131;32751:4;32625:131;:::i;:::-;32617:139;;32344:419;;;:::o;32769:::-;32935:4;32973:2;32962:9;32958:18;32950:26;;33022:9;33016:4;33012:20;33008:1;32997:9;32993:17;32986:47;33050:131;33176:4;33050:131;:::i;:::-;33042:139;;32769:419;;;:::o;33194:::-;33360:4;33398:2;33387:9;33383:18;33375:26;;33447:9;33441:4;33437:20;33433:1;33422:9;33418:17;33411:47;33475:131;33601:4;33475:131;:::i;:::-;33467:139;;33194:419;;;:::o;33619:::-;33785:4;33823:2;33812:9;33808:18;33800:26;;33872:9;33866:4;33862:20;33858:1;33847:9;33843:17;33836:47;33900:131;34026:4;33900:131;:::i;:::-;33892:139;;33619:419;;;:::o;34044:::-;34210:4;34248:2;34237:9;34233:18;34225:26;;34297:9;34291:4;34287:20;34283:1;34272:9;34268:17;34261:47;34325:131;34451:4;34325:131;:::i;:::-;34317:139;;34044:419;;;:::o;34469:::-;34635:4;34673:2;34662:9;34658:18;34650:26;;34722:9;34716:4;34712:20;34708:1;34697:9;34693:17;34686:47;34750:131;34876:4;34750:131;:::i;:::-;34742:139;;34469:419;;;:::o;34894:::-;35060:4;35098:2;35087:9;35083:18;35075:26;;35147:9;35141:4;35137:20;35133:1;35122:9;35118:17;35111:47;35175:131;35301:4;35175:131;:::i;:::-;35167:139;;34894:419;;;:::o;35319:::-;35485:4;35523:2;35512:9;35508:18;35500:26;;35572:9;35566:4;35562:20;35558:1;35547:9;35543:17;35536:47;35600:131;35726:4;35600:131;:::i;:::-;35592:139;;35319:419;;;:::o;35744:::-;35910:4;35948:2;35937:9;35933:18;35925:26;;35997:9;35991:4;35987:20;35983:1;35972:9;35968:17;35961:47;36025:131;36151:4;36025:131;:::i;:::-;36017:139;;35744:419;;;:::o;36169:222::-;36262:4;36300:2;36289:9;36285:18;36277:26;;36313:71;36381:1;36370:9;36366:17;36357:6;36313:71;:::i;:::-;36169:222;;;;:::o;36397:129::-;36431:6;36458:20;;:::i;:::-;36448:30;;36487:33;36515:4;36507:6;36487:33;:::i;:::-;36397:129;;;:::o;36532:75::-;36565:6;36598:2;36592:9;36582:19;;36532:75;:::o;36613:307::-;36674:4;36764:18;36756:6;36753:30;36750:56;;;36786:18;;:::i;:::-;36750:56;36824:29;36846:6;36824:29;:::i;:::-;36816:37;;36908:4;36902;36898:15;36890:23;;36613:307;;;:::o;36926:308::-;36988:4;37078:18;37070:6;37067:30;37064:56;;;37100:18;;:::i;:::-;37064:56;37138:29;37160:6;37138:29;:::i;:::-;37130:37;;37222:4;37216;37212:15;37204:23;;36926:308;;;:::o;37240:132::-;37307:4;37330:3;37322:11;;37360:4;37355:3;37351:14;37343:22;;37240:132;;;:::o;37378:141::-;37427:4;37450:3;37442:11;;37473:3;37470:1;37463:14;37507:4;37504:1;37494:18;37486:26;;37378:141;;;:::o;37525:114::-;37592:6;37626:5;37620:12;37610:22;;37525:114;;;:::o;37645:98::-;37696:6;37730:5;37724:12;37714:22;;37645:98;;;:::o;37749:99::-;37801:6;37835:5;37829:12;37819:22;;37749:99;;;:::o;37854:113::-;37924:4;37956;37951:3;37947:14;37939:22;;37854:113;;;:::o;37973:184::-;38072:11;38106:6;38101:3;38094:19;38146:4;38141:3;38137:14;38122:29;;37973:184;;;;:::o;38163:168::-;38246:11;38280:6;38275:3;38268:19;38320:4;38315:3;38311:14;38296:29;;38163:168;;;;:::o;38337:147::-;38438:11;38475:3;38460:18;;38337:147;;;;:::o;38490:169::-;38574:11;38608:6;38603:3;38596:19;38648:4;38643:3;38639:14;38624:29;;38490:169;;;;:::o;38665:148::-;38767:11;38804:3;38789:18;;38665:148;;;;:::o;38819:305::-;38859:3;38878:20;38896:1;38878:20;:::i;:::-;38873:25;;38912:20;38930:1;38912:20;:::i;:::-;38907:25;;39066:1;38998:66;38994:74;38991:1;38988:81;38985:107;;;39072:18;;:::i;:::-;38985:107;39116:1;39113;39109:9;39102:16;;38819:305;;;;:::o;39130:185::-;39170:1;39187:20;39205:1;39187:20;:::i;:::-;39182:25;;39221:20;39239:1;39221:20;:::i;:::-;39216:25;;39260:1;39250:35;;39265:18;;:::i;:::-;39250:35;39307:1;39304;39300:9;39295:14;;39130:185;;;;:::o;39321:348::-;39361:7;39384:20;39402:1;39384:20;:::i;:::-;39379:25;;39418:20;39436:1;39418:20;:::i;:::-;39413:25;;39606:1;39538:66;39534:74;39531:1;39528:81;39523:1;39516:9;39509:17;39505:105;39502:131;;;39613:18;;:::i;:::-;39502:131;39661:1;39658;39654:9;39643:20;;39321:348;;;;:::o;39675:191::-;39715:4;39735:20;39753:1;39735:20;:::i;:::-;39730:25;;39769:20;39787:1;39769:20;:::i;:::-;39764:25;;39808:1;39805;39802:8;39799:34;;;39813:18;;:::i;:::-;39799:34;39858:1;39855;39851:9;39843:17;;39675:191;;;;:::o;39872:96::-;39909:7;39938:24;39956:5;39938:24;:::i;:::-;39927:35;;39872:96;;;:::o;39974:90::-;40008:7;40051:5;40044:13;40037:21;40026:32;;39974:90;;;:::o;40070:77::-;40107:7;40136:5;40125:16;;40070:77;;;:::o;40153:149::-;40189:7;40229:66;40222:5;40218:78;40207:89;;40153:149;;;:::o;40308:126::-;40345:7;40385:42;40378:5;40374:54;40363:65;;40308:126;;;:::o;40440:77::-;40477:7;40506:5;40495:16;;40440:77;;;:::o;40523:86::-;40558:7;40598:4;40591:5;40587:16;40576:27;;40523:86;;;:::o;40615:140::-;40679:9;40712:37;40743:5;40712:37;:::i;:::-;40699:50;;40615:140;;;:::o;40761:126::-;40811:9;40844:37;40875:5;40844:37;:::i;:::-;40831:50;;40761:126;;;:::o;40893:113::-;40943:9;40976:24;40994:5;40976:24;:::i;:::-;40963:37;;40893:113;;;:::o;41012:154::-;41096:6;41091:3;41086;41073:30;41158:1;41149:6;41144:3;41140:16;41133:27;41012:154;;;:::o;41172:307::-;41240:1;41250:113;41264:6;41261:1;41258:13;41250:113;;;41349:1;41344:3;41340:11;41334:18;41330:1;41325:3;41321:11;41314:39;41286:2;41283:1;41279:10;41274:15;;41250:113;;;41381:6;41378:1;41375:13;41372:101;;;41461:1;41452:6;41447:3;41443:16;41436:27;41372:101;41221:258;41172:307;;;:::o;41485:320::-;41529:6;41566:1;41560:4;41556:12;41546:22;;41613:1;41607:4;41603:12;41634:18;41624:81;;41690:4;41682:6;41678:17;41668:27;;41624:81;41752:2;41744:6;41741:14;41721:18;41718:38;41715:84;;;41771:18;;:::i;:::-;41715:84;41536:269;41485:320;;;:::o;41811:281::-;41894:27;41916:4;41894:27;:::i;:::-;41886:6;41882:40;42024:6;42012:10;42009:22;41988:18;41976:10;41973:34;41970:62;41967:88;;;42035:18;;:::i;:::-;41967:88;42075:10;42071:2;42064:22;41854:238;41811:281;;:::o;42098:233::-;42137:3;42160:24;42178:5;42160:24;:::i;:::-;42151:33;;42206:66;42199:5;42196:77;42193:103;;;42276:18;;:::i;:::-;42193:103;42323:1;42316:5;42312:13;42305:20;;42098:233;;;:::o;42337:100::-;42376:7;42405:26;42425:5;42405:26;:::i;:::-;42394:37;;42337:100;;;:::o;42443:79::-;42482:7;42511:5;42500:16;;42443:79;;;:::o;42528:94::-;42567:7;42596:20;42610:5;42596:20;:::i;:::-;42585:31;;42528:94;;;:::o;42628:176::-;42660:1;42677:20;42695:1;42677:20;:::i;:::-;42672:25;;42711:20;42729:1;42711:20;:::i;:::-;42706:25;;42750:1;42740:35;;42755:18;;:::i;:::-;42740:35;42796:1;42793;42789:9;42784:14;;42628:176;;;;:::o;42810:180::-;42858:77;42855:1;42848:88;42955:4;42952:1;42945:15;42979:4;42976:1;42969:15;42996:180;43044:77;43041:1;43034:88;43141:4;43138:1;43131:15;43165:4;43162:1;43155:15;43182:180;43230:77;43227:1;43220:88;43327:4;43324:1;43317:15;43351:4;43348:1;43341:15;43368:180;43416:77;43413:1;43406:88;43513:4;43510:1;43503:15;43537:4;43534:1;43527:15;43554:180;43602:77;43599:1;43592:88;43699:4;43696:1;43689:15;43723:4;43720:1;43713:15;43740:180;43788:77;43785:1;43778:88;43885:4;43882:1;43875:15;43909:4;43906:1;43899:15;43926:117;44035:1;44032;44025:12;44049:117;44158:1;44155;44148:12;44172:117;44281:1;44278;44271:12;44295:117;44404:1;44401;44394:12;44418:117;44527:1;44524;44517:12;44541:117;44650:1;44647;44640:12;44664:102;44705:6;44756:2;44752:7;44747:2;44740:5;44736:14;44732:28;44722:38;;44664:102;;;:::o;44772:94::-;44805:8;44853:5;44849:2;44845:14;44824:35;;44772:94;;;:::o;44872:214::-;45012:66;45008:1;45000:6;44996:14;44989:90;44872:214;:::o;45092:225::-;45232:34;45228:1;45220:6;45216:14;45209:58;45301:8;45296:2;45288:6;45284:15;45277:33;45092:225;:::o;45323:223::-;45463:34;45459:1;45451:6;45447:14;45440:58;45532:6;45527:2;45519:6;45515:15;45508:31;45323:223;:::o;45552:227::-;45692:34;45688:1;45680:6;45676:14;45669:58;45761:10;45756:2;45748:6;45744:15;45737:35;45552:227;:::o;45785:301::-;45925:34;45921:1;45913:6;45909:14;45902:58;45994:34;45989:2;45981:6;45977:15;45970:59;46063:15;46058:2;46050:6;46046:15;46039:40;45785:301;:::o;46092:233::-;46232:34;46228:1;46220:6;46216:14;46209:58;46301:16;46296:2;46288:6;46284:15;46277:41;46092:233;:::o;46331:155::-;46471:7;46467:1;46459:6;46455:14;46448:31;46331:155;:::o;46492:234::-;46632:34;46628:1;46620:6;46616:14;46609:58;46701:17;46696:2;46688:6;46684:15;46677:42;46492:234;:::o;46732:182::-;46872:34;46868:1;46860:6;46856:14;46849:58;46732:182;:::o;46920:250::-;47060:34;47056:1;47048:6;47044:14;47037:58;47129:33;47124:2;47116:6;47112:15;47105:58;46920:250;:::o;47176:182::-;47316:34;47312:1;47304:6;47300:14;47293:58;47176:182;:::o;47364:293::-;47504:34;47500:1;47492:6;47488:14;47481:58;47573:34;47568:2;47560:6;47556:15;47549:59;47642:7;47637:2;47629:6;47625:15;47618:32;47364:293;:::o;47663:299::-;47803:34;47799:1;47791:6;47787:14;47780:58;47872:34;47867:2;47859:6;47855:15;47848:59;47941:13;47936:2;47928:6;47924:15;47917:38;47663:299;:::o;47968:233::-;48108:34;48104:1;48096:6;48092:14;48085:58;48177:16;48172:2;48164:6;48160:15;48153:41;47968:233;:::o;48207:166::-;48347:18;48343:1;48335:6;48331:14;48324:42;48207:166;:::o;48379:114::-;;:::o;48499:166::-;48639:18;48635:1;48627:6;48623:14;48616:42;48499:166;:::o;48671:181::-;48811:33;48807:1;48799:6;48795:14;48788:57;48671:181;:::o;48858:245::-;48998:34;48994:1;48986:6;48982:14;48975:58;49067:28;49062:2;49054:6;49050:15;49043:53;48858:245;:::o;49109:235::-;49249:34;49245:1;49237:6;49233:14;49226:58;49318:18;49313:2;49305:6;49301:15;49294:43;49109:235;:::o;49350:122::-;49423:24;49441:5;49423:24;:::i;:::-;49416:5;49413:35;49403:63;;49462:1;49459;49452:12;49403:63;49350:122;:::o;49478:116::-;49548:21;49563:5;49548:21;:::i;:::-;49541:5;49538:32;49528:60;;49584:1;49581;49574:12;49528:60;49478:116;:::o;49600:122::-;49673:24;49691:5;49673:24;:::i;:::-;49666:5;49663:35;49653:63;;49712:1;49709;49702:12;49653:63;49600:122;:::o;49728:120::-;49800:23;49817:5;49800:23;:::i;:::-;49793:5;49790:34;49780:62;;49838:1;49835;49828:12;49780:62;49728:120;:::o;49854:122::-;49927:24;49945:5;49927:24;:::i;:::-;49920:5;49917:35;49907:63;;49966:1;49963;49956:12;49907:63;49854:122;:::o;49982:118::-;50053:22;50069:5;50053:22;:::i;:::-;50046:5;50043:33;50033:61;;50090:1;50087;50080:12;50033:61;49982:118;:::o

Swarm Source

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