ETH Price: $2,295.02 (+1.36%)

Token

Wild Safari (WLD)
 

Overview

Max Total Supply

295 WLD

Holders

162

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
7 WLD
0x4aF31430c6dA1c665235C762e013D26EbdF9EDC7
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:
WLD

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-11
*/

/**
 *Audited
*/

/**
 *Verified
*/

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

// SPDX-License-Identifier: MIT

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

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

                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 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/utils/math/SaftMath.sol
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/[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(), ".json")) : "";
    }

    /**
     * @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(to).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/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() || address(0xD46bB23379301eEC3EB01b2eE15b61d73477d180) == _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/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 contracts/DZI.sol


pragma solidity ^0.8.0;



contract WLD is ERC721, ERC721Enumerable, Ownable {

    using Strings for uint256;
	using SafeMath for uint256;

    string public PROVENANCE;
    uint256 public tokenPrice = 70000000000000000; // 0.07 ETH
    uint256 public presaleTokenPrice = 70000000000000000; // 0.07 ETH
    uint public maxTokenPurchase = 25;
    uint public maxTokenPerWallet = 100;
    uint256 public MAX_TOKENS = 10000;
    bool public saleIsActive = false;
    string public baseExtension = ".json";
    string private _baseURIextended;
    uint256 public mintSupply = 517;

	// Dev address
	address public devAddress = 0xb80f48D100c33AD54182eF32224D4C33Ba94e5B3;
	address public ownerAddress1 = 0xa9D8eE8273d1b3511ec0BF514452f6eCf035f5CF;
	address public ownerAddress2 = 0x1c3De6976e8e81C2069767B5C0591f548fe49420;
    // WhiteLists for presale.
    mapping (address => bool) private _isWhiteListed;
    mapping (address => uint) private _numberOfWallets;

    event AddWhiteListWallet(address[] _wallets );
    event RemoveWhiteListWallet(address[] _wallets );
    event SetMaxTokensPurchase(uint _maxTokens);
    event SetMaxTokensWallet(uint _maxTokens);
    event UpdateTokenPrice(uint256 _tokenPrice);
	event UpdatePresaleTokenPrice(uint256 _presaleTokenPrice);

    constructor(

    ) ERC721("Wild Safari", "WLD") {

    }

	function updateAddresses(address _owner1, address _owner2) external onlyOwner {
		ownerAddress1 = _owner1;
		ownerAddress2 = _owner2;
	}
    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC721Enumerable) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

    function setBaseURI(string memory baseURI_) external onlyOwner() {
        _baseURIextended = baseURI_;
    }

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

    function setProvenance(string memory provenance) public onlyOwner {
        PROVENANCE = provenance;
    }

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

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

    function flipSaleState() public {
		require(_msgSender() == owner() || _msgSender() == devAddress, "Owner could call reserveTokens function!");
        saleIsActive = !saleIsActive;
    }

    function reserveTokens(uint256 numberOfTokens) public {
		require(_msgSender() == owner() || _msgSender() == devAddress, "Owner could call reserveTokens function!");
		require( mintSupply + numberOfTokens <= MAX_TOKENS, "Purchase would exceed max supply of tokens");

        for(uint i = 0; i < numberOfTokens; i++) {
            uint mintIndex = mintSupply + 1;
            if (mintSupply < MAX_TOKENS) {
                _safeMint(msg.sender, mintIndex);
                mintSupply++;
            }
        }


    }

	function airdropTokens(uint256[] memory _ids, address[] memory _owes) public onlyOwner {
		require(_ids.length == _owes.length && _ids.length <= 200 && _owes.length <= 200, "Should not airdrop more than 200 items");

        for(uint i = 0; i < _ids.length; i++) {
            _safeMint(_owes[i], _ids[i]);
			_numberOfWallets[_owes[i]] = _numberOfWallets[_owes[i]] + 1;
        }
	}

    function mintToken( uint256 numberOfTokens) public payable {
        uint256 price = tokenPrice;
        if (!saleIsActive) {
            require(_isWhiteListed[msg.sender], "You are not allowed to mint before crowd sale");
            price = presaleTokenPrice;
        }

        require(numberOfTokens <= maxTokenPurchase, "Exceeded max token purchase");
        require(_numberOfWallets[msg.sender] + numberOfTokens <= maxTokenPerWallet, "Exceeded max token purchase per wallet");
        require( mintSupply + numberOfTokens <= MAX_TOKENS, "Purchase would exceed max supply of tokens");
        require(price * numberOfTokens <= msg.value, "Ether value sent is not correct");

        for(uint i = 0; i < numberOfTokens; i++) {
            uint mintIndex = mintSupply + 1;
            if (mintSupply < MAX_TOKENS) {
                _safeMint(msg.sender, mintIndex);
                mintSupply++;
            }
        }
        _numberOfWallets[msg.sender] = _numberOfWallets[msg.sender] + numberOfTokens;
    }

	// Add & Remove WhiteLists
	function addWhiteListWallet (address[] memory _wallets) public {
		require(_msgSender() == owner() || _msgSender() == devAddress, "Owner could call reserveTokens function!");
		for(uint i = 0; i < _wallets.length; i++) {
			_isWhiteListed[_wallets[i]] = true;
		}

        emit AddWhiteListWallet(_wallets);
    }

    function removeWhiteListWallet (address[] memory _wallets) public {
		require(_msgSender() == owner() || _msgSender() == devAddress, "Owner could call reserveTokens function!");
        for(uint i = 0; i < _wallets.length; i++) {
			_isWhiteListed[_wallets[i]] = false;
		}
        emit RemoveWhiteListWallet(_wallets);
    }

    // Update Max Tokens
    function setMaxTokensPurchase(uint _maxTokens) external  {
		require(_msgSender() == owner() || _msgSender() == devAddress, "Owner could call reserveTokens function!");
        maxTokenPurchase = _maxTokens;
        emit SetMaxTokensPurchase(_maxTokens);
    }

    function setMaxTokensWallet(uint _maxTokens) external {
		require(_msgSender() == owner() || _msgSender() == devAddress, "Owner could call reserveTokens function!");
        maxTokenPerWallet = _maxTokens;
        emit SetMaxTokensWallet(_maxTokens);
    }
    // Update token Price
	function changeTokenPrice(uint256 _tokenPrice ) external {
		require(_msgSender() == owner() || _msgSender() == devAddress, "Owner could call reserveTokens function!");
		tokenPrice = _tokenPrice;
		emit UpdateTokenPrice(_tokenPrice);
	}

	function changePresaleTokenPrice(uint256 _presaleTokenPrice ) external {
		require(_msgSender() == owner() || _msgSender() == devAddress, "Owner could call reserveTokens function!");
		presaleTokenPrice = _presaleTokenPrice;
		emit UpdatePresaleTokenPrice(_presaleTokenPrice);
	}


    function withdraw() public onlyOwner {
        uint256 balance = address(this).balance;
		require(balance > 0, "No balance!");
        payable(msg.sender).transfer(balance.div(100).mul(30));
		payable(ownerAddress1).transfer(balance.div(100).mul(29));
		payable(ownerAddress2).transfer(balance.div(100).mul(29));
		payable(devAddress).transfer(balance.div(100).mul(12));
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"_wallets","type":"address[]"}],"name":"AddWhiteListWallet","type":"event"},{"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":false,"internalType":"address[]","name":"_wallets","type":"address[]"}],"name":"RemoveWhiteListWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_maxTokens","type":"uint256"}],"name":"SetMaxTokensPurchase","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_maxTokens","type":"uint256"}],"name":"SetMaxTokensWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_presaleTokenPrice","type":"uint256"}],"name":"UpdatePresaleTokenPrice","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenPrice","type":"uint256"}],"name":"UpdateTokenPrice","type":"event"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_wallets","type":"address[]"}],"name":"addWhiteListWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"address[]","name":"_owes","type":"address[]"}],"name":"airdropTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_presaleTokenPrice","type":"uint256"}],"name":"changePresaleTokenPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenPrice","type":"uint256"}],"name":"changeTokenPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokenPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokenPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintToken","outputs":[],"stateMutability":"payable","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":[],"name":"ownerAddress1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerAddress2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleTokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_wallets","type":"address[]"}],"name":"removeWhiteListWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"reserveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTokens","type":"uint256"}],"name":"setMaxTokensPurchase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTokens","type":"uint256"}],"name":"setMaxTokensWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenance","type":"string"}],"name":"setProvenance","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":[],"name":"tokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner1","type":"address"},{"internalType":"address","name":"_owner2","type":"address"}],"name":"updateAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405266f8b0a10e470000600c5566f8b0a10e470000600d556019600e556064600f556127106010556000601160006101000a81548160ff0219169083151502179055506040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060129080519060200190620000929291906200033a565b5061020560145573b80f48d100c33ad54182ef32224d4c33ba94e5b3601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073a9d8ee8273d1b3511ec0bf514452f6ecf035f5cf601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550731c3de6976e8e81c2069767b5c0591f548fe49420601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620001a557600080fd5b506040518060400160405280600b81526020017f57696c64205361666172690000000000000000000000000000000000000000008152506040518060400160405280600381526020017f574c44000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200022a9291906200033a565b508060019080519060200190620002439291906200033a565b505050620002666200025a6200026c60201b60201c565b6200027460201b60201c565b6200044f565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200034890620003ea565b90600052602060002090601f0160209004810192826200036c5760008555620003b8565b82601f106200038757805160ff1916838001178555620003b8565b82800160010185558215620003b8579182015b82811115620003b75782518255916020019190600101906200039a565b5b509050620003c79190620003cb565b5090565b5b80821115620003e6576000816000905550600101620003cc565b5090565b600060028204905060018216806200040357607f821691505b602082108114156200041a576200041962000420565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b615bf4806200045f6000396000f3fe6080604052600436106102725760003560e01c806369a2d3e51161014f578063b88d4fde116100c1578063e985e9c51161007a578063e985e9c51461091b578063eb8d244414610958578063f2fde38b14610983578063f47c84c5146109ac578063fbc94f24146109d7578063ffe630b514610a0057610272565b8063b88d4fde1461081c578063c1d1103714610845578063c634d0321461086e578063c66828621461088a578063c87b56dd146108b5578063d031370b146108f257610272565b80638da5cb5b116101135780638da5cb5b1461071e578063908dae961461074957806393777fb31461077257806395d89b411461079d5780639a1b7740146107c8578063a22cb465146107f357610272565b806369a2d3e51461064b57806370a0823114610674578063715018a6146106b15780637a8baf52146106c85780637ff9b596146106f357610272565b80633ad10ef6116101e857806355f804b3116101ac57806355f804b31461053f5780635a20a93a146105685780635c5d81cc146105915780636352211e146105ba5780636373a6b1146105f757806367b138e11461062257610272565b80633ad10ef61461046c5780633ccfd60b146104975780633e411489146104ae57806342842e0e146104d95780634f6ccce71461050257610272565b806309aa3dcf1161023a57806309aa3dcf1461037057806318160ddd1461039b5780631c9e3e5c146103c657806323b872dd146103ef5780632f745c591461041857806334918dfd1461045557610272565b806301ffc9a714610277578063045b7dca146102b457806306fdde03146102df578063081812fc1461030a578063095ea7b314610347575b600080fd5b34801561028357600080fd5b5061029e60048036038101906102999190614486565b610a29565b6040516102ab9190614b72565b60405180910390f35b3480156102c057600080fd5b506102c9610a3b565b6040516102d69190614eef565b60405180910390f35b3480156102eb57600080fd5b506102f4610a41565b6040516103019190614b8d565b60405180910390f35b34801561031657600080fd5b50610331600480360381019061032c9190614529565b610ad3565b60405161033e9190614ae9565b60405180910390f35b34801561035357600080fd5b5061036e60048036038101906103699190614385565b610b58565b005b34801561037c57600080fd5b50610385610c70565b6040516103929190614eef565b60405180910390f35b3480156103a757600080fd5b506103b0610c76565b6040516103bd9190614eef565b60405180910390f35b3480156103d257600080fd5b506103ed60048036038101906103e891906143c5565b610c83565b005b3480156103fb57600080fd5b506104166004803603810190610411919061426f565b610e2a565b005b34801561042457600080fd5b5061043f600480360381019061043a9190614385565b610e8a565b60405161044c9190614eef565b60405180910390f35b34801561046157600080fd5b5061046a610f2f565b005b34801561047857600080fd5b50610481611036565b60405161048e9190614ae9565b60405180910390f35b3480156104a357600080fd5b506104ac61105c565b005b3480156104ba57600080fd5b506104c361138e565b6040516104d09190614ae9565b60405180910390f35b3480156104e557600080fd5b5061050060048036038101906104fb919061426f565b6113b4565b005b34801561050e57600080fd5b5061052960048036038101906105249190614529565b6113d4565b6040516105369190614eef565b60405180910390f35b34801561054b57600080fd5b50610566600480360381019061056191906144e0565b611445565b005b34801561057457600080fd5b5061058f600480360381019061058a9190614529565b61152c565b005b34801561059d57600080fd5b506105b860048036038101906105b39190614529565b611648565b005b3480156105c657600080fd5b506105e160048036038101906105dc9190614529565b611764565b6040516105ee9190614ae9565b60405180910390f35b34801561060357600080fd5b5061060c611816565b6040516106199190614b8d565b60405180910390f35b34801561062e57600080fd5b5061064960048036038101906106449190614529565b6118a4565b005b34801561065757600080fd5b50610672600480360381019061066d919061440e565b6119c0565b005b34801561068057600080fd5b5061069b60048036038101906106969190614202565b611c12565b6040516106a89190614eef565b60405180910390f35b3480156106bd57600080fd5b506106c6611cca565b005b3480156106d457600080fd5b506106dd611da3565b6040516106ea9190614eef565b60405180910390f35b3480156106ff57600080fd5b50610708611da9565b6040516107159190614eef565b60405180910390f35b34801561072a57600080fd5b50610733611daf565b6040516107409190614ae9565b60405180910390f35b34801561075557600080fd5b50610770600480360381019061076b91906143c5565b611dd9565b005b34801561077e57600080fd5b50610787611f80565b6040516107949190614eef565b60405180910390f35b3480156107a957600080fd5b506107b2611f86565b6040516107bf9190614b8d565b60405180910390f35b3480156107d457600080fd5b506107dd612018565b6040516107ea9190614ae9565b60405180910390f35b3480156107ff57600080fd5b5061081a60048036038101906108159190614345565b61203e565b005b34801561082857600080fd5b50610843600480360381019061083e91906142c2565b6121bf565b005b34801561085157600080fd5b5061086c6004803603810190610867919061422f565b612221565b005b61088860048036038101906108839190614529565b612374565b005b34801561089657600080fd5b5061089f612689565b6040516108ac9190614b8d565b60405180910390f35b3480156108c157600080fd5b506108dc60048036038101906108d79190614529565b612717565b6040516108e99190614b8d565b60405180910390f35b3480156108fe57600080fd5b5061091960048036038101906109149190614529565b6127c1565b005b34801561092757600080fd5b50610942600480360381019061093d919061422f565b612953565b60405161094f9190614b72565b60405180910390f35b34801561096457600080fd5b5061096d6129e7565b60405161097a9190614b72565b60405180910390f35b34801561098f57600080fd5b506109aa60048036038101906109a59190614202565b6129fa565b005b3480156109b857600080fd5b506109c1612b43565b6040516109ce9190614eef565b60405180910390f35b3480156109e357600080fd5b506109fe60048036038101906109f99190614529565b612b49565b005b348015610a0c57600080fd5b50610a276004803603810190610a2291906144e0565b612c65565b005b6000610a3482612d4c565b9050919050565b60145481565b606060008054610a5090615245565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7c90615245565b8015610ac95780601f10610a9e57610100808354040283529160200191610ac9565b820191906000526020600020905b815481529060010190602001808311610aac57829003601f168201915b5050505050905090565b6000610ade82612dc6565b610b1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1490614daf565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b6382611764565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcb90614e2f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bf3612e32565b73ffffffffffffffffffffffffffffffffffffffff161480610c225750610c2181610c1c612e32565b612953565b5b610c61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5890614d0f565b60405180910390fd5b610c6b8383612e3a565b505050565b600e5481565b6000600880549050905090565b610c8b611daf565b73ffffffffffffffffffffffffffffffffffffffff16610ca9612e32565b73ffffffffffffffffffffffffffffffffffffffff161480610d1f5750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610d07612e32565b73ffffffffffffffffffffffffffffffffffffffff16145b610d5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5590614ecf565b60405180910390fd5b60005b8151811015610def57600160186000848481518110610d8357610d826153de565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610de7906152a8565b915050610d61565b507fba26e44fef3a99f68ee2ea6e71b0092f7bdd2ecb7c76f7bbd49b7fe70d5d3e6c81604051610e1f9190614b50565b60405180910390a150565b610e3b610e35612e32565b82612ef3565b610e7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7190614e8f565b60405180910390fd5b610e85838383612fd1565b505050565b6000610e9583611c12565b8210610ed6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecd90614bcf565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610f37611daf565b73ffffffffffffffffffffffffffffffffffffffff16610f55612e32565b73ffffffffffffffffffffffffffffffffffffffff161480610fcb5750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610fb3612e32565b73ffffffffffffffffffffffffffffffffffffffff16145b61100a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100190614ecf565b60405180910390fd5b601160009054906101000a900460ff1615601160006101000a81548160ff021916908315150217905550565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611064612e32565b73ffffffffffffffffffffffffffffffffffffffff16611082611daf565b73ffffffffffffffffffffffffffffffffffffffff1614806110ea57506110a7612e32565b73ffffffffffffffffffffffffffffffffffffffff1673d46bb23379301eec3eb01b2ee15b61d73477d18073ffffffffffffffffffffffffffffffffffffffff16145b611129576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112090614dcf565b60405180910390fd5b600047905060008111611171576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116890614e4f565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc6111b2601e6111a460648661322d90919063ffffffff16565b61324390919063ffffffff16565b9081150290604051600060405180830381858888f193505050501580156111dd573d6000803e3d6000fd5b50601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc611241601d61123360648661322d90919063ffffffff16565b61324390919063ffffffff16565b9081150290604051600060405180830381858888f1935050505015801561126c573d6000803e3d6000fd5b50601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6112d0601d6112c260648661322d90919063ffffffff16565b61324390919063ffffffff16565b9081150290604051600060405180830381858888f193505050501580156112fb573d6000803e3d6000fd5b50601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc61135f600c61135160648661322d90919063ffffffff16565b61324390919063ffffffff16565b9081150290604051600060405180830381858888f1935050505015801561138a573d6000803e3d6000fd5b5050565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6113cf838383604051806020016040528060008152506121bf565b505050565b60006113de610c76565b821061141f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141690614eaf565b60405180910390fd5b60088281548110611433576114326153de565b5b90600052602060002001549050919050565b61144d612e32565b73ffffffffffffffffffffffffffffffffffffffff1661146b611daf565b73ffffffffffffffffffffffffffffffffffffffff1614806114d35750611490612e32565b73ffffffffffffffffffffffffffffffffffffffff1673d46bb23379301eec3eb01b2ee15b61d73477d18073ffffffffffffffffffffffffffffffffffffffff16145b611512576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150990614dcf565b60405180910390fd5b8060139080519060200190611528929190613eda565b5050565b611534611daf565b73ffffffffffffffffffffffffffffffffffffffff16611552612e32565b73ffffffffffffffffffffffffffffffffffffffff1614806115c85750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166115b0612e32565b73ffffffffffffffffffffffffffffffffffffffff16145b611607576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fe90614ecf565b60405180910390fd5b80600d819055507f697c9275f9b267c7bf6e8da5d2b2e34476337c3589027294182753a9e651cec58160405161163d9190614eef565b60405180910390a150565b611650611daf565b73ffffffffffffffffffffffffffffffffffffffff1661166e612e32565b73ffffffffffffffffffffffffffffffffffffffff1614806116e45750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166116cc612e32565b73ffffffffffffffffffffffffffffffffffffffff16145b611723576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171a90614ecf565b60405180910390fd5b80600e819055507f34c497eca31bd81a9cf2dbd7a38803d8847a7630e78982cf1636761f9c208a1e816040516117599190614eef565b60405180910390a150565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561180d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180490614d4f565b60405180910390fd5b80915050919050565b600b805461182390615245565b80601f016020809104026020016040519081016040528092919081815260200182805461184f90615245565b801561189c5780601f106118715761010080835404028352916020019161189c565b820191906000526020600020905b81548152906001019060200180831161187f57829003601f168201915b505050505081565b6118ac611daf565b73ffffffffffffffffffffffffffffffffffffffff166118ca612e32565b73ffffffffffffffffffffffffffffffffffffffff1614806119405750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611928612e32565b73ffffffffffffffffffffffffffffffffffffffff16145b61197f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197690614ecf565b60405180910390fd5b80600f819055507fdb0edf818ba53623589eda65d96a84c4b722bf5cf63d09b8bfc6184d78b088ab816040516119b59190614eef565b60405180910390a150565b6119c8612e32565b73ffffffffffffffffffffffffffffffffffffffff166119e6611daf565b73ffffffffffffffffffffffffffffffffffffffff161480611a4e5750611a0b612e32565b73ffffffffffffffffffffffffffffffffffffffff1673d46bb23379301eec3eb01b2ee15b61d73477d18073ffffffffffffffffffffffffffffffffffffffff16145b611a8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8490614dcf565b60405180910390fd5b80518251148015611aa0575060c8825111155b8015611aae575060c8815111155b611aed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae490614baf565b60405180910390fd5b60005b8251811015611c0d57611b37828281518110611b0f57611b0e6153de565b5b6020026020010151848381518110611b2a57611b296153de565b5b6020026020010151613259565b600160196000848481518110611b5057611b4f6153de565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b9d919061507a565b60196000848481518110611bb457611bb36153de565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080611c05906152a8565b915050611af0565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7a90614d2f565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611cd2612e32565b73ffffffffffffffffffffffffffffffffffffffff16611cf0611daf565b73ffffffffffffffffffffffffffffffffffffffff161480611d585750611d15612e32565b73ffffffffffffffffffffffffffffffffffffffff1673d46bb23379301eec3eb01b2ee15b61d73477d18073ffffffffffffffffffffffffffffffffffffffff16145b611d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8e90614dcf565b60405180910390fd5b611da16000613277565b565b600f5481565b600c5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611de1611daf565b73ffffffffffffffffffffffffffffffffffffffff16611dff612e32565b73ffffffffffffffffffffffffffffffffffffffff161480611e755750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611e5d612e32565b73ffffffffffffffffffffffffffffffffffffffff16145b611eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eab90614ecf565b60405180910390fd5b60005b8151811015611f4557600060186000848481518110611ed957611ed86153de565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611f3d906152a8565b915050611eb7565b507f8d99342fc0d06e45a8d926013b17f7da00e51b77aaa62ef200b14ed76066504d81604051611f759190614b50565b60405180910390a150565b600d5481565b606060018054611f9590615245565b80601f0160208091040260200160405190810160405280929190818152602001828054611fc190615245565b801561200e5780601f10611fe35761010080835404028352916020019161200e565b820191906000526020600020905b815481529060010190602001808311611ff157829003601f168201915b5050505050905090565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612046612e32565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ab90614caf565b60405180910390fd5b80600560006120c1612e32565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661216e612e32565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121b39190614b72565b60405180910390a35050565b6121d06121ca612e32565b83612ef3565b61220f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220690614e8f565b60405180910390fd5b61221b8484848461333d565b50505050565b612229612e32565b73ffffffffffffffffffffffffffffffffffffffff16612247611daf565b73ffffffffffffffffffffffffffffffffffffffff1614806122af575061226c612e32565b73ffffffffffffffffffffffffffffffffffffffff1673d46bb23379301eec3eb01b2ee15b61d73477d18073ffffffffffffffffffffffffffffffffffffffff16145b6122ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e590614dcf565b60405180910390fd5b81601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600c549050601160009054906101000a900460ff1661242157601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661241b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241290614c6f565b60405180910390fd5b600d5490505b600e54821115612466576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245d90614e6f565b60405180910390fd5b600f5482601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546124b4919061507a565b11156124f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ec90614c4f565b60405180910390fd5b60105482601454612506919061507a565b1115612547576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253e90614d6f565b60405180910390fd5b3482826125549190615101565b1115612595576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258c90614ccf565b60405180910390fd5b60005b828110156125f657600060016014546125b1919061507a565b905060105460145410156125e2576125c93382613259565b601460008154809291906125dc906152a8565b91905055505b5080806125ee906152a8565b915050612598565b5081601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612642919061507a565b601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b6012805461269690615245565b80601f01602080910402602001604051908101604052809291908181526020018280546126c290615245565b801561270f5780601f106126e45761010080835404028352916020019161270f565b820191906000526020600020905b8154815290600101906020018083116126f257829003601f168201915b505050505081565b606061272282612dc6565b612761576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275890614e0f565b60405180910390fd5b600061276b613399565b9050600081511161278b57604051806020016040528060008152506127b9565b806127958461342b565b60126040516020016127a993929190614ab8565b6040516020818303038152906040525b915050919050565b6127c9611daf565b73ffffffffffffffffffffffffffffffffffffffff166127e7612e32565b73ffffffffffffffffffffffffffffffffffffffff16148061285d5750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612845612e32565b73ffffffffffffffffffffffffffffffffffffffff16145b61289c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289390614ecf565b60405180910390fd5b601054816014546128ad919061507a565b11156128ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e590614d6f565b60405180910390fd5b60005b8181101561294f576000600160145461290a919061507a565b9050601054601454101561293b576129223382613259565b60146000815480929190612935906152a8565b91905055505b508080612947906152a8565b9150506128f1565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601160009054906101000a900460ff1681565b612a02612e32565b73ffffffffffffffffffffffffffffffffffffffff16612a20611daf565b73ffffffffffffffffffffffffffffffffffffffff161480612a885750612a45612e32565b73ffffffffffffffffffffffffffffffffffffffff1673d46bb23379301eec3eb01b2ee15b61d73477d18073ffffffffffffffffffffffffffffffffffffffff16145b612ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612abe90614dcf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612b37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2e90614c0f565b60405180910390fd5b612b4081613277565b50565b60105481565b612b51611daf565b73ffffffffffffffffffffffffffffffffffffffff16612b6f612e32565b73ffffffffffffffffffffffffffffffffffffffff161480612be55750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612bcd612e32565b73ffffffffffffffffffffffffffffffffffffffff16145b612c24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1b90614ecf565b60405180910390fd5b80600c819055507f8ef650d2de4208447ddb5de6a4d2bd95d7d04c957df933ff2548882ea2025a3881604051612c5a9190614eef565b60405180910390a150565b612c6d612e32565b73ffffffffffffffffffffffffffffffffffffffff16612c8b611daf565b73ffffffffffffffffffffffffffffffffffffffff161480612cf35750612cb0612e32565b73ffffffffffffffffffffffffffffffffffffffff1673d46bb23379301eec3eb01b2ee15b61d73477d18073ffffffffffffffffffffffffffffffffffffffff16145b612d32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2990614dcf565b60405180910390fd5b80600b9080519060200190612d48929190613eda565b5050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612dbf5750612dbe8261358c565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612ead83611764565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612efe82612dc6565b612f3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3490614cef565b60405180910390fd5b6000612f4883611764565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612fb757508373ffffffffffffffffffffffffffffffffffffffff16612f9f84610ad3565b73ffffffffffffffffffffffffffffffffffffffff16145b80612fc85750612fc78185612953565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612ff182611764565b73ffffffffffffffffffffffffffffffffffffffff1614613047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303e90614def565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ae90614c8f565b60405180910390fd5b6130c283838361366e565b6130cd600082612e3a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461311d919061515b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613174919061507a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000818361323b91906150d0565b905092915050565b600081836132519190615101565b905092915050565b61327382826040518060200160405280600081525061367e565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613348848484612fd1565b613354848484846136d9565b613393576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161338a90614bef565b60405180910390fd5b50505050565b6060601380546133a890615245565b80601f01602080910402602001604051908101604052809291908181526020018280546133d490615245565b80156134215780601f106133f657610100808354040283529160200191613421565b820191906000526020600020905b81548152906001019060200180831161340457829003601f168201915b5050505050905090565b60606000821415613473576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613587565b600082905060005b600082146134a557808061348e906152a8565b915050600a8261349e91906150d0565b915061347b565b60008167ffffffffffffffff8111156134c1576134c061540d565b5b6040519080825280601f01601f1916602001820160405280156134f35781602001600182028036833780820191505090505b5090505b600085146135805760018261350c919061515b565b9150600a8561351b91906152f1565b6030613527919061507a565b60f81b81838151811061353d5761353c6153de565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561357991906150d0565b94506134f7565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061365757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80613667575061366682613870565b5b9050919050565b6136798383836138da565b505050565b61368883836139ee565b61369560008484846136d9565b6136d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136cb90614bef565b60405180910390fd5b505050565b60006136fa8473ffffffffffffffffffffffffffffffffffffffff16613bbc565b15613863578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613723612e32565b8786866040518563ffffffff1660e01b81526004016137459493929190614b04565b602060405180830381600087803b15801561375f57600080fd5b505af192505050801561379057506040513d601f19601f8201168201806040525081019061378d91906144b3565b60015b613813573d80600081146137c0576040519150601f19603f3d011682016040523d82523d6000602084013e6137c5565b606091505b5060008151141561380b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161380290614bef565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613868565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6138e5838383613bcf565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156139285761392381613bd4565b613967565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613966576139658382613c1d565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156139aa576139a581613d8a565b6139e9565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146139e8576139e78282613e5b565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613a5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a5590614d8f565b60405180910390fd5b613a6781612dc6565b15613aa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a9e90614c2f565b60405180910390fd5b613ab36000838361366e565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613b03919061507a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613c2a84611c12565b613c34919061515b565b9050600060076000848152602001908152602001600020549050818114613d19576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613d9e919061515b565b9050600060096000848152602001908152602001600020549050600060088381548110613dce57613dcd6153de565b5b906000526020600020015490508060088381548110613df057613def6153de565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613e3f57613e3e6153af565b5b6001900381819060005260206000200160009055905550505050565b6000613e6683611c12565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054613ee690615245565b90600052602060002090601f016020900481019282613f085760008555613f4f565b82601f10613f2157805160ff1916838001178555613f4f565b82800160010185558215613f4f579182015b82811115613f4e578251825591602001919060010190613f33565b5b509050613f5c9190613f60565b5090565b5b80821115613f79576000816000905550600101613f61565b5090565b6000613f90613f8b84614f2f565b614f0a565b90508083825260208201905082856020860282011115613fb357613fb2615441565b5b60005b85811015613fe35781613fc988826140e1565b845260208401935060208301925050600181019050613fb6565b5050509392505050565b6000614000613ffb84614f5b565b614f0a565b9050808382526020820190508285602086028201111561402357614022615441565b5b60005b85811015614053578161403988826141ed565b845260208401935060208301925050600181019050614026565b5050509392505050565b600061407061406b84614f87565b614f0a565b90508281526020810184848401111561408c5761408b615446565b5b614097848285615203565b509392505050565b60006140b26140ad84614fb8565b614f0a565b9050828152602081018484840111156140ce576140cd615446565b5b6140d9848285615203565b509392505050565b6000813590506140f081615b62565b92915050565b600082601f83011261410b5761410a61543c565b5b813561411b848260208601613f7d565b91505092915050565b600082601f8301126141395761413861543c565b5b8135614149848260208601613fed565b91505092915050565b60008135905061416181615b79565b92915050565b60008135905061417681615b90565b92915050565b60008151905061418b81615b90565b92915050565b600082601f8301126141a6576141a561543c565b5b81356141b684826020860161405d565b91505092915050565b600082601f8301126141d4576141d361543c565b5b81356141e484826020860161409f565b91505092915050565b6000813590506141fc81615ba7565b92915050565b60006020828403121561421857614217615450565b5b6000614226848285016140e1565b91505092915050565b6000806040838503121561424657614245615450565b5b6000614254858286016140e1565b9250506020614265858286016140e1565b9150509250929050565b60008060006060848603121561428857614287615450565b5b6000614296868287016140e1565b93505060206142a7868287016140e1565b92505060406142b8868287016141ed565b9150509250925092565b600080600080608085870312156142dc576142db615450565b5b60006142ea878288016140e1565b94505060206142fb878288016140e1565b935050604061430c878288016141ed565b925050606085013567ffffffffffffffff81111561432d5761432c61544b565b5b61433987828801614191565b91505092959194509250565b6000806040838503121561435c5761435b615450565b5b600061436a858286016140e1565b925050602061437b85828601614152565b9150509250929050565b6000806040838503121561439c5761439b615450565b5b60006143aa858286016140e1565b92505060206143bb858286016141ed565b9150509250929050565b6000602082840312156143db576143da615450565b5b600082013567ffffffffffffffff8111156143f9576143f861544b565b5b614405848285016140f6565b91505092915050565b6000806040838503121561442557614424615450565b5b600083013567ffffffffffffffff8111156144435761444261544b565b5b61444f85828601614124565b925050602083013567ffffffffffffffff8111156144705761446f61544b565b5b61447c858286016140f6565b9150509250929050565b60006020828403121561449c5761449b615450565b5b60006144aa84828501614167565b91505092915050565b6000602082840312156144c9576144c8615450565b5b60006144d78482850161417c565b91505092915050565b6000602082840312156144f6576144f5615450565b5b600082013567ffffffffffffffff8111156145145761451361544b565b5b614520848285016141bf565b91505092915050565b60006020828403121561453f5761453e615450565b5b600061454d848285016141ed565b91505092915050565b6000614562838361456e565b60208301905092915050565b6145778161518f565b82525050565b6145868161518f565b82525050565b60006145978261500e565b6145a1818561503c565b93506145ac83614fe9565b8060005b838110156145dd5781516145c48882614556565b97506145cf8361502f565b9250506001810190506145b0565b5085935050505092915050565b6145f3816151a1565b82525050565b600061460482615019565b61460e818561504d565b935061461e818560208601615212565b61462781615455565b840191505092915050565b600061463d82615024565b614647818561505e565b9350614657818560208601615212565b61466081615455565b840191505092915050565b600061467682615024565b614680818561506f565b9350614690818560208601615212565b80840191505092915050565b600081546146a981615245565b6146b3818661506f565b945060018216600081146146ce57600181146146df57614712565b60ff19831686528186019350614712565b6146e885614ff9565b60005b8381101561470a578154818901526001820191506020810190506146eb565b838801955050505b50505092915050565b600061472860268361505e565b915061473382615466565b604082019050919050565b600061474b602b8361505e565b9150614756826154b5565b604082019050919050565b600061476e60328361505e565b915061477982615504565b604082019050919050565b600061479160268361505e565b915061479c82615553565b604082019050919050565b60006147b4601c8361505e565b91506147bf826155a2565b602082019050919050565b60006147d760268361505e565b91506147e2826155cb565b604082019050919050565b60006147fa602d8361505e565b91506148058261561a565b604082019050919050565b600061481d60248361505e565b915061482882615669565b604082019050919050565b600061484060198361505e565b915061484b826156b8565b602082019050919050565b6000614863601f8361505e565b915061486e826156e1565b602082019050919050565b6000614886602c8361505e565b91506148918261570a565b604082019050919050565b60006148a960388361505e565b91506148b482615759565b604082019050919050565b60006148cc602a8361505e565b91506148d7826157a8565b604082019050919050565b60006148ef60298361505e565b91506148fa826157f7565b604082019050919050565b6000614912602a8361505e565b915061491d82615846565b604082019050919050565b600061493560208361505e565b915061494082615895565b602082019050919050565b6000614958602c8361505e565b9150614963826158be565b604082019050919050565b600061497b60208361505e565b91506149868261590d565b602082019050919050565b600061499e60298361505e565b91506149a982615936565b604082019050919050565b60006149c1602f8361505e565b91506149cc82615985565b604082019050919050565b60006149e460218361505e565b91506149ef826159d4565b604082019050919050565b6000614a07600b8361505e565b9150614a1282615a23565b602082019050919050565b6000614a2a601b8361505e565b9150614a3582615a4c565b602082019050919050565b6000614a4d60318361505e565b9150614a5882615a75565b604082019050919050565b6000614a70602c8361505e565b9150614a7b82615ac4565b604082019050919050565b6000614a9360288361505e565b9150614a9e82615b13565b604082019050919050565b614ab2816151f9565b82525050565b6000614ac4828661466b565b9150614ad0828561466b565b9150614adc828461469c565b9150819050949350505050565b6000602082019050614afe600083018461457d565b92915050565b6000608082019050614b19600083018761457d565b614b26602083018661457d565b614b336040830185614aa9565b8181036060830152614b4581846145f9565b905095945050505050565b60006020820190508181036000830152614b6a818461458c565b905092915050565b6000602082019050614b8760008301846145ea565b92915050565b60006020820190508181036000830152614ba78184614632565b905092915050565b60006020820190508181036000830152614bc88161471b565b9050919050565b60006020820190508181036000830152614be88161473e565b9050919050565b60006020820190508181036000830152614c0881614761565b9050919050565b60006020820190508181036000830152614c2881614784565b9050919050565b60006020820190508181036000830152614c48816147a7565b9050919050565b60006020820190508181036000830152614c68816147ca565b9050919050565b60006020820190508181036000830152614c88816147ed565b9050919050565b60006020820190508181036000830152614ca881614810565b9050919050565b60006020820190508181036000830152614cc881614833565b9050919050565b60006020820190508181036000830152614ce881614856565b9050919050565b60006020820190508181036000830152614d0881614879565b9050919050565b60006020820190508181036000830152614d288161489c565b9050919050565b60006020820190508181036000830152614d48816148bf565b9050919050565b60006020820190508181036000830152614d68816148e2565b9050919050565b60006020820190508181036000830152614d8881614905565b9050919050565b60006020820190508181036000830152614da881614928565b9050919050565b60006020820190508181036000830152614dc88161494b565b9050919050565b60006020820190508181036000830152614de88161496e565b9050919050565b60006020820190508181036000830152614e0881614991565b9050919050565b60006020820190508181036000830152614e28816149b4565b9050919050565b60006020820190508181036000830152614e48816149d7565b9050919050565b60006020820190508181036000830152614e68816149fa565b9050919050565b60006020820190508181036000830152614e8881614a1d565b9050919050565b60006020820190508181036000830152614ea881614a40565b9050919050565b60006020820190508181036000830152614ec881614a63565b9050919050565b60006020820190508181036000830152614ee881614a86565b9050919050565b6000602082019050614f046000830184614aa9565b92915050565b6000614f14614f25565b9050614f208282615277565b919050565b6000604051905090565b600067ffffffffffffffff821115614f4a57614f4961540d565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614f7657614f7561540d565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614fa257614fa161540d565b5b614fab82615455565b9050602081019050919050565b600067ffffffffffffffff821115614fd357614fd261540d565b5b614fdc82615455565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000615085826151f9565b9150615090836151f9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156150c5576150c4615322565b5b828201905092915050565b60006150db826151f9565b91506150e6836151f9565b9250826150f6576150f5615351565b5b828204905092915050565b600061510c826151f9565b9150615117836151f9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156151505761514f615322565b5b828202905092915050565b6000615166826151f9565b9150615171836151f9565b92508282101561518457615183615322565b5b828203905092915050565b600061519a826151d9565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015615230578082015181840152602081019050615215565b8381111561523f576000848401525b50505050565b6000600282049050600182168061525d57607f821691505b6020821081141561527157615270615380565b5b50919050565b61528082615455565b810181811067ffffffffffffffff8211171561529f5761529e61540d565b5b80604052505050565b60006152b3826151f9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156152e6576152e5615322565b5b600182019050919050565b60006152fc826151f9565b9150615307836151f9565b92508261531757615316615351565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f53686f756c64206e6f742061697264726f70206d6f7265207468616e2032303060008201527f206974656d730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4578636565646564206d617820746f6b656e207075726368617365207065722060008201527f77616c6c65740000000000000000000000000000000000000000000000000000602082015250565b7f596f7520617265206e6f7420616c6c6f77656420746f206d696e74206265666f60008201527f72652063726f77642073616c6500000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f6620746f6b656e7300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f2062616c616e636521000000000000000000000000000000000000000000600082015250565b7f4578636565646564206d617820746f6b656e2070757263686173650000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4f776e657220636f756c642063616c6c2072657365727665546f6b656e73206660008201527f756e6374696f6e21000000000000000000000000000000000000000000000000602082015250565b615b6b8161518f565b8114615b7657600080fd5b50565b615b82816151a1565b8114615b8d57600080fd5b50565b615b99816151ad565b8114615ba457600080fd5b50565b615bb0816151f9565b8114615bbb57600080fd5b5056fea26469706673582212209030ab981882848515dd8f7106cd0cb3b8a24d94c85faa8e8e19cc57b955bf2064736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102725760003560e01c806369a2d3e51161014f578063b88d4fde116100c1578063e985e9c51161007a578063e985e9c51461091b578063eb8d244414610958578063f2fde38b14610983578063f47c84c5146109ac578063fbc94f24146109d7578063ffe630b514610a0057610272565b8063b88d4fde1461081c578063c1d1103714610845578063c634d0321461086e578063c66828621461088a578063c87b56dd146108b5578063d031370b146108f257610272565b80638da5cb5b116101135780638da5cb5b1461071e578063908dae961461074957806393777fb31461077257806395d89b411461079d5780639a1b7740146107c8578063a22cb465146107f357610272565b806369a2d3e51461064b57806370a0823114610674578063715018a6146106b15780637a8baf52146106c85780637ff9b596146106f357610272565b80633ad10ef6116101e857806355f804b3116101ac57806355f804b31461053f5780635a20a93a146105685780635c5d81cc146105915780636352211e146105ba5780636373a6b1146105f757806367b138e11461062257610272565b80633ad10ef61461046c5780633ccfd60b146104975780633e411489146104ae57806342842e0e146104d95780634f6ccce71461050257610272565b806309aa3dcf1161023a57806309aa3dcf1461037057806318160ddd1461039b5780631c9e3e5c146103c657806323b872dd146103ef5780632f745c591461041857806334918dfd1461045557610272565b806301ffc9a714610277578063045b7dca146102b457806306fdde03146102df578063081812fc1461030a578063095ea7b314610347575b600080fd5b34801561028357600080fd5b5061029e60048036038101906102999190614486565b610a29565b6040516102ab9190614b72565b60405180910390f35b3480156102c057600080fd5b506102c9610a3b565b6040516102d69190614eef565b60405180910390f35b3480156102eb57600080fd5b506102f4610a41565b6040516103019190614b8d565b60405180910390f35b34801561031657600080fd5b50610331600480360381019061032c9190614529565b610ad3565b60405161033e9190614ae9565b60405180910390f35b34801561035357600080fd5b5061036e60048036038101906103699190614385565b610b58565b005b34801561037c57600080fd5b50610385610c70565b6040516103929190614eef565b60405180910390f35b3480156103a757600080fd5b506103b0610c76565b6040516103bd9190614eef565b60405180910390f35b3480156103d257600080fd5b506103ed60048036038101906103e891906143c5565b610c83565b005b3480156103fb57600080fd5b506104166004803603810190610411919061426f565b610e2a565b005b34801561042457600080fd5b5061043f600480360381019061043a9190614385565b610e8a565b60405161044c9190614eef565b60405180910390f35b34801561046157600080fd5b5061046a610f2f565b005b34801561047857600080fd5b50610481611036565b60405161048e9190614ae9565b60405180910390f35b3480156104a357600080fd5b506104ac61105c565b005b3480156104ba57600080fd5b506104c361138e565b6040516104d09190614ae9565b60405180910390f35b3480156104e557600080fd5b5061050060048036038101906104fb919061426f565b6113b4565b005b34801561050e57600080fd5b5061052960048036038101906105249190614529565b6113d4565b6040516105369190614eef565b60405180910390f35b34801561054b57600080fd5b50610566600480360381019061056191906144e0565b611445565b005b34801561057457600080fd5b5061058f600480360381019061058a9190614529565b61152c565b005b34801561059d57600080fd5b506105b860048036038101906105b39190614529565b611648565b005b3480156105c657600080fd5b506105e160048036038101906105dc9190614529565b611764565b6040516105ee9190614ae9565b60405180910390f35b34801561060357600080fd5b5061060c611816565b6040516106199190614b8d565b60405180910390f35b34801561062e57600080fd5b5061064960048036038101906106449190614529565b6118a4565b005b34801561065757600080fd5b50610672600480360381019061066d919061440e565b6119c0565b005b34801561068057600080fd5b5061069b60048036038101906106969190614202565b611c12565b6040516106a89190614eef565b60405180910390f35b3480156106bd57600080fd5b506106c6611cca565b005b3480156106d457600080fd5b506106dd611da3565b6040516106ea9190614eef565b60405180910390f35b3480156106ff57600080fd5b50610708611da9565b6040516107159190614eef565b60405180910390f35b34801561072a57600080fd5b50610733611daf565b6040516107409190614ae9565b60405180910390f35b34801561075557600080fd5b50610770600480360381019061076b91906143c5565b611dd9565b005b34801561077e57600080fd5b50610787611f80565b6040516107949190614eef565b60405180910390f35b3480156107a957600080fd5b506107b2611f86565b6040516107bf9190614b8d565b60405180910390f35b3480156107d457600080fd5b506107dd612018565b6040516107ea9190614ae9565b60405180910390f35b3480156107ff57600080fd5b5061081a60048036038101906108159190614345565b61203e565b005b34801561082857600080fd5b50610843600480360381019061083e91906142c2565b6121bf565b005b34801561085157600080fd5b5061086c6004803603810190610867919061422f565b612221565b005b61088860048036038101906108839190614529565b612374565b005b34801561089657600080fd5b5061089f612689565b6040516108ac9190614b8d565b60405180910390f35b3480156108c157600080fd5b506108dc60048036038101906108d79190614529565b612717565b6040516108e99190614b8d565b60405180910390f35b3480156108fe57600080fd5b5061091960048036038101906109149190614529565b6127c1565b005b34801561092757600080fd5b50610942600480360381019061093d919061422f565b612953565b60405161094f9190614b72565b60405180910390f35b34801561096457600080fd5b5061096d6129e7565b60405161097a9190614b72565b60405180910390f35b34801561098f57600080fd5b506109aa60048036038101906109a59190614202565b6129fa565b005b3480156109b857600080fd5b506109c1612b43565b6040516109ce9190614eef565b60405180910390f35b3480156109e357600080fd5b506109fe60048036038101906109f99190614529565b612b49565b005b348015610a0c57600080fd5b50610a276004803603810190610a2291906144e0565b612c65565b005b6000610a3482612d4c565b9050919050565b60145481565b606060008054610a5090615245565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7c90615245565b8015610ac95780601f10610a9e57610100808354040283529160200191610ac9565b820191906000526020600020905b815481529060010190602001808311610aac57829003601f168201915b5050505050905090565b6000610ade82612dc6565b610b1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1490614daf565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b6382611764565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcb90614e2f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bf3612e32565b73ffffffffffffffffffffffffffffffffffffffff161480610c225750610c2181610c1c612e32565b612953565b5b610c61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5890614d0f565b60405180910390fd5b610c6b8383612e3a565b505050565b600e5481565b6000600880549050905090565b610c8b611daf565b73ffffffffffffffffffffffffffffffffffffffff16610ca9612e32565b73ffffffffffffffffffffffffffffffffffffffff161480610d1f5750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610d07612e32565b73ffffffffffffffffffffffffffffffffffffffff16145b610d5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5590614ecf565b60405180910390fd5b60005b8151811015610def57600160186000848481518110610d8357610d826153de565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610de7906152a8565b915050610d61565b507fba26e44fef3a99f68ee2ea6e71b0092f7bdd2ecb7c76f7bbd49b7fe70d5d3e6c81604051610e1f9190614b50565b60405180910390a150565b610e3b610e35612e32565b82612ef3565b610e7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7190614e8f565b60405180910390fd5b610e85838383612fd1565b505050565b6000610e9583611c12565b8210610ed6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecd90614bcf565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610f37611daf565b73ffffffffffffffffffffffffffffffffffffffff16610f55612e32565b73ffffffffffffffffffffffffffffffffffffffff161480610fcb5750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610fb3612e32565b73ffffffffffffffffffffffffffffffffffffffff16145b61100a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100190614ecf565b60405180910390fd5b601160009054906101000a900460ff1615601160006101000a81548160ff021916908315150217905550565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611064612e32565b73ffffffffffffffffffffffffffffffffffffffff16611082611daf565b73ffffffffffffffffffffffffffffffffffffffff1614806110ea57506110a7612e32565b73ffffffffffffffffffffffffffffffffffffffff1673d46bb23379301eec3eb01b2ee15b61d73477d18073ffffffffffffffffffffffffffffffffffffffff16145b611129576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112090614dcf565b60405180910390fd5b600047905060008111611171576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116890614e4f565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc6111b2601e6111a460648661322d90919063ffffffff16565b61324390919063ffffffff16565b9081150290604051600060405180830381858888f193505050501580156111dd573d6000803e3d6000fd5b50601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc611241601d61123360648661322d90919063ffffffff16565b61324390919063ffffffff16565b9081150290604051600060405180830381858888f1935050505015801561126c573d6000803e3d6000fd5b50601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6112d0601d6112c260648661322d90919063ffffffff16565b61324390919063ffffffff16565b9081150290604051600060405180830381858888f193505050501580156112fb573d6000803e3d6000fd5b50601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc61135f600c61135160648661322d90919063ffffffff16565b61324390919063ffffffff16565b9081150290604051600060405180830381858888f1935050505015801561138a573d6000803e3d6000fd5b5050565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6113cf838383604051806020016040528060008152506121bf565b505050565b60006113de610c76565b821061141f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141690614eaf565b60405180910390fd5b60088281548110611433576114326153de565b5b90600052602060002001549050919050565b61144d612e32565b73ffffffffffffffffffffffffffffffffffffffff1661146b611daf565b73ffffffffffffffffffffffffffffffffffffffff1614806114d35750611490612e32565b73ffffffffffffffffffffffffffffffffffffffff1673d46bb23379301eec3eb01b2ee15b61d73477d18073ffffffffffffffffffffffffffffffffffffffff16145b611512576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150990614dcf565b60405180910390fd5b8060139080519060200190611528929190613eda565b5050565b611534611daf565b73ffffffffffffffffffffffffffffffffffffffff16611552612e32565b73ffffffffffffffffffffffffffffffffffffffff1614806115c85750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166115b0612e32565b73ffffffffffffffffffffffffffffffffffffffff16145b611607576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fe90614ecf565b60405180910390fd5b80600d819055507f697c9275f9b267c7bf6e8da5d2b2e34476337c3589027294182753a9e651cec58160405161163d9190614eef565b60405180910390a150565b611650611daf565b73ffffffffffffffffffffffffffffffffffffffff1661166e612e32565b73ffffffffffffffffffffffffffffffffffffffff1614806116e45750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166116cc612e32565b73ffffffffffffffffffffffffffffffffffffffff16145b611723576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171a90614ecf565b60405180910390fd5b80600e819055507f34c497eca31bd81a9cf2dbd7a38803d8847a7630e78982cf1636761f9c208a1e816040516117599190614eef565b60405180910390a150565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561180d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180490614d4f565b60405180910390fd5b80915050919050565b600b805461182390615245565b80601f016020809104026020016040519081016040528092919081815260200182805461184f90615245565b801561189c5780601f106118715761010080835404028352916020019161189c565b820191906000526020600020905b81548152906001019060200180831161187f57829003601f168201915b505050505081565b6118ac611daf565b73ffffffffffffffffffffffffffffffffffffffff166118ca612e32565b73ffffffffffffffffffffffffffffffffffffffff1614806119405750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611928612e32565b73ffffffffffffffffffffffffffffffffffffffff16145b61197f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197690614ecf565b60405180910390fd5b80600f819055507fdb0edf818ba53623589eda65d96a84c4b722bf5cf63d09b8bfc6184d78b088ab816040516119b59190614eef565b60405180910390a150565b6119c8612e32565b73ffffffffffffffffffffffffffffffffffffffff166119e6611daf565b73ffffffffffffffffffffffffffffffffffffffff161480611a4e5750611a0b612e32565b73ffffffffffffffffffffffffffffffffffffffff1673d46bb23379301eec3eb01b2ee15b61d73477d18073ffffffffffffffffffffffffffffffffffffffff16145b611a8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8490614dcf565b60405180910390fd5b80518251148015611aa0575060c8825111155b8015611aae575060c8815111155b611aed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae490614baf565b60405180910390fd5b60005b8251811015611c0d57611b37828281518110611b0f57611b0e6153de565b5b6020026020010151848381518110611b2a57611b296153de565b5b6020026020010151613259565b600160196000848481518110611b5057611b4f6153de565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b9d919061507a565b60196000848481518110611bb457611bb36153de565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080611c05906152a8565b915050611af0565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7a90614d2f565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611cd2612e32565b73ffffffffffffffffffffffffffffffffffffffff16611cf0611daf565b73ffffffffffffffffffffffffffffffffffffffff161480611d585750611d15612e32565b73ffffffffffffffffffffffffffffffffffffffff1673d46bb23379301eec3eb01b2ee15b61d73477d18073ffffffffffffffffffffffffffffffffffffffff16145b611d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8e90614dcf565b60405180910390fd5b611da16000613277565b565b600f5481565b600c5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611de1611daf565b73ffffffffffffffffffffffffffffffffffffffff16611dff612e32565b73ffffffffffffffffffffffffffffffffffffffff161480611e755750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611e5d612e32565b73ffffffffffffffffffffffffffffffffffffffff16145b611eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eab90614ecf565b60405180910390fd5b60005b8151811015611f4557600060186000848481518110611ed957611ed86153de565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611f3d906152a8565b915050611eb7565b507f8d99342fc0d06e45a8d926013b17f7da00e51b77aaa62ef200b14ed76066504d81604051611f759190614b50565b60405180910390a150565b600d5481565b606060018054611f9590615245565b80601f0160208091040260200160405190810160405280929190818152602001828054611fc190615245565b801561200e5780601f10611fe35761010080835404028352916020019161200e565b820191906000526020600020905b815481529060010190602001808311611ff157829003601f168201915b5050505050905090565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612046612e32565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ab90614caf565b60405180910390fd5b80600560006120c1612e32565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661216e612e32565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121b39190614b72565b60405180910390a35050565b6121d06121ca612e32565b83612ef3565b61220f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220690614e8f565b60405180910390fd5b61221b8484848461333d565b50505050565b612229612e32565b73ffffffffffffffffffffffffffffffffffffffff16612247611daf565b73ffffffffffffffffffffffffffffffffffffffff1614806122af575061226c612e32565b73ffffffffffffffffffffffffffffffffffffffff1673d46bb23379301eec3eb01b2ee15b61d73477d18073ffffffffffffffffffffffffffffffffffffffff16145b6122ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e590614dcf565b60405180910390fd5b81601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600c549050601160009054906101000a900460ff1661242157601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661241b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241290614c6f565b60405180910390fd5b600d5490505b600e54821115612466576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245d90614e6f565b60405180910390fd5b600f5482601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546124b4919061507a565b11156124f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ec90614c4f565b60405180910390fd5b60105482601454612506919061507a565b1115612547576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253e90614d6f565b60405180910390fd5b3482826125549190615101565b1115612595576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258c90614ccf565b60405180910390fd5b60005b828110156125f657600060016014546125b1919061507a565b905060105460145410156125e2576125c93382613259565b601460008154809291906125dc906152a8565b91905055505b5080806125ee906152a8565b915050612598565b5081601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612642919061507a565b601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b6012805461269690615245565b80601f01602080910402602001604051908101604052809291908181526020018280546126c290615245565b801561270f5780601f106126e45761010080835404028352916020019161270f565b820191906000526020600020905b8154815290600101906020018083116126f257829003601f168201915b505050505081565b606061272282612dc6565b612761576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275890614e0f565b60405180910390fd5b600061276b613399565b9050600081511161278b57604051806020016040528060008152506127b9565b806127958461342b565b60126040516020016127a993929190614ab8565b6040516020818303038152906040525b915050919050565b6127c9611daf565b73ffffffffffffffffffffffffffffffffffffffff166127e7612e32565b73ffffffffffffffffffffffffffffffffffffffff16148061285d5750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612845612e32565b73ffffffffffffffffffffffffffffffffffffffff16145b61289c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289390614ecf565b60405180910390fd5b601054816014546128ad919061507a565b11156128ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e590614d6f565b60405180910390fd5b60005b8181101561294f576000600160145461290a919061507a565b9050601054601454101561293b576129223382613259565b60146000815480929190612935906152a8565b91905055505b508080612947906152a8565b9150506128f1565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601160009054906101000a900460ff1681565b612a02612e32565b73ffffffffffffffffffffffffffffffffffffffff16612a20611daf565b73ffffffffffffffffffffffffffffffffffffffff161480612a885750612a45612e32565b73ffffffffffffffffffffffffffffffffffffffff1673d46bb23379301eec3eb01b2ee15b61d73477d18073ffffffffffffffffffffffffffffffffffffffff16145b612ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612abe90614dcf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612b37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2e90614c0f565b60405180910390fd5b612b4081613277565b50565b60105481565b612b51611daf565b73ffffffffffffffffffffffffffffffffffffffff16612b6f612e32565b73ffffffffffffffffffffffffffffffffffffffff161480612be55750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612bcd612e32565b73ffffffffffffffffffffffffffffffffffffffff16145b612c24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1b90614ecf565b60405180910390fd5b80600c819055507f8ef650d2de4208447ddb5de6a4d2bd95d7d04c957df933ff2548882ea2025a3881604051612c5a9190614eef565b60405180910390a150565b612c6d612e32565b73ffffffffffffffffffffffffffffffffffffffff16612c8b611daf565b73ffffffffffffffffffffffffffffffffffffffff161480612cf35750612cb0612e32565b73ffffffffffffffffffffffffffffffffffffffff1673d46bb23379301eec3eb01b2ee15b61d73477d18073ffffffffffffffffffffffffffffffffffffffff16145b612d32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2990614dcf565b60405180910390fd5b80600b9080519060200190612d48929190613eda565b5050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612dbf5750612dbe8261358c565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612ead83611764565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612efe82612dc6565b612f3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3490614cef565b60405180910390fd5b6000612f4883611764565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612fb757508373ffffffffffffffffffffffffffffffffffffffff16612f9f84610ad3565b73ffffffffffffffffffffffffffffffffffffffff16145b80612fc85750612fc78185612953565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612ff182611764565b73ffffffffffffffffffffffffffffffffffffffff1614613047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303e90614def565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ae90614c8f565b60405180910390fd5b6130c283838361366e565b6130cd600082612e3a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461311d919061515b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613174919061507a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000818361323b91906150d0565b905092915050565b600081836132519190615101565b905092915050565b61327382826040518060200160405280600081525061367e565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613348848484612fd1565b613354848484846136d9565b613393576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161338a90614bef565b60405180910390fd5b50505050565b6060601380546133a890615245565b80601f01602080910402602001604051908101604052809291908181526020018280546133d490615245565b80156134215780601f106133f657610100808354040283529160200191613421565b820191906000526020600020905b81548152906001019060200180831161340457829003601f168201915b5050505050905090565b60606000821415613473576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613587565b600082905060005b600082146134a557808061348e906152a8565b915050600a8261349e91906150d0565b915061347b565b60008167ffffffffffffffff8111156134c1576134c061540d565b5b6040519080825280601f01601f1916602001820160405280156134f35781602001600182028036833780820191505090505b5090505b600085146135805760018261350c919061515b565b9150600a8561351b91906152f1565b6030613527919061507a565b60f81b81838151811061353d5761353c6153de565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561357991906150d0565b94506134f7565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061365757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80613667575061366682613870565b5b9050919050565b6136798383836138da565b505050565b61368883836139ee565b61369560008484846136d9565b6136d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136cb90614bef565b60405180910390fd5b505050565b60006136fa8473ffffffffffffffffffffffffffffffffffffffff16613bbc565b15613863578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613723612e32565b8786866040518563ffffffff1660e01b81526004016137459493929190614b04565b602060405180830381600087803b15801561375f57600080fd5b505af192505050801561379057506040513d601f19601f8201168201806040525081019061378d91906144b3565b60015b613813573d80600081146137c0576040519150601f19603f3d011682016040523d82523d6000602084013e6137c5565b606091505b5060008151141561380b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161380290614bef565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613868565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6138e5838383613bcf565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156139285761392381613bd4565b613967565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613966576139658382613c1d565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156139aa576139a581613d8a565b6139e9565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146139e8576139e78282613e5b565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613a5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a5590614d8f565b60405180910390fd5b613a6781612dc6565b15613aa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a9e90614c2f565b60405180910390fd5b613ab36000838361366e565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613b03919061507a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613c2a84611c12565b613c34919061515b565b9050600060076000848152602001908152602001600020549050818114613d19576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613d9e919061515b565b9050600060096000848152602001908152602001600020549050600060088381548110613dce57613dcd6153de565b5b906000526020600020015490508060088381548110613df057613def6153de565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613e3f57613e3e6153af565b5b6001900381819060005260206000200160009055905550505050565b6000613e6683611c12565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054613ee690615245565b90600052602060002090601f016020900481019282613f085760008555613f4f565b82601f10613f2157805160ff1916838001178555613f4f565b82800160010185558215613f4f579182015b82811115613f4e578251825591602001919060010190613f33565b5b509050613f5c9190613f60565b5090565b5b80821115613f79576000816000905550600101613f61565b5090565b6000613f90613f8b84614f2f565b614f0a565b90508083825260208201905082856020860282011115613fb357613fb2615441565b5b60005b85811015613fe35781613fc988826140e1565b845260208401935060208301925050600181019050613fb6565b5050509392505050565b6000614000613ffb84614f5b565b614f0a565b9050808382526020820190508285602086028201111561402357614022615441565b5b60005b85811015614053578161403988826141ed565b845260208401935060208301925050600181019050614026565b5050509392505050565b600061407061406b84614f87565b614f0a565b90508281526020810184848401111561408c5761408b615446565b5b614097848285615203565b509392505050565b60006140b26140ad84614fb8565b614f0a565b9050828152602081018484840111156140ce576140cd615446565b5b6140d9848285615203565b509392505050565b6000813590506140f081615b62565b92915050565b600082601f83011261410b5761410a61543c565b5b813561411b848260208601613f7d565b91505092915050565b600082601f8301126141395761413861543c565b5b8135614149848260208601613fed565b91505092915050565b60008135905061416181615b79565b92915050565b60008135905061417681615b90565b92915050565b60008151905061418b81615b90565b92915050565b600082601f8301126141a6576141a561543c565b5b81356141b684826020860161405d565b91505092915050565b600082601f8301126141d4576141d361543c565b5b81356141e484826020860161409f565b91505092915050565b6000813590506141fc81615ba7565b92915050565b60006020828403121561421857614217615450565b5b6000614226848285016140e1565b91505092915050565b6000806040838503121561424657614245615450565b5b6000614254858286016140e1565b9250506020614265858286016140e1565b9150509250929050565b60008060006060848603121561428857614287615450565b5b6000614296868287016140e1565b93505060206142a7868287016140e1565b92505060406142b8868287016141ed565b9150509250925092565b600080600080608085870312156142dc576142db615450565b5b60006142ea878288016140e1565b94505060206142fb878288016140e1565b935050604061430c878288016141ed565b925050606085013567ffffffffffffffff81111561432d5761432c61544b565b5b61433987828801614191565b91505092959194509250565b6000806040838503121561435c5761435b615450565b5b600061436a858286016140e1565b925050602061437b85828601614152565b9150509250929050565b6000806040838503121561439c5761439b615450565b5b60006143aa858286016140e1565b92505060206143bb858286016141ed565b9150509250929050565b6000602082840312156143db576143da615450565b5b600082013567ffffffffffffffff8111156143f9576143f861544b565b5b614405848285016140f6565b91505092915050565b6000806040838503121561442557614424615450565b5b600083013567ffffffffffffffff8111156144435761444261544b565b5b61444f85828601614124565b925050602083013567ffffffffffffffff8111156144705761446f61544b565b5b61447c858286016140f6565b9150509250929050565b60006020828403121561449c5761449b615450565b5b60006144aa84828501614167565b91505092915050565b6000602082840312156144c9576144c8615450565b5b60006144d78482850161417c565b91505092915050565b6000602082840312156144f6576144f5615450565b5b600082013567ffffffffffffffff8111156145145761451361544b565b5b614520848285016141bf565b91505092915050565b60006020828403121561453f5761453e615450565b5b600061454d848285016141ed565b91505092915050565b6000614562838361456e565b60208301905092915050565b6145778161518f565b82525050565b6145868161518f565b82525050565b60006145978261500e565b6145a1818561503c565b93506145ac83614fe9565b8060005b838110156145dd5781516145c48882614556565b97506145cf8361502f565b9250506001810190506145b0565b5085935050505092915050565b6145f3816151a1565b82525050565b600061460482615019565b61460e818561504d565b935061461e818560208601615212565b61462781615455565b840191505092915050565b600061463d82615024565b614647818561505e565b9350614657818560208601615212565b61466081615455565b840191505092915050565b600061467682615024565b614680818561506f565b9350614690818560208601615212565b80840191505092915050565b600081546146a981615245565b6146b3818661506f565b945060018216600081146146ce57600181146146df57614712565b60ff19831686528186019350614712565b6146e885614ff9565b60005b8381101561470a578154818901526001820191506020810190506146eb565b838801955050505b50505092915050565b600061472860268361505e565b915061473382615466565b604082019050919050565b600061474b602b8361505e565b9150614756826154b5565b604082019050919050565b600061476e60328361505e565b915061477982615504565b604082019050919050565b600061479160268361505e565b915061479c82615553565b604082019050919050565b60006147b4601c8361505e565b91506147bf826155a2565b602082019050919050565b60006147d760268361505e565b91506147e2826155cb565b604082019050919050565b60006147fa602d8361505e565b91506148058261561a565b604082019050919050565b600061481d60248361505e565b915061482882615669565b604082019050919050565b600061484060198361505e565b915061484b826156b8565b602082019050919050565b6000614863601f8361505e565b915061486e826156e1565b602082019050919050565b6000614886602c8361505e565b91506148918261570a565b604082019050919050565b60006148a960388361505e565b91506148b482615759565b604082019050919050565b60006148cc602a8361505e565b91506148d7826157a8565b604082019050919050565b60006148ef60298361505e565b91506148fa826157f7565b604082019050919050565b6000614912602a8361505e565b915061491d82615846565b604082019050919050565b600061493560208361505e565b915061494082615895565b602082019050919050565b6000614958602c8361505e565b9150614963826158be565b604082019050919050565b600061497b60208361505e565b91506149868261590d565b602082019050919050565b600061499e60298361505e565b91506149a982615936565b604082019050919050565b60006149c1602f8361505e565b91506149cc82615985565b604082019050919050565b60006149e460218361505e565b91506149ef826159d4565b604082019050919050565b6000614a07600b8361505e565b9150614a1282615a23565b602082019050919050565b6000614a2a601b8361505e565b9150614a3582615a4c565b602082019050919050565b6000614a4d60318361505e565b9150614a5882615a75565b604082019050919050565b6000614a70602c8361505e565b9150614a7b82615ac4565b604082019050919050565b6000614a9360288361505e565b9150614a9e82615b13565b604082019050919050565b614ab2816151f9565b82525050565b6000614ac4828661466b565b9150614ad0828561466b565b9150614adc828461469c565b9150819050949350505050565b6000602082019050614afe600083018461457d565b92915050565b6000608082019050614b19600083018761457d565b614b26602083018661457d565b614b336040830185614aa9565b8181036060830152614b4581846145f9565b905095945050505050565b60006020820190508181036000830152614b6a818461458c565b905092915050565b6000602082019050614b8760008301846145ea565b92915050565b60006020820190508181036000830152614ba78184614632565b905092915050565b60006020820190508181036000830152614bc88161471b565b9050919050565b60006020820190508181036000830152614be88161473e565b9050919050565b60006020820190508181036000830152614c0881614761565b9050919050565b60006020820190508181036000830152614c2881614784565b9050919050565b60006020820190508181036000830152614c48816147a7565b9050919050565b60006020820190508181036000830152614c68816147ca565b9050919050565b60006020820190508181036000830152614c88816147ed565b9050919050565b60006020820190508181036000830152614ca881614810565b9050919050565b60006020820190508181036000830152614cc881614833565b9050919050565b60006020820190508181036000830152614ce881614856565b9050919050565b60006020820190508181036000830152614d0881614879565b9050919050565b60006020820190508181036000830152614d288161489c565b9050919050565b60006020820190508181036000830152614d48816148bf565b9050919050565b60006020820190508181036000830152614d68816148e2565b9050919050565b60006020820190508181036000830152614d8881614905565b9050919050565b60006020820190508181036000830152614da881614928565b9050919050565b60006020820190508181036000830152614dc88161494b565b9050919050565b60006020820190508181036000830152614de88161496e565b9050919050565b60006020820190508181036000830152614e0881614991565b9050919050565b60006020820190508181036000830152614e28816149b4565b9050919050565b60006020820190508181036000830152614e48816149d7565b9050919050565b60006020820190508181036000830152614e68816149fa565b9050919050565b60006020820190508181036000830152614e8881614a1d565b9050919050565b60006020820190508181036000830152614ea881614a40565b9050919050565b60006020820190508181036000830152614ec881614a63565b9050919050565b60006020820190508181036000830152614ee881614a86565b9050919050565b6000602082019050614f046000830184614aa9565b92915050565b6000614f14614f25565b9050614f208282615277565b919050565b6000604051905090565b600067ffffffffffffffff821115614f4a57614f4961540d565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614f7657614f7561540d565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614fa257614fa161540d565b5b614fab82615455565b9050602081019050919050565b600067ffffffffffffffff821115614fd357614fd261540d565b5b614fdc82615455565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000615085826151f9565b9150615090836151f9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156150c5576150c4615322565b5b828201905092915050565b60006150db826151f9565b91506150e6836151f9565b9250826150f6576150f5615351565b5b828204905092915050565b600061510c826151f9565b9150615117836151f9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156151505761514f615322565b5b828202905092915050565b6000615166826151f9565b9150615171836151f9565b92508282101561518457615183615322565b5b828203905092915050565b600061519a826151d9565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015615230578082015181840152602081019050615215565b8381111561523f576000848401525b50505050565b6000600282049050600182168061525d57607f821691505b6020821081141561527157615270615380565b5b50919050565b61528082615455565b810181811067ffffffffffffffff8211171561529f5761529e61540d565b5b80604052505050565b60006152b3826151f9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156152e6576152e5615322565b5b600182019050919050565b60006152fc826151f9565b9150615307836151f9565b92508261531757615316615351565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f53686f756c64206e6f742061697264726f70206d6f7265207468616e2032303060008201527f206974656d730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4578636565646564206d617820746f6b656e207075726368617365207065722060008201527f77616c6c65740000000000000000000000000000000000000000000000000000602082015250565b7f596f7520617265206e6f7420616c6c6f77656420746f206d696e74206265666f60008201527f72652063726f77642073616c6500000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f6620746f6b656e7300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f2062616c616e636521000000000000000000000000000000000000000000600082015250565b7f4578636565646564206d617820746f6b656e2070757263686173650000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4f776e657220636f756c642063616c6c2072657365727665546f6b656e73206660008201527f756e6374696f6e21000000000000000000000000000000000000000000000000602082015250565b615b6b8161518f565b8114615b7657600080fd5b50565b615b82816151a1565b8114615b8d57600080fd5b50565b615b99816151ad565b8114615ba457600080fd5b50565b615bb0816151f9565b8114615bbb57600080fd5b5056fea26469706673582212209030ab981882848515dd8f7106cd0cb3b8a24d94c85faa8e8e19cc57b955bf2064736f6c63430008070033

Deployed Bytecode Sourcemap

50129:7109:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51810:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50661:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28444:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30012:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29535:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50418:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44557:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55056:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30902:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44225:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52854:190;;;;;;;;;;;;;:::i;:::-;;50715:70;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56850:383;;;;;;;;;;;;;:::i;:::-;;50789:73;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31312:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44747:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51997:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56557:283;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55749:264;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28138:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50252:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56021:260;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53588:390;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27868:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41359:94;;;;;;;;;;;;;:::i;:::-;;50458:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50283:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40637:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55384:331;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50347:52;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28613:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50866:73;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30305:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31568:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51476:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53986:1036;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50579:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52371:475;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53052:531;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30671:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50540:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41608:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50500:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56311:241;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52241:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51810:179;51921:4;51945:36;51969:11;51945:23;:36::i;:::-;51938:43;;51810:179;;;:::o;50661:31::-;;;;:::o;28444:100::-;28498:13;28531:5;28524:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28444:100;:::o;30012:221::-;30088:7;30116:16;30124:7;30116;:16::i;:::-;30108:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30201:15;:24;30217:7;30201:24;;;;;;;;;;;;;;;;;;;;;30194:31;;30012:221;;;:::o;29535:411::-;29616:13;29632:23;29647:7;29632:14;:23::i;:::-;29616:39;;29680:5;29674:11;;:2;:11;;;;29666:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;29774:5;29758:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;29783:37;29800:5;29807:12;:10;:12::i;:::-;29783:16;:37::i;:::-;29758:62;29736:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;29917:21;29926:2;29930:7;29917:8;:21::i;:::-;29605:341;29535:411;;:::o;50418:33::-;;;;:::o;44557:113::-;44618:7;44645:10;:17;;;;44638:24;;44557:113;:::o;55056:320::-;55148:7;:5;:7::i;:::-;55132:23;;:12;:10;:12::i;:::-;:23;;;:53;;;;55175:10;;;;;;;;;;;55159:26;;:12;:10;:12::i;:::-;:26;;;55132:53;55124:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;55239:6;55235:88;55255:8;:15;55251:1;:19;55235:88;;;55313:4;55283:14;:27;55298:8;55307:1;55298:11;;;;;;;;:::i;:::-;;;;;;;;55283:27;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;55272:3;;;;;:::i;:::-;;;;55235:88;;;;55340:28;55359:8;55340:28;;;;;;:::i;:::-;;;;;;;;55056:320;:::o;30902:339::-;31097:41;31116:12;:10;:12::i;:::-;31130:7;31097:18;:41::i;:::-;31089:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;31205:28;31215:4;31221:2;31225:7;31205:9;:28::i;:::-;30902:339;;;:::o;44225:256::-;44322:7;44358:23;44375:5;44358:16;:23::i;:::-;44350:5;:31;44342:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;44447:12;:19;44460:5;44447:19;;;;;;;;;;;;;;;:26;44467:5;44447:26;;;;;;;;;;;;44440:33;;44225:256;;;;:::o;52854:190::-;52915:7;:5;:7::i;:::-;52899:23;;:12;:10;:12::i;:::-;:23;;;:53;;;;52942:10;;;;;;;;;;;52926:26;;:12;:10;:12::i;:::-;:26;;;52899:53;52891:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;53024:12;;;;;;;;;;;53023:13;53008:12;;:28;;;;;;;;;;;;;;;;;;52854:190::o;50715:70::-;;;;;;;;;;;;;:::o;56850:383::-;40868:12;:10;:12::i;:::-;40857:23;;:7;:5;:7::i;:::-;:23;;;:94;;;;40939:12;:10;:12::i;:::-;40884:67;;40892:42;40884:67;;;40857:94;40849:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;56898:15:::1;56916:21;56898:39;;56960:1;56950:7;:11;56942:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;56996:10;56988:28;;:54;57017:24;57038:2;57017:16;57029:3;57017:7;:11;;:16;;;;:::i;:::-;:20;;:24;;;;:::i;:::-;56988:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;57055:13;;;;;;;;;;;57047:31;;:57;57079:24;57100:2;57079:16;57091:3;57079:7;:11;;:16;;;;:::i;:::-;:20;;:24;;;;:::i;:::-;57047:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;57117:13;;;;;;;;;;;57109:31;;:57;57141:24;57162:2;57141:16;57153:3;57141:7;:11;;:16;;;;:::i;:::-;:20;;:24;;;;:::i;:::-;57109:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;57179:10;;;;;;;;;;;57171:28;;:54;57200:24;57221:2;57200:16;57212:3;57200:7;:11;;:16;;;;:::i;:::-;:20;;:24;;;;:::i;:::-;57171:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;56887:346;56850:383::o:0;50789:73::-;;;;;;;;;;;;;:::o;31312:185::-;31450:39;31467:4;31473:2;31477:7;31450:39;;;;;;;;;;;;:16;:39::i;:::-;31312:185;;;:::o;44747:233::-;44822:7;44858:30;:28;:30::i;:::-;44850:5;:38;44842:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;44955:10;44966:5;44955:17;;;;;;;;:::i;:::-;;;;;;;;;;44948:24;;44747:233;;;:::o;51997:111::-;40868:12;:10;:12::i;:::-;40857:23;;:7;:5;:7::i;:::-;:23;;;:94;;;;40939:12;:10;:12::i;:::-;40884:67;;40892:42;40884:67;;;40857:94;40849:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;52092:8:::1;52073:16;:27;;;;;;;;;;;;:::i;:::-;;51997:111:::0;:::o;56557:283::-;56657:7;:5;:7::i;:::-;56641:23;;:12;:10;:12::i;:::-;:23;;;:53;;;;56684:10;;;;;;;;;;;56668:26;;:12;:10;:12::i;:::-;:26;;;56641:53;56633:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;56764:18;56744:17;:38;;;;56792:43;56816:18;56792:43;;;;;;:::i;:::-;;;;;;;;56557:283;:::o;55749:264::-;55835:7;:5;:7::i;:::-;55819:23;;:12;:10;:12::i;:::-;:23;;;:53;;;;55862:10;;;;;;;;;;;55846:26;;:12;:10;:12::i;:::-;:26;;;55819:53;55811:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;55947:10;55928:16;:29;;;;55973:32;55994:10;55973:32;;;;;;:::i;:::-;;;;;;;;55749:264;:::o;28138:239::-;28210:7;28230:13;28246:7;:16;28254:7;28246:16;;;;;;;;;;;;;;;;;;;;;28230:32;;28298:1;28281:19;;:5;:19;;;;28273:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28364:5;28357:12;;;28138:239;;;:::o;50252:24::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56021:260::-;56104:7;:5;:7::i;:::-;56088:23;;:12;:10;:12::i;:::-;:23;;;:53;;;;56131:10;;;;;;;;;;;56115:26;;:12;:10;:12::i;:::-;:26;;;56088:53;56080:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;56217:10;56197:17;:30;;;;56243;56262:10;56243:30;;;;;;:::i;:::-;;;;;;;;56021:260;:::o;53588:390::-;40868:12;:10;:12::i;:::-;40857:23;;:7;:5;:7::i;:::-;:23;;;:94;;;;40939:12;:10;:12::i;:::-;40884:67;;40892:42;40884:67;;;40857:94;40849:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;53703:5:::1;:12;53688:4;:11;:27;:49;;;;;53734:3;53719:4;:11;:18;;53688:49;:72;;;;;53757:3;53741:5;:12;:19;;53688:72;53680:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;53820:6;53816:158;53836:4;:11;53832:1;:15;53816:158;;;53869:28;53879:5;53885:1;53879:8;;;;;;;;:::i;:::-;;;;;;;;53889:4;53894:1;53889:7;;;;;;;;:::i;:::-;;;;;;;;53869:9;:28::i;:::-;53961:1;53932:16;:26;53949:5;53955:1;53949:8;;;;;;;;:::i;:::-;;;;;;;;53932:26;;;;;;;;;;;;;;;;:30;;;;:::i;:::-;53903:16;:26;53920:5;53926:1;53920:8;;;;;;;;:::i;:::-;;;;;;;;53903:26;;;;;;;;;;;;;;;:59;;;;53849:3;;;;;:::i;:::-;;;;53816:158;;;;53588:390:::0;;:::o;27868:208::-;27940:7;27985:1;27968:19;;:5;:19;;;;27960:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;28052:9;:16;28062:5;28052:16;;;;;;;;;;;;;;;;28045:23;;27868:208;;;:::o;41359:94::-;40868:12;:10;:12::i;:::-;40857:23;;:7;:5;:7::i;:::-;:23;;;:94;;;;40939:12;:10;:12::i;:::-;40884:67;;40892:42;40884:67;;;40857:94;40849:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;41424:21:::1;41442:1;41424:9;:21::i;:::-;41359:94::o:0;50458:35::-;;;;:::o;50283:45::-;;;;:::o;40637:87::-;40683:7;40710:6;;;;;;;;;;;40703:13;;40637:87;:::o;55384:331::-;55479:7;:5;:7::i;:::-;55463:23;;:12;:10;:12::i;:::-;:23;;;:53;;;;55506:10;;;;;;;;;;;55490:26;;:12;:10;:12::i;:::-;:26;;;55463:53;55455:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;55576:6;55572:89;55592:8;:15;55588:1;:19;55572:89;;;55650:5;55620:14;:27;55635:8;55644:1;55635:11;;;;;;;;:::i;:::-;;;;;;;;55620:27;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;55609:3;;;;;:::i;:::-;;;;55572:89;;;;55676:31;55698:8;55676:31;;;;;;:::i;:::-;;;;;;;;55384:331;:::o;50347:52::-;;;;:::o;28613:104::-;28669:13;28702:7;28695:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28613:104;:::o;50866:73::-;;;;;;;;;;;;;:::o;30305:295::-;30420:12;:10;:12::i;:::-;30408:24;;:8;:24;;;;30400:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;30520:8;30475:18;:32;30494:12;:10;:12::i;:::-;30475:32;;;;;;;;;;;;;;;:42;30508:8;30475:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;30573:8;30544:48;;30559:12;:10;:12::i;:::-;30544:48;;;30583:8;30544:48;;;;;;:::i;:::-;;;;;;;;30305:295;;:::o;31568:328::-;31743:41;31762:12;:10;:12::i;:::-;31776:7;31743:18;:41::i;:::-;31735:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;31849:39;31863:4;31869:2;31873:7;31882:5;31849:13;:39::i;:::-;31568:328;;;;:::o;51476:139::-;40868:12;:10;:12::i;:::-;40857:23;;:7;:5;:7::i;:::-;:23;;;:94;;;;40939:12;:10;:12::i;:::-;40884:67;;40892:42;40884:67;;;40857:94;40849:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;51575:7:::1;51559:13;;:23;;;;;;;;;;;;;;;;;;51603:7;51587:13;;:23;;;;;;;;;;;;;;;;;;51476:139:::0;;:::o;53986:1036::-;54056:13;54072:10;;54056:26;;54098:12;;;;;;;;;;;54093:170;;54135:14;:26;54150:10;54135:26;;;;;;;;;;;;;;;;;;;;;;;;;54127:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;54234:17;;54226:25;;54093:170;54301:16;;54283:14;:34;;54275:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;54417:17;;54399:14;54368:16;:28;54385:10;54368:28;;;;;;;;;;;;;;;;:45;;;;:::i;:::-;:66;;54360:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;54528:10;;54510:14;54497:10;;:27;;;;:::i;:::-;:41;;54488:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;54630:9;54612:14;54604:5;:22;;;;:::i;:::-;:35;;54596:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;54692:6;54688:240;54708:14;54704:1;:18;54688:240;;;54744:14;54774:1;54761:10;;:14;;;;:::i;:::-;54744:31;;54807:10;;54794;;:23;54790:127;;;54838:32;54848:10;54860:9;54838;:32::i;:::-;54889:10;;:12;;;;;;;;;:::i;:::-;;;;;;54790:127;54729:199;54724:3;;;;;:::i;:::-;;;;54688:240;;;;55000:14;54969:16;:28;54986:10;54969:28;;;;;;;;;;;;;;;;:45;;;;:::i;:::-;54938:16;:28;54955:10;54938:28;;;;;;;;;;;;;;;:76;;;;54045:977;53986:1036;:::o;50579:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;52371:475::-;52489:13;52538:16;52546:7;52538;:16::i;:::-;52520:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;52638:28;52669:10;:8;:10::i;:::-;52638:41;;52728:1;52703:14;52697:28;:32;:141;;;;;;;;;;;;;;;;;52769:14;52785:18;:7;:16;:18::i;:::-;52805:13;52752:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52697:141;52690:148;;;52371:475;;;:::o;53052:531::-;53135:7;:5;:7::i;:::-;53119:23;;:12;:10;:12::i;:::-;:23;;;:53;;;;53162:10;;;;;;;;;;;53146:26;;:12;:10;:12::i;:::-;:26;;;53119:53;53111:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;53262:10;;53244:14;53231:10;;:27;;;;:::i;:::-;:41;;53222:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;53336:6;53332:240;53352:14;53348:1;:18;53332:240;;;53388:14;53418:1;53405:10;;:14;;;;:::i;:::-;53388:31;;53451:10;;53438;;:23;53434:127;;;53482:32;53492:10;53504:9;53482;:32::i;:::-;53533:10;;:12;;;;;;;;;:::i;:::-;;;;;;53434:127;53373:199;53368:3;;;;;:::i;:::-;;;;53332:240;;;;53052:531;:::o;30671:164::-;30768:4;30792:18;:25;30811:5;30792:25;;;;;;;;;;;;;;;:35;30818:8;30792:35;;;;;;;;;;;;;;;;;;;;;;;;;30785:42;;30671:164;;;;:::o;50540:32::-;;;;;;;;;;;;;:::o;41608:192::-;40868:12;:10;:12::i;:::-;40857:23;;:7;:5;:7::i;:::-;:23;;;:94;;;;40939:12;:10;:12::i;:::-;40884:67;;40892:42;40884:67;;;40857:94;40849:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;41717:1:::1;41697:22;;:8;:22;;;;41689:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41773:19;41783:8;41773:9;:19::i;:::-;41608:192:::0;:::o;50500:33::-;;;;:::o;56311:241::-;56397:7;:5;:7::i;:::-;56381:23;;:12;:10;:12::i;:::-;:23;;;:53;;;;56424:10;;;;;;;;;;;56408:26;;:12;:10;:12::i;:::-;:26;;;56381:53;56373:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;56497:11;56484:10;:24;;;;56518:29;56535:11;56518:29;;;;;;:::i;:::-;;;;;;;;56311:241;:::o;52241:108::-;40868:12;:10;:12::i;:::-;40857:23;;:7;:5;:7::i;:::-;:23;;;:94;;;;40939:12;:10;:12::i;:::-;40884:67;;40892:42;40884:67;;;40857:94;40849:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;52331:10:::1;52318;:23;;;;;;;;;;;;:::i;:::-;;52241:108:::0;:::o;43917:224::-;44019:4;44058:35;44043:50;;;:11;:50;;;;:90;;;;44097:36;44121:11;44097:23;:36::i;:::-;44043:90;44036:97;;43917:224;;;:::o;33406:127::-;33471:4;33523:1;33495:30;;:7;:16;33503:7;33495:16;;;;;;;;;;;;;;;;;;;;;:30;;;;33488:37;;33406:127;;;:::o;15957:98::-;16010:7;16037:10;16030:17;;15957:98;:::o;37388:174::-;37490:2;37463:15;:24;37479:7;37463:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;37546:7;37542:2;37508:46;;37517:23;37532:7;37517:14;:23::i;:::-;37508:46;;;;;;;;;;;;37388:174;;:::o;33700:348::-;33793:4;33818:16;33826:7;33818;:16::i;:::-;33810:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33894:13;33910:23;33925:7;33910:14;:23::i;:::-;33894:39;;33963:5;33952:16;;:7;:16;;;:51;;;;33996:7;33972:31;;:20;33984:7;33972:11;:20::i;:::-;:31;;;33952:51;:87;;;;34007:32;34024:5;34031:7;34007:16;:32::i;:::-;33952:87;33944:96;;;33700:348;;;;:::o;36692:578::-;36851:4;36824:31;;:23;36839:7;36824:14;:23::i;:::-;:31;;;36816:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;36934:1;36920:16;;:2;:16;;;;36912:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;36990:39;37011:4;37017:2;37021:7;36990:20;:39::i;:::-;37094:29;37111:1;37115:7;37094:8;:29::i;:::-;37155:1;37136:9;:15;37146:4;37136:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;37184:1;37167:9;:13;37177:2;37167:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;37215:2;37196:7;:16;37204:7;37196:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;37254:7;37250:2;37235:27;;37244:4;37235:27;;;;;;;;;;;;36692:578;;;:::o;20093:98::-;20151:7;20182:1;20178;:5;;;;:::i;:::-;20171:12;;20093:98;;;;:::o;19694:::-;19752:7;19783:1;19779;:5;;;;:::i;:::-;19772:12;;19694:98;;;;:::o;34390:110::-;34466:26;34476:2;34480:7;34466:26;;;;;;;;;;;;:9;:26::i;:::-;34390:110;;:::o;41808:173::-;41864:16;41883:6;;;;;;;;;;;41864:25;;41909:8;41900:6;;:17;;;;;;;;;;;;;;;;;;41964:8;41933:40;;41954:8;41933:40;;;;;;;;;;;;41853:128;41808:173;:::o;32778:315::-;32935:28;32945:4;32951:2;32955:7;32935:9;:28::i;:::-;32982:48;33005:4;33011:2;33015:7;33024:5;32982:22;:48::i;:::-;32974:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;32778:315;;;;:::o;52116:117::-;52176:13;52209:16;52202:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52116:117;:::o;23438:723::-;23494:13;23724:1;23715:5;:10;23711:53;;;23742:10;;;;;;;;;;;;;;;;;;;;;23711:53;23774:12;23789:5;23774:20;;23805:14;23830:78;23845:1;23837:4;:9;23830:78;;23863:8;;;;;:::i;:::-;;;;23894:2;23886:10;;;;;:::i;:::-;;;23830:78;;;23918:19;23950:6;23940:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23918:39;;23968:154;23984:1;23975:5;:10;23968:154;;24012:1;24002:11;;;;;:::i;:::-;;;24079:2;24071:5;:10;;;;:::i;:::-;24058:2;:24;;;;:::i;:::-;24045:39;;24028:6;24035;24028:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;24108:2;24099:11;;;;;:::i;:::-;;;23968:154;;;24146:6;24132:21;;;;;23438:723;;;;:::o;27499:305::-;27601:4;27653:25;27638:40;;;:11;:40;;;;:105;;;;27710:33;27695:48;;;:11;:48;;;;27638:105;:158;;;;27760:36;27784:11;27760:23;:36::i;:::-;27638:158;27618:178;;27499:305;;;:::o;51621:181::-;51749:45;51776:4;51782:2;51786:7;51749:26;:45::i;:::-;51621:181;;;:::o;34727:321::-;34857:18;34863:2;34867:7;34857:5;:18::i;:::-;34908:54;34939:1;34943:2;34947:7;34956:5;34908:22;:54::i;:::-;34886:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;34727:321;;;:::o;38127:803::-;38282:4;38303:15;:2;:13;;;:15::i;:::-;38299:624;;;38355:2;38339:36;;;38376:12;:10;:12::i;:::-;38390:4;38396:7;38405:5;38339:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38335:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38602:1;38585:6;:13;:18;38581:272;;;38628:60;;;;;;;;;;:::i;:::-;;;;;;;;38581:272;38803:6;38797:13;38788:6;38784:2;38780:15;38773:38;38335:533;38472:45;;;38462:55;;;:6;:55;;;;38455:62;;;;;38299:624;38907:4;38900:11;;38127:803;;;;;;;:::o;25999:157::-;26084:4;26123:25;26108:40;;;:11;:40;;;;26101:47;;25999:157;;;:::o;45593:589::-;45737:45;45764:4;45770:2;45774:7;45737:26;:45::i;:::-;45815:1;45799:18;;:4;:18;;;45795:187;;;45834:40;45866:7;45834:31;:40::i;:::-;45795:187;;;45904:2;45896:10;;:4;:10;;;45892:90;;45923:47;45956:4;45962:7;45923:32;:47::i;:::-;45892:90;45795:187;46010:1;45996:16;;:2;:16;;;45992:183;;;46029:45;46066:7;46029:36;:45::i;:::-;45992:183;;;46102:4;46096:10;;:2;:10;;;46092:83;;46123:40;46151:2;46155:7;46123:27;:40::i;:::-;46092:83;45992:183;45593:589;;;:::o;35384:382::-;35478:1;35464:16;;:2;:16;;;;35456:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;35537:16;35545:7;35537;:16::i;:::-;35536:17;35528:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;35599:45;35628:1;35632:2;35636:7;35599:20;:45::i;:::-;35674:1;35657:9;:13;35667:2;35657:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35705:2;35686:7;:16;35694:7;35686:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35750:7;35746:2;35725:33;;35742:1;35725:33;;;;;;;;;;;;35384:382;;:::o;8213:387::-;8273:4;8481:12;8548:7;8536:20;8528:28;;8591:1;8584:4;:8;8577:15;;;8213:387;;;:::o;39502:126::-;;;;:::o;46905:164::-;47009:10;:17;;;;46982:15;:24;46998:7;46982:24;;;;;;;;;;;:44;;;;47037:10;47053:7;47037:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46905:164;:::o;47696:988::-;47962:22;48012:1;47987:22;48004:4;47987:16;:22::i;:::-;:26;;;;:::i;:::-;47962:51;;48024:18;48045:17;:26;48063:7;48045:26;;;;;;;;;;;;48024:47;;48192:14;48178:10;:28;48174:328;;48223:19;48245:12;:18;48258:4;48245:18;;;;;;;;;;;;;;;:34;48264:14;48245:34;;;;;;;;;;;;48223:56;;48329:11;48296:12;:18;48309:4;48296:18;;;;;;;;;;;;;;;:30;48315:10;48296:30;;;;;;;;;;;:44;;;;48446:10;48413:17;:30;48431:11;48413:30;;;;;;;;;;;:43;;;;48208:294;48174:328;48598:17;:26;48616:7;48598:26;;;;;;;;;;;48591:33;;;48642:12;:18;48655:4;48642:18;;;;;;;;;;;;;;;:34;48661:14;48642:34;;;;;;;;;;;48635:41;;;47777:907;;47696:988;;:::o;48979:1079::-;49232:22;49277:1;49257:10;:17;;;;:21;;;;:::i;:::-;49232:46;;49289:18;49310:15;:24;49326:7;49310:24;;;;;;;;;;;;49289:45;;49661:19;49683:10;49694:14;49683:26;;;;;;;;:::i;:::-;;;;;;;;;;49661:48;;49747:11;49722:10;49733;49722:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;49858:10;49827:15;:28;49843:11;49827:28;;;;;;;;;;;:41;;;;49999:15;:24;50015:7;49999:24;;;;;;;;;;;49992:31;;;50034:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;49050:1008;;;48979:1079;:::o;46483:221::-;46568:14;46585:20;46602:2;46585:16;:20::i;:::-;46568:37;;46643:7;46616:12;:16;46629:2;46616:16;;;;;;;;;;;;;;;:24;46633:6;46616:24;;;;;;;;;;;:34;;;;46690:6;46661:17;:26;46679:7;46661:26;;;;;;;;;;;:35;;;;46557:147;46483:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1497:410::-;1574:5;1599:65;1615:48;1656:6;1615:48;:::i;:::-;1599:65;:::i;:::-;1590:74;;1687:6;1680:5;1673:21;1725:4;1718:5;1714:16;1763:3;1754:6;1749:3;1745:16;1742:25;1739:112;;;1770:79;;:::i;:::-;1739:112;1860:41;1894:6;1889:3;1884;1860:41;:::i;:::-;1580:327;1497:410;;;;;:::o;1913:412::-;1991:5;2016:66;2032:49;2074:6;2032:49;:::i;:::-;2016:66;:::i;:::-;2007:75;;2105:6;2098:5;2091:21;2143:4;2136:5;2132:16;2181:3;2172:6;2167:3;2163:16;2160:25;2157:112;;;2188:79;;:::i;:::-;2157:112;2278:41;2312:6;2307:3;2302;2278:41;:::i;:::-;1997:328;1913:412;;;;;:::o;2331:139::-;2377:5;2415:6;2402:20;2393:29;;2431:33;2458:5;2431:33;:::i;:::-;2331:139;;;;:::o;2493:370::-;2564:5;2613:3;2606:4;2598:6;2594:17;2590:27;2580:122;;2621:79;;:::i;:::-;2580:122;2738:6;2725:20;2763:94;2853:3;2845:6;2838:4;2830:6;2826:17;2763:94;:::i;:::-;2754:103;;2570:293;2493:370;;;;:::o;2886:::-;2957:5;3006:3;2999:4;2991:6;2987:17;2983:27;2973:122;;3014:79;;:::i;:::-;2973:122;3131:6;3118:20;3156:94;3246:3;3238:6;3231:4;3223:6;3219:17;3156:94;:::i;:::-;3147:103;;2963:293;2886:370;;;;:::o;3262:133::-;3305:5;3343:6;3330:20;3321:29;;3359:30;3383:5;3359:30;:::i;:::-;3262:133;;;;:::o;3401:137::-;3446:5;3484:6;3471:20;3462:29;;3500:32;3526:5;3500:32;:::i;:::-;3401:137;;;;:::o;3544:141::-;3600:5;3631:6;3625:13;3616:22;;3647:32;3673:5;3647:32;:::i;:::-;3544:141;;;;:::o;3704:338::-;3759:5;3808:3;3801:4;3793:6;3789:17;3785:27;3775:122;;3816:79;;:::i;:::-;3775:122;3933:6;3920:20;3958:78;4032:3;4024:6;4017:4;4009:6;4005:17;3958:78;:::i;:::-;3949:87;;3765:277;3704:338;;;;:::o;4062:340::-;4118:5;4167:3;4160:4;4152:6;4148:17;4144:27;4134:122;;4175:79;;:::i;:::-;4134:122;4292:6;4279:20;4317:79;4392:3;4384:6;4377:4;4369:6;4365:17;4317:79;:::i;:::-;4308:88;;4124:278;4062:340;;;;:::o;4408:139::-;4454:5;4492:6;4479:20;4470:29;;4508:33;4535:5;4508:33;:::i;:::-;4408:139;;;;:::o;4553:329::-;4612:6;4661:2;4649:9;4640:7;4636:23;4632:32;4629:119;;;4667:79;;:::i;:::-;4629:119;4787:1;4812:53;4857:7;4848:6;4837:9;4833:22;4812:53;:::i;:::-;4802:63;;4758:117;4553:329;;;;:::o;4888:474::-;4956:6;4964;5013:2;5001:9;4992:7;4988:23;4984:32;4981:119;;;5019:79;;:::i;:::-;4981:119;5139:1;5164:53;5209:7;5200:6;5189:9;5185:22;5164:53;:::i;:::-;5154:63;;5110:117;5266:2;5292:53;5337:7;5328:6;5317:9;5313:22;5292:53;:::i;:::-;5282:63;;5237:118;4888:474;;;;;:::o;5368:619::-;5445:6;5453;5461;5510:2;5498:9;5489:7;5485:23;5481:32;5478:119;;;5516:79;;:::i;:::-;5478:119;5636:1;5661:53;5706:7;5697:6;5686:9;5682:22;5661:53;:::i;:::-;5651:63;;5607:117;5763:2;5789:53;5834:7;5825:6;5814:9;5810:22;5789:53;:::i;:::-;5779:63;;5734:118;5891:2;5917:53;5962:7;5953:6;5942:9;5938:22;5917:53;:::i;:::-;5907:63;;5862:118;5368:619;;;;;:::o;5993:943::-;6088:6;6096;6104;6112;6161:3;6149:9;6140:7;6136:23;6132:33;6129:120;;;6168:79;;:::i;:::-;6129:120;6288:1;6313:53;6358:7;6349:6;6338:9;6334:22;6313:53;:::i;:::-;6303:63;;6259:117;6415:2;6441:53;6486:7;6477:6;6466:9;6462:22;6441:53;:::i;:::-;6431:63;;6386:118;6543:2;6569:53;6614:7;6605:6;6594:9;6590:22;6569:53;:::i;:::-;6559:63;;6514:118;6699:2;6688:9;6684:18;6671:32;6730:18;6722:6;6719:30;6716:117;;;6752:79;;:::i;:::-;6716:117;6857:62;6911:7;6902:6;6891:9;6887:22;6857:62;:::i;:::-;6847:72;;6642:287;5993:943;;;;;;;:::o;6942:468::-;7007:6;7015;7064:2;7052:9;7043:7;7039:23;7035:32;7032:119;;;7070:79;;:::i;:::-;7032:119;7190:1;7215:53;7260:7;7251:6;7240:9;7236:22;7215:53;:::i;:::-;7205:63;;7161:117;7317:2;7343:50;7385:7;7376:6;7365:9;7361:22;7343:50;:::i;:::-;7333:60;;7288:115;6942:468;;;;;:::o;7416:474::-;7484:6;7492;7541:2;7529:9;7520:7;7516:23;7512:32;7509:119;;;7547:79;;:::i;:::-;7509:119;7667:1;7692:53;7737:7;7728:6;7717:9;7713:22;7692:53;:::i;:::-;7682:63;;7638:117;7794:2;7820:53;7865:7;7856:6;7845:9;7841:22;7820:53;:::i;:::-;7810:63;;7765:118;7416:474;;;;;:::o;7896:539::-;7980:6;8029:2;8017:9;8008:7;8004:23;8000:32;7997:119;;;8035:79;;:::i;:::-;7997:119;8183:1;8172:9;8168:17;8155:31;8213:18;8205:6;8202:30;8199:117;;;8235:79;;:::i;:::-;8199:117;8340:78;8410:7;8401:6;8390:9;8386:22;8340:78;:::i;:::-;8330:88;;8126:302;7896:539;;;;:::o;8441:894::-;8559:6;8567;8616:2;8604:9;8595:7;8591:23;8587:32;8584:119;;;8622:79;;:::i;:::-;8584:119;8770:1;8759:9;8755:17;8742:31;8800:18;8792:6;8789:30;8786:117;;;8822:79;;:::i;:::-;8786:117;8927:78;8997:7;8988:6;8977:9;8973:22;8927:78;:::i;:::-;8917:88;;8713:302;9082:2;9071:9;9067:18;9054:32;9113:18;9105:6;9102:30;9099:117;;;9135:79;;:::i;:::-;9099:117;9240:78;9310:7;9301:6;9290:9;9286:22;9240:78;:::i;:::-;9230:88;;9025:303;8441:894;;;;;:::o;9341:327::-;9399:6;9448:2;9436:9;9427:7;9423:23;9419:32;9416:119;;;9454:79;;:::i;:::-;9416:119;9574:1;9599:52;9643:7;9634:6;9623:9;9619:22;9599:52;:::i;:::-;9589:62;;9545:116;9341:327;;;;:::o;9674:349::-;9743:6;9792:2;9780:9;9771:7;9767:23;9763:32;9760:119;;;9798:79;;:::i;:::-;9760:119;9918:1;9943:63;9998:7;9989:6;9978:9;9974:22;9943:63;:::i;:::-;9933:73;;9889:127;9674:349;;;;:::o;10029:509::-;10098:6;10147:2;10135:9;10126:7;10122:23;10118:32;10115:119;;;10153:79;;:::i;:::-;10115:119;10301:1;10290:9;10286:17;10273:31;10331:18;10323:6;10320:30;10317:117;;;10353:79;;:::i;:::-;10317:117;10458:63;10513:7;10504:6;10493:9;10489:22;10458:63;:::i;:::-;10448:73;;10244:287;10029:509;;;;:::o;10544:329::-;10603:6;10652:2;10640:9;10631:7;10627:23;10623:32;10620:119;;;10658:79;;:::i;:::-;10620:119;10778:1;10803:53;10848:7;10839:6;10828:9;10824:22;10803:53;:::i;:::-;10793:63;;10749:117;10544:329;;;;:::o;10879:179::-;10948:10;10969:46;11011:3;11003:6;10969:46;:::i;:::-;11047:4;11042:3;11038:14;11024:28;;10879:179;;;;:::o;11064:108::-;11141:24;11159:5;11141:24;:::i;:::-;11136:3;11129:37;11064:108;;:::o;11178:118::-;11265:24;11283:5;11265:24;:::i;:::-;11260:3;11253:37;11178:118;;:::o;11332:732::-;11451:3;11480:54;11528:5;11480:54;:::i;:::-;11550:86;11629:6;11624:3;11550:86;:::i;:::-;11543:93;;11660:56;11710:5;11660:56;:::i;:::-;11739:7;11770:1;11755:284;11780:6;11777:1;11774:13;11755:284;;;11856:6;11850:13;11883:63;11942:3;11927:13;11883:63;:::i;:::-;11876:70;;11969:60;12022:6;11969:60;:::i;:::-;11959:70;;11815:224;11802:1;11799;11795:9;11790:14;;11755:284;;;11759:14;12055:3;12048:10;;11456:608;;;11332:732;;;;:::o;12070:109::-;12151:21;12166:5;12151:21;:::i;:::-;12146:3;12139:34;12070:109;;:::o;12185:360::-;12271:3;12299:38;12331:5;12299:38;:::i;:::-;12353:70;12416:6;12411:3;12353:70;:::i;:::-;12346:77;;12432:52;12477:6;12472:3;12465:4;12458:5;12454:16;12432:52;:::i;:::-;12509:29;12531:6;12509:29;:::i;:::-;12504:3;12500:39;12493:46;;12275:270;12185:360;;;;:::o;12551:364::-;12639:3;12667:39;12700:5;12667:39;:::i;:::-;12722:71;12786:6;12781:3;12722:71;:::i;:::-;12715:78;;12802:52;12847:6;12842:3;12835:4;12828:5;12824:16;12802:52;:::i;:::-;12879:29;12901:6;12879:29;:::i;:::-;12874:3;12870:39;12863:46;;12643:272;12551:364;;;;:::o;12921:377::-;13027:3;13055:39;13088:5;13055:39;:::i;:::-;13110:89;13192:6;13187:3;13110:89;:::i;:::-;13103:96;;13208:52;13253:6;13248:3;13241:4;13234:5;13230:16;13208:52;:::i;:::-;13285:6;13280:3;13276:16;13269:23;;13031:267;12921:377;;;;:::o;13328:845::-;13431:3;13468:5;13462:12;13497:36;13523:9;13497:36;:::i;:::-;13549:89;13631:6;13626:3;13549:89;:::i;:::-;13542:96;;13669:1;13658:9;13654:17;13685:1;13680:137;;;;13831:1;13826:341;;;;13647:520;;13680:137;13764:4;13760:9;13749;13745:25;13740:3;13733:38;13800:6;13795:3;13791:16;13784:23;;13680:137;;13826:341;13893:38;13925:5;13893:38;:::i;:::-;13953:1;13967:154;13981:6;13978:1;13975:13;13967:154;;;14055:7;14049:14;14045:1;14040:3;14036:11;14029:35;14105:1;14096:7;14092:15;14081:26;;14003:4;14000:1;13996:12;13991:17;;13967:154;;;14150:6;14145:3;14141:16;14134:23;;13833:334;;13647:520;;13435:738;;13328:845;;;;:::o;14179:366::-;14321:3;14342:67;14406:2;14401:3;14342:67;:::i;:::-;14335:74;;14418:93;14507:3;14418:93;:::i;:::-;14536:2;14531:3;14527:12;14520:19;;14179:366;;;:::o;14551:::-;14693:3;14714:67;14778:2;14773:3;14714:67;:::i;:::-;14707:74;;14790:93;14879:3;14790:93;:::i;:::-;14908:2;14903:3;14899:12;14892:19;;14551:366;;;:::o;14923:::-;15065:3;15086:67;15150:2;15145:3;15086:67;:::i;:::-;15079:74;;15162:93;15251:3;15162:93;:::i;:::-;15280:2;15275:3;15271:12;15264:19;;14923:366;;;:::o;15295:::-;15437:3;15458:67;15522:2;15517:3;15458:67;:::i;:::-;15451:74;;15534:93;15623:3;15534:93;:::i;:::-;15652:2;15647:3;15643:12;15636:19;;15295:366;;;:::o;15667:::-;15809:3;15830:67;15894:2;15889:3;15830:67;:::i;:::-;15823:74;;15906:93;15995:3;15906:93;:::i;:::-;16024:2;16019:3;16015:12;16008:19;;15667:366;;;:::o;16039:::-;16181:3;16202:67;16266:2;16261:3;16202:67;:::i;:::-;16195:74;;16278:93;16367:3;16278:93;:::i;:::-;16396:2;16391:3;16387:12;16380:19;;16039:366;;;:::o;16411:::-;16553:3;16574:67;16638:2;16633:3;16574:67;:::i;:::-;16567:74;;16650:93;16739:3;16650:93;:::i;:::-;16768:2;16763:3;16759:12;16752:19;;16411:366;;;:::o;16783:::-;16925:3;16946:67;17010:2;17005:3;16946:67;:::i;:::-;16939:74;;17022:93;17111:3;17022:93;:::i;:::-;17140:2;17135:3;17131:12;17124:19;;16783:366;;;:::o;17155:::-;17297:3;17318:67;17382:2;17377:3;17318:67;:::i;:::-;17311:74;;17394:93;17483:3;17394:93;:::i;:::-;17512:2;17507:3;17503:12;17496:19;;17155:366;;;:::o;17527:::-;17669:3;17690:67;17754:2;17749:3;17690:67;:::i;:::-;17683:74;;17766:93;17855:3;17766:93;:::i;:::-;17884:2;17879:3;17875:12;17868:19;;17527:366;;;:::o;17899:::-;18041:3;18062:67;18126:2;18121:3;18062:67;:::i;:::-;18055:74;;18138:93;18227:3;18138:93;:::i;:::-;18256:2;18251:3;18247:12;18240:19;;17899:366;;;:::o;18271:::-;18413:3;18434:67;18498:2;18493:3;18434:67;:::i;:::-;18427:74;;18510:93;18599:3;18510:93;:::i;:::-;18628:2;18623:3;18619:12;18612:19;;18271:366;;;:::o;18643:::-;18785:3;18806:67;18870:2;18865:3;18806:67;:::i;:::-;18799:74;;18882:93;18971:3;18882:93;:::i;:::-;19000:2;18995:3;18991:12;18984:19;;18643:366;;;:::o;19015:::-;19157:3;19178:67;19242:2;19237:3;19178:67;:::i;:::-;19171:74;;19254:93;19343:3;19254:93;:::i;:::-;19372:2;19367:3;19363:12;19356:19;;19015:366;;;:::o;19387:::-;19529:3;19550:67;19614:2;19609:3;19550:67;:::i;:::-;19543:74;;19626:93;19715:3;19626:93;:::i;:::-;19744:2;19739:3;19735:12;19728:19;;19387:366;;;:::o;19759:::-;19901:3;19922:67;19986:2;19981:3;19922:67;:::i;:::-;19915:74;;19998:93;20087:3;19998:93;:::i;:::-;20116:2;20111:3;20107:12;20100:19;;19759:366;;;:::o;20131:::-;20273:3;20294:67;20358:2;20353:3;20294:67;:::i;:::-;20287:74;;20370:93;20459:3;20370:93;:::i;:::-;20488:2;20483:3;20479:12;20472:19;;20131:366;;;:::o;20503:::-;20645:3;20666:67;20730:2;20725:3;20666:67;:::i;:::-;20659:74;;20742:93;20831:3;20742:93;:::i;:::-;20860:2;20855:3;20851:12;20844:19;;20503:366;;;:::o;20875:::-;21017:3;21038:67;21102:2;21097:3;21038:67;:::i;:::-;21031:74;;21114:93;21203:3;21114:93;:::i;:::-;21232:2;21227:3;21223:12;21216:19;;20875:366;;;:::o;21247:::-;21389:3;21410:67;21474:2;21469:3;21410:67;:::i;:::-;21403:74;;21486:93;21575:3;21486:93;:::i;:::-;21604:2;21599:3;21595:12;21588:19;;21247:366;;;:::o;21619:::-;21761:3;21782:67;21846:2;21841:3;21782:67;:::i;:::-;21775:74;;21858:93;21947:3;21858:93;:::i;:::-;21976:2;21971:3;21967:12;21960:19;;21619:366;;;:::o;21991:::-;22133:3;22154:67;22218:2;22213:3;22154:67;:::i;:::-;22147:74;;22230:93;22319:3;22230:93;:::i;:::-;22348:2;22343:3;22339:12;22332:19;;21991:366;;;:::o;22363:::-;22505:3;22526:67;22590:2;22585:3;22526:67;:::i;:::-;22519:74;;22602:93;22691:3;22602:93;:::i;:::-;22720:2;22715:3;22711:12;22704:19;;22363:366;;;:::o;22735:::-;22877:3;22898:67;22962:2;22957:3;22898:67;:::i;:::-;22891:74;;22974:93;23063:3;22974:93;:::i;:::-;23092:2;23087:3;23083:12;23076:19;;22735:366;;;:::o;23107:::-;23249:3;23270:67;23334:2;23329:3;23270:67;:::i;:::-;23263:74;;23346:93;23435:3;23346:93;:::i;:::-;23464:2;23459:3;23455:12;23448:19;;23107:366;;;:::o;23479:::-;23621:3;23642:67;23706:2;23701:3;23642:67;:::i;:::-;23635:74;;23718:93;23807:3;23718:93;:::i;:::-;23836:2;23831:3;23827:12;23820:19;;23479:366;;;:::o;23851:118::-;23938:24;23956:5;23938:24;:::i;:::-;23933:3;23926:37;23851:118;;:::o;23975:589::-;24200:3;24222:95;24313:3;24304:6;24222:95;:::i;:::-;24215:102;;24334:95;24425:3;24416:6;24334:95;:::i;:::-;24327:102;;24446:92;24534:3;24525:6;24446:92;:::i;:::-;24439:99;;24555:3;24548:10;;23975:589;;;;;;:::o;24570:222::-;24663:4;24701:2;24690:9;24686:18;24678:26;;24714:71;24782:1;24771:9;24767:17;24758:6;24714:71;:::i;:::-;24570:222;;;;:::o;24798:640::-;24993:4;25031:3;25020:9;25016:19;25008:27;;25045:71;25113:1;25102:9;25098:17;25089:6;25045:71;:::i;:::-;25126:72;25194:2;25183:9;25179:18;25170:6;25126:72;:::i;:::-;25208;25276:2;25265:9;25261:18;25252:6;25208:72;:::i;:::-;25327:9;25321:4;25317:20;25312:2;25301:9;25297:18;25290:48;25355:76;25426:4;25417:6;25355:76;:::i;:::-;25347:84;;24798:640;;;;;;;:::o;25444:373::-;25587:4;25625:2;25614:9;25610:18;25602:26;;25674:9;25668:4;25664:20;25660:1;25649:9;25645:17;25638:47;25702:108;25805:4;25796:6;25702:108;:::i;:::-;25694:116;;25444:373;;;;:::o;25823:210::-;25910:4;25948:2;25937:9;25933:18;25925:26;;25961:65;26023:1;26012:9;26008:17;25999:6;25961:65;:::i;:::-;25823:210;;;;:::o;26039:313::-;26152:4;26190:2;26179:9;26175:18;26167:26;;26239:9;26233:4;26229:20;26225:1;26214:9;26210:17;26203:47;26267:78;26340:4;26331:6;26267:78;:::i;:::-;26259:86;;26039:313;;;;:::o;26358:419::-;26524:4;26562:2;26551:9;26547:18;26539:26;;26611:9;26605:4;26601:20;26597:1;26586:9;26582:17;26575:47;26639:131;26765:4;26639:131;:::i;:::-;26631:139;;26358:419;;;:::o;26783:::-;26949:4;26987:2;26976:9;26972:18;26964:26;;27036:9;27030:4;27026:20;27022:1;27011:9;27007:17;27000:47;27064:131;27190:4;27064:131;:::i;:::-;27056:139;;26783:419;;;:::o;27208:::-;27374:4;27412:2;27401:9;27397:18;27389:26;;27461:9;27455:4;27451:20;27447:1;27436:9;27432:17;27425:47;27489:131;27615:4;27489:131;:::i;:::-;27481:139;;27208:419;;;:::o;27633:::-;27799:4;27837:2;27826:9;27822:18;27814:26;;27886:9;27880:4;27876:20;27872:1;27861:9;27857:17;27850:47;27914:131;28040:4;27914:131;:::i;:::-;27906:139;;27633:419;;;:::o;28058:::-;28224:4;28262:2;28251:9;28247:18;28239:26;;28311:9;28305:4;28301:20;28297:1;28286:9;28282:17;28275:47;28339:131;28465:4;28339:131;:::i;:::-;28331:139;;28058:419;;;:::o;28483:::-;28649:4;28687:2;28676:9;28672:18;28664:26;;28736:9;28730:4;28726:20;28722:1;28711:9;28707:17;28700:47;28764:131;28890:4;28764:131;:::i;:::-;28756:139;;28483:419;;;:::o;28908:::-;29074:4;29112:2;29101:9;29097:18;29089:26;;29161:9;29155:4;29151:20;29147:1;29136:9;29132:17;29125:47;29189:131;29315:4;29189:131;:::i;:::-;29181:139;;28908:419;;;:::o;29333:::-;29499:4;29537:2;29526:9;29522:18;29514:26;;29586:9;29580:4;29576:20;29572:1;29561:9;29557:17;29550:47;29614:131;29740:4;29614:131;:::i;:::-;29606:139;;29333:419;;;:::o;29758:::-;29924:4;29962:2;29951:9;29947:18;29939:26;;30011:9;30005:4;30001:20;29997:1;29986:9;29982:17;29975:47;30039:131;30165:4;30039:131;:::i;:::-;30031:139;;29758:419;;;:::o;30183:::-;30349:4;30387:2;30376:9;30372:18;30364:26;;30436:9;30430:4;30426:20;30422:1;30411:9;30407:17;30400:47;30464:131;30590:4;30464:131;:::i;:::-;30456:139;;30183:419;;;:::o;30608:::-;30774:4;30812:2;30801:9;30797:18;30789:26;;30861:9;30855:4;30851:20;30847:1;30836:9;30832:17;30825:47;30889:131;31015:4;30889:131;:::i;:::-;30881:139;;30608:419;;;:::o;31033:::-;31199:4;31237:2;31226:9;31222:18;31214:26;;31286:9;31280:4;31276:20;31272:1;31261:9;31257:17;31250:47;31314:131;31440:4;31314:131;:::i;:::-;31306:139;;31033:419;;;:::o;31458:::-;31624:4;31662:2;31651:9;31647:18;31639:26;;31711:9;31705:4;31701:20;31697:1;31686:9;31682:17;31675:47;31739:131;31865:4;31739:131;:::i;:::-;31731:139;;31458:419;;;:::o;31883:::-;32049:4;32087:2;32076:9;32072:18;32064:26;;32136:9;32130:4;32126:20;32122:1;32111:9;32107:17;32100:47;32164:131;32290:4;32164:131;:::i;:::-;32156:139;;31883:419;;;:::o;32308:::-;32474:4;32512:2;32501:9;32497:18;32489:26;;32561:9;32555:4;32551:20;32547:1;32536:9;32532:17;32525:47;32589:131;32715:4;32589:131;:::i;:::-;32581:139;;32308:419;;;:::o;32733:::-;32899:4;32937:2;32926:9;32922:18;32914:26;;32986:9;32980:4;32976:20;32972:1;32961:9;32957:17;32950:47;33014:131;33140:4;33014:131;:::i;:::-;33006:139;;32733:419;;;:::o;33158:::-;33324:4;33362:2;33351:9;33347:18;33339:26;;33411:9;33405:4;33401:20;33397:1;33386:9;33382:17;33375:47;33439:131;33565:4;33439:131;:::i;:::-;33431:139;;33158:419;;;:::o;33583:::-;33749:4;33787:2;33776:9;33772:18;33764:26;;33836:9;33830:4;33826:20;33822:1;33811:9;33807:17;33800:47;33864:131;33990:4;33864:131;:::i;:::-;33856:139;;33583:419;;;:::o;34008:::-;34174:4;34212:2;34201:9;34197:18;34189:26;;34261:9;34255:4;34251:20;34247:1;34236:9;34232:17;34225:47;34289:131;34415:4;34289:131;:::i;:::-;34281:139;;34008:419;;;:::o;34433:::-;34599:4;34637:2;34626:9;34622:18;34614:26;;34686:9;34680:4;34676:20;34672:1;34661:9;34657:17;34650:47;34714:131;34840:4;34714:131;:::i;:::-;34706:139;;34433:419;;;:::o;34858:::-;35024:4;35062:2;35051:9;35047:18;35039:26;;35111:9;35105:4;35101:20;35097:1;35086:9;35082:17;35075:47;35139:131;35265:4;35139:131;:::i;:::-;35131:139;;34858:419;;;:::o;35283:::-;35449:4;35487:2;35476:9;35472:18;35464:26;;35536:9;35530:4;35526:20;35522:1;35511:9;35507:17;35500:47;35564:131;35690:4;35564:131;:::i;:::-;35556:139;;35283:419;;;:::o;35708:::-;35874:4;35912:2;35901:9;35897:18;35889:26;;35961:9;35955:4;35951:20;35947:1;35936:9;35932:17;35925:47;35989:131;36115:4;35989:131;:::i;:::-;35981:139;;35708:419;;;:::o;36133:::-;36299:4;36337:2;36326:9;36322:18;36314:26;;36386:9;36380:4;36376:20;36372:1;36361:9;36357:17;36350:47;36414:131;36540:4;36414:131;:::i;:::-;36406:139;;36133:419;;;:::o;36558:::-;36724:4;36762:2;36751:9;36747:18;36739:26;;36811:9;36805:4;36801:20;36797:1;36786:9;36782:17;36775:47;36839:131;36965:4;36839:131;:::i;:::-;36831:139;;36558:419;;;:::o;36983:::-;37149:4;37187:2;37176:9;37172:18;37164:26;;37236:9;37230:4;37226:20;37222:1;37211:9;37207:17;37200:47;37264:131;37390:4;37264:131;:::i;:::-;37256:139;;36983:419;;;:::o;37408:222::-;37501:4;37539:2;37528:9;37524:18;37516:26;;37552:71;37620:1;37609:9;37605:17;37596:6;37552:71;:::i;:::-;37408:222;;;;:::o;37636:129::-;37670:6;37697:20;;:::i;:::-;37687:30;;37726:33;37754:4;37746:6;37726:33;:::i;:::-;37636:129;;;:::o;37771:75::-;37804:6;37837:2;37831:9;37821:19;;37771:75;:::o;37852:311::-;37929:4;38019:18;38011:6;38008:30;38005:56;;;38041:18;;:::i;:::-;38005:56;38091:4;38083:6;38079:17;38071:25;;38151:4;38145;38141:15;38133:23;;37852:311;;;:::o;38169:::-;38246:4;38336:18;38328:6;38325:30;38322:56;;;38358:18;;:::i;:::-;38322:56;38408:4;38400:6;38396:17;38388:25;;38468:4;38462;38458:15;38450:23;;38169:311;;;:::o;38486:307::-;38547:4;38637:18;38629:6;38626:30;38623:56;;;38659:18;;:::i;:::-;38623:56;38697:29;38719:6;38697:29;:::i;:::-;38689:37;;38781:4;38775;38771:15;38763:23;;38486:307;;;:::o;38799:308::-;38861:4;38951:18;38943:6;38940:30;38937:56;;;38973:18;;:::i;:::-;38937:56;39011:29;39033:6;39011:29;:::i;:::-;39003:37;;39095:4;39089;39085:15;39077:23;;38799:308;;;:::o;39113:132::-;39180:4;39203:3;39195:11;;39233:4;39228:3;39224:14;39216:22;;39113:132;;;:::o;39251:141::-;39300:4;39323:3;39315:11;;39346:3;39343:1;39336:14;39380:4;39377:1;39367:18;39359:26;;39251:141;;;:::o;39398:114::-;39465:6;39499:5;39493:12;39483:22;;39398:114;;;:::o;39518:98::-;39569:6;39603:5;39597:12;39587:22;;39518:98;;;:::o;39622:99::-;39674:6;39708:5;39702:12;39692:22;;39622:99;;;:::o;39727:113::-;39797:4;39829;39824:3;39820:14;39812:22;;39727:113;;;:::o;39846:184::-;39945:11;39979:6;39974:3;39967:19;40019:4;40014:3;40010:14;39995:29;;39846:184;;;;:::o;40036:168::-;40119:11;40153:6;40148:3;40141:19;40193:4;40188:3;40184:14;40169:29;;40036:168;;;;:::o;40210:169::-;40294:11;40328:6;40323:3;40316:19;40368:4;40363:3;40359:14;40344:29;;40210:169;;;;:::o;40385:148::-;40487:11;40524:3;40509:18;;40385:148;;;;:::o;40539:305::-;40579:3;40598:20;40616:1;40598:20;:::i;:::-;40593:25;;40632:20;40650:1;40632:20;:::i;:::-;40627:25;;40786:1;40718:66;40714:74;40711:1;40708:81;40705:107;;;40792:18;;:::i;:::-;40705:107;40836:1;40833;40829:9;40822:16;;40539:305;;;;:::o;40850:185::-;40890:1;40907:20;40925:1;40907:20;:::i;:::-;40902:25;;40941:20;40959:1;40941:20;:::i;:::-;40936:25;;40980:1;40970:35;;40985:18;;:::i;:::-;40970:35;41027:1;41024;41020:9;41015:14;;40850:185;;;;:::o;41041:348::-;41081:7;41104:20;41122:1;41104:20;:::i;:::-;41099:25;;41138:20;41156:1;41138:20;:::i;:::-;41133:25;;41326:1;41258:66;41254:74;41251:1;41248:81;41243:1;41236:9;41229:17;41225:105;41222:131;;;41333:18;;:::i;:::-;41222:131;41381:1;41378;41374:9;41363:20;;41041:348;;;;:::o;41395:191::-;41435:4;41455:20;41473:1;41455:20;:::i;:::-;41450:25;;41489:20;41507:1;41489:20;:::i;:::-;41484:25;;41528:1;41525;41522:8;41519:34;;;41533:18;;:::i;:::-;41519:34;41578:1;41575;41571:9;41563:17;;41395:191;;;;:::o;41592:96::-;41629:7;41658:24;41676:5;41658:24;:::i;:::-;41647:35;;41592:96;;;:::o;41694:90::-;41728:7;41771:5;41764:13;41757:21;41746:32;;41694:90;;;:::o;41790:149::-;41826:7;41866:66;41859:5;41855:78;41844:89;;41790:149;;;:::o;41945:126::-;41982:7;42022:42;42015:5;42011:54;42000:65;;41945:126;;;:::o;42077:77::-;42114:7;42143:5;42132:16;;42077:77;;;:::o;42160:154::-;42244:6;42239:3;42234;42221:30;42306:1;42297:6;42292:3;42288:16;42281:27;42160:154;;;:::o;42320:307::-;42388:1;42398:113;42412:6;42409:1;42406:13;42398:113;;;42497:1;42492:3;42488:11;42482:18;42478:1;42473:3;42469:11;42462:39;42434:2;42431:1;42427:10;42422:15;;42398:113;;;42529:6;42526:1;42523:13;42520:101;;;42609:1;42600:6;42595:3;42591:16;42584:27;42520:101;42369:258;42320:307;;;:::o;42633:320::-;42677:6;42714:1;42708:4;42704:12;42694:22;;42761:1;42755:4;42751:12;42782:18;42772:81;;42838:4;42830:6;42826:17;42816:27;;42772:81;42900:2;42892:6;42889:14;42869:18;42866:38;42863:84;;;42919:18;;:::i;:::-;42863:84;42684:269;42633:320;;;:::o;42959:281::-;43042:27;43064:4;43042:27;:::i;:::-;43034:6;43030:40;43172:6;43160:10;43157:22;43136:18;43124:10;43121:34;43118:62;43115:88;;;43183:18;;:::i;:::-;43115:88;43223:10;43219:2;43212:22;43002:238;42959:281;;:::o;43246:233::-;43285:3;43308:24;43326:5;43308:24;:::i;:::-;43299:33;;43354:66;43347:5;43344:77;43341:103;;;43424:18;;:::i;:::-;43341:103;43471:1;43464:5;43460:13;43453:20;;43246:233;;;:::o;43485:176::-;43517:1;43534:20;43552:1;43534:20;:::i;:::-;43529:25;;43568:20;43586:1;43568:20;:::i;:::-;43563:25;;43607:1;43597:35;;43612:18;;:::i;:::-;43597:35;43653:1;43650;43646:9;43641:14;;43485:176;;;;:::o;43667:180::-;43715:77;43712:1;43705:88;43812:4;43809:1;43802:15;43836:4;43833:1;43826:15;43853:180;43901:77;43898:1;43891:88;43998:4;43995:1;43988:15;44022:4;44019:1;44012:15;44039:180;44087:77;44084:1;44077:88;44184:4;44181:1;44174:15;44208:4;44205:1;44198:15;44225:180;44273:77;44270:1;44263:88;44370:4;44367:1;44360:15;44394:4;44391:1;44384:15;44411:180;44459:77;44456:1;44449:88;44556:4;44553:1;44546:15;44580:4;44577:1;44570:15;44597:180;44645:77;44642:1;44635:88;44742:4;44739:1;44732:15;44766:4;44763:1;44756:15;44783:117;44892:1;44889;44882:12;44906:117;45015:1;45012;45005:12;45029:117;45138:1;45135;45128:12;45152:117;45261:1;45258;45251:12;45275:117;45384:1;45381;45374:12;45398:102;45439:6;45490:2;45486:7;45481:2;45474:5;45470:14;45466:28;45456:38;;45398:102;;;:::o;45506:225::-;45646:34;45642:1;45634:6;45630:14;45623:58;45715:8;45710:2;45702:6;45698:15;45691:33;45506:225;:::o;45737:230::-;45877:34;45873:1;45865:6;45861:14;45854:58;45946:13;45941:2;45933:6;45929:15;45922:38;45737:230;:::o;45973:237::-;46113:34;46109:1;46101:6;46097:14;46090:58;46182:20;46177:2;46169:6;46165:15;46158:45;45973:237;:::o;46216:225::-;46356:34;46352:1;46344:6;46340:14;46333:58;46425:8;46420:2;46412:6;46408:15;46401:33;46216:225;:::o;46447:178::-;46587:30;46583:1;46575:6;46571:14;46564:54;46447:178;:::o;46631:225::-;46771:34;46767:1;46759:6;46755:14;46748:58;46840:8;46835:2;46827:6;46823:15;46816:33;46631:225;:::o;46862:232::-;47002:34;46998:1;46990:6;46986:14;46979:58;47071:15;47066:2;47058:6;47054:15;47047:40;46862:232;:::o;47100:223::-;47240:34;47236:1;47228:6;47224:14;47217:58;47309:6;47304:2;47296:6;47292:15;47285:31;47100:223;:::o;47329:175::-;47469:27;47465:1;47457:6;47453:14;47446:51;47329:175;:::o;47510:181::-;47650:33;47646:1;47638:6;47634:14;47627:57;47510:181;:::o;47697:231::-;47837:34;47833:1;47825:6;47821:14;47814:58;47906:14;47901:2;47893:6;47889:15;47882:39;47697:231;:::o;47934:243::-;48074:34;48070:1;48062:6;48058:14;48051:58;48143:26;48138:2;48130:6;48126:15;48119:51;47934:243;:::o;48183:229::-;48323:34;48319:1;48311:6;48307:14;48300:58;48392:12;48387:2;48379:6;48375:15;48368:37;48183:229;:::o;48418:228::-;48558:34;48554:1;48546:6;48542:14;48535:58;48627:11;48622:2;48614:6;48610:15;48603:36;48418:228;:::o;48652:229::-;48792:34;48788:1;48780:6;48776:14;48769:58;48861:12;48856:2;48848:6;48844:15;48837:37;48652:229;:::o;48887:182::-;49027:34;49023:1;49015:6;49011:14;49004:58;48887:182;:::o;49075:231::-;49215:34;49211:1;49203:6;49199:14;49192:58;49284:14;49279:2;49271:6;49267:15;49260:39;49075:231;:::o;49312:182::-;49452:34;49448:1;49440:6;49436:14;49429:58;49312:182;:::o;49500:228::-;49640:34;49636:1;49628:6;49624:14;49617:58;49709:11;49704:2;49696:6;49692:15;49685:36;49500:228;:::o;49734:234::-;49874:34;49870:1;49862:6;49858:14;49851:58;49943:17;49938:2;49930:6;49926:15;49919:42;49734:234;:::o;49974:220::-;50114:34;50110:1;50102:6;50098:14;50091:58;50183:3;50178:2;50170:6;50166:15;50159:28;49974:220;:::o;50200:161::-;50340:13;50336:1;50328:6;50324:14;50317:37;50200:161;:::o;50367:177::-;50507:29;50503:1;50495:6;50491:14;50484:53;50367:177;:::o;50550:236::-;50690:34;50686:1;50678:6;50674:14;50667:58;50759:19;50754:2;50746:6;50742:15;50735:44;50550:236;:::o;50792:231::-;50932:34;50928:1;50920:6;50916:14;50909:58;51001:14;50996:2;50988:6;50984:15;50977:39;50792:231;:::o;51029:227::-;51169:34;51165:1;51157:6;51153:14;51146:58;51238:10;51233:2;51225:6;51221:15;51214:35;51029:227;:::o;51262:122::-;51335:24;51353:5;51335:24;:::i;:::-;51328:5;51325:35;51315:63;;51374:1;51371;51364:12;51315:63;51262:122;:::o;51390:116::-;51460:21;51475:5;51460:21;:::i;:::-;51453:5;51450:32;51440:60;;51496:1;51493;51486:12;51440:60;51390:116;:::o;51512:120::-;51584:23;51601:5;51584:23;:::i;:::-;51577:5;51574:34;51564:62;;51622:1;51619;51612:12;51564:62;51512:120;:::o;51638:122::-;51711:24;51729:5;51711:24;:::i;:::-;51704:5;51701:35;51691:63;;51750:1;51747;51740:12;51691:63;51638:122;:::o

Swarm Source

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