ETH Price: $3,239.75 (-0.78%)
Gas: 22 Gwei

Token

A Bug Travels Far (ABTF)
 

Overview

Max Total Supply

617 ABTF

Holders

156

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 ABTF
0xcB626fd6BE11d95388a7A0416Bd79E009dA005Cc
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:
ABTF

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-26
*/

// File @openzeppelin/contracts/utils/[email protected]

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File @openzeppelin/contracts/access/[email protected]

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File @openzeppelin/contracts/utils/math/[email protected]

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File @openzeppelin/contracts/utils/introspection/[email protected]

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/token/ERC721/[email protected]

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/[email protected]

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/token/ERC721/extensions/[email protected]

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/utils/[email protected]

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/utils/[email protected]

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/introspection/[email protected]

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/[email protected]

pragma solidity ^0.8.0;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

// File @openzeppelin/contracts/security/[email protected]

pragma solidity ^0.8.0;

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

pragma solidity ^0.8.0;

/**
 * @dev ERC721 token with pausable token transfers, minting and burning.
 *
 * Useful for scenarios such as preventing trades until the end of an evaluation
 * period, or having an emergency switch for freezing all token transfers in the
 * event of a large bug.
 */
abstract contract ERC721Pausable is ERC721, Pausable {
    /**
     * @dev See {ERC721-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - the contract must not be paused.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        require(!paused(), "ERC721Pausable: token transfer while paused");
    }
}

// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

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/[email protected]

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File @openzeppelin/contracts/utils/introspection/[email protected]

pragma solidity ^0.8.0;

/**
 * @dev Storage based implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
abstract contract ERC165Storage is ERC165 {
    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override
        returns (bool)
    {
        return
            super.supportsInterface(interfaceId) ||
            _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See {IERC165-supportsInterface}.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal virtual {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}

// File @openzeppelin/contracts/security/[email protected]

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

// ----------------------------------------------------------------------------------------------------
// ----------------------------------------------------------------------------------------------------
// ----------------------------------------------------------------------------------------------------


// struct Book {
//   uint num;
//   uint reserveNum;
//   uint price;
//   uint maxSupply;
//   uint purchaseLimit;
// }

pragma solidity ^0.8.5;
pragma experimental ABIEncoderV2;

contract ABTF is Ownable, ERC721Enumerable, ReentrancyGuard {
    using SafeMath for uint256;
    string public ABTF_PROVENANCE = "";
    string public BASE_URI = "";

    uint256[] public prices = [0.035 ether, 0.035 ether, 0.035 ether, 0.035 ether];
    uint256[] public reserveNumbers = [166, 100, 100, 100];
    uint256[] public maxTokens = [626, 500, 500, 500];
    uint256[] public purchaseLimit = [1000, 1000, 1000, 1000];
    uint256[] public totalReserved = [0, 0, 0, 0];
    uint256[] public totalMinted = [0, 0, 0, 0];
    bool[] public saleActive = [false, false, false, false];

    constructor() ERC721("A Bug Travels Far", "ABTF") {}

    function withdraw() public onlyOwner {
        address payable to = payable(msg.sender);
        (bool success, ) = to.call{value: address(this).balance}("");
        require(success, "Transfer failed.");
    }

    function flipSaleState(uint256 bookNum) public onlyOwner {
        saleActive[bookNum] = !saleActive[bookNum];
    }

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

    function setBaseURI(string memory baseURI_) public onlyOwner {
        BASE_URI = baseURI_;
    }

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

    // ------------------------

    function setPrice(uint256 _bookNum, uint256 _price) public onlyOwner {
        prices[_bookNum] = _price;
    }

    function setReserveNumber(uint256 _bookNum, uint256 _reserveNumber) public onlyOwner {
        reserveNumbers[_bookNum] = _reserveNumber;
    }

    function setMaxTokens(uint256 _bookNum, uint256 _maxTokens) public onlyOwner {
        maxTokens[_bookNum] = _maxTokens;
    }

    function setPurchaseLimit(uint256 _bookNum, uint256 _purchaseLimit) public onlyOwner {
        purchaseLimit[_bookNum] = _purchaseLimit;
    }

    // ------------------------

    function purchase(uint256 numberOfTokens, uint256 _bookNum) public payable nonReentrant {
        require(_bookNum >= 0 && _bookNum <= 3, "Must enter a book number");
        require(saleActive[_bookNum], "Sale for this book is not active");
        require(totalMinted[_bookNum] <= maxTokens[_bookNum], "All tokens have been minted for this book");
        require(totalMinted[_bookNum].add(numberOfTokens) <= maxTokens[_bookNum], "Would exceed total supply for this book");
        require(numberOfTokens > 0 && numberOfTokens <= purchaseLimit[_bookNum],"Would exceed purchase limit for this book");
        require(msg.value / numberOfTokens == prices[_bookNum], "Eth value is not good");

        for (uint256 i = 0; i < numberOfTokens; i++) {
            if (totalMinted[_bookNum] < maxTokens[_bookNum]) {
                uint256 tokenId = 0;
                if(_bookNum == 0) {
                    tokenId = reserveNumbers[_bookNum] + totalMinted[_bookNum];
                } else {
                    for (uint256 j = 0; j < _bookNum; j++) {
                        tokenId += maxTokens[j];
                    }
                    tokenId += reserveNumbers[_bookNum] + totalMinted[_bookNum];
                }
                // uint256 tokenId = totalMinted[_bookNum];
                totalMinted[_bookNum] += 1;
                _safeMint(msg.sender, tokenId);
            }
        }
    }

    function reserve(address _to, uint256 _reserveAmount, uint256 _bookNum) public onlyOwner {
        require(_reserveAmount > 0, "Must enter a number to reserve");
        require(_bookNum >= 0 && _bookNum <= 3, "Must enter a book number");
        require(totalReserved[_bookNum].add(_reserveAmount) <= reserveNumbers[_bookNum], "Not enough reserve left for this book");
        require(totalMinted[_bookNum].add(totalReserved[_bookNum]).add(_reserveAmount) <= maxTokens[_bookNum], "All tokens for this book have been minted");

        for (uint256 i = 0; i < _reserveAmount; i++) {
            uint256 tokenId = 0;
            if(_bookNum == 0) {
                tokenId = totalReserved[_bookNum];
            } else {
                for (uint256 j = 0; j < _bookNum; j++) {
                    tokenId += maxTokens[j];
                }
                tokenId += totalReserved[_bookNum];
            }
            totalReserved[_bookNum] += 1;
            _safeMint(_to, tokenId);
        }

        // reserveNumbers[_bookNum] = reserveNumbers[_bookNum].sub(_reserveAmount);
    }

    function tokensOfOwner(address _owner) external view returns (uint256[] memory)
    {
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount == 0) {
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 index;
            for (index = 0; index < tokenCount; index++) {
                result[index] = tokenOfOwnerByIndex(_owner, index);
            }
            return result;
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"ABTF_PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BASE_URI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"bookNum","type":"uint256"}],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"maxTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"prices","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"uint256","name":"_bookNum","type":"uint256"}],"name":"purchase","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"purchaseLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_reserveAmount","type":"uint256"},{"internalType":"uint256","name":"_bookNum","type":"uint256"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"reserveNumbers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"saleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_bookNum","type":"uint256"},{"internalType":"uint256","name":"_maxTokens","type":"uint256"}],"name":"setMaxTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_bookNum","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_bookNum","type":"uint256"},{"internalType":"uint256","name":"_purchaseLimit","type":"uint256"}],"name":"setPurchaseLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_bookNum","type":"uint256"},{"internalType":"uint256","name":"_reserveNumber","type":"uint256"}],"name":"setReserveNumber","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"totalReserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180602001604052806000815250600c90805190602001906200002b9291906200041c565b5060405180602001604052806000815250600d9080519060200190620000539291906200041c565b506040518060800160405280667c58508723800066ffffffffffffff168152602001667c58508723800066ffffffffffffff168152602001667c58508723800066ffffffffffffff168152602001667c58508723800066ffffffffffffff16815250600e906004620000c7929190620004ad565b50604051806080016040528060a660ff168152602001606460ff168152602001606460ff168152602001606460ff16815250600f9060046200010b9291906200050a565b50604051806080016040528061027261ffff1681526020016101f461ffff1681526020016101f461ffff1681526020016101f461ffff1681525060109060046200015792919062000561565b5060405180608001604052806103e861ffff1681526020016103e861ffff1681526020016103e861ffff1681526020016103e861ffff168152506011906004620001a392919062000561565b506040518060800160405280600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152506012906004620001e79291906200050a565b506040518060800160405280600060ff168152602001600060ff168152602001600060ff168152602001600060ff1681525060139060046200022b9291906200050a565b506040518060800160405280600015151515815260200160001515151581526020016000151515158152602001600015151515815250601490600462000273929190620005b9565b503480156200028157600080fd5b506040518060400160405280601181526020017f41204275672054726176656c73204661720000000000000000000000000000008152506040518060400160405280600481526020017f41425446000000000000000000000000000000000000000000000000000000008152506200030e620003026200035060201b60201c565b6200035860201b60201c565b8160019080519060200190620003269291906200041c565b5080600290805190602001906200033f9291906200041c565b5050506001600b81905550620006ea565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200042a9062000685565b90600052602060002090601f0160209004810192826200044e57600085556200049a565b82601f106200046957805160ff19168380011785556200049a565b828001600101855582156200049a579182015b82811115620004995782518255916020019190600101906200047c565b5b509050620004a9919062000666565b5090565b828054828255906000526020600020908101928215620004f7579160200282015b82811115620004f6578251829066ffffffffffffff16905591602001919060010190620004ce565b5b50905062000506919062000666565b5090565b8280548282559060005260206000209081019282156200054e579160200282015b828111156200054d578251829060ff169055916020019190600101906200052b565b5b5090506200055d919062000666565b5090565b828054828255906000526020600020908101928215620005a6579160200282015b82811115620005a5578251829061ffff1690559160200191906001019062000582565b5b509050620005b5919062000666565b5090565b82805482825590600052602060002090601f01602090048101928215620006535791602002820160005b838211156200062257835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302620005e3565b8015620006515782816101000a81549060ff021916905560010160208160000104928301926001030262000622565b505b50905062000662919062000666565b5090565b5b808211156200068157600081600090555060010162000667565b5090565b600060028204905060018216806200069e57607f821691505b60208210811415620006b557620006b4620006bb565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61528c80620006fa6000396000f3fe6080604052600436106102305760003560e01c806370a082311161012e578063b88d4fde116100ab578063e501217d1161006f578063e501217d146108ac578063e985e9c5146108d7578063f2fde38b14610914578063f7d975771461093d578063fefd229d1461096657610230565b8063b88d4fde146107a1578063bc31c1c1146107ca578063c87b56dd14610807578063d4e32e9914610844578063dbddb26a1461088157610230565b806395d89b41116100f257806395d89b41146106be5780639d7f4ebf146106e95780639e29dd3614610726578063a22cb4651461074f578063b88b74ec1461077857610230565b806370a08231146105c5578063715018a6146106025780638462151c146106195780638da5cb5b146106565780639073810c1461068157610230565b80632f745c59116101bc5780634f6ccce7116101805780634f6ccce7146104c957806355f804b3146105065780635aa529081461052f5780636352211e1461056c57806370876c98146105a957610230565b80632f745c59146103fa578063313112ce146104375780633cb00e39146104605780633ccfd60b1461048957806342842e0e146104a057610230565b8063095ea7b311610203578063095ea7b314610317578063109695231461034057806318160ddd1461036957806323b872dd146103945780632e7ff793146103bd57610230565b806301ffc9a71461023557806304ca27751461027257806306fdde03146102af578063081812fc146102da575b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190613aac565b61098f565b60405161026991906141ed565b60405180910390f35b34801561027e57600080fd5b5061029960048036038101906102949190613b4f565b610a09565b6040516102a691906141ed565b60405180910390f35b3480156102bb57600080fd5b506102c4610a3d565b6040516102d19190614208565b60405180910390f35b3480156102e657600080fd5b5061030160048036038101906102fc9190613b4f565b610acf565b60405161030e9190614164565b60405180910390f35b34801561032357600080fd5b5061033e60048036038101906103399190613a19565b610b54565b005b34801561034c57600080fd5b5061036760048036038101906103629190613b06565b610c6c565b005b34801561037557600080fd5b5061037e610d02565b60405161038b91906145ca565b60405180910390f35b3480156103a057600080fd5b506103bb60048036038101906103b69190613903565b610d0f565b005b3480156103c957600080fd5b506103e460048036038101906103df9190613b4f565b610d6f565b6040516103f191906145ca565b60405180910390f35b34801561040657600080fd5b50610421600480360381019061041c9190613a19565b610d93565b60405161042e91906145ca565b60405180910390f35b34801561044357600080fd5b5061045e60048036038101906104599190613b4f565b610e38565b005b34801561046c57600080fd5b5061048760048036038101906104829190613b7c565b610f29565b005b34801561049557600080fd5b5061049e610fcc565b005b3480156104ac57600080fd5b506104c760048036038101906104c29190613903565b6110fd565b005b3480156104d557600080fd5b506104f060048036038101906104eb9190613b4f565b61111d565b6040516104fd91906145ca565b60405180910390f35b34801561051257600080fd5b5061052d60048036038101906105289190613b06565b61118e565b005b34801561053b57600080fd5b5061055660048036038101906105519190613b4f565b611224565b60405161056391906145ca565b60405180910390f35b34801561057857600080fd5b50610593600480360381019061058e9190613b4f565b611248565b6040516105a09190614164565b60405180910390f35b6105c360048036038101906105be9190613b7c565b6112fa565b005b3480156105d157600080fd5b506105ec60048036038101906105e79190613896565b61179f565b6040516105f991906145ca565b60405180910390f35b34801561060e57600080fd5b50610617611857565b005b34801561062557600080fd5b50610640600480360381019061063b9190613896565b6118df565b60405161064d91906141cb565b60405180910390f35b34801561066257600080fd5b5061066b6119e9565b6040516106789190614164565b60405180910390f35b34801561068d57600080fd5b506106a860048036038101906106a39190613b4f565b611a12565b6040516106b591906145ca565b60405180910390f35b3480156106ca57600080fd5b506106d3611a36565b6040516106e09190614208565b60405180910390f35b3480156106f557600080fd5b50610710600480360381019061070b9190613b4f565b611ac8565b60405161071d91906145ca565b60405180910390f35b34801561073257600080fd5b5061074d60048036038101906107489190613a59565b611aec565b005b34801561075b57600080fd5b50610776600480360381019061077191906139d9565b611e5b565b005b34801561078457600080fd5b5061079f600480360381019061079a9190613b7c565b611fdc565b005b3480156107ad57600080fd5b506107c860048036038101906107c39190613956565b61207f565b005b3480156107d657600080fd5b506107f160048036038101906107ec9190613b4f565b6120e1565b6040516107fe91906145ca565b60405180910390f35b34801561081357600080fd5b5061082e60048036038101906108299190613b4f565b612105565b60405161083b9190614208565b60405180910390f35b34801561085057600080fd5b5061086b60048036038101906108669190613b4f565b6121ac565b60405161087891906145ca565b60405180910390f35b34801561088d57600080fd5b506108966121d0565b6040516108a39190614208565b60405180910390f35b3480156108b857600080fd5b506108c161225e565b6040516108ce9190614208565b60405180910390f35b3480156108e357600080fd5b506108fe60048036038101906108f991906138c3565b6122ec565b60405161090b91906141ed565b60405180910390f35b34801561092057600080fd5b5061093b60048036038101906109369190613896565b612380565b005b34801561094957600080fd5b50610964600480360381019061095f9190613b7c565b612478565b005b34801561097257600080fd5b5061098d60048036038101906109889190613b7c565b61251b565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a025750610a01826125be565b5b9050919050565b60148181548110610a1957600080fd5b9060005260206000209060209182820401919006915054906101000a900460ff1681565b606060018054610a4c90614864565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7890614864565b8015610ac55780601f10610a9a57610100808354040283529160200191610ac5565b820191906000526020600020905b815481529060010190602001808311610aa857829003601f168201915b5050505050905090565b6000610ada826126a0565b610b19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b109061442a565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b5f82611248565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc7906144ca565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bef61270c565b73ffffffffffffffffffffffffffffffffffffffff161480610c1e5750610c1d81610c1861270c565b6122ec565b5b610c5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c549061438a565b60405180910390fd5b610c678383612714565b505050565b610c7461270c565b73ffffffffffffffffffffffffffffffffffffffff16610c926119e9565b73ffffffffffffffffffffffffffffffffffffffff1614610ce8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdf9061444a565b60405180910390fd5b80600c9080519060200190610cfe9291906136aa565b5050565b6000600980549050905090565b610d20610d1a61270c565b826127cd565b610d5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d569061452a565b60405180910390fd5b610d6a8383836128ab565b505050565b60118181548110610d7f57600080fd5b906000526020600020016000915090505481565b6000610d9e8361179f565b8210610ddf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd69061426a565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610e4061270c565b73ffffffffffffffffffffffffffffffffffffffff16610e5e6119e9565b73ffffffffffffffffffffffffffffffffffffffff1614610eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eab9061444a565b60405180910390fd5b60148181548110610ec857610ec76149fd565b5b90600052602060002090602091828204019190069054906101000a900460ff161560148281548110610efd57610efc6149fd565b5b90600052602060002090602091828204019190066101000a81548160ff02191690831515021790555050565b610f3161270c565b73ffffffffffffffffffffffffffffffffffffffff16610f4f6119e9565b73ffffffffffffffffffffffffffffffffffffffff1614610fa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9c9061444a565b60405180910390fd5b8060108381548110610fba57610fb96149fd565b5b90600052602060002001819055505050565b610fd461270c565b73ffffffffffffffffffffffffffffffffffffffff16610ff26119e9565b73ffffffffffffffffffffffffffffffffffffffff1614611048576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103f9061444a565b60405180910390fd5b600033905060008173ffffffffffffffffffffffffffffffffffffffff16476040516110739061414f565b60006040518083038185875af1925050503d80600081146110b0576040519150601f19603f3d011682016040523d82523d6000602084013e6110b5565b606091505b50509050806110f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f09061450a565b60405180910390fd5b5050565b6111188383836040518060200160405280600081525061207f565b505050565b6000611127610d02565b8210611168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115f9061454a565b60405180910390fd5b6009828154811061117c5761117b6149fd565b5b90600052602060002001549050919050565b61119661270c565b73ffffffffffffffffffffffffffffffffffffffff166111b46119e9565b73ffffffffffffffffffffffffffffffffffffffff161461120a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112019061444a565b60405180910390fd5b80600d90805190602001906112209291906136aa565b5050565b6012818154811061123457600080fd5b906000526020600020016000915090505481565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e8906143ca565b60405180910390fd5b80915050919050565b6002600b541415611340576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113379061458a565b60405180910390fd5b6002600b819055506000811015801561135a575060038111155b611399576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611390906144aa565b60405180910390fd5b601481815481106113ad576113ac6149fd565b5b90600052602060002090602091828204019190069054906101000a900460ff1661140c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114039061440a565b60405180910390fd5b601081815481106114205761141f6149fd565b5b90600052602060002001546013828154811061143f5761143e6149fd565b5b9060005260206000200154111561148b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114829061424a565b60405180910390fd5b6010818154811061149f5761149e6149fd565b5b90600052602060002001546114db83601384815481106114c2576114c16149fd565b5b9060005260206000200154612b0790919063ffffffff16565b111561151c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611513906145aa565b60405180910390fd5b60008211801561154a57506011818154811061153b5761153a6149fd565b5b90600052602060002001548211155b611589576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611580906144ea565b60405180910390fd5b600e818154811061159d5761159c6149fd565b5b906000526020600020015482346115b49190614749565b146115f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115eb9061436a565b60405180910390fd5b60005b828110156117925760108281548110611613576116126149fd565b5b906000526020600020015460138381548110611632576116316149fd565b5b9060005260206000200154101561177f5760008083141561169c5760138381548110611661576116606149fd565b5b9060005260206000200154600f84815481106116805761167f6149fd565b5b906000526020600020015461169591906146f3565b905061173d565b60005b838110156116e657601081815481106116bb576116ba6149fd565b5b9060005260206000200154826116d191906146f3565b915080806116de906148c7565b91505061169f565b50601383815481106116fb576116fa6149fd565b5b9060005260206000200154600f848154811061171a576117196149fd565b5b906000526020600020015461172f91906146f3565b8161173a91906146f3565b90505b600160138481548110611753576117526149fd565b5b90600052602060002001600082825461176c91906146f3565b9250508190555061177d3382612b1d565b505b808061178a906148c7565b9150506115f7565b506001600b819055505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611810576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611807906143aa565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61185f61270c565b73ffffffffffffffffffffffffffffffffffffffff1661187d6119e9565b73ffffffffffffffffffffffffffffffffffffffff16146118d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ca9061444a565b60405180910390fd5b6118dd6000612b3b565b565b606060006118ec8361179f565b9050600081141561194957600067ffffffffffffffff81111561191257611911614a2c565b5b6040519080825280602002602001820160405280156119405781602001602082028036833780820191505090505b509150506119e4565b60008167ffffffffffffffff81111561196557611964614a2c565b5b6040519080825280602002602001820160405280156119935781602001602082028036833780820191505090505b50905060005b828110156119dd576119ab8582610d93565b8282815181106119be576119bd6149fd565b5b60200260200101818152505080806119d5906148c7565b915050611999565b8193505050505b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60108181548110611a2257600080fd5b906000526020600020016000915090505481565b606060028054611a4590614864565b80601f0160208091040260200160405190810160405280929190818152602001828054611a7190614864565b8015611abe5780601f10611a9357610100808354040283529160200191611abe565b820191906000526020600020905b815481529060010190602001808311611aa157829003601f168201915b5050505050905090565b60138181548110611ad857600080fd5b906000526020600020016000915090505481565b611af461270c565b73ffffffffffffffffffffffffffffffffffffffff16611b126119e9565b73ffffffffffffffffffffffffffffffffffffffff1614611b68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5f9061444a565b60405180910390fd5b60008211611bab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba29061422a565b60405180910390fd5b60008110158015611bbd575060038111155b611bfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf3906144aa565b60405180910390fd5b600f8181548110611c1057611c0f6149fd565b5b9060005260206000200154611c4c8360128481548110611c3357611c326149fd565b5b9060005260206000200154612b0790919063ffffffff16565b1115611c8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c849061434a565b60405180910390fd5b60108181548110611ca157611ca06149fd565b5b9060005260206000200154611d0d83611cff60128581548110611cc757611cc66149fd565b5b906000526020600020015460138681548110611ce657611ce56149fd565b5b9060005260206000200154612b0790919063ffffffff16565b612b0790919063ffffffff16565b1115611d4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d459061456a565b60405180910390fd5b60005b82811015611e5557600080831415611d895760128381548110611d7757611d766149fd565b5b90600052602060002001549050611e01565b60005b83811015611dd35760108181548110611da857611da76149fd565b5b906000526020600020015482611dbe91906146f3565b91508080611dcb906148c7565b915050611d8c565b5060128381548110611de857611de76149fd565b5b906000526020600020015481611dfe91906146f3565b90505b600160128481548110611e1757611e166149fd565b5b906000526020600020016000828254611e3091906146f3565b92505081905550611e418582612b1d565b508080611e4d906148c7565b915050611d51565b50505050565b611e6361270c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec89061430a565b60405180910390fd5b8060066000611ede61270c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611f8b61270c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611fd091906141ed565b60405180910390a35050565b611fe461270c565b73ffffffffffffffffffffffffffffffffffffffff166120026119e9565b73ffffffffffffffffffffffffffffffffffffffff1614612058576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204f9061444a565b60405180910390fd5b80600f838154811061206d5761206c6149fd565b5b90600052602060002001819055505050565b61209061208a61270c565b836127cd565b6120cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c69061452a565b60405180910390fd5b6120db84848484612bff565b50505050565b600e81815481106120f157600080fd5b906000526020600020016000915090505481565b6060612110826126a0565b61214f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121469061448a565b60405180910390fd5b6000612159612c5b565b9050600081511161217957604051806020016040528060008152506121a4565b8061218384612ced565b60405160200161219492919061412b565b6040516020818303038152906040525b915050919050565b600f81815481106121bc57600080fd5b906000526020600020016000915090505481565b600d80546121dd90614864565b80601f016020809104026020016040519081016040528092919081815260200182805461220990614864565b80156122565780601f1061222b57610100808354040283529160200191612256565b820191906000526020600020905b81548152906001019060200180831161223957829003601f168201915b505050505081565b600c805461226b90614864565b80601f016020809104026020016040519081016040528092919081815260200182805461229790614864565b80156122e45780601f106122b9576101008083540402835291602001916122e4565b820191906000526020600020905b8154815290600101906020018083116122c757829003601f168201915b505050505081565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61238861270c565b73ffffffffffffffffffffffffffffffffffffffff166123a66119e9565b73ffffffffffffffffffffffffffffffffffffffff16146123fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f39061444a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561246c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612463906142aa565b60405180910390fd5b61247581612b3b565b50565b61248061270c565b73ffffffffffffffffffffffffffffffffffffffff1661249e6119e9565b73ffffffffffffffffffffffffffffffffffffffff16146124f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124eb9061444a565b60405180910390fd5b80600e8381548110612509576125086149fd565b5b90600052602060002001819055505050565b61252361270c565b73ffffffffffffffffffffffffffffffffffffffff166125416119e9565b73ffffffffffffffffffffffffffffffffffffffff1614612597576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258e9061444a565b60405180910390fd5b80601183815481106125ac576125ab6149fd565b5b90600052602060002001819055505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061268957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612699575061269882612e4e565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661278783611248565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006127d8826126a0565b612817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280e9061432a565b60405180910390fd5b600061282283611248565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061289157508373ffffffffffffffffffffffffffffffffffffffff1661287984610acf565b73ffffffffffffffffffffffffffffffffffffffff16145b806128a257506128a181856122ec565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166128cb82611248565b73ffffffffffffffffffffffffffffffffffffffff1614612921576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129189061446a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612991576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612988906142ea565b60405180910390fd5b61299c838383612eb8565b6129a7600082612714565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129f7919061477a565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a4e91906146f3565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008183612b1591906146f3565b905092915050565b612b37828260405180602001604052806000815250612fcc565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612c0a8484846128ab565b612c1684848484613027565b612c55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4c9061428a565b60405180910390fd5b50505050565b6060600d8054612c6a90614864565b80601f0160208091040260200160405190810160405280929190818152602001828054612c9690614864565b8015612ce35780601f10612cb857610100808354040283529160200191612ce3565b820191906000526020600020905b815481529060010190602001808311612cc657829003601f168201915b5050505050905090565b60606000821415612d35576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e49565b600082905060005b60008214612d67578080612d50906148c7565b915050600a82612d609190614749565b9150612d3d565b60008167ffffffffffffffff811115612d8357612d82614a2c565b5b6040519080825280601f01601f191660200182016040528015612db55781602001600182028036833780820191505090505b5090505b60008514612e4257600182612dce919061477a565b9150600a85612ddd9190614910565b6030612de991906146f3565b60f81b818381518110612dff57612dfe6149fd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e3b9190614749565b9450612db9565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612ec38383836131be565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612f0657612f01816131c3565b612f45565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612f4457612f43838261320c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f8857612f8381613379565b612fc7565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612fc657612fc5828261344a565b5b5b505050565b612fd683836134c9565b612fe36000848484613027565b613022576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130199061428a565b60405180910390fd5b505050565b60006130488473ffffffffffffffffffffffffffffffffffffffff16613697565b156131b1578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261307161270c565b8786866040518563ffffffff1660e01b8152600401613093949392919061417f565b602060405180830381600087803b1580156130ad57600080fd5b505af19250505080156130de57506040513d601f19601f820116820180604052508101906130db9190613ad9565b60015b613161573d806000811461310e576040519150601f19603f3d011682016040523d82523d6000602084013e613113565b606091505b50600081511415613159576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131509061428a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506131b6565b600190505b949350505050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016132198461179f565b613223919061477a565b9050600060086000848152602001908152602001600020549050818114613308576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160098054905061338d919061477a565b90506000600a60008481526020019081526020016000205490506000600983815481106133bd576133bc6149fd565b5b9060005260206000200154905080600983815481106133df576133de6149fd565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a600085815260200190815260200160002060009055600980548061342e5761342d6149ce565b5b6001900381819060005260206000200160009055905550505050565b60006134558361179f565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613539576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613530906143ea565b60405180910390fd5b613542816126a0565b15613582576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613579906142ca565b60405180910390fd5b61358e60008383612eb8565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546135de91906146f3565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b8280546136b690614864565b90600052602060002090601f0160209004810192826136d8576000855561371f565b82601f106136f157805160ff191683800117855561371f565b8280016001018555821561371f579182015b8281111561371e578251825591602001919060010190613703565b5b50905061372c9190613730565b5090565b5b80821115613749576000816000905550600101613731565b5090565b600061376061375b8461460a565b6145e5565b90508281526020810184848401111561377c5761377b614a60565b5b613787848285614822565b509392505050565b60006137a261379d8461463b565b6145e5565b9050828152602081018484840111156137be576137bd614a60565b5b6137c9848285614822565b509392505050565b6000813590506137e0816151fa565b92915050565b6000813590506137f581615211565b92915050565b60008135905061380a81615228565b92915050565b60008151905061381f81615228565b92915050565b600082601f83011261383a57613839614a5b565b5b813561384a84826020860161374d565b91505092915050565b600082601f83011261386857613867614a5b565b5b813561387884826020860161378f565b91505092915050565b6000813590506138908161523f565b92915050565b6000602082840312156138ac576138ab614a6a565b5b60006138ba848285016137d1565b91505092915050565b600080604083850312156138da576138d9614a6a565b5b60006138e8858286016137d1565b92505060206138f9858286016137d1565b9150509250929050565b60008060006060848603121561391c5761391b614a6a565b5b600061392a868287016137d1565b935050602061393b868287016137d1565b925050604061394c86828701613881565b9150509250925092565b600080600080608085870312156139705761396f614a6a565b5b600061397e878288016137d1565b945050602061398f878288016137d1565b93505060406139a087828801613881565b925050606085013567ffffffffffffffff8111156139c1576139c0614a65565b5b6139cd87828801613825565b91505092959194509250565b600080604083850312156139f0576139ef614a6a565b5b60006139fe858286016137d1565b9250506020613a0f858286016137e6565b9150509250929050565b60008060408385031215613a3057613a2f614a6a565b5b6000613a3e858286016137d1565b9250506020613a4f85828601613881565b9150509250929050565b600080600060608486031215613a7257613a71614a6a565b5b6000613a80868287016137d1565b9350506020613a9186828701613881565b9250506040613aa286828701613881565b9150509250925092565b600060208284031215613ac257613ac1614a6a565b5b6000613ad0848285016137fb565b91505092915050565b600060208284031215613aef57613aee614a6a565b5b6000613afd84828501613810565b91505092915050565b600060208284031215613b1c57613b1b614a6a565b5b600082013567ffffffffffffffff811115613b3a57613b39614a65565b5b613b4684828501613853565b91505092915050565b600060208284031215613b6557613b64614a6a565b5b6000613b7384828501613881565b91505092915050565b60008060408385031215613b9357613b92614a6a565b5b6000613ba185828601613881565b9250506020613bb285828601613881565b9150509250929050565b6000613bc8838361410d565b60208301905092915050565b613bdd816147ae565b82525050565b6000613bee8261467c565b613bf881856146aa565b9350613c038361466c565b8060005b83811015613c34578151613c1b8882613bbc565b9750613c268361469d565b925050600181019050613c07565b5085935050505092915050565b613c4a816147c0565b82525050565b6000613c5b82614687565b613c6581856146bb565b9350613c75818560208601614831565b613c7e81614a6f565b840191505092915050565b6000613c9482614692565b613c9e81856146d7565b9350613cae818560208601614831565b613cb781614a6f565b840191505092915050565b6000613ccd82614692565b613cd781856146e8565b9350613ce7818560208601614831565b80840191505092915050565b6000613d00601e836146d7565b9150613d0b82614a80565b602082019050919050565b6000613d236029836146d7565b9150613d2e82614aa9565b604082019050919050565b6000613d46602b836146d7565b9150613d5182614af8565b604082019050919050565b6000613d696032836146d7565b9150613d7482614b47565b604082019050919050565b6000613d8c6026836146d7565b9150613d9782614b96565b604082019050919050565b6000613daf601c836146d7565b9150613dba82614be5565b602082019050919050565b6000613dd26024836146d7565b9150613ddd82614c0e565b604082019050919050565b6000613df56019836146d7565b9150613e0082614c5d565b602082019050919050565b6000613e18602c836146d7565b9150613e2382614c86565b604082019050919050565b6000613e3b6025836146d7565b9150613e4682614cd5565b604082019050919050565b6000613e5e6015836146d7565b9150613e6982614d24565b602082019050919050565b6000613e816038836146d7565b9150613e8c82614d4d565b604082019050919050565b6000613ea4602a836146d7565b9150613eaf82614d9c565b604082019050919050565b6000613ec76029836146d7565b9150613ed282614deb565b604082019050919050565b6000613eea6020836146d7565b9150613ef582614e3a565b602082019050919050565b6000613f0d6020836146d7565b9150613f1882614e63565b602082019050919050565b6000613f30602c836146d7565b9150613f3b82614e8c565b604082019050919050565b6000613f536020836146d7565b9150613f5e82614edb565b602082019050919050565b6000613f766029836146d7565b9150613f8182614f04565b604082019050919050565b6000613f99602f836146d7565b9150613fa482614f53565b604082019050919050565b6000613fbc6018836146d7565b9150613fc782614fa2565b602082019050919050565b6000613fdf6021836146d7565b9150613fea82614fcb565b604082019050919050565b60006140026029836146d7565b915061400d8261501a565b604082019050919050565b60006140256000836146cc565b915061403082615069565b600082019050919050565b60006140486010836146d7565b91506140538261506c565b602082019050919050565b600061406b6031836146d7565b915061407682615095565b604082019050919050565b600061408e602c836146d7565b9150614099826150e4565b604082019050919050565b60006140b16029836146d7565b91506140bc82615133565b604082019050919050565b60006140d4601f836146d7565b91506140df82615182565b602082019050919050565b60006140f76027836146d7565b9150614102826151ab565b604082019050919050565b61411681614818565b82525050565b61412581614818565b82525050565b60006141378285613cc2565b91506141438284613cc2565b91508190509392505050565b600061415a82614018565b9150819050919050565b60006020820190506141796000830184613bd4565b92915050565b60006080820190506141946000830187613bd4565b6141a16020830186613bd4565b6141ae604083018561411c565b81810360608301526141c08184613c50565b905095945050505050565b600060208201905081810360008301526141e58184613be3565b905092915050565b60006020820190506142026000830184613c41565b92915050565b600060208201905081810360008301526142228184613c89565b905092915050565b6000602082019050818103600083015261424381613cf3565b9050919050565b6000602082019050818103600083015261426381613d16565b9050919050565b6000602082019050818103600083015261428381613d39565b9050919050565b600060208201905081810360008301526142a381613d5c565b9050919050565b600060208201905081810360008301526142c381613d7f565b9050919050565b600060208201905081810360008301526142e381613da2565b9050919050565b6000602082019050818103600083015261430381613dc5565b9050919050565b6000602082019050818103600083015261432381613de8565b9050919050565b6000602082019050818103600083015261434381613e0b565b9050919050565b6000602082019050818103600083015261436381613e2e565b9050919050565b6000602082019050818103600083015261438381613e51565b9050919050565b600060208201905081810360008301526143a381613e74565b9050919050565b600060208201905081810360008301526143c381613e97565b9050919050565b600060208201905081810360008301526143e381613eba565b9050919050565b6000602082019050818103600083015261440381613edd565b9050919050565b6000602082019050818103600083015261442381613f00565b9050919050565b6000602082019050818103600083015261444381613f23565b9050919050565b6000602082019050818103600083015261446381613f46565b9050919050565b6000602082019050818103600083015261448381613f69565b9050919050565b600060208201905081810360008301526144a381613f8c565b9050919050565b600060208201905081810360008301526144c381613faf565b9050919050565b600060208201905081810360008301526144e381613fd2565b9050919050565b6000602082019050818103600083015261450381613ff5565b9050919050565b600060208201905081810360008301526145238161403b565b9050919050565b600060208201905081810360008301526145438161405e565b9050919050565b6000602082019050818103600083015261456381614081565b9050919050565b60006020820190508181036000830152614583816140a4565b9050919050565b600060208201905081810360008301526145a3816140c7565b9050919050565b600060208201905081810360008301526145c3816140ea565b9050919050565b60006020820190506145df600083018461411c565b92915050565b60006145ef614600565b90506145fb8282614896565b919050565b6000604051905090565b600067ffffffffffffffff82111561462557614624614a2c565b5b61462e82614a6f565b9050602081019050919050565b600067ffffffffffffffff82111561465657614655614a2c565b5b61465f82614a6f565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006146fe82614818565b915061470983614818565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561473e5761473d614941565b5b828201905092915050565b600061475482614818565b915061475f83614818565b92508261476f5761476e614970565b5b828204905092915050565b600061478582614818565b915061479083614818565b9250828210156147a3576147a2614941565b5b828203905092915050565b60006147b9826147f8565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561484f578082015181840152602081019050614834565b8381111561485e576000848401525b50505050565b6000600282049050600182168061487c57607f821691505b602082108114156148905761488f61499f565b5b50919050565b61489f82614a6f565b810181811067ffffffffffffffff821117156148be576148bd614a2c565b5b80604052505050565b60006148d282614818565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561490557614904614941565b5b600182019050919050565b600061491b82614818565b915061492683614818565b92508261493657614935614970565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4d75737420656e7465722061206e756d62657220746f20726573657276650000600082015250565b7f416c6c20746f6b656e732068617665206265656e206d696e74656420666f722060008201527f7468697320626f6f6b0000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f7567682072657365727665206c65667420666f72207468697360008201527f20626f6f6b000000000000000000000000000000000000000000000000000000602082015250565b7f4574682076616c7565206973206e6f7420676f6f640000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f53616c6520666f72207468697320626f6f6b206973206e6f7420616374697665600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4d75737420656e746572206120626f6f6b206e756d6265720000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f576f756c6420657863656564207075726368617365206c696d697420666f722060008201527f7468697320626f6f6b0000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f416c6c20746f6b656e7320666f72207468697320626f6f6b206861766520626560008201527f656e206d696e7465640000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f576f756c642065786365656420746f74616c20737570706c7920666f7220746860008201527f697320626f6f6b00000000000000000000000000000000000000000000000000602082015250565b615203816147ae565b811461520e57600080fd5b50565b61521a816147c0565b811461522557600080fd5b50565b615231816147cc565b811461523c57600080fd5b50565b61524881614818565b811461525357600080fd5b5056fea26469706673582212206bbe023223f39288354405a0096dfcf3c7f580794fa01f030e3011527e63fc8a64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102305760003560e01c806370a082311161012e578063b88d4fde116100ab578063e501217d1161006f578063e501217d146108ac578063e985e9c5146108d7578063f2fde38b14610914578063f7d975771461093d578063fefd229d1461096657610230565b8063b88d4fde146107a1578063bc31c1c1146107ca578063c87b56dd14610807578063d4e32e9914610844578063dbddb26a1461088157610230565b806395d89b41116100f257806395d89b41146106be5780639d7f4ebf146106e95780639e29dd3614610726578063a22cb4651461074f578063b88b74ec1461077857610230565b806370a08231146105c5578063715018a6146106025780638462151c146106195780638da5cb5b146106565780639073810c1461068157610230565b80632f745c59116101bc5780634f6ccce7116101805780634f6ccce7146104c957806355f804b3146105065780635aa529081461052f5780636352211e1461056c57806370876c98146105a957610230565b80632f745c59146103fa578063313112ce146104375780633cb00e39146104605780633ccfd60b1461048957806342842e0e146104a057610230565b8063095ea7b311610203578063095ea7b314610317578063109695231461034057806318160ddd1461036957806323b872dd146103945780632e7ff793146103bd57610230565b806301ffc9a71461023557806304ca27751461027257806306fdde03146102af578063081812fc146102da575b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190613aac565b61098f565b60405161026991906141ed565b60405180910390f35b34801561027e57600080fd5b5061029960048036038101906102949190613b4f565b610a09565b6040516102a691906141ed565b60405180910390f35b3480156102bb57600080fd5b506102c4610a3d565b6040516102d19190614208565b60405180910390f35b3480156102e657600080fd5b5061030160048036038101906102fc9190613b4f565b610acf565b60405161030e9190614164565b60405180910390f35b34801561032357600080fd5b5061033e60048036038101906103399190613a19565b610b54565b005b34801561034c57600080fd5b5061036760048036038101906103629190613b06565b610c6c565b005b34801561037557600080fd5b5061037e610d02565b60405161038b91906145ca565b60405180910390f35b3480156103a057600080fd5b506103bb60048036038101906103b69190613903565b610d0f565b005b3480156103c957600080fd5b506103e460048036038101906103df9190613b4f565b610d6f565b6040516103f191906145ca565b60405180910390f35b34801561040657600080fd5b50610421600480360381019061041c9190613a19565b610d93565b60405161042e91906145ca565b60405180910390f35b34801561044357600080fd5b5061045e60048036038101906104599190613b4f565b610e38565b005b34801561046c57600080fd5b5061048760048036038101906104829190613b7c565b610f29565b005b34801561049557600080fd5b5061049e610fcc565b005b3480156104ac57600080fd5b506104c760048036038101906104c29190613903565b6110fd565b005b3480156104d557600080fd5b506104f060048036038101906104eb9190613b4f565b61111d565b6040516104fd91906145ca565b60405180910390f35b34801561051257600080fd5b5061052d60048036038101906105289190613b06565b61118e565b005b34801561053b57600080fd5b5061055660048036038101906105519190613b4f565b611224565b60405161056391906145ca565b60405180910390f35b34801561057857600080fd5b50610593600480360381019061058e9190613b4f565b611248565b6040516105a09190614164565b60405180910390f35b6105c360048036038101906105be9190613b7c565b6112fa565b005b3480156105d157600080fd5b506105ec60048036038101906105e79190613896565b61179f565b6040516105f991906145ca565b60405180910390f35b34801561060e57600080fd5b50610617611857565b005b34801561062557600080fd5b50610640600480360381019061063b9190613896565b6118df565b60405161064d91906141cb565b60405180910390f35b34801561066257600080fd5b5061066b6119e9565b6040516106789190614164565b60405180910390f35b34801561068d57600080fd5b506106a860048036038101906106a39190613b4f565b611a12565b6040516106b591906145ca565b60405180910390f35b3480156106ca57600080fd5b506106d3611a36565b6040516106e09190614208565b60405180910390f35b3480156106f557600080fd5b50610710600480360381019061070b9190613b4f565b611ac8565b60405161071d91906145ca565b60405180910390f35b34801561073257600080fd5b5061074d60048036038101906107489190613a59565b611aec565b005b34801561075b57600080fd5b50610776600480360381019061077191906139d9565b611e5b565b005b34801561078457600080fd5b5061079f600480360381019061079a9190613b7c565b611fdc565b005b3480156107ad57600080fd5b506107c860048036038101906107c39190613956565b61207f565b005b3480156107d657600080fd5b506107f160048036038101906107ec9190613b4f565b6120e1565b6040516107fe91906145ca565b60405180910390f35b34801561081357600080fd5b5061082e60048036038101906108299190613b4f565b612105565b60405161083b9190614208565b60405180910390f35b34801561085057600080fd5b5061086b60048036038101906108669190613b4f565b6121ac565b60405161087891906145ca565b60405180910390f35b34801561088d57600080fd5b506108966121d0565b6040516108a39190614208565b60405180910390f35b3480156108b857600080fd5b506108c161225e565b6040516108ce9190614208565b60405180910390f35b3480156108e357600080fd5b506108fe60048036038101906108f991906138c3565b6122ec565b60405161090b91906141ed565b60405180910390f35b34801561092057600080fd5b5061093b60048036038101906109369190613896565b612380565b005b34801561094957600080fd5b50610964600480360381019061095f9190613b7c565b612478565b005b34801561097257600080fd5b5061098d60048036038101906109889190613b7c565b61251b565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a025750610a01826125be565b5b9050919050565b60148181548110610a1957600080fd5b9060005260206000209060209182820401919006915054906101000a900460ff1681565b606060018054610a4c90614864565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7890614864565b8015610ac55780601f10610a9a57610100808354040283529160200191610ac5565b820191906000526020600020905b815481529060010190602001808311610aa857829003601f168201915b5050505050905090565b6000610ada826126a0565b610b19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b109061442a565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b5f82611248565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc7906144ca565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bef61270c565b73ffffffffffffffffffffffffffffffffffffffff161480610c1e5750610c1d81610c1861270c565b6122ec565b5b610c5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c549061438a565b60405180910390fd5b610c678383612714565b505050565b610c7461270c565b73ffffffffffffffffffffffffffffffffffffffff16610c926119e9565b73ffffffffffffffffffffffffffffffffffffffff1614610ce8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdf9061444a565b60405180910390fd5b80600c9080519060200190610cfe9291906136aa565b5050565b6000600980549050905090565b610d20610d1a61270c565b826127cd565b610d5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d569061452a565b60405180910390fd5b610d6a8383836128ab565b505050565b60118181548110610d7f57600080fd5b906000526020600020016000915090505481565b6000610d9e8361179f565b8210610ddf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd69061426a565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610e4061270c565b73ffffffffffffffffffffffffffffffffffffffff16610e5e6119e9565b73ffffffffffffffffffffffffffffffffffffffff1614610eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eab9061444a565b60405180910390fd5b60148181548110610ec857610ec76149fd565b5b90600052602060002090602091828204019190069054906101000a900460ff161560148281548110610efd57610efc6149fd565b5b90600052602060002090602091828204019190066101000a81548160ff02191690831515021790555050565b610f3161270c565b73ffffffffffffffffffffffffffffffffffffffff16610f4f6119e9565b73ffffffffffffffffffffffffffffffffffffffff1614610fa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9c9061444a565b60405180910390fd5b8060108381548110610fba57610fb96149fd565b5b90600052602060002001819055505050565b610fd461270c565b73ffffffffffffffffffffffffffffffffffffffff16610ff26119e9565b73ffffffffffffffffffffffffffffffffffffffff1614611048576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103f9061444a565b60405180910390fd5b600033905060008173ffffffffffffffffffffffffffffffffffffffff16476040516110739061414f565b60006040518083038185875af1925050503d80600081146110b0576040519150601f19603f3d011682016040523d82523d6000602084013e6110b5565b606091505b50509050806110f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f09061450a565b60405180910390fd5b5050565b6111188383836040518060200160405280600081525061207f565b505050565b6000611127610d02565b8210611168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115f9061454a565b60405180910390fd5b6009828154811061117c5761117b6149fd565b5b90600052602060002001549050919050565b61119661270c565b73ffffffffffffffffffffffffffffffffffffffff166111b46119e9565b73ffffffffffffffffffffffffffffffffffffffff161461120a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112019061444a565b60405180910390fd5b80600d90805190602001906112209291906136aa565b5050565b6012818154811061123457600080fd5b906000526020600020016000915090505481565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e8906143ca565b60405180910390fd5b80915050919050565b6002600b541415611340576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113379061458a565b60405180910390fd5b6002600b819055506000811015801561135a575060038111155b611399576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611390906144aa565b60405180910390fd5b601481815481106113ad576113ac6149fd565b5b90600052602060002090602091828204019190069054906101000a900460ff1661140c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114039061440a565b60405180910390fd5b601081815481106114205761141f6149fd565b5b90600052602060002001546013828154811061143f5761143e6149fd565b5b9060005260206000200154111561148b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114829061424a565b60405180910390fd5b6010818154811061149f5761149e6149fd565b5b90600052602060002001546114db83601384815481106114c2576114c16149fd565b5b9060005260206000200154612b0790919063ffffffff16565b111561151c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611513906145aa565b60405180910390fd5b60008211801561154a57506011818154811061153b5761153a6149fd565b5b90600052602060002001548211155b611589576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611580906144ea565b60405180910390fd5b600e818154811061159d5761159c6149fd565b5b906000526020600020015482346115b49190614749565b146115f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115eb9061436a565b60405180910390fd5b60005b828110156117925760108281548110611613576116126149fd565b5b906000526020600020015460138381548110611632576116316149fd565b5b9060005260206000200154101561177f5760008083141561169c5760138381548110611661576116606149fd565b5b9060005260206000200154600f84815481106116805761167f6149fd565b5b906000526020600020015461169591906146f3565b905061173d565b60005b838110156116e657601081815481106116bb576116ba6149fd565b5b9060005260206000200154826116d191906146f3565b915080806116de906148c7565b91505061169f565b50601383815481106116fb576116fa6149fd565b5b9060005260206000200154600f848154811061171a576117196149fd565b5b906000526020600020015461172f91906146f3565b8161173a91906146f3565b90505b600160138481548110611753576117526149fd565b5b90600052602060002001600082825461176c91906146f3565b9250508190555061177d3382612b1d565b505b808061178a906148c7565b9150506115f7565b506001600b819055505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611810576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611807906143aa565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61185f61270c565b73ffffffffffffffffffffffffffffffffffffffff1661187d6119e9565b73ffffffffffffffffffffffffffffffffffffffff16146118d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ca9061444a565b60405180910390fd5b6118dd6000612b3b565b565b606060006118ec8361179f565b9050600081141561194957600067ffffffffffffffff81111561191257611911614a2c565b5b6040519080825280602002602001820160405280156119405781602001602082028036833780820191505090505b509150506119e4565b60008167ffffffffffffffff81111561196557611964614a2c565b5b6040519080825280602002602001820160405280156119935781602001602082028036833780820191505090505b50905060005b828110156119dd576119ab8582610d93565b8282815181106119be576119bd6149fd565b5b60200260200101818152505080806119d5906148c7565b915050611999565b8193505050505b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60108181548110611a2257600080fd5b906000526020600020016000915090505481565b606060028054611a4590614864565b80601f0160208091040260200160405190810160405280929190818152602001828054611a7190614864565b8015611abe5780601f10611a9357610100808354040283529160200191611abe565b820191906000526020600020905b815481529060010190602001808311611aa157829003601f168201915b5050505050905090565b60138181548110611ad857600080fd5b906000526020600020016000915090505481565b611af461270c565b73ffffffffffffffffffffffffffffffffffffffff16611b126119e9565b73ffffffffffffffffffffffffffffffffffffffff1614611b68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5f9061444a565b60405180910390fd5b60008211611bab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba29061422a565b60405180910390fd5b60008110158015611bbd575060038111155b611bfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf3906144aa565b60405180910390fd5b600f8181548110611c1057611c0f6149fd565b5b9060005260206000200154611c4c8360128481548110611c3357611c326149fd565b5b9060005260206000200154612b0790919063ffffffff16565b1115611c8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c849061434a565b60405180910390fd5b60108181548110611ca157611ca06149fd565b5b9060005260206000200154611d0d83611cff60128581548110611cc757611cc66149fd565b5b906000526020600020015460138681548110611ce657611ce56149fd565b5b9060005260206000200154612b0790919063ffffffff16565b612b0790919063ffffffff16565b1115611d4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d459061456a565b60405180910390fd5b60005b82811015611e5557600080831415611d895760128381548110611d7757611d766149fd565b5b90600052602060002001549050611e01565b60005b83811015611dd35760108181548110611da857611da76149fd565b5b906000526020600020015482611dbe91906146f3565b91508080611dcb906148c7565b915050611d8c565b5060128381548110611de857611de76149fd565b5b906000526020600020015481611dfe91906146f3565b90505b600160128481548110611e1757611e166149fd565b5b906000526020600020016000828254611e3091906146f3565b92505081905550611e418582612b1d565b508080611e4d906148c7565b915050611d51565b50505050565b611e6361270c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec89061430a565b60405180910390fd5b8060066000611ede61270c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611f8b61270c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611fd091906141ed565b60405180910390a35050565b611fe461270c565b73ffffffffffffffffffffffffffffffffffffffff166120026119e9565b73ffffffffffffffffffffffffffffffffffffffff1614612058576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204f9061444a565b60405180910390fd5b80600f838154811061206d5761206c6149fd565b5b90600052602060002001819055505050565b61209061208a61270c565b836127cd565b6120cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c69061452a565b60405180910390fd5b6120db84848484612bff565b50505050565b600e81815481106120f157600080fd5b906000526020600020016000915090505481565b6060612110826126a0565b61214f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121469061448a565b60405180910390fd5b6000612159612c5b565b9050600081511161217957604051806020016040528060008152506121a4565b8061218384612ced565b60405160200161219492919061412b565b6040516020818303038152906040525b915050919050565b600f81815481106121bc57600080fd5b906000526020600020016000915090505481565b600d80546121dd90614864565b80601f016020809104026020016040519081016040528092919081815260200182805461220990614864565b80156122565780601f1061222b57610100808354040283529160200191612256565b820191906000526020600020905b81548152906001019060200180831161223957829003601f168201915b505050505081565b600c805461226b90614864565b80601f016020809104026020016040519081016040528092919081815260200182805461229790614864565b80156122e45780601f106122b9576101008083540402835291602001916122e4565b820191906000526020600020905b8154815290600101906020018083116122c757829003601f168201915b505050505081565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61238861270c565b73ffffffffffffffffffffffffffffffffffffffff166123a66119e9565b73ffffffffffffffffffffffffffffffffffffffff16146123fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f39061444a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561246c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612463906142aa565b60405180910390fd5b61247581612b3b565b50565b61248061270c565b73ffffffffffffffffffffffffffffffffffffffff1661249e6119e9565b73ffffffffffffffffffffffffffffffffffffffff16146124f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124eb9061444a565b60405180910390fd5b80600e8381548110612509576125086149fd565b5b90600052602060002001819055505050565b61252361270c565b73ffffffffffffffffffffffffffffffffffffffff166125416119e9565b73ffffffffffffffffffffffffffffffffffffffff1614612597576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258e9061444a565b60405180910390fd5b80601183815481106125ac576125ab6149fd565b5b90600052602060002001819055505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061268957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612699575061269882612e4e565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661278783611248565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006127d8826126a0565b612817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280e9061432a565b60405180910390fd5b600061282283611248565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061289157508373ffffffffffffffffffffffffffffffffffffffff1661287984610acf565b73ffffffffffffffffffffffffffffffffffffffff16145b806128a257506128a181856122ec565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166128cb82611248565b73ffffffffffffffffffffffffffffffffffffffff1614612921576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129189061446a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612991576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612988906142ea565b60405180910390fd5b61299c838383612eb8565b6129a7600082612714565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129f7919061477a565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a4e91906146f3565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008183612b1591906146f3565b905092915050565b612b37828260405180602001604052806000815250612fcc565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612c0a8484846128ab565b612c1684848484613027565b612c55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4c9061428a565b60405180910390fd5b50505050565b6060600d8054612c6a90614864565b80601f0160208091040260200160405190810160405280929190818152602001828054612c9690614864565b8015612ce35780601f10612cb857610100808354040283529160200191612ce3565b820191906000526020600020905b815481529060010190602001808311612cc657829003601f168201915b5050505050905090565b60606000821415612d35576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e49565b600082905060005b60008214612d67578080612d50906148c7565b915050600a82612d609190614749565b9150612d3d565b60008167ffffffffffffffff811115612d8357612d82614a2c565b5b6040519080825280601f01601f191660200182016040528015612db55781602001600182028036833780820191505090505b5090505b60008514612e4257600182612dce919061477a565b9150600a85612ddd9190614910565b6030612de991906146f3565b60f81b818381518110612dff57612dfe6149fd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e3b9190614749565b9450612db9565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612ec38383836131be565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612f0657612f01816131c3565b612f45565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612f4457612f43838261320c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f8857612f8381613379565b612fc7565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612fc657612fc5828261344a565b5b5b505050565b612fd683836134c9565b612fe36000848484613027565b613022576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130199061428a565b60405180910390fd5b505050565b60006130488473ffffffffffffffffffffffffffffffffffffffff16613697565b156131b1578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261307161270c565b8786866040518563ffffffff1660e01b8152600401613093949392919061417f565b602060405180830381600087803b1580156130ad57600080fd5b505af19250505080156130de57506040513d601f19601f820116820180604052508101906130db9190613ad9565b60015b613161573d806000811461310e576040519150601f19603f3d011682016040523d82523d6000602084013e613113565b606091505b50600081511415613159576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131509061428a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506131b6565b600190505b949350505050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016132198461179f565b613223919061477a565b9050600060086000848152602001908152602001600020549050818114613308576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160098054905061338d919061477a565b90506000600a60008481526020019081526020016000205490506000600983815481106133bd576133bc6149fd565b5b9060005260206000200154905080600983815481106133df576133de6149fd565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a600085815260200190815260200160002060009055600980548061342e5761342d6149ce565b5b6001900381819060005260206000200160009055905550505050565b60006134558361179f565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613539576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613530906143ea565b60405180910390fd5b613542816126a0565b15613582576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613579906142ca565b60405180910390fd5b61358e60008383612eb8565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546135de91906146f3565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b8280546136b690614864565b90600052602060002090601f0160209004810192826136d8576000855561371f565b82601f106136f157805160ff191683800117855561371f565b8280016001018555821561371f579182015b8281111561371e578251825591602001919060010190613703565b5b50905061372c9190613730565b5090565b5b80821115613749576000816000905550600101613731565b5090565b600061376061375b8461460a565b6145e5565b90508281526020810184848401111561377c5761377b614a60565b5b613787848285614822565b509392505050565b60006137a261379d8461463b565b6145e5565b9050828152602081018484840111156137be576137bd614a60565b5b6137c9848285614822565b509392505050565b6000813590506137e0816151fa565b92915050565b6000813590506137f581615211565b92915050565b60008135905061380a81615228565b92915050565b60008151905061381f81615228565b92915050565b600082601f83011261383a57613839614a5b565b5b813561384a84826020860161374d565b91505092915050565b600082601f83011261386857613867614a5b565b5b813561387884826020860161378f565b91505092915050565b6000813590506138908161523f565b92915050565b6000602082840312156138ac576138ab614a6a565b5b60006138ba848285016137d1565b91505092915050565b600080604083850312156138da576138d9614a6a565b5b60006138e8858286016137d1565b92505060206138f9858286016137d1565b9150509250929050565b60008060006060848603121561391c5761391b614a6a565b5b600061392a868287016137d1565b935050602061393b868287016137d1565b925050604061394c86828701613881565b9150509250925092565b600080600080608085870312156139705761396f614a6a565b5b600061397e878288016137d1565b945050602061398f878288016137d1565b93505060406139a087828801613881565b925050606085013567ffffffffffffffff8111156139c1576139c0614a65565b5b6139cd87828801613825565b91505092959194509250565b600080604083850312156139f0576139ef614a6a565b5b60006139fe858286016137d1565b9250506020613a0f858286016137e6565b9150509250929050565b60008060408385031215613a3057613a2f614a6a565b5b6000613a3e858286016137d1565b9250506020613a4f85828601613881565b9150509250929050565b600080600060608486031215613a7257613a71614a6a565b5b6000613a80868287016137d1565b9350506020613a9186828701613881565b9250506040613aa286828701613881565b9150509250925092565b600060208284031215613ac257613ac1614a6a565b5b6000613ad0848285016137fb565b91505092915050565b600060208284031215613aef57613aee614a6a565b5b6000613afd84828501613810565b91505092915050565b600060208284031215613b1c57613b1b614a6a565b5b600082013567ffffffffffffffff811115613b3a57613b39614a65565b5b613b4684828501613853565b91505092915050565b600060208284031215613b6557613b64614a6a565b5b6000613b7384828501613881565b91505092915050565b60008060408385031215613b9357613b92614a6a565b5b6000613ba185828601613881565b9250506020613bb285828601613881565b9150509250929050565b6000613bc8838361410d565b60208301905092915050565b613bdd816147ae565b82525050565b6000613bee8261467c565b613bf881856146aa565b9350613c038361466c565b8060005b83811015613c34578151613c1b8882613bbc565b9750613c268361469d565b925050600181019050613c07565b5085935050505092915050565b613c4a816147c0565b82525050565b6000613c5b82614687565b613c6581856146bb565b9350613c75818560208601614831565b613c7e81614a6f565b840191505092915050565b6000613c9482614692565b613c9e81856146d7565b9350613cae818560208601614831565b613cb781614a6f565b840191505092915050565b6000613ccd82614692565b613cd781856146e8565b9350613ce7818560208601614831565b80840191505092915050565b6000613d00601e836146d7565b9150613d0b82614a80565b602082019050919050565b6000613d236029836146d7565b9150613d2e82614aa9565b604082019050919050565b6000613d46602b836146d7565b9150613d5182614af8565b604082019050919050565b6000613d696032836146d7565b9150613d7482614b47565b604082019050919050565b6000613d8c6026836146d7565b9150613d9782614b96565b604082019050919050565b6000613daf601c836146d7565b9150613dba82614be5565b602082019050919050565b6000613dd26024836146d7565b9150613ddd82614c0e565b604082019050919050565b6000613df56019836146d7565b9150613e0082614c5d565b602082019050919050565b6000613e18602c836146d7565b9150613e2382614c86565b604082019050919050565b6000613e3b6025836146d7565b9150613e4682614cd5565b604082019050919050565b6000613e5e6015836146d7565b9150613e6982614d24565b602082019050919050565b6000613e816038836146d7565b9150613e8c82614d4d565b604082019050919050565b6000613ea4602a836146d7565b9150613eaf82614d9c565b604082019050919050565b6000613ec76029836146d7565b9150613ed282614deb565b604082019050919050565b6000613eea6020836146d7565b9150613ef582614e3a565b602082019050919050565b6000613f0d6020836146d7565b9150613f1882614e63565b602082019050919050565b6000613f30602c836146d7565b9150613f3b82614e8c565b604082019050919050565b6000613f536020836146d7565b9150613f5e82614edb565b602082019050919050565b6000613f766029836146d7565b9150613f8182614f04565b604082019050919050565b6000613f99602f836146d7565b9150613fa482614f53565b604082019050919050565b6000613fbc6018836146d7565b9150613fc782614fa2565b602082019050919050565b6000613fdf6021836146d7565b9150613fea82614fcb565b604082019050919050565b60006140026029836146d7565b915061400d8261501a565b604082019050919050565b60006140256000836146cc565b915061403082615069565b600082019050919050565b60006140486010836146d7565b91506140538261506c565b602082019050919050565b600061406b6031836146d7565b915061407682615095565b604082019050919050565b600061408e602c836146d7565b9150614099826150e4565b604082019050919050565b60006140b16029836146d7565b91506140bc82615133565b604082019050919050565b60006140d4601f836146d7565b91506140df82615182565b602082019050919050565b60006140f76027836146d7565b9150614102826151ab565b604082019050919050565b61411681614818565b82525050565b61412581614818565b82525050565b60006141378285613cc2565b91506141438284613cc2565b91508190509392505050565b600061415a82614018565b9150819050919050565b60006020820190506141796000830184613bd4565b92915050565b60006080820190506141946000830187613bd4565b6141a16020830186613bd4565b6141ae604083018561411c565b81810360608301526141c08184613c50565b905095945050505050565b600060208201905081810360008301526141e58184613be3565b905092915050565b60006020820190506142026000830184613c41565b92915050565b600060208201905081810360008301526142228184613c89565b905092915050565b6000602082019050818103600083015261424381613cf3565b9050919050565b6000602082019050818103600083015261426381613d16565b9050919050565b6000602082019050818103600083015261428381613d39565b9050919050565b600060208201905081810360008301526142a381613d5c565b9050919050565b600060208201905081810360008301526142c381613d7f565b9050919050565b600060208201905081810360008301526142e381613da2565b9050919050565b6000602082019050818103600083015261430381613dc5565b9050919050565b6000602082019050818103600083015261432381613de8565b9050919050565b6000602082019050818103600083015261434381613e0b565b9050919050565b6000602082019050818103600083015261436381613e2e565b9050919050565b6000602082019050818103600083015261438381613e51565b9050919050565b600060208201905081810360008301526143a381613e74565b9050919050565b600060208201905081810360008301526143c381613e97565b9050919050565b600060208201905081810360008301526143e381613eba565b9050919050565b6000602082019050818103600083015261440381613edd565b9050919050565b6000602082019050818103600083015261442381613f00565b9050919050565b6000602082019050818103600083015261444381613f23565b9050919050565b6000602082019050818103600083015261446381613f46565b9050919050565b6000602082019050818103600083015261448381613f69565b9050919050565b600060208201905081810360008301526144a381613f8c565b9050919050565b600060208201905081810360008301526144c381613faf565b9050919050565b600060208201905081810360008301526144e381613fd2565b9050919050565b6000602082019050818103600083015261450381613ff5565b9050919050565b600060208201905081810360008301526145238161403b565b9050919050565b600060208201905081810360008301526145438161405e565b9050919050565b6000602082019050818103600083015261456381614081565b9050919050565b60006020820190508181036000830152614583816140a4565b9050919050565b600060208201905081810360008301526145a3816140c7565b9050919050565b600060208201905081810360008301526145c3816140ea565b9050919050565b60006020820190506145df600083018461411c565b92915050565b60006145ef614600565b90506145fb8282614896565b919050565b6000604051905090565b600067ffffffffffffffff82111561462557614624614a2c565b5b61462e82614a6f565b9050602081019050919050565b600067ffffffffffffffff82111561465657614655614a2c565b5b61465f82614a6f565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006146fe82614818565b915061470983614818565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561473e5761473d614941565b5b828201905092915050565b600061475482614818565b915061475f83614818565b92508261476f5761476e614970565b5b828204905092915050565b600061478582614818565b915061479083614818565b9250828210156147a3576147a2614941565b5b828203905092915050565b60006147b9826147f8565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561484f578082015181840152602081019050614834565b8381111561485e576000848401525b50505050565b6000600282049050600182168061487c57607f821691505b602082108114156148905761488f61499f565b5b50919050565b61489f82614a6f565b810181811067ffffffffffffffff821117156148be576148bd614a2c565b5b80604052505050565b60006148d282614818565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561490557614904614941565b5b600182019050919050565b600061491b82614818565b915061492683614818565b92508261493657614935614970565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4d75737420656e7465722061206e756d62657220746f20726573657276650000600082015250565b7f416c6c20746f6b656e732068617665206265656e206d696e74656420666f722060008201527f7468697320626f6f6b0000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f7567682072657365727665206c65667420666f72207468697360008201527f20626f6f6b000000000000000000000000000000000000000000000000000000602082015250565b7f4574682076616c7565206973206e6f7420676f6f640000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f53616c6520666f72207468697320626f6f6b206973206e6f7420616374697665600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4d75737420656e746572206120626f6f6b206e756d6265720000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f576f756c6420657863656564207075726368617365206c696d697420666f722060008201527f7468697320626f6f6b0000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f416c6c20746f6b656e7320666f72207468697320626f6f6b206861766520626560008201527f656e206d696e7465640000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f576f756c642065786365656420746f74616c20737570706c7920666f7220746860008201527f697320626f6f6b00000000000000000000000000000000000000000000000000602082015250565b615203816147ae565b811461520e57600080fd5b50565b61521a816147c0565b811461522557600080fd5b50565b615231816147cc565b811461523c57600080fd5b50565b61524881614818565b811461525357600080fd5b5056fea26469706673582212206bbe023223f39288354405a0096dfcf3c7f580794fa01f030e3011527e63fc8a64736f6c63430008070033

Deployed Bytecode Sourcemap

60072:5055:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49010:300;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60617:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32011:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33704:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33227:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61305:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49813:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34763:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60451:57;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49394:343;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60963:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61747:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60741:214;;;;;;;;;;;;;:::i;:::-;;35210:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50003:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61198:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60515:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31618:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62070:1425;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31261:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2550:94;;;;;;;;;;;;;:::i;:::-;;64617:507;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1899:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60395:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32180:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60567:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63503:1106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34084:327;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61594:145;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35466:365;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60249:78;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32355:468;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60334:54;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60213:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60172:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34482:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2799:229;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61473:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61883:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49010:300;49157:4;49214:35;49199:50;;;:11;:50;;;;:103;;;;49266:36;49290:11;49266:23;:36::i;:::-;49199:103;49179:123;;49010:300;;;:::o;60617:55::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32011:100::-;32065:13;32098:5;32091:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32011:100;:::o;33704:308::-;33825:7;33872:16;33880:7;33872;:16::i;:::-;33850:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;33980:15;:24;33996:7;33980:24;;;;;;;;;;;;;;;;;;;;;33973:31;;33704:308;;;:::o;33227:411::-;33308:13;33324:23;33339:7;33324:14;:23::i;:::-;33308:39;;33372:5;33366:11;;:2;:11;;;;33358:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;33466:5;33450:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;33475:37;33492:5;33499:12;:10;:12::i;:::-;33475:16;:37::i;:::-;33450:62;33428:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;33609:21;33618:2;33622:7;33609:8;:21::i;:::-;33297:341;33227:411;;:::o;61305:125::-;2130:12;:10;:12::i;:::-;2119:23;;:7;:5;:7::i;:::-;:23;;;2111:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61408:14:::1;61390:15;:32;;;;;;;;;;;;:::i;:::-;;61305:125:::0;:::o;49813:113::-;49874:7;49901:10;:17;;;;49894:24;;49813:113;:::o;34763:376::-;34972:41;34991:12;:10;:12::i;:::-;35005:7;34972:18;:41::i;:::-;34950:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;35103:28;35113:4;35119:2;35123:7;35103:9;:28::i;:::-;34763:376;;;:::o;60451:57::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;49394:343::-;49536:7;49591:23;49608:5;49591:16;:23::i;:::-;49583:5;:31;49561:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;49703:12;:19;49716:5;49703:19;;;;;;;;;;;;;;;:26;49723:5;49703:26;;;;;;;;;;;;49696:33;;49394:343;;;;:::o;60963:118::-;2130:12;:10;:12::i;:::-;2119:23;;:7;:5;:7::i;:::-;:23;;;2111:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61054:10:::1;61065:7;61054:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;61053:20;61031:10;61042:7;61031:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;60963:118:::0;:::o;61747:128::-;2130:12;:10;:12::i;:::-;2119:23;;:7;:5;:7::i;:::-;:23;;;2111:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61857:10:::1;61835:9;61845:8;61835:19;;;;;;;;:::i;:::-;;;;;;;;;:32;;;;61747:128:::0;;:::o;60741:214::-;2130:12;:10;:12::i;:::-;2119:23;;:7;:5;:7::i;:::-;:23;;;2111:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60789:18:::1;60818:10;60789:40;;60841:12;60859:2;:7;;60874:21;60859:41;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60840:60;;;60919:7;60911:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;60778:177;;60741:214::o:0;35210:185::-;35348:39;35365:4;35371:2;35375:7;35348:39;;;;;;;;;;;;:16;:39::i;:::-;35210:185;;;:::o;50003:320::-;50123:7;50178:30;:28;:30::i;:::-;50170:5;:38;50148:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;50298:10;50309:5;50298:17;;;;;;;;:::i;:::-;;;;;;;;;;50291:24;;50003:320;;;:::o;61198:99::-;2130:12;:10;:12::i;:::-;2119:23;;:7;:5;:7::i;:::-;:23;;;2111:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61281:8:::1;61270;:19;;;;;;;;;;;;:::i;:::-;;61198:99:::0;:::o;60515:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31618:326::-;31735:7;31760:13;31776:7;:16;31784:7;31776:16;;;;;;;;;;;;;;;;;;;;;31760:32;;31842:1;31825:19;;:5;:19;;;;31803:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;31931:5;31924:12;;;31618:326;;;:::o;62070:1425::-;58615:1;59211:7;;:19;;59203:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;58615:1;59344:7;:18;;;;62189:1:::1;62177:8;:13;;:30;;;;;62206:1;62194:8;:13;;62177:30;62169:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;62255:10;62266:8;62255:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;62247:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;62356:9;62366:8;62356:19;;;;;;;;:::i;:::-;;;;;;;;;;62331:11;62343:8;62331:21;;;;;;;;:::i;:::-;;;;;;;;;;:44;;62323:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;62485:9;62495:8;62485:19;;;;;;;;:::i;:::-;;;;;;;;;;62440:41;62466:14;62440:11;62452:8;62440:21;;;;;;;;:::i;:::-;;;;;;;;;;:25;;:41;;;;:::i;:::-;:64;;62432:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;62584:1;62567:14;:18;:63;;;;;62607:13;62621:8;62607:23;;;;;;;;:::i;:::-;;;;;;;;;;62589:14;:41;;62567:63;62559:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;62724:6;62731:8;62724:16;;;;;;;;:::i;:::-;;;;;;;;;;62706:14;62694:9;:26;;;;:::i;:::-;:46;62686:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;62784:9;62779:709;62803:14;62799:1;:18;62779:709;;;62867:9;62877:8;62867:19;;;;;;;;:::i;:::-;;;;;;;;;;62843:11;62855:8;62843:21;;;;;;;;:::i;:::-;;;;;;;;;;:43;62839:638;;;62907:15;62960:1:::0;62948:8:::1;:13;62945:362;;;63023:11;63035:8;63023:21;;;;;;;;:::i;:::-;;;;;;;;;;62996:14;63011:8;62996:24;;;;;;;;:::i;:::-;;;;;;;;;;:48;;;;:::i;:::-;62986:58;;62945:362;;;63098:9;63093:113;63117:8;63113:1;:12;63093:113;;;63170:9;63180:1;63170:12;;;;;;;;:::i;:::-;;;;;;;;;;63159:23;;;;;:::i;:::-;;;63127:3;;;;;:::i;:::-;;;;63093:113;;;;63266:11;63278:8;63266:21;;;;;;;;:::i;:::-;;;;;;;;;;63239:14;63254:8;63239:24;;;;;;;;:::i;:::-;;;;;;;;;;:48;;;;:::i;:::-;63228:59;;;;;:::i;:::-;;;62945:362;63411:1;63386:11;63398:8;63386:21;;;;;;;;:::i;:::-;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;63431:30;63441:10;63453:7;63431:9;:30::i;:::-;62888:589;62839:638;62819:3;;;;;:::i;:::-;;;;62779:709;;;;58571:1:::0;59523:7;:22;;;;62070:1425;;:::o;31261:295::-;31378:7;31442:1;31425:19;;:5;:19;;;;31403:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;31532:9;:16;31542:5;31532:16;;;;;;;;;;;;;;;;31525:23;;31261:295;;;:::o;2550:94::-;2130:12;:10;:12::i;:::-;2119:23;;:7;:5;:7::i;:::-;:23;;;2111:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2615:21:::1;2633:1;2615:9;:21::i;:::-;2550:94::o:0;64617:507::-;64679:16;64713:18;64734:17;64744:6;64734:9;:17::i;:::-;64713:38;;64780:1;64766:10;:15;64762:355;;;64819:1;64805:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64798:23;;;;;64762:355;64854:23;64894:10;64880:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64854:51;;64920:13;64948:130;64972:10;64964:5;:18;64948:130;;;65028:34;65048:6;65056:5;65028:19;:34::i;:::-;65012:6;65019:5;65012:13;;;;;;;;:::i;:::-;;;;;;;:50;;;;;64984:7;;;;;:::i;:::-;;;;64948:130;;;65099:6;65092:13;;;;;64617:507;;;;:::o;1899:87::-;1945:7;1972:6;;;;;;;;;;;1965:13;;1899:87;:::o;60395:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32180:104::-;32236:13;32269:7;32262:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32180:104;:::o;60567:43::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;63503:1106::-;2130:12;:10;:12::i;:::-;2119:23;;:7;:5;:7::i;:::-;:23;;;2111:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63628:1:::1;63611:14;:18;63603:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;63695:1;63683:8;:13;;:30;;;;;63712:1;63700:8;:13;;63683:30;63675:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;63808:14;63823:8;63808:24;;;;;;;;:::i;:::-;;;;;;;;;;63761:43;63789:14;63761:13;63775:8;63761:23;;;;;;;;:::i;:::-;;;;;;;;;;:27;;:43;;;;:::i;:::-;:71;;63753:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;63967:9;63977:8;63967:19;;;;;;;;:::i;:::-;;;;;;;;;;63893:70;63948:14;63893:50;63919:13;63933:8;63919:23;;;;;;;;:::i;:::-;;;;;;;;;;63893:11;63905:8;63893:21;;;;;;;;:::i;:::-;;;;;;;;;;:25;;:50;;;;:::i;:::-;:54;;:70;;;;:::i;:::-;:93;;63885:147;;;;;;;;;;;;:::i;:::-;;;;;;;;;64050:9;64045:470;64069:14;64065:1;:18;64045:470;;;64105:15;64154:1:::0;64142:8:::1;:13;64139:284;;;64186:13;64200:8;64186:23;;;;;;;;:::i;:::-;;;;;;;;;;64176:33;;64139:284;;;64255:9;64250:105;64274:8;64270:1;:12;64250:105;;;64323:9;64333:1;64323:12;;;;;;;;:::i;:::-;;;;;;;;;;64312:23;;;;;:::i;:::-;;;64284:3;;;;;:::i;:::-;;;;64250:105;;;;64384:13;64398:8;64384:23;;;;;;;;:::i;:::-;;;;;;;;;;64373:34;;;;;:::i;:::-;;;64139:284;64464:1;64437:13;64451:8;64437:23;;;;;;;;:::i;:::-;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;64480:23;64490:3;64495:7;64480:9;:23::i;:::-;64090:425;64085:3;;;;;:::i;:::-;;;;64045:470;;;;63503:1106:::0;;;:::o;34084:327::-;34231:12;:10;:12::i;:::-;34219:24;;:8;:24;;;;34211:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;34331:8;34286:18;:32;34305:12;:10;:12::i;:::-;34286:32;;;;;;;;;;;;;;;:42;34319:8;34286:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;34384:8;34355:48;;34370:12;:10;:12::i;:::-;34355:48;;;34394:8;34355:48;;;;;;:::i;:::-;;;;;;;;34084:327;;:::o;61594:145::-;2130:12;:10;:12::i;:::-;2119:23;;:7;:5;:7::i;:::-;:23;;;2111:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61717:14:::1;61690;61705:8;61690:24;;;;;;;;:::i;:::-;;;;;;;;;:41;;;;61594:145:::0;;:::o;35466:365::-;35655:41;35674:12;:10;:12::i;:::-;35688:7;35655:18;:41::i;:::-;35633:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;35784:39;35798:4;35804:2;35808:7;35817:5;35784:13;:39::i;:::-;35466:365;;;;:::o;60249:78::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32355:468::-;32473:13;32526:16;32534:7;32526;:16::i;:::-;32504:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;32630:21;32654:10;:8;:10::i;:::-;32630:34;;32719:1;32701:7;32695:21;:25;:120;;;;;;;;;;;;;;;;;32764:7;32773:18;:7;:16;:18::i;:::-;32747:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32695:120;32675:140;;;32355:468;;;:::o;60334:54::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;60213:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;60172:34::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;34482:214::-;34624:4;34653:18;:25;34672:5;34653:25;;;;;;;;;;;;;;;:35;34679:8;34653:35;;;;;;;;;;;;;;;;;;;;;;;;;34646:42;;34482:214;;;;:::o;2799:229::-;2130:12;:10;:12::i;:::-;2119:23;;:7;:5;:7::i;:::-;:23;;;2111:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2922:1:::1;2902:22;;:8;:22;;;;2880:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;3001:19;3011:8;3001:9;:19::i;:::-;2799:229:::0;:::o;61473:113::-;2130:12;:10;:12::i;:::-;2119:23;;:7;:5;:7::i;:::-;:23;;;2111:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61572:6:::1;61553;61560:8;61553:16;;;;;;;;:::i;:::-;;;;;;;;;:25;;;;61473:113:::0;;:::o;61883:144::-;2130:12;:10;:12::i;:::-;2119:23;;:7;:5;:7::i;:::-;:23;;;2111:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62005:14:::1;61979:13;61993:8;61979:23;;;;;;;;:::i;:::-;;;;;;;;;:40;;;;61883:144:::0;;:::o;30842:355::-;30989:4;31046:25;31031:40;;;:11;:40;;;;:105;;;;31103:33;31088:48;;;:11;:48;;;;31031:105;:158;;;;31153:36;31177:11;31153:23;:36::i;:::-;31031:158;31011:178;;30842:355;;;:::o;37378:127::-;37443:4;37495:1;37467:30;;:7;:16;37475:7;37467:16;;;;;;;;;;;;;;;;;;;;;:30;;;;37460:37;;37378:127;;;:::o;662:98::-;715:7;742:10;735:17;;662:98;:::o;41501:174::-;41603:2;41576:15;:24;41592:7;41576:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;41659:7;41655:2;41621:46;;41630:23;41645:7;41630:14;:23::i;:::-;41621:46;;;;;;;;;;;;41501:174;;:::o;37672:452::-;37801:4;37845:16;37853:7;37845;:16::i;:::-;37823:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;37944:13;37960:23;37975:7;37960:14;:23::i;:::-;37944:39;;38013:5;38002:16;;:7;:16;;;:64;;;;38059:7;38035:31;;:20;38047:7;38035:11;:20::i;:::-;:31;;;38002:64;:113;;;;38083:32;38100:5;38107:7;38083:16;:32::i;:::-;38002:113;37994:122;;;37672:452;;;;:::o;40768:615::-;40941:4;40914:31;;:23;40929:7;40914:14;:23::i;:::-;:31;;;40892:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;41047:1;41033:16;;:2;:16;;;;41025:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;41103:39;41124:4;41130:2;41134:7;41103:20;:39::i;:::-;41207:29;41224:1;41228:7;41207:8;:29::i;:::-;41268:1;41249:9;:15;41259:4;41249:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;41297:1;41280:9;:13;41290:2;41280:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;41328:2;41309:7;:16;41317:7;41309:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;41367:7;41363:2;41348:27;;41357:4;41348:27;;;;;;;;;;;;40768:615;;;:::o;6170:98::-;6228:7;6259:1;6255;:5;;;;:::i;:::-;6248:12;;6170:98;;;;:::o;38466:110::-;38542:26;38552:2;38556:7;38542:26;;;;;;;;;;;;:9;:26::i;:::-;38466:110;;:::o;3036:173::-;3092:16;3111:6;;;;;;;;;;;3092:25;;3137:8;3128:6;;:17;;;;;;;;;;;;;;;;;;3192:8;3161:40;;3182:8;3161:40;;;;;;;;;;;;3081:128;3036:173;:::o;36713:352::-;36870:28;36880:4;36886:2;36890:7;36870:9;:28::i;:::-;36931:48;36954:4;36960:2;36964:7;36973:5;36931:22;:48::i;:::-;36909:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;36713:352;;;;:::o;61089:101::-;61141:13;61174:8;61167:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61089:101;:::o;26719:723::-;26775:13;27005:1;26996:5;:10;26992:53;;;27023:10;;;;;;;;;;;;;;;;;;;;;26992:53;27055:12;27070:5;27055:20;;27086:14;27111:78;27126:1;27118:4;:9;27111:78;;27144:8;;;;;:::i;:::-;;;;27175:2;27167:10;;;;;:::i;:::-;;;27111:78;;;27199:19;27231:6;27221:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27199:39;;27249:154;27265:1;27256:5;:10;27249:154;;27293:1;27283:11;;;;;:::i;:::-;;;27360:2;27352:5;:10;;;;:::i;:::-;27339:2;:24;;;;:::i;:::-;27326:39;;27309:6;27316;27309:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;27389:2;27380:11;;;;;:::i;:::-;;;27249:154;;;27427:6;27413:21;;;;;26719:723;;;;:::o;29308:207::-;29438:4;29482:25;29467:40;;;:11;:40;;;;29460:47;;29308:207;;;:::o;50936:589::-;51080:45;51107:4;51113:2;51117:7;51080:26;:45::i;:::-;51158:1;51142:18;;:4;:18;;;51138:187;;;51177:40;51209:7;51177:31;:40::i;:::-;51138:187;;;51247:2;51239:10;;:4;:10;;;51235:90;;51266:47;51299:4;51305:7;51266:32;:47::i;:::-;51235:90;51138:187;51353:1;51339:16;;:2;:16;;;51335:183;;;51372:45;51409:7;51372:36;:45::i;:::-;51335:183;;;51445:4;51439:10;;:2;:10;;;51435:83;;51466:40;51494:2;51498:7;51466:27;:40::i;:::-;51435:83;51335:183;50936:589;;;:::o;38803:321::-;38933:18;38939:2;38943:7;38933:5;:18::i;:::-;38984:54;39015:1;39019:2;39023:7;39032:5;38984:22;:54::i;:::-;38962:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;38803:321;;;:::o;42240:980::-;42395:4;42416:15;:2;:13;;;:15::i;:::-;42412:801;;;42485:2;42469:36;;;42528:12;:10;:12::i;:::-;42563:4;42590:7;42620:5;42469:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;42448:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42844:1;42827:6;:13;:18;42823:320;;;42870:108;;;;;;;;;;:::i;:::-;;;;;;;;42823:320;43093:6;43087:13;43078:6;43074:2;43070:15;43063:38;42448:710;42718:41;;;42708:51;;;:6;:51;;;;42701:58;;;;;42412:801;43197:4;43190:11;;42240:980;;;;;;;:::o;43792:126::-;;;;:::o;52248:164::-;52352:10;:17;;;;52325:15;:24;52341:7;52325:24;;;;;;;;;;;:44;;;;52380:10;52396:7;52380:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52248:164;:::o;53039:1002::-;53319:22;53369:1;53344:22;53361:4;53344:16;:22::i;:::-;:26;;;;:::i;:::-;53319:51;;53381:18;53402:17;:26;53420:7;53402:26;;;;;;;;;;;;53381:47;;53549:14;53535:10;:28;53531:328;;53580:19;53602:12;:18;53615:4;53602:18;;;;;;;;;;;;;;;:34;53621:14;53602:34;;;;;;;;;;;;53580:56;;53686:11;53653:12;:18;53666:4;53653:18;;;;;;;;;;;;;;;:30;53672:10;53653:30;;;;;;;;;;;:44;;;;53803:10;53770:17;:30;53788:11;53770:30;;;;;;;;;;;:43;;;;53565:294;53531:328;53955:17;:26;53973:7;53955:26;;;;;;;;;;;53948:33;;;53999:12;:18;54012:4;53999:18;;;;;;;;;;;;;;;:34;54018:14;53999:34;;;;;;;;;;;53992:41;;;53134:907;;53039:1002;;:::o;54336:1079::-;54589:22;54634:1;54614:10;:17;;;;:21;;;;:::i;:::-;54589:46;;54646:18;54667:15;:24;54683:7;54667:24;;;;;;;;;;;;54646:45;;55018:19;55040:10;55051:14;55040:26;;;;;;;;:::i;:::-;;;;;;;;;;55018:48;;55104:11;55079:10;55090;55079:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;55215:10;55184:15;:28;55200:11;55184:28;;;;;;;;;;;:41;;;;55356:15;:24;55372:7;55356:24;;;;;;;;;;;55349:31;;;55391:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;54407:1008;;;54336:1079;:::o;51826:221::-;51911:14;51928:20;51945:2;51928:16;:20::i;:::-;51911:37;;51986:7;51959:12;:16;51972:2;51959:16;;;;;;;;;;;;;;;:24;51976:6;51959:24;;;;;;;;;;;:34;;;;52033:6;52004:17;:26;52022:7;52004:26;;;;;;;;;;;:35;;;;51900:147;51826:221;;:::o;39460:382::-;39554:1;39540:16;;:2;:16;;;;39532:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;39613:16;39621:7;39613;:16::i;:::-;39612:17;39604:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;39675:45;39704:1;39708:2;39712:7;39675:20;:45::i;:::-;39750:1;39733:9;:13;39743:2;39733:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39781:2;39762:7;:16;39770:7;39762:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39826:7;39822:2;39801:33;;39818:1;39801:33;;;;;;;;;;;;39460:382;;:::o;18608:387::-;18668:4;18876:12;18943:7;18931:20;18923:28;;18986:1;18979:4;:8;18972:15;;;18608:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:619::-;5697:6;5705;5713;5762:2;5750:9;5741:7;5737:23;5733:32;5730:119;;;5768:79;;:::i;:::-;5730:119;5888:1;5913:53;5958:7;5949:6;5938:9;5934:22;5913:53;:::i;:::-;5903:63;;5859:117;6015:2;6041:53;6086:7;6077:6;6066:9;6062:22;6041:53;:::i;:::-;6031:63;;5986:118;6143:2;6169:53;6214:7;6205:6;6194:9;6190:22;6169:53;:::i;:::-;6159:63;;6114:118;5620:619;;;;;:::o;6245:327::-;6303:6;6352:2;6340:9;6331:7;6327:23;6323:32;6320:119;;;6358:79;;:::i;:::-;6320:119;6478:1;6503:52;6547:7;6538:6;6527:9;6523:22;6503:52;:::i;:::-;6493:62;;6449:116;6245:327;;;;:::o;6578:349::-;6647:6;6696:2;6684:9;6675:7;6671:23;6667:32;6664:119;;;6702:79;;:::i;:::-;6664:119;6822:1;6847:63;6902:7;6893:6;6882:9;6878:22;6847:63;:::i;:::-;6837:73;;6793:127;6578:349;;;;:::o;6933:509::-;7002:6;7051:2;7039:9;7030:7;7026:23;7022:32;7019:119;;;7057:79;;:::i;:::-;7019:119;7205:1;7194:9;7190:17;7177:31;7235:18;7227:6;7224:30;7221:117;;;7257:79;;:::i;:::-;7221:117;7362:63;7417:7;7408:6;7397:9;7393:22;7362:63;:::i;:::-;7352:73;;7148:287;6933:509;;;;:::o;7448:329::-;7507:6;7556:2;7544:9;7535:7;7531:23;7527:32;7524:119;;;7562:79;;:::i;:::-;7524:119;7682:1;7707:53;7752:7;7743:6;7732:9;7728:22;7707:53;:::i;:::-;7697:63;;7653:117;7448:329;;;;:::o;7783:474::-;7851:6;7859;7908:2;7896:9;7887:7;7883:23;7879:32;7876:119;;;7914:79;;:::i;:::-;7876:119;8034:1;8059:53;8104:7;8095:6;8084:9;8080:22;8059:53;:::i;:::-;8049:63;;8005:117;8161:2;8187:53;8232:7;8223:6;8212:9;8208:22;8187:53;:::i;:::-;8177:63;;8132:118;7783:474;;;;;:::o;8263:179::-;8332:10;8353:46;8395:3;8387:6;8353:46;:::i;:::-;8431:4;8426:3;8422:14;8408:28;;8263:179;;;;:::o;8448:118::-;8535:24;8553:5;8535:24;:::i;:::-;8530:3;8523:37;8448:118;;:::o;8602:732::-;8721:3;8750:54;8798:5;8750:54;:::i;:::-;8820:86;8899:6;8894:3;8820:86;:::i;:::-;8813:93;;8930:56;8980:5;8930:56;:::i;:::-;9009:7;9040:1;9025:284;9050:6;9047:1;9044:13;9025:284;;;9126:6;9120:13;9153:63;9212:3;9197:13;9153:63;:::i;:::-;9146:70;;9239:60;9292:6;9239:60;:::i;:::-;9229:70;;9085:224;9072:1;9069;9065:9;9060:14;;9025:284;;;9029:14;9325:3;9318:10;;8726:608;;;8602:732;;;;:::o;9340:109::-;9421:21;9436:5;9421:21;:::i;:::-;9416:3;9409:34;9340:109;;:::o;9455:360::-;9541:3;9569:38;9601:5;9569:38;:::i;:::-;9623:70;9686:6;9681:3;9623:70;:::i;:::-;9616:77;;9702:52;9747:6;9742:3;9735:4;9728:5;9724:16;9702:52;:::i;:::-;9779:29;9801:6;9779:29;:::i;:::-;9774:3;9770:39;9763:46;;9545:270;9455:360;;;;:::o;9821:364::-;9909:3;9937:39;9970:5;9937:39;:::i;:::-;9992:71;10056:6;10051:3;9992:71;:::i;:::-;9985:78;;10072:52;10117:6;10112:3;10105:4;10098:5;10094:16;10072:52;:::i;:::-;10149:29;10171:6;10149:29;:::i;:::-;10144:3;10140:39;10133:46;;9913:272;9821:364;;;;:::o;10191:377::-;10297:3;10325:39;10358:5;10325:39;:::i;:::-;10380:89;10462:6;10457:3;10380:89;:::i;:::-;10373:96;;10478:52;10523:6;10518:3;10511:4;10504:5;10500:16;10478:52;:::i;:::-;10555:6;10550:3;10546:16;10539:23;;10301:267;10191:377;;;;:::o;10574:366::-;10716:3;10737:67;10801:2;10796:3;10737:67;:::i;:::-;10730:74;;10813:93;10902:3;10813:93;:::i;:::-;10931:2;10926:3;10922:12;10915:19;;10574:366;;;:::o;10946:::-;11088:3;11109:67;11173:2;11168:3;11109:67;:::i;:::-;11102:74;;11185:93;11274:3;11185:93;:::i;:::-;11303:2;11298:3;11294:12;11287:19;;10946:366;;;:::o;11318:::-;11460:3;11481:67;11545:2;11540:3;11481:67;:::i;:::-;11474:74;;11557:93;11646:3;11557:93;:::i;:::-;11675:2;11670:3;11666:12;11659:19;;11318:366;;;:::o;11690:::-;11832:3;11853:67;11917:2;11912:3;11853:67;:::i;:::-;11846:74;;11929:93;12018:3;11929:93;:::i;:::-;12047:2;12042:3;12038:12;12031:19;;11690:366;;;:::o;12062:::-;12204:3;12225:67;12289:2;12284:3;12225:67;:::i;:::-;12218:74;;12301:93;12390:3;12301:93;:::i;:::-;12419:2;12414:3;12410:12;12403:19;;12062:366;;;:::o;12434:::-;12576:3;12597:67;12661:2;12656:3;12597:67;:::i;:::-;12590:74;;12673:93;12762:3;12673:93;:::i;:::-;12791:2;12786:3;12782:12;12775:19;;12434:366;;;:::o;12806:::-;12948:3;12969:67;13033:2;13028:3;12969:67;:::i;:::-;12962:74;;13045:93;13134:3;13045:93;:::i;:::-;13163:2;13158:3;13154:12;13147:19;;12806:366;;;:::o;13178:::-;13320:3;13341:67;13405:2;13400:3;13341:67;:::i;:::-;13334:74;;13417:93;13506:3;13417:93;:::i;:::-;13535:2;13530:3;13526:12;13519:19;;13178:366;;;:::o;13550:::-;13692:3;13713:67;13777:2;13772:3;13713:67;:::i;:::-;13706:74;;13789:93;13878:3;13789:93;:::i;:::-;13907:2;13902:3;13898:12;13891:19;;13550:366;;;:::o;13922:::-;14064:3;14085:67;14149:2;14144:3;14085:67;:::i;:::-;14078:74;;14161:93;14250:3;14161:93;:::i;:::-;14279:2;14274:3;14270:12;14263:19;;13922:366;;;:::o;14294:::-;14436:3;14457:67;14521:2;14516:3;14457:67;:::i;:::-;14450:74;;14533:93;14622:3;14533:93;:::i;:::-;14651:2;14646:3;14642:12;14635:19;;14294:366;;;:::o;14666:::-;14808:3;14829:67;14893:2;14888:3;14829:67;:::i;:::-;14822:74;;14905:93;14994:3;14905:93;:::i;:::-;15023:2;15018:3;15014:12;15007:19;;14666:366;;;:::o;15038:::-;15180:3;15201:67;15265:2;15260:3;15201:67;:::i;:::-;15194:74;;15277:93;15366:3;15277:93;:::i;:::-;15395:2;15390:3;15386:12;15379:19;;15038:366;;;:::o;15410:::-;15552:3;15573:67;15637:2;15632:3;15573:67;:::i;:::-;15566:74;;15649:93;15738:3;15649:93;:::i;:::-;15767:2;15762:3;15758:12;15751:19;;15410:366;;;:::o;15782:::-;15924:3;15945:67;16009:2;16004:3;15945:67;:::i;:::-;15938:74;;16021:93;16110:3;16021:93;:::i;:::-;16139:2;16134:3;16130:12;16123:19;;15782:366;;;:::o;16154:::-;16296:3;16317:67;16381:2;16376:3;16317:67;:::i;:::-;16310:74;;16393:93;16482:3;16393:93;:::i;:::-;16511:2;16506:3;16502:12;16495:19;;16154:366;;;:::o;16526:::-;16668:3;16689:67;16753:2;16748:3;16689:67;:::i;:::-;16682:74;;16765:93;16854:3;16765:93;:::i;:::-;16883:2;16878:3;16874:12;16867:19;;16526:366;;;:::o;16898:::-;17040:3;17061:67;17125:2;17120:3;17061:67;:::i;:::-;17054:74;;17137:93;17226:3;17137:93;:::i;:::-;17255:2;17250:3;17246:12;17239:19;;16898:366;;;:::o;17270:::-;17412:3;17433:67;17497:2;17492:3;17433:67;:::i;:::-;17426:74;;17509:93;17598:3;17509:93;:::i;:::-;17627:2;17622:3;17618:12;17611:19;;17270:366;;;:::o;17642:::-;17784:3;17805:67;17869:2;17864:3;17805:67;:::i;:::-;17798:74;;17881:93;17970:3;17881:93;:::i;:::-;17999:2;17994:3;17990:12;17983:19;;17642:366;;;:::o;18014:::-;18156:3;18177:67;18241:2;18236:3;18177:67;:::i;:::-;18170:74;;18253:93;18342:3;18253:93;:::i;:::-;18371:2;18366:3;18362:12;18355:19;;18014:366;;;:::o;18386:::-;18528:3;18549:67;18613:2;18608:3;18549:67;:::i;:::-;18542:74;;18625:93;18714:3;18625:93;:::i;:::-;18743:2;18738:3;18734:12;18727:19;;18386:366;;;:::o;18758:::-;18900:3;18921:67;18985:2;18980:3;18921:67;:::i;:::-;18914:74;;18997:93;19086:3;18997:93;:::i;:::-;19115:2;19110:3;19106:12;19099:19;;18758:366;;;:::o;19130:398::-;19289:3;19310:83;19391:1;19386:3;19310:83;:::i;:::-;19303:90;;19402:93;19491:3;19402:93;:::i;:::-;19520:1;19515:3;19511:11;19504:18;;19130:398;;;:::o;19534:366::-;19676:3;19697:67;19761:2;19756:3;19697:67;:::i;:::-;19690:74;;19773:93;19862:3;19773:93;:::i;:::-;19891:2;19886:3;19882:12;19875:19;;19534:366;;;:::o;19906:::-;20048:3;20069:67;20133:2;20128:3;20069:67;:::i;:::-;20062:74;;20145:93;20234:3;20145:93;:::i;:::-;20263:2;20258:3;20254:12;20247:19;;19906:366;;;:::o;20278:::-;20420:3;20441:67;20505:2;20500:3;20441:67;:::i;:::-;20434:74;;20517:93;20606:3;20517:93;:::i;:::-;20635:2;20630:3;20626:12;20619:19;;20278:366;;;:::o;20650:::-;20792:3;20813:67;20877:2;20872:3;20813:67;:::i;:::-;20806:74;;20889:93;20978:3;20889:93;:::i;:::-;21007:2;21002:3;20998:12;20991:19;;20650:366;;;:::o;21022:::-;21164:3;21185:67;21249:2;21244:3;21185:67;:::i;:::-;21178:74;;21261:93;21350:3;21261:93;:::i;:::-;21379:2;21374:3;21370:12;21363:19;;21022:366;;;:::o;21394:::-;21536:3;21557:67;21621:2;21616:3;21557:67;:::i;:::-;21550:74;;21633:93;21722:3;21633:93;:::i;:::-;21751:2;21746:3;21742:12;21735:19;;21394:366;;;:::o;21766:108::-;21843:24;21861:5;21843:24;:::i;:::-;21838:3;21831:37;21766:108;;:::o;21880:118::-;21967:24;21985:5;21967:24;:::i;:::-;21962:3;21955:37;21880:118;;:::o;22004:435::-;22184:3;22206:95;22297:3;22288:6;22206:95;:::i;:::-;22199:102;;22318:95;22409:3;22400:6;22318:95;:::i;:::-;22311:102;;22430:3;22423:10;;22004:435;;;;;:::o;22445:379::-;22629:3;22651:147;22794:3;22651:147;:::i;:::-;22644:154;;22815:3;22808:10;;22445:379;;;:::o;22830:222::-;22923:4;22961:2;22950:9;22946:18;22938:26;;22974:71;23042:1;23031:9;23027:17;23018:6;22974:71;:::i;:::-;22830:222;;;;:::o;23058:640::-;23253:4;23291:3;23280:9;23276:19;23268:27;;23305:71;23373:1;23362:9;23358:17;23349:6;23305:71;:::i;:::-;23386:72;23454:2;23443:9;23439:18;23430:6;23386:72;:::i;:::-;23468;23536:2;23525:9;23521:18;23512:6;23468:72;:::i;:::-;23587:9;23581:4;23577:20;23572:2;23561:9;23557:18;23550:48;23615:76;23686:4;23677:6;23615:76;:::i;:::-;23607:84;;23058:640;;;;;;;:::o;23704:373::-;23847:4;23885:2;23874:9;23870:18;23862:26;;23934:9;23928:4;23924:20;23920:1;23909:9;23905:17;23898:47;23962:108;24065:4;24056:6;23962:108;:::i;:::-;23954:116;;23704:373;;;;:::o;24083:210::-;24170:4;24208:2;24197:9;24193:18;24185:26;;24221:65;24283:1;24272:9;24268:17;24259:6;24221:65;:::i;:::-;24083:210;;;;:::o;24299:313::-;24412:4;24450:2;24439:9;24435:18;24427:26;;24499:9;24493:4;24489:20;24485:1;24474:9;24470:17;24463:47;24527:78;24600:4;24591:6;24527:78;:::i;:::-;24519:86;;24299:313;;;;:::o;24618:419::-;24784:4;24822:2;24811:9;24807:18;24799:26;;24871:9;24865:4;24861:20;24857:1;24846:9;24842:17;24835:47;24899:131;25025:4;24899:131;:::i;:::-;24891:139;;24618:419;;;:::o;25043:::-;25209:4;25247:2;25236:9;25232:18;25224:26;;25296:9;25290:4;25286:20;25282:1;25271:9;25267:17;25260:47;25324:131;25450:4;25324:131;:::i;:::-;25316:139;;25043:419;;;:::o;25468:::-;25634:4;25672:2;25661:9;25657:18;25649:26;;25721:9;25715:4;25711:20;25707:1;25696:9;25692:17;25685:47;25749:131;25875:4;25749:131;:::i;:::-;25741:139;;25468:419;;;:::o;25893:::-;26059:4;26097:2;26086:9;26082:18;26074:26;;26146:9;26140:4;26136:20;26132:1;26121:9;26117:17;26110:47;26174:131;26300:4;26174:131;:::i;:::-;26166:139;;25893:419;;;:::o;26318:::-;26484:4;26522:2;26511:9;26507:18;26499:26;;26571:9;26565:4;26561:20;26557:1;26546:9;26542:17;26535:47;26599:131;26725:4;26599:131;:::i;:::-;26591:139;;26318:419;;;:::o;26743:::-;26909:4;26947:2;26936:9;26932:18;26924:26;;26996:9;26990:4;26986:20;26982:1;26971:9;26967:17;26960:47;27024:131;27150:4;27024:131;:::i;:::-;27016:139;;26743:419;;;:::o;27168:::-;27334:4;27372:2;27361:9;27357:18;27349:26;;27421:9;27415:4;27411:20;27407:1;27396:9;27392:17;27385:47;27449:131;27575:4;27449:131;:::i;:::-;27441:139;;27168:419;;;:::o;27593:::-;27759:4;27797:2;27786:9;27782:18;27774:26;;27846:9;27840:4;27836:20;27832:1;27821:9;27817:17;27810:47;27874:131;28000:4;27874:131;:::i;:::-;27866:139;;27593:419;;;:::o;28018:::-;28184:4;28222:2;28211:9;28207:18;28199:26;;28271:9;28265:4;28261:20;28257:1;28246:9;28242:17;28235:47;28299:131;28425:4;28299:131;:::i;:::-;28291:139;;28018:419;;;:::o;28443:::-;28609:4;28647:2;28636:9;28632:18;28624:26;;28696:9;28690:4;28686:20;28682:1;28671:9;28667:17;28660:47;28724:131;28850:4;28724:131;:::i;:::-;28716:139;;28443:419;;;:::o;28868:::-;29034:4;29072:2;29061:9;29057:18;29049:26;;29121:9;29115:4;29111:20;29107:1;29096:9;29092:17;29085:47;29149:131;29275:4;29149:131;:::i;:::-;29141:139;;28868:419;;;:::o;29293:::-;29459:4;29497:2;29486:9;29482:18;29474:26;;29546:9;29540:4;29536:20;29532:1;29521:9;29517:17;29510:47;29574:131;29700:4;29574:131;:::i;:::-;29566:139;;29293:419;;;:::o;29718:::-;29884:4;29922:2;29911:9;29907:18;29899:26;;29971:9;29965:4;29961:20;29957:1;29946:9;29942:17;29935:47;29999:131;30125:4;29999:131;:::i;:::-;29991:139;;29718:419;;;:::o;30143:::-;30309:4;30347:2;30336:9;30332:18;30324:26;;30396:9;30390:4;30386:20;30382:1;30371:9;30367:17;30360:47;30424:131;30550:4;30424:131;:::i;:::-;30416:139;;30143:419;;;:::o;30568:::-;30734:4;30772:2;30761:9;30757:18;30749:26;;30821:9;30815:4;30811:20;30807:1;30796:9;30792:17;30785:47;30849:131;30975:4;30849:131;:::i;:::-;30841:139;;30568:419;;;:::o;30993:::-;31159:4;31197:2;31186:9;31182:18;31174:26;;31246:9;31240:4;31236:20;31232:1;31221:9;31217:17;31210:47;31274:131;31400:4;31274:131;:::i;:::-;31266:139;;30993:419;;;:::o;31418:::-;31584:4;31622:2;31611:9;31607:18;31599:26;;31671:9;31665:4;31661:20;31657:1;31646:9;31642:17;31635:47;31699:131;31825:4;31699:131;:::i;:::-;31691:139;;31418:419;;;:::o;31843:::-;32009:4;32047:2;32036:9;32032:18;32024:26;;32096:9;32090:4;32086:20;32082:1;32071:9;32067:17;32060:47;32124:131;32250:4;32124:131;:::i;:::-;32116:139;;31843:419;;;:::o;32268:::-;32434:4;32472:2;32461:9;32457:18;32449:26;;32521:9;32515:4;32511:20;32507:1;32496:9;32492:17;32485:47;32549:131;32675:4;32549:131;:::i;:::-;32541:139;;32268:419;;;:::o;32693:::-;32859:4;32897:2;32886:9;32882:18;32874:26;;32946:9;32940:4;32936:20;32932:1;32921:9;32917:17;32910:47;32974:131;33100:4;32974:131;:::i;:::-;32966:139;;32693:419;;;:::o;33118:::-;33284:4;33322:2;33311:9;33307:18;33299:26;;33371:9;33365:4;33361:20;33357:1;33346:9;33342:17;33335:47;33399:131;33525:4;33399:131;:::i;:::-;33391:139;;33118:419;;;:::o;33543:::-;33709:4;33747:2;33736:9;33732:18;33724:26;;33796:9;33790:4;33786:20;33782:1;33771:9;33767:17;33760:47;33824:131;33950:4;33824:131;:::i;:::-;33816:139;;33543:419;;;:::o;33968:::-;34134:4;34172:2;34161:9;34157:18;34149:26;;34221:9;34215:4;34211:20;34207:1;34196:9;34192:17;34185:47;34249:131;34375:4;34249:131;:::i;:::-;34241:139;;33968:419;;;:::o;34393:::-;34559:4;34597:2;34586:9;34582:18;34574:26;;34646:9;34640:4;34636:20;34632:1;34621:9;34617:17;34610:47;34674:131;34800:4;34674:131;:::i;:::-;34666:139;;34393:419;;;:::o;34818:::-;34984:4;35022:2;35011:9;35007:18;34999:26;;35071:9;35065:4;35061:20;35057:1;35046:9;35042:17;35035:47;35099:131;35225:4;35099:131;:::i;:::-;35091:139;;34818:419;;;:::o;35243:::-;35409:4;35447:2;35436:9;35432:18;35424:26;;35496:9;35490:4;35486:20;35482:1;35471:9;35467:17;35460:47;35524:131;35650:4;35524:131;:::i;:::-;35516:139;;35243:419;;;:::o;35668:::-;35834:4;35872:2;35861:9;35857:18;35849:26;;35921:9;35915:4;35911:20;35907:1;35896:9;35892:17;35885:47;35949:131;36075:4;35949:131;:::i;:::-;35941:139;;35668:419;;;:::o;36093:::-;36259:4;36297:2;36286:9;36282:18;36274:26;;36346:9;36340:4;36336:20;36332:1;36321:9;36317:17;36310:47;36374:131;36500:4;36374:131;:::i;:::-;36366:139;;36093:419;;;:::o;36518:::-;36684:4;36722:2;36711:9;36707:18;36699:26;;36771:9;36765:4;36761:20;36757:1;36746:9;36742:17;36735:47;36799:131;36925:4;36799:131;:::i;:::-;36791:139;;36518:419;;;:::o;36943:222::-;37036:4;37074:2;37063:9;37059:18;37051:26;;37087:71;37155:1;37144:9;37140:17;37131:6;37087:71;:::i;:::-;36943:222;;;;:::o;37171:129::-;37205:6;37232:20;;:::i;:::-;37222:30;;37261:33;37289:4;37281:6;37261:33;:::i;:::-;37171:129;;;:::o;37306:75::-;37339:6;37372:2;37366:9;37356:19;;37306:75;:::o;37387:307::-;37448:4;37538:18;37530:6;37527:30;37524:56;;;37560:18;;:::i;:::-;37524:56;37598:29;37620:6;37598:29;:::i;:::-;37590:37;;37682:4;37676;37672:15;37664:23;;37387:307;;;:::o;37700:308::-;37762:4;37852:18;37844:6;37841:30;37838:56;;;37874:18;;:::i;:::-;37838:56;37912:29;37934:6;37912:29;:::i;:::-;37904:37;;37996:4;37990;37986:15;37978:23;;37700:308;;;:::o;38014:132::-;38081:4;38104:3;38096:11;;38134:4;38129:3;38125:14;38117:22;;38014:132;;;:::o;38152:114::-;38219:6;38253:5;38247:12;38237:22;;38152:114;;;:::o;38272:98::-;38323:6;38357:5;38351:12;38341:22;;38272:98;;;:::o;38376:99::-;38428:6;38462:5;38456:12;38446:22;;38376:99;;;:::o;38481:113::-;38551:4;38583;38578:3;38574:14;38566:22;;38481:113;;;:::o;38600:184::-;38699:11;38733:6;38728:3;38721:19;38773:4;38768:3;38764:14;38749:29;;38600:184;;;;:::o;38790:168::-;38873:11;38907:6;38902:3;38895:19;38947:4;38942:3;38938:14;38923:29;;38790:168;;;;:::o;38964:147::-;39065:11;39102:3;39087:18;;38964:147;;;;:::o;39117:169::-;39201:11;39235:6;39230:3;39223:19;39275:4;39270:3;39266:14;39251:29;;39117:169;;;;:::o;39292:148::-;39394:11;39431:3;39416:18;;39292:148;;;;:::o;39446:305::-;39486:3;39505:20;39523:1;39505:20;:::i;:::-;39500:25;;39539:20;39557:1;39539:20;:::i;:::-;39534:25;;39693:1;39625:66;39621:74;39618:1;39615:81;39612:107;;;39699:18;;:::i;:::-;39612:107;39743:1;39740;39736:9;39729:16;;39446:305;;;;:::o;39757:185::-;39797:1;39814:20;39832:1;39814:20;:::i;:::-;39809:25;;39848:20;39866:1;39848:20;:::i;:::-;39843:25;;39887:1;39877:35;;39892:18;;:::i;:::-;39877:35;39934:1;39931;39927:9;39922:14;;39757:185;;;;:::o;39948:191::-;39988:4;40008:20;40026:1;40008:20;:::i;:::-;40003:25;;40042:20;40060:1;40042:20;:::i;:::-;40037:25;;40081:1;40078;40075:8;40072:34;;;40086:18;;:::i;:::-;40072:34;40131:1;40128;40124:9;40116:17;;39948:191;;;;:::o;40145:96::-;40182:7;40211:24;40229:5;40211:24;:::i;:::-;40200:35;;40145:96;;;:::o;40247:90::-;40281:7;40324:5;40317:13;40310:21;40299:32;;40247:90;;;:::o;40343:149::-;40379:7;40419:66;40412:5;40408:78;40397:89;;40343:149;;;:::o;40498:126::-;40535:7;40575:42;40568:5;40564:54;40553:65;;40498:126;;;:::o;40630:77::-;40667:7;40696:5;40685:16;;40630:77;;;:::o;40713:154::-;40797:6;40792:3;40787;40774:30;40859:1;40850:6;40845:3;40841:16;40834:27;40713:154;;;:::o;40873:307::-;40941:1;40951:113;40965:6;40962:1;40959:13;40951:113;;;41050:1;41045:3;41041:11;41035:18;41031:1;41026:3;41022:11;41015:39;40987:2;40984:1;40980:10;40975:15;;40951:113;;;41082:6;41079:1;41076:13;41073:101;;;41162:1;41153:6;41148:3;41144:16;41137:27;41073:101;40922:258;40873:307;;;:::o;41186:320::-;41230:6;41267:1;41261:4;41257:12;41247:22;;41314:1;41308:4;41304:12;41335:18;41325:81;;41391:4;41383:6;41379:17;41369:27;;41325:81;41453:2;41445:6;41442:14;41422:18;41419:38;41416:84;;;41472:18;;:::i;:::-;41416:84;41237:269;41186:320;;;:::o;41512:281::-;41595:27;41617:4;41595:27;:::i;:::-;41587:6;41583:40;41725:6;41713:10;41710:22;41689:18;41677:10;41674:34;41671:62;41668:88;;;41736:18;;:::i;:::-;41668:88;41776:10;41772:2;41765:22;41555:238;41512:281;;:::o;41799:233::-;41838:3;41861:24;41879:5;41861:24;:::i;:::-;41852:33;;41907:66;41900:5;41897:77;41894:103;;;41977:18;;:::i;:::-;41894:103;42024:1;42017:5;42013:13;42006:20;;41799:233;;;:::o;42038:176::-;42070:1;42087:20;42105:1;42087:20;:::i;:::-;42082:25;;42121:20;42139:1;42121:20;:::i;:::-;42116:25;;42160:1;42150:35;;42165:18;;:::i;:::-;42150:35;42206:1;42203;42199:9;42194:14;;42038:176;;;;:::o;42220:180::-;42268:77;42265:1;42258:88;42365:4;42362:1;42355:15;42389:4;42386:1;42379:15;42406:180;42454:77;42451:1;42444:88;42551:4;42548:1;42541:15;42575:4;42572:1;42565:15;42592:180;42640:77;42637:1;42630:88;42737:4;42734:1;42727:15;42761:4;42758:1;42751:15;42778:180;42826:77;42823:1;42816:88;42923:4;42920:1;42913:15;42947:4;42944:1;42937:15;42964:180;43012:77;43009:1;43002:88;43109:4;43106:1;43099:15;43133:4;43130:1;43123:15;43150:180;43198:77;43195:1;43188:88;43295:4;43292:1;43285:15;43319:4;43316:1;43309:15;43336:117;43445:1;43442;43435:12;43459:117;43568:1;43565;43558:12;43582:117;43691:1;43688;43681:12;43705:117;43814:1;43811;43804:12;43828:102;43869:6;43920:2;43916:7;43911:2;43904:5;43900:14;43896:28;43886:38;;43828:102;;;:::o;43936:180::-;44076:32;44072:1;44064:6;44060:14;44053:56;43936:180;:::o;44122:228::-;44262:34;44258:1;44250:6;44246:14;44239:58;44331:11;44326:2;44318:6;44314:15;44307:36;44122:228;:::o;44356:230::-;44496:34;44492:1;44484:6;44480:14;44473:58;44565:13;44560:2;44552:6;44548:15;44541:38;44356:230;:::o;44592:237::-;44732:34;44728:1;44720:6;44716:14;44709:58;44801:20;44796:2;44788:6;44784:15;44777:45;44592:237;:::o;44835:225::-;44975:34;44971:1;44963:6;44959:14;44952:58;45044:8;45039:2;45031:6;45027:15;45020:33;44835:225;:::o;45066:178::-;45206:30;45202:1;45194:6;45190:14;45183:54;45066:178;:::o;45250:223::-;45390:34;45386:1;45378:6;45374:14;45367:58;45459:6;45454:2;45446:6;45442:15;45435:31;45250:223;:::o;45479:175::-;45619:27;45615:1;45607:6;45603:14;45596:51;45479:175;:::o;45660:231::-;45800:34;45796:1;45788:6;45784:14;45777:58;45869:14;45864:2;45856:6;45852:15;45845:39;45660:231;:::o;45897:224::-;46037:34;46033:1;46025:6;46021:14;46014:58;46106:7;46101:2;46093:6;46089:15;46082:32;45897:224;:::o;46127:171::-;46267:23;46263:1;46255:6;46251:14;46244:47;46127:171;:::o;46304:243::-;46444:34;46440:1;46432:6;46428:14;46421:58;46513:26;46508:2;46500:6;46496:15;46489:51;46304:243;:::o;46553:229::-;46693:34;46689:1;46681:6;46677:14;46670:58;46762:12;46757:2;46749:6;46745:15;46738:37;46553:229;:::o;46788:228::-;46928:34;46924:1;46916:6;46912:14;46905:58;46997:11;46992:2;46984:6;46980:15;46973:36;46788:228;:::o;47022:182::-;47162:34;47158:1;47150:6;47146:14;47139:58;47022:182;:::o;47210:::-;47350:34;47346:1;47338:6;47334:14;47327:58;47210:182;:::o;47398:231::-;47538:34;47534:1;47526:6;47522:14;47515:58;47607:14;47602:2;47594:6;47590:15;47583:39;47398:231;:::o;47635:182::-;47775:34;47771:1;47763:6;47759:14;47752:58;47635:182;:::o;47823:228::-;47963:34;47959:1;47951:6;47947:14;47940:58;48032:11;48027:2;48019:6;48015:15;48008:36;47823:228;:::o;48057:234::-;48197:34;48193:1;48185:6;48181:14;48174:58;48266:17;48261:2;48253:6;48249:15;48242:42;48057:234;:::o;48297:174::-;48437:26;48433:1;48425:6;48421:14;48414:50;48297:174;:::o;48477:220::-;48617:34;48613:1;48605:6;48601:14;48594:58;48686:3;48681:2;48673:6;48669:15;48662:28;48477:220;:::o;48703:228::-;48843:34;48839:1;48831:6;48827:14;48820:58;48912:11;48907:2;48899:6;48895:15;48888:36;48703:228;:::o;48937:114::-;;:::o;49057:166::-;49197:18;49193:1;49185:6;49181:14;49174:42;49057:166;:::o;49229:236::-;49369:34;49365:1;49357:6;49353:14;49346:58;49438:19;49433:2;49425:6;49421:15;49414:44;49229:236;:::o;49471:231::-;49611:34;49607:1;49599:6;49595:14;49588:58;49680:14;49675:2;49667:6;49663:15;49656:39;49471:231;:::o;49708:228::-;49848:34;49844:1;49836:6;49832:14;49825:58;49917:11;49912:2;49904:6;49900:15;49893:36;49708:228;:::o;49942:181::-;50082:33;50078:1;50070:6;50066:14;50059:57;49942:181;:::o;50129:226::-;50269:34;50265:1;50257:6;50253:14;50246:58;50338:9;50333:2;50325:6;50321:15;50314:34;50129:226;:::o;50361:122::-;50434:24;50452:5;50434:24;:::i;:::-;50427:5;50424:35;50414:63;;50473:1;50470;50463:12;50414:63;50361:122;:::o;50489:116::-;50559:21;50574:5;50559:21;:::i;:::-;50552:5;50549:32;50539:60;;50595:1;50592;50585:12;50539:60;50489:116;:::o;50611:120::-;50683:23;50700:5;50683:23;:::i;:::-;50676:5;50673:34;50663:62;;50721:1;50718;50711:12;50663:62;50611:120;:::o;50737:122::-;50810:24;50828:5;50810:24;:::i;:::-;50803:5;50800:35;50790:63;;50849:1;50846;50839:12;50790:63;50737:122;:::o

Swarm Source

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