Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 46 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 18552779 | 409 days ago | IN | 0 ETH | 0.00129444 | ||||
Set Approval For... | 18314209 | 442 days ago | IN | 0 ETH | 0.00162592 | ||||
Set Price | 17358689 | 576 days ago | IN | 0 ETH | 0.00103714 | ||||
Set Approval For... | 17126311 | 609 days ago | IN | 0 ETH | 0.00195238 | ||||
Safe Transfer Fr... | 17124840 | 609 days ago | IN | 0 ETH | 0.00165014 | ||||
Safe Transfer Fr... | 17124817 | 609 days ago | IN | 0 ETH | 0.00157529 | ||||
Safe Transfer Fr... | 17124808 | 609 days ago | IN | 0 ETH | 0.00159769 | ||||
Safe Transfer Fr... | 16930269 | 637 days ago | IN | 0 ETH | 0.00130329 | ||||
Release | 16836277 | 650 days ago | IN | 0 ETH | 0.00165012 | ||||
Safe Transfer Fr... | 16749152 | 662 days ago | IN | 0 ETH | 0.00127824 | ||||
Safe Transfer Fr... | 16749140 | 662 days ago | IN | 0 ETH | 0.00121139 | ||||
Safe Transfer Fr... | 16537044 | 692 days ago | IN | 0 ETH | 0.00167689 | ||||
Safe Transfer Fr... | 16508186 | 696 days ago | IN | 0 ETH | 0.00070502 | ||||
Release | 16406989 | 710 days ago | IN | 0 ETH | 0.0008392 | ||||
Mint | 16392880 | 712 days ago | IN | 0.08 ETH | 0.0014873 | ||||
Safe Transfer Fr... | 16359862 | 717 days ago | IN | 0 ETH | 0.00075817 | ||||
Safe Transfer Fr... | 16328504 | 721 days ago | IN | 0 ETH | 0.00095456 | ||||
Release | 16326616 | 721 days ago | IN | 0 ETH | 0.00066439 | ||||
Mint | 16322964 | 722 days ago | IN | 0.08 ETH | 0.00107794 | ||||
Mint | 16322553 | 722 days ago | IN | 0.08 ETH | 0.00101075 | ||||
Release | 16321977 | 722 days ago | IN | 0 ETH | 0.00093265 | ||||
Mint | 16321801 | 722 days ago | IN | 0.08 ETH | 0.00104166 | ||||
Release | 16316732 | 723 days ago | IN | 0 ETH | 0.00075612 | ||||
Mint | 16314015 | 723 days ago | IN | 0.08 ETH | 0.00090211 | ||||
Release | 16313034 | 723 days ago | IN | 0 ETH | 0.00070534 |
Loading...
Loading
Contract Name:
NFTCoinLaundryWashers
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-12-06 */ // SPDX-License-Identifier: GPL-3.0 // File: contracts/IBatch.sol pragma solidity ^0.8.0; interface IBatch { function isOwnerOf( address account, uint[] calldata tokenIds ) external view returns( bool ); function transferBatch( address from, address to, uint[] calldata tokenIds, bytes calldata data ) external; function walletOfOwner( address account ) external view returns( uint[] memory ); } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (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 `IERC721Receiver.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 (last updated v4.8.0) (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`. * * 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; /** * @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 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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * 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 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 the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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); } // 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: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @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] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // 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 (last updated v4.7.0) (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 Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { 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.8.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 functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or 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 { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // 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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File: contracts/ERC721B.sol pragma solidity ^0.8.0; abstract contract ERC721B is Context, ERC165, IERC721, IERC721Metadata { using Address for address; string private _name; string private _symbol; uint internal _offset; address[] internal _owners; mapping(uint => address) private _tokenApprovals; mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_, uint offset) { _name = name_; _symbol = symbol_; _offset = offset; for(uint i; i < _offset; ++i ){ _owners.push(address(0)); } } //public function balanceOf(address owner) public view virtual override returns (uint) { require(owner != address(0), "ERC721: balance query for the zero address"); uint count; for( uint i; i < _owners.length; ++i ){ if( owner == _owners[i] ) ++count; } return count; } function name() external view virtual override returns (string memory) { return _name; } function next() public view returns( uint ){ return _owners.length; } function ownerOf(uint tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } function symbol() external view virtual override returns (string memory) { return _symbol; } function totalSupply() public view virtual returns (uint) { return _owners.length - _offset; } function approve(address to, uint tokenId) public virtual override { address owner = ERC721B.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } function getApproved(uint tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } function transferFrom( address from, address to, uint tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } function safeTransferFrom( address from, address to, uint tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } function safeTransferFrom( address from, address to, uint tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } //internal function _safeTransfer( address from, address to, uint tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } function _exists(uint tokenId) internal view virtual returns (bool) { return tokenId < _owners.length && _owners[tokenId] != address(0); } function _isApprovedOrOwner(address spender, uint tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721B.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } function _safeMint(address to, uint tokenId) internal virtual { _safeMint(to, tokenId, ""); } function _safeMint( address to, uint tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } function _mint(address to, uint tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _owners.push(to); emit Transfer(address(0), to, tokenId); } function _burn(uint tokenId) internal virtual { address owner = ERC721B.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _owners[tokenId] = address(0); emit Transfer(owner, address(0), tokenId); } function _transfer( address from, address to, uint tokenId ) internal virtual { require(ERC721B.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _owners[tokenId] = to; emit Transfer(from, to, tokenId); } function _approve(address to, uint tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721B.ownerOf(tokenId), to, tokenId); } function _checkOnERC721Received( address from, address to, uint tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } function _beforeTokenTransfer( address from, address to, uint tokenId ) internal virtual {} } // File: contracts/ERC721EnumerableLite.sol pragma solidity ^0.8.0; /**************************************** * @author: squeebo_nft * * @team: GoldenX * **************************************** * Blimpie-ERC721 provides low-gas * * mints + transfers * ****************************************/ abstract contract ERC721EnumerableLite is ERC721B, IBatch, IERC721Enumerable { function isOwnerOf( address account, uint[] calldata tokenIds ) external view override returns( bool ){ for(uint i; i < tokenIds.length; ++i ){ if( _owners[ tokenIds[i] ] != account ) return false; } return true; } function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721B) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } function tokenOfOwnerByIndex(address owner, uint index) public view override returns (uint tokenId) { uint count; for( uint i; i < _owners.length; ++i ){ if( owner == _owners[i] ){ if( count == index ) return i; else ++count; } } require(false, "ERC721Enumerable: owner index out of bounds"); } function tokenByIndex(uint index) external view virtual override returns (uint) { require(index < totalSupply(), "ERC721Enumerable: global index out of bounds"); return index; } function totalSupply() public view virtual override( ERC721B, IERC721Enumerable ) returns (uint) { return _owners.length - _offset; } function transferBatch( address from, address to, uint[] calldata tokenIds, bytes calldata data ) external override{ for(uint i; i < tokenIds.length; ++i ){ safeTransferFrom( from, to, tokenIds[i], data ); } } function walletOfOwner( address account ) external view override returns( uint[] memory ){ uint quantity = balanceOf( account ); uint[] memory wallet = new uint[]( quantity ); for( uint i; i < quantity; ++i ){ wallet[i] = tokenOfOwnerByIndex( account, i ); } return wallet; } } // File: @openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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); /** * @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); } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts (last updated v4.8.0) (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)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @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/finance/PaymentSplitter.sol // OpenZeppelin Contracts (last updated v4.8.0) (finance/PaymentSplitter.sol) pragma solidity ^0.8.0; /** * @title PaymentSplitter * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware * that the Ether will be split in this way, since it is handled transparently by the contract. * * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim * an amount proportional to the percentage of total shares they were assigned. The distribution of shares is set at the * time of contract deployment and can't be updated thereafter. * * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release} * function. * * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you * to run tests before sending real value to this contract. */ contract PaymentSplitter is Context { event PayeeAdded(address account, uint256 shares); event PaymentReleased(address to, uint256 amount); event ERC20PaymentReleased(IERC20 indexed token, address to, uint256 amount); event PaymentReceived(address from, uint256 amount); uint256 private _totalShares; uint256 private _totalReleased; mapping(address => uint256) private _shares; mapping(address => uint256) private _released; address[] private _payees; mapping(IERC20 => uint256) private _erc20TotalReleased; mapping(IERC20 => mapping(address => uint256)) private _erc20Released; /** * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at * the matching position in the `shares` array. * * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no * duplicates in `payees`. */ constructor(address[] memory payees, uint256[] memory shares_) payable { require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch"); require(payees.length > 0, "PaymentSplitter: no payees"); for (uint256 i = 0; i < payees.length; i++) { _addPayee(payees[i], shares_[i]); } } /** * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the * reliability of the events, and not the actual splitting of Ether. * * To learn more about this see the Solidity documentation for * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback * functions]. */ receive() external payable virtual { emit PaymentReceived(_msgSender(), msg.value); } /** * @dev Getter for the total shares held by payees. */ function totalShares() public view returns (uint256) { return _totalShares; } /** * @dev Getter for the total amount of Ether already released. */ function totalReleased() public view returns (uint256) { return _totalReleased; } /** * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20 * contract. */ function totalReleased(IERC20 token) public view returns (uint256) { return _erc20TotalReleased[token]; } /** * @dev Getter for the amount of shares held by an account. */ function shares(address account) public view returns (uint256) { return _shares[account]; } /** * @dev Getter for the amount of Ether already released to a payee. */ function released(address account) public view returns (uint256) { return _released[account]; } /** * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an * IERC20 contract. */ function released(IERC20 token, address account) public view returns (uint256) { return _erc20Released[token][account]; } /** * @dev Getter for the address of the payee number `index`. */ function payee(uint256 index) public view returns (address) { return _payees[index]; } /** * @dev Getter for the amount of payee's releasable Ether. */ function releasable(address account) public view returns (uint256) { uint256 totalReceived = address(this).balance + totalReleased(); return _pendingPayment(account, totalReceived, released(account)); } /** * @dev Getter for the amount of payee's releasable `token` tokens. `token` should be the address of an * IERC20 contract. */ function releasable(IERC20 token, address account) public view returns (uint256) { uint256 totalReceived = token.balanceOf(address(this)) + totalReleased(token); return _pendingPayment(account, totalReceived, released(token, account)); } /** * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the * total shares and their previous withdrawals. */ function release(address payable account) public virtual { require(_shares[account] > 0, "PaymentSplitter: account has no shares"); uint256 payment = releasable(account); require(payment != 0, "PaymentSplitter: account is not due payment"); // _totalReleased is the sum of all values in _released. // If "_totalReleased += payment" does not overflow, then "_released[account] += payment" cannot overflow. _totalReleased += payment; unchecked { _released[account] += payment; } Address.sendValue(account, payment); emit PaymentReleased(account, payment); } /** * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20 * contract. */ function release(IERC20 token, address account) public virtual { require(_shares[account] > 0, "PaymentSplitter: account has no shares"); uint256 payment = releasable(token, account); require(payment != 0, "PaymentSplitter: account is not due payment"); // _erc20TotalReleased[token] is the sum of all values in _erc20Released[token]. // If "_erc20TotalReleased[token] += payment" does not overflow, then "_erc20Released[token][account] += payment" // cannot overflow. _erc20TotalReleased[token] += payment; unchecked { _erc20Released[token][account] += payment; } SafeERC20.safeTransfer(token, account, payment); emit ERC20PaymentReleased(token, account, payment); } /** * @dev internal logic for computing the pending payment of an `account` given the token historical balances and * already released amounts. */ function _pendingPayment( address account, uint256 totalReceived, uint256 alreadyReleased ) private view returns (uint256) { return (totalReceived * _shares[account]) / _totalShares - alreadyReleased; } /** * @dev Add a new payee to the contract. * @param account The address of the payee to add. * @param shares_ The number of shares owned by the payee. */ function _addPayee(address account, uint256 shares_) private { require(account != address(0), "PaymentSplitter: account is the zero address"); require(shares_ > 0, "PaymentSplitter: shares are 0"); require(_shares[account] == 0, "PaymentSplitter: account already has shares"); _payees.push(account); _shares[account] = shares_; _totalShares = _totalShares + shares_; emit PayeeAdded(account, shares_); } } // File: https://github.com/ProjectOpenSea/operator-filter-registry/blob/main/src/IOperatorFilterRegistry.sol pragma solidity ^0.8.13; interface IOperatorFilterRegistry { function isOperatorAllowed(address registrant, address operator) external view returns (bool); function register(address registrant) external; function registerAndSubscribe(address registrant, address subscription) external; function registerAndCopyEntries(address registrant, address registrantToCopy) external; function unregister(address addr) external; function updateOperator(address registrant, address operator, bool filtered) external; function updateOperators(address registrant, address[] calldata operators, bool filtered) external; function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; function subscribe(address registrant, address registrantToSubscribe) external; function unsubscribe(address registrant, bool copyExistingEntries) external; function subscriptionOf(address addr) external returns (address registrant); function subscribers(address registrant) external returns (address[] memory); function subscriberAt(address registrant, uint256 index) external returns (address); function copyEntriesOf(address registrant, address registrantToCopy) external; function isOperatorFiltered(address registrant, address operator) external returns (bool); function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); function filteredOperators(address addr) external returns (address[] memory); function filteredCodeHashes(address addr) external returns (bytes32[] memory); function filteredOperatorAt(address registrant, uint256 index) external returns (address); function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); function isRegistered(address addr) external returns (bool); function codeHashOf(address addr) external returns (bytes32); } // File: https://github.com/ProjectOpenSea/operator-filter-registry/blob/main/src/OperatorFilterer.sol pragma solidity ^0.8.13; /** * @title OperatorFilterer * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry. * @dev This smart contract is meant to be inherited by token contracts so they can use the following: * - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods. * - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods. */ abstract contract OperatorFilterer { error OperatorNotAllowed(address operator); IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E); constructor(address subscriptionOrRegistrantToCopy, bool subscribe) { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (subscribe) { OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { OPERATOR_FILTER_REGISTRY.register(address(this)); } } } } modifier onlyAllowedOperator(address from) virtual { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from != msg.sender) { _checkFilterOperator(msg.sender); } _; } modifier onlyAllowedOperatorApproval(address operator) virtual { _checkFilterOperator(operator); _; } function _checkFilterOperator(address operator) internal view virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } } } // File: https://github.com/ProjectOpenSea/operator-filter-registry/blob/main/src//DefaultOperatorFilterer.sol pragma solidity ^0.8.13; /** * @title DefaultOperatorFilterer * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription. */ abstract contract DefaultOperatorFilterer is OperatorFilterer { address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6); constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {} } // File: contracts/NFTCoinLaundryWashers.sol pragma solidity 0.8.17; contract NFTCoinLaundryWashers is ERC721EnumerableLite, PaymentSplitter, DefaultOperatorFilterer, Ownable { using Strings for uint; uint public MAX_ORDER = 20; uint public MAX_SUPPLY = 105; uint public PRICE = 0.08 ether; bool public isActive = true; string private _baseTokenURI; string private _tokenURISuffix; address[] private addressList = [ 0x74371cd314AC736F5ce9e52afb488cC2eE6C4828, 0x327EC442254e9Dc1dd91c2156725e0A523C06850 ]; uint[] private shareList = [ 80, 20 ]; constructor() ERC721B("Coin-Laundry Official", "WASH", 1) PaymentSplitter(addressList, shareList) { _baseTokenURI = "ipfs://bafybeielahtpv7xai4g2px337kcu5w7ocrkxdu4rlshxko2bag2pqczowu/"; _tokenURISuffix = ".json"; for(uint i = 1; i <= 74; ++i){ _mint( msg.sender, i); } _mint(0x5f7d007aB2A395a288ff83cCf2a8B921D6d96193, 75); } fallback() external payable {} //Externals function mint( uint quantity ) external payable { require( isActive, "ERR:NA"); //Error -> Not Active require( quantity <= MAX_ORDER, "ERR:OO"); //Error -> Oversized Order if (msg.sender != owner()) { require( msg.value >= PRICE * quantity, "ERR:TU"); //Error -> Transaction Underpriced } uint supply = totalSupply(); require( supply + quantity <= MAX_SUPPLY, "ERR:MO" ); //Error -> Mint Overflow for(uint i; i < quantity; ++i){ _mint( msg.sender, supply + (i+1)); } } function tokenURI(uint tokenId) external view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); return string(abi.encodePacked(_baseTokenURI, tokenId.toString(), _tokenURISuffix)); } //internal function _mint(address to, uint tokenId) internal virtual override { _owners.push(to); emit Transfer(address(0), to, tokenId); } //onlyOwner function setActive(bool isActive_) external onlyOwner{ require( isActive != isActive_, "ERR:NC" ); //Error -> No Change isActive = isActive_; } function setBaseURI(string calldata _newBaseURI, string calldata _newSuffix) external onlyOwner{ _baseTokenURI = _newBaseURI; _tokenURISuffix = _newSuffix; } function setMaxOrder(uint maxOrder) external onlyOwner{ require( MAX_ORDER != maxOrder, "ERR:NC" ); //Error -> No Change MAX_ORDER = maxOrder; } function setPrice(uint price ) external onlyOwner{ require( PRICE != price, "ERR:NC" ); //Error -> No Change PRICE = price; } function setMaxSupply(uint maxSupply) external onlyOwner{ require( MAX_SUPPLY != maxSupply, "ERR:NC" ); //Error -> No Change require( maxSupply >= totalSupply(), "ERR:SL" ); //Error -> Supply To Low MAX_SUPPLY = maxSupply; } //Overrides function setApprovalForAll(address operator, bool approved) public virtual override(ERC721B, IERC721) onlyAllowedOperatorApproval(operator) { super.setApprovalForAll(operator, approved); } function approve(address operator, uint256 tokenId) public override(ERC721B, IERC721) onlyAllowedOperatorApproval(operator) { super.approve(operator, tokenId); } function transferFrom(address from, address to, uint256 tokenId) public override(ERC721B, IERC721) onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId) public override(ERC721B, IERC721) onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public override(ERC721B, IERC721) onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","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"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"MAX_ORDER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"isOwnerOf","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"next","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"releasable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"releasable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","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":"bool","name":"isActive_","type":"bool"}],"name":"setActive","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":"_newBaseURI","type":"string"},{"internalType":"string","name":"_newSuffix","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxOrder","type":"uint256"}],"name":"setMaxOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"transferBatch","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":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526014600e556069600f5567011c37937e0800006010556001601160006101000a81548160ff02191690831515021790555060405180604001604052807374371cd314ac736f5ce9e52afb488cc2ee6c482873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173327ec442254e9dc1dd91c2156725e0a523c0685073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152506014906002620000dc92919062000ae8565b506040518060400160405280605060ff168152602001601460ff1681525060159060026200010c92919062000b77565b503480156200011a57600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016014805480602002602001604051908101604052809291908181526020018280548015620001b657602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116200016b575b505050505060158054806020026020016040519081016040528092919081815260200182805480156200020957602002820191906000526020600020905b815481526020019060010190808311620001f4575b50505050506040518060400160405280601581526020017f436f696e2d4c61756e647279204f6666696369616c00000000000000000000008152506040518060400160405280600481526020017f5741534800000000000000000000000000000000000000000000000000000000815250600182600090816200028d919062000e67565b5081600190816200029f919062000e67565b508060028190555060005b6002548110156200032d57600360009080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080620003259062000f7d565b9050620002aa565b50505050805182511462000378576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200036f9062001051565b60405180910390fd5b6000825111620003bf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003b690620010c3565b60405180910390fd5b60005b82518110156200042e5762000418838281518110620003e657620003e5620010e5565b5b6020026020010151838381518110620004045762000403620010e5565b5b60200260200101516200071e60201b60201c565b8080620004259062000f7d565b915050620003c2565b50505060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111562000626578015620004ec576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b8152600401620004b292919062001159565b600060405180830381600087803b158015620004cd57600080fd5b505af1158015620004e2573d6000803e3d6000fd5b5050505062000625565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620005a6576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200056c92919062001159565b600060405180830381600087803b1580156200058757600080fd5b505af11580156200059c573d6000803e3d6000fd5b5050505062000624565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b8152600401620005ef919062001186565b600060405180830381600087803b1580156200060a57600080fd5b505af11580156200061f573d6000803e3d6000fd5b505050505b5b5b5050620006486200063c6200095760201b60201c565b6200095f60201b60201c565b604051806080016040528060438152602001620069fa604391396012908162000672919062000e67565b506040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060139081620006b9919062000e67565b506000600190505b604a8111620006f057620006dc338262000a2560201b60201c565b80620006e89062000f7d565b9050620006c1565b5062000718735f7d007ab2a395a288ff83ccf2a8b921d6d96193604b62000a2560201b60201c565b620013be565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000790576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007879062001219565b60405180910390fd5b60008111620007d6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007cd906200128b565b60405180910390fd5b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146200085b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008529062001323565b60405180910390fd5b600a829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508060065462000912919062001345565b6006819055507f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac82826040516200094b92919062001391565b60405180910390a15050565b600033905090565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6003829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805482825590600052602060002090810192821562000b64579160200282015b8281111562000b635782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019062000b09565b5b50905062000b73919062000bce565b5090565b82805482825590600052602060002090810192821562000bbb579160200282015b8281111562000bba578251829060ff1690559160200191906001019062000b98565b5b50905062000bca919062000bce565b5090565b5b8082111562000be957600081600090555060010162000bcf565b5090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000c6f57607f821691505b60208210810362000c855762000c8462000c27565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000cef7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000cb0565b62000cfb868362000cb0565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000d4862000d4262000d3c8462000d13565b62000d1d565b62000d13565b9050919050565b6000819050919050565b62000d648362000d27565b62000d7c62000d738262000d4f565b84845462000cbd565b825550505050565b600090565b62000d9362000d84565b62000da081848462000d59565b505050565b5b8181101562000dc85762000dbc60008262000d89565b60018101905062000da6565b5050565b601f82111562000e175762000de18162000c8b565b62000dec8462000ca0565b8101602085101562000dfc578190505b62000e1462000e0b8562000ca0565b83018262000da5565b50505b505050565b600082821c905092915050565b600062000e3c6000198460080262000e1c565b1980831691505092915050565b600062000e57838362000e29565b9150826002028217905092915050565b62000e728262000bed565b67ffffffffffffffff81111562000e8e5762000e8d62000bf8565b5b62000e9a825462000c56565b62000ea782828562000dcc565b600060209050601f83116001811462000edf576000841562000eca578287015190505b62000ed6858262000e49565b86555062000f46565b601f19841662000eef8662000c8b565b60005b8281101562000f195784890151825560018201915060208501945060208101905062000ef2565b8683101562000f39578489015162000f35601f89168262000e29565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000f8a8262000d13565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362000fbf5762000fbe62000f4e565b5b600182019050919050565b600082825260208201905092915050565b7f5061796d656e7453706c69747465723a2070617965657320616e64207368617260008201527f6573206c656e677468206d69736d617463680000000000000000000000000000602082015250565b60006200103960328362000fca565b9150620010468262000fdb565b604082019050919050565b600060208201905081810360008301526200106c816200102a565b9050919050565b7f5061796d656e7453706c69747465723a206e6f20706179656573000000000000600082015250565b6000620010ab601a8362000fca565b9150620010b88262001073565b602082019050919050565b60006020820190508181036000830152620010de816200109c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620011418262001114565b9050919050565b620011538162001134565b82525050565b600060408201905062001170600083018562001148565b6200117f602083018462001148565b9392505050565b60006020820190506200119d600083018462001148565b92915050565b7f5061796d656e7453706c69747465723a206163636f756e74206973207468652060008201527f7a65726f20616464726573730000000000000000000000000000000000000000602082015250565b600062001201602c8362000fca565b91506200120e82620011a3565b604082019050919050565b600060208201905081810360008301526200123481620011f2565b9050919050565b7f5061796d656e7453706c69747465723a20736861726573206172652030000000600082015250565b600062001273601d8362000fca565b915062001280826200123b565b602082019050919050565b60006020820190508181036000830152620012a68162001264565b9050919050565b7f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960008201527f2068617320736861726573000000000000000000000000000000000000000000602082015250565b60006200130b602b8362000fca565b91506200131882620012ad565b604082019050919050565b600060208201905081810360008301526200133e81620012fc565b9050919050565b6000620013528262000d13565b91506200135f8362000d13565b92508282019050808211156200137a576200137962000f4e565b5b92915050565b6200138b8162000d13565b82525050565b6000604082019050620013a8600083018562001148565b620013b7602083018462001380565b9392505050565b61562c80620013ce6000396000f3fe6080604052600436106102765760003560e01c80636f8b44b01161014f578063a3f8eace116100c1578063ce7c2ac21161007a578063ce7c2ac214610a0d578063d79779b214610a4a578063dde3d31314610a87578063e33b7de314610ab0578063e985e9c514610adb578063f2fde38b14610b18576102bd565b8063a3f8eace146108db578063acec338a14610918578063b534a5c414610941578063b88d4fde1461096a578063c45ac05014610993578063c87b56dd146109d0576102bd565b80638da5cb5b116101135780638da5cb5b146107da57806391b7f5ed1461080557806395d89b411461082e5780639852595c14610859578063a0712d6814610896578063a22cb465146108b2576102bd565b80636f8b44b0146106f557806370a082311461071e578063715018a61461075b5780638b83209b146107725780638d859f3e146107af576102bd565b8063406072a9116101e85780634c8fe526116101ac5780634c8fe526146105bf5780634d44660c146105ea5780634f6ccce71461062757806350c5a00c146106645780636352211e1461068f5780636790a9de146106cc576102bd565b8063406072a9146104c857806341f434341461050557806342842e0e14610530578063438b63001461055957806348b7504414610596576102bd565b8063191655871161023a57806319165587146103b857806322f3e2d4146103e157806323b872dd1461040c5780632f745c591461043557806332cb6b0c146104725780633a98ef391461049d576102bd565b806301ffc9a7146102bf57806306fdde03146102fc578063081812fc14610327578063095ea7b31461036457806318160ddd1461038d576102bd565b366102bd577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be7706102a4610b41565b346040516102b3929190613449565b60405180910390a1005b005b3480156102cb57600080fd5b506102e660048036038101906102e191906134de565b610b49565b6040516102f39190613526565b60405180910390f35b34801561030857600080fd5b50610311610bc3565b60405161031e91906135d1565b60405180910390f35b34801561033357600080fd5b5061034e6004803603810190610349919061361f565b610c55565b60405161035b919061364c565b60405180910390f35b34801561037057600080fd5b5061038b60048036038101906103869190613693565b610cda565b005b34801561039957600080fd5b506103a2610cf3565b6040516103af91906136d3565b60405180910390f35b3480156103c457600080fd5b506103df60048036038101906103da919061372c565b610d0d565b005b3480156103ed57600080fd5b506103f6610e8c565b6040516104039190613526565b60405180910390f35b34801561041857600080fd5b50610433600480360381019061042e9190613759565b610e9f565b005b34801561044157600080fd5b5061045c60048036038101906104579190613693565b610eee565b60405161046991906136d3565b60405180910390f35b34801561047e57600080fd5b50610487610feb565b60405161049491906136d3565b60405180910390f35b3480156104a957600080fd5b506104b2610ff1565b6040516104bf91906136d3565b60405180910390f35b3480156104d457600080fd5b506104ef60048036038101906104ea91906137ea565b610ffb565b6040516104fc91906136d3565b60405180910390f35b34801561051157600080fd5b5061051a611082565b6040516105279190613889565b60405180910390f35b34801561053c57600080fd5b5061055760048036038101906105529190613759565b611094565b005b34801561056557600080fd5b50610580600480360381019061057b91906138a4565b6110e3565b60405161058d919061398f565b60405180910390f35b3480156105a257600080fd5b506105bd60048036038101906105b891906137ea565b61118f565b005b3480156105cb57600080fd5b506105d46113a2565b6040516105e191906136d3565b60405180910390f35b3480156105f657600080fd5b50610611600480360381019061060c9190613a16565b6113af565b60405161061e9190613526565b60405180910390f35b34801561063357600080fd5b5061064e6004803603810190610649919061361f565b611470565b60405161065b91906136d3565b60405180910390f35b34801561067057600080fd5b506106796114c3565b60405161068691906136d3565b60405180910390f35b34801561069b57600080fd5b506106b660048036038101906106b1919061361f565b6114c9565b6040516106c3919061364c565b60405180910390f35b3480156106d857600080fd5b506106f360048036038101906106ee9190613acc565b611585565b005b34801561070157600080fd5b5061071c6004803603810190610717919061361f565b6115b7565b005b34801561072a57600080fd5b50610745600480360381019061074091906138a4565b611657565b60405161075291906136d3565b60405180910390f35b34801561076757600080fd5b50610770611771565b005b34801561077e57600080fd5b506107996004803603810190610794919061361f565b611785565b6040516107a6919061364c565b60405180910390f35b3480156107bb57600080fd5b506107c46117cd565b6040516107d191906136d3565b60405180910390f35b3480156107e657600080fd5b506107ef6117d3565b6040516107fc919061364c565b60405180910390f35b34801561081157600080fd5b5061082c6004803603810190610827919061361f565b6117fd565b005b34801561083a57600080fd5b50610843611853565b60405161085091906135d1565b60405180910390f35b34801561086557600080fd5b50610880600480360381019061087b91906138a4565b6118e5565b60405161088d91906136d3565b60405180910390f35b6108b060048036038101906108ab919061361f565b61192e565b005b3480156108be57600080fd5b506108d960048036038101906108d49190613b79565b611aeb565b005b3480156108e757600080fd5b5061090260048036038101906108fd91906138a4565b611b04565b60405161090f91906136d3565b60405180910390f35b34801561092457600080fd5b5061093f600480360381019061093a9190613bb9565b611b37565b005b34801561094d57600080fd5b5061096860048036038101906109639190613c3c565b611bb1565b005b34801561097657600080fd5b50610991600480360381019061098c9190613e13565b611c42565b005b34801561099f57600080fd5b506109ba60048036038101906109b591906137ea565b611c93565b6040516109c791906136d3565b60405180910390f35b3480156109dc57600080fd5b506109f760048036038101906109f2919061361f565b611d42565b604051610a0491906135d1565b60405180910390f35b348015610a1957600080fd5b50610a346004803603810190610a2f91906138a4565b611dc1565b604051610a4191906136d3565b60405180910390f35b348015610a5657600080fd5b50610a716004803603810190610a6c9190613e96565b611e0a565b604051610a7e91906136d3565b60405180910390f35b348015610a9357600080fd5b50610aae6004803603810190610aa9919061361f565b611e53565b005b348015610abc57600080fd5b50610ac5611ea9565b604051610ad291906136d3565b60405180910390f35b348015610ae757600080fd5b50610b026004803603810190610afd9190613ec3565b611eb3565b604051610b0f9190613526565b60405180910390f35b348015610b2457600080fd5b50610b3f6004803603810190610b3a91906138a4565b611f47565b005b600033905090565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610bbc5750610bbb82611fca565b5b9050919050565b606060008054610bd290613f32565b80601f0160208091040260200160405190810160405280929190818152602001828054610bfe90613f32565b8015610c4b5780601f10610c2057610100808354040283529160200191610c4b565b820191906000526020600020905b815481529060010190602001808311610c2e57829003601f168201915b5050505050905090565b6000610c60826120ac565b610c9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9690613fd5565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610ce481612134565b610cee8383612231565b505050565b6000600254600380549050610d089190614024565b905090565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610d8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d86906140ca565b60405180910390fd5b6000610d9a82611b04565b905060008103610ddf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd69061415c565b60405180910390fd5b8060076000828254610df1919061417c565b9250508190555080600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550610e4f8282612348565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0568282604051610e809291906141d1565b60405180910390a15050565b601160009054906101000a900460ff1681565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610edd57610edc33612134565b5b610ee884848461243c565b50505050565b60008060005b600380549050811015610fa15760038181548110610f1557610f146141fa565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610f9057838203610f83578092505050610fe5565b81610f8d90614229565b91505b80610f9a90614229565b9050610ef4565b506000610fe3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fda906142e3565b60405180910390fd5b505b92915050565b600f5481565b6000600654905090565b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146110d2576110d133612134565b5b6110dd84848461249c565b50505050565b606060006110f083611657565b905060008167ffffffffffffffff81111561110e5761110d613ce8565b5b60405190808252806020026020018201604052801561113c5781602001602082028036833780820191505090505b50905060005b82811015611184576111548582610eee565b828281518110611167576111666141fa565b5b6020026020010181815250508061117d90614229565b9050611142565b508092505050919050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611211576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611208906140ca565b60405180910390fd5b600061121d8383611c93565b905060008103611262576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112599061415c565b60405180910390fd5b80600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112b1919061417c565b9250508190555080600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061134d8383836124bc565b8273ffffffffffffffffffffffffffffffffffffffff167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a8383604051611395929190613449565b60405180910390a2505050565b6000600380549050905090565b6000805b83839050811015611463578473ffffffffffffffffffffffffffffffffffffffff1660038585848181106113ea576113e96141fa565b5b9050602002013581548110611402576114016141fa565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611452576000915050611469565b8061145c90614229565b90506113b3565b50600190505b9392505050565b600061147a610cf3565b82106114bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b290614375565b60405180910390fd5b819050919050565b600e5481565b600080600383815481106114e0576114df6141fa565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361157c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157390614407565b60405180910390fd5b80915050919050565b61158d612542565b83836012918261159e9291906145d4565b508181601391826115b09291906145d4565b5050505050565b6115bf612542565b80600f5403611603576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fa906146f0565b60405180910390fd5b61160b610cf3565b81101561164d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116449061475c565b60405180910390fd5b80600f8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116be906147ee565b60405180910390fd5b6000805b60038054905081101561176757600381815481106116ec576116eb6141fa565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611756578161175390614229565b91505b8061176090614229565b90506116cb565b5080915050919050565b611779612542565b61178360006125c0565b565b6000600a828154811061179b5761179a6141fa565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60105481565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611805612542565b8060105403611849576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611840906146f0565b60405180910390fd5b8060108190555050565b60606001805461186290613f32565b80601f016020809104026020016040519081016040528092919081815260200182805461188e90613f32565b80156118db5780601f106118b0576101008083540402835291602001916118db565b820191906000526020600020905b8154815290600101906020018083116118be57829003601f168201915b5050505050905090565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b601160009054906101000a900460ff1661197d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119749061485a565b60405180910390fd5b600e548111156119c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b9906148c6565b60405180910390fd5b6119ca6117d3565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a4d5780601054611a0a91906148e6565b341015611a4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4390614974565b60405180910390fd5b5b6000611a57610cf3565b9050600f548282611a68919061417c565b1115611aa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa0906149e0565b60405180910390fd5b60005b82811015611ae657611ad533600183611ac5919061417c565b84611ad0919061417c565b612686565b80611adf90614229565b9050611aac565b505050565b81611af581612134565b611aff8383612749565b505050565b600080611b0f611ea9565b47611b1a919061417c565b9050611b2f8382611b2a866118e5565b6128c9565b915050919050565b611b3f612542565b801515601160009054906101000a900460ff16151503611b94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8b906146f0565b60405180910390fd5b80601160006101000a81548160ff02191690831515021790555050565b60005b84849050811015611c3957611c288787878785818110611bd757611bd66141fa565b5b9050602002013586868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611c42565b80611c3290614229565b9050611bb4565b50505050505050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611c8057611c7f33612134565b5b611c8c85858585612937565b5050505050565b600080611c9f84611e0a565b8473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611cd8919061364c565b602060405180830381865afa158015611cf5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d199190614a15565b611d23919061417c565b9050611d398382611d348787610ffb565b6128c9565b91505092915050565b6060611d4d826120ac565b611d8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8390614ab4565b60405180910390fd5b6012611d9783612999565b6013604051602001611dab93929190614b93565b6040516020818303038152906040529050919050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611e5b612542565b80600e5403611e9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e96906146f0565b60405180910390fd5b80600e8190555050565b6000600754905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611f4f612542565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611fbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb590614c36565b60405180910390fd5b611fc7816125c0565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061209557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806120a557506120a482612a67565b5b9050919050565b60006003805490508210801561212d5750600073ffffffffffffffffffffffffffffffffffffffff16600383815481106120e9576120e86141fa565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561222e576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016121ab929190614c56565b602060405180830381865afa1580156121c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ec9190614c94565b61222d57806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401612224919061364c565b60405180910390fd5b5b50565b600061223c826114c9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036122ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a390614d33565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166122cb610b41565b73ffffffffffffffffffffffffffffffffffffffff1614806122fa57506122f9816122f4610b41565b611eb3565b5b612339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233090614dc5565b60405180910390fd5b6123438383612ad1565b505050565b8047101561238b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238290614e31565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516123b190614e82565b60006040518083038185875af1925050503d80600081146123ee576040519150601f19603f3d011682016040523d82523d6000602084013e6123f3565b606091505b5050905080612437576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242e90614f09565b60405180910390fd5b505050565b61244d612447610b41565b82612b8a565b61248c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248390614f9b565b60405180910390fd5b612497838383612c68565b505050565b6124b783838360405180602001604052806000815250611c42565b505050565b61253d8363a9059cbb60e01b84846040516024016124db929190613449565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612e20565b505050565b61254a610b41565b73ffffffffffffffffffffffffffffffffffffffff166125686117d3565b73ffffffffffffffffffffffffffffffffffffffff16146125be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b590615007565b60405180910390fd5b565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6003829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b612751610b41565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036127be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b590615073565b60405180910390fd5b80600560006127cb610b41565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612878610b41565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516128bd9190613526565b60405180910390a35050565b600081600654600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548561291a91906148e6565b61292491906150c2565b61292e9190614024565b90509392505050565b612948612942610b41565b83612b8a565b612987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297e90614f9b565b60405180910390fd5b61299384848484612ee7565b50505050565b6060600060016129a884612f43565b01905060008167ffffffffffffffff8111156129c7576129c6613ce8565b5b6040519080825280601f01601f1916602001820160405280156129f95781602001600182028036833780820191505090505b509050600082602001820190505b600115612a5c578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612a5057612a4f615093565b5b04945060008503612a07575b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612b44836114c9565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612b95826120ac565b612bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bcb90615165565b60405180910390fd5b6000612bdf836114c9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612c4e57508373ffffffffffffffffffffffffffffffffffffffff16612c3684610c55565b73ffffffffffffffffffffffffffffffffffffffff16145b80612c5f5750612c5e8185611eb3565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612c88826114c9565b73ffffffffffffffffffffffffffffffffffffffff1614612cde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd5906151f7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612d4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4490615289565b60405180910390fd5b612d58838383613096565b612d63600082612ad1565b8160038281548110612d7857612d776141fa565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000612e82826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661309b9092919063ffffffff16565b9050600081511115612ee25780806020019051810190612ea29190614c94565b612ee1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed89061531b565b60405180910390fd5b5b505050565b612ef2848484612c68565b612efe848484846130b3565b612f3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f34906153ad565b60405180910390fd5b50505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612fa1577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612f9757612f96615093565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612fde576d04ee2d6d415b85acef81000000008381612fd457612fd3615093565b5b0492506020810190505b662386f26fc10000831061300d57662386f26fc10000838161300357613002615093565b5b0492506010810190505b6305f5e1008310613036576305f5e100838161302c5761302b615093565b5b0492506008810190505b612710831061305b57612710838161305157613050615093565b5b0492506004810190505b6064831061307e576064838161307457613073615093565b5b0492506002810190505b600a831061308d576001810190505b80915050919050565b505050565b60606130aa848460008561323a565b90509392505050565b60006130d48473ffffffffffffffffffffffffffffffffffffffff16613307565b1561322d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026130fd610b41565b8786866040518563ffffffff1660e01b815260040161311f9493929190615422565b6020604051808303816000875af192505050801561315b57506040513d601f19601f820116820180604052508101906131589190615483565b60015b6131dd573d806000811461318b576040519150601f19603f3d011682016040523d82523d6000602084013e613190565b606091505b5060008151036131d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131cc906153ad565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613232565b600190505b949350505050565b60608247101561327f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161327690615522565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516132a89190615573565b60006040518083038185875af1925050503d80600081146132e5576040519150601f19603f3d011682016040523d82523d6000602084013e6132ea565b606091505b50915091506132fb8783838761332a565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6060831561338c5760008351036133845761334485613307565b613383576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337a906155d6565b60405180910390fd5b5b829050613397565b613396838361339f565b5b949350505050565b6000825111156133b25781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133e691906135d1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061341a826133ef565b9050919050565b61342a8161340f565b82525050565b6000819050919050565b61344381613430565b82525050565b600060408201905061345e6000830185613421565b61346b602083018461343a565b9392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6134bb81613486565b81146134c657600080fd5b50565b6000813590506134d8816134b2565b92915050565b6000602082840312156134f4576134f361347c565b5b6000613502848285016134c9565b91505092915050565b60008115159050919050565b6135208161350b565b82525050565b600060208201905061353b6000830184613517565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561357b578082015181840152602081019050613560565b60008484015250505050565b6000601f19601f8301169050919050565b60006135a382613541565b6135ad818561354c565b93506135bd81856020860161355d565b6135c681613587565b840191505092915050565b600060208201905081810360008301526135eb8184613598565b905092915050565b6135fc81613430565b811461360757600080fd5b50565b600081359050613619816135f3565b92915050565b6000602082840312156136355761363461347c565b5b60006136438482850161360a565b91505092915050565b60006020820190506136616000830184613421565b92915050565b6136708161340f565b811461367b57600080fd5b50565b60008135905061368d81613667565b92915050565b600080604083850312156136aa576136a961347c565b5b60006136b88582860161367e565b92505060206136c98582860161360a565b9150509250929050565b60006020820190506136e8600083018461343a565b92915050565b60006136f9826133ef565b9050919050565b613709816136ee565b811461371457600080fd5b50565b60008135905061372681613700565b92915050565b6000602082840312156137425761374161347c565b5b600061375084828501613717565b91505092915050565b6000806000606084860312156137725761377161347c565b5b60006137808682870161367e565b93505060206137918682870161367e565b92505060406137a28682870161360a565b9150509250925092565b60006137b78261340f565b9050919050565b6137c7816137ac565b81146137d257600080fd5b50565b6000813590506137e4816137be565b92915050565b600080604083850312156138015761380061347c565b5b600061380f858286016137d5565b92505060206138208582860161367e565b9150509250929050565b6000819050919050565b600061384f61384a613845846133ef565b61382a565b6133ef565b9050919050565b600061386182613834565b9050919050565b600061387382613856565b9050919050565b61388381613868565b82525050565b600060208201905061389e600083018461387a565b92915050565b6000602082840312156138ba576138b961347c565b5b60006138c88482850161367e565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61390681613430565b82525050565b600061391883836138fd565b60208301905092915050565b6000602082019050919050565b600061393c826138d1565b61394681856138dc565b9350613951836138ed565b8060005b83811015613982578151613969888261390c565b975061397483613924565b925050600181019050613955565b5085935050505092915050565b600060208201905081810360008301526139a98184613931565b905092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126139d6576139d56139b1565b5b8235905067ffffffffffffffff8111156139f3576139f26139b6565b5b602083019150836020820283011115613a0f57613a0e6139bb565b5b9250929050565b600080600060408486031215613a2f57613a2e61347c565b5b6000613a3d8682870161367e565b935050602084013567ffffffffffffffff811115613a5e57613a5d613481565b5b613a6a868287016139c0565b92509250509250925092565b60008083601f840112613a8c57613a8b6139b1565b5b8235905067ffffffffffffffff811115613aa957613aa86139b6565b5b602083019150836001820283011115613ac557613ac46139bb565b5b9250929050565b60008060008060408587031215613ae657613ae561347c565b5b600085013567ffffffffffffffff811115613b0457613b03613481565b5b613b1087828801613a76565b9450945050602085013567ffffffffffffffff811115613b3357613b32613481565b5b613b3f87828801613a76565b925092505092959194509250565b613b568161350b565b8114613b6157600080fd5b50565b600081359050613b7381613b4d565b92915050565b60008060408385031215613b9057613b8f61347c565b5b6000613b9e8582860161367e565b9250506020613baf85828601613b64565b9150509250929050565b600060208284031215613bcf57613bce61347c565b5b6000613bdd84828501613b64565b91505092915050565b60008083601f840112613bfc57613bfb6139b1565b5b8235905067ffffffffffffffff811115613c1957613c186139b6565b5b602083019150836001820283011115613c3557613c346139bb565b5b9250929050565b60008060008060008060808789031215613c5957613c5861347c565b5b6000613c6789828a0161367e565b9650506020613c7889828a0161367e565b955050604087013567ffffffffffffffff811115613c9957613c98613481565b5b613ca589828a016139c0565b9450945050606087013567ffffffffffffffff811115613cc857613cc7613481565b5b613cd489828a01613be6565b92509250509295509295509295565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613d2082613587565b810181811067ffffffffffffffff82111715613d3f57613d3e613ce8565b5b80604052505050565b6000613d52613472565b9050613d5e8282613d17565b919050565b600067ffffffffffffffff821115613d7e57613d7d613ce8565b5b613d8782613587565b9050602081019050919050565b82818337600083830152505050565b6000613db6613db184613d63565b613d48565b905082815260208101848484011115613dd257613dd1613ce3565b5b613ddd848285613d94565b509392505050565b600082601f830112613dfa57613df96139b1565b5b8135613e0a848260208601613da3565b91505092915050565b60008060008060808587031215613e2d57613e2c61347c565b5b6000613e3b8782880161367e565b9450506020613e4c8782880161367e565b9350506040613e5d8782880161360a565b925050606085013567ffffffffffffffff811115613e7e57613e7d613481565b5b613e8a87828801613de5565b91505092959194509250565b600060208284031215613eac57613eab61347c565b5b6000613eba848285016137d5565b91505092915050565b60008060408385031215613eda57613ed961347c565b5b6000613ee88582860161367e565b9250506020613ef98582860161367e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613f4a57607f821691505b602082108103613f5d57613f5c613f03565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613fbf602c8361354c565b9150613fca82613f63565b604082019050919050565b60006020820190508181036000830152613fee81613fb2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061402f82613430565b915061403a83613430565b925082820390508181111561405257614051613ff5565b5b92915050565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b60006140b460268361354c565b91506140bf82614058565b604082019050919050565b600060208201905081810360008301526140e3816140a7565b9050919050565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b6000614146602b8361354c565b9150614151826140ea565b604082019050919050565b6000602082019050818103600083015261417581614139565b9050919050565b600061418782613430565b915061419283613430565b92508282019050808211156141aa576141a9613ff5565b5b92915050565b60006141bb82613856565b9050919050565b6141cb816141b0565b82525050565b60006040820190506141e660008301856141c2565b6141f3602083018461343a565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061423482613430565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361426657614265613ff5565b5b600182019050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006142cd602b8361354c565b91506142d882614271565b604082019050919050565b600060208201905081810360008301526142fc816142c0565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b600061435f602c8361354c565b915061436a82614303565b604082019050919050565b6000602082019050818103600083015261438e81614352565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006143f160298361354c565b91506143fc82614395565b604082019050919050565b60006020820190508181036000830152614420816143e4565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026144947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614457565b61449e8683614457565b95508019841693508086168417925050509392505050565b60006144d16144cc6144c784613430565b61382a565b613430565b9050919050565b6000819050919050565b6144eb836144b6565b6144ff6144f7826144d8565b848454614464565b825550505050565b600090565b614514614507565b61451f8184846144e2565b505050565b5b818110156145435761453860008261450c565b600181019050614525565b5050565b601f8211156145885761455981614432565b61456284614447565b81016020851015614571578190505b61458561457d85614447565b830182614524565b50505b505050565b600082821c905092915050565b60006145ab6000198460080261458d565b1980831691505092915050565b60006145c4838361459a565b9150826002028217905092915050565b6145de8383614427565b67ffffffffffffffff8111156145f7576145f6613ce8565b5b6146018254613f32565b61460c828285614547565b6000601f83116001811461463b5760008415614629578287013590505b61463385826145b8565b86555061469b565b601f19841661464986614432565b60005b828110156146715784890135825560018201915060208501945060208101905061464c565b8683101561468e578489013561468a601f89168261459a565b8355505b6001600288020188555050505b50505050505050565b7f4552523a4e430000000000000000000000000000000000000000000000000000600082015250565b60006146da60068361354c565b91506146e5826146a4565b602082019050919050565b60006020820190508181036000830152614709816146cd565b9050919050565b7f4552523a534c0000000000000000000000000000000000000000000000000000600082015250565b600061474660068361354c565b915061475182614710565b602082019050919050565b6000602082019050818103600083015261477581614739565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b60006147d8602a8361354c565b91506147e38261477c565b604082019050919050565b60006020820190508181036000830152614807816147cb565b9050919050565b7f4552523a4e410000000000000000000000000000000000000000000000000000600082015250565b600061484460068361354c565b915061484f8261480e565b602082019050919050565b6000602082019050818103600083015261487381614837565b9050919050565b7f4552523a4f4f0000000000000000000000000000000000000000000000000000600082015250565b60006148b060068361354c565b91506148bb8261487a565b602082019050919050565b600060208201905081810360008301526148df816148a3565b9050919050565b60006148f182613430565b91506148fc83613430565b925082820261490a81613430565b9150828204841483151761492157614920613ff5565b5b5092915050565b7f4552523a54550000000000000000000000000000000000000000000000000000600082015250565b600061495e60068361354c565b915061496982614928565b602082019050919050565b6000602082019050818103600083015261498d81614951565b9050919050565b7f4552523a4d4f0000000000000000000000000000000000000000000000000000600082015250565b60006149ca60068361354c565b91506149d582614994565b602082019050919050565b600060208201905081810360008301526149f9816149bd565b9050919050565b600081519050614a0f816135f3565b92915050565b600060208284031215614a2b57614a2a61347c565b5b6000614a3984828501614a00565b91505092915050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614a9e602f8361354c565b9150614aa982614a42565b604082019050919050565b60006020820190508181036000830152614acd81614a91565b9050919050565b600081905092915050565b60008154614aec81613f32565b614af68186614ad4565b94506001821660008114614b115760018114614b2657614b59565b60ff1983168652811515820286019350614b59565b614b2f85614432565b60005b83811015614b5157815481890152600182019150602081019050614b32565b838801955050505b50505092915050565b6000614b6d82613541565b614b778185614ad4565b9350614b8781856020860161355d565b80840191505092915050565b6000614b9f8286614adf565b9150614bab8285614b62565b9150614bb78284614adf565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614c2060268361354c565b9150614c2b82614bc4565b604082019050919050565b60006020820190508181036000830152614c4f81614c13565b9050919050565b6000604082019050614c6b6000830185613421565b614c786020830184613421565b9392505050565b600081519050614c8e81613b4d565b92915050565b600060208284031215614caa57614ca961347c565b5b6000614cb884828501614c7f565b91505092915050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000614d1d60218361354c565b9150614d2882614cc1565b604082019050919050565b60006020820190508181036000830152614d4c81614d10565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000614daf60388361354c565b9150614dba82614d53565b604082019050919050565b60006020820190508181036000830152614dde81614da2565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b6000614e1b601d8361354c565b9150614e2682614de5565b602082019050919050565b60006020820190508181036000830152614e4a81614e0e565b9050919050565b600081905092915050565b50565b6000614e6c600083614e51565b9150614e7782614e5c565b600082019050919050565b6000614e8d82614e5f565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000614ef3603a8361354c565b9150614efe82614e97565b604082019050919050565b60006020820190508181036000830152614f2281614ee6565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000614f8560318361354c565b9150614f9082614f29565b604082019050919050565b60006020820190508181036000830152614fb481614f78565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614ff160208361354c565b9150614ffc82614fbb565b602082019050919050565b6000602082019050818103600083015261502081614fe4565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061505d60198361354c565b915061506882615027565b602082019050919050565b6000602082019050818103600083015261508c81615050565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006150cd82613430565b91506150d883613430565b9250826150e8576150e7615093565b5b828204905092915050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061514f602c8361354c565b915061515a826150f3565b604082019050919050565b6000602082019050818103600083015261517e81615142565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006151e160298361354c565b91506151ec82615185565b604082019050919050565b60006020820190508181036000830152615210816151d4565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061527360248361354c565b915061527e82615217565b604082019050919050565b600060208201905081810360008301526152a281615266565b9050919050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000615305602a8361354c565b9150615310826152a9565b604082019050919050565b60006020820190508181036000830152615334816152f8565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061539760328361354c565b91506153a28261533b565b604082019050919050565b600060208201905081810360008301526153c68161538a565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006153f4826153cd565b6153fe81856153d8565b935061540e81856020860161355d565b61541781613587565b840191505092915050565b60006080820190506154376000830187613421565b6154446020830186613421565b615451604083018561343a565b818103606083015261546381846153e9565b905095945050505050565b60008151905061547d816134b2565b92915050565b6000602082840312156154995761549861347c565b5b60006154a78482850161546e565b91505092915050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b600061550c60268361354c565b9150615517826154b0565b604082019050919050565b6000602082019050818103600083015261553b816154ff565b9050919050565b600061554d826153cd565b6155578185614e51565b935061556781856020860161355d565b80840191505092915050565b600061557f8284615542565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b60006155c0601d8361354c565b91506155cb8261558a565b602082019050919050565b600060208201905081810360008301526155ef816155b3565b905091905056fea2646970667358221220a95507c1193cd3640af3929328d2d0f94e5fd465adccc7c757c91e4f9df3240264736f6c63430008110033697066733a2f2f62616679626569656c61687470763778616934673270783333376b63753577376f63726b78647534726c7368786b6f32626167327071637a6f77752f
Deployed Bytecode
0x6080604052600436106102765760003560e01c80636f8b44b01161014f578063a3f8eace116100c1578063ce7c2ac21161007a578063ce7c2ac214610a0d578063d79779b214610a4a578063dde3d31314610a87578063e33b7de314610ab0578063e985e9c514610adb578063f2fde38b14610b18576102bd565b8063a3f8eace146108db578063acec338a14610918578063b534a5c414610941578063b88d4fde1461096a578063c45ac05014610993578063c87b56dd146109d0576102bd565b80638da5cb5b116101135780638da5cb5b146107da57806391b7f5ed1461080557806395d89b411461082e5780639852595c14610859578063a0712d6814610896578063a22cb465146108b2576102bd565b80636f8b44b0146106f557806370a082311461071e578063715018a61461075b5780638b83209b146107725780638d859f3e146107af576102bd565b8063406072a9116101e85780634c8fe526116101ac5780634c8fe526146105bf5780634d44660c146105ea5780634f6ccce71461062757806350c5a00c146106645780636352211e1461068f5780636790a9de146106cc576102bd565b8063406072a9146104c857806341f434341461050557806342842e0e14610530578063438b63001461055957806348b7504414610596576102bd565b8063191655871161023a57806319165587146103b857806322f3e2d4146103e157806323b872dd1461040c5780632f745c591461043557806332cb6b0c146104725780633a98ef391461049d576102bd565b806301ffc9a7146102bf57806306fdde03146102fc578063081812fc14610327578063095ea7b31461036457806318160ddd1461038d576102bd565b366102bd577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be7706102a4610b41565b346040516102b3929190613449565b60405180910390a1005b005b3480156102cb57600080fd5b506102e660048036038101906102e191906134de565b610b49565b6040516102f39190613526565b60405180910390f35b34801561030857600080fd5b50610311610bc3565b60405161031e91906135d1565b60405180910390f35b34801561033357600080fd5b5061034e6004803603810190610349919061361f565b610c55565b60405161035b919061364c565b60405180910390f35b34801561037057600080fd5b5061038b60048036038101906103869190613693565b610cda565b005b34801561039957600080fd5b506103a2610cf3565b6040516103af91906136d3565b60405180910390f35b3480156103c457600080fd5b506103df60048036038101906103da919061372c565b610d0d565b005b3480156103ed57600080fd5b506103f6610e8c565b6040516104039190613526565b60405180910390f35b34801561041857600080fd5b50610433600480360381019061042e9190613759565b610e9f565b005b34801561044157600080fd5b5061045c60048036038101906104579190613693565b610eee565b60405161046991906136d3565b60405180910390f35b34801561047e57600080fd5b50610487610feb565b60405161049491906136d3565b60405180910390f35b3480156104a957600080fd5b506104b2610ff1565b6040516104bf91906136d3565b60405180910390f35b3480156104d457600080fd5b506104ef60048036038101906104ea91906137ea565b610ffb565b6040516104fc91906136d3565b60405180910390f35b34801561051157600080fd5b5061051a611082565b6040516105279190613889565b60405180910390f35b34801561053c57600080fd5b5061055760048036038101906105529190613759565b611094565b005b34801561056557600080fd5b50610580600480360381019061057b91906138a4565b6110e3565b60405161058d919061398f565b60405180910390f35b3480156105a257600080fd5b506105bd60048036038101906105b891906137ea565b61118f565b005b3480156105cb57600080fd5b506105d46113a2565b6040516105e191906136d3565b60405180910390f35b3480156105f657600080fd5b50610611600480360381019061060c9190613a16565b6113af565b60405161061e9190613526565b60405180910390f35b34801561063357600080fd5b5061064e6004803603810190610649919061361f565b611470565b60405161065b91906136d3565b60405180910390f35b34801561067057600080fd5b506106796114c3565b60405161068691906136d3565b60405180910390f35b34801561069b57600080fd5b506106b660048036038101906106b1919061361f565b6114c9565b6040516106c3919061364c565b60405180910390f35b3480156106d857600080fd5b506106f360048036038101906106ee9190613acc565b611585565b005b34801561070157600080fd5b5061071c6004803603810190610717919061361f565b6115b7565b005b34801561072a57600080fd5b50610745600480360381019061074091906138a4565b611657565b60405161075291906136d3565b60405180910390f35b34801561076757600080fd5b50610770611771565b005b34801561077e57600080fd5b506107996004803603810190610794919061361f565b611785565b6040516107a6919061364c565b60405180910390f35b3480156107bb57600080fd5b506107c46117cd565b6040516107d191906136d3565b60405180910390f35b3480156107e657600080fd5b506107ef6117d3565b6040516107fc919061364c565b60405180910390f35b34801561081157600080fd5b5061082c6004803603810190610827919061361f565b6117fd565b005b34801561083a57600080fd5b50610843611853565b60405161085091906135d1565b60405180910390f35b34801561086557600080fd5b50610880600480360381019061087b91906138a4565b6118e5565b60405161088d91906136d3565b60405180910390f35b6108b060048036038101906108ab919061361f565b61192e565b005b3480156108be57600080fd5b506108d960048036038101906108d49190613b79565b611aeb565b005b3480156108e757600080fd5b5061090260048036038101906108fd91906138a4565b611b04565b60405161090f91906136d3565b60405180910390f35b34801561092457600080fd5b5061093f600480360381019061093a9190613bb9565b611b37565b005b34801561094d57600080fd5b5061096860048036038101906109639190613c3c565b611bb1565b005b34801561097657600080fd5b50610991600480360381019061098c9190613e13565b611c42565b005b34801561099f57600080fd5b506109ba60048036038101906109b591906137ea565b611c93565b6040516109c791906136d3565b60405180910390f35b3480156109dc57600080fd5b506109f760048036038101906109f2919061361f565b611d42565b604051610a0491906135d1565b60405180910390f35b348015610a1957600080fd5b50610a346004803603810190610a2f91906138a4565b611dc1565b604051610a4191906136d3565b60405180910390f35b348015610a5657600080fd5b50610a716004803603810190610a6c9190613e96565b611e0a565b604051610a7e91906136d3565b60405180910390f35b348015610a9357600080fd5b50610aae6004803603810190610aa9919061361f565b611e53565b005b348015610abc57600080fd5b50610ac5611ea9565b604051610ad291906136d3565b60405180910390f35b348015610ae757600080fd5b50610b026004803603810190610afd9190613ec3565b611eb3565b604051610b0f9190613526565b60405180910390f35b348015610b2457600080fd5b50610b3f6004803603810190610b3a91906138a4565b611f47565b005b600033905090565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610bbc5750610bbb82611fca565b5b9050919050565b606060008054610bd290613f32565b80601f0160208091040260200160405190810160405280929190818152602001828054610bfe90613f32565b8015610c4b5780601f10610c2057610100808354040283529160200191610c4b565b820191906000526020600020905b815481529060010190602001808311610c2e57829003601f168201915b5050505050905090565b6000610c60826120ac565b610c9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9690613fd5565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610ce481612134565b610cee8383612231565b505050565b6000600254600380549050610d089190614024565b905090565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610d8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d86906140ca565b60405180910390fd5b6000610d9a82611b04565b905060008103610ddf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd69061415c565b60405180910390fd5b8060076000828254610df1919061417c565b9250508190555080600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550610e4f8282612348565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0568282604051610e809291906141d1565b60405180910390a15050565b601160009054906101000a900460ff1681565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610edd57610edc33612134565b5b610ee884848461243c565b50505050565b60008060005b600380549050811015610fa15760038181548110610f1557610f146141fa565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610f9057838203610f83578092505050610fe5565b81610f8d90614229565b91505b80610f9a90614229565b9050610ef4565b506000610fe3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fda906142e3565b60405180910390fd5b505b92915050565b600f5481565b6000600654905090565b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146110d2576110d133612134565b5b6110dd84848461249c565b50505050565b606060006110f083611657565b905060008167ffffffffffffffff81111561110e5761110d613ce8565b5b60405190808252806020026020018201604052801561113c5781602001602082028036833780820191505090505b50905060005b82811015611184576111548582610eee565b828281518110611167576111666141fa565b5b6020026020010181815250508061117d90614229565b9050611142565b508092505050919050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611211576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611208906140ca565b60405180910390fd5b600061121d8383611c93565b905060008103611262576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112599061415c565b60405180910390fd5b80600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112b1919061417c565b9250508190555080600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061134d8383836124bc565b8273ffffffffffffffffffffffffffffffffffffffff167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a8383604051611395929190613449565b60405180910390a2505050565b6000600380549050905090565b6000805b83839050811015611463578473ffffffffffffffffffffffffffffffffffffffff1660038585848181106113ea576113e96141fa565b5b9050602002013581548110611402576114016141fa565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611452576000915050611469565b8061145c90614229565b90506113b3565b50600190505b9392505050565b600061147a610cf3565b82106114bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b290614375565b60405180910390fd5b819050919050565b600e5481565b600080600383815481106114e0576114df6141fa565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361157c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157390614407565b60405180910390fd5b80915050919050565b61158d612542565b83836012918261159e9291906145d4565b508181601391826115b09291906145d4565b5050505050565b6115bf612542565b80600f5403611603576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fa906146f0565b60405180910390fd5b61160b610cf3565b81101561164d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116449061475c565b60405180910390fd5b80600f8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116be906147ee565b60405180910390fd5b6000805b60038054905081101561176757600381815481106116ec576116eb6141fa565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611756578161175390614229565b91505b8061176090614229565b90506116cb565b5080915050919050565b611779612542565b61178360006125c0565b565b6000600a828154811061179b5761179a6141fa565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60105481565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611805612542565b8060105403611849576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611840906146f0565b60405180910390fd5b8060108190555050565b60606001805461186290613f32565b80601f016020809104026020016040519081016040528092919081815260200182805461188e90613f32565b80156118db5780601f106118b0576101008083540402835291602001916118db565b820191906000526020600020905b8154815290600101906020018083116118be57829003601f168201915b5050505050905090565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b601160009054906101000a900460ff1661197d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119749061485a565b60405180910390fd5b600e548111156119c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b9906148c6565b60405180910390fd5b6119ca6117d3565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a4d5780601054611a0a91906148e6565b341015611a4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4390614974565b60405180910390fd5b5b6000611a57610cf3565b9050600f548282611a68919061417c565b1115611aa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa0906149e0565b60405180910390fd5b60005b82811015611ae657611ad533600183611ac5919061417c565b84611ad0919061417c565b612686565b80611adf90614229565b9050611aac565b505050565b81611af581612134565b611aff8383612749565b505050565b600080611b0f611ea9565b47611b1a919061417c565b9050611b2f8382611b2a866118e5565b6128c9565b915050919050565b611b3f612542565b801515601160009054906101000a900460ff16151503611b94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8b906146f0565b60405180910390fd5b80601160006101000a81548160ff02191690831515021790555050565b60005b84849050811015611c3957611c288787878785818110611bd757611bd66141fa565b5b9050602002013586868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611c42565b80611c3290614229565b9050611bb4565b50505050505050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611c8057611c7f33612134565b5b611c8c85858585612937565b5050505050565b600080611c9f84611e0a565b8473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611cd8919061364c565b602060405180830381865afa158015611cf5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d199190614a15565b611d23919061417c565b9050611d398382611d348787610ffb565b6128c9565b91505092915050565b6060611d4d826120ac565b611d8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8390614ab4565b60405180910390fd5b6012611d9783612999565b6013604051602001611dab93929190614b93565b6040516020818303038152906040529050919050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611e5b612542565b80600e5403611e9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e96906146f0565b60405180910390fd5b80600e8190555050565b6000600754905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611f4f612542565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611fbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb590614c36565b60405180910390fd5b611fc7816125c0565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061209557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806120a557506120a482612a67565b5b9050919050565b60006003805490508210801561212d5750600073ffffffffffffffffffffffffffffffffffffffff16600383815481106120e9576120e86141fa565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561222e576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016121ab929190614c56565b602060405180830381865afa1580156121c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ec9190614c94565b61222d57806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401612224919061364c565b60405180910390fd5b5b50565b600061223c826114c9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036122ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a390614d33565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166122cb610b41565b73ffffffffffffffffffffffffffffffffffffffff1614806122fa57506122f9816122f4610b41565b611eb3565b5b612339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233090614dc5565b60405180910390fd5b6123438383612ad1565b505050565b8047101561238b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238290614e31565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516123b190614e82565b60006040518083038185875af1925050503d80600081146123ee576040519150601f19603f3d011682016040523d82523d6000602084013e6123f3565b606091505b5050905080612437576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242e90614f09565b60405180910390fd5b505050565b61244d612447610b41565b82612b8a565b61248c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248390614f9b565b60405180910390fd5b612497838383612c68565b505050565b6124b783838360405180602001604052806000815250611c42565b505050565b61253d8363a9059cbb60e01b84846040516024016124db929190613449565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612e20565b505050565b61254a610b41565b73ffffffffffffffffffffffffffffffffffffffff166125686117d3565b73ffffffffffffffffffffffffffffffffffffffff16146125be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b590615007565b60405180910390fd5b565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6003829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b612751610b41565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036127be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b590615073565b60405180910390fd5b80600560006127cb610b41565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612878610b41565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516128bd9190613526565b60405180910390a35050565b600081600654600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548561291a91906148e6565b61292491906150c2565b61292e9190614024565b90509392505050565b612948612942610b41565b83612b8a565b612987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297e90614f9b565b60405180910390fd5b61299384848484612ee7565b50505050565b6060600060016129a884612f43565b01905060008167ffffffffffffffff8111156129c7576129c6613ce8565b5b6040519080825280601f01601f1916602001820160405280156129f95781602001600182028036833780820191505090505b509050600082602001820190505b600115612a5c578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612a5057612a4f615093565b5b04945060008503612a07575b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612b44836114c9565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612b95826120ac565b612bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bcb90615165565b60405180910390fd5b6000612bdf836114c9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612c4e57508373ffffffffffffffffffffffffffffffffffffffff16612c3684610c55565b73ffffffffffffffffffffffffffffffffffffffff16145b80612c5f5750612c5e8185611eb3565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612c88826114c9565b73ffffffffffffffffffffffffffffffffffffffff1614612cde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd5906151f7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612d4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4490615289565b60405180910390fd5b612d58838383613096565b612d63600082612ad1565b8160038281548110612d7857612d776141fa565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000612e82826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661309b9092919063ffffffff16565b9050600081511115612ee25780806020019051810190612ea29190614c94565b612ee1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed89061531b565b60405180910390fd5b5b505050565b612ef2848484612c68565b612efe848484846130b3565b612f3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f34906153ad565b60405180910390fd5b50505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612fa1577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612f9757612f96615093565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612fde576d04ee2d6d415b85acef81000000008381612fd457612fd3615093565b5b0492506020810190505b662386f26fc10000831061300d57662386f26fc10000838161300357613002615093565b5b0492506010810190505b6305f5e1008310613036576305f5e100838161302c5761302b615093565b5b0492506008810190505b612710831061305b57612710838161305157613050615093565b5b0492506004810190505b6064831061307e576064838161307457613073615093565b5b0492506002810190505b600a831061308d576001810190505b80915050919050565b505050565b60606130aa848460008561323a565b90509392505050565b60006130d48473ffffffffffffffffffffffffffffffffffffffff16613307565b1561322d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026130fd610b41565b8786866040518563ffffffff1660e01b815260040161311f9493929190615422565b6020604051808303816000875af192505050801561315b57506040513d601f19601f820116820180604052508101906131589190615483565b60015b6131dd573d806000811461318b576040519150601f19603f3d011682016040523d82523d6000602084013e613190565b606091505b5060008151036131d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131cc906153ad565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613232565b600190505b949350505050565b60608247101561327f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161327690615522565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516132a89190615573565b60006040518083038185875af1925050503d80600081146132e5576040519150601f19603f3d011682016040523d82523d6000602084013e6132ea565b606091505b50915091506132fb8783838761332a565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6060831561338c5760008351036133845761334485613307565b613383576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337a906155d6565b60405180910390fd5b5b829050613397565b613396838361339f565b5b949350505050565b6000825111156133b25781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133e691906135d1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061341a826133ef565b9050919050565b61342a8161340f565b82525050565b6000819050919050565b61344381613430565b82525050565b600060408201905061345e6000830185613421565b61346b602083018461343a565b9392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6134bb81613486565b81146134c657600080fd5b50565b6000813590506134d8816134b2565b92915050565b6000602082840312156134f4576134f361347c565b5b6000613502848285016134c9565b91505092915050565b60008115159050919050565b6135208161350b565b82525050565b600060208201905061353b6000830184613517565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561357b578082015181840152602081019050613560565b60008484015250505050565b6000601f19601f8301169050919050565b60006135a382613541565b6135ad818561354c565b93506135bd81856020860161355d565b6135c681613587565b840191505092915050565b600060208201905081810360008301526135eb8184613598565b905092915050565b6135fc81613430565b811461360757600080fd5b50565b600081359050613619816135f3565b92915050565b6000602082840312156136355761363461347c565b5b60006136438482850161360a565b91505092915050565b60006020820190506136616000830184613421565b92915050565b6136708161340f565b811461367b57600080fd5b50565b60008135905061368d81613667565b92915050565b600080604083850312156136aa576136a961347c565b5b60006136b88582860161367e565b92505060206136c98582860161360a565b9150509250929050565b60006020820190506136e8600083018461343a565b92915050565b60006136f9826133ef565b9050919050565b613709816136ee565b811461371457600080fd5b50565b60008135905061372681613700565b92915050565b6000602082840312156137425761374161347c565b5b600061375084828501613717565b91505092915050565b6000806000606084860312156137725761377161347c565b5b60006137808682870161367e565b93505060206137918682870161367e565b92505060406137a28682870161360a565b9150509250925092565b60006137b78261340f565b9050919050565b6137c7816137ac565b81146137d257600080fd5b50565b6000813590506137e4816137be565b92915050565b600080604083850312156138015761380061347c565b5b600061380f858286016137d5565b92505060206138208582860161367e565b9150509250929050565b6000819050919050565b600061384f61384a613845846133ef565b61382a565b6133ef565b9050919050565b600061386182613834565b9050919050565b600061387382613856565b9050919050565b61388381613868565b82525050565b600060208201905061389e600083018461387a565b92915050565b6000602082840312156138ba576138b961347c565b5b60006138c88482850161367e565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61390681613430565b82525050565b600061391883836138fd565b60208301905092915050565b6000602082019050919050565b600061393c826138d1565b61394681856138dc565b9350613951836138ed565b8060005b83811015613982578151613969888261390c565b975061397483613924565b925050600181019050613955565b5085935050505092915050565b600060208201905081810360008301526139a98184613931565b905092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126139d6576139d56139b1565b5b8235905067ffffffffffffffff8111156139f3576139f26139b6565b5b602083019150836020820283011115613a0f57613a0e6139bb565b5b9250929050565b600080600060408486031215613a2f57613a2e61347c565b5b6000613a3d8682870161367e565b935050602084013567ffffffffffffffff811115613a5e57613a5d613481565b5b613a6a868287016139c0565b92509250509250925092565b60008083601f840112613a8c57613a8b6139b1565b5b8235905067ffffffffffffffff811115613aa957613aa86139b6565b5b602083019150836001820283011115613ac557613ac46139bb565b5b9250929050565b60008060008060408587031215613ae657613ae561347c565b5b600085013567ffffffffffffffff811115613b0457613b03613481565b5b613b1087828801613a76565b9450945050602085013567ffffffffffffffff811115613b3357613b32613481565b5b613b3f87828801613a76565b925092505092959194509250565b613b568161350b565b8114613b6157600080fd5b50565b600081359050613b7381613b4d565b92915050565b60008060408385031215613b9057613b8f61347c565b5b6000613b9e8582860161367e565b9250506020613baf85828601613b64565b9150509250929050565b600060208284031215613bcf57613bce61347c565b5b6000613bdd84828501613b64565b91505092915050565b60008083601f840112613bfc57613bfb6139b1565b5b8235905067ffffffffffffffff811115613c1957613c186139b6565b5b602083019150836001820283011115613c3557613c346139bb565b5b9250929050565b60008060008060008060808789031215613c5957613c5861347c565b5b6000613c6789828a0161367e565b9650506020613c7889828a0161367e565b955050604087013567ffffffffffffffff811115613c9957613c98613481565b5b613ca589828a016139c0565b9450945050606087013567ffffffffffffffff811115613cc857613cc7613481565b5b613cd489828a01613be6565b92509250509295509295509295565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613d2082613587565b810181811067ffffffffffffffff82111715613d3f57613d3e613ce8565b5b80604052505050565b6000613d52613472565b9050613d5e8282613d17565b919050565b600067ffffffffffffffff821115613d7e57613d7d613ce8565b5b613d8782613587565b9050602081019050919050565b82818337600083830152505050565b6000613db6613db184613d63565b613d48565b905082815260208101848484011115613dd257613dd1613ce3565b5b613ddd848285613d94565b509392505050565b600082601f830112613dfa57613df96139b1565b5b8135613e0a848260208601613da3565b91505092915050565b60008060008060808587031215613e2d57613e2c61347c565b5b6000613e3b8782880161367e565b9450506020613e4c8782880161367e565b9350506040613e5d8782880161360a565b925050606085013567ffffffffffffffff811115613e7e57613e7d613481565b5b613e8a87828801613de5565b91505092959194509250565b600060208284031215613eac57613eab61347c565b5b6000613eba848285016137d5565b91505092915050565b60008060408385031215613eda57613ed961347c565b5b6000613ee88582860161367e565b9250506020613ef98582860161367e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613f4a57607f821691505b602082108103613f5d57613f5c613f03565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613fbf602c8361354c565b9150613fca82613f63565b604082019050919050565b60006020820190508181036000830152613fee81613fb2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061402f82613430565b915061403a83613430565b925082820390508181111561405257614051613ff5565b5b92915050565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b60006140b460268361354c565b91506140bf82614058565b604082019050919050565b600060208201905081810360008301526140e3816140a7565b9050919050565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b6000614146602b8361354c565b9150614151826140ea565b604082019050919050565b6000602082019050818103600083015261417581614139565b9050919050565b600061418782613430565b915061419283613430565b92508282019050808211156141aa576141a9613ff5565b5b92915050565b60006141bb82613856565b9050919050565b6141cb816141b0565b82525050565b60006040820190506141e660008301856141c2565b6141f3602083018461343a565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061423482613430565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361426657614265613ff5565b5b600182019050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006142cd602b8361354c565b91506142d882614271565b604082019050919050565b600060208201905081810360008301526142fc816142c0565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b600061435f602c8361354c565b915061436a82614303565b604082019050919050565b6000602082019050818103600083015261438e81614352565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006143f160298361354c565b91506143fc82614395565b604082019050919050565b60006020820190508181036000830152614420816143e4565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026144947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614457565b61449e8683614457565b95508019841693508086168417925050509392505050565b60006144d16144cc6144c784613430565b61382a565b613430565b9050919050565b6000819050919050565b6144eb836144b6565b6144ff6144f7826144d8565b848454614464565b825550505050565b600090565b614514614507565b61451f8184846144e2565b505050565b5b818110156145435761453860008261450c565b600181019050614525565b5050565b601f8211156145885761455981614432565b61456284614447565b81016020851015614571578190505b61458561457d85614447565b830182614524565b50505b505050565b600082821c905092915050565b60006145ab6000198460080261458d565b1980831691505092915050565b60006145c4838361459a565b9150826002028217905092915050565b6145de8383614427565b67ffffffffffffffff8111156145f7576145f6613ce8565b5b6146018254613f32565b61460c828285614547565b6000601f83116001811461463b5760008415614629578287013590505b61463385826145b8565b86555061469b565b601f19841661464986614432565b60005b828110156146715784890135825560018201915060208501945060208101905061464c565b8683101561468e578489013561468a601f89168261459a565b8355505b6001600288020188555050505b50505050505050565b7f4552523a4e430000000000000000000000000000000000000000000000000000600082015250565b60006146da60068361354c565b91506146e5826146a4565b602082019050919050565b60006020820190508181036000830152614709816146cd565b9050919050565b7f4552523a534c0000000000000000000000000000000000000000000000000000600082015250565b600061474660068361354c565b915061475182614710565b602082019050919050565b6000602082019050818103600083015261477581614739565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b60006147d8602a8361354c565b91506147e38261477c565b604082019050919050565b60006020820190508181036000830152614807816147cb565b9050919050565b7f4552523a4e410000000000000000000000000000000000000000000000000000600082015250565b600061484460068361354c565b915061484f8261480e565b602082019050919050565b6000602082019050818103600083015261487381614837565b9050919050565b7f4552523a4f4f0000000000000000000000000000000000000000000000000000600082015250565b60006148b060068361354c565b91506148bb8261487a565b602082019050919050565b600060208201905081810360008301526148df816148a3565b9050919050565b60006148f182613430565b91506148fc83613430565b925082820261490a81613430565b9150828204841483151761492157614920613ff5565b5b5092915050565b7f4552523a54550000000000000000000000000000000000000000000000000000600082015250565b600061495e60068361354c565b915061496982614928565b602082019050919050565b6000602082019050818103600083015261498d81614951565b9050919050565b7f4552523a4d4f0000000000000000000000000000000000000000000000000000600082015250565b60006149ca60068361354c565b91506149d582614994565b602082019050919050565b600060208201905081810360008301526149f9816149bd565b9050919050565b600081519050614a0f816135f3565b92915050565b600060208284031215614a2b57614a2a61347c565b5b6000614a3984828501614a00565b91505092915050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614a9e602f8361354c565b9150614aa982614a42565b604082019050919050565b60006020820190508181036000830152614acd81614a91565b9050919050565b600081905092915050565b60008154614aec81613f32565b614af68186614ad4565b94506001821660008114614b115760018114614b2657614b59565b60ff1983168652811515820286019350614b59565b614b2f85614432565b60005b83811015614b5157815481890152600182019150602081019050614b32565b838801955050505b50505092915050565b6000614b6d82613541565b614b778185614ad4565b9350614b8781856020860161355d565b80840191505092915050565b6000614b9f8286614adf565b9150614bab8285614b62565b9150614bb78284614adf565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614c2060268361354c565b9150614c2b82614bc4565b604082019050919050565b60006020820190508181036000830152614c4f81614c13565b9050919050565b6000604082019050614c6b6000830185613421565b614c786020830184613421565b9392505050565b600081519050614c8e81613b4d565b92915050565b600060208284031215614caa57614ca961347c565b5b6000614cb884828501614c7f565b91505092915050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000614d1d60218361354c565b9150614d2882614cc1565b604082019050919050565b60006020820190508181036000830152614d4c81614d10565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000614daf60388361354c565b9150614dba82614d53565b604082019050919050565b60006020820190508181036000830152614dde81614da2565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b6000614e1b601d8361354c565b9150614e2682614de5565b602082019050919050565b60006020820190508181036000830152614e4a81614e0e565b9050919050565b600081905092915050565b50565b6000614e6c600083614e51565b9150614e7782614e5c565b600082019050919050565b6000614e8d82614e5f565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000614ef3603a8361354c565b9150614efe82614e97565b604082019050919050565b60006020820190508181036000830152614f2281614ee6565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000614f8560318361354c565b9150614f9082614f29565b604082019050919050565b60006020820190508181036000830152614fb481614f78565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614ff160208361354c565b9150614ffc82614fbb565b602082019050919050565b6000602082019050818103600083015261502081614fe4565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061505d60198361354c565b915061506882615027565b602082019050919050565b6000602082019050818103600083015261508c81615050565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006150cd82613430565b91506150d883613430565b9250826150e8576150e7615093565b5b828204905092915050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061514f602c8361354c565b915061515a826150f3565b604082019050919050565b6000602082019050818103600083015261517e81615142565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006151e160298361354c565b91506151ec82615185565b604082019050919050565b60006020820190508181036000830152615210816151d4565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061527360248361354c565b915061527e82615217565b604082019050919050565b600060208201905081810360008301526152a281615266565b9050919050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000615305602a8361354c565b9150615310826152a9565b604082019050919050565b60006020820190508181036000830152615334816152f8565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061539760328361354c565b91506153a28261533b565b604082019050919050565b600060208201905081810360008301526153c68161538a565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006153f4826153cd565b6153fe81856153d8565b935061540e81856020860161355d565b61541781613587565b840191505092915050565b60006080820190506154376000830187613421565b6154446020830186613421565b615451604083018561343a565b818103606083015261546381846153e9565b905095945050505050565b60008151905061547d816134b2565b92915050565b6000602082840312156154995761549861347c565b5b60006154a78482850161546e565b91505092915050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b600061550c60268361354c565b9150615517826154b0565b604082019050919050565b6000602082019050818103600083015261553b816154ff565b9050919050565b600061554d826153cd565b6155578185614e51565b935061556781856020860161355d565b80840191505092915050565b600061557f8284615542565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b60006155c0601d8361354c565b91506155cb8261558a565b602082019050919050565b600060208201905081810360008301526155ef816155b3565b905091905056fea2646970667358221220a95507c1193cd3640af3929328d2d0f94e5fd465adccc7c757c91e4f9df3240264736f6c63430008110033
Deployed Bytecode Sourcemap
72787:4157:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61792:40;61808:12;:10;:12::i;:::-;61822:9;61792:40;;;;;;;:::i;:::-;;;;;;;;72787:4157;;;47038:225;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39693:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41100:216;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76124:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47926:147;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64313:671;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73065:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76307:181;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47271:439;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72986:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61923:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63052:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70157:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76496:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48334:338;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65252:792;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39803:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46752:278;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47718:200;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72952:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39894:236;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75105:180;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75632:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39349:336;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28390:103;;;;;;;;;;;;;:::i;:::-;;63278:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73021:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27742:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75468:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40451:106;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62774:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73865:578;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75914:202;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63468:225;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74927:166;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48081:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76693:246;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63853:260;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74451:276;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62570:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62360:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75293:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62108:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41324:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28648:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26293:98;26346:7;26373:10;26366:17;;26293:98;:::o;47038:225::-;47141:4;47180:35;47165:50;;;:11;:50;;;;:90;;;;47219:36;47243:11;47219:23;:36::i;:::-;47165:90;47158:97;;47038:225;;;:::o;39693:102::-;39749:13;39782:5;39775:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39693:102;:::o;41100:216::-;41173:7;41201:16;41209:7;41201;:16::i;:::-;41193:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41284:15;:24;41300:7;41284:24;;;;;;;;;;;;;;;;;;;;;41277:31;;41100:216;;;:::o;76124:175::-;76238:8;71678:30;71699:8;71678:20;:30::i;:::-;76259:32:::1;76273:8;76283:7;76259:13;:32::i;:::-;76124:175:::0;;;:::o;47926:147::-;48017:4;48058:7;;48041;:14;;;;:24;;;;:::i;:::-;48034:31;;47926:147;:::o;64313:671::-;64408:1;64389:7;:16;64397:7;64389:16;;;;;;;;;;;;;;;;:20;64381:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;64465:15;64483:19;64494:7;64483:10;:19::i;:::-;64465:37;;64534:1;64523:7;:12;64515:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64796:7;64778:14;;:25;;;;;;;:::i;:::-;;;;;;;;64861:7;64839:9;:18;64849:7;64839:18;;;;;;;;;;;;;;;;:29;;;;;;;;;;;64892:35;64910:7;64919;64892:17;:35::i;:::-;64943:33;64959:7;64968;64943:33;;;;;;;:::i;:::-;;;;;;;;64370:614;64313:671;:::o;73065:29::-;;;;;;;;;;;;;:::o;76307:181::-;76426:4;71506:10;71498:18;;:4;:18;;;71494:83;;71533:32;71554:10;71533:20;:32::i;:::-;71494:83;76443:37:::1;76462:4;76468:2;76472:7;76443:18;:37::i;:::-;76307:181:::0;;;;:::o;47271:439::-;47357:12;47382:10;47408:6;47403:226;47420:7;:14;;;;47416:1;:18;47403:226;;;47469:7;47477:1;47469:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;47460:19;;:5;:19;;;47456:162;;47513:5;47504;:14;47500:102;;47549:1;47542:8;;;;;;47500:102;47595:7;;;;:::i;:::-;;;47456:162;47436:3;;;;:::i;:::-;;;47403:226;;;;47649:5;47641:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;47371:339;47271:439;;;;;:::o;72986:28::-;;;;:::o;61923:91::-;61967:7;61994:12;;61987:19;;61923:91;:::o;63052:135::-;63122:7;63149:14;:21;63164:5;63149:21;;;;;;;;;;;;;;;:30;63171:7;63149:30;;;;;;;;;;;;;;;;63142:37;;63052:135;;;;:::o;70157:143::-;70257:42;70157:143;:::o;76496:189::-;76619:4;71506:10;71498:18;;:4;:18;;;71494:83;;71533:32;71554:10;71533:20;:32::i;:::-;71494:83;76636:41:::1;76659:4;76665:2;76669:7;76636:22;:41::i;:::-;76496:189:::0;;;;:::o;48334:338::-;48408:13;48434;48450:20;48461:7;48450:9;:20::i;:::-;48434:36;;48481:20;48516:8;48504:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48481:45;;48542:6;48537:104;48554:8;48550:1;:12;48537:104;;;48596:33;48617:7;48626:1;48596:19;:33::i;:::-;48584:6;48591:1;48584:9;;;;;;;;:::i;:::-;;;;;;;:45;;;;;48564:3;;;;:::i;:::-;;;48537:104;;;;48658:6;48651:13;;;;48334:338;;;:::o;65252:792::-;65353:1;65334:7;:16;65342:7;65334:16;;;;;;;;;;;;;;;;:20;65326:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;65410:15;65428:26;65439:5;65446:7;65428:10;:26::i;:::-;65410:44;;65486:1;65475:7;:12;65467:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65820:7;65790:19;:26;65810:5;65790:26;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;65897:7;65863:14;:21;65878:5;65863:21;;;;;;;;;;;;;;;:30;65885:7;65863:30;;;;;;;;;;;;;;;;:41;;;;;;;;;;;65928:47;65951:5;65958:7;65967;65928:22;:47::i;:::-;66012:5;65991:45;;;66019:7;66028;65991:45;;;;;;;:::i;:::-;;;;;;;;65315:729;65252:792;;:::o;39803:83::-;39840:4;39864:7;:14;;;;39857:21;;39803:83;:::o;46752:278::-;46848:4;46869:6;46865:134;46881:8;;:15;;46877:1;:19;46865:134;;;46948:7;46922:33;;:7;46931:8;;46940:1;46931:11;;;;;;;:::i;:::-;;;;;;;;46922:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:33;;;46918:69;;46982:5;46975:12;;;;;46918:69;46898:3;;;;:::i;:::-;;;46865:134;;;;47018:4;47011:11;;46752:278;;;;;;:::o;47718:200::-;47792:4;47825:13;:11;:13::i;:::-;47817:5;:21;47809:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;47905:5;47898:12;;47718:200;;;:::o;72952:27::-;;;;:::o;39894:236::-;39963:7;39983:13;39999:7;40007;39999:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39983:32;;40051:1;40034:19;;:5;:19;;;40026:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;40117:5;40110:12;;;39894:236;;;:::o;75105:180::-;27628:13;:11;:13::i;:::-;75227:11:::1;;75211:13;:27;;;;;;;:::i;:::-;;75267:10;;75249:15;:28;;;;;;;:::i;:::-;;75105:180:::0;;;;:::o;75632:256::-;27628:13;:11;:13::i;:::-;75722:9:::1;75708:10;;:23:::0;75699:44:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;75797:13;:11;:13::i;:::-;75784:9;:26;;75775:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;75871:9;75858:10;:22;;;;75632:256:::0;:::o;39349:336::-;39421:4;39463:1;39446:19;;:5;:19;;;39438:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;39525:10;39551:6;39546:109;39563:7;:14;;;;39559:1;:18;39546:109;;;39610:7;39618:1;39610:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39601:19;;:5;:19;;;39597:46;;39636:7;;;;:::i;:::-;;;39597:46;39579:3;;;;:::i;:::-;;;39546:109;;;;39672:5;39665:12;;;39349:336;;;:::o;28390:103::-;27628:13;:11;:13::i;:::-;28455:30:::1;28482:1;28455:18;:30::i;:::-;28390:103::o:0;63278:100::-;63329:7;63356;63364:5;63356:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;63349:21;;63278:100;;;:::o;73021:35::-;;;;:::o;27742:87::-;27788:7;27815:6;;;;;;;;;;;27808:13;;27742:87;:::o;75468:148::-;27628:13;:11;:13::i;:::-;75546:5:::1;75537;;:14:::0;75528:35:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;75603:5;75595;:13;;;;75468:148:::0;:::o;40451:106::-;40509:13;40542:7;40535:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40451:106;:::o;62774:109::-;62830:7;62857:9;:18;62867:7;62857:18;;;;;;;;;;;;;;;;62850:25;;62774:109;;;:::o;73865:578::-;73933:8;;;;;;;;;;;73924:28;;;;;;;;;;;;:::i;:::-;;;;;;;;;74007:9;;73995:8;:21;;73986:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;74083:7;:5;:7::i;:::-;74069:21;;:10;:21;;;74065:138;;74137:8;74129:5;;:16;;;;:::i;:::-;74116:9;:29;;74107:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;74065:138;74219:11;74233:13;:11;:13::i;:::-;74219:27;;74287:10;;74275:8;74266:6;:17;;;;:::i;:::-;:31;;74257:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;74349:6;74345:91;74361:8;74357:1;:12;74345:91;;;74390:34;74397:10;74421:1;74419;:3;;;;:::i;:::-;74409:6;:14;;;;:::i;:::-;74390:5;:34::i;:::-;74371:3;;;;:::i;:::-;;;74345:91;;;;73913:530;73865:578;:::o;75914:202::-;76044:8;71678:30;71699:8;71678:20;:30::i;:::-;76065:43:::1;76089:8;76099;76065:23;:43::i;:::-;75914:202:::0;;;:::o;63468:225::-;63526:7;63546:21;63594:15;:13;:15::i;:::-;63570:21;:39;;;;:::i;:::-;63546:63;;63627:58;63643:7;63652:13;63667:17;63676:7;63667:8;:17::i;:::-;63627:15;:58::i;:::-;63620:65;;;63468:225;;;:::o;74927:166::-;27628:13;:11;:13::i;:::-;75012:9:::1;75000:21;;:8;;;;;;;;;;;:21;;::::0;74991:42:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;75076:9;75065:8;;:20;;;;;;;;;;;;;;;;;;74927:166:::0;:::o;48081:245::-;48211:6;48207:112;48223:8;;:15;;48219:1;:19;48207:112;;;48260:47;48278:4;48284:2;48288:8;;48297:1;48288:11;;;;;;;:::i;:::-;;;;;;;;48301:4;;48260:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:16;:47::i;:::-;48240:3;;;;:::i;:::-;;;48207:112;;;;48081:245;;;;;;:::o;76693:246::-;76862:4;71506:10;71498:18;;:4;:18;;;71494:83;;71533:32;71554:10;71533:20;:32::i;:::-;71494:83;76884:47:::1;76907:4;76913:2;76917:7;76926:4;76884:22;:47::i;:::-;76693:246:::0;;;;;:::o;63853:260::-;63925:7;63945:21;64002:20;64016:5;64002:13;:20::i;:::-;63969:5;:15;;;63993:4;63969:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;63945:77;;64040:65;64056:7;64065:13;64080:24;64089:5;64096:7;64080:8;:24::i;:::-;64040:15;:65::i;:::-;64033:72;;;63853:260;;;;:::o;74451:276::-;74523:13;74557:16;74565:7;74557;:16::i;:::-;74549:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;74667:13;74682:18;:7;:16;:18::i;:::-;74702:15;74650:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;74636:83;;74451:276;;;:::o;62570:105::-;62624:7;62651;:16;62659:7;62651:16;;;;;;;;;;;;;;;;62644:23;;62570:105;;;:::o;62360:119::-;62418:7;62445:19;:26;62465:5;62445:26;;;;;;;;;;;;;;;;62438:33;;62360:119;;;:::o;75293:167::-;27628:13;:11;:13::i;:::-;75380:8:::1;75367:9;;:21:::0;75358:42:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;75444:8;75432:9;:20;;;;75293:167:::0;:::o;62108:95::-;62154:7;62181:14;;62174:21;;62108:95;:::o;41324:164::-;41421:4;41445:18;:25;41464:5;41445:25;;;;;;;;;;;;;;;:35;41471:8;41445:35;;;;;;;;;;;;;;;;;;;;;;;;;41438:42;;41324:164;;;;:::o;28648:201::-;27628:13;:11;:13::i;:::-;28757:1:::1;28737:22;;:8;:22;;::::0;28729:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;28813:28;28832:8;28813:18;:28::i;:::-;28648:201:::0;:::o;40138:305::-;40240:4;40292:25;40277:40;;;:11;:40;;;;:105;;;;40349:33;40334:48;;;:11;:48;;;;40277:105;:158;;;;40399:36;40423:11;40399:23;:36::i;:::-;40277:158;40257:178;;40138:305;;;:::o;43000:152::-;43062:4;43096:7;:14;;;;43086:7;:24;:58;;;;;43142:1;43114:30;;:7;43122;43114:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:30;;;;43086:58;43079:65;;43000:152;;;:::o;71736:419::-;71975:1;70257:42;71927:45;;;:49;71923:225;;;70257:42;71998;;;72049:4;72056:8;71998:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71993:144;;72112:8;72093:28;;;;;;;;;;;:::i;:::-;;;;;;;;71993:144;71923:225;71736:419;:::o;40683:409::-;40761:13;40777:24;40793:7;40777:15;:24::i;:::-;40761:40;;40826:5;40820:11;;:2;:11;;;40812:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;40920:5;40904:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;40929:37;40946:5;40953:12;:10;:12::i;:::-;40929:16;:37::i;:::-;40904:62;40882:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;41063:21;41072:2;41076:7;41063:8;:21::i;:::-;40750:342;40683:409;;:::o;31701:317::-;31816:6;31791:21;:31;;31783:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31870:12;31888:9;:14;;31910:6;31888:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31869:52;;;31940:7;31932:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;31772:246;31701:317;;:::o;41797:334::-;41989:41;42008:12;:10;:12::i;:::-;42022:7;41989:18;:41::i;:::-;41981:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;42095:28;42105:4;42111:2;42115:7;42095:9;:28::i;:::-;41797:334;;;:::o;42139:182::-;42274:39;42291:4;42297:2;42301:7;42274:39;;;;;;;;;;;;:16;:39::i;:::-;42139:182;;;:::o;54637:211::-;54754:86;54774:5;54804:23;;;54829:2;54833:5;54781:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54754:19;:86::i;:::-;54637:211;;;:::o;27907:132::-;27982:12;:10;:12::i;:::-;27971:23;;:7;:5;:7::i;:::-;:23;;;27963:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27907:132::o;29009:191::-;29083:16;29102:6;;;;;;;;;;;29083:25;;29128:8;29119:6;;:17;;;;;;;;;;;;;;;;;;29183:8;29152:40;;29173:8;29152:40;;;;;;;;;;;;29072:128;29009:191;:::o;74751:151::-;74829:7;74842:2;74829:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74886:7;74882:2;74861:33;;74878:1;74861:33;;;;;;;;;;;;74751:151;;:::o;41496:293::-;41611:12;:10;:12::i;:::-;41599:24;;:8;:24;;;41591:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;41709:8;41664:18;:32;41683:12;:10;:12::i;:::-;41664:32;;;;;;;;;;;;;;;:42;41697:8;41664:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;41762:8;41733:48;;41748:12;:10;:12::i;:::-;41733:48;;;41772:8;41733:48;;;;;;:::i;:::-;;;;;;;;41496:293;;:::o;66222:248::-;66368:7;66447:15;66432:12;;66412:7;:16;66420:7;66412:16;;;;;;;;;;;;;;;;66396:13;:32;;;;:::i;:::-;66395:49;;;;:::i;:::-;:67;;;;:::i;:::-;66388:74;;66222:248;;;;;:::o;42329:325::-;42501:41;42520:12;:10;:12::i;:::-;42534:7;42501:18;:41::i;:::-;42493:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;42607:39;42621:4;42627:2;42631:7;42640:5;42607:13;:39::i;:::-;42329:325;;;;:::o;23720:716::-;23776:13;23827:14;23864:1;23844:17;23855:5;23844:10;:17::i;:::-;:21;23827:38;;23880:20;23914:6;23903:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23880:41;;23936:11;24065:6;24061:2;24057:15;24049:6;24045:28;24038:35;;24102:288;24109:4;24102:288;;;24134:5;;;;;;;;24276:8;24271:2;24264:5;24260:14;24255:30;24250:3;24242:44;24332:2;24323:11;;;;;;:::i;:::-;;;;;24366:1;24357:5;:10;24102:288;24353:21;24102:288;24411:6;24404:13;;;;;23720:716;;;:::o;3254:157::-;3339:4;3378:25;3363:40;;;:11;:40;;;;3356:47;;3254:157;;;:::o;45166:172::-;45265:2;45238:15;:24;45254:7;45238:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;45322:7;45318:2;45283:47;;45292:24;45308:7;45292:15;:24::i;:::-;45283:47;;;;;;;;;;;;45166:172;;:::o;43160:346::-;43250:4;43275:16;43283:7;43275;:16::i;:::-;43267:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;43351:13;43367:24;43383:7;43367:15;:24::i;:::-;43351:40;;43421:5;43410:16;;:7;:16;;;:51;;;;43454:7;43430:31;;:20;43442:7;43430:11;:20::i;:::-;:31;;;43410:51;:87;;;;43465:32;43482:5;43489:7;43465:16;:32::i;:::-;43410:87;43402:96;;;43160:346;;;;:::o;44644:514::-;44801:4;44773:32;;:24;44789:7;44773:15;:24::i;:::-;:32;;;44765:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;44884:1;44870:16;;:2;:16;;;44862:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;44940:39;44961:4;44967:2;44971:7;44940:20;:39::i;:::-;45044:29;45061:1;45065:7;45044:8;:29::i;:::-;45103:2;45084:7;45092;45084:16;;;;;;;;:::i;:::-;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;45142:7;45138:2;45123:27;;45132:4;45123:27;;;;;;;;;;;;44644:514;;;:::o;57704:716::-;58128:23;58154:69;58182:4;58154:69;;;;;;;;;;;;;;;;;58162:5;58154:27;;;;:69;;;;;:::i;:::-;58128:95;;58258:1;58238:10;:17;:21;58234:179;;;58335:10;58324:30;;;;;;;;;;;;:::i;:::-;58316:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;58234:179;57774:646;57704:716;;:::o;42680:312::-;42834:28;42844:4;42850:2;42854:7;42834:9;:28::i;:::-;42881:48;42904:4;42910:2;42914:7;42923:5;42881:22;:48::i;:::-;42873:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;42680:312;;;;:::o;20586:922::-;20639:7;20659:14;20676:1;20659:18;;20726:6;20717:5;:15;20713:102;;20762:6;20753:15;;;;;;:::i;:::-;;;;;20797:2;20787:12;;;;20713:102;20842:6;20833:5;:15;20829:102;;20878:6;20869:15;;;;;;:::i;:::-;;;;;20913:2;20903:12;;;;20829:102;20958:6;20949:5;:15;20945:102;;20994:6;20985:15;;;;;;:::i;:::-;;;;;21029:2;21019:12;;;;20945:102;21074:5;21065;:14;21061:99;;21109:5;21100:14;;;;;;:::i;:::-;;;;;21143:1;21133:11;;;;21061:99;21187:5;21178;:14;21174:99;;21222:5;21213:14;;;;;;:::i;:::-;;;;;21256:1;21246:11;;;;21174:99;21300:5;21291;:14;21287:99;;21335:5;21326:14;;;;;;:::i;:::-;;;;;21369:1;21359:11;;;;21287:99;21413:5;21404;:14;21400:66;;21449:1;21439:11;;;;21400:66;21494:6;21487:13;;;20586:922;;;:::o;46150:123::-;;;;:::o;33197:229::-;33334:12;33366:52;33388:6;33396:4;33402:1;33405:12;33366:21;:52::i;:::-;33359:59;;33197:229;;;;;:::o;45346:796::-;45498:4;45519:15;:2;:13;;;:15::i;:::-;45515:620;;;45571:2;45555:36;;;45592:12;:10;:12::i;:::-;45606:4;45612:7;45621:5;45555:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;45551:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45814:1;45797:6;:13;:18;45793:272;;45840:60;;;;;;;;;;:::i;:::-;;;;;;;;45793:272;46015:6;46009:13;46000:6;45996:2;45992:15;45985:38;45551:529;45688:41;;;45678:51;;;:6;:51;;;;45671:58;;;;;45515:620;46119:4;46112:11;;45346:796;;;;;;;:::o;34317:455::-;34487:12;34545:5;34520:21;:30;;34512:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;34605:12;34619:23;34646:6;:11;;34665:5;34672:4;34646:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34604:73;;;;34695:69;34722:6;34730:7;34739:10;34751:12;34695:26;:69::i;:::-;34688:76;;;;34317:455;;;;;;:::o;30440:326::-;30500:4;30757:1;30735:7;:19;;;:23;30728:30;;30440:326;;;:::o;36890:644::-;37075:12;37104:7;37100:427;;;37153:1;37132:10;:17;:22;37128:290;;37350:18;37361:6;37350:10;:18::i;:::-;37342:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;37128:290;37439:10;37432:17;;;;37100:427;37482:33;37490:10;37502:12;37482:7;:33::i;:::-;36890:644;;;;;;;:::o;38076:552::-;38257:1;38237:10;:17;:21;38233:388;;;38469:10;38463:17;38526:15;38513:10;38509:2;38505:19;38498:44;38233:388;38596:12;38589:20;;;;;;;;;;;:::i;:::-;;;;;;;;7:126:1;44:7;84:42;77:5;73:54;62:65;;7:126;;;:::o;139:96::-;176:7;205:24;223:5;205:24;:::i;:::-;194:35;;139:96;;;:::o;241:118::-;328:24;346:5;328:24;:::i;:::-;323:3;316:37;241:118;;:::o;365:77::-;402:7;431:5;420:16;;365:77;;;:::o;448:118::-;535:24;553:5;535:24;:::i;:::-;530:3;523:37;448:118;;:::o;572:332::-;693:4;731:2;720:9;716:18;708:26;;744:71;812:1;801:9;797:17;788:6;744:71;:::i;:::-;825:72;893:2;882:9;878:18;869:6;825:72;:::i;:::-;572:332;;;;;:::o;910:75::-;943:6;976:2;970:9;960:19;;910:75;:::o;991:117::-;1100:1;1097;1090:12;1114:117;1223:1;1220;1213:12;1237:149;1273:7;1313:66;1306:5;1302:78;1291:89;;1237:149;;;:::o;1392:120::-;1464:23;1481:5;1464:23;:::i;:::-;1457:5;1454:34;1444:62;;1502:1;1499;1492:12;1444:62;1392:120;:::o;1518:137::-;1563:5;1601:6;1588:20;1579:29;;1617:32;1643:5;1617:32;:::i;:::-;1518:137;;;;:::o;1661:327::-;1719:6;1768:2;1756:9;1747:7;1743:23;1739:32;1736:119;;;1774:79;;:::i;:::-;1736:119;1894:1;1919:52;1963:7;1954:6;1943:9;1939:22;1919:52;:::i;:::-;1909:62;;1865:116;1661:327;;;;:::o;1994:90::-;2028:7;2071:5;2064:13;2057:21;2046:32;;1994:90;;;:::o;2090:109::-;2171:21;2186:5;2171:21;:::i;:::-;2166:3;2159:34;2090:109;;:::o;2205:210::-;2292:4;2330:2;2319:9;2315:18;2307:26;;2343:65;2405:1;2394:9;2390:17;2381:6;2343:65;:::i;:::-;2205:210;;;;:::o;2421:99::-;2473:6;2507:5;2501:12;2491:22;;2421:99;;;:::o;2526:169::-;2610:11;2644:6;2639:3;2632:19;2684:4;2679:3;2675:14;2660:29;;2526:169;;;;:::o;2701:246::-;2782:1;2792:113;2806:6;2803:1;2800:13;2792:113;;;2891:1;2886:3;2882:11;2876:18;2872:1;2867:3;2863:11;2856:39;2828:2;2825:1;2821:10;2816:15;;2792:113;;;2939:1;2930:6;2925:3;2921:16;2914:27;2763:184;2701:246;;;:::o;2953:102::-;2994:6;3045:2;3041:7;3036:2;3029:5;3025:14;3021:28;3011:38;;2953:102;;;:::o;3061:377::-;3149:3;3177:39;3210:5;3177:39;:::i;:::-;3232:71;3296:6;3291:3;3232:71;:::i;:::-;3225:78;;3312:65;3370:6;3365:3;3358:4;3351:5;3347:16;3312:65;:::i;:::-;3402:29;3424:6;3402:29;:::i;:::-;3397:3;3393:39;3386:46;;3153:285;3061:377;;;;:::o;3444:313::-;3557:4;3595:2;3584:9;3580:18;3572:26;;3644:9;3638:4;3634:20;3630:1;3619:9;3615:17;3608:47;3672:78;3745:4;3736:6;3672:78;:::i;:::-;3664:86;;3444:313;;;;:::o;3763:122::-;3836:24;3854:5;3836:24;:::i;:::-;3829:5;3826:35;3816:63;;3875:1;3872;3865:12;3816:63;3763:122;:::o;3891:139::-;3937:5;3975:6;3962:20;3953:29;;3991:33;4018:5;3991:33;:::i;:::-;3891:139;;;;:::o;4036:329::-;4095:6;4144:2;4132:9;4123:7;4119:23;4115:32;4112:119;;;4150:79;;:::i;:::-;4112:119;4270:1;4295:53;4340:7;4331:6;4320:9;4316:22;4295:53;:::i;:::-;4285:63;;4241:117;4036:329;;;;:::o;4371:222::-;4464:4;4502:2;4491:9;4487:18;4479:26;;4515:71;4583:1;4572:9;4568:17;4559:6;4515:71;:::i;:::-;4371:222;;;;:::o;4599:122::-;4672:24;4690:5;4672:24;:::i;:::-;4665:5;4662:35;4652:63;;4711:1;4708;4701:12;4652:63;4599:122;:::o;4727:139::-;4773:5;4811:6;4798:20;4789:29;;4827:33;4854:5;4827:33;:::i;:::-;4727:139;;;;:::o;4872:474::-;4940:6;4948;4997:2;4985:9;4976:7;4972:23;4968:32;4965:119;;;5003:79;;:::i;:::-;4965:119;5123:1;5148:53;5193:7;5184:6;5173:9;5169:22;5148:53;:::i;:::-;5138:63;;5094:117;5250:2;5276:53;5321:7;5312:6;5301:9;5297:22;5276:53;:::i;:::-;5266:63;;5221:118;4872:474;;;;;:::o;5352:222::-;5445:4;5483:2;5472:9;5468:18;5460:26;;5496:71;5564:1;5553:9;5549:17;5540:6;5496:71;:::i;:::-;5352:222;;;;:::o;5580:104::-;5625:7;5654:24;5672:5;5654:24;:::i;:::-;5643:35;;5580:104;;;:::o;5690:138::-;5771:32;5797:5;5771:32;:::i;:::-;5764:5;5761:43;5751:71;;5818:1;5815;5808:12;5751:71;5690:138;:::o;5834:155::-;5888:5;5926:6;5913:20;5904:29;;5942:41;5977:5;5942:41;:::i;:::-;5834:155;;;;:::o;5995:345::-;6062:6;6111:2;6099:9;6090:7;6086:23;6082:32;6079:119;;;6117:79;;:::i;:::-;6079:119;6237:1;6262:61;6315:7;6306:6;6295:9;6291:22;6262:61;:::i;:::-;6252:71;;6208:125;5995:345;;;;:::o;6346:619::-;6423:6;6431;6439;6488:2;6476:9;6467:7;6463:23;6459:32;6456:119;;;6494:79;;:::i;:::-;6456:119;6614:1;6639:53;6684:7;6675:6;6664:9;6660:22;6639:53;:::i;:::-;6629:63;;6585:117;6741:2;6767:53;6812:7;6803:6;6792:9;6788:22;6767:53;:::i;:::-;6757:63;;6712:118;6869:2;6895:53;6940:7;6931:6;6920:9;6916:22;6895:53;:::i;:::-;6885:63;;6840:118;6346:619;;;;;:::o;6971:111::-;7023:7;7052:24;7070:5;7052:24;:::i;:::-;7041:35;;6971:111;;;:::o;7088:152::-;7176:39;7209:5;7176:39;:::i;:::-;7169:5;7166:50;7156:78;;7230:1;7227;7220:12;7156:78;7088:152;:::o;7246:169::-;7307:5;7345:6;7332:20;7323:29;;7361:48;7403:5;7361:48;:::i;:::-;7246:169;;;;:::o;7421:504::-;7504:6;7512;7561:2;7549:9;7540:7;7536:23;7532:32;7529:119;;;7567:79;;:::i;:::-;7529:119;7687:1;7712:68;7772:7;7763:6;7752:9;7748:22;7712:68;:::i;:::-;7702:78;;7658:132;7829:2;7855:53;7900:7;7891:6;7880:9;7876:22;7855:53;:::i;:::-;7845:63;;7800:118;7421:504;;;;;:::o;7931:60::-;7959:3;7980:5;7973:12;;7931:60;;;:::o;7997:142::-;8047:9;8080:53;8098:34;8107:24;8125:5;8107:24;:::i;:::-;8098:34;:::i;:::-;8080:53;:::i;:::-;8067:66;;7997:142;;;:::o;8145:126::-;8195:9;8228:37;8259:5;8228:37;:::i;:::-;8215:50;;8145:126;;;:::o;8277:158::-;8359:9;8392:37;8423:5;8392:37;:::i;:::-;8379:50;;8277:158;;;:::o;8441:195::-;8560:69;8623:5;8560:69;:::i;:::-;8555:3;8548:82;8441:195;;:::o;8642:286::-;8767:4;8805:2;8794:9;8790:18;8782:26;;8818:103;8918:1;8907:9;8903:17;8894:6;8818:103;:::i;:::-;8642:286;;;;:::o;8934:329::-;8993:6;9042:2;9030:9;9021:7;9017:23;9013:32;9010:119;;;9048:79;;:::i;:::-;9010:119;9168:1;9193:53;9238:7;9229:6;9218:9;9214:22;9193:53;:::i;:::-;9183:63;;9139:117;8934:329;;;;:::o;9269:114::-;9336:6;9370:5;9364:12;9354:22;;9269:114;;;:::o;9389:184::-;9488:11;9522:6;9517:3;9510:19;9562:4;9557:3;9553:14;9538:29;;9389:184;;;;:::o;9579:132::-;9646:4;9669:3;9661:11;;9699:4;9694:3;9690:14;9682:22;;9579:132;;;:::o;9717:108::-;9794:24;9812:5;9794:24;:::i;:::-;9789:3;9782:37;9717:108;;:::o;9831:179::-;9900:10;9921:46;9963:3;9955:6;9921:46;:::i;:::-;9999:4;9994:3;9990:14;9976:28;;9831:179;;;;:::o;10016:113::-;10086:4;10118;10113:3;10109:14;10101:22;;10016:113;;;:::o;10165:732::-;10284:3;10313:54;10361:5;10313:54;:::i;:::-;10383:86;10462:6;10457:3;10383:86;:::i;:::-;10376:93;;10493:56;10543:5;10493:56;:::i;:::-;10572:7;10603:1;10588:284;10613:6;10610:1;10607:13;10588:284;;;10689:6;10683:13;10716:63;10775:3;10760:13;10716:63;:::i;:::-;10709:70;;10802:60;10855:6;10802:60;:::i;:::-;10792:70;;10648:224;10635:1;10632;10628:9;10623:14;;10588:284;;;10592:14;10888:3;10881:10;;10289:608;;;10165:732;;;;:::o;10903:373::-;11046:4;11084:2;11073:9;11069:18;11061:26;;11133:9;11127:4;11123:20;11119:1;11108:9;11104:17;11097:47;11161:108;11264:4;11255:6;11161:108;:::i;:::-;11153:116;;10903:373;;;;:::o;11282:117::-;11391:1;11388;11381:12;11405:117;11514:1;11511;11504:12;11528:117;11637:1;11634;11627:12;11668:568;11741:8;11751:6;11801:3;11794:4;11786:6;11782:17;11778:27;11768:122;;11809:79;;:::i;:::-;11768:122;11922:6;11909:20;11899:30;;11952:18;11944:6;11941:30;11938:117;;;11974:79;;:::i;:::-;11938:117;12088:4;12080:6;12076:17;12064:29;;12142:3;12134:4;12126:6;12122:17;12112:8;12108:32;12105:41;12102:128;;;12149:79;;:::i;:::-;12102:128;11668:568;;;;;:::o;12242:704::-;12337:6;12345;12353;12402:2;12390:9;12381:7;12377:23;12373:32;12370:119;;;12408:79;;:::i;:::-;12370:119;12528:1;12553:53;12598:7;12589:6;12578:9;12574:22;12553:53;:::i;:::-;12543:63;;12499:117;12683:2;12672:9;12668:18;12655:32;12714:18;12706:6;12703:30;12700:117;;;12736:79;;:::i;:::-;12700:117;12849:80;12921:7;12912:6;12901:9;12897:22;12849:80;:::i;:::-;12831:98;;;;12626:313;12242:704;;;;;:::o;12966:553::-;13024:8;13034:6;13084:3;13077:4;13069:6;13065:17;13061:27;13051:122;;13092:79;;:::i;:::-;13051:122;13205:6;13192:20;13182:30;;13235:18;13227:6;13224:30;13221:117;;;13257:79;;:::i;:::-;13221:117;13371:4;13363:6;13359:17;13347:29;;13425:3;13417:4;13409:6;13405:17;13395:8;13391:32;13388:41;13385:128;;;13432:79;;:::i;:::-;13385:128;12966:553;;;;;:::o;13525:874::-;13617:6;13625;13633;13641;13690:2;13678:9;13669:7;13665:23;13661:32;13658:119;;;13696:79;;:::i;:::-;13658:119;13844:1;13833:9;13829:17;13816:31;13874:18;13866:6;13863:30;13860:117;;;13896:79;;:::i;:::-;13860:117;14009:65;14066:7;14057:6;14046:9;14042:22;14009:65;:::i;:::-;13991:83;;;;13787:297;14151:2;14140:9;14136:18;14123:32;14182:18;14174:6;14171:30;14168:117;;;14204:79;;:::i;:::-;14168:117;14317:65;14374:7;14365:6;14354:9;14350:22;14317:65;:::i;:::-;14299:83;;;;14094:298;13525:874;;;;;;;:::o;14405:116::-;14475:21;14490:5;14475:21;:::i;:::-;14468:5;14465:32;14455:60;;14511:1;14508;14501:12;14455:60;14405:116;:::o;14527:133::-;14570:5;14608:6;14595:20;14586:29;;14624:30;14648:5;14624:30;:::i;:::-;14527:133;;;;:::o;14666:468::-;14731:6;14739;14788:2;14776:9;14767:7;14763:23;14759:32;14756:119;;;14794:79;;:::i;:::-;14756:119;14914:1;14939:53;14984:7;14975:6;14964:9;14960:22;14939:53;:::i;:::-;14929:63;;14885:117;15041:2;15067:50;15109:7;15100:6;15089:9;15085:22;15067:50;:::i;:::-;15057:60;;15012:115;14666:468;;;;;:::o;15140:323::-;15196:6;15245:2;15233:9;15224:7;15220:23;15216:32;15213:119;;;15251:79;;:::i;:::-;15213:119;15371:1;15396:50;15438:7;15429:6;15418:9;15414:22;15396:50;:::i;:::-;15386:60;;15342:114;15140:323;;;;:::o;15482:552::-;15539:8;15549:6;15599:3;15592:4;15584:6;15580:17;15576:27;15566:122;;15607:79;;:::i;:::-;15566:122;15720:6;15707:20;15697:30;;15750:18;15742:6;15739:30;15736:117;;;15772:79;;:::i;:::-;15736:117;15886:4;15878:6;15874:17;15862:29;;15940:3;15932:4;15924:6;15920:17;15910:8;15906:32;15903:41;15900:128;;;15947:79;;:::i;:::-;15900:128;15482:552;;;;;:::o;16040:1193::-;16164:6;16172;16180;16188;16196;16204;16253:3;16241:9;16232:7;16228:23;16224:33;16221:120;;;16260:79;;:::i;:::-;16221:120;16380:1;16405:53;16450:7;16441:6;16430:9;16426:22;16405:53;:::i;:::-;16395:63;;16351:117;16507:2;16533:53;16578:7;16569:6;16558:9;16554:22;16533:53;:::i;:::-;16523:63;;16478:118;16663:2;16652:9;16648:18;16635:32;16694:18;16686:6;16683:30;16680:117;;;16716:79;;:::i;:::-;16680:117;16829:80;16901:7;16892:6;16881:9;16877:22;16829:80;:::i;:::-;16811:98;;;;16606:313;16986:2;16975:9;16971:18;16958:32;17017:18;17009:6;17006:30;17003:117;;;17039:79;;:::i;:::-;17003:117;17152:64;17208:7;17199:6;17188:9;17184:22;17152:64;:::i;:::-;17134:82;;;;16929:297;16040:1193;;;;;;;;:::o;17239:117::-;17348:1;17345;17338:12;17362:180;17410:77;17407:1;17400:88;17507:4;17504:1;17497:15;17531:4;17528:1;17521:15;17548:281;17631:27;17653:4;17631:27;:::i;:::-;17623:6;17619:40;17761:6;17749:10;17746:22;17725:18;17713:10;17710:34;17707:62;17704:88;;;17772:18;;:::i;:::-;17704:88;17812:10;17808:2;17801:22;17591:238;17548:281;;:::o;17835:129::-;17869:6;17896:20;;:::i;:::-;17886:30;;17925:33;17953:4;17945:6;17925:33;:::i;:::-;17835:129;;;:::o;17970:307::-;18031:4;18121:18;18113:6;18110:30;18107:56;;;18143:18;;:::i;:::-;18107:56;18181:29;18203:6;18181:29;:::i;:::-;18173:37;;18265:4;18259;18255:15;18247:23;;17970:307;;;:::o;18283:146::-;18380:6;18375:3;18370;18357:30;18421:1;18412:6;18407:3;18403:16;18396:27;18283:146;;;:::o;18435:423::-;18512:5;18537:65;18553:48;18594:6;18553:48;:::i;:::-;18537:65;:::i;:::-;18528:74;;18625:6;18618:5;18611:21;18663:4;18656:5;18652:16;18701:3;18692:6;18687:3;18683:16;18680:25;18677:112;;;18708:79;;:::i;:::-;18677:112;18798:54;18845:6;18840:3;18835;18798:54;:::i;:::-;18518:340;18435:423;;;;;:::o;18877:338::-;18932:5;18981:3;18974:4;18966:6;18962:17;18958:27;18948:122;;18989:79;;:::i;:::-;18948:122;19106:6;19093:20;19131:78;19205:3;19197:6;19190:4;19182:6;19178:17;19131:78;:::i;:::-;19122:87;;18938:277;18877:338;;;;:::o;19221:943::-;19316:6;19324;19332;19340;19389:3;19377:9;19368:7;19364:23;19360:33;19357:120;;;19396:79;;:::i;:::-;19357:120;19516:1;19541:53;19586:7;19577:6;19566:9;19562:22;19541:53;:::i;:::-;19531:63;;19487:117;19643:2;19669:53;19714:7;19705:6;19694:9;19690:22;19669:53;:::i;:::-;19659:63;;19614:118;19771:2;19797:53;19842:7;19833:6;19822:9;19818:22;19797:53;:::i;:::-;19787:63;;19742:118;19927:2;19916:9;19912:18;19899:32;19958:18;19950:6;19947:30;19944:117;;;19980:79;;:::i;:::-;19944:117;20085:62;20139:7;20130:6;20119:9;20115:22;20085:62;:::i;:::-;20075:72;;19870:287;19221:943;;;;;;;:::o;20170:359::-;20244:6;20293:2;20281:9;20272:7;20268:23;20264:32;20261:119;;;20299:79;;:::i;:::-;20261:119;20419:1;20444:68;20504:7;20495:6;20484:9;20480:22;20444:68;:::i;:::-;20434:78;;20390:132;20170:359;;;;:::o;20535:474::-;20603:6;20611;20660:2;20648:9;20639:7;20635:23;20631:32;20628:119;;;20666:79;;:::i;:::-;20628:119;20786:1;20811:53;20856:7;20847:6;20836:9;20832:22;20811:53;:::i;:::-;20801:63;;20757:117;20913:2;20939:53;20984:7;20975:6;20964:9;20960:22;20939:53;:::i;:::-;20929:63;;20884:118;20535:474;;;;;:::o;21015:180::-;21063:77;21060:1;21053:88;21160:4;21157:1;21150:15;21184:4;21181:1;21174:15;21201:320;21245:6;21282:1;21276:4;21272:12;21262:22;;21329:1;21323:4;21319:12;21350:18;21340:81;;21406:4;21398:6;21394:17;21384:27;;21340:81;21468:2;21460:6;21457:14;21437:18;21434:38;21431:84;;21487:18;;:::i;:::-;21431:84;21252:269;21201:320;;;:::o;21527:231::-;21667:34;21663:1;21655:6;21651:14;21644:58;21736:14;21731:2;21723:6;21719:15;21712:39;21527:231;:::o;21764:366::-;21906:3;21927:67;21991:2;21986:3;21927:67;:::i;:::-;21920:74;;22003:93;22092:3;22003:93;:::i;:::-;22121:2;22116:3;22112:12;22105:19;;21764:366;;;:::o;22136:419::-;22302:4;22340:2;22329:9;22325:18;22317:26;;22389:9;22383:4;22379:20;22375:1;22364:9;22360:17;22353:47;22417:131;22543:4;22417:131;:::i;:::-;22409:139;;22136:419;;;:::o;22561:180::-;22609:77;22606:1;22599:88;22706:4;22703:1;22696:15;22730:4;22727:1;22720:15;22747:194;22787:4;22807:20;22825:1;22807:20;:::i;:::-;22802:25;;22841:20;22859:1;22841:20;:::i;:::-;22836:25;;22885:1;22882;22878:9;22870:17;;22909:1;22903:4;22900:11;22897:37;;;22914:18;;:::i;:::-;22897:37;22747:194;;;;:::o;22947:225::-;23087:34;23083:1;23075:6;23071:14;23064:58;23156:8;23151:2;23143:6;23139:15;23132:33;22947:225;:::o;23178:366::-;23320:3;23341:67;23405:2;23400:3;23341:67;:::i;:::-;23334:74;;23417:93;23506:3;23417:93;:::i;:::-;23535:2;23530:3;23526:12;23519:19;;23178:366;;;:::o;23550:419::-;23716:4;23754:2;23743:9;23739:18;23731:26;;23803:9;23797:4;23793:20;23789:1;23778:9;23774:17;23767:47;23831:131;23957:4;23831:131;:::i;:::-;23823:139;;23550:419;;;:::o;23975:230::-;24115:34;24111:1;24103:6;24099:14;24092:58;24184:13;24179:2;24171:6;24167:15;24160:38;23975:230;:::o;24211:366::-;24353:3;24374:67;24438:2;24433:3;24374:67;:::i;:::-;24367:74;;24450:93;24539:3;24450:93;:::i;:::-;24568:2;24563:3;24559:12;24552:19;;24211:366;;;:::o;24583:419::-;24749:4;24787:2;24776:9;24772:18;24764:26;;24836:9;24830:4;24826:20;24822:1;24811:9;24807:17;24800:47;24864:131;24990:4;24864:131;:::i;:::-;24856:139;;24583:419;;;:::o;25008:191::-;25048:3;25067:20;25085:1;25067:20;:::i;:::-;25062:25;;25101:20;25119:1;25101:20;:::i;:::-;25096:25;;25144:1;25141;25137:9;25130:16;;25165:3;25162:1;25159:10;25156:36;;;25172:18;;:::i;:::-;25156:36;25008:191;;;;:::o;25205:134::-;25263:9;25296:37;25327:5;25296:37;:::i;:::-;25283:50;;25205:134;;;:::o;25345:147::-;25440:45;25479:5;25440:45;:::i;:::-;25435:3;25428:58;25345:147;;:::o;25498:348::-;25627:4;25665:2;25654:9;25650:18;25642:26;;25678:79;25754:1;25743:9;25739:17;25730:6;25678:79;:::i;:::-;25767:72;25835:2;25824:9;25820:18;25811:6;25767:72;:::i;:::-;25498:348;;;;;:::o;25852:180::-;25900:77;25897:1;25890:88;25997:4;25994:1;25987:15;26021:4;26018:1;26011:15;26038:233;26077:3;26100:24;26118:5;26100:24;:::i;:::-;26091:33;;26146:66;26139:5;26136:77;26133:103;;26216:18;;:::i;:::-;26133:103;26263:1;26256:5;26252:13;26245:20;;26038:233;;;:::o;26277:230::-;26417:34;26413:1;26405:6;26401:14;26394:58;26486:13;26481:2;26473:6;26469:15;26462:38;26277:230;:::o;26513:366::-;26655:3;26676:67;26740:2;26735:3;26676:67;:::i;:::-;26669:74;;26752:93;26841:3;26752:93;:::i;:::-;26870:2;26865:3;26861:12;26854:19;;26513:366;;;:::o;26885:419::-;27051:4;27089:2;27078:9;27074:18;27066:26;;27138:9;27132:4;27128:20;27124:1;27113:9;27109:17;27102:47;27166:131;27292:4;27166:131;:::i;:::-;27158:139;;26885:419;;;:::o;27310:231::-;27450:34;27446:1;27438:6;27434:14;27427:58;27519:14;27514:2;27506:6;27502:15;27495:39;27310:231;:::o;27547:366::-;27689:3;27710:67;27774:2;27769:3;27710:67;:::i;:::-;27703:74;;27786:93;27875:3;27786:93;:::i;:::-;27904:2;27899:3;27895:12;27888:19;;27547:366;;;:::o;27919:419::-;28085:4;28123:2;28112:9;28108:18;28100:26;;28172:9;28166:4;28162:20;28158:1;28147:9;28143:17;28136:47;28200:131;28326:4;28200:131;:::i;:::-;28192:139;;27919:419;;;:::o;28344:228::-;28484:34;28480:1;28472:6;28468:14;28461:58;28553:11;28548:2;28540:6;28536:15;28529:36;28344:228;:::o;28578:366::-;28720:3;28741:67;28805:2;28800:3;28741:67;:::i;:::-;28734:74;;28817:93;28906:3;28817:93;:::i;:::-;28935:2;28930:3;28926:12;28919:19;;28578:366;;;:::o;28950:419::-;29116:4;29154:2;29143:9;29139:18;29131:26;;29203:9;29197:4;29193:20;29189:1;29178:9;29174:17;29167:47;29231:131;29357:4;29231:131;:::i;:::-;29223:139;;28950:419;;;:::o;29375:97::-;29434:6;29462:3;29452:13;;29375:97;;;;:::o;29478:141::-;29527:4;29550:3;29542:11;;29573:3;29570:1;29563:14;29607:4;29604:1;29594:18;29586:26;;29478:141;;;:::o;29625:93::-;29662:6;29709:2;29704;29697:5;29693:14;29689:23;29679:33;;29625:93;;;:::o;29724:107::-;29768:8;29818:5;29812:4;29808:16;29787:37;;29724:107;;;;:::o;29837:393::-;29906:6;29956:1;29944:10;29940:18;29979:97;30009:66;29998:9;29979:97;:::i;:::-;30097:39;30127:8;30116:9;30097:39;:::i;:::-;30085:51;;30169:4;30165:9;30158:5;30154:21;30145:30;;30218:4;30208:8;30204:19;30197:5;30194:30;30184:40;;29913:317;;29837:393;;;;;:::o;30236:142::-;30286:9;30319:53;30337:34;30346:24;30364:5;30346:24;:::i;:::-;30337:34;:::i;:::-;30319:53;:::i;:::-;30306:66;;30236:142;;;:::o;30384:75::-;30427:3;30448:5;30441:12;;30384:75;;;:::o;30465:269::-;30575:39;30606:7;30575:39;:::i;:::-;30636:91;30685:41;30709:16;30685:41;:::i;:::-;30677:6;30670:4;30664:11;30636:91;:::i;:::-;30630:4;30623:105;30541:193;30465:269;;;:::o;30740:73::-;30785:3;30740:73;:::o;30819:189::-;30896:32;;:::i;:::-;30937:65;30995:6;30987;30981:4;30937:65;:::i;:::-;30872:136;30819:189;;:::o;31014:186::-;31074:120;31091:3;31084:5;31081:14;31074:120;;;31145:39;31182:1;31175:5;31145:39;:::i;:::-;31118:1;31111:5;31107:13;31098:22;;31074:120;;;31014:186;;:::o;31206:543::-;31307:2;31302:3;31299:11;31296:446;;;31341:38;31373:5;31341:38;:::i;:::-;31425:29;31443:10;31425:29;:::i;:::-;31415:8;31411:44;31608:2;31596:10;31593:18;31590:49;;;31629:8;31614:23;;31590:49;31652:80;31708:22;31726:3;31708:22;:::i;:::-;31698:8;31694:37;31681:11;31652:80;:::i;:::-;31311:431;;31296:446;31206:543;;;:::o;31755:117::-;31809:8;31859:5;31853:4;31849:16;31828:37;;31755:117;;;;:::o;31878:169::-;31922:6;31955:51;32003:1;31999:6;31991:5;31988:1;31984:13;31955:51;:::i;:::-;31951:56;32036:4;32030;32026:15;32016:25;;31929:118;31878:169;;;;:::o;32052:295::-;32128:4;32274:29;32299:3;32293:4;32274:29;:::i;:::-;32266:37;;32336:3;32333:1;32329:11;32323:4;32320:21;32312:29;;32052:295;;;;:::o;32352:1403::-;32476:44;32516:3;32511;32476:44;:::i;:::-;32585:18;32577:6;32574:30;32571:56;;;32607:18;;:::i;:::-;32571:56;32651:38;32683:4;32677:11;32651:38;:::i;:::-;32736:67;32796:6;32788;32782:4;32736:67;:::i;:::-;32830:1;32859:2;32851:6;32848:14;32876:1;32871:632;;;;33547:1;33564:6;33561:84;;;33620:9;33615:3;33611:19;33598:33;33589:42;;33561:84;33671:67;33731:6;33724:5;33671:67;:::i;:::-;33665:4;33658:81;33520:229;32841:908;;32871:632;32923:4;32919:9;32911:6;32907:22;32957:37;32989:4;32957:37;:::i;:::-;33016:1;33030:215;33044:7;33041:1;33038:14;33030:215;;;33130:9;33125:3;33121:19;33108:33;33100:6;33093:49;33181:1;33173:6;33169:14;33159:24;;33228:2;33217:9;33213:18;33200:31;;33067:4;33064:1;33060:12;33055:17;;33030:215;;;33273:6;33264:7;33261:19;33258:186;;;33338:9;33333:3;33329:19;33316:33;33381:48;33423:4;33415:6;33411:17;33400:9;33381:48;:::i;:::-;33373:6;33366:64;33281:163;33258:186;33490:1;33486;33478:6;33474:14;33470:22;33464:4;33457:36;32878:625;;;32841:908;;32451:1304;;;32352:1403;;;:::o;33761:156::-;33901:8;33897:1;33889:6;33885:14;33878:32;33761:156;:::o;33923:365::-;34065:3;34086:66;34150:1;34145:3;34086:66;:::i;:::-;34079:73;;34161:93;34250:3;34161:93;:::i;:::-;34279:2;34274:3;34270:12;34263:19;;33923:365;;;:::o;34294:419::-;34460:4;34498:2;34487:9;34483:18;34475:26;;34547:9;34541:4;34537:20;34533:1;34522:9;34518:17;34511:47;34575:131;34701:4;34575:131;:::i;:::-;34567:139;;34294:419;;;:::o;34719:156::-;34859:8;34855:1;34847:6;34843:14;34836:32;34719:156;:::o;34881:365::-;35023:3;35044:66;35108:1;35103:3;35044:66;:::i;:::-;35037:73;;35119:93;35208:3;35119:93;:::i;:::-;35237:2;35232:3;35228:12;35221:19;;34881:365;;;:::o;35252:419::-;35418:4;35456:2;35445:9;35441:18;35433:26;;35505:9;35499:4;35495:20;35491:1;35480:9;35476:17;35469:47;35533:131;35659:4;35533:131;:::i;:::-;35525:139;;35252:419;;;:::o;35677:229::-;35817:34;35813:1;35805:6;35801:14;35794:58;35886:12;35881:2;35873:6;35869:15;35862:37;35677:229;:::o;35912:366::-;36054:3;36075:67;36139:2;36134:3;36075:67;:::i;:::-;36068:74;;36151:93;36240:3;36151:93;:::i;:::-;36269:2;36264:3;36260:12;36253:19;;35912:366;;;:::o;36284:419::-;36450:4;36488:2;36477:9;36473:18;36465:26;;36537:9;36531:4;36527:20;36523:1;36512:9;36508:17;36501:47;36565:131;36691:4;36565:131;:::i;:::-;36557:139;;36284:419;;;:::o;36709:156::-;36849:8;36845:1;36837:6;36833:14;36826:32;36709:156;:::o;36871:365::-;37013:3;37034:66;37098:1;37093:3;37034:66;:::i;:::-;37027:73;;37109:93;37198:3;37109:93;:::i;:::-;37227:2;37222:3;37218:12;37211:19;;36871:365;;;:::o;37242:419::-;37408:4;37446:2;37435:9;37431:18;37423:26;;37495:9;37489:4;37485:20;37481:1;37470:9;37466:17;37459:47;37523:131;37649:4;37523:131;:::i;:::-;37515:139;;37242:419;;;:::o;37667:156::-;37807:8;37803:1;37795:6;37791:14;37784:32;37667:156;:::o;37829:365::-;37971:3;37992:66;38056:1;38051:3;37992:66;:::i;:::-;37985:73;;38067:93;38156:3;38067:93;:::i;:::-;38185:2;38180:3;38176:12;38169:19;;37829:365;;;:::o;38200:419::-;38366:4;38404:2;38393:9;38389:18;38381:26;;38453:9;38447:4;38443:20;38439:1;38428:9;38424:17;38417:47;38481:131;38607:4;38481:131;:::i;:::-;38473:139;;38200:419;;;:::o;38625:410::-;38665:7;38688:20;38706:1;38688:20;:::i;:::-;38683:25;;38722:20;38740:1;38722:20;:::i;:::-;38717:25;;38777:1;38774;38770:9;38799:30;38817:11;38799:30;:::i;:::-;38788:41;;38978:1;38969:7;38965:15;38962:1;38959:22;38939:1;38932:9;38912:83;38889:139;;39008:18;;:::i;:::-;38889:139;38673:362;38625:410;;;;:::o;39041:156::-;39181:8;39177:1;39169:6;39165:14;39158:32;39041:156;:::o;39203:365::-;39345:3;39366:66;39430:1;39425:3;39366:66;:::i;:::-;39359:73;;39441:93;39530:3;39441:93;:::i;:::-;39559:2;39554:3;39550:12;39543:19;;39203:365;;;:::o;39574:419::-;39740:4;39778:2;39767:9;39763:18;39755:26;;39827:9;39821:4;39817:20;39813:1;39802:9;39798:17;39791:47;39855:131;39981:4;39855:131;:::i;:::-;39847:139;;39574:419;;;:::o;39999:156::-;40139:8;40135:1;40127:6;40123:14;40116:32;39999:156;:::o;40161:365::-;40303:3;40324:66;40388:1;40383:3;40324:66;:::i;:::-;40317:73;;40399:93;40488:3;40399:93;:::i;:::-;40517:2;40512:3;40508:12;40501:19;;40161:365;;;:::o;40532:419::-;40698:4;40736:2;40725:9;40721:18;40713:26;;40785:9;40779:4;40775:20;40771:1;40760:9;40756:17;40749:47;40813:131;40939:4;40813:131;:::i;:::-;40805:139;;40532:419;;;:::o;40957:143::-;41014:5;41045:6;41039:13;41030:22;;41061:33;41088:5;41061:33;:::i;:::-;40957:143;;;;:::o;41106:351::-;41176:6;41225:2;41213:9;41204:7;41200:23;41196:32;41193:119;;;41231:79;;:::i;:::-;41193:119;41351:1;41376:64;41432:7;41423:6;41412:9;41408:22;41376:64;:::i;:::-;41366:74;;41322:128;41106:351;;;;:::o;41463:234::-;41603:34;41599:1;41591:6;41587:14;41580:58;41672:17;41667:2;41659:6;41655:15;41648:42;41463:234;:::o;41703:366::-;41845:3;41866:67;41930:2;41925:3;41866:67;:::i;:::-;41859:74;;41942:93;42031:3;41942:93;:::i;:::-;42060:2;42055:3;42051:12;42044:19;;41703:366;;;:::o;42075:419::-;42241:4;42279:2;42268:9;42264:18;42256:26;;42328:9;42322:4;42318:20;42314:1;42303:9;42299:17;42292:47;42356:131;42482:4;42356:131;:::i;:::-;42348:139;;42075:419;;;:::o;42500:148::-;42602:11;42639:3;42624:18;;42500:148;;;;:::o;42678:874::-;42781:3;42818:5;42812:12;42847:36;42873:9;42847:36;:::i;:::-;42899:89;42981:6;42976:3;42899:89;:::i;:::-;42892:96;;43019:1;43008:9;43004:17;43035:1;43030:166;;;;43210:1;43205:341;;;;42997:549;;43030:166;43114:4;43110:9;43099;43095:25;43090:3;43083:38;43176:6;43169:14;43162:22;43154:6;43150:35;43145:3;43141:45;43134:52;;43030:166;;43205:341;43272:38;43304:5;43272:38;:::i;:::-;43332:1;43346:154;43360:6;43357:1;43354:13;43346:154;;;43434:7;43428:14;43424:1;43419:3;43415:11;43408:35;43484:1;43475:7;43471:15;43460:26;;43382:4;43379:1;43375:12;43370:17;;43346:154;;;43529:6;43524:3;43520:16;43513:23;;43212:334;;42997:549;;42785:767;;42678:874;;;;:::o;43558:390::-;43664:3;43692:39;43725:5;43692:39;:::i;:::-;43747:89;43829:6;43824:3;43747:89;:::i;:::-;43740:96;;43845:65;43903:6;43898:3;43891:4;43884:5;43880:16;43845:65;:::i;:::-;43935:6;43930:3;43926:16;43919:23;;43668:280;43558:390;;;;:::o;43954:583::-;44176:3;44198:92;44286:3;44277:6;44198:92;:::i;:::-;44191:99;;44307:95;44398:3;44389:6;44307:95;:::i;:::-;44300:102;;44419:92;44507:3;44498:6;44419:92;:::i;:::-;44412:99;;44528:3;44521:10;;43954:583;;;;;;:::o;44543:225::-;44683:34;44679:1;44671:6;44667:14;44660:58;44752:8;44747:2;44739:6;44735:15;44728:33;44543:225;:::o;44774:366::-;44916:3;44937:67;45001:2;44996:3;44937:67;:::i;:::-;44930:74;;45013:93;45102:3;45013:93;:::i;:::-;45131:2;45126:3;45122:12;45115:19;;44774:366;;;:::o;45146:419::-;45312:4;45350:2;45339:9;45335:18;45327:26;;45399:9;45393:4;45389:20;45385:1;45374:9;45370:17;45363:47;45427:131;45553:4;45427:131;:::i;:::-;45419:139;;45146:419;;;:::o;45571:332::-;45692:4;45730:2;45719:9;45715:18;45707:26;;45743:71;45811:1;45800:9;45796:17;45787:6;45743:71;:::i;:::-;45824:72;45892:2;45881:9;45877:18;45868:6;45824:72;:::i;:::-;45571:332;;;;;:::o;45909:137::-;45963:5;45994:6;45988:13;45979:22;;46010:30;46034:5;46010:30;:::i;:::-;45909:137;;;;:::o;46052:345::-;46119:6;46168:2;46156:9;46147:7;46143:23;46139:32;46136:119;;;46174:79;;:::i;:::-;46136:119;46294:1;46319:61;46372:7;46363:6;46352:9;46348:22;46319:61;:::i;:::-;46309:71;;46265:125;46052:345;;;;:::o;46403:220::-;46543:34;46539:1;46531:6;46527:14;46520:58;46612:3;46607:2;46599:6;46595:15;46588:28;46403:220;:::o;46629:366::-;46771:3;46792:67;46856:2;46851:3;46792:67;:::i;:::-;46785:74;;46868:93;46957:3;46868:93;:::i;:::-;46986:2;46981:3;46977:12;46970:19;;46629:366;;;:::o;47001:419::-;47167:4;47205:2;47194:9;47190:18;47182:26;;47254:9;47248:4;47244:20;47240:1;47229:9;47225:17;47218:47;47282:131;47408:4;47282:131;:::i;:::-;47274:139;;47001:419;;;:::o;47426:243::-;47566:34;47562:1;47554:6;47550:14;47543:58;47635:26;47630:2;47622:6;47618:15;47611:51;47426:243;:::o;47675:366::-;47817:3;47838:67;47902:2;47897:3;47838:67;:::i;:::-;47831:74;;47914:93;48003:3;47914:93;:::i;:::-;48032:2;48027:3;48023:12;48016:19;;47675:366;;;:::o;48047:419::-;48213:4;48251:2;48240:9;48236:18;48228:26;;48300:9;48294:4;48290:20;48286:1;48275:9;48271:17;48264:47;48328:131;48454:4;48328:131;:::i;:::-;48320:139;;48047:419;;;:::o;48472:179::-;48612:31;48608:1;48600:6;48596:14;48589:55;48472:179;:::o;48657:366::-;48799:3;48820:67;48884:2;48879:3;48820:67;:::i;:::-;48813:74;;48896:93;48985:3;48896:93;:::i;:::-;49014:2;49009:3;49005:12;48998:19;;48657:366;;;:::o;49029:419::-;49195:4;49233:2;49222:9;49218:18;49210:26;;49282:9;49276:4;49272:20;49268:1;49257:9;49253:17;49246:47;49310:131;49436:4;49310:131;:::i;:::-;49302:139;;49029:419;;;:::o;49454:147::-;49555:11;49592:3;49577:18;;49454:147;;;;:::o;49607:114::-;;:::o;49727:398::-;49886:3;49907:83;49988:1;49983:3;49907:83;:::i;:::-;49900:90;;49999:93;50088:3;49999:93;:::i;:::-;50117:1;50112:3;50108:11;50101:18;;49727:398;;;:::o;50131:379::-;50315:3;50337:147;50480:3;50337:147;:::i;:::-;50330:154;;50501:3;50494:10;;50131:379;;;:::o;50516:245::-;50656:34;50652:1;50644:6;50640:14;50633:58;50725:28;50720:2;50712:6;50708:15;50701:53;50516:245;:::o;50767:366::-;50909:3;50930:67;50994:2;50989:3;50930:67;:::i;:::-;50923:74;;51006:93;51095:3;51006:93;:::i;:::-;51124:2;51119:3;51115:12;51108:19;;50767:366;;;:::o;51139:419::-;51305:4;51343:2;51332:9;51328:18;51320:26;;51392:9;51386:4;51382:20;51378:1;51367:9;51363:17;51356:47;51420:131;51546:4;51420:131;:::i;:::-;51412:139;;51139:419;;;:::o;51564:236::-;51704:34;51700:1;51692:6;51688:14;51681:58;51773:19;51768:2;51760:6;51756:15;51749:44;51564:236;:::o;51806:366::-;51948:3;51969:67;52033:2;52028:3;51969:67;:::i;:::-;51962:74;;52045:93;52134:3;52045:93;:::i;:::-;52163:2;52158:3;52154:12;52147:19;;51806:366;;;:::o;52178:419::-;52344:4;52382:2;52371:9;52367:18;52359:26;;52431:9;52425:4;52421:20;52417:1;52406:9;52402:17;52395:47;52459:131;52585:4;52459:131;:::i;:::-;52451:139;;52178:419;;;:::o;52603:182::-;52743:34;52739:1;52731:6;52727:14;52720:58;52603:182;:::o;52791:366::-;52933:3;52954:67;53018:2;53013:3;52954:67;:::i;:::-;52947:74;;53030:93;53119:3;53030:93;:::i;:::-;53148:2;53143:3;53139:12;53132:19;;52791:366;;;:::o;53163:419::-;53329:4;53367:2;53356:9;53352:18;53344:26;;53416:9;53410:4;53406:20;53402:1;53391:9;53387:17;53380:47;53444:131;53570:4;53444:131;:::i;:::-;53436:139;;53163:419;;;:::o;53588:175::-;53728:27;53724:1;53716:6;53712:14;53705:51;53588:175;:::o;53769:366::-;53911:3;53932:67;53996:2;53991:3;53932:67;:::i;:::-;53925:74;;54008:93;54097:3;54008:93;:::i;:::-;54126:2;54121:3;54117:12;54110:19;;53769:366;;;:::o;54141:419::-;54307:4;54345:2;54334:9;54330:18;54322:26;;54394:9;54388:4;54384:20;54380:1;54369:9;54365:17;54358:47;54422:131;54548:4;54422:131;:::i;:::-;54414:139;;54141:419;;;:::o;54566:180::-;54614:77;54611:1;54604:88;54711:4;54708:1;54701:15;54735:4;54732:1;54725:15;54752:185;54792:1;54809:20;54827:1;54809:20;:::i;:::-;54804:25;;54843:20;54861:1;54843:20;:::i;:::-;54838:25;;54882:1;54872:35;;54887:18;;:::i;:::-;54872:35;54929:1;54926;54922:9;54917:14;;54752:185;;;;:::o;54943:231::-;55083:34;55079:1;55071:6;55067:14;55060:58;55152:14;55147:2;55139:6;55135:15;55128:39;54943:231;:::o;55180:366::-;55322:3;55343:67;55407:2;55402:3;55343:67;:::i;:::-;55336:74;;55419:93;55508:3;55419:93;:::i;:::-;55537:2;55532:3;55528:12;55521:19;;55180:366;;;:::o;55552:419::-;55718:4;55756:2;55745:9;55741:18;55733:26;;55805:9;55799:4;55795:20;55791:1;55780:9;55776:17;55769:47;55833:131;55959:4;55833:131;:::i;:::-;55825:139;;55552:419;;;:::o;55977:228::-;56117:34;56113:1;56105:6;56101:14;56094:58;56186:11;56181:2;56173:6;56169:15;56162:36;55977:228;:::o;56211:366::-;56353:3;56374:67;56438:2;56433:3;56374:67;:::i;:::-;56367:74;;56450:93;56539:3;56450:93;:::i;:::-;56568:2;56563:3;56559:12;56552:19;;56211:366;;;:::o;56583:419::-;56749:4;56787:2;56776:9;56772:18;56764:26;;56836:9;56830:4;56826:20;56822:1;56811:9;56807:17;56800:47;56864:131;56990:4;56864:131;:::i;:::-;56856:139;;56583:419;;;:::o;57008:223::-;57148:34;57144:1;57136:6;57132:14;57125:58;57217:6;57212:2;57204:6;57200:15;57193:31;57008:223;:::o;57237:366::-;57379:3;57400:67;57464:2;57459:3;57400:67;:::i;:::-;57393:74;;57476:93;57565:3;57476:93;:::i;:::-;57594:2;57589:3;57585:12;57578:19;;57237:366;;;:::o;57609:419::-;57775:4;57813:2;57802:9;57798:18;57790:26;;57862:9;57856:4;57852:20;57848:1;57837:9;57833:17;57826:47;57890:131;58016:4;57890:131;:::i;:::-;57882:139;;57609:419;;;:::o;58034:229::-;58174:34;58170:1;58162:6;58158:14;58151:58;58243:12;58238:2;58230:6;58226:15;58219:37;58034:229;:::o;58269:366::-;58411:3;58432:67;58496:2;58491:3;58432:67;:::i;:::-;58425:74;;58508:93;58597:3;58508:93;:::i;:::-;58626:2;58621:3;58617:12;58610:19;;58269:366;;;:::o;58641:419::-;58807:4;58845:2;58834:9;58830:18;58822:26;;58894:9;58888:4;58884:20;58880:1;58869:9;58865:17;58858:47;58922:131;59048:4;58922:131;:::i;:::-;58914:139;;58641:419;;;:::o;59066:237::-;59206:34;59202:1;59194:6;59190:14;59183:58;59275:20;59270:2;59262:6;59258:15;59251:45;59066:237;:::o;59309:366::-;59451:3;59472:67;59536:2;59531:3;59472:67;:::i;:::-;59465:74;;59548:93;59637:3;59548:93;:::i;:::-;59666:2;59661:3;59657:12;59650:19;;59309:366;;;:::o;59681:419::-;59847:4;59885:2;59874:9;59870:18;59862:26;;59934:9;59928:4;59924:20;59920:1;59909:9;59905:17;59898:47;59962:131;60088:4;59962:131;:::i;:::-;59954:139;;59681:419;;;:::o;60106:98::-;60157:6;60191:5;60185:12;60175:22;;60106:98;;;:::o;60210:168::-;60293:11;60327:6;60322:3;60315:19;60367:4;60362:3;60358:14;60343:29;;60210:168;;;;:::o;60384:373::-;60470:3;60498:38;60530:5;60498:38;:::i;:::-;60552:70;60615:6;60610:3;60552:70;:::i;:::-;60545:77;;60631:65;60689:6;60684:3;60677:4;60670:5;60666:16;60631:65;:::i;:::-;60721:29;60743:6;60721:29;:::i;:::-;60716:3;60712:39;60705:46;;60474:283;60384:373;;;;:::o;60763:640::-;60958:4;60996:3;60985:9;60981:19;60973:27;;61010:71;61078:1;61067:9;61063:17;61054:6;61010:71;:::i;:::-;61091:72;61159:2;61148:9;61144:18;61135:6;61091:72;:::i;:::-;61173;61241:2;61230:9;61226:18;61217:6;61173:72;:::i;:::-;61292:9;61286:4;61282:20;61277:2;61266:9;61262:18;61255:48;61320:76;61391:4;61382:6;61320:76;:::i;:::-;61312:84;;60763:640;;;;;;;:::o;61409:141::-;61465:5;61496:6;61490:13;61481:22;;61512:32;61538:5;61512:32;:::i;:::-;61409:141;;;;:::o;61556:349::-;61625:6;61674:2;61662:9;61653:7;61649:23;61645:32;61642:119;;;61680:79;;:::i;:::-;61642:119;61800:1;61825:63;61880:7;61871:6;61860:9;61856:22;61825:63;:::i;:::-;61815:73;;61771:127;61556:349;;;;:::o;61911:225::-;62051:34;62047:1;62039:6;62035:14;62028:58;62120:8;62115:2;62107:6;62103:15;62096:33;61911:225;:::o;62142:366::-;62284:3;62305:67;62369:2;62364:3;62305:67;:::i;:::-;62298:74;;62381:93;62470:3;62381:93;:::i;:::-;62499:2;62494:3;62490:12;62483:19;;62142:366;;;:::o;62514:419::-;62680:4;62718:2;62707:9;62703:18;62695:26;;62767:9;62761:4;62757:20;62753:1;62742:9;62738:17;62731:47;62795:131;62921:4;62795:131;:::i;:::-;62787:139;;62514:419;;;:::o;62939:386::-;63043:3;63071:38;63103:5;63071:38;:::i;:::-;63125:88;63206:6;63201:3;63125:88;:::i;:::-;63118:95;;63222:65;63280:6;63275:3;63268:4;63261:5;63257:16;63222:65;:::i;:::-;63312:6;63307:3;63303:16;63296:23;;63047:278;62939:386;;;;:::o;63331:271::-;63461:3;63483:93;63572:3;63563:6;63483:93;:::i;:::-;63476:100;;63593:3;63586:10;;63331:271;;;;:::o;63608:179::-;63748:31;63744:1;63736:6;63732:14;63725:55;63608:179;:::o;63793:366::-;63935:3;63956:67;64020:2;64015:3;63956:67;:::i;:::-;63949:74;;64032:93;64121:3;64032:93;:::i;:::-;64150:2;64145:3;64141:12;64134:19;;63793:366;;;:::o;64165:419::-;64331:4;64369:2;64358:9;64354:18;64346:26;;64418:9;64412:4;64408:20;64404:1;64393:9;64389:17;64382:47;64446:131;64572:4;64446:131;:::i;:::-;64438:139;;64165:419;;;:::o
Swarm Source
ipfs://a95507c1193cd3640af3929328d2d0f94e5fd465adccc7c757c91e4f9df32402
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
POL | 100.00% | $0.516578 | 4.16 | $2.15 |
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.