ERC-721
Overview
Max Total Supply
3,000 BTP
Holders
304
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
10 BTPLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
BathTubPepes
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-07-09 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: contracts/TwistedToonz.sol // Creator: Chiru Labs pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..). * * Does not support burning tokens to address(0). * * Assumes that an owner cannot have more than the 2**128 - 1 (max value of uint128) of supply */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; struct TokenOwnership { address addr; uint64 startTimestamp; } struct AddressData { uint128 balance; uint128 numberMinted; } uint256 internal currentIndex; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { return currentIndex; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view override returns (uint256) { require(index < totalSupply(), "ERC721A: global index out of bounds"); return index; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { require(index < balanceOf(owner), "ERC721A: owner index out of bounds"); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx; address currOwnershipAddr; // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar. unchecked { for (uint256 i; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } } revert("ERC721A: unable to get token of owner by index"); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { require(owner != address(0), "ERC721A: balance query for the zero address"); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { require(owner != address(0), "ERC721A: number minted query for the zero address"); return uint256(_addressData[owner].numberMinted); } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { require(_exists(tokenId), "ERC721A: owner query for nonexistent token"); unchecked { for (uint256 curr = tokenId; curr >= 0; curr--) { TokenOwnership memory ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } revert("ERC721A: unable to determine the owner of token"); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); require(to != owner, "ERC721A: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721A: approve caller is not owner nor approved for all" ); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require(_exists(tokenId), "ERC721A: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { require(operator != _msgSender(), "ERC721A: 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 { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public override { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721A: 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`), */ function _exists(uint256 tokenId) internal view returns (bool) { return tokenId < currentIndex; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ""); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = currentIndex; require(to != address(0), "ERC721A: mint to the zero address"); require(quantity != 0, "ERC721A: quantity must be greater than 0"); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1 // updatedIndex overflows if currentIndex + quantity > 1.56e77 (2**256) - 1 unchecked { _addressData[to].balance += uint128(quantity); _addressData[to].numberMinted += uint128(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; for (uint256 i; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); if (safe) { require( _checkOnERC721Received(address(0), to, updatedIndex, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); } updatedIndex++; } currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership.addr, _msgSender())); require(isApprovedOrOwner, "ERC721A: transfer caller is not owner nor approved"); require(prevOwnership.addr == from, "ERC721A: transfer from incorrect owner"); require(to != address(0), "ERC721A: transfer to the zero address"); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId].addr = to; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721A: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } contract BathTubPepes is ERC721A, Ownable, ReentrancyGuard { string public baseURI = ""; uint public price = 0.0009 ether; uint public maxSupply = 10000; uint public freeSupply = 3000; uint public maxPerWallet = 10; bool public activated = false; constructor() ERC721A("BathTubPepes", "BTP"){} function mint(uint256 amount) external payable { require(activated, "contract not activated yet"); require(amount>0, "Amount has to be greater than 1"); require(msg.sender == tx.origin, "Smart Contracts can't mint"); require(totalSupply() + amount <= maxSupply,"Sold out"); require(numberMinted(msg.sender) + amount <= maxPerWallet, "10 per wallet"); uint cost = 0; if(totalSupply() + amount > freeSupply) cost = price*amount; require(msg.value >= cost, "free mint ended 1 BathTubPepes = 0.0009eth"); _safeMint(msg.sender, amount); } function numberMinted(address owner) public view returns (uint256) { return _numberMinted(owner); } function setBaseURI(string calldata baseURI_) external onlyOwner { baseURI = baseURI_; } function activateMint() external onlyOwner { activated = true; } function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function withdraw() external onlyOwner nonReentrant { (bool wallet, ) = payable(msg.sender).call{value: address(this).balance}(""); require(wallet, "Failed"); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"activateMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"activated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","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":[{"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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260405180602001604052806000815250600990805190602001906200002b9291906200020d565b506603328b944c4000600a55612710600b55610bb8600c55600a600d556000600e60006101000a81548160ff0219169083151502179055503480156200007057600080fd5b506040518060400160405280600c81526020017f42617468547562506570657300000000000000000000000000000000000000008152506040518060400160405280600381526020017f42545000000000000000000000000000000000000000000000000000000000008152508160019080519060200190620000f59291906200020d565b5080600290805190602001906200010e9291906200020d565b50505062000131620001256200013f60201b60201c565b6200014760201b60201c565b600160088190555062000322565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200021b90620002bd565b90600052602060002090601f0160209004810192826200023f57600085556200028b565b82601f106200025a57805160ff19168380011785556200028b565b828001600101855582156200028b579182015b828111156200028a5782518255916020019190600101906200026d565b5b5090506200029a91906200029e565b5090565b5b80821115620002b95760008160009055506001016200029f565b5090565b60006002820490506001821680620002d657607f821691505b60208210811415620002ed57620002ec620002f3565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61446380620003326000396000f3fe6080604052600436106101cd5760003560e01c80636c0360eb116100f7578063a22cb46511610095578063d5abeb0111610064578063d5abeb0114610657578063dc33e68114610682578063e985e9c5146106bf578063f2fde38b146106fc576101cd565b8063a22cb465146105b1578063b88d4fde146105da578063c87b56dd14610603578063c91c046214610640576101cd565b80638da5cb5b116100d15780638da5cb5b1461051457806395d89b411461053f578063a035b1fe1461056a578063a0712d6814610595576101cd565b80636c0360eb1461049557806370a08231146104c0578063715018a6146104fd576101cd565b806324a6ab0c1161016f578063453c23101161013e578063453c2310146103c75780634f6ccce7146103f257806355f804b31461042f5780636352211e14610458576101cd565b806324a6ab0c1461031f5780632f745c591461034a5780633ccfd60b1461038757806342842e0e1461039e576101cd565b8063095ea7b3116101ab578063095ea7b31461027757806318160ddd146102a0578063186601ca146102cb57806323b872dd146102f6576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612e07565b610725565b6040516102069190613442565b60405180910390f35b34801561021b57600080fd5b5061022461086f565b604051610231919061345d565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c9190612eae565b610901565b60405161026e91906133db565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190612dc7565b610986565b005b3480156102ac57600080fd5b506102b5610a9f565b6040516102c291906137ff565b60405180910390f35b3480156102d757600080fd5b506102e0610aa8565b6040516102ed9190613442565b60405180910390f35b34801561030257600080fd5b5061031d60048036038101906103189190612cb1565b610abb565b005b34801561032b57600080fd5b50610334610acb565b60405161034191906137ff565b60405180910390f35b34801561035657600080fd5b50610371600480360381019061036c9190612dc7565b610ad1565b60405161037e91906137ff565b60405180910390f35b34801561039357600080fd5b5061039c610cc3565b005b3480156103aa57600080fd5b506103c560048036038101906103c09190612cb1565b610e44565b005b3480156103d357600080fd5b506103dc610e64565b6040516103e991906137ff565b60405180910390f35b3480156103fe57600080fd5b5061041960048036038101906104149190612eae565b610e6a565b60405161042691906137ff565b60405180910390f35b34801561043b57600080fd5b5061045660048036038101906104519190612e61565b610ebd565b005b34801561046457600080fd5b5061047f600480360381019061047a9190612eae565b610f4f565b60405161048c91906133db565b60405180910390f35b3480156104a157600080fd5b506104aa610f65565b6040516104b7919061345d565b60405180910390f35b3480156104cc57600080fd5b506104e760048036038101906104e29190612c44565b610ff3565b6040516104f491906137ff565b60405180910390f35b34801561050957600080fd5b506105126110dc565b005b34801561052057600080fd5b50610529611164565b60405161053691906133db565b60405180910390f35b34801561054b57600080fd5b5061055461118e565b604051610561919061345d565b60405180910390f35b34801561057657600080fd5b5061057f611220565b60405161058c91906137ff565b60405180910390f35b6105af60048036038101906105aa9190612eae565b611226565b005b3480156105bd57600080fd5b506105d860048036038101906105d39190612d87565b611455565b005b3480156105e657600080fd5b5061060160048036038101906105fc9190612d04565b6115d6565b005b34801561060f57600080fd5b5061062a60048036038101906106259190612eae565b611632565b604051610637919061345d565b60405180910390f35b34801561064c57600080fd5b506106556116da565b005b34801561066357600080fd5b5061066c611773565b60405161067991906137ff565b60405180910390f35b34801561068e57600080fd5b506106a960048036038101906106a49190612c44565b611779565b6040516106b691906137ff565b60405180910390f35b3480156106cb57600080fd5b506106e660048036038101906106e19190612c71565b61178b565b6040516106f39190613442565b60405180910390f35b34801561070857600080fd5b50610723600480360381019061071e9190612c44565b61181f565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107f057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061085857507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610868575061086782611917565b5b9050919050565b60606001805461087e90613a89565b80601f01602080910402602001604051908101604052809291908181526020018280546108aa90613a89565b80156108f75780601f106108cc576101008083540402835291602001916108f7565b820191906000526020600020905b8154815290600101906020018083116108da57829003601f168201915b5050505050905090565b600061090c82611981565b61094b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610942906137bf565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061099182610f4f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f99061365f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a2161198e565b73ffffffffffffffffffffffffffffffffffffffff161480610a505750610a4f81610a4a61198e565b61178b565b5b610a8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a869061355f565b60405180910390fd5b610a9a838383611996565b505050565b60008054905090565b600e60009054906101000a900460ff1681565b610ac6838383611a48565b505050565b600c5481565b6000610adc83610ff3565b8210610b1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b149061347f565b60405180910390fd5b6000610b27610a9f565b905060008060005b83811015610c81576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610c2157806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c735786841415610c6a578195505050505050610cbd565b83806001019450505b508080600101915050610b2f565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb49061373f565b60405180910390fd5b92915050565b610ccb61198e565b73ffffffffffffffffffffffffffffffffffffffff16610ce9611164565b73ffffffffffffffffffffffffffffffffffffffff1614610d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d36906135df565b60405180910390fd5b60026008541415610d85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7c9061375f565b60405180910390fd5b600260088190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610db3906133c6565b60006040518083038185875af1925050503d8060008114610df0576040519150601f19603f3d011682016040523d82523d6000602084013e610df5565b606091505b5050905080610e39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e30906134df565b60405180910390fd5b506001600881905550565b610e5f838383604051806020016040528060008152506115d6565b505050565b600d5481565b6000610e74610a9f565b8210610eb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eac906134ff565b60405180910390fd5b819050919050565b610ec561198e565b73ffffffffffffffffffffffffffffffffffffffff16610ee3611164565b73ffffffffffffffffffffffffffffffffffffffff1614610f39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f30906135df565b60405180910390fd5b818160099190610f4a929190612a38565b505050565b6000610f5a82611f88565b600001519050919050565b60098054610f7290613a89565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9e90613a89565b8015610feb5780601f10610fc057610100808354040283529160200191610feb565b820191906000526020600020905b815481529060010190602001808311610fce57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611064576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105b9061359f565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6110e461198e565b73ffffffffffffffffffffffffffffffffffffffff16611102611164565b73ffffffffffffffffffffffffffffffffffffffff1614611158576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114f906135df565b60405180910390fd5b6111626000612122565b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606002805461119d90613a89565b80601f01602080910402602001604051908101604052809291908181526020018280546111c990613a89565b80156112165780601f106111eb57610100808354040283529160200191611216565b820191906000526020600020905b8154815290600101906020018083116111f957829003601f168201915b5050505050905090565b600a5481565b600e60009054906101000a900460ff16611275576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126c9061379f565b60405180910390fd5b600081116112b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112af9061357f565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611326576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131d906137df565b60405180910390fd5b600b5481611332610a9f565b61133c91906138be565b111561137d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113749061367f565b60405180910390fd5b600d548161138a33611779565b61139491906138be565b11156113d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cc906136bf565b60405180910390fd5b6000600c54826113e3610a9f565b6113ed91906138be565b11156114045781600a546114019190613945565b90505b80341015611447576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143e906136df565b60405180910390fd5b61145133836121e8565b5050565b61145d61198e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c29061361f565b60405180910390fd5b80600660006114d861198e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661158561198e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115ca9190613442565b60405180910390a35050565b6115e1848484611a48565b6115ed84848484612206565b61162c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116239061369f565b60405180910390fd5b50505050565b606061163d82611981565b61167c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611673906135ff565b60405180910390fd5b600061168661239d565b90506000815114156116a757604051806020016040528060008152506116d2565b806116b18461242f565b6040516020016116c29291906133a2565b6040516020818303038152906040525b915050919050565b6116e261198e565b73ffffffffffffffffffffffffffffffffffffffff16611700611164565b73ffffffffffffffffffffffffffffffffffffffff1614611756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174d906135df565b60405180910390fd5b6001600e60006101000a81548160ff021916908315150217905550565b600b5481565b600061178482612590565b9050919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61182761198e565b73ffffffffffffffffffffffffffffffffffffffff16611845611164565b73ffffffffffffffffffffffffffffffffffffffff161461189b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611892906135df565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561190b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119029061349f565b60405180910390fd5b61191481612122565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611a5382611f88565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611a7a61198e565b73ffffffffffffffffffffffffffffffffffffffff161480611ad65750611a9f61198e565b73ffffffffffffffffffffffffffffffffffffffff16611abe84610901565b73ffffffffffffffffffffffffffffffffffffffff16145b80611af25750611af18260000151611aec61198e565b61178b565b5b905080611b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2b9061363f565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611ba6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9d906135bf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611c16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0d9061351f565b60405180910390fd5b611c238585856001612679565b611c336000848460000151611996565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611f1857611e7781611981565b15611f175782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f81858585600161267f565b5050505050565b611f90612abe565b611f9982611981565b611fd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fcf906134bf565b60405180910390fd5b60008290505b600081106120e1576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146120d257809250505061211d565b50808060019003915050611fde565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121149061377f565b60405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612202828260405180602001604052806000815250612685565b5050565b60006122278473ffffffffffffffffffffffffffffffffffffffff16612697565b15612390578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261225061198e565b8786866040518563ffffffff1660e01b815260040161227294939291906133f6565b602060405180830381600087803b15801561228c57600080fd5b505af19250505080156122bd57506040513d601f19601f820116820180604052508101906122ba9190612e34565b60015b612340573d80600081146122ed576040519150601f19603f3d011682016040523d82523d6000602084013e6122f2565b606091505b50600081511415612338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232f9061369f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612395565b600190505b949350505050565b6060600980546123ac90613a89565b80601f01602080910402602001604051908101604052809291908181526020018280546123d890613a89565b80156124255780601f106123fa57610100808354040283529160200191612425565b820191906000526020600020905b81548152906001019060200180831161240857829003601f168201915b5050505050905090565b60606000821415612477576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061258b565b600082905060005b600082146124a957808061249290613aec565b915050600a826124a29190613914565b915061247f565b60008167ffffffffffffffff8111156124c5576124c4613c22565b5b6040519080825280601f01601f1916602001820160405280156124f75781602001600182028036833780820191505090505b5090505b6000851461258457600182612510919061399f565b9150600a8561251f9190613b35565b603061252b91906138be565b60f81b81838151811061254157612540613bf3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561257d9190613914565b94506124fb565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612601576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f89061353f565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b50505050565b50505050565b61269283838360016126ba565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612730576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612727906136ff565b60405180910390fd5b6000841415612774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276b9061371f565b60405180910390fd5b6127816000868387612679565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b85811015612a1b57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48315612a06576129c66000888488612206565b612a05576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129fc9061369f565b60405180910390fd5b5b8180600101925050808060010191505061294f565b508060008190555050612a31600086838761267f565b5050505050565b828054612a4490613a89565b90600052602060002090601f016020900481019282612a665760008555612aad565b82601f10612a7f57803560ff1916838001178555612aad565b82800160010185558215612aad579182015b82811115612aac578235825591602001919060010190612a91565b5b509050612aba9190612af8565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115612b11576000816000905550600101612af9565b5090565b6000612b28612b238461383f565b61381a565b905082815260208101848484011115612b4457612b43613c60565b5b612b4f848285613a47565b509392505050565b600081359050612b66816143d1565b92915050565b600081359050612b7b816143e8565b92915050565b600081359050612b90816143ff565b92915050565b600081519050612ba5816143ff565b92915050565b600082601f830112612bc057612bbf613c56565b5b8135612bd0848260208601612b15565b91505092915050565b60008083601f840112612bef57612bee613c56565b5b8235905067ffffffffffffffff811115612c0c57612c0b613c51565b5b602083019150836001820283011115612c2857612c27613c5b565b5b9250929050565b600081359050612c3e81614416565b92915050565b600060208284031215612c5a57612c59613c6a565b5b6000612c6884828501612b57565b91505092915050565b60008060408385031215612c8857612c87613c6a565b5b6000612c9685828601612b57565b9250506020612ca785828601612b57565b9150509250929050565b600080600060608486031215612cca57612cc9613c6a565b5b6000612cd886828701612b57565b9350506020612ce986828701612b57565b9250506040612cfa86828701612c2f565b9150509250925092565b60008060008060808587031215612d1e57612d1d613c6a565b5b6000612d2c87828801612b57565b9450506020612d3d87828801612b57565b9350506040612d4e87828801612c2f565b925050606085013567ffffffffffffffff811115612d6f57612d6e613c65565b5b612d7b87828801612bab565b91505092959194509250565b60008060408385031215612d9e57612d9d613c6a565b5b6000612dac85828601612b57565b9250506020612dbd85828601612b6c565b9150509250929050565b60008060408385031215612dde57612ddd613c6a565b5b6000612dec85828601612b57565b9250506020612dfd85828601612c2f565b9150509250929050565b600060208284031215612e1d57612e1c613c6a565b5b6000612e2b84828501612b81565b91505092915050565b600060208284031215612e4a57612e49613c6a565b5b6000612e5884828501612b96565b91505092915050565b60008060208385031215612e7857612e77613c6a565b5b600083013567ffffffffffffffff811115612e9657612e95613c65565b5b612ea285828601612bd9565b92509250509250929050565b600060208284031215612ec457612ec3613c6a565b5b6000612ed284828501612c2f565b91505092915050565b612ee4816139d3565b82525050565b612ef3816139e5565b82525050565b6000612f0482613870565b612f0e8185613886565b9350612f1e818560208601613a56565b612f2781613c6f565b840191505092915050565b6000612f3d8261387b565b612f4781856138a2565b9350612f57818560208601613a56565b612f6081613c6f565b840191505092915050565b6000612f768261387b565b612f8081856138b3565b9350612f90818560208601613a56565b80840191505092915050565b6000612fa96022836138a2565b9150612fb482613c80565b604082019050919050565b6000612fcc6026836138a2565b9150612fd782613ccf565b604082019050919050565b6000612fef602a836138a2565b9150612ffa82613d1e565b604082019050919050565b60006130126006836138a2565b915061301d82613d6d565b602082019050919050565b60006130356023836138a2565b915061304082613d96565b604082019050919050565b60006130586025836138a2565b915061306382613de5565b604082019050919050565b600061307b6031836138a2565b915061308682613e34565b604082019050919050565b600061309e6039836138a2565b91506130a982613e83565b604082019050919050565b60006130c1601f836138a2565b91506130cc82613ed2565b602082019050919050565b60006130e4602b836138a2565b91506130ef82613efb565b604082019050919050565b60006131076026836138a2565b915061311282613f4a565b604082019050919050565b600061312a6020836138a2565b915061313582613f99565b602082019050919050565b600061314d602f836138a2565b915061315882613fc2565b604082019050919050565b6000613170601a836138a2565b915061317b82614011565b602082019050919050565b60006131936032836138a2565b915061319e8261403a565b604082019050919050565b60006131b66022836138a2565b91506131c182614089565b604082019050919050565b60006131d9600083613897565b91506131e4826140d8565b600082019050919050565b60006131fc6008836138a2565b9150613207826140db565b602082019050919050565b600061321f6033836138a2565b915061322a82614104565b604082019050919050565b6000613242600d836138a2565b915061324d82614153565b602082019050919050565b6000613265602a836138a2565b91506132708261417c565b604082019050919050565b60006132886021836138a2565b9150613293826141cb565b604082019050919050565b60006132ab6028836138a2565b91506132b68261421a565b604082019050919050565b60006132ce602e836138a2565b91506132d982614269565b604082019050919050565b60006132f1601f836138a2565b91506132fc826142b8565b602082019050919050565b6000613314602f836138a2565b915061331f826142e1565b604082019050919050565b6000613337601a836138a2565b915061334282614330565b602082019050919050565b600061335a602d836138a2565b915061336582614359565b604082019050919050565b600061337d601a836138a2565b9150613388826143a8565b602082019050919050565b61339c81613a3d565b82525050565b60006133ae8285612f6b565b91506133ba8284612f6b565b91508190509392505050565b60006133d1826131cc565b9150819050919050565b60006020820190506133f06000830184612edb565b92915050565b600060808201905061340b6000830187612edb565b6134186020830186612edb565b6134256040830185613393565b81810360608301526134378184612ef9565b905095945050505050565b60006020820190506134576000830184612eea565b92915050565b600060208201905081810360008301526134778184612f32565b905092915050565b6000602082019050818103600083015261349881612f9c565b9050919050565b600060208201905081810360008301526134b881612fbf565b9050919050565b600060208201905081810360008301526134d881612fe2565b9050919050565b600060208201905081810360008301526134f881613005565b9050919050565b6000602082019050818103600083015261351881613028565b9050919050565b600060208201905081810360008301526135388161304b565b9050919050565b600060208201905081810360008301526135588161306e565b9050919050565b6000602082019050818103600083015261357881613091565b9050919050565b60006020820190508181036000830152613598816130b4565b9050919050565b600060208201905081810360008301526135b8816130d7565b9050919050565b600060208201905081810360008301526135d8816130fa565b9050919050565b600060208201905081810360008301526135f88161311d565b9050919050565b6000602082019050818103600083015261361881613140565b9050919050565b6000602082019050818103600083015261363881613163565b9050919050565b6000602082019050818103600083015261365881613186565b9050919050565b60006020820190508181036000830152613678816131a9565b9050919050565b60006020820190508181036000830152613698816131ef565b9050919050565b600060208201905081810360008301526136b881613212565b9050919050565b600060208201905081810360008301526136d881613235565b9050919050565b600060208201905081810360008301526136f881613258565b9050919050565b600060208201905081810360008301526137188161327b565b9050919050565b600060208201905081810360008301526137388161329e565b9050919050565b60006020820190508181036000830152613758816132c1565b9050919050565b60006020820190508181036000830152613778816132e4565b9050919050565b6000602082019050818103600083015261379881613307565b9050919050565b600060208201905081810360008301526137b88161332a565b9050919050565b600060208201905081810360008301526137d88161334d565b9050919050565b600060208201905081810360008301526137f881613370565b9050919050565b60006020820190506138146000830184613393565b92915050565b6000613824613835565b90506138308282613abb565b919050565b6000604051905090565b600067ffffffffffffffff82111561385a57613859613c22565b5b61386382613c6f565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006138c982613a3d565b91506138d483613a3d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561390957613908613b66565b5b828201905092915050565b600061391f82613a3d565b915061392a83613a3d565b92508261393a57613939613b95565b5b828204905092915050565b600061395082613a3d565b915061395b83613a3d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561399457613993613b66565b5b828202905092915050565b60006139aa82613a3d565b91506139b583613a3d565b9250828210156139c8576139c7613b66565b5b828203905092915050565b60006139de82613a1d565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613a74578082015181840152602081019050613a59565b83811115613a83576000848401525b50505050565b60006002820490506001821680613aa157607f821691505b60208210811415613ab557613ab4613bc4565b5b50919050565b613ac482613c6f565b810181811067ffffffffffffffff82111715613ae357613ae2613c22565b5b80604052505050565b6000613af782613a3d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b2a57613b29613b66565b5b600182019050919050565b6000613b4082613a3d565b9150613b4b83613a3d565b925082613b5b57613b5a613b95565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f4661696c65640000000000000000000000000000000000000000000000000000600082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206e756d626572206d696e74656420717565727920666f7260008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f416d6f756e742068617320746f2062652067726561746572207468616e203100600082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f536f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f3130207065722077616c6c657400000000000000000000000000000000000000600082015250565b7f66726565206d696e7420656e646564203120426174685475625065706573203d60008201527f20302e3030303965746800000000000000000000000000000000000000000000602082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f636f6e7472616374206e6f742061637469766174656420796574000000000000600082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f536d61727420436f6e7472616374732063616e2774206d696e74000000000000600082015250565b6143da816139d3565b81146143e557600080fd5b50565b6143f1816139e5565b81146143fc57600080fd5b50565b614408816139f1565b811461441357600080fd5b50565b61441f81613a3d565b811461442a57600080fd5b5056fea26469706673582212200405d6f885cef55eda7903961ec79768985d57d313304e5332aba46e3519a35664736f6c63430008070033
Deployed Bytecode
0x6080604052600436106101cd5760003560e01c80636c0360eb116100f7578063a22cb46511610095578063d5abeb0111610064578063d5abeb0114610657578063dc33e68114610682578063e985e9c5146106bf578063f2fde38b146106fc576101cd565b8063a22cb465146105b1578063b88d4fde146105da578063c87b56dd14610603578063c91c046214610640576101cd565b80638da5cb5b116100d15780638da5cb5b1461051457806395d89b411461053f578063a035b1fe1461056a578063a0712d6814610595576101cd565b80636c0360eb1461049557806370a08231146104c0578063715018a6146104fd576101cd565b806324a6ab0c1161016f578063453c23101161013e578063453c2310146103c75780634f6ccce7146103f257806355f804b31461042f5780636352211e14610458576101cd565b806324a6ab0c1461031f5780632f745c591461034a5780633ccfd60b1461038757806342842e0e1461039e576101cd565b8063095ea7b3116101ab578063095ea7b31461027757806318160ddd146102a0578063186601ca146102cb57806323b872dd146102f6576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612e07565b610725565b6040516102069190613442565b60405180910390f35b34801561021b57600080fd5b5061022461086f565b604051610231919061345d565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c9190612eae565b610901565b60405161026e91906133db565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190612dc7565b610986565b005b3480156102ac57600080fd5b506102b5610a9f565b6040516102c291906137ff565b60405180910390f35b3480156102d757600080fd5b506102e0610aa8565b6040516102ed9190613442565b60405180910390f35b34801561030257600080fd5b5061031d60048036038101906103189190612cb1565b610abb565b005b34801561032b57600080fd5b50610334610acb565b60405161034191906137ff565b60405180910390f35b34801561035657600080fd5b50610371600480360381019061036c9190612dc7565b610ad1565b60405161037e91906137ff565b60405180910390f35b34801561039357600080fd5b5061039c610cc3565b005b3480156103aa57600080fd5b506103c560048036038101906103c09190612cb1565b610e44565b005b3480156103d357600080fd5b506103dc610e64565b6040516103e991906137ff565b60405180910390f35b3480156103fe57600080fd5b5061041960048036038101906104149190612eae565b610e6a565b60405161042691906137ff565b60405180910390f35b34801561043b57600080fd5b5061045660048036038101906104519190612e61565b610ebd565b005b34801561046457600080fd5b5061047f600480360381019061047a9190612eae565b610f4f565b60405161048c91906133db565b60405180910390f35b3480156104a157600080fd5b506104aa610f65565b6040516104b7919061345d565b60405180910390f35b3480156104cc57600080fd5b506104e760048036038101906104e29190612c44565b610ff3565b6040516104f491906137ff565b60405180910390f35b34801561050957600080fd5b506105126110dc565b005b34801561052057600080fd5b50610529611164565b60405161053691906133db565b60405180910390f35b34801561054b57600080fd5b5061055461118e565b604051610561919061345d565b60405180910390f35b34801561057657600080fd5b5061057f611220565b60405161058c91906137ff565b60405180910390f35b6105af60048036038101906105aa9190612eae565b611226565b005b3480156105bd57600080fd5b506105d860048036038101906105d39190612d87565b611455565b005b3480156105e657600080fd5b5061060160048036038101906105fc9190612d04565b6115d6565b005b34801561060f57600080fd5b5061062a60048036038101906106259190612eae565b611632565b604051610637919061345d565b60405180910390f35b34801561064c57600080fd5b506106556116da565b005b34801561066357600080fd5b5061066c611773565b60405161067991906137ff565b60405180910390f35b34801561068e57600080fd5b506106a960048036038101906106a49190612c44565b611779565b6040516106b691906137ff565b60405180910390f35b3480156106cb57600080fd5b506106e660048036038101906106e19190612c71565b61178b565b6040516106f39190613442565b60405180910390f35b34801561070857600080fd5b50610723600480360381019061071e9190612c44565b61181f565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107f057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061085857507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610868575061086782611917565b5b9050919050565b60606001805461087e90613a89565b80601f01602080910402602001604051908101604052809291908181526020018280546108aa90613a89565b80156108f75780601f106108cc576101008083540402835291602001916108f7565b820191906000526020600020905b8154815290600101906020018083116108da57829003601f168201915b5050505050905090565b600061090c82611981565b61094b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610942906137bf565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061099182610f4f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f99061365f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a2161198e565b73ffffffffffffffffffffffffffffffffffffffff161480610a505750610a4f81610a4a61198e565b61178b565b5b610a8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a869061355f565b60405180910390fd5b610a9a838383611996565b505050565b60008054905090565b600e60009054906101000a900460ff1681565b610ac6838383611a48565b505050565b600c5481565b6000610adc83610ff3565b8210610b1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b149061347f565b60405180910390fd5b6000610b27610a9f565b905060008060005b83811015610c81576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610c2157806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c735786841415610c6a578195505050505050610cbd565b83806001019450505b508080600101915050610b2f565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb49061373f565b60405180910390fd5b92915050565b610ccb61198e565b73ffffffffffffffffffffffffffffffffffffffff16610ce9611164565b73ffffffffffffffffffffffffffffffffffffffff1614610d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d36906135df565b60405180910390fd5b60026008541415610d85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7c9061375f565b60405180910390fd5b600260088190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610db3906133c6565b60006040518083038185875af1925050503d8060008114610df0576040519150601f19603f3d011682016040523d82523d6000602084013e610df5565b606091505b5050905080610e39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e30906134df565b60405180910390fd5b506001600881905550565b610e5f838383604051806020016040528060008152506115d6565b505050565b600d5481565b6000610e74610a9f565b8210610eb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eac906134ff565b60405180910390fd5b819050919050565b610ec561198e565b73ffffffffffffffffffffffffffffffffffffffff16610ee3611164565b73ffffffffffffffffffffffffffffffffffffffff1614610f39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f30906135df565b60405180910390fd5b818160099190610f4a929190612a38565b505050565b6000610f5a82611f88565b600001519050919050565b60098054610f7290613a89565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9e90613a89565b8015610feb5780601f10610fc057610100808354040283529160200191610feb565b820191906000526020600020905b815481529060010190602001808311610fce57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611064576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105b9061359f565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6110e461198e565b73ffffffffffffffffffffffffffffffffffffffff16611102611164565b73ffffffffffffffffffffffffffffffffffffffff1614611158576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114f906135df565b60405180910390fd5b6111626000612122565b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606002805461119d90613a89565b80601f01602080910402602001604051908101604052809291908181526020018280546111c990613a89565b80156112165780601f106111eb57610100808354040283529160200191611216565b820191906000526020600020905b8154815290600101906020018083116111f957829003601f168201915b5050505050905090565b600a5481565b600e60009054906101000a900460ff16611275576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126c9061379f565b60405180910390fd5b600081116112b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112af9061357f565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611326576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131d906137df565b60405180910390fd5b600b5481611332610a9f565b61133c91906138be565b111561137d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113749061367f565b60405180910390fd5b600d548161138a33611779565b61139491906138be565b11156113d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cc906136bf565b60405180910390fd5b6000600c54826113e3610a9f565b6113ed91906138be565b11156114045781600a546114019190613945565b90505b80341015611447576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143e906136df565b60405180910390fd5b61145133836121e8565b5050565b61145d61198e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c29061361f565b60405180910390fd5b80600660006114d861198e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661158561198e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115ca9190613442565b60405180910390a35050565b6115e1848484611a48565b6115ed84848484612206565b61162c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116239061369f565b60405180910390fd5b50505050565b606061163d82611981565b61167c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611673906135ff565b60405180910390fd5b600061168661239d565b90506000815114156116a757604051806020016040528060008152506116d2565b806116b18461242f565b6040516020016116c29291906133a2565b6040516020818303038152906040525b915050919050565b6116e261198e565b73ffffffffffffffffffffffffffffffffffffffff16611700611164565b73ffffffffffffffffffffffffffffffffffffffff1614611756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174d906135df565b60405180910390fd5b6001600e60006101000a81548160ff021916908315150217905550565b600b5481565b600061178482612590565b9050919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61182761198e565b73ffffffffffffffffffffffffffffffffffffffff16611845611164565b73ffffffffffffffffffffffffffffffffffffffff161461189b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611892906135df565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561190b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119029061349f565b60405180910390fd5b61191481612122565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611a5382611f88565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611a7a61198e565b73ffffffffffffffffffffffffffffffffffffffff161480611ad65750611a9f61198e565b73ffffffffffffffffffffffffffffffffffffffff16611abe84610901565b73ffffffffffffffffffffffffffffffffffffffff16145b80611af25750611af18260000151611aec61198e565b61178b565b5b905080611b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2b9061363f565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611ba6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9d906135bf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611c16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0d9061351f565b60405180910390fd5b611c238585856001612679565b611c336000848460000151611996565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611f1857611e7781611981565b15611f175782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f81858585600161267f565b5050505050565b611f90612abe565b611f9982611981565b611fd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fcf906134bf565b60405180910390fd5b60008290505b600081106120e1576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146120d257809250505061211d565b50808060019003915050611fde565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121149061377f565b60405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612202828260405180602001604052806000815250612685565b5050565b60006122278473ffffffffffffffffffffffffffffffffffffffff16612697565b15612390578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261225061198e565b8786866040518563ffffffff1660e01b815260040161227294939291906133f6565b602060405180830381600087803b15801561228c57600080fd5b505af19250505080156122bd57506040513d601f19601f820116820180604052508101906122ba9190612e34565b60015b612340573d80600081146122ed576040519150601f19603f3d011682016040523d82523d6000602084013e6122f2565b606091505b50600081511415612338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232f9061369f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612395565b600190505b949350505050565b6060600980546123ac90613a89565b80601f01602080910402602001604051908101604052809291908181526020018280546123d890613a89565b80156124255780601f106123fa57610100808354040283529160200191612425565b820191906000526020600020905b81548152906001019060200180831161240857829003601f168201915b5050505050905090565b60606000821415612477576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061258b565b600082905060005b600082146124a957808061249290613aec565b915050600a826124a29190613914565b915061247f565b60008167ffffffffffffffff8111156124c5576124c4613c22565b5b6040519080825280601f01601f1916602001820160405280156124f75781602001600182028036833780820191505090505b5090505b6000851461258457600182612510919061399f565b9150600a8561251f9190613b35565b603061252b91906138be565b60f81b81838151811061254157612540613bf3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561257d9190613914565b94506124fb565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612601576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f89061353f565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b50505050565b50505050565b61269283838360016126ba565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612730576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612727906136ff565b60405180910390fd5b6000841415612774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276b9061371f565b60405180910390fd5b6127816000868387612679565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b85811015612a1b57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48315612a06576129c66000888488612206565b612a05576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129fc9061369f565b60405180910390fd5b5b8180600101925050808060010191505061294f565b508060008190555050612a31600086838761267f565b5050505050565b828054612a4490613a89565b90600052602060002090601f016020900481019282612a665760008555612aad565b82601f10612a7f57803560ff1916838001178555612aad565b82800160010185558215612aad579182015b82811115612aac578235825591602001919060010190612a91565b5b509050612aba9190612af8565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115612b11576000816000905550600101612af9565b5090565b6000612b28612b238461383f565b61381a565b905082815260208101848484011115612b4457612b43613c60565b5b612b4f848285613a47565b509392505050565b600081359050612b66816143d1565b92915050565b600081359050612b7b816143e8565b92915050565b600081359050612b90816143ff565b92915050565b600081519050612ba5816143ff565b92915050565b600082601f830112612bc057612bbf613c56565b5b8135612bd0848260208601612b15565b91505092915050565b60008083601f840112612bef57612bee613c56565b5b8235905067ffffffffffffffff811115612c0c57612c0b613c51565b5b602083019150836001820283011115612c2857612c27613c5b565b5b9250929050565b600081359050612c3e81614416565b92915050565b600060208284031215612c5a57612c59613c6a565b5b6000612c6884828501612b57565b91505092915050565b60008060408385031215612c8857612c87613c6a565b5b6000612c9685828601612b57565b9250506020612ca785828601612b57565b9150509250929050565b600080600060608486031215612cca57612cc9613c6a565b5b6000612cd886828701612b57565b9350506020612ce986828701612b57565b9250506040612cfa86828701612c2f565b9150509250925092565b60008060008060808587031215612d1e57612d1d613c6a565b5b6000612d2c87828801612b57565b9450506020612d3d87828801612b57565b9350506040612d4e87828801612c2f565b925050606085013567ffffffffffffffff811115612d6f57612d6e613c65565b5b612d7b87828801612bab565b91505092959194509250565b60008060408385031215612d9e57612d9d613c6a565b5b6000612dac85828601612b57565b9250506020612dbd85828601612b6c565b9150509250929050565b60008060408385031215612dde57612ddd613c6a565b5b6000612dec85828601612b57565b9250506020612dfd85828601612c2f565b9150509250929050565b600060208284031215612e1d57612e1c613c6a565b5b6000612e2b84828501612b81565b91505092915050565b600060208284031215612e4a57612e49613c6a565b5b6000612e5884828501612b96565b91505092915050565b60008060208385031215612e7857612e77613c6a565b5b600083013567ffffffffffffffff811115612e9657612e95613c65565b5b612ea285828601612bd9565b92509250509250929050565b600060208284031215612ec457612ec3613c6a565b5b6000612ed284828501612c2f565b91505092915050565b612ee4816139d3565b82525050565b612ef3816139e5565b82525050565b6000612f0482613870565b612f0e8185613886565b9350612f1e818560208601613a56565b612f2781613c6f565b840191505092915050565b6000612f3d8261387b565b612f4781856138a2565b9350612f57818560208601613a56565b612f6081613c6f565b840191505092915050565b6000612f768261387b565b612f8081856138b3565b9350612f90818560208601613a56565b80840191505092915050565b6000612fa96022836138a2565b9150612fb482613c80565b604082019050919050565b6000612fcc6026836138a2565b9150612fd782613ccf565b604082019050919050565b6000612fef602a836138a2565b9150612ffa82613d1e565b604082019050919050565b60006130126006836138a2565b915061301d82613d6d565b602082019050919050565b60006130356023836138a2565b915061304082613d96565b604082019050919050565b60006130586025836138a2565b915061306382613de5565b604082019050919050565b600061307b6031836138a2565b915061308682613e34565b604082019050919050565b600061309e6039836138a2565b91506130a982613e83565b604082019050919050565b60006130c1601f836138a2565b91506130cc82613ed2565b602082019050919050565b60006130e4602b836138a2565b91506130ef82613efb565b604082019050919050565b60006131076026836138a2565b915061311282613f4a565b604082019050919050565b600061312a6020836138a2565b915061313582613f99565b602082019050919050565b600061314d602f836138a2565b915061315882613fc2565b604082019050919050565b6000613170601a836138a2565b915061317b82614011565b602082019050919050565b60006131936032836138a2565b915061319e8261403a565b604082019050919050565b60006131b66022836138a2565b91506131c182614089565b604082019050919050565b60006131d9600083613897565b91506131e4826140d8565b600082019050919050565b60006131fc6008836138a2565b9150613207826140db565b602082019050919050565b600061321f6033836138a2565b915061322a82614104565b604082019050919050565b6000613242600d836138a2565b915061324d82614153565b602082019050919050565b6000613265602a836138a2565b91506132708261417c565b604082019050919050565b60006132886021836138a2565b9150613293826141cb565b604082019050919050565b60006132ab6028836138a2565b91506132b68261421a565b604082019050919050565b60006132ce602e836138a2565b91506132d982614269565b604082019050919050565b60006132f1601f836138a2565b91506132fc826142b8565b602082019050919050565b6000613314602f836138a2565b915061331f826142e1565b604082019050919050565b6000613337601a836138a2565b915061334282614330565b602082019050919050565b600061335a602d836138a2565b915061336582614359565b604082019050919050565b600061337d601a836138a2565b9150613388826143a8565b602082019050919050565b61339c81613a3d565b82525050565b60006133ae8285612f6b565b91506133ba8284612f6b565b91508190509392505050565b60006133d1826131cc565b9150819050919050565b60006020820190506133f06000830184612edb565b92915050565b600060808201905061340b6000830187612edb565b6134186020830186612edb565b6134256040830185613393565b81810360608301526134378184612ef9565b905095945050505050565b60006020820190506134576000830184612eea565b92915050565b600060208201905081810360008301526134778184612f32565b905092915050565b6000602082019050818103600083015261349881612f9c565b9050919050565b600060208201905081810360008301526134b881612fbf565b9050919050565b600060208201905081810360008301526134d881612fe2565b9050919050565b600060208201905081810360008301526134f881613005565b9050919050565b6000602082019050818103600083015261351881613028565b9050919050565b600060208201905081810360008301526135388161304b565b9050919050565b600060208201905081810360008301526135588161306e565b9050919050565b6000602082019050818103600083015261357881613091565b9050919050565b60006020820190508181036000830152613598816130b4565b9050919050565b600060208201905081810360008301526135b8816130d7565b9050919050565b600060208201905081810360008301526135d8816130fa565b9050919050565b600060208201905081810360008301526135f88161311d565b9050919050565b6000602082019050818103600083015261361881613140565b9050919050565b6000602082019050818103600083015261363881613163565b9050919050565b6000602082019050818103600083015261365881613186565b9050919050565b60006020820190508181036000830152613678816131a9565b9050919050565b60006020820190508181036000830152613698816131ef565b9050919050565b600060208201905081810360008301526136b881613212565b9050919050565b600060208201905081810360008301526136d881613235565b9050919050565b600060208201905081810360008301526136f881613258565b9050919050565b600060208201905081810360008301526137188161327b565b9050919050565b600060208201905081810360008301526137388161329e565b9050919050565b60006020820190508181036000830152613758816132c1565b9050919050565b60006020820190508181036000830152613778816132e4565b9050919050565b6000602082019050818103600083015261379881613307565b9050919050565b600060208201905081810360008301526137b88161332a565b9050919050565b600060208201905081810360008301526137d88161334d565b9050919050565b600060208201905081810360008301526137f881613370565b9050919050565b60006020820190506138146000830184613393565b92915050565b6000613824613835565b90506138308282613abb565b919050565b6000604051905090565b600067ffffffffffffffff82111561385a57613859613c22565b5b61386382613c6f565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006138c982613a3d565b91506138d483613a3d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561390957613908613b66565b5b828201905092915050565b600061391f82613a3d565b915061392a83613a3d565b92508261393a57613939613b95565b5b828204905092915050565b600061395082613a3d565b915061395b83613a3d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561399457613993613b66565b5b828202905092915050565b60006139aa82613a3d565b91506139b583613a3d565b9250828210156139c8576139c7613b66565b5b828203905092915050565b60006139de82613a1d565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613a74578082015181840152602081019050613a59565b83811115613a83576000848401525b50505050565b60006002820490506001821680613aa157607f821691505b60208210811415613ab557613ab4613bc4565b5b50919050565b613ac482613c6f565b810181811067ffffffffffffffff82111715613ae357613ae2613c22565b5b80604052505050565b6000613af782613a3d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b2a57613b29613b66565b5b600182019050919050565b6000613b4082613a3d565b9150613b4b83613a3d565b925082613b5b57613b5a613b95565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f4661696c65640000000000000000000000000000000000000000000000000000600082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206e756d626572206d696e74656420717565727920666f7260008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f416d6f756e742068617320746f2062652067726561746572207468616e203100600082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f536f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f3130207065722077616c6c657400000000000000000000000000000000000000600082015250565b7f66726565206d696e7420656e646564203120426174685475625065706573203d60008201527f20302e3030303965746800000000000000000000000000000000000000000000602082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f636f6e7472616374206e6f742061637469766174656420796574000000000000600082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f536d61727420436f6e7472616374732063616e2774206d696e74000000000000600082015250565b6143da816139d3565b81146143e557600080fd5b50565b6143f1816139e5565b81146143fc57600080fd5b50565b614408816139f1565b811461441357600080fd5b50565b61441f81613a3d565b811461442a57600080fd5b5056fea26469706673582212200405d6f885cef55eda7903961ec79768985d57d313304e5332aba46e3519a35664736f6c63430008070033
Deployed Bytecode Sourcemap
50153:1493:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37011:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38897:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40461:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39982:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35268:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50389:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41337:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50321:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35932:1007;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51466:175;;;;;;;;;;;;;:::i;:::-;;41578:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50355:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35445:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51178:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38706:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50219:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37447:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10403:103;;;;;;;;;;;;;:::i;:::-;;9752:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39066:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50250:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50475:584;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40747:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41834:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39241:337;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51280:72;;;;;;;;;;;;;:::i;:::-;;50287:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51065:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41106:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10661:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37011:372;37113:4;37165:25;37150:40;;;:11;:40;;;;:105;;;;37222:33;37207:48;;;:11;:48;;;;37150:105;:172;;;;37287:35;37272:50;;;:11;:50;;;;37150:172;:225;;;;37339:36;37363:11;37339:23;:36::i;:::-;37150:225;37130:245;;37011:372;;;:::o;38897:100::-;38951:13;38984:5;38977:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38897:100;:::o;40461:214::-;40529:7;40557:16;40565:7;40557;:16::i;:::-;40549:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;40643:15;:24;40659:7;40643:24;;;;;;;;;;;;;;;;;;;;;40636:31;;40461:214;;;:::o;39982:413::-;40055:13;40071:24;40087:7;40071:15;:24::i;:::-;40055:40;;40120:5;40114:11;;:2;:11;;;;40106:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;40215:5;40199:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;40224:37;40241:5;40248:12;:10;:12::i;:::-;40224:16;:37::i;:::-;40199:62;40177:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;40359:28;40368:2;40372:7;40381:5;40359:8;:28::i;:::-;40044:351;39982:413;;:::o;35268:100::-;35321:7;35348:12;;35341:19;;35268:100;:::o;50389:29::-;;;;;;;;;;;;;:::o;41337:170::-;41471:28;41481:4;41487:2;41491:7;41471:9;:28::i;:::-;41337:170;;;:::o;50321:29::-;;;;:::o;35932:1007::-;36021:7;36057:16;36067:5;36057:9;:16::i;:::-;36049:5;:24;36041:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;36123:22;36148:13;:11;:13::i;:::-;36123:38;;36172:19;36202:25;36391:9;36386:466;36406:14;36402:1;:18;36386:466;;;36446:31;36480:11;:14;36492:1;36480:14;;;;;;;;;;;36446:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36543:1;36517:28;;:9;:14;;;:28;;;36513:111;;36590:9;:14;;;36570:34;;36513:111;36667:5;36646:26;;:17;:26;;;36642:195;;;36716:5;36701:11;:20;36697:85;;;36757:1;36750:8;;;;;;;;;36697:85;36804:13;;;;;;;36642:195;36427:425;36422:3;;;;;;;36386:466;;;;36875:56;;;;;;;;;;:::i;:::-;;;;;;;;35932:1007;;;;;:::o;51466:175::-;9983:12;:10;:12::i;:::-;9972:23;;:7;:5;:7::i;:::-;:23;;;9964:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4726:1:::1;5324:7;;:19;;5316:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;4726:1;5457:7;:18;;;;51526:11:::2;51551:10;51543:24;;51575:21;51543:58;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51525:76;;;51616:6;51608:25;;;;;;;;;;;;:::i;:::-;;;;;;;;;51518:123;4682:1:::1;5636:7;:22;;;;51466:175::o:0;41578:185::-;41716:39;41733:4;41739:2;41743:7;41716:39;;;;;;;;;;;;:16;:39::i;:::-;41578:185;;;:::o;50355:29::-;;;;:::o;35445:187::-;35512:7;35548:13;:11;:13::i;:::-;35540:5;:21;35532:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;35619:5;35612:12;;35445:187;;;:::o;51178:96::-;9983:12;:10;:12::i;:::-;9972:23;;:7;:5;:7::i;:::-;:23;;;9964:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51260:8:::1;;51250:7;:18;;;;;;;:::i;:::-;;51178:96:::0;;:::o;38706:124::-;38770:7;38797:20;38809:7;38797:11;:20::i;:::-;:25;;;38790:32;;38706:124;;;:::o;50219:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37447:221::-;37511:7;37556:1;37539:19;;:5;:19;;;;37531:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;37632:12;:19;37645:5;37632:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;37624:36;;37617:43;;37447:221;;;:::o;10403:103::-;9983:12;:10;:12::i;:::-;9972:23;;:7;:5;:7::i;:::-;:23;;;9964:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10468:30:::1;10495:1;10468:18;:30::i;:::-;10403:103::o:0;9752:87::-;9798:7;9825:6;;;;;;;;;;;9818:13;;9752:87;:::o;39066:104::-;39122:13;39155:7;39148:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39066:104;:::o;50250:32::-;;;;:::o;50475:584::-;50540:9;;;;;;;;;;;50532:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;50602:1;50595:6;:8;50587:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;50668:9;50654:23;;:10;:23;;;50646:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;50749:9;;50739:6;50723:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;50715:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;50822:12;;50812:6;50785:24;50798:10;50785:12;:24::i;:::-;:33;;;;:::i;:::-;:49;;50777:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;50859:9;50907:10;;50898:6;50882:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;50879:59;;;50932:6;50926:5;;:12;;;;:::i;:::-;50919:19;;50879:59;50966:4;50953:9;:17;;50945:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;51024:29;51034:10;51046:6;51024:9;:29::i;:::-;50525:534;50475:584;:::o;40747:288::-;40854:12;:10;:12::i;:::-;40842:24;;:8;:24;;;;40834:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;40955:8;40910:18;:32;40929:12;:10;:12::i;:::-;40910:32;;;;;;;;;;;;;;;:42;40943:8;40910:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;41008:8;40979:48;;40994:12;:10;:12::i;:::-;40979:48;;;41018:8;40979:48;;;;;;:::i;:::-;;;;;;;;40747:288;;:::o;41834:355::-;41993:28;42003:4;42009:2;42013:7;41993:9;:28::i;:::-;42054:48;42077:4;42083:2;42087:7;42096:5;42054:22;:48::i;:::-;42032:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;41834:355;;;;:::o;39241:337::-;39314:13;39348:16;39356:7;39348;:16::i;:::-;39340:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;39429:21;39453:10;:8;:10::i;:::-;39429:34;;39506:1;39487:7;39481:21;:26;;:87;;;;;;;;;;;;;;;;;39534:7;39543:18;:7;:16;:18::i;:::-;39517:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39481:87;39474:94;;;39241:337;;;:::o;51280:72::-;9983:12;:10;:12::i;:::-;9972:23;;:7;:5;:7::i;:::-;:23;;;9964:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51342:4:::1;51330:9;;:16;;;;;;;;;;;;;;;;;;51280:72::o:0;50287:29::-;;;;:::o;51065:107::-;51123:7;51146:20;51160:5;51146:13;:20::i;:::-;51139:27;;51065:107;;;:::o;41106:164::-;41203:4;41227:18;:25;41246:5;41227:25;;;;;;;;;;;;;;;:35;41253:8;41227:35;;;;;;;;;;;;;;;;;;;;;;;;;41220:42;;41106:164;;;;:::o;10661:201::-;9983:12;:10;:12::i;:::-;9972:23;;:7;:5;:7::i;:::-;:23;;;9964:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10770:1:::1;10750:22;;:8;:22;;;;10742:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;10826:28;10845:8;10826:18;:28::i;:::-;10661:201:::0;:::o;26531:157::-;26616:4;26655:25;26640:40;;;:11;:40;;;;26633:47;;26531:157;;;:::o;42444:111::-;42501:4;42535:12;;42525:7;:22;42518:29;;42444:111;;;:::o;8476:98::-;8529:7;8556:10;8549:17;;8476:98;:::o;47364:196::-;47506:2;47479:15;:24;47495:7;47479:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;47544:7;47540:2;47524:28;;47533:5;47524:28;;;;;;;;;;;;47364:196;;;:::o;45244:2002::-;45359:35;45397:20;45409:7;45397:11;:20::i;:::-;45359:58;;45430:22;45472:13;:18;;;45456:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;45531:12;:10;:12::i;:::-;45507:36;;:20;45519:7;45507:11;:20::i;:::-;:36;;;45456:87;:154;;;;45560:50;45577:13;:18;;;45597:12;:10;:12::i;:::-;45560:16;:50::i;:::-;45456:154;45430:181;;45632:17;45624:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;45747:4;45725:26;;:13;:18;;;:26;;;45717:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;45827:1;45813:16;;:2;:16;;;;45805:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;45884:43;45906:4;45912:2;45916:7;45925:1;45884:21;:43::i;:::-;45992:49;46009:1;46013:7;46022:13;:18;;;45992:8;:49::i;:::-;46367:1;46337:12;:18;46350:4;46337:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46411:1;46383:12;:16;46396:2;46383:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46457:2;46429:11;:20;46441:7;46429:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;46519:15;46474:11;:20;46486:7;46474:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;46787:19;46819:1;46809:7;:11;46787:33;;46880:1;46839:43;;:11;:24;46851:11;46839:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;46835:295;;;46907:20;46915:11;46907:7;:20::i;:::-;46903:212;;;46984:13;:18;;;46952:11;:24;46964:11;46952:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;47067:13;:28;;;47025:11;:24;47037:11;47025:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;46903:212;46835:295;46312:829;47177:7;47173:2;47158:27;;47167:4;47158:27;;;;;;;;;;;;47196:42;47217:4;47223:2;47227:7;47236:1;47196:20;:42::i;:::-;45348:1898;;45244:2002;;;:::o;38107:537::-;38168:21;;:::i;:::-;38210:16;38218:7;38210;:16::i;:::-;38202:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;38316:12;38331:7;38316:22;;38311:245;38348:1;38340:4;:9;38311:245;;38378:31;38412:11;:17;38424:4;38412:17;;;;;;;;;;;38378:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38478:1;38452:28;;:9;:14;;;:28;;;38448:93;;38512:9;38505:16;;;;;;38448:93;38359:197;38351:6;;;;;;;;38311:245;;;;38579:57;;;;;;;;;;:::i;:::-;;;;;;;;38107:537;;;;:::o;11022:191::-;11096:16;11115:6;;;;;;;;;;;11096:25;;11141:8;11132:6;;:17;;;;;;;;;;;;;;;;;;11196:8;11165:40;;11186:8;11165:40;;;;;;;;;;;;11085:128;11022:191;:::o;42563:104::-;42632:27;42642:2;42646:8;42632:27;;;;;;;;;;;;:9;:27::i;:::-;42563:104;;:::o;48125:804::-;48280:4;48301:15;:2;:13;;;:15::i;:::-;48297:625;;;48353:2;48337:36;;;48374:12;:10;:12::i;:::-;48388:4;48394:7;48403:5;48337:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;48333:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48600:1;48583:6;:13;:18;48579:273;;;48626:61;;;;;;;;;;:::i;:::-;;;;;;;;48579:273;48802:6;48796:13;48787:6;48783:2;48779:15;48772:38;48333:534;48470:45;;;48460:55;;;:6;:55;;;;48453:62;;;;;48297:625;48906:4;48899:11;;48125:804;;;;;;;:::o;51358:102::-;51418:13;51447:7;51440:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51358:102;:::o;6038:723::-;6094:13;6324:1;6315:5;:10;6311:53;;;6342:10;;;;;;;;;;;;;;;;;;;;;6311:53;6374:12;6389:5;6374:20;;6405:14;6430:78;6445:1;6437:4;:9;6430:78;;6463:8;;;;;:::i;:::-;;;;6494:2;6486:10;;;;;:::i;:::-;;;6430:78;;;6518:19;6550:6;6540:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6518:39;;6568:154;6584:1;6575:5;:10;6568:154;;6612:1;6602:11;;;;;:::i;:::-;;;6679:2;6671:5;:10;;;;:::i;:::-;6658:2;:24;;;;:::i;:::-;6645:39;;6628:6;6635;6628:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;6708:2;6699:11;;;;;:::i;:::-;;;6568:154;;;6746:6;6732:21;;;;;6038:723;;;;:::o;37676:229::-;37737:7;37782:1;37765:19;;:5;:19;;;;37757:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;37864:12;:19;37877:5;37864:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;37856:41;;37849:48;;37676:229;;;:::o;49417:159::-;;;;;:::o;49988:158::-;;;;;:::o;43030:163::-;43153:32;43159:2;43163:8;43173:5;43180:4;43153:5;:32::i;:::-;43030:163;;;:::o;12453:326::-;12513:4;12770:1;12748:7;:19;;;:23;12741:30;;12453:326;;;:::o;43452:1538::-;43591:20;43614:12;;43591:35;;43659:1;43645:16;;:2;:16;;;;43637:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;43730:1;43718:8;:13;;43710:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;43789:61;43819:1;43823:2;43827:12;43841:8;43789:21;:61::i;:::-;44164:8;44128:12;:16;44141:2;44128:16;;;;;;;;;;;;;;;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44229:8;44188:12;:16;44201:2;44188:16;;;;;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44288:2;44255:11;:25;44267:12;44255:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;44355:15;44305:11;:25;44317:12;44305:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;44388:20;44411:12;44388:35;;44445:9;44440:415;44460:8;44456:1;:12;44440:415;;;44524:12;44520:2;44499:38;;44516:1;44499:38;;;;;;;;;;;;44560:4;44556:249;;;44623:59;44654:1;44658:2;44662:12;44676:5;44623:22;:59::i;:::-;44589:196;;;;;;;;;;;;:::i;:::-;;;;;;;;;44556:249;44825:14;;;;;;;44470:3;;;;;;;44440:415;;;;44886:12;44871;:27;;;;44103:807;44922:60;44951:1;44955:2;44959:12;44973:8;44922:20;:60::i;:::-;43580:1410;43452:1538;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:137::-;752:5;790:6;777:20;768:29;;806:32;832:5;806:32;:::i;:::-;707:137;;;;:::o;850:141::-;906:5;937:6;931:13;922:22;;953:32;979:5;953:32;:::i;:::-;850:141;;;;:::o;1010:338::-;1065:5;1114:3;1107:4;1099:6;1095:17;1091:27;1081:122;;1122:79;;:::i;:::-;1081:122;1239:6;1226:20;1264:78;1338:3;1330:6;1323:4;1315:6;1311:17;1264:78;:::i;:::-;1255:87;;1071:277;1010:338;;;;:::o;1368:553::-;1426:8;1436:6;1486:3;1479:4;1471:6;1467:17;1463:27;1453:122;;1494:79;;:::i;:::-;1453:122;1607:6;1594:20;1584:30;;1637:18;1629:6;1626:30;1623:117;;;1659:79;;:::i;:::-;1623:117;1773:4;1765:6;1761:17;1749:29;;1827:3;1819:4;1811:6;1807:17;1797:8;1793:32;1790:41;1787:128;;;1834:79;;:::i;:::-;1787:128;1368:553;;;;;:::o;1927:139::-;1973:5;2011:6;1998:20;1989:29;;2027:33;2054:5;2027:33;:::i;:::-;1927:139;;;;:::o;2072:329::-;2131:6;2180:2;2168:9;2159:7;2155:23;2151:32;2148:119;;;2186:79;;:::i;:::-;2148:119;2306:1;2331:53;2376:7;2367:6;2356:9;2352:22;2331:53;:::i;:::-;2321:63;;2277:117;2072:329;;;;:::o;2407:474::-;2475:6;2483;2532:2;2520:9;2511:7;2507:23;2503:32;2500:119;;;2538:79;;:::i;:::-;2500:119;2658:1;2683:53;2728:7;2719:6;2708:9;2704:22;2683:53;:::i;:::-;2673:63;;2629:117;2785:2;2811:53;2856:7;2847:6;2836:9;2832:22;2811:53;:::i;:::-;2801:63;;2756:118;2407:474;;;;;:::o;2887:619::-;2964:6;2972;2980;3029:2;3017:9;3008:7;3004:23;3000:32;2997:119;;;3035:79;;:::i;:::-;2997:119;3155:1;3180:53;3225:7;3216:6;3205:9;3201:22;3180:53;:::i;:::-;3170:63;;3126:117;3282:2;3308:53;3353:7;3344:6;3333:9;3329:22;3308:53;:::i;:::-;3298:63;;3253:118;3410:2;3436:53;3481:7;3472:6;3461:9;3457:22;3436:53;:::i;:::-;3426:63;;3381:118;2887:619;;;;;:::o;3512:943::-;3607:6;3615;3623;3631;3680:3;3668:9;3659:7;3655:23;3651:33;3648:120;;;3687:79;;:::i;:::-;3648:120;3807:1;3832:53;3877:7;3868:6;3857:9;3853:22;3832:53;:::i;:::-;3822:63;;3778:117;3934:2;3960:53;4005:7;3996:6;3985:9;3981:22;3960:53;:::i;:::-;3950:63;;3905:118;4062:2;4088:53;4133:7;4124:6;4113:9;4109:22;4088:53;:::i;:::-;4078:63;;4033:118;4218:2;4207:9;4203:18;4190:32;4249:18;4241:6;4238:30;4235:117;;;4271:79;;:::i;:::-;4235:117;4376:62;4430:7;4421:6;4410:9;4406:22;4376:62;:::i;:::-;4366:72;;4161:287;3512:943;;;;;;;:::o;4461:468::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:50;4904:7;4895:6;4884:9;4880:22;4862:50;:::i;:::-;4852:60;;4807:115;4461:468;;;;;:::o;4935:474::-;5003:6;5011;5060:2;5048:9;5039:7;5035:23;5031:32;5028:119;;;5066:79;;:::i;:::-;5028:119;5186:1;5211:53;5256:7;5247:6;5236:9;5232:22;5211:53;:::i;:::-;5201:63;;5157:117;5313:2;5339:53;5384:7;5375:6;5364:9;5360:22;5339:53;:::i;:::-;5329:63;;5284:118;4935:474;;;;;:::o;5415:327::-;5473:6;5522:2;5510:9;5501:7;5497:23;5493:32;5490:119;;;5528:79;;:::i;:::-;5490:119;5648:1;5673:52;5717:7;5708:6;5697:9;5693:22;5673:52;:::i;:::-;5663:62;;5619:116;5415:327;;;;:::o;5748:349::-;5817:6;5866:2;5854:9;5845:7;5841:23;5837:32;5834:119;;;5872:79;;:::i;:::-;5834:119;5992:1;6017:63;6072:7;6063:6;6052:9;6048:22;6017:63;:::i;:::-;6007:73;;5963:127;5748:349;;;;:::o;6103:529::-;6174:6;6182;6231:2;6219:9;6210:7;6206:23;6202:32;6199:119;;;6237:79;;:::i;:::-;6199:119;6385:1;6374:9;6370:17;6357:31;6415:18;6407:6;6404:30;6401:117;;;6437:79;;:::i;:::-;6401:117;6550:65;6607:7;6598:6;6587:9;6583:22;6550:65;:::i;:::-;6532:83;;;;6328:297;6103:529;;;;;:::o;6638:329::-;6697:6;6746:2;6734:9;6725:7;6721:23;6717:32;6714:119;;;6752:79;;:::i;:::-;6714:119;6872:1;6897:53;6942:7;6933:6;6922:9;6918:22;6897:53;:::i;:::-;6887:63;;6843:117;6638:329;;;;:::o;6973:118::-;7060:24;7078:5;7060:24;:::i;:::-;7055:3;7048:37;6973:118;;:::o;7097:109::-;7178:21;7193:5;7178:21;:::i;:::-;7173:3;7166:34;7097:109;;:::o;7212:360::-;7298:3;7326:38;7358:5;7326:38;:::i;:::-;7380:70;7443:6;7438:3;7380:70;:::i;:::-;7373:77;;7459:52;7504:6;7499:3;7492:4;7485:5;7481:16;7459:52;:::i;:::-;7536:29;7558:6;7536:29;:::i;:::-;7531:3;7527:39;7520:46;;7302:270;7212:360;;;;:::o;7578:364::-;7666:3;7694:39;7727:5;7694:39;:::i;:::-;7749:71;7813:6;7808:3;7749:71;:::i;:::-;7742:78;;7829:52;7874:6;7869:3;7862:4;7855:5;7851:16;7829:52;:::i;:::-;7906:29;7928:6;7906:29;:::i;:::-;7901:3;7897:39;7890:46;;7670:272;7578:364;;;;:::o;7948:377::-;8054:3;8082:39;8115:5;8082:39;:::i;:::-;8137:89;8219:6;8214:3;8137:89;:::i;:::-;8130:96;;8235:52;8280:6;8275:3;8268:4;8261:5;8257:16;8235:52;:::i;:::-;8312:6;8307:3;8303:16;8296:23;;8058:267;7948:377;;;;:::o;8331:366::-;8473:3;8494:67;8558:2;8553:3;8494:67;:::i;:::-;8487:74;;8570:93;8659:3;8570:93;:::i;:::-;8688:2;8683:3;8679:12;8672:19;;8331:366;;;:::o;8703:::-;8845:3;8866:67;8930:2;8925:3;8866:67;:::i;:::-;8859:74;;8942:93;9031:3;8942:93;:::i;:::-;9060:2;9055:3;9051:12;9044:19;;8703:366;;;:::o;9075:::-;9217:3;9238:67;9302:2;9297:3;9238:67;:::i;:::-;9231:74;;9314:93;9403:3;9314:93;:::i;:::-;9432:2;9427:3;9423:12;9416:19;;9075:366;;;:::o;9447:365::-;9589:3;9610:66;9674:1;9669:3;9610:66;:::i;:::-;9603:73;;9685:93;9774:3;9685:93;:::i;:::-;9803:2;9798:3;9794:12;9787:19;;9447:365;;;:::o;9818:366::-;9960:3;9981:67;10045:2;10040:3;9981:67;:::i;:::-;9974:74;;10057:93;10146:3;10057:93;:::i;:::-;10175:2;10170:3;10166:12;10159:19;;9818:366;;;:::o;10190:::-;10332:3;10353:67;10417:2;10412:3;10353:67;:::i;:::-;10346:74;;10429:93;10518:3;10429:93;:::i;:::-;10547:2;10542:3;10538:12;10531:19;;10190:366;;;:::o;10562:::-;10704:3;10725:67;10789:2;10784:3;10725:67;:::i;:::-;10718:74;;10801:93;10890:3;10801:93;:::i;:::-;10919:2;10914:3;10910:12;10903:19;;10562:366;;;:::o;10934:::-;11076:3;11097:67;11161:2;11156:3;11097:67;:::i;:::-;11090:74;;11173:93;11262:3;11173:93;:::i;:::-;11291:2;11286:3;11282:12;11275:19;;10934:366;;;:::o;11306:::-;11448:3;11469:67;11533:2;11528:3;11469:67;:::i;:::-;11462:74;;11545:93;11634:3;11545:93;:::i;:::-;11663:2;11658:3;11654:12;11647:19;;11306:366;;;:::o;11678:::-;11820:3;11841:67;11905:2;11900:3;11841:67;:::i;:::-;11834:74;;11917:93;12006:3;11917:93;:::i;:::-;12035:2;12030:3;12026:12;12019:19;;11678:366;;;:::o;12050:::-;12192:3;12213:67;12277:2;12272:3;12213:67;:::i;:::-;12206:74;;12289:93;12378:3;12289:93;:::i;:::-;12407:2;12402:3;12398:12;12391:19;;12050:366;;;:::o;12422:::-;12564:3;12585:67;12649:2;12644:3;12585:67;:::i;:::-;12578:74;;12661:93;12750:3;12661:93;:::i;:::-;12779:2;12774:3;12770:12;12763:19;;12422:366;;;:::o;12794:::-;12936:3;12957:67;13021:2;13016:3;12957:67;:::i;:::-;12950:74;;13033:93;13122:3;13033:93;:::i;:::-;13151:2;13146:3;13142:12;13135:19;;12794:366;;;:::o;13166:::-;13308:3;13329:67;13393:2;13388:3;13329:67;:::i;:::-;13322:74;;13405:93;13494:3;13405:93;:::i;:::-;13523:2;13518:3;13514:12;13507:19;;13166:366;;;:::o;13538:::-;13680:3;13701:67;13765:2;13760:3;13701:67;:::i;:::-;13694:74;;13777:93;13866:3;13777:93;:::i;:::-;13895:2;13890:3;13886:12;13879:19;;13538:366;;;:::o;13910:::-;14052:3;14073:67;14137:2;14132:3;14073:67;:::i;:::-;14066:74;;14149:93;14238:3;14149:93;:::i;:::-;14267:2;14262:3;14258:12;14251:19;;13910:366;;;:::o;14282:398::-;14441:3;14462:83;14543:1;14538:3;14462:83;:::i;:::-;14455:90;;14554:93;14643:3;14554:93;:::i;:::-;14672:1;14667:3;14663:11;14656:18;;14282:398;;;:::o;14686:365::-;14828:3;14849:66;14913:1;14908:3;14849:66;:::i;:::-;14842:73;;14924:93;15013:3;14924:93;:::i;:::-;15042:2;15037:3;15033:12;15026:19;;14686:365;;;:::o;15057:366::-;15199:3;15220:67;15284:2;15279:3;15220:67;:::i;:::-;15213:74;;15296:93;15385:3;15296:93;:::i;:::-;15414:2;15409:3;15405:12;15398:19;;15057:366;;;:::o;15429:::-;15571:3;15592:67;15656:2;15651:3;15592:67;:::i;:::-;15585:74;;15668:93;15757:3;15668:93;:::i;:::-;15786:2;15781:3;15777:12;15770:19;;15429:366;;;:::o;15801:::-;15943:3;15964:67;16028:2;16023:3;15964:67;:::i;:::-;15957:74;;16040:93;16129:3;16040:93;:::i;:::-;16158:2;16153:3;16149:12;16142:19;;15801:366;;;:::o;16173:::-;16315:3;16336:67;16400:2;16395:3;16336:67;:::i;:::-;16329:74;;16412:93;16501:3;16412:93;:::i;:::-;16530:2;16525:3;16521:12;16514:19;;16173:366;;;:::o;16545:::-;16687:3;16708:67;16772:2;16767:3;16708:67;:::i;:::-;16701:74;;16784:93;16873:3;16784:93;:::i;:::-;16902:2;16897:3;16893:12;16886:19;;16545:366;;;:::o;16917:::-;17059:3;17080:67;17144:2;17139:3;17080:67;:::i;:::-;17073:74;;17156:93;17245:3;17156:93;:::i;:::-;17274:2;17269:3;17265:12;17258:19;;16917:366;;;:::o;17289:::-;17431:3;17452:67;17516:2;17511:3;17452:67;:::i;:::-;17445:74;;17528:93;17617:3;17528:93;:::i;:::-;17646:2;17641:3;17637:12;17630:19;;17289:366;;;:::o;17661:::-;17803:3;17824:67;17888:2;17883:3;17824:67;:::i;:::-;17817:74;;17900:93;17989:3;17900:93;:::i;:::-;18018:2;18013:3;18009:12;18002:19;;17661:366;;;:::o;18033:::-;18175:3;18196:67;18260:2;18255:3;18196:67;:::i;:::-;18189:74;;18272:93;18361:3;18272:93;:::i;:::-;18390:2;18385:3;18381:12;18374:19;;18033:366;;;:::o;18405:::-;18547:3;18568:67;18632:2;18627:3;18568:67;:::i;:::-;18561:74;;18644:93;18733:3;18644:93;:::i;:::-;18762:2;18757:3;18753:12;18746:19;;18405:366;;;:::o;18777:::-;18919:3;18940:67;19004:2;18999:3;18940:67;:::i;:::-;18933:74;;19016:93;19105:3;19016:93;:::i;:::-;19134:2;19129:3;19125:12;19118:19;;18777:366;;;:::o;19149:118::-;19236:24;19254:5;19236:24;:::i;:::-;19231:3;19224:37;19149:118;;:::o;19273:435::-;19453:3;19475:95;19566:3;19557:6;19475:95;:::i;:::-;19468:102;;19587:95;19678:3;19669:6;19587:95;:::i;:::-;19580:102;;19699:3;19692:10;;19273:435;;;;;:::o;19714:379::-;19898:3;19920:147;20063:3;19920:147;:::i;:::-;19913:154;;20084:3;20077:10;;19714:379;;;:::o;20099:222::-;20192:4;20230:2;20219:9;20215:18;20207:26;;20243:71;20311:1;20300:9;20296:17;20287:6;20243:71;:::i;:::-;20099:222;;;;:::o;20327:640::-;20522:4;20560:3;20549:9;20545:19;20537:27;;20574:71;20642:1;20631:9;20627:17;20618:6;20574:71;:::i;:::-;20655:72;20723:2;20712:9;20708:18;20699:6;20655:72;:::i;:::-;20737;20805:2;20794:9;20790:18;20781:6;20737:72;:::i;:::-;20856:9;20850:4;20846:20;20841:2;20830:9;20826:18;20819:48;20884:76;20955:4;20946:6;20884:76;:::i;:::-;20876:84;;20327:640;;;;;;;:::o;20973:210::-;21060:4;21098:2;21087:9;21083:18;21075:26;;21111:65;21173:1;21162:9;21158:17;21149:6;21111:65;:::i;:::-;20973:210;;;;:::o;21189:313::-;21302:4;21340:2;21329:9;21325:18;21317:26;;21389:9;21383:4;21379:20;21375:1;21364:9;21360:17;21353:47;21417:78;21490:4;21481:6;21417:78;:::i;:::-;21409:86;;21189:313;;;;:::o;21508:419::-;21674:4;21712:2;21701:9;21697:18;21689:26;;21761:9;21755:4;21751:20;21747:1;21736:9;21732:17;21725:47;21789:131;21915:4;21789:131;:::i;:::-;21781:139;;21508:419;;;:::o;21933:::-;22099:4;22137:2;22126:9;22122:18;22114:26;;22186:9;22180:4;22176:20;22172:1;22161:9;22157:17;22150:47;22214:131;22340:4;22214:131;:::i;:::-;22206:139;;21933:419;;;:::o;22358:::-;22524:4;22562:2;22551:9;22547:18;22539:26;;22611:9;22605:4;22601:20;22597:1;22586:9;22582:17;22575:47;22639:131;22765:4;22639:131;:::i;:::-;22631:139;;22358:419;;;:::o;22783:::-;22949:4;22987:2;22976:9;22972:18;22964:26;;23036:9;23030:4;23026:20;23022:1;23011:9;23007:17;23000:47;23064:131;23190:4;23064:131;:::i;:::-;23056:139;;22783:419;;;:::o;23208:::-;23374:4;23412:2;23401:9;23397:18;23389:26;;23461:9;23455:4;23451:20;23447:1;23436:9;23432:17;23425:47;23489:131;23615:4;23489:131;:::i;:::-;23481:139;;23208:419;;;:::o;23633:::-;23799:4;23837:2;23826:9;23822:18;23814:26;;23886:9;23880:4;23876:20;23872:1;23861:9;23857:17;23850:47;23914:131;24040:4;23914:131;:::i;:::-;23906:139;;23633:419;;;:::o;24058:::-;24224:4;24262:2;24251:9;24247:18;24239:26;;24311:9;24305:4;24301:20;24297:1;24286:9;24282:17;24275:47;24339:131;24465:4;24339:131;:::i;:::-;24331:139;;24058:419;;;:::o;24483:::-;24649:4;24687:2;24676:9;24672:18;24664:26;;24736:9;24730:4;24726:20;24722:1;24711:9;24707:17;24700:47;24764:131;24890:4;24764:131;:::i;:::-;24756:139;;24483:419;;;:::o;24908:::-;25074:4;25112:2;25101:9;25097:18;25089:26;;25161:9;25155:4;25151:20;25147:1;25136:9;25132:17;25125:47;25189:131;25315:4;25189:131;:::i;:::-;25181:139;;24908:419;;;:::o;25333:::-;25499:4;25537:2;25526:9;25522:18;25514:26;;25586:9;25580:4;25576:20;25572:1;25561:9;25557:17;25550:47;25614:131;25740:4;25614:131;:::i;:::-;25606:139;;25333:419;;;:::o;25758:::-;25924:4;25962:2;25951:9;25947:18;25939:26;;26011:9;26005:4;26001:20;25997:1;25986:9;25982:17;25975:47;26039:131;26165:4;26039:131;:::i;:::-;26031:139;;25758:419;;;:::o;26183:::-;26349:4;26387:2;26376:9;26372:18;26364:26;;26436:9;26430:4;26426:20;26422:1;26411:9;26407:17;26400:47;26464:131;26590:4;26464:131;:::i;:::-;26456:139;;26183:419;;;:::o;26608:::-;26774:4;26812:2;26801:9;26797:18;26789:26;;26861:9;26855:4;26851:20;26847:1;26836:9;26832:17;26825:47;26889:131;27015:4;26889:131;:::i;:::-;26881:139;;26608:419;;;:::o;27033:::-;27199:4;27237:2;27226:9;27222:18;27214:26;;27286:9;27280:4;27276:20;27272:1;27261:9;27257:17;27250:47;27314:131;27440:4;27314:131;:::i;:::-;27306:139;;27033:419;;;:::o;27458:::-;27624:4;27662:2;27651:9;27647:18;27639:26;;27711:9;27705:4;27701:20;27697:1;27686:9;27682:17;27675:47;27739:131;27865:4;27739:131;:::i;:::-;27731:139;;27458:419;;;:::o;27883:::-;28049:4;28087:2;28076:9;28072:18;28064:26;;28136:9;28130:4;28126:20;28122:1;28111:9;28107:17;28100:47;28164:131;28290:4;28164:131;:::i;:::-;28156:139;;27883:419;;;:::o;28308:::-;28474:4;28512:2;28501:9;28497:18;28489:26;;28561:9;28555:4;28551:20;28547:1;28536:9;28532:17;28525:47;28589:131;28715:4;28589:131;:::i;:::-;28581:139;;28308:419;;;:::o;28733:::-;28899:4;28937:2;28926:9;28922:18;28914:26;;28986:9;28980:4;28976:20;28972:1;28961:9;28957:17;28950:47;29014:131;29140:4;29014:131;:::i;:::-;29006:139;;28733:419;;;:::o;29158:::-;29324:4;29362:2;29351:9;29347:18;29339:26;;29411:9;29405:4;29401:20;29397:1;29386:9;29382:17;29375:47;29439:131;29565:4;29439:131;:::i;:::-;29431:139;;29158:419;;;:::o;29583:::-;29749:4;29787:2;29776:9;29772:18;29764:26;;29836:9;29830:4;29826:20;29822:1;29811:9;29807:17;29800:47;29864:131;29990:4;29864:131;:::i;:::-;29856:139;;29583:419;;;:::o;30008:::-;30174:4;30212:2;30201:9;30197:18;30189:26;;30261:9;30255:4;30251:20;30247:1;30236:9;30232:17;30225:47;30289:131;30415:4;30289:131;:::i;:::-;30281:139;;30008:419;;;:::o;30433:::-;30599:4;30637:2;30626:9;30622:18;30614:26;;30686:9;30680:4;30676:20;30672:1;30661:9;30657:17;30650:47;30714:131;30840:4;30714:131;:::i;:::-;30706:139;;30433:419;;;:::o;30858:::-;31024:4;31062:2;31051:9;31047:18;31039:26;;31111:9;31105:4;31101:20;31097:1;31086:9;31082:17;31075:47;31139:131;31265:4;31139:131;:::i;:::-;31131:139;;30858:419;;;:::o;31283:::-;31449:4;31487:2;31476:9;31472:18;31464:26;;31536:9;31530:4;31526:20;31522:1;31511:9;31507:17;31500:47;31564:131;31690:4;31564:131;:::i;:::-;31556:139;;31283:419;;;:::o;31708:::-;31874:4;31912:2;31901:9;31897:18;31889:26;;31961:9;31955:4;31951:20;31947:1;31936:9;31932:17;31925:47;31989:131;32115:4;31989:131;:::i;:::-;31981:139;;31708:419;;;:::o;32133:::-;32299:4;32337:2;32326:9;32322:18;32314:26;;32386:9;32380:4;32376:20;32372:1;32361:9;32357:17;32350:47;32414:131;32540:4;32414:131;:::i;:::-;32406:139;;32133:419;;;:::o;32558:::-;32724:4;32762:2;32751:9;32747:18;32739:26;;32811:9;32805:4;32801:20;32797:1;32786:9;32782:17;32775:47;32839:131;32965:4;32839:131;:::i;:::-;32831:139;;32558:419;;;:::o;32983:::-;33149:4;33187:2;33176:9;33172:18;33164:26;;33236:9;33230:4;33226:20;33222:1;33211:9;33207:17;33200:47;33264:131;33390:4;33264:131;:::i;:::-;33256:139;;32983:419;;;:::o;33408:222::-;33501:4;33539:2;33528:9;33524:18;33516:26;;33552:71;33620:1;33609:9;33605:17;33596:6;33552:71;:::i;:::-;33408:222;;;;:::o;33636:129::-;33670:6;33697:20;;:::i;:::-;33687:30;;33726:33;33754:4;33746:6;33726:33;:::i;:::-;33636:129;;;:::o;33771:75::-;33804:6;33837:2;33831:9;33821:19;;33771:75;:::o;33852:307::-;33913:4;34003:18;33995:6;33992:30;33989:56;;;34025:18;;:::i;:::-;33989:56;34063:29;34085:6;34063:29;:::i;:::-;34055:37;;34147:4;34141;34137:15;34129:23;;33852:307;;;:::o;34165:98::-;34216:6;34250:5;34244:12;34234:22;;34165:98;;;:::o;34269:99::-;34321:6;34355:5;34349:12;34339:22;;34269:99;;;:::o;34374:168::-;34457:11;34491:6;34486:3;34479:19;34531:4;34526:3;34522:14;34507:29;;34374:168;;;;:::o;34548:147::-;34649:11;34686:3;34671:18;;34548:147;;;;:::o;34701:169::-;34785:11;34819:6;34814:3;34807:19;34859:4;34854:3;34850:14;34835:29;;34701:169;;;;:::o;34876:148::-;34978:11;35015:3;35000:18;;34876:148;;;;:::o;35030:305::-;35070:3;35089:20;35107:1;35089:20;:::i;:::-;35084:25;;35123:20;35141:1;35123:20;:::i;:::-;35118:25;;35277:1;35209:66;35205:74;35202:1;35199:81;35196:107;;;35283:18;;:::i;:::-;35196:107;35327:1;35324;35320:9;35313:16;;35030:305;;;;:::o;35341:185::-;35381:1;35398:20;35416:1;35398:20;:::i;:::-;35393:25;;35432:20;35450:1;35432:20;:::i;:::-;35427:25;;35471:1;35461:35;;35476:18;;:::i;:::-;35461:35;35518:1;35515;35511:9;35506:14;;35341:185;;;;:::o;35532:348::-;35572:7;35595:20;35613:1;35595:20;:::i;:::-;35590:25;;35629:20;35647:1;35629:20;:::i;:::-;35624:25;;35817:1;35749:66;35745:74;35742:1;35739:81;35734:1;35727:9;35720:17;35716:105;35713:131;;;35824:18;;:::i;:::-;35713:131;35872:1;35869;35865:9;35854:20;;35532:348;;;;:::o;35886:191::-;35926:4;35946:20;35964:1;35946:20;:::i;:::-;35941:25;;35980:20;35998:1;35980:20;:::i;:::-;35975:25;;36019:1;36016;36013:8;36010:34;;;36024:18;;:::i;:::-;36010:34;36069:1;36066;36062:9;36054:17;;35886:191;;;;:::o;36083:96::-;36120:7;36149:24;36167:5;36149:24;:::i;:::-;36138:35;;36083:96;;;:::o;36185:90::-;36219:7;36262:5;36255:13;36248:21;36237:32;;36185:90;;;:::o;36281:149::-;36317:7;36357:66;36350:5;36346:78;36335:89;;36281:149;;;:::o;36436:126::-;36473:7;36513:42;36506:5;36502:54;36491:65;;36436:126;;;:::o;36568:77::-;36605:7;36634:5;36623:16;;36568:77;;;:::o;36651:154::-;36735:6;36730:3;36725;36712:30;36797:1;36788:6;36783:3;36779:16;36772:27;36651:154;;;:::o;36811:307::-;36879:1;36889:113;36903:6;36900:1;36897:13;36889:113;;;36988:1;36983:3;36979:11;36973:18;36969:1;36964:3;36960:11;36953:39;36925:2;36922:1;36918:10;36913:15;;36889:113;;;37020:6;37017:1;37014:13;37011:101;;;37100:1;37091:6;37086:3;37082:16;37075:27;37011:101;36860:258;36811:307;;;:::o;37124:320::-;37168:6;37205:1;37199:4;37195:12;37185:22;;37252:1;37246:4;37242:12;37273:18;37263:81;;37329:4;37321:6;37317:17;37307:27;;37263:81;37391:2;37383:6;37380:14;37360:18;37357:38;37354:84;;;37410:18;;:::i;:::-;37354:84;37175:269;37124:320;;;:::o;37450:281::-;37533:27;37555:4;37533:27;:::i;:::-;37525:6;37521:40;37663:6;37651:10;37648:22;37627:18;37615:10;37612:34;37609:62;37606:88;;;37674:18;;:::i;:::-;37606:88;37714:10;37710:2;37703:22;37493:238;37450:281;;:::o;37737:233::-;37776:3;37799:24;37817:5;37799:24;:::i;:::-;37790:33;;37845:66;37838:5;37835:77;37832:103;;;37915:18;;:::i;:::-;37832:103;37962:1;37955:5;37951:13;37944:20;;37737:233;;;:::o;37976:176::-;38008:1;38025:20;38043:1;38025:20;:::i;:::-;38020:25;;38059:20;38077:1;38059:20;:::i;:::-;38054:25;;38098:1;38088:35;;38103:18;;:::i;:::-;38088:35;38144:1;38141;38137:9;38132:14;;37976:176;;;;:::o;38158:180::-;38206:77;38203:1;38196:88;38303:4;38300:1;38293:15;38327:4;38324:1;38317:15;38344:180;38392:77;38389:1;38382:88;38489:4;38486:1;38479:15;38513:4;38510:1;38503:15;38530:180;38578:77;38575:1;38568:88;38675:4;38672:1;38665:15;38699:4;38696:1;38689:15;38716:180;38764:77;38761:1;38754:88;38861:4;38858:1;38851:15;38885:4;38882:1;38875:15;38902:180;38950:77;38947:1;38940:88;39047:4;39044:1;39037:15;39071:4;39068:1;39061:15;39088:117;39197:1;39194;39187:12;39211:117;39320:1;39317;39310:12;39334:117;39443:1;39440;39433:12;39457:117;39566:1;39563;39556:12;39580:117;39689:1;39686;39679:12;39703:117;39812:1;39809;39802:12;39826:102;39867:6;39918:2;39914:7;39909:2;39902:5;39898:14;39894:28;39884:38;;39826:102;;;:::o;39934:221::-;40074:34;40070:1;40062:6;40058:14;40051:58;40143:4;40138:2;40130:6;40126:15;40119:29;39934:221;:::o;40161:225::-;40301:34;40297:1;40289:6;40285:14;40278:58;40370:8;40365:2;40357:6;40353:15;40346:33;40161:225;:::o;40392:229::-;40532:34;40528:1;40520:6;40516:14;40509:58;40601:12;40596:2;40588:6;40584:15;40577:37;40392:229;:::o;40627:156::-;40767:8;40763:1;40755:6;40751:14;40744:32;40627:156;:::o;40789:222::-;40929:34;40925:1;40917:6;40913:14;40906:58;40998:5;40993:2;40985:6;40981:15;40974:30;40789:222;:::o;41017:224::-;41157:34;41153:1;41145:6;41141:14;41134:58;41226:7;41221:2;41213:6;41209:15;41202:32;41017:224;:::o;41247:236::-;41387:34;41383:1;41375:6;41371:14;41364:58;41456:19;41451:2;41443:6;41439:15;41432:44;41247:236;:::o;41489:244::-;41629:34;41625:1;41617:6;41613:14;41606:58;41698:27;41693:2;41685:6;41681:15;41674:52;41489:244;:::o;41739:181::-;41879:33;41875:1;41867:6;41863:14;41856:57;41739:181;:::o;41926:230::-;42066:34;42062:1;42054:6;42050:14;42043:58;42135:13;42130:2;42122:6;42118:15;42111:38;41926:230;:::o;42162:225::-;42302:34;42298:1;42290:6;42286:14;42279:58;42371:8;42366:2;42358:6;42354:15;42347:33;42162:225;:::o;42393:182::-;42533:34;42529:1;42521:6;42517:14;42510:58;42393:182;:::o;42581:234::-;42721:34;42717:1;42709:6;42705:14;42698:58;42790:17;42785:2;42777:6;42773:15;42766:42;42581:234;:::o;42821:176::-;42961:28;42957:1;42949:6;42945:14;42938:52;42821:176;:::o;43003:237::-;43143:34;43139:1;43131:6;43127:14;43120:58;43212:20;43207:2;43199:6;43195:15;43188:45;43003:237;:::o;43246:221::-;43386:34;43382:1;43374:6;43370:14;43363:58;43455:4;43450:2;43442:6;43438:15;43431:29;43246:221;:::o;43473:114::-;;:::o;43593:158::-;43733:10;43729:1;43721:6;43717:14;43710:34;43593:158;:::o;43757:238::-;43897:34;43893:1;43885:6;43881:14;43874:58;43966:21;43961:2;43953:6;43949:15;43942:46;43757:238;:::o;44001:163::-;44141:15;44137:1;44129:6;44125:14;44118:39;44001:163;:::o;44170:229::-;44310:34;44306:1;44298:6;44294:14;44287:58;44379:12;44374:2;44366:6;44362:15;44355:37;44170:229;:::o;44405:220::-;44545:34;44541:1;44533:6;44529:14;44522:58;44614:3;44609:2;44601:6;44597:15;44590:28;44405:220;:::o;44631:227::-;44771:34;44767:1;44759:6;44755:14;44748:58;44840:10;44835:2;44827:6;44823:15;44816:35;44631:227;:::o;44864:233::-;45004:34;45000:1;44992:6;44988:14;44981:58;45073:16;45068:2;45060:6;45056:15;45049:41;44864:233;:::o;45103:181::-;45243:33;45239:1;45231:6;45227:14;45220:57;45103:181;:::o;45290:234::-;45430:34;45426:1;45418:6;45414:14;45407:58;45499:17;45494:2;45486:6;45482:15;45475:42;45290:234;:::o;45530:176::-;45670:28;45666:1;45658:6;45654:14;45647:52;45530:176;:::o;45712:232::-;45852:34;45848:1;45840:6;45836:14;45829:58;45921:15;45916:2;45908:6;45904:15;45897:40;45712:232;:::o;45950:176::-;46090:28;46086:1;46078:6;46074:14;46067:52;45950:176;:::o;46132:122::-;46205:24;46223:5;46205:24;:::i;:::-;46198:5;46195:35;46185:63;;46244:1;46241;46234:12;46185:63;46132:122;:::o;46260:116::-;46330:21;46345:5;46330:21;:::i;:::-;46323:5;46320:32;46310:60;;46366:1;46363;46356:12;46310:60;46260:116;:::o;46382:120::-;46454:23;46471:5;46454:23;:::i;:::-;46447:5;46444:34;46434:62;;46492:1;46489;46482:12;46434:62;46382:120;:::o;46508:122::-;46581:24;46599:5;46581:24;:::i;:::-;46574:5;46571:35;46561:63;;46620:1;46617;46610:12;46561:63;46508:122;:::o
Swarm Source
ipfs://0405d6f885cef55eda7903961ec79768985d57d313304e5332aba46e3519a356
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.