ERC-721
Overview
Max Total Supply
4,395 EP
Holders
1,029
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 EPLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
EtherPirates
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-01-10 */ // IERC165.sol // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // 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; } } // IERC721.sol pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // 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); } // IERC721Receiver.sol pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // IERC721Enumerable.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // 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; } } // ERC721S.sol pragma solidity ^0.8.10; abstract contract ERC721S is Context, ERC165, IERC721, IERC721Metadata { using Address for address; string private _name; string private _symbol; address[] internal _owners; mapping(uint256 => address) private _tokenApprovals; mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } 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 balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); uint count = 0; uint length = _owners.length; for( uint i = 0; i < length; ++i ){ if( owner == _owners[i] ){ ++count; } } delete length; return count; } function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } function name() public view virtual override returns (string memory) { return _name; } function symbol() public view virtual override returns (string memory) { return _symbol; } function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721S.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(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } 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 isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } function _exists(uint256 tokenId) internal view virtual returns (bool) { return tokenId < _owners.length && _owners[tokenId] != address(0); } function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721S.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _owners.push(to); emit Transfer(address(0), to, tokenId); } function _burn(uint256 tokenId) internal virtual { address owner = ERC721S.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, uint256 tokenId ) internal virtual { require(ERC721S.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, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721S.ownerOf(tokenId), to, tokenId); } function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // SafeMath.sol pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // Address.sol pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // ERC721Enum.sol pragma solidity ^0.8.10; abstract contract ERC721Enum is ERC721S, IERC721Enumerable { function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721S) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256 tokenId) { require(index < ERC721S.balanceOf(owner), "ERC721Enum: owner ioob"); uint count; for( uint i; i < _owners.length; ++i ){ if( owner == _owners[i] ){ if( count == index ) return i; else ++count; } } require(false, "ERC721Enum: owner ioob"); } function tokensOfOwner(address owner) public view returns (uint256[] memory) { require(0 < ERC721S.balanceOf(owner), "ERC721Enum: owner ioob"); uint256 tokenCount = balanceOf(owner); uint256[] memory tokenIds = new uint256[](tokenCount); for (uint256 i = 0; i < tokenCount; i++) { tokenIds[i] = tokenOfOwnerByIndex(owner, i); } return tokenIds; } function totalSupply() public view virtual override returns (uint256) { return _owners.length; } function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enum.totalSupply(), "ERC721Enum: global ioob"); return index; } } // ReentrancyGuard.sol pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // 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. * * `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. */ contract PaymentSplitter is Context { event PayeeAdded(address account, uint256 shares); event PaymentReleased(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; /** * @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 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 address of the payee number `index`. */ function payee(uint256 index) public view returns (address) { return _payees[index]; } /** * @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 totalReceived = address(this).balance + _totalReleased; uint256 payment = (totalReceived * _shares[account]) / _totalShares - _released[account]; require(payment != 0, "PaymentSplitter: account is not due payment"); _released[account] = _released[account] + payment; _totalReleased = _totalReleased + payment; Address.sendValue(account, payment); emit PaymentReleased(account, payment); } /** * @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_); } } // Pausable.sol pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // Strings.sol pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // 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() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // EtherPirates.sol pragma solidity ^0.8.10; contract EtherPirates is ERC721Enum, Ownable, Pausable, ReentrancyGuard { using Strings for uint256; string public baseURI; uint256 public cost = 0.03 ether; uint256 public maxSupply = 4444; uint256 public maxFree = 1000; uint256 public nftPerAddressLimit = 9; bool public status = false; mapping(address => uint256) public addressMintedBalance; constructor() ERC721S("Ether Pirates", "EP"){ setBaseURI(""); } function _baseURI() internal view virtual returns (string memory) { return baseURI; } function mint(uint256 _mintAmount) public payable nonReentrant{ uint256 s = totalSupply(); require(_mintAmount > 0, "Cant mint 0" ); require(_mintAmount <= 20, "Cant mint more then maxmint" ); require(s + _mintAmount <= maxSupply, "Cant go over supply" ); require(msg.value >= cost * _mintAmount); for (uint256 i = 0; i < _mintAmount; ++i) { _safeMint(msg.sender, s + i, ""); } delete s; } function mintfree(uint256 _mintAmount) public payable nonReentrant{ uint256 s = totalSupply(); uint256 ownerMintedCount = addressMintedBalance[msg.sender]; require(ownerMintedCount + _mintAmount <= nftPerAddressLimit, "max NFT per address exceeded"); require(_mintAmount > 0, "Cant mint 0" ); require(_mintAmount <= 3, "Cant mint more than max mint" ); require(s + _mintAmount <= maxFree, "Cant go over supply" ); for (uint256 i = 0; i < _mintAmount; ++i) { addressMintedBalance[msg.sender]++; _safeMint(msg.sender, s + i, ""); } delete s; } function gift(uint[] calldata quantity, address[] calldata recipient) external onlyOwner{ require(quantity.length == recipient.length, "Provide quantities and recipients" ); uint totalQuantity = 0; uint256 s = totalSupply(); for(uint i = 0; i < quantity.length; ++i){ totalQuantity += quantity[i]; } require( s + totalQuantity <= maxSupply, "Too many" ); delete totalQuantity; for(uint i = 0; i < recipient.length; ++i){ for(uint j = 0; j < quantity[i]; ++j){ _safeMint( recipient[i], s++, "" ); } } delete s; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: Nonexistent token"); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, tokenId.toString())) : ""; } function setNftPerAddressLimit(uint256 _limit) public onlyOwner { nftPerAddressLimit = _limit; } function setCost(uint256 _newCost) public onlyOwner { cost = _newCost; } function setmaxFree(uint256 _newMaxFree) public onlyOwner { maxFree = _newMaxFree; } function setmaxSupply(uint256 _newMaxSupply) public onlyOwner { maxSupply = _newMaxSupply; } function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } function setSaleStatus(bool _status) public onlyOwner { status = _status; } function withdraw() public payable onlyOwner { (bool success, ) = payable(msg.sender).call{value: address(this).balance}(""); require(success); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"quantity","type":"uint256[]"},{"internalType":"address[]","name":"recipient","type":"address[]"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintfree","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setNftPerAddressLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxFree","type":"uint256"}],"name":"setmaxFree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxSupply","type":"uint256"}],"name":"setmaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"status","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
6080604052666a94d74f43000060085561115c6009556103e8600a556009600b556000600c60006101000a81548160ff0219169083151502179055503480156200004857600080fd5b506040518060400160405280600d81526020017f45746865722050697261746573000000000000000000000000000000000000008152506040518060400160405280600281526020017f45500000000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000cd929190620002f5565b508060019080519060200190620000e6929190620002f5565b50505062000109620000fd6200015260201b60201c565b6200015a60201b60201c565b6000600560146101000a81548160ff02191690831515021790555060016006819055506200014c604051806020016040528060008152506200022060201b60201c565b6200048d565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002306200015260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000256620002cb60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002af576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002a69062000406565b60405180910390fd5b8060079080519060200190620002c7929190620002f5565b5050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003039062000457565b90600052602060002090601f01602090048101928262000327576000855562000373565b82601f106200034257805160ff191683800117855562000373565b8280016001018555821562000373579182015b828111156200037257825182559160200191906001019062000355565b5b50905062000382919062000386565b5090565b5b80821115620003a157600081600090555060010162000387565b5090565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620003ee602083620003a5565b9150620003fb82620003b6565b602082019050919050565b600060208201905081810360008301526200042181620003df565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200047057607f821691505b6020821081141562000487576200048662000428565b5b50919050565b61479e806200049d6000396000f3fe6080604052600436106102255760003560e01c80636352211e11610123578063a22cb465116100ab578063d5034b741161006f578063d5034b74146107f0578063d5abeb0114610819578063d897833e14610844578063e985e9c51461086d578063f2fde38b146108aa57610225565b8063a22cb4651461070d578063b88d4fde14610736578063ba7d2c761461075f578063c87b56dd1461078a578063d0eb26b0146107c757610225565b80638462151c116100f25780638462151c146106355780638da5cb5b1461067257806395d89b411461069d57806396ea3a47146106c8578063a0712d68146106f157610225565b80636352211e146105795780636c0360eb146105b657806370a08231146105e1578063715018a61461061e57610225565b8063228025e8116101b157806344a0d68a1161017557806344a0d68a14610494578063485a68a3146104bd5780634f6ccce7146104e857806355f804b3146105255780635c975abb1461054e57610225565b8063228025e8146103d257806323b872dd146103fb5780632f745c59146104245780633ccfd60b1461046157806342842e0e1461046b57610225565b8063095ea7b3116101f8578063095ea7b3146102eb57806313faede61461031457806318160ddd1461033f57806318cae2691461036a578063200d2ed2146103a757610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063084dcc69146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190612df7565b6108d3565b60405161025e9190612e3f565b60405180910390f35b34801561027357600080fd5b5061027c61094d565b6040516102899190612ef3565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190612f4b565b6109df565b6040516102c69190612fb9565b60405180910390f35b6102e960048036038101906102e49190612f4b565b610a64565b005b3480156102f757600080fd5b50610312600480360381019061030d9190613000565b610cd1565b005b34801561032057600080fd5b50610329610de9565b604051610336919061304f565b60405180910390f35b34801561034b57600080fd5b50610354610def565b604051610361919061304f565b60405180910390f35b34801561037657600080fd5b50610391600480360381019061038c919061306a565b610dfc565b60405161039e919061304f565b60405180910390f35b3480156103b357600080fd5b506103bc610e14565b6040516103c99190612e3f565b60405180910390f35b3480156103de57600080fd5b506103f960048036038101906103f49190612f4b565b610e27565b005b34801561040757600080fd5b50610422600480360381019061041d9190613097565b610ead565b005b34801561043057600080fd5b5061044b60048036038101906104469190613000565b610f0d565b604051610458919061304f565b60405180910390f35b610469611056565b005b34801561047757600080fd5b50610492600480360381019061048d9190613097565b61114b565b005b3480156104a057600080fd5b506104bb60048036038101906104b69190612f4b565b61116b565b005b3480156104c957600080fd5b506104d26111f1565b6040516104df919061304f565b60405180910390f35b3480156104f457600080fd5b5061050f600480360381019061050a9190612f4b565b6111f7565b60405161051c919061304f565b60405180910390f35b34801561053157600080fd5b5061054c6004803603810190610547919061321f565b61124a565b005b34801561055a57600080fd5b506105636112e0565b6040516105709190612e3f565b60405180910390f35b34801561058557600080fd5b506105a0600480360381019061059b9190612f4b565b6112f7565b6040516105ad9190612fb9565b60405180910390f35b3480156105c257600080fd5b506105cb6113b4565b6040516105d89190612ef3565b60405180910390f35b3480156105ed57600080fd5b506106086004803603810190610603919061306a565b611442565b604051610615919061304f565b60405180910390f35b34801561062a57600080fd5b50610633611568565b005b34801561064157600080fd5b5061065c6004803603810190610657919061306a565b6115f0565b6040516106699190613326565b60405180910390f35b34801561067e57600080fd5b506106876116e9565b6040516106949190612fb9565b60405180910390f35b3480156106a957600080fd5b506106b2611713565b6040516106bf9190612ef3565b60405180910390f35b3480156106d457600080fd5b506106ef60048036038101906106ea91906133fe565b6117a5565b005b61070b60048036038101906107069190612f4b565b6119c0565b005b34801561071957600080fd5b50610734600480360381019061072f91906134ab565b611b5d565b005b34801561074257600080fd5b5061075d6004803603810190610758919061358c565b611cde565b005b34801561076b57600080fd5b50610774611d40565b604051610781919061304f565b60405180910390f35b34801561079657600080fd5b506107b160048036038101906107ac9190612f4b565b611d46565b6040516107be9190612ef3565b60405180910390f35b3480156107d357600080fd5b506107ee60048036038101906107e99190612f4b565b611ded565b005b3480156107fc57600080fd5b5061081760048036038101906108129190612f4b565b611e73565b005b34801561082557600080fd5b5061082e611ef9565b60405161083b919061304f565b60405180910390f35b34801561085057600080fd5b5061086b6004803603810190610866919061360f565b611eff565b005b34801561087957600080fd5b50610894600480360381019061088f919061363c565b611f98565b6040516108a19190612e3f565b60405180910390f35b3480156108b657600080fd5b506108d160048036038101906108cc919061306a565b61202c565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610946575061094582612124565b5b9050919050565b60606000805461095c906136ab565b80601f0160208091040260200160405190810160405280929190818152602001828054610988906136ab565b80156109d55780601f106109aa576101008083540402835291602001916109d5565b820191906000526020600020905b8154815290600101906020018083116109b857829003601f168201915b5050505050905090565b60006109ea82612206565b610a29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a209061374f565b60405180910390fd5b6003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60026006541415610aaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa1906137bb565b60405180910390fd5b60026006819055506000610abc610def565b90506000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600b548382610b11919061380a565b1115610b52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b49906138ac565b60405180910390fd5b60008311610b95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8c90613918565b60405180910390fd5b6003831115610bd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd090613984565b60405180910390fd5b600a548383610be8919061380a565b1115610c29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c20906139f0565b60405180910390fd5b60005b83811015610cbf57600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190610c8490613a10565b9190505550610cae338285610c99919061380a565b6040518060200160405280600081525061228e565b80610cb890613a10565b9050610c2c565b50600091505050600160068190555050565b6000610cdc826112f7565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4490613acb565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d6c6122e9565b73ffffffffffffffffffffffffffffffffffffffff161480610d9b5750610d9a81610d956122e9565b611f98565b5b610dda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd190613b5d565b60405180910390fd5b610de483836122f1565b505050565b60085481565b6000600280549050905090565b600d6020528060005260406000206000915090505481565b600c60009054906101000a900460ff1681565b610e2f6122e9565b73ffffffffffffffffffffffffffffffffffffffff16610e4d6116e9565b73ffffffffffffffffffffffffffffffffffffffff1614610ea3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9a90613bc9565b60405180910390fd5b8060098190555050565b610ebe610eb86122e9565b826123aa565b610efd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef490613c5b565b60405180910390fd5b610f08838383612488565b505050565b6000610f1883611442565b8210610f59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5090613cc7565b60405180910390fd5b6000805b60028054905081101561100c5760028181548110610f7e57610f7d613ce7565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610ffb5783821415610fee578092505050611050565b81610ff890613a10565b91505b8061100590613a10565b9050610f5d565b50600061104e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104590613cc7565b60405180910390fd5b505b92915050565b61105e6122e9565b73ffffffffffffffffffffffffffffffffffffffff1661107c6116e9565b73ffffffffffffffffffffffffffffffffffffffff16146110d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c990613bc9565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff16476040516110f890613d47565b60006040518083038185875af1925050503d8060008114611135576040519150601f19603f3d011682016040523d82523d6000602084013e61113a565b606091505b505090508061114857600080fd5b50565b61116683838360405180602001604052806000815250611cde565b505050565b6111736122e9565b73ffffffffffffffffffffffffffffffffffffffff166111916116e9565b73ffffffffffffffffffffffffffffffffffffffff16146111e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111de90613bc9565b60405180910390fd5b8060088190555050565b600a5481565b6000611201610def565b8210611242576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123990613da8565b60405180910390fd5b819050919050565b6112526122e9565b73ffffffffffffffffffffffffffffffffffffffff166112706116e9565b73ffffffffffffffffffffffffffffffffffffffff16146112c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bd90613bc9565b60405180910390fd5b80600790805190602001906112dc929190612ce8565b5050565b6000600560149054906101000a900460ff16905090565b6000806002838154811061130e5761130d613ce7565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a290613e3a565b60405180910390fd5b80915050919050565b600780546113c1906136ab565b80601f01602080910402602001604051908101604052809291908181526020018280546113ed906136ab565b801561143a5780601f1061140f5761010080835404028352916020019161143a565b820191906000526020600020905b81548152906001019060200180831161141d57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114aa90613ecc565b60405180910390fd5b600080600280549050905060005b8181101561155957600281815481106114dd576114dc613ce7565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611548578261154590613a10565b92505b8061155290613a10565b90506114c1565b50600090508192505050919050565b6115706122e9565b73ffffffffffffffffffffffffffffffffffffffff1661158e6116e9565b73ffffffffffffffffffffffffffffffffffffffff16146115e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115db90613bc9565b60405180910390fd5b6115ee6000612641565b565b60606115fb82611442565b60001061163d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163490613cc7565b60405180910390fd5b600061164883611442565b905060008167ffffffffffffffff811115611666576116656130f4565b5b6040519080825280602002602001820160405280156116945781602001602082028036833780820191505090505b50905060005b828110156116de576116ac8582610f0d565b8282815181106116bf576116be613ce7565b5b60200260200101818152505080806116d690613a10565b91505061169a565b508092505050919050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611722906136ab565b80601f016020809104026020016040519081016040528092919081815260200182805461174e906136ab565b801561179b5780601f106117705761010080835404028352916020019161179b565b820191906000526020600020905b81548152906001019060200180831161177e57829003601f168201915b5050505050905090565b6117ad6122e9565b73ffffffffffffffffffffffffffffffffffffffff166117cb6116e9565b73ffffffffffffffffffffffffffffffffffffffff1614611821576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181890613bc9565b60405180910390fd5b818190508484905014611869576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186090613f5e565b60405180910390fd5b600080611874610def565b905060005b868690508110156118bc5786868281811061189757611896613ce7565b5b90506020020135836118a9919061380a565b9250806118b590613a10565b9050611879565b5060095482826118cc919061380a565b111561190d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190490613fca565b60405180910390fd5b6000915060005b848490508110156119b35760005b87878381811061193557611934613ce7565b5b905060200201358110156119a15761199086868481811061195957611958613ce7565b5b905060200201602081019061196e919061306a565b848061197990613a10565b95506040518060200160405280600081525061228e565b8061199a90613a10565b9050611922565b50806119ac90613a10565b9050611914565b5060009050505050505050565b60026006541415611a06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fd906137bb565b60405180910390fd5b60026006819055506000611a18610def565b905060008211611a5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5490613918565b60405180910390fd5b6014821115611aa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9890614036565b60405180910390fd5b6009548282611ab0919061380a565b1115611af1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae8906139f0565b60405180910390fd5b81600854611aff9190614056565b341015611b0b57600080fd5b60005b82811015611b4c57611b3b338284611b26919061380a565b6040518060200160405280600081525061228e565b80611b4590613a10565b9050611b0e565b506000905050600160068190555050565b611b656122e9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bca906140fc565b60405180910390fd5b8060046000611be06122e9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c8d6122e9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611cd29190612e3f565b60405180910390a35050565b611cef611ce96122e9565b836123aa565b611d2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2590613c5b565b60405180910390fd5b611d3a84848484612707565b50505050565b600b5481565b6060611d5182612206565b611d90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d879061418e565b60405180910390fd5b6000611d9a612763565b90506000815111611dba5760405180602001604052806000815250611de5565b80611dc4846127f5565b604051602001611dd59291906141ea565b6040516020818303038152906040525b915050919050565b611df56122e9565b73ffffffffffffffffffffffffffffffffffffffff16611e136116e9565b73ffffffffffffffffffffffffffffffffffffffff1614611e69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6090613bc9565b60405180910390fd5b80600b8190555050565b611e7b6122e9565b73ffffffffffffffffffffffffffffffffffffffff16611e996116e9565b73ffffffffffffffffffffffffffffffffffffffff1614611eef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee690613bc9565b60405180910390fd5b80600a8190555050565b60095481565b611f076122e9565b73ffffffffffffffffffffffffffffffffffffffff16611f256116e9565b73ffffffffffffffffffffffffffffffffffffffff1614611f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7290613bc9565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6120346122e9565b73ffffffffffffffffffffffffffffffffffffffff166120526116e9565b73ffffffffffffffffffffffffffffffffffffffff16146120a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209f90613bc9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612118576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210f90614280565b60405180910390fd5b61212181612641565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806121ef57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806121ff57506121fe82612956565b5b9050919050565b6000600280549050821080156122875750600073ffffffffffffffffffffffffffffffffffffffff166002838154811061224357612242613ce7565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b61229883836129c0565b6122a56000848484612b48565b6122e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122db90614312565b60405180910390fd5b505050565b600033905090565b816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612364836112f7565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006123b582612206565b6123f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123eb906143a4565b60405180910390fd5b60006123ff836112f7565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061246e57508373ffffffffffffffffffffffffffffffffffffffff16612456846109df565b73ffffffffffffffffffffffffffffffffffffffff16145b8061247f575061247e8185611f98565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166124a8826112f7565b73ffffffffffffffffffffffffffffffffffffffff16146124fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f590614436565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561256e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612565906144c8565b60405180910390fd5b612579838383612cd0565b6125846000826122f1565b816002828154811061259957612598613ce7565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612712848484612488565b61271e84848484612b48565b61275d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275490614312565b60405180910390fd5b50505050565b606060078054612772906136ab565b80601f016020809104026020016040519081016040528092919081815260200182805461279e906136ab565b80156127eb5780601f106127c0576101008083540402835291602001916127eb565b820191906000526020600020905b8154815290600101906020018083116127ce57829003601f168201915b5050505050905090565b6060600082141561283d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612951565b600082905060005b6000821461286f57808061285890613a10565b915050600a826128689190614517565b9150612845565b60008167ffffffffffffffff81111561288b5761288a6130f4565b5b6040519080825280601f01601f1916602001820160405280156128bd5781602001600182028036833780820191505090505b5090505b6000851461294a576001826128d69190614548565b9150600a856128e5919061457c565b60306128f1919061380a565b60f81b81838151811061290757612906613ce7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856129439190614517565b94506128c1565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a27906145f9565b60405180910390fd5b612a3981612206565b15612a79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7090614665565b60405180910390fd5b612a8560008383612cd0565b6002829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000612b698473ffffffffffffffffffffffffffffffffffffffff16612cd5565b15612cc3578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b926122e9565b8786866040518563ffffffff1660e01b8152600401612bb494939291906146da565b6020604051808303816000875af1925050508015612bf057506040513d601f19601f82011682018060405250810190612bed919061473b565b60015b612c73573d8060008114612c20576040519150601f19603f3d011682016040523d82523d6000602084013e612c25565b606091505b50600081511415612c6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6290614312565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612cc8565b600190505b949350505050565b505050565b600080823b905060008111915050919050565b828054612cf4906136ab565b90600052602060002090601f016020900481019282612d165760008555612d5d565b82601f10612d2f57805160ff1916838001178555612d5d565b82800160010185558215612d5d579182015b82811115612d5c578251825591602001919060010190612d41565b5b509050612d6a9190612d6e565b5090565b5b80821115612d87576000816000905550600101612d6f565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612dd481612d9f565b8114612ddf57600080fd5b50565b600081359050612df181612dcb565b92915050565b600060208284031215612e0d57612e0c612d95565b5b6000612e1b84828501612de2565b91505092915050565b60008115159050919050565b612e3981612e24565b82525050565b6000602082019050612e546000830184612e30565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e94578082015181840152602081019050612e79565b83811115612ea3576000848401525b50505050565b6000601f19601f8301169050919050565b6000612ec582612e5a565b612ecf8185612e65565b9350612edf818560208601612e76565b612ee881612ea9565b840191505092915050565b60006020820190508181036000830152612f0d8184612eba565b905092915050565b6000819050919050565b612f2881612f15565b8114612f3357600080fd5b50565b600081359050612f4581612f1f565b92915050565b600060208284031215612f6157612f60612d95565b5b6000612f6f84828501612f36565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612fa382612f78565b9050919050565b612fb381612f98565b82525050565b6000602082019050612fce6000830184612faa565b92915050565b612fdd81612f98565b8114612fe857600080fd5b50565b600081359050612ffa81612fd4565b92915050565b6000806040838503121561301757613016612d95565b5b600061302585828601612feb565b925050602061303685828601612f36565b9150509250929050565b61304981612f15565b82525050565b60006020820190506130646000830184613040565b92915050565b6000602082840312156130805761307f612d95565b5b600061308e84828501612feb565b91505092915050565b6000806000606084860312156130b0576130af612d95565b5b60006130be86828701612feb565b93505060206130cf86828701612feb565b92505060406130e086828701612f36565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61312c82612ea9565b810181811067ffffffffffffffff8211171561314b5761314a6130f4565b5b80604052505050565b600061315e612d8b565b905061316a8282613123565b919050565b600067ffffffffffffffff82111561318a576131896130f4565b5b61319382612ea9565b9050602081019050919050565b82818337600083830152505050565b60006131c26131bd8461316f565b613154565b9050828152602081018484840111156131de576131dd6130ef565b5b6131e98482856131a0565b509392505050565b600082601f830112613206576132056130ea565b5b81356132168482602086016131af565b91505092915050565b60006020828403121561323557613234612d95565b5b600082013567ffffffffffffffff81111561325357613252612d9a565b5b61325f848285016131f1565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61329d81612f15565b82525050565b60006132af8383613294565b60208301905092915050565b6000602082019050919050565b60006132d382613268565b6132dd8185613273565b93506132e883613284565b8060005b8381101561331957815161330088826132a3565b975061330b836132bb565b9250506001810190506132ec565b5085935050505092915050565b6000602082019050818103600083015261334081846132c8565b905092915050565b600080fd5b600080fd5b60008083601f840112613368576133676130ea565b5b8235905067ffffffffffffffff81111561338557613384613348565b5b6020830191508360208202830111156133a1576133a061334d565b5b9250929050565b60008083601f8401126133be576133bd6130ea565b5b8235905067ffffffffffffffff8111156133db576133da613348565b5b6020830191508360208202830111156133f7576133f661334d565b5b9250929050565b6000806000806040858703121561341857613417612d95565b5b600085013567ffffffffffffffff81111561343657613435612d9a565b5b61344287828801613352565b9450945050602085013567ffffffffffffffff81111561346557613464612d9a565b5b613471878288016133a8565b925092505092959194509250565b61348881612e24565b811461349357600080fd5b50565b6000813590506134a58161347f565b92915050565b600080604083850312156134c2576134c1612d95565b5b60006134d085828601612feb565b92505060206134e185828601613496565b9150509250929050565b600067ffffffffffffffff821115613506576135056130f4565b5b61350f82612ea9565b9050602081019050919050565b600061352f61352a846134eb565b613154565b90508281526020810184848401111561354b5761354a6130ef565b5b6135568482856131a0565b509392505050565b600082601f830112613573576135726130ea565b5b813561358384826020860161351c565b91505092915050565b600080600080608085870312156135a6576135a5612d95565b5b60006135b487828801612feb565b94505060206135c587828801612feb565b93505060406135d687828801612f36565b925050606085013567ffffffffffffffff8111156135f7576135f6612d9a565b5b6136038782880161355e565b91505092959194509250565b60006020828403121561362557613624612d95565b5b600061363384828501613496565b91505092915050565b6000806040838503121561365357613652612d95565b5b600061366185828601612feb565b925050602061367285828601612feb565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806136c357607f821691505b602082108114156136d7576136d661367c565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613739602c83612e65565b9150613744826136dd565b604082019050919050565b600060208201905081810360008301526137688161372c565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006137a5601f83612e65565b91506137b08261376f565b602082019050919050565b600060208201905081810360008301526137d481613798565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061381582612f15565b915061382083612f15565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613855576138546137db565b5b828201905092915050565b7f6d6178204e465420706572206164647265737320657863656564656400000000600082015250565b6000613896601c83612e65565b91506138a182613860565b602082019050919050565b600060208201905081810360008301526138c581613889565b9050919050565b7f43616e74206d696e742030000000000000000000000000000000000000000000600082015250565b6000613902600b83612e65565b915061390d826138cc565b602082019050919050565b60006020820190508181036000830152613931816138f5565b9050919050565b7f43616e74206d696e74206d6f7265207468616e206d6178206d696e7400000000600082015250565b600061396e601c83612e65565b915061397982613938565b602082019050919050565b6000602082019050818103600083015261399d81613961565b9050919050565b7f43616e7420676f206f76657220737570706c7900000000000000000000000000600082015250565b60006139da601383612e65565b91506139e5826139a4565b602082019050919050565b60006020820190508181036000830152613a09816139cd565b9050919050565b6000613a1b82612f15565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613a4e57613a4d6137db565b5b600182019050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613ab5602183612e65565b9150613ac082613a59565b604082019050919050565b60006020820190508181036000830152613ae481613aa8565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613b47603883612e65565b9150613b5282613aeb565b604082019050919050565b60006020820190508181036000830152613b7681613b3a565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613bb3602083612e65565b9150613bbe82613b7d565b602082019050919050565b60006020820190508181036000830152613be281613ba6565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613c45603183612e65565b9150613c5082613be9565b604082019050919050565b60006020820190508181036000830152613c7481613c38565b9050919050565b7f455243373231456e756d3a206f776e657220696f6f6200000000000000000000600082015250565b6000613cb1601683612e65565b9150613cbc82613c7b565b602082019050919050565b60006020820190508181036000830152613ce081613ca4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081905092915050565b50565b6000613d31600083613d16565b9150613d3c82613d21565b600082019050919050565b6000613d5282613d24565b9150819050919050565b7f455243373231456e756d3a20676c6f62616c20696f6f62000000000000000000600082015250565b6000613d92601783612e65565b9150613d9d82613d5c565b602082019050919050565b60006020820190508181036000830152613dc181613d85565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613e24602983612e65565b9150613e2f82613dc8565b604082019050919050565b60006020820190508181036000830152613e5381613e17565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613eb6602a83612e65565b9150613ec182613e5a565b604082019050919050565b60006020820190508181036000830152613ee581613ea9565b9050919050565b7f50726f76696465207175616e74697469657320616e6420726563697069656e7460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613f48602183612e65565b9150613f5382613eec565b604082019050919050565b60006020820190508181036000830152613f7781613f3b565b9050919050565b7f546f6f206d616e79000000000000000000000000000000000000000000000000600082015250565b6000613fb4600883612e65565b9150613fbf82613f7e565b602082019050919050565b60006020820190508181036000830152613fe381613fa7565b9050919050565b7f43616e74206d696e74206d6f7265207468656e206d61786d696e740000000000600082015250565b6000614020601b83612e65565b915061402b82613fea565b602082019050919050565b6000602082019050818103600083015261404f81614013565b9050919050565b600061406182612f15565b915061406c83612f15565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156140a5576140a46137db565b5b828202905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006140e6601983612e65565b91506140f1826140b0565b602082019050919050565b60006020820190508181036000830152614115816140d9565b9050919050565b7f4552433732314d657461646174613a204e6f6e6578697374656e7420746f6b6560008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b6000614178602183612e65565b91506141838261411c565b604082019050919050565b600060208201905081810360008301526141a78161416b565b9050919050565b600081905092915050565b60006141c482612e5a565b6141ce81856141ae565b93506141de818560208601612e76565b80840191505092915050565b60006141f682856141b9565b915061420282846141b9565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061426a602683612e65565b91506142758261420e565b604082019050919050565b600060208201905081810360008301526142998161425d565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006142fc603283612e65565b9150614307826142a0565b604082019050919050565b6000602082019050818103600083015261432b816142ef565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061438e602c83612e65565b915061439982614332565b604082019050919050565b600060208201905081810360008301526143bd81614381565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000614420602983612e65565b915061442b826143c4565b604082019050919050565b6000602082019050818103600083015261444f81614413565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006144b2602483612e65565b91506144bd82614456565b604082019050919050565b600060208201905081810360008301526144e1816144a5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061452282612f15565b915061452d83612f15565b92508261453d5761453c6144e8565b5b828204905092915050565b600061455382612f15565b915061455e83612f15565b925082821015614571576145706137db565b5b828203905092915050565b600061458782612f15565b915061459283612f15565b9250826145a2576145a16144e8565b5b828206905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006145e3602083612e65565b91506145ee826145ad565b602082019050919050565b60006020820190508181036000830152614612816145d6565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061464f601c83612e65565b915061465a82614619565b602082019050919050565b6000602082019050818103600083015261467e81614642565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006146ac82614685565b6146b68185614690565b93506146c6818560208601612e76565b6146cf81612ea9565b840191505092915050565b60006080820190506146ef6000830187612faa565b6146fc6020830186612faa565b6147096040830185613040565b818103606083015261471b81846146a1565b905095945050505050565b60008151905061473581612dcb565b92915050565b60006020828403121561475157614750612d95565b5b600061475f84828501614726565b9150509291505056fea2646970667358221220654f45ef81e30119096af9f97e095db9a5fdb4890b868ed980eda5aa4877092364736f6c634300080a0033
Deployed Bytecode
0x6080604052600436106102255760003560e01c80636352211e11610123578063a22cb465116100ab578063d5034b741161006f578063d5034b74146107f0578063d5abeb0114610819578063d897833e14610844578063e985e9c51461086d578063f2fde38b146108aa57610225565b8063a22cb4651461070d578063b88d4fde14610736578063ba7d2c761461075f578063c87b56dd1461078a578063d0eb26b0146107c757610225565b80638462151c116100f25780638462151c146106355780638da5cb5b1461067257806395d89b411461069d57806396ea3a47146106c8578063a0712d68146106f157610225565b80636352211e146105795780636c0360eb146105b657806370a08231146105e1578063715018a61461061e57610225565b8063228025e8116101b157806344a0d68a1161017557806344a0d68a14610494578063485a68a3146104bd5780634f6ccce7146104e857806355f804b3146105255780635c975abb1461054e57610225565b8063228025e8146103d257806323b872dd146103fb5780632f745c59146104245780633ccfd60b1461046157806342842e0e1461046b57610225565b8063095ea7b3116101f8578063095ea7b3146102eb57806313faede61461031457806318160ddd1461033f57806318cae2691461036a578063200d2ed2146103a757610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063084dcc69146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190612df7565b6108d3565b60405161025e9190612e3f565b60405180910390f35b34801561027357600080fd5b5061027c61094d565b6040516102899190612ef3565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190612f4b565b6109df565b6040516102c69190612fb9565b60405180910390f35b6102e960048036038101906102e49190612f4b565b610a64565b005b3480156102f757600080fd5b50610312600480360381019061030d9190613000565b610cd1565b005b34801561032057600080fd5b50610329610de9565b604051610336919061304f565b60405180910390f35b34801561034b57600080fd5b50610354610def565b604051610361919061304f565b60405180910390f35b34801561037657600080fd5b50610391600480360381019061038c919061306a565b610dfc565b60405161039e919061304f565b60405180910390f35b3480156103b357600080fd5b506103bc610e14565b6040516103c99190612e3f565b60405180910390f35b3480156103de57600080fd5b506103f960048036038101906103f49190612f4b565b610e27565b005b34801561040757600080fd5b50610422600480360381019061041d9190613097565b610ead565b005b34801561043057600080fd5b5061044b60048036038101906104469190613000565b610f0d565b604051610458919061304f565b60405180910390f35b610469611056565b005b34801561047757600080fd5b50610492600480360381019061048d9190613097565b61114b565b005b3480156104a057600080fd5b506104bb60048036038101906104b69190612f4b565b61116b565b005b3480156104c957600080fd5b506104d26111f1565b6040516104df919061304f565b60405180910390f35b3480156104f457600080fd5b5061050f600480360381019061050a9190612f4b565b6111f7565b60405161051c919061304f565b60405180910390f35b34801561053157600080fd5b5061054c6004803603810190610547919061321f565b61124a565b005b34801561055a57600080fd5b506105636112e0565b6040516105709190612e3f565b60405180910390f35b34801561058557600080fd5b506105a0600480360381019061059b9190612f4b565b6112f7565b6040516105ad9190612fb9565b60405180910390f35b3480156105c257600080fd5b506105cb6113b4565b6040516105d89190612ef3565b60405180910390f35b3480156105ed57600080fd5b506106086004803603810190610603919061306a565b611442565b604051610615919061304f565b60405180910390f35b34801561062a57600080fd5b50610633611568565b005b34801561064157600080fd5b5061065c6004803603810190610657919061306a565b6115f0565b6040516106699190613326565b60405180910390f35b34801561067e57600080fd5b506106876116e9565b6040516106949190612fb9565b60405180910390f35b3480156106a957600080fd5b506106b2611713565b6040516106bf9190612ef3565b60405180910390f35b3480156106d457600080fd5b506106ef60048036038101906106ea91906133fe565b6117a5565b005b61070b60048036038101906107069190612f4b565b6119c0565b005b34801561071957600080fd5b50610734600480360381019061072f91906134ab565b611b5d565b005b34801561074257600080fd5b5061075d6004803603810190610758919061358c565b611cde565b005b34801561076b57600080fd5b50610774611d40565b604051610781919061304f565b60405180910390f35b34801561079657600080fd5b506107b160048036038101906107ac9190612f4b565b611d46565b6040516107be9190612ef3565b60405180910390f35b3480156107d357600080fd5b506107ee60048036038101906107e99190612f4b565b611ded565b005b3480156107fc57600080fd5b5061081760048036038101906108129190612f4b565b611e73565b005b34801561082557600080fd5b5061082e611ef9565b60405161083b919061304f565b60405180910390f35b34801561085057600080fd5b5061086b6004803603810190610866919061360f565b611eff565b005b34801561087957600080fd5b50610894600480360381019061088f919061363c565b611f98565b6040516108a19190612e3f565b60405180910390f35b3480156108b657600080fd5b506108d160048036038101906108cc919061306a565b61202c565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610946575061094582612124565b5b9050919050565b60606000805461095c906136ab565b80601f0160208091040260200160405190810160405280929190818152602001828054610988906136ab565b80156109d55780601f106109aa576101008083540402835291602001916109d5565b820191906000526020600020905b8154815290600101906020018083116109b857829003601f168201915b5050505050905090565b60006109ea82612206565b610a29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a209061374f565b60405180910390fd5b6003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60026006541415610aaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa1906137bb565b60405180910390fd5b60026006819055506000610abc610def565b90506000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600b548382610b11919061380a565b1115610b52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b49906138ac565b60405180910390fd5b60008311610b95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8c90613918565b60405180910390fd5b6003831115610bd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd090613984565b60405180910390fd5b600a548383610be8919061380a565b1115610c29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c20906139f0565b60405180910390fd5b60005b83811015610cbf57600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190610c8490613a10565b9190505550610cae338285610c99919061380a565b6040518060200160405280600081525061228e565b80610cb890613a10565b9050610c2c565b50600091505050600160068190555050565b6000610cdc826112f7565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4490613acb565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d6c6122e9565b73ffffffffffffffffffffffffffffffffffffffff161480610d9b5750610d9a81610d956122e9565b611f98565b5b610dda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd190613b5d565b60405180910390fd5b610de483836122f1565b505050565b60085481565b6000600280549050905090565b600d6020528060005260406000206000915090505481565b600c60009054906101000a900460ff1681565b610e2f6122e9565b73ffffffffffffffffffffffffffffffffffffffff16610e4d6116e9565b73ffffffffffffffffffffffffffffffffffffffff1614610ea3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9a90613bc9565b60405180910390fd5b8060098190555050565b610ebe610eb86122e9565b826123aa565b610efd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef490613c5b565b60405180910390fd5b610f08838383612488565b505050565b6000610f1883611442565b8210610f59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5090613cc7565b60405180910390fd5b6000805b60028054905081101561100c5760028181548110610f7e57610f7d613ce7565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610ffb5783821415610fee578092505050611050565b81610ff890613a10565b91505b8061100590613a10565b9050610f5d565b50600061104e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104590613cc7565b60405180910390fd5b505b92915050565b61105e6122e9565b73ffffffffffffffffffffffffffffffffffffffff1661107c6116e9565b73ffffffffffffffffffffffffffffffffffffffff16146110d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c990613bc9565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff16476040516110f890613d47565b60006040518083038185875af1925050503d8060008114611135576040519150601f19603f3d011682016040523d82523d6000602084013e61113a565b606091505b505090508061114857600080fd5b50565b61116683838360405180602001604052806000815250611cde565b505050565b6111736122e9565b73ffffffffffffffffffffffffffffffffffffffff166111916116e9565b73ffffffffffffffffffffffffffffffffffffffff16146111e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111de90613bc9565b60405180910390fd5b8060088190555050565b600a5481565b6000611201610def565b8210611242576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123990613da8565b60405180910390fd5b819050919050565b6112526122e9565b73ffffffffffffffffffffffffffffffffffffffff166112706116e9565b73ffffffffffffffffffffffffffffffffffffffff16146112c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bd90613bc9565b60405180910390fd5b80600790805190602001906112dc929190612ce8565b5050565b6000600560149054906101000a900460ff16905090565b6000806002838154811061130e5761130d613ce7565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a290613e3a565b60405180910390fd5b80915050919050565b600780546113c1906136ab565b80601f01602080910402602001604051908101604052809291908181526020018280546113ed906136ab565b801561143a5780601f1061140f5761010080835404028352916020019161143a565b820191906000526020600020905b81548152906001019060200180831161141d57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114aa90613ecc565b60405180910390fd5b600080600280549050905060005b8181101561155957600281815481106114dd576114dc613ce7565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611548578261154590613a10565b92505b8061155290613a10565b90506114c1565b50600090508192505050919050565b6115706122e9565b73ffffffffffffffffffffffffffffffffffffffff1661158e6116e9565b73ffffffffffffffffffffffffffffffffffffffff16146115e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115db90613bc9565b60405180910390fd5b6115ee6000612641565b565b60606115fb82611442565b60001061163d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163490613cc7565b60405180910390fd5b600061164883611442565b905060008167ffffffffffffffff811115611666576116656130f4565b5b6040519080825280602002602001820160405280156116945781602001602082028036833780820191505090505b50905060005b828110156116de576116ac8582610f0d565b8282815181106116bf576116be613ce7565b5b60200260200101818152505080806116d690613a10565b91505061169a565b508092505050919050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611722906136ab565b80601f016020809104026020016040519081016040528092919081815260200182805461174e906136ab565b801561179b5780601f106117705761010080835404028352916020019161179b565b820191906000526020600020905b81548152906001019060200180831161177e57829003601f168201915b5050505050905090565b6117ad6122e9565b73ffffffffffffffffffffffffffffffffffffffff166117cb6116e9565b73ffffffffffffffffffffffffffffffffffffffff1614611821576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181890613bc9565b60405180910390fd5b818190508484905014611869576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186090613f5e565b60405180910390fd5b600080611874610def565b905060005b868690508110156118bc5786868281811061189757611896613ce7565b5b90506020020135836118a9919061380a565b9250806118b590613a10565b9050611879565b5060095482826118cc919061380a565b111561190d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190490613fca565b60405180910390fd5b6000915060005b848490508110156119b35760005b87878381811061193557611934613ce7565b5b905060200201358110156119a15761199086868481811061195957611958613ce7565b5b905060200201602081019061196e919061306a565b848061197990613a10565b95506040518060200160405280600081525061228e565b8061199a90613a10565b9050611922565b50806119ac90613a10565b9050611914565b5060009050505050505050565b60026006541415611a06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fd906137bb565b60405180910390fd5b60026006819055506000611a18610def565b905060008211611a5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5490613918565b60405180910390fd5b6014821115611aa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9890614036565b60405180910390fd5b6009548282611ab0919061380a565b1115611af1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae8906139f0565b60405180910390fd5b81600854611aff9190614056565b341015611b0b57600080fd5b60005b82811015611b4c57611b3b338284611b26919061380a565b6040518060200160405280600081525061228e565b80611b4590613a10565b9050611b0e565b506000905050600160068190555050565b611b656122e9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bca906140fc565b60405180910390fd5b8060046000611be06122e9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c8d6122e9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611cd29190612e3f565b60405180910390a35050565b611cef611ce96122e9565b836123aa565b611d2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2590613c5b565b60405180910390fd5b611d3a84848484612707565b50505050565b600b5481565b6060611d5182612206565b611d90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d879061418e565b60405180910390fd5b6000611d9a612763565b90506000815111611dba5760405180602001604052806000815250611de5565b80611dc4846127f5565b604051602001611dd59291906141ea565b6040516020818303038152906040525b915050919050565b611df56122e9565b73ffffffffffffffffffffffffffffffffffffffff16611e136116e9565b73ffffffffffffffffffffffffffffffffffffffff1614611e69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6090613bc9565b60405180910390fd5b80600b8190555050565b611e7b6122e9565b73ffffffffffffffffffffffffffffffffffffffff16611e996116e9565b73ffffffffffffffffffffffffffffffffffffffff1614611eef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee690613bc9565b60405180910390fd5b80600a8190555050565b60095481565b611f076122e9565b73ffffffffffffffffffffffffffffffffffffffff16611f256116e9565b73ffffffffffffffffffffffffffffffffffffffff1614611f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7290613bc9565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6120346122e9565b73ffffffffffffffffffffffffffffffffffffffff166120526116e9565b73ffffffffffffffffffffffffffffffffffffffff16146120a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209f90613bc9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612118576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210f90614280565b60405180910390fd5b61212181612641565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806121ef57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806121ff57506121fe82612956565b5b9050919050565b6000600280549050821080156122875750600073ffffffffffffffffffffffffffffffffffffffff166002838154811061224357612242613ce7565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b61229883836129c0565b6122a56000848484612b48565b6122e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122db90614312565b60405180910390fd5b505050565b600033905090565b816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612364836112f7565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006123b582612206565b6123f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123eb906143a4565b60405180910390fd5b60006123ff836112f7565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061246e57508373ffffffffffffffffffffffffffffffffffffffff16612456846109df565b73ffffffffffffffffffffffffffffffffffffffff16145b8061247f575061247e8185611f98565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166124a8826112f7565b73ffffffffffffffffffffffffffffffffffffffff16146124fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f590614436565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561256e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612565906144c8565b60405180910390fd5b612579838383612cd0565b6125846000826122f1565b816002828154811061259957612598613ce7565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612712848484612488565b61271e84848484612b48565b61275d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275490614312565b60405180910390fd5b50505050565b606060078054612772906136ab565b80601f016020809104026020016040519081016040528092919081815260200182805461279e906136ab565b80156127eb5780601f106127c0576101008083540402835291602001916127eb565b820191906000526020600020905b8154815290600101906020018083116127ce57829003601f168201915b5050505050905090565b6060600082141561283d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612951565b600082905060005b6000821461286f57808061285890613a10565b915050600a826128689190614517565b9150612845565b60008167ffffffffffffffff81111561288b5761288a6130f4565b5b6040519080825280601f01601f1916602001820160405280156128bd5781602001600182028036833780820191505090505b5090505b6000851461294a576001826128d69190614548565b9150600a856128e5919061457c565b60306128f1919061380a565b60f81b81838151811061290757612906613ce7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856129439190614517565b94506128c1565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a27906145f9565b60405180910390fd5b612a3981612206565b15612a79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7090614665565b60405180910390fd5b612a8560008383612cd0565b6002829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000612b698473ffffffffffffffffffffffffffffffffffffffff16612cd5565b15612cc3578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b926122e9565b8786866040518563ffffffff1660e01b8152600401612bb494939291906146da565b6020604051808303816000875af1925050508015612bf057506040513d601f19601f82011682018060405250810190612bed919061473b565b60015b612c73573d8060008114612c20576040519150601f19603f3d011682016040523d82523d6000602084013e612c25565b606091505b50600081511415612c6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6290614312565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612cc8565b600190505b949350505050565b505050565b600080823b905060008111915050919050565b828054612cf4906136ab565b90600052602060002090601f016020900481019282612d165760008555612d5d565b82601f10612d2f57805160ff1916838001178555612d5d565b82800160010185558215612d5d579182015b82811115612d5c578251825591602001919060010190612d41565b5b509050612d6a9190612d6e565b5090565b5b80821115612d87576000816000905550600101612d6f565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612dd481612d9f565b8114612ddf57600080fd5b50565b600081359050612df181612dcb565b92915050565b600060208284031215612e0d57612e0c612d95565b5b6000612e1b84828501612de2565b91505092915050565b60008115159050919050565b612e3981612e24565b82525050565b6000602082019050612e546000830184612e30565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e94578082015181840152602081019050612e79565b83811115612ea3576000848401525b50505050565b6000601f19601f8301169050919050565b6000612ec582612e5a565b612ecf8185612e65565b9350612edf818560208601612e76565b612ee881612ea9565b840191505092915050565b60006020820190508181036000830152612f0d8184612eba565b905092915050565b6000819050919050565b612f2881612f15565b8114612f3357600080fd5b50565b600081359050612f4581612f1f565b92915050565b600060208284031215612f6157612f60612d95565b5b6000612f6f84828501612f36565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612fa382612f78565b9050919050565b612fb381612f98565b82525050565b6000602082019050612fce6000830184612faa565b92915050565b612fdd81612f98565b8114612fe857600080fd5b50565b600081359050612ffa81612fd4565b92915050565b6000806040838503121561301757613016612d95565b5b600061302585828601612feb565b925050602061303685828601612f36565b9150509250929050565b61304981612f15565b82525050565b60006020820190506130646000830184613040565b92915050565b6000602082840312156130805761307f612d95565b5b600061308e84828501612feb565b91505092915050565b6000806000606084860312156130b0576130af612d95565b5b60006130be86828701612feb565b93505060206130cf86828701612feb565b92505060406130e086828701612f36565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61312c82612ea9565b810181811067ffffffffffffffff8211171561314b5761314a6130f4565b5b80604052505050565b600061315e612d8b565b905061316a8282613123565b919050565b600067ffffffffffffffff82111561318a576131896130f4565b5b61319382612ea9565b9050602081019050919050565b82818337600083830152505050565b60006131c26131bd8461316f565b613154565b9050828152602081018484840111156131de576131dd6130ef565b5b6131e98482856131a0565b509392505050565b600082601f830112613206576132056130ea565b5b81356132168482602086016131af565b91505092915050565b60006020828403121561323557613234612d95565b5b600082013567ffffffffffffffff81111561325357613252612d9a565b5b61325f848285016131f1565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61329d81612f15565b82525050565b60006132af8383613294565b60208301905092915050565b6000602082019050919050565b60006132d382613268565b6132dd8185613273565b93506132e883613284565b8060005b8381101561331957815161330088826132a3565b975061330b836132bb565b9250506001810190506132ec565b5085935050505092915050565b6000602082019050818103600083015261334081846132c8565b905092915050565b600080fd5b600080fd5b60008083601f840112613368576133676130ea565b5b8235905067ffffffffffffffff81111561338557613384613348565b5b6020830191508360208202830111156133a1576133a061334d565b5b9250929050565b60008083601f8401126133be576133bd6130ea565b5b8235905067ffffffffffffffff8111156133db576133da613348565b5b6020830191508360208202830111156133f7576133f661334d565b5b9250929050565b6000806000806040858703121561341857613417612d95565b5b600085013567ffffffffffffffff81111561343657613435612d9a565b5b61344287828801613352565b9450945050602085013567ffffffffffffffff81111561346557613464612d9a565b5b613471878288016133a8565b925092505092959194509250565b61348881612e24565b811461349357600080fd5b50565b6000813590506134a58161347f565b92915050565b600080604083850312156134c2576134c1612d95565b5b60006134d085828601612feb565b92505060206134e185828601613496565b9150509250929050565b600067ffffffffffffffff821115613506576135056130f4565b5b61350f82612ea9565b9050602081019050919050565b600061352f61352a846134eb565b613154565b90508281526020810184848401111561354b5761354a6130ef565b5b6135568482856131a0565b509392505050565b600082601f830112613573576135726130ea565b5b813561358384826020860161351c565b91505092915050565b600080600080608085870312156135a6576135a5612d95565b5b60006135b487828801612feb565b94505060206135c587828801612feb565b93505060406135d687828801612f36565b925050606085013567ffffffffffffffff8111156135f7576135f6612d9a565b5b6136038782880161355e565b91505092959194509250565b60006020828403121561362557613624612d95565b5b600061363384828501613496565b91505092915050565b6000806040838503121561365357613652612d95565b5b600061366185828601612feb565b925050602061367285828601612feb565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806136c357607f821691505b602082108114156136d7576136d661367c565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613739602c83612e65565b9150613744826136dd565b604082019050919050565b600060208201905081810360008301526137688161372c565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006137a5601f83612e65565b91506137b08261376f565b602082019050919050565b600060208201905081810360008301526137d481613798565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061381582612f15565b915061382083612f15565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613855576138546137db565b5b828201905092915050565b7f6d6178204e465420706572206164647265737320657863656564656400000000600082015250565b6000613896601c83612e65565b91506138a182613860565b602082019050919050565b600060208201905081810360008301526138c581613889565b9050919050565b7f43616e74206d696e742030000000000000000000000000000000000000000000600082015250565b6000613902600b83612e65565b915061390d826138cc565b602082019050919050565b60006020820190508181036000830152613931816138f5565b9050919050565b7f43616e74206d696e74206d6f7265207468616e206d6178206d696e7400000000600082015250565b600061396e601c83612e65565b915061397982613938565b602082019050919050565b6000602082019050818103600083015261399d81613961565b9050919050565b7f43616e7420676f206f76657220737570706c7900000000000000000000000000600082015250565b60006139da601383612e65565b91506139e5826139a4565b602082019050919050565b60006020820190508181036000830152613a09816139cd565b9050919050565b6000613a1b82612f15565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613a4e57613a4d6137db565b5b600182019050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613ab5602183612e65565b9150613ac082613a59565b604082019050919050565b60006020820190508181036000830152613ae481613aa8565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613b47603883612e65565b9150613b5282613aeb565b604082019050919050565b60006020820190508181036000830152613b7681613b3a565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613bb3602083612e65565b9150613bbe82613b7d565b602082019050919050565b60006020820190508181036000830152613be281613ba6565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613c45603183612e65565b9150613c5082613be9565b604082019050919050565b60006020820190508181036000830152613c7481613c38565b9050919050565b7f455243373231456e756d3a206f776e657220696f6f6200000000000000000000600082015250565b6000613cb1601683612e65565b9150613cbc82613c7b565b602082019050919050565b60006020820190508181036000830152613ce081613ca4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081905092915050565b50565b6000613d31600083613d16565b9150613d3c82613d21565b600082019050919050565b6000613d5282613d24565b9150819050919050565b7f455243373231456e756d3a20676c6f62616c20696f6f62000000000000000000600082015250565b6000613d92601783612e65565b9150613d9d82613d5c565b602082019050919050565b60006020820190508181036000830152613dc181613d85565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613e24602983612e65565b9150613e2f82613dc8565b604082019050919050565b60006020820190508181036000830152613e5381613e17565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613eb6602a83612e65565b9150613ec182613e5a565b604082019050919050565b60006020820190508181036000830152613ee581613ea9565b9050919050565b7f50726f76696465207175616e74697469657320616e6420726563697069656e7460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613f48602183612e65565b9150613f5382613eec565b604082019050919050565b60006020820190508181036000830152613f7781613f3b565b9050919050565b7f546f6f206d616e79000000000000000000000000000000000000000000000000600082015250565b6000613fb4600883612e65565b9150613fbf82613f7e565b602082019050919050565b60006020820190508181036000830152613fe381613fa7565b9050919050565b7f43616e74206d696e74206d6f7265207468656e206d61786d696e740000000000600082015250565b6000614020601b83612e65565b915061402b82613fea565b602082019050919050565b6000602082019050818103600083015261404f81614013565b9050919050565b600061406182612f15565b915061406c83612f15565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156140a5576140a46137db565b5b828202905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006140e6601983612e65565b91506140f1826140b0565b602082019050919050565b60006020820190508181036000830152614115816140d9565b9050919050565b7f4552433732314d657461646174613a204e6f6e6578697374656e7420746f6b6560008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b6000614178602183612e65565b91506141838261411c565b604082019050919050565b600060208201905081810360008301526141a78161416b565b9050919050565b600081905092915050565b60006141c482612e5a565b6141ce81856141ae565b93506141de818560208601612e76565b80840191505092915050565b60006141f682856141b9565b915061420282846141b9565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061426a602683612e65565b91506142758261420e565b604082019050919050565b600060208201905081810360008301526142998161425d565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006142fc603283612e65565b9150614307826142a0565b604082019050919050565b6000602082019050818103600083015261432b816142ef565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061438e602c83612e65565b915061439982614332565b604082019050919050565b600060208201905081810360008301526143bd81614381565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000614420602983612e65565b915061442b826143c4565b604082019050919050565b6000602082019050818103600083015261444f81614413565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006144b2602483612e65565b91506144bd82614456565b604082019050919050565b600060208201905081810360008301526144e1816144a5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061452282612f15565b915061452d83612f15565b92508261453d5761453c6144e8565b5b828204905092915050565b600061455382612f15565b915061455e83612f15565b925082821015614571576145706137db565b5b828203905092915050565b600061458782612f15565b915061459283612f15565b9250826145a2576145a16144e8565b5b828206905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006145e3602083612e65565b91506145ee826145ad565b602082019050919050565b60006020820190508181036000830152614612816145d6565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061464f601c83612e65565b915061465a82614619565b602082019050919050565b6000602082019050818103600083015261467e81614642565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006146ac82614685565b6146b68185614690565b93506146c6818560208601612e76565b6146cf81612ea9565b840191505092915050565b60006080820190506146ef6000830187612faa565b6146fc6020830186612faa565b6147096040830185613040565b818103606083015261471b81846146a1565b905095945050505050565b60008151905061473581612dcb565b92915050565b60006020828403121561475157614750612d95565b5b600061475f84828501614726565b9150509291505056fea2646970667358221220654f45ef81e30119096af9f97e095db9a5fdb4890b868ed980eda5aa4877092364736f6c634300080a0033
Deployed Bytecode Sourcemap
47978:3238:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32203:225;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11321:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11955:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48964:599;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11537:412;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48111:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33364:110;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48297:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48264:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50766:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12653:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32434:500;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51056:151;;;:::i;:::-;;12998:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50582:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48185:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33480:194;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50869:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42468:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11076:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48086:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10656:414;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47296:94;;;;;;;;;;;;;:::i;:::-;;32940:418;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46645:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11427:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49568:560;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48536:419;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12182:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13189:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48223:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50134:327;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50473:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50667:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48147:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50970:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12483:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47545:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32203:225;32306:4;32345:35;32330:50;;;:11;:50;;;;:90;;;;32384:36;32408:11;32384:23;:36::i;:::-;32330:90;32323:97;;32203:225;;;:::o;11321:100::-;11375:13;11408:5;11401:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11321:100;:::o;11955:221::-;12031:7;12059:16;12067:7;12059;:16::i;:::-;12051:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;12144:15;:24;12160:7;12144:24;;;;;;;;;;;;;;;;;;;;;12137:31;;11955:221;;;:::o;48964:599::-;35387:1;35983:7;;:19;;35975:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;35387:1;36116:7;:18;;;;49035:9:::1;49047:13;:11;:13::i;:::-;49035:25;;49071:24;49098:20;:32;49119:10;49098:32;;;;;;;;;;;;;;;;49071:59;;49183:18;;49168:11;49149:16;:30;;;;:::i;:::-;:52;;49141:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;49261:1;49247:11;:15;49239:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;49307:1;49292:11;:16;;49284:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;49374:7;;49359:11;49355:1;:15;;;;:::i;:::-;:26;;49347:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;49416:9;49411:135;49435:11;49431:1;:15;49411:135;;;49468:20;:32;49489:10;49468:32;;;;;;;;;;;;;;;;:34;;;;;;;;;:::i;:::-;;;;;;49508:32;49518:10;49534:1;49530;:5;;;;:::i;:::-;49508:32;;;;;;;;;;;::::0;:9:::1;:32::i;:::-;49448:3;;;;:::i;:::-;;;49411:135;;;;49550:8;;;49030:533;;35343:1:::0;36295:7;:22;;;;48964:599;:::o;11537:412::-;11618:13;11634:24;11650:7;11634:15;:24::i;:::-;11618:40;;11683:5;11677:11;;:2;:11;;;;11669:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;11777:5;11761:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;11786:37;11803:5;11810:12;:10;:12::i;:::-;11786:16;:37::i;:::-;11761:62;11739:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;11920:21;11929:2;11933:7;11920:8;:21::i;:::-;11607:342;11537:412;;:::o;48111:32::-;;;;:::o;33364:110::-;33425:7;33452;:14;;;;33445:21;;33364:110;:::o;48297:55::-;;;;;;;;;;;;;;;;;:::o;48264:26::-;;;;;;;;;;;;;:::o;50766:100::-;46876:12;:10;:12::i;:::-;46865:23;;:7;:5;:7::i;:::-;:23;;;46857:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50848:13:::1;50836:9;:25;;;;50766:100:::0;:::o;12653:339::-;12848:41;12867:12;:10;:12::i;:::-;12881:7;12848:18;:41::i;:::-;12840:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;12956:28;12966:4;12972:2;12976:7;12956:9;:28::i;:::-;12653:339;;;:::o;32434:500::-;32523:15;32567:24;32585:5;32567:17;:24::i;:::-;32559:5;:32;32551:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;32629:10;32655:6;32650:226;32667:7;:14;;;;32663:1;:18;32650:226;;;32716:7;32724:1;32716:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32707:19;;:5;:19;;;32703:162;;;32760:5;32751;:14;32747:102;;;32796:1;32789:8;;;;;;32747:102;32842:7;;;;:::i;:::-;;;32703:162;32683:3;;;;:::i;:::-;;;32650:226;;;;32894:5;32886:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;32540:394;32434:500;;;;;:::o;51056:151::-;46876:12;:10;:12::i;:::-;46865:23;;:7;:5;:7::i;:::-;:23;;;46857:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51106:12:::1;51132:10;51124:24;;51156:21;51124:58;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51105:77;;;51194:7;51186:16;;;::::0;::::1;;51101:106;51056:151::o:0;12998:185::-;13136:39;13153:4;13159:2;13163:7;13136:39;;;;;;;;;;;;:16;:39::i;:::-;12998:185;;;:::o;50582:80::-;46876:12;:10;:12::i;:::-;46865:23;;:7;:5;:7::i;:::-;:23;;;46857:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50649:8:::1;50642:4;:15;;;;50582:80:::0;:::o;48185:29::-;;;;:::o;33480:194::-;33555:7;33591:24;:22;:24::i;:::-;33583:5;:32;33575:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33661:5;33654:12;;33480:194;;;:::o;50869:98::-;46876:12;:10;:12::i;:::-;46865:23;;:7;:5;:7::i;:::-;:23;;;46857:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50951:11:::1;50941:7;:21;;;;;;;;;;;;:::i;:::-;;50869:98:::0;:::o;42468:86::-;42515:4;42539:7;;;;;;;;;;;42532:14;;42468:86;:::o;11076:239::-;11148:7;11168:13;11184:7;11192;11184:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;11168:32;;11236:1;11219:19;;:5;:19;;;;11211:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;11302:5;11295:12;;;11076:239;;;:::o;48086:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;10656:414::-;10728:7;10773:1;10756:19;;:5;:19;;;;10748:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;10833:10;10858:11;10872:7;:14;;;;10858:28;;10902:6;10897:119;10918:6;10914:1;:10;10897:119;;;10957:7;10965:1;10957:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;10948:19;;:5;:19;;;10944:61;;;10984:7;;;;:::i;:::-;;;10944:61;10926:3;;;;:::i;:::-;;;10897:119;;;;11026:13;;;11057:5;11050:12;;;;10656:414;;;:::o;47296:94::-;46876:12;:10;:12::i;:::-;46865:23;;:7;:5;:7::i;:::-;:23;;;46857:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47361:21:::1;47379:1;47361:9;:21::i;:::-;47296:94::o:0;32940:418::-;32999:16;33040:24;33058:5;33040:17;:24::i;:::-;33036:1;:28;33028:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;33102:18;33123:16;33133:5;33123:9;:16::i;:::-;33102:37;;33150:25;33192:10;33178:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33150:53;;33219:9;33214:111;33238:10;33234:1;:14;33214:111;;;33284:29;33304:5;33311:1;33284:19;:29::i;:::-;33270:8;33279:1;33270:11;;;;;;;;:::i;:::-;;;;;;;:43;;;;;33250:3;;;;;:::i;:::-;;;;33214:111;;;;33342:8;33335:15;;;;32940:418;;;:::o;46645:87::-;46691:7;46718:6;;;;;;;;;;;46711:13;;46645:87;:::o;11427:104::-;11483:13;11516:7;11509:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11427:104;:::o;49568:560::-;46876:12;:10;:12::i;:::-;46865:23;;:7;:5;:7::i;:::-;:23;;;46857:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49688:9:::1;;:16;;49669:8;;:15;;:35;49661:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;49748:18;49775:9:::0;49787:13:::1;:11;:13::i;:::-;49775:25;;49809:6;49805:81;49825:8;;:15;;49821:1;:19;49805:81;;;49869:8;;49878:1;49869:11;;;;;;;:::i;:::-;;;;;;;;49852:28;;;;;:::i;:::-;;;49842:3;;;;:::i;:::-;;;49805:81;;;;49920:9;;49903:13;49899:1;:17;;;;:::i;:::-;:30;;49890:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;49948:20;;;49977:6;49973:137;49993:9;;:16;;49989:1;:20;49973:137;;;50025:6;50021:84;50041:8;;50050:1;50041:11;;;;;;;:::i;:::-;;;;;;;;50037:1;:15;50021:84;;;50064:34;50075:9;;50085:1;50075:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;50089:3;;;;;:::i;:::-;;;50064:34;;;;;;;;;;;::::0;:9:::1;:34::i;:::-;50054:3;;;;:::i;:::-;;;50021:84;;;;50011:3;;;;:::i;:::-;;;49973:137;;;;50114:8;;;49656:472;;49568:560:::0;;;;:::o;48536:419::-;35387:1;35983:7;;:19;;35975:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;35387:1;36116:7;:18;;;;48603:9:::1;48615:13;:11;:13::i;:::-;48603:25;;48655:1;48641:11;:15;48633:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;48701:2;48686:11;:17;;48678:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;48768:9;;48753:11;48749:1;:15;;;;:::i;:::-;:28;;48741:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;48835:11;48828:4;;:18;;;;:::i;:::-;48815:9;:31;;48807:40;;;::::0;::::1;;48857:9;48852:86;48876:11;48872:1;:15;48852:86;;;48900:32;48910:10;48926:1;48922;:5;;;;:::i;:::-;48900:32;;;;;;;;;;;::::0;:9:::1;:32::i;:::-;48889:3;;;;:::i;:::-;;;48852:86;;;;48942:8;;;48598:357;35343:1:::0;36295:7;:22;;;;48536:419;:::o;12182:295::-;12297:12;:10;:12::i;:::-;12285:24;;:8;:24;;;;12277:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;12397:8;12352:18;:32;12371:12;:10;:12::i;:::-;12352:32;;;;;;;;;;;;;;;:42;12385:8;12352:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;12450:8;12421:48;;12436:12;:10;:12::i;:::-;12421:48;;;12460:8;12421:48;;;;;;:::i;:::-;;;;;;;;12182:295;;:::o;13189:328::-;13364:41;13383:12;:10;:12::i;:::-;13397:7;13364:18;:41::i;:::-;13356:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;13470:39;13484:4;13490:2;13494:7;13503:5;13470:13;:39::i;:::-;13189:328;;;;:::o;48223:37::-;;;;:::o;50134:327::-;50207:13;50238:16;50246:7;50238;:16::i;:::-;50230:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;50300:28;50331:10;:8;:10::i;:::-;50300:41;;50387:1;50362:14;50356:28;:32;:100;;;;;;;;;;;;;;;;;50415:14;50431:18;:7;:16;:18::i;:::-;50398:52;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50356:100;50349:107;;;50134:327;;;:::o;50473:104::-;46876:12;:10;:12::i;:::-;46865:23;;:7;:5;:7::i;:::-;:23;;;46857:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50565:6:::1;50544:18;:27;;;;50473:104:::0;:::o;50667:92::-;46876:12;:10;:12::i;:::-;46865:23;;:7;:5;:7::i;:::-;:23;;;46857:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50743:11:::1;50733:7;:21;;;;50667:92:::0;:::o;48147:31::-;;;;:::o;50970:83::-;46876:12;:10;:12::i;:::-;46865:23;;:7;:5;:7::i;:::-;:23;;;46857:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51041:7:::1;51032:6;;:16;;;;;;;;;;;;;;;;;;50970:83:::0;:::o;12483:164::-;12580:4;12604:18;:25;12623:5;12604:25;;;;;;;;;;;;;;;:35;12630:8;12604:35;;;;;;;;;;;;;;;;;;;;;;;;;12597:42;;12483:164;;;;:::o;47545:192::-;46876:12;:10;:12::i;:::-;46865:23;;:7;:5;:7::i;:::-;:23;;;46857:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47654:1:::1;47634:22;;:8;:22;;;;47626:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;47710:19;47720:8;47710:9;:19::i;:::-;47545:192:::0;:::o;10345:305::-;10447:4;10499:25;10484:40;;;:11;:40;;;;:105;;;;10556:33;10541:48;;;:11;:48;;;;10484:105;:158;;;;10606:36;10630:11;10606:23;:36::i;:::-;10484:158;10464:178;;10345:305;;;:::o;13846:155::-;13911:4;13945:7;:14;;;;13935:7;:24;:58;;;;;13991:1;13963:30;;:7;13971;13963:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:30;;;;13935:58;13928:65;;13846:155;;;:::o;14469:321::-;14599:18;14605:2;14609:7;14599:5;:18::i;:::-;14650:54;14681:1;14685:2;14689:7;14698:5;14650:22;:54::i;:::-;14628:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;14469:321;;;:::o;9616:98::-;9669:7;9696:10;9689:17;;9616:98;:::o;15998:175::-;16100:2;16073:15;:24;16089:7;16073:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;16157:7;16153:2;16118:47;;16127:24;16143:7;16127:15;:24::i;:::-;16118:47;;;;;;;;;;;;15998:175;;:::o;14004:349::-;14097:4;14122:16;14130:7;14122;:16::i;:::-;14114:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;14198:13;14214:24;14230:7;14214:15;:24::i;:::-;14198:40;;14268:5;14257:16;;:7;:16;;;:51;;;;14301:7;14277:31;;:20;14289:7;14277:11;:20::i;:::-;:31;;;14257:51;:87;;;;14312:32;14329:5;14336:7;14312:16;:32::i;:::-;14257:87;14249:96;;;14004:349;;;;:::o;15478:517::-;15638:4;15610:32;;:24;15626:7;15610:15;:24::i;:::-;:32;;;15602:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;15721:1;15707:16;;:2;:16;;;;15699:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;15777:39;15798:4;15804:2;15808:7;15777:20;:39::i;:::-;15881:29;15898:1;15902:7;15881:8;:29::i;:::-;15940:2;15921:7;15929;15921:16;;;;;;;;:::i;:::-;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;15979:7;15975:2;15960:27;;15969:4;15960:27;;;;;;;;;;;;15478:517;;;:::o;47745:173::-;47801:16;47820:6;;;;;;;;;;;47801:25;;47846:8;47837:6;;:17;;;;;;;;;;;;;;;;;;47901:8;47870:40;;47891:8;47870:40;;;;;;;;;;;;47790:128;47745:173;:::o;13528:315::-;13685:28;13695:4;13701:2;13705:7;13685:9;:28::i;:::-;13732:48;13755:4;13761:2;13765:7;13774:5;13732:22;:48::i;:::-;13724:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;13528:315;;;;:::o;48438:93::-;48489:13;48519:7;48512:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48438:93;:::o;43927:723::-;43983:13;44213:1;44204:5;:10;44200:53;;;44231:10;;;;;;;;;;;;;;;;;;;;;44200:53;44263:12;44278:5;44263:20;;44294:14;44319:78;44334:1;44326:4;:9;44319:78;;44352:8;;;;;:::i;:::-;;;;44383:2;44375:10;;;;;:::i;:::-;;;44319:78;;;44407:19;44439:6;44429:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44407:39;;44457:154;44473:1;44464:5;:10;44457:154;;44501:1;44491:11;;;;;:::i;:::-;;;44568:2;44560:5;:10;;;;:::i;:::-;44547:2;:24;;;;:::i;:::-;44534:39;;44517:6;44524;44517:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;44597:2;44588:11;;;;;:::i;:::-;;;44457:154;;;44635:6;44621:21;;;;;43927:723;;;;:::o;1574:157::-;1659:4;1698:25;1683:40;;;:11;:40;;;;1676:47;;1574:157;;;:::o;14793:346::-;14887:1;14873:16;;:2;:16;;;;14865:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;14946:16;14954:7;14946;:16::i;:::-;14945:17;14937:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;15008:45;15037:1;15041:2;15045:7;15008:20;:45::i;:::-;15064:7;15077:2;15064:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15123:7;15119:2;15098:33;;15115:1;15098:33;;;;;;;;;;;;14793:346;;:::o;16176:799::-;16331:4;16352:15;:2;:13;;;:15::i;:::-;16348:620;;;16404:2;16388:36;;;16425:12;:10;:12::i;:::-;16439:4;16445:7;16454:5;16388:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;16384:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16647:1;16630:6;:13;:18;16626:272;;;16673:60;;;;;;;;;;:::i;:::-;;;;;;;;16626:272;16848:6;16842:13;16833:6;16829:2;16825:15;16818:38;16384:529;16521:41;;;16511:51;;;:6;:51;;;;16504:58;;;;;16348:620;16952:4;16945:11;;16176:799;;;;;;;:::o;16978:126::-;;;;:::o;24753:387::-;24813:4;25021:12;25088:7;25076:20;25068:28;;25131:1;25124:4;:8;25117:15;;;24753:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:329::-;5349:6;5398:2;5386:9;5377:7;5373:23;5369:32;5366:119;;;5404:79;;:::i;:::-;5366:119;5524:1;5549:53;5594:7;5585:6;5574:9;5570:22;5549:53;:::i;:::-;5539:63;;5495:117;5290:329;;;;:::o;5625:619::-;5702:6;5710;5718;5767:2;5755:9;5746:7;5742:23;5738:32;5735:119;;;5773:79;;:::i;:::-;5735:119;5893:1;5918:53;5963:7;5954:6;5943:9;5939:22;5918:53;:::i;:::-;5908:63;;5864:117;6020:2;6046:53;6091:7;6082:6;6071:9;6067:22;6046:53;:::i;:::-;6036:63;;5991:118;6148:2;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6119:118;5625:619;;;;;:::o;6250:117::-;6359:1;6356;6349:12;6373:117;6482:1;6479;6472:12;6496:180;6544:77;6541:1;6534:88;6641:4;6638:1;6631:15;6665:4;6662:1;6655:15;6682:281;6765:27;6787:4;6765:27;:::i;:::-;6757:6;6753:40;6895:6;6883:10;6880:22;6859:18;6847:10;6844:34;6841:62;6838:88;;;6906:18;;:::i;:::-;6838:88;6946:10;6942:2;6935:22;6725:238;6682:281;;:::o;6969:129::-;7003:6;7030:20;;:::i;:::-;7020:30;;7059:33;7087:4;7079:6;7059:33;:::i;:::-;6969:129;;;:::o;7104:308::-;7166:4;7256:18;7248:6;7245:30;7242:56;;;7278:18;;:::i;:::-;7242:56;7316:29;7338:6;7316:29;:::i;:::-;7308:37;;7400:4;7394;7390:15;7382:23;;7104:308;;;:::o;7418:154::-;7502:6;7497:3;7492;7479:30;7564:1;7555:6;7550:3;7546:16;7539:27;7418:154;;;:::o;7578:412::-;7656:5;7681:66;7697:49;7739:6;7697:49;:::i;:::-;7681:66;:::i;:::-;7672:75;;7770:6;7763:5;7756:21;7808:4;7801:5;7797:16;7846:3;7837:6;7832:3;7828:16;7825:25;7822:112;;;7853:79;;:::i;:::-;7822:112;7943:41;7977:6;7972:3;7967;7943:41;:::i;:::-;7662:328;7578:412;;;;;:::o;8010:340::-;8066:5;8115:3;8108:4;8100:6;8096:17;8092:27;8082:122;;8123:79;;:::i;:::-;8082:122;8240:6;8227:20;8265:79;8340:3;8332:6;8325:4;8317:6;8313:17;8265:79;:::i;:::-;8256:88;;8072:278;8010:340;;;;:::o;8356:509::-;8425:6;8474:2;8462:9;8453:7;8449:23;8445:32;8442:119;;;8480:79;;:::i;:::-;8442:119;8628:1;8617:9;8613:17;8600:31;8658:18;8650:6;8647:30;8644:117;;;8680:79;;:::i;:::-;8644:117;8785:63;8840:7;8831:6;8820:9;8816:22;8785:63;:::i;:::-;8775:73;;8571:287;8356:509;;;;:::o;8871:114::-;8938:6;8972:5;8966:12;8956:22;;8871:114;;;:::o;8991:184::-;9090:11;9124:6;9119:3;9112:19;9164:4;9159:3;9155:14;9140:29;;8991:184;;;;:::o;9181:132::-;9248:4;9271:3;9263:11;;9301:4;9296:3;9292:14;9284:22;;9181:132;;;:::o;9319:108::-;9396:24;9414:5;9396:24;:::i;:::-;9391:3;9384:37;9319:108;;:::o;9433:179::-;9502:10;9523:46;9565:3;9557:6;9523:46;:::i;:::-;9601:4;9596:3;9592:14;9578:28;;9433:179;;;;:::o;9618:113::-;9688:4;9720;9715:3;9711:14;9703:22;;9618:113;;;:::o;9767:732::-;9886:3;9915:54;9963:5;9915:54;:::i;:::-;9985:86;10064:6;10059:3;9985:86;:::i;:::-;9978:93;;10095:56;10145:5;10095:56;:::i;:::-;10174:7;10205:1;10190:284;10215:6;10212:1;10209:13;10190:284;;;10291:6;10285:13;10318:63;10377:3;10362:13;10318:63;:::i;:::-;10311:70;;10404:60;10457:6;10404:60;:::i;:::-;10394:70;;10250:224;10237:1;10234;10230:9;10225:14;;10190:284;;;10194:14;10490:3;10483:10;;9891:608;;;9767:732;;;;:::o;10505:373::-;10648:4;10686:2;10675:9;10671:18;10663:26;;10735:9;10729:4;10725:20;10721:1;10710:9;10706:17;10699:47;10763:108;10866:4;10857:6;10763:108;:::i;:::-;10755:116;;10505:373;;;;:::o;10884:117::-;10993:1;10990;10983:12;11007:117;11116:1;11113;11106:12;11147:568;11220:8;11230:6;11280:3;11273:4;11265:6;11261:17;11257:27;11247:122;;11288:79;;:::i;:::-;11247:122;11401:6;11388:20;11378:30;;11431:18;11423:6;11420:30;11417:117;;;11453:79;;:::i;:::-;11417:117;11567:4;11559:6;11555:17;11543:29;;11621:3;11613:4;11605:6;11601:17;11591:8;11587:32;11584:41;11581:128;;;11628:79;;:::i;:::-;11581:128;11147:568;;;;;:::o;11738:::-;11811:8;11821:6;11871:3;11864:4;11856:6;11852:17;11848:27;11838:122;;11879:79;;:::i;:::-;11838:122;11992:6;11979:20;11969:30;;12022:18;12014:6;12011:30;12008:117;;;12044:79;;:::i;:::-;12008:117;12158:4;12150:6;12146:17;12134:29;;12212:3;12204:4;12196:6;12192:17;12182:8;12178:32;12175:41;12172:128;;;12219:79;;:::i;:::-;12172:128;11738:568;;;;;:::o;12312:934::-;12434:6;12442;12450;12458;12507:2;12495:9;12486:7;12482:23;12478:32;12475:119;;;12513:79;;:::i;:::-;12475:119;12661:1;12650:9;12646:17;12633:31;12691:18;12683:6;12680:30;12677:117;;;12713:79;;:::i;:::-;12677:117;12826:80;12898:7;12889:6;12878:9;12874:22;12826:80;:::i;:::-;12808:98;;;;12604:312;12983:2;12972:9;12968:18;12955:32;13014:18;13006:6;13003:30;13000:117;;;13036:79;;:::i;:::-;13000:117;13149:80;13221:7;13212:6;13201:9;13197:22;13149:80;:::i;:::-;13131:98;;;;12926:313;12312:934;;;;;;;:::o;13252:116::-;13322:21;13337:5;13322:21;:::i;:::-;13315:5;13312:32;13302:60;;13358:1;13355;13348:12;13302:60;13252:116;:::o;13374:133::-;13417:5;13455:6;13442:20;13433:29;;13471:30;13495:5;13471:30;:::i;:::-;13374:133;;;;:::o;13513:468::-;13578:6;13586;13635:2;13623:9;13614:7;13610:23;13606:32;13603:119;;;13641:79;;:::i;:::-;13603:119;13761:1;13786:53;13831:7;13822:6;13811:9;13807:22;13786:53;:::i;:::-;13776:63;;13732:117;13888:2;13914:50;13956:7;13947:6;13936:9;13932:22;13914:50;:::i;:::-;13904:60;;13859:115;13513:468;;;;;:::o;13987:307::-;14048:4;14138:18;14130:6;14127:30;14124:56;;;14160:18;;:::i;:::-;14124:56;14198:29;14220:6;14198:29;:::i;:::-;14190:37;;14282:4;14276;14272:15;14264:23;;13987:307;;;:::o;14300:410::-;14377:5;14402:65;14418:48;14459:6;14418:48;:::i;:::-;14402:65;:::i;:::-;14393:74;;14490:6;14483:5;14476:21;14528:4;14521:5;14517:16;14566:3;14557:6;14552:3;14548:16;14545:25;14542:112;;;14573:79;;:::i;:::-;14542:112;14663:41;14697:6;14692:3;14687;14663:41;:::i;:::-;14383:327;14300:410;;;;;:::o;14729:338::-;14784:5;14833:3;14826:4;14818:6;14814:17;14810:27;14800:122;;14841:79;;:::i;:::-;14800:122;14958:6;14945:20;14983:78;15057:3;15049:6;15042:4;15034:6;15030:17;14983:78;:::i;:::-;14974:87;;14790:277;14729:338;;;;:::o;15073:943::-;15168:6;15176;15184;15192;15241:3;15229:9;15220:7;15216:23;15212:33;15209:120;;;15248:79;;:::i;:::-;15209:120;15368:1;15393:53;15438:7;15429:6;15418:9;15414:22;15393:53;:::i;:::-;15383:63;;15339:117;15495:2;15521:53;15566:7;15557:6;15546:9;15542:22;15521:53;:::i;:::-;15511:63;;15466:118;15623:2;15649:53;15694:7;15685:6;15674:9;15670:22;15649:53;:::i;:::-;15639:63;;15594:118;15779:2;15768:9;15764:18;15751:32;15810:18;15802:6;15799:30;15796:117;;;15832:79;;:::i;:::-;15796:117;15937:62;15991:7;15982:6;15971:9;15967:22;15937:62;:::i;:::-;15927:72;;15722:287;15073:943;;;;;;;:::o;16022:323::-;16078:6;16127:2;16115:9;16106:7;16102:23;16098:32;16095:119;;;16133:79;;:::i;:::-;16095:119;16253:1;16278:50;16320:7;16311:6;16300:9;16296:22;16278:50;:::i;:::-;16268:60;;16224:114;16022:323;;;;:::o;16351:474::-;16419:6;16427;16476:2;16464:9;16455:7;16451:23;16447:32;16444:119;;;16482:79;;:::i;:::-;16444:119;16602:1;16627:53;16672:7;16663:6;16652:9;16648:22;16627:53;:::i;:::-;16617:63;;16573:117;16729:2;16755:53;16800:7;16791:6;16780:9;16776:22;16755:53;:::i;:::-;16745:63;;16700:118;16351:474;;;;;:::o;16831:180::-;16879:77;16876:1;16869:88;16976:4;16973:1;16966:15;17000:4;16997:1;16990:15;17017:320;17061:6;17098:1;17092:4;17088:12;17078:22;;17145:1;17139:4;17135:12;17166:18;17156:81;;17222:4;17214:6;17210:17;17200:27;;17156:81;17284:2;17276:6;17273:14;17253:18;17250:38;17247:84;;;17303:18;;:::i;:::-;17247:84;17068:269;17017:320;;;:::o;17343:231::-;17483:34;17479:1;17471:6;17467:14;17460:58;17552:14;17547:2;17539:6;17535:15;17528:39;17343:231;:::o;17580:366::-;17722:3;17743:67;17807:2;17802:3;17743:67;:::i;:::-;17736:74;;17819:93;17908:3;17819:93;:::i;:::-;17937:2;17932:3;17928:12;17921:19;;17580:366;;;:::o;17952:419::-;18118:4;18156:2;18145:9;18141:18;18133:26;;18205:9;18199:4;18195:20;18191:1;18180:9;18176:17;18169:47;18233:131;18359:4;18233:131;:::i;:::-;18225:139;;17952:419;;;:::o;18377:181::-;18517:33;18513:1;18505:6;18501:14;18494:57;18377:181;:::o;18564:366::-;18706:3;18727:67;18791:2;18786:3;18727:67;:::i;:::-;18720:74;;18803:93;18892:3;18803:93;:::i;:::-;18921:2;18916:3;18912:12;18905:19;;18564:366;;;:::o;18936:419::-;19102:4;19140:2;19129:9;19125:18;19117:26;;19189:9;19183:4;19179:20;19175:1;19164:9;19160:17;19153:47;19217:131;19343:4;19217:131;:::i;:::-;19209:139;;18936:419;;;:::o;19361:180::-;19409:77;19406:1;19399:88;19506:4;19503:1;19496:15;19530:4;19527:1;19520:15;19547:305;19587:3;19606:20;19624:1;19606:20;:::i;:::-;19601:25;;19640:20;19658:1;19640:20;:::i;:::-;19635:25;;19794:1;19726:66;19722:74;19719:1;19716:81;19713:107;;;19800:18;;:::i;:::-;19713:107;19844:1;19841;19837:9;19830:16;;19547:305;;;;:::o;19858:178::-;19998:30;19994:1;19986:6;19982:14;19975:54;19858:178;:::o;20042:366::-;20184:3;20205:67;20269:2;20264:3;20205:67;:::i;:::-;20198:74;;20281:93;20370:3;20281:93;:::i;:::-;20399:2;20394:3;20390:12;20383:19;;20042:366;;;:::o;20414:419::-;20580:4;20618:2;20607:9;20603:18;20595:26;;20667:9;20661:4;20657:20;20653:1;20642:9;20638:17;20631:47;20695:131;20821:4;20695:131;:::i;:::-;20687:139;;20414:419;;;:::o;20839:161::-;20979:13;20975:1;20967:6;20963:14;20956:37;20839:161;:::o;21006:366::-;21148:3;21169:67;21233:2;21228:3;21169:67;:::i;:::-;21162:74;;21245:93;21334:3;21245:93;:::i;:::-;21363:2;21358:3;21354:12;21347:19;;21006:366;;;:::o;21378:419::-;21544:4;21582:2;21571:9;21567:18;21559:26;;21631:9;21625:4;21621:20;21617:1;21606:9;21602:17;21595:47;21659:131;21785:4;21659:131;:::i;:::-;21651:139;;21378:419;;;:::o;21803:178::-;21943:30;21939:1;21931:6;21927:14;21920:54;21803:178;:::o;21987:366::-;22129:3;22150:67;22214:2;22209:3;22150:67;:::i;:::-;22143:74;;22226:93;22315:3;22226:93;:::i;:::-;22344:2;22339:3;22335:12;22328:19;;21987:366;;;:::o;22359:419::-;22525:4;22563:2;22552:9;22548:18;22540:26;;22612:9;22606:4;22602:20;22598:1;22587:9;22583:17;22576:47;22640:131;22766:4;22640:131;:::i;:::-;22632:139;;22359:419;;;:::o;22784:169::-;22924:21;22920:1;22912:6;22908:14;22901:45;22784:169;:::o;22959:366::-;23101:3;23122:67;23186:2;23181:3;23122:67;:::i;:::-;23115:74;;23198:93;23287:3;23198:93;:::i;:::-;23316:2;23311:3;23307:12;23300:19;;22959:366;;;:::o;23331:419::-;23497:4;23535:2;23524:9;23520:18;23512:26;;23584:9;23578:4;23574:20;23570:1;23559:9;23555:17;23548:47;23612:131;23738:4;23612:131;:::i;:::-;23604:139;;23331:419;;;:::o;23756:233::-;23795:3;23818:24;23836:5;23818:24;:::i;:::-;23809:33;;23864:66;23857:5;23854:77;23851:103;;;23934:18;;:::i;:::-;23851:103;23981:1;23974:5;23970:13;23963:20;;23756:233;;;:::o;23995:220::-;24135:34;24131:1;24123:6;24119:14;24112:58;24204:3;24199:2;24191:6;24187:15;24180:28;23995:220;:::o;24221:366::-;24363:3;24384:67;24448:2;24443:3;24384:67;:::i;:::-;24377:74;;24460:93;24549:3;24460:93;:::i;:::-;24578:2;24573:3;24569:12;24562:19;;24221:366;;;:::o;24593:419::-;24759:4;24797:2;24786:9;24782:18;24774:26;;24846:9;24840:4;24836:20;24832:1;24821:9;24817:17;24810:47;24874:131;25000:4;24874:131;:::i;:::-;24866:139;;24593:419;;;:::o;25018:243::-;25158:34;25154:1;25146:6;25142:14;25135:58;25227:26;25222:2;25214:6;25210:15;25203:51;25018:243;:::o;25267:366::-;25409:3;25430:67;25494:2;25489:3;25430:67;:::i;:::-;25423:74;;25506:93;25595:3;25506:93;:::i;:::-;25624:2;25619:3;25615:12;25608:19;;25267:366;;;:::o;25639:419::-;25805:4;25843:2;25832:9;25828:18;25820:26;;25892:9;25886:4;25882:20;25878:1;25867:9;25863:17;25856:47;25920:131;26046:4;25920:131;:::i;:::-;25912:139;;25639:419;;;:::o;26064:182::-;26204:34;26200:1;26192:6;26188:14;26181:58;26064:182;:::o;26252:366::-;26394:3;26415:67;26479:2;26474:3;26415:67;:::i;:::-;26408:74;;26491:93;26580:3;26491:93;:::i;:::-;26609:2;26604:3;26600:12;26593:19;;26252:366;;;:::o;26624:419::-;26790:4;26828:2;26817:9;26813:18;26805:26;;26877:9;26871:4;26867:20;26863:1;26852:9;26848:17;26841:47;26905:131;27031:4;26905:131;:::i;:::-;26897:139;;26624:419;;;:::o;27049:236::-;27189:34;27185:1;27177:6;27173:14;27166:58;27258:19;27253:2;27245:6;27241:15;27234:44;27049:236;:::o;27291:366::-;27433:3;27454:67;27518:2;27513:3;27454:67;:::i;:::-;27447:74;;27530:93;27619:3;27530:93;:::i;:::-;27648:2;27643:3;27639:12;27632:19;;27291:366;;;:::o;27663:419::-;27829:4;27867:2;27856:9;27852:18;27844:26;;27916:9;27910:4;27906:20;27902:1;27891:9;27887:17;27880:47;27944:131;28070:4;27944:131;:::i;:::-;27936:139;;27663:419;;;:::o;28088:172::-;28228:24;28224:1;28216:6;28212:14;28205:48;28088:172;:::o;28266:366::-;28408:3;28429:67;28493:2;28488:3;28429:67;:::i;:::-;28422:74;;28505:93;28594:3;28505:93;:::i;:::-;28623:2;28618:3;28614:12;28607:19;;28266:366;;;:::o;28638:419::-;28804:4;28842:2;28831:9;28827:18;28819:26;;28891:9;28885:4;28881:20;28877:1;28866:9;28862:17;28855:47;28919:131;29045:4;28919:131;:::i;:::-;28911:139;;28638:419;;;:::o;29063:180::-;29111:77;29108:1;29101:88;29208:4;29205:1;29198:15;29232:4;29229:1;29222:15;29249:147;29350:11;29387:3;29372:18;;29249:147;;;;:::o;29402:114::-;;:::o;29522:398::-;29681:3;29702:83;29783:1;29778:3;29702:83;:::i;:::-;29695:90;;29794:93;29883:3;29794:93;:::i;:::-;29912:1;29907:3;29903:11;29896:18;;29522:398;;;:::o;29926:379::-;30110:3;30132:147;30275:3;30132:147;:::i;:::-;30125:154;;30296:3;30289:10;;29926:379;;;:::o;30311:173::-;30451:25;30447:1;30439:6;30435:14;30428:49;30311:173;:::o;30490:366::-;30632:3;30653:67;30717:2;30712:3;30653:67;:::i;:::-;30646:74;;30729:93;30818:3;30729:93;:::i;:::-;30847:2;30842:3;30838:12;30831:19;;30490:366;;;:::o;30862:419::-;31028:4;31066:2;31055:9;31051:18;31043:26;;31115:9;31109:4;31105:20;31101:1;31090:9;31086:17;31079:47;31143:131;31269:4;31143:131;:::i;:::-;31135:139;;30862:419;;;:::o;31287:228::-;31427:34;31423:1;31415:6;31411:14;31404:58;31496:11;31491:2;31483:6;31479:15;31472:36;31287:228;:::o;31521:366::-;31663:3;31684:67;31748:2;31743:3;31684:67;:::i;:::-;31677:74;;31760:93;31849:3;31760:93;:::i;:::-;31878:2;31873:3;31869:12;31862:19;;31521:366;;;:::o;31893:419::-;32059:4;32097:2;32086:9;32082:18;32074:26;;32146:9;32140:4;32136:20;32132:1;32121:9;32117:17;32110:47;32174:131;32300:4;32174:131;:::i;:::-;32166:139;;31893:419;;;:::o;32318:229::-;32458:34;32454:1;32446:6;32442:14;32435:58;32527:12;32522:2;32514:6;32510:15;32503:37;32318:229;:::o;32553:366::-;32695:3;32716:67;32780:2;32775:3;32716:67;:::i;:::-;32709:74;;32792:93;32881:3;32792:93;:::i;:::-;32910:2;32905:3;32901:12;32894:19;;32553:366;;;:::o;32925:419::-;33091:4;33129:2;33118:9;33114:18;33106:26;;33178:9;33172:4;33168:20;33164:1;33153:9;33149:17;33142:47;33206:131;33332:4;33206:131;:::i;:::-;33198:139;;32925:419;;;:::o;33350:220::-;33490:34;33486:1;33478:6;33474:14;33467:58;33559:3;33554:2;33546:6;33542:15;33535:28;33350:220;:::o;33576:366::-;33718:3;33739:67;33803:2;33798:3;33739:67;:::i;:::-;33732:74;;33815:93;33904:3;33815:93;:::i;:::-;33933:2;33928:3;33924:12;33917:19;;33576:366;;;:::o;33948:419::-;34114:4;34152:2;34141:9;34137:18;34129:26;;34201:9;34195:4;34191:20;34187:1;34176:9;34172:17;34165:47;34229:131;34355:4;34229:131;:::i;:::-;34221:139;;33948:419;;;:::o;34373:158::-;34513:10;34509:1;34501:6;34497:14;34490:34;34373:158;:::o;34537:365::-;34679:3;34700:66;34764:1;34759:3;34700:66;:::i;:::-;34693:73;;34775:93;34864:3;34775:93;:::i;:::-;34893:2;34888:3;34884:12;34877:19;;34537:365;;;:::o;34908:419::-;35074:4;35112:2;35101:9;35097:18;35089:26;;35161:9;35155:4;35151:20;35147:1;35136:9;35132:17;35125:47;35189:131;35315:4;35189:131;:::i;:::-;35181:139;;34908:419;;;:::o;35333:177::-;35473:29;35469:1;35461:6;35457:14;35450:53;35333:177;:::o;35516:366::-;35658:3;35679:67;35743:2;35738:3;35679:67;:::i;:::-;35672:74;;35755:93;35844:3;35755:93;:::i;:::-;35873:2;35868:3;35864:12;35857:19;;35516:366;;;:::o;35888:419::-;36054:4;36092:2;36081:9;36077:18;36069:26;;36141:9;36135:4;36131:20;36127:1;36116:9;36112:17;36105:47;36169:131;36295:4;36169:131;:::i;:::-;36161:139;;35888:419;;;:::o;36313:348::-;36353:7;36376:20;36394:1;36376:20;:::i;:::-;36371:25;;36410:20;36428:1;36410:20;:::i;:::-;36405:25;;36598:1;36530:66;36526:74;36523:1;36520:81;36515:1;36508:9;36501:17;36497:105;36494:131;;;36605:18;;:::i;:::-;36494:131;36653:1;36650;36646:9;36635:20;;36313:348;;;;:::o;36667:175::-;36807:27;36803:1;36795:6;36791:14;36784:51;36667:175;:::o;36848:366::-;36990:3;37011:67;37075:2;37070:3;37011:67;:::i;:::-;37004:74;;37087:93;37176:3;37087:93;:::i;:::-;37205:2;37200:3;37196:12;37189:19;;36848:366;;;:::o;37220:419::-;37386:4;37424:2;37413:9;37409:18;37401:26;;37473:9;37467:4;37463:20;37459:1;37448:9;37444:17;37437:47;37501:131;37627:4;37501:131;:::i;:::-;37493:139;;37220:419;;;:::o;37645:220::-;37785:34;37781:1;37773:6;37769:14;37762:58;37854:3;37849:2;37841:6;37837:15;37830:28;37645:220;:::o;37871:366::-;38013:3;38034:67;38098:2;38093:3;38034:67;:::i;:::-;38027:74;;38110:93;38199:3;38110:93;:::i;:::-;38228:2;38223:3;38219:12;38212:19;;37871:366;;;:::o;38243:419::-;38409:4;38447:2;38436:9;38432:18;38424:26;;38496:9;38490:4;38486:20;38482:1;38471:9;38467:17;38460:47;38524:131;38650:4;38524:131;:::i;:::-;38516:139;;38243:419;;;:::o;38668:148::-;38770:11;38807:3;38792:18;;38668:148;;;;:::o;38822:377::-;38928:3;38956:39;38989:5;38956:39;:::i;:::-;39011:89;39093:6;39088:3;39011:89;:::i;:::-;39004:96;;39109:52;39154:6;39149:3;39142:4;39135:5;39131:16;39109:52;:::i;:::-;39186:6;39181:3;39177:16;39170:23;;38932:267;38822:377;;;;:::o;39205:435::-;39385:3;39407:95;39498:3;39489:6;39407:95;:::i;:::-;39400:102;;39519:95;39610:3;39601:6;39519:95;:::i;:::-;39512:102;;39631:3;39624:10;;39205:435;;;;;:::o;39646:225::-;39786:34;39782:1;39774:6;39770:14;39763:58;39855:8;39850:2;39842:6;39838:15;39831:33;39646:225;:::o;39877:366::-;40019:3;40040:67;40104:2;40099:3;40040:67;:::i;:::-;40033:74;;40116:93;40205:3;40116:93;:::i;:::-;40234:2;40229:3;40225:12;40218:19;;39877:366;;;:::o;40249:419::-;40415:4;40453:2;40442:9;40438:18;40430:26;;40502:9;40496:4;40492:20;40488:1;40477:9;40473:17;40466:47;40530:131;40656:4;40530:131;:::i;:::-;40522:139;;40249:419;;;:::o;40674:237::-;40814:34;40810:1;40802:6;40798:14;40791:58;40883:20;40878:2;40870:6;40866:15;40859:45;40674:237;:::o;40917:366::-;41059:3;41080:67;41144:2;41139:3;41080:67;:::i;:::-;41073:74;;41156:93;41245:3;41156:93;:::i;:::-;41274:2;41269:3;41265:12;41258:19;;40917:366;;;:::o;41289:419::-;41455:4;41493:2;41482:9;41478:18;41470:26;;41542:9;41536:4;41532:20;41528:1;41517:9;41513:17;41506:47;41570:131;41696:4;41570:131;:::i;:::-;41562:139;;41289:419;;;:::o;41714:231::-;41854:34;41850:1;41842:6;41838:14;41831:58;41923:14;41918:2;41910:6;41906:15;41899:39;41714:231;:::o;41951:366::-;42093:3;42114:67;42178:2;42173:3;42114:67;:::i;:::-;42107:74;;42190:93;42279:3;42190:93;:::i;:::-;42308:2;42303:3;42299:12;42292:19;;41951:366;;;:::o;42323:419::-;42489:4;42527:2;42516:9;42512:18;42504:26;;42576:9;42570:4;42566:20;42562:1;42551:9;42547:17;42540:47;42604:131;42730:4;42604:131;:::i;:::-;42596:139;;42323:419;;;:::o;42748:228::-;42888:34;42884:1;42876:6;42872:14;42865:58;42957:11;42952:2;42944:6;42940:15;42933:36;42748:228;:::o;42982:366::-;43124:3;43145:67;43209:2;43204:3;43145:67;:::i;:::-;43138:74;;43221:93;43310:3;43221:93;:::i;:::-;43339:2;43334:3;43330:12;43323:19;;42982:366;;;:::o;43354:419::-;43520:4;43558:2;43547:9;43543:18;43535:26;;43607:9;43601:4;43597:20;43593:1;43582:9;43578:17;43571:47;43635:131;43761:4;43635:131;:::i;:::-;43627:139;;43354:419;;;:::o;43779:223::-;43919:34;43915:1;43907:6;43903:14;43896:58;43988:6;43983:2;43975:6;43971:15;43964:31;43779:223;:::o;44008:366::-;44150:3;44171:67;44235:2;44230:3;44171:67;:::i;:::-;44164:74;;44247:93;44336:3;44247:93;:::i;:::-;44365:2;44360:3;44356:12;44349:19;;44008:366;;;:::o;44380:419::-;44546:4;44584:2;44573:9;44569:18;44561:26;;44633:9;44627:4;44623:20;44619:1;44608:9;44604:17;44597:47;44661:131;44787:4;44661:131;:::i;:::-;44653:139;;44380:419;;;:::o;44805:180::-;44853:77;44850:1;44843:88;44950:4;44947:1;44940:15;44974:4;44971:1;44964:15;44991:185;45031:1;45048:20;45066:1;45048:20;:::i;:::-;45043:25;;45082:20;45100:1;45082:20;:::i;:::-;45077:25;;45121:1;45111:35;;45126:18;;:::i;:::-;45111:35;45168:1;45165;45161:9;45156:14;;44991:185;;;;:::o;45182:191::-;45222:4;45242:20;45260:1;45242:20;:::i;:::-;45237:25;;45276:20;45294:1;45276:20;:::i;:::-;45271:25;;45315:1;45312;45309:8;45306:34;;;45320:18;;:::i;:::-;45306:34;45365:1;45362;45358:9;45350:17;;45182:191;;;;:::o;45379:176::-;45411:1;45428:20;45446:1;45428:20;:::i;:::-;45423:25;;45462:20;45480:1;45462:20;:::i;:::-;45457:25;;45501:1;45491:35;;45506:18;;:::i;:::-;45491:35;45547:1;45544;45540:9;45535:14;;45379:176;;;;:::o;45561:182::-;45701:34;45697:1;45689:6;45685:14;45678:58;45561:182;:::o;45749:366::-;45891:3;45912:67;45976:2;45971:3;45912:67;:::i;:::-;45905:74;;45988:93;46077:3;45988:93;:::i;:::-;46106:2;46101:3;46097:12;46090:19;;45749:366;;;:::o;46121:419::-;46287:4;46325:2;46314:9;46310:18;46302:26;;46374:9;46368:4;46364:20;46360:1;46349:9;46345:17;46338:47;46402:131;46528:4;46402:131;:::i;:::-;46394:139;;46121:419;;;:::o;46546:178::-;46686:30;46682:1;46674:6;46670:14;46663:54;46546:178;:::o;46730:366::-;46872:3;46893:67;46957:2;46952:3;46893:67;:::i;:::-;46886:74;;46969:93;47058:3;46969:93;:::i;:::-;47087:2;47082:3;47078:12;47071:19;;46730:366;;;:::o;47102:419::-;47268:4;47306:2;47295:9;47291:18;47283:26;;47355:9;47349:4;47345:20;47341:1;47330:9;47326:17;47319:47;47383:131;47509:4;47383:131;:::i;:::-;47375:139;;47102:419;;;:::o;47527:98::-;47578:6;47612:5;47606:12;47596:22;;47527:98;;;:::o;47631:168::-;47714:11;47748:6;47743:3;47736:19;47788:4;47783:3;47779:14;47764:29;;47631:168;;;;:::o;47805:360::-;47891:3;47919:38;47951:5;47919:38;:::i;:::-;47973:70;48036:6;48031:3;47973:70;:::i;:::-;47966:77;;48052:52;48097:6;48092:3;48085:4;48078:5;48074:16;48052:52;:::i;:::-;48129:29;48151:6;48129:29;:::i;:::-;48124:3;48120:39;48113:46;;47895:270;47805:360;;;;:::o;48171:640::-;48366:4;48404:3;48393:9;48389:19;48381:27;;48418:71;48486:1;48475:9;48471:17;48462:6;48418:71;:::i;:::-;48499:72;48567:2;48556:9;48552:18;48543:6;48499:72;:::i;:::-;48581;48649:2;48638:9;48634:18;48625:6;48581:72;:::i;:::-;48700:9;48694:4;48690:20;48685:2;48674:9;48670:18;48663:48;48728:76;48799:4;48790:6;48728:76;:::i;:::-;48720:84;;48171:640;;;;;;;:::o;48817:141::-;48873:5;48904:6;48898:13;48889:22;;48920:32;48946:5;48920:32;:::i;:::-;48817:141;;;;:::o;48964:349::-;49033:6;49082:2;49070:9;49061:7;49057:23;49053:32;49050:119;;;49088:79;;:::i;:::-;49050:119;49208:1;49233:63;49288:7;49279:6;49268:9;49264:22;49233:63;:::i;:::-;49223:73;;49179:127;48964:349;;;;:::o
Swarm Source
ipfs://654f45ef81e30119096af9f97e095db9a5fdb4890b868ed980eda5aa48770923
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.