ERC-721
Overview
Max Total Supply
100 DACNFT
Holders
56
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 DACNFTLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
DegenApeClub
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-12-01 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: node_modules\openzeppelin-solidity\contracts\token\ERC721\IERC721.sol pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer( address indexed from, address indexed to, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval( address indexed owner, address indexed approved, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll( address indexed owner, address indexed operator, bool approved ); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: node_modules\openzeppelin-solidity\contracts\token\ERC721\IERC721Receiver.sol pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: node_modules\openzeppelin-solidity\contracts\token\ERC721\extensions\IERC721Metadata.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: node_modules\openzeppelin-solidity\contracts\utils\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; // solhint-disable-next-line no-inline-assembly 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" ); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: node_modules\openzeppelin-solidity\contracts\utils\Context.sol pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: node_modules\openzeppelin-solidity\contracts\utils\Strings.sol pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = "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] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: node_modules\openzeppelin-solidity\contracts\utils\introspection\ERC165.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: node_modules\openzeppelin-solidity\contracts\token\ERC721\ERC721.sol pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require( owner != address(0), "ERC721: balance query for the zero address" ); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require( owner != address(0), "ERC721: owner query for nonexistent token" ); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden * in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require( _exists(tokenId), "ERC721: approved query for nonexistent token" ); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved" ); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved" ); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require( _exists(tokenId), "ERC721: operator query for nonexistent token" ); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require( ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own" ); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received( _msgSender(), from, tokenId, _data ) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert( "ERC721: transfer to non ERC721Receiver implementer" ); } else { // solhint-disable-next-line no-inline-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: node_modules\openzeppelin-solidity\contracts\token\ERC721\extensions\IERC721Enumerable.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: openzeppelin-solidity\contracts\token\ERC721\extensions\ERC721Enumerable.sol pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require( index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds" ); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require( index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds" ); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: contracts\lib\Counters.sol pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); { counter._value = value - 1; } } } // File: openzeppelin-solidity\contracts\access\Ownable.sol pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; address private _creator; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { address msgSender = _msgSender(); _owner = msgSender; _creator = msgSender; emit OwnershipTransferred(address(0), 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() || _creator == _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 { emit OwnershipTransferred(_owner, address(0)); _owner = 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" ); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } pragma solidity ^0.8.0; contract DegenApeClub is ERC721Enumerable, Ownable { using Counters for Counters.Counter; using Strings for uint256; address private _PaymentAddress = 0x7cff799c39f53c3d1f0064dfB14B7bE05B4d2092; IERC20 public constant PAYMENT_TOKEN = IERC20(0xF85F1872D4F6002e721a835d3c3aEEC194db2089); // DAC Token : Decimal : 9 uint256 public PRICE = 1_000_000_000; // 1 DAC uint256 public DACNFT_MAX = 100; uint256 public PURCHASE_LIMIT = 5; bool private _isActive = true; string private _tokenBaseURI = ""; Counters.Counter private _publicDACNFT; constructor() ERC721("Degen Ape Club NFT", "DACNFT") {} function setPaymentAddress(address paymentAddress) external onlyOwner { _PaymentAddress = paymentAddress; } function setActive(bool isActive) external onlyOwner { _isActive = isActive; } function setBaseURI(string memory baseURI) external onlyOwner { _tokenBaseURI = baseURI; } function setPurchaseLimit(uint256 purchaseLimit) external onlyOwner { PURCHASE_LIMIT = purchaseLimit; } function setMintPrice(uint256 mintPrice) external onlyOwner { PRICE = mintPrice; } function gift(address to, uint256 numberOfTokens) external onlyOwner { for (uint256 i = 0; i < numberOfTokens; i++) { uint256 tokenId = _publicDACNFT.current(); if (_publicDACNFT.current() < DACNFT_MAX) { _publicDACNFT.increment(); _safeMint(to, tokenId); } } } function purchase(uint256 numberOfTokens) external { require(_isActive, "Contract is not active"); require( numberOfTokens <= PURCHASE_LIMIT, "Can only mint up to purchase limit"); require(_publicDACNFT.current() < DACNFT_MAX,"Purchase would exceed DACNFT_MAX"); PAYMENT_TOKEN.transferFrom(msg.sender, _PaymentAddress, PRICE * numberOfTokens); for (uint256 i = 0; i < numberOfTokens; i++) { uint256 tokenId = _publicDACNFT.current(); if (_publicDACNFT.current() < DACNFT_MAX) { _publicDACNFT.increment(); _safeMint(msg.sender, tokenId); } } } function tokenURI(uint256 tokenId) public view override(ERC721) returns (string memory) { require(_exists(tokenId), "Token does not exist"); return string(abi.encodePacked(_tokenBaseURI, tokenId.toString())); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DACNFT_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAYMENT_TOKEN","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PURCHASE_LIMIT","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"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":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"purchase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isActive","type":"bool"}],"name":"setActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"paymentAddress","type":"address"}],"name":"setPaymentAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"purchaseLimit","type":"uint256"}],"name":"setPurchaseLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052737cff799c39f53c3d1f0064dfb14b7be05b4d2092600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550633b9aca00600d556064600e556005600f556001601060006101000a81548160ff0219169083151502179055506040518060200160405280600081525060119080519060200190620000ad9291906200025c565b50348015620000bb57600080fd5b506040518060400160405280601281526020017f446567656e2041706520436c7562204e465400000000000000000000000000008152506040518060400160405280600681526020017f4441434e465400000000000000000000000000000000000000000000000000008152508160009080519060200190620001409291906200025c565b508060019080519060200190620001599291906200025c565b50505060006200016e6200025460201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35062000371565b600033905090565b8280546200026a906200030c565b90600052602060002090601f0160209004810192826200028e5760008555620002da565b82601f10620002a957805160ff1916838001178555620002da565b82800160010185558215620002da579182015b82811115620002d9578251825591602001919060010190620002bc565b5b509050620002e99190620002ed565b5090565b5b8082111562000308576000816000905550600101620002ee565b5090565b600060028204905060018216806200032557607f821691505b602082108114156200033c576200033b62000342565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6142bf80620003816000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c8063877c86fb11610104578063b88d4fde116100a2578063e985e9c511610071578063e985e9c514610541578063efef39a114610571578063f2fde38b1461058d578063f4a0a528146105a9576101da565b8063b88d4fde146104bb578063c87b56dd146104d7578063cbce4c9714610507578063d75e611014610523576101da565b806395d89b41116100de57806395d89b4114610447578063a22cb46514610465578063acec338a14610481578063b30ddd901461049d576101da565b8063877c86fb146103ed5780638d859f3e1461040b5780638da5cb5b14610429576101da565b806342842e0e1161017c5780636352211e1161014b5780636352211e146103675780636edc43881461039757806370a08231146103b3578063715018a6146103e3576101da565b806342842e0e146102e35780634f6ccce7146102ff57806355f804b31461032f5780635e1e10041461034b576101da565b8063095ea7b3116101b8578063095ea7b31461025d57806318160ddd1461027957806323b872dd146102975780632f745c59146102b3576101da565b806301ffc9a7146101df57806306fdde031461020f578063081812fc1461022d575b600080fd5b6101f960048036038101906101f49190612ede565b6105c5565b60405161020691906134ad565b60405180910390f35b61021761063f565b60405161022491906134e3565b60405180910390f35b61024760048036038101906102429190612f81565b6106d1565b604051610254919061340f565b60405180910390f35b61027760048036038101906102729190612e44565b610756565b005b61028161086e565b60405161028e91906137a5565b60405180910390f35b6102b160048036038101906102ac9190612d2e565b61087b565b005b6102cd60048036038101906102c89190612e44565b6108db565b6040516102da91906137a5565b60405180910390f35b6102fd60048036038101906102f89190612d2e565b610980565b005b61031960048036038101906103149190612f81565b6109a0565b60405161032691906137a5565b60405180910390f35b61034960048036038101906103449190612f38565b610a11565b005b61036560048036038101906103609190612cc1565b610b06565b005b610381600480360381019061037c9190612f81565b610c25565b60405161038e919061340f565b60405180910390f35b6103b160048036038101906103ac9190612f81565b610cd7565b005b6103cd60048036038101906103c89190612cc1565b610dbc565b6040516103da91906137a5565b60405180910390f35b6103eb610e74565b005b6103f5611010565b60405161040291906134c8565b60405180910390f35b610413611028565b60405161042091906137a5565b60405180910390f35b61043161102e565b60405161043e919061340f565b60405180910390f35b61044f611058565b60405161045c91906134e3565b60405180910390f35b61047f600480360381019061047a9190612e04565b6110ea565b005b61049b60048036038101906104969190612e84565b61126b565b005b6104a5611363565b6040516104b291906137a5565b60405180910390f35b6104d560048036038101906104d09190612d81565b611369565b005b6104f160048036038101906104ec9190612f81565b6113cb565b6040516104fe91906134e3565b60405180910390f35b610521600480360381019061051c9190612e44565b611447565b005b61052b61157c565b60405161053891906137a5565b60405180910390f35b61055b60048036038101906105569190612cee565b611582565b60405161056891906134ad565b60405180910390f35b61058b60048036038101906105869190612f81565b611616565b005b6105a760048036038101906105a29190612cc1565b611823565b005b6105c360048036038101906105be9190612f81565b611a2e565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610638575061063782611b13565b5b9050919050565b60606000805461064e90613aa0565b80601f016020809104026020016040519081016040528092919081815260200182805461067a90613aa0565b80156106c75780601f1061069c576101008083540402835291602001916106c7565b820191906000526020600020905b8154815290600101906020018083116106aa57829003601f168201915b5050505050905090565b60006106dc82611bf5565b61071b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610712906136a5565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061076182610c25565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c990613725565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107f1611c61565b73ffffffffffffffffffffffffffffffffffffffff161480610820575061081f8161081a611c61565b611582565b5b61085f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085690613605565b60405180910390fd5b6108698383611c69565b505050565b6000600880549050905090565b61088c610886611c61565b82611d22565b6108cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c290613745565b60405180910390fd5b6108d6838383611e00565b505050565b60006108e683610dbc565b8210610927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091e90613505565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61099b83838360405180602001604052806000815250611369565b505050565b60006109aa61086e565b82106109eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e290613765565b60405180910390fd5b600882815481106109ff576109fe613c39565b5b90600052602060002001549050919050565b610a19611c61565b73ffffffffffffffffffffffffffffffffffffffff16610a3761102e565b73ffffffffffffffffffffffffffffffffffffffff161480610aad5750610a5c611c61565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b610aec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae3906136c5565b60405180910390fd5b8060119080519060200190610b02929190612ac0565b5050565b610b0e611c61565b73ffffffffffffffffffffffffffffffffffffffff16610b2c61102e565b73ffffffffffffffffffffffffffffffffffffffff161480610ba25750610b51611c61565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b610be1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd8906136c5565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610cce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc590613645565b60405180910390fd5b80915050919050565b610cdf611c61565b73ffffffffffffffffffffffffffffffffffffffff16610cfd61102e565b73ffffffffffffffffffffffffffffffffffffffff161480610d735750610d22611c61565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b610db2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da9906136c5565b60405180910390fd5b80600f8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2490613625565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e7c611c61565b73ffffffffffffffffffffffffffffffffffffffff16610e9a61102e565b73ffffffffffffffffffffffffffffffffffffffff161480610f105750610ebf611c61565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b610f4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f46906136c5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b73f85f1872d4f6002e721a835d3c3aeec194db208981565b600d5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461106790613aa0565b80601f016020809104026020016040519081016040528092919081815260200182805461109390613aa0565b80156110e05780601f106110b5576101008083540402835291602001916110e0565b820191906000526020600020905b8154815290600101906020018083116110c357829003601f168201915b5050505050905090565b6110f2611c61565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611160576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611157906135a5565b60405180910390fd5b806005600061116d611c61565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661121a611c61565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161125f91906134ad565b60405180910390a35050565b611273611c61565b73ffffffffffffffffffffffffffffffffffffffff1661129161102e565b73ffffffffffffffffffffffffffffffffffffffff16148061130757506112b6611c61565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b611346576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133d906136c5565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b600e5481565b61137a611374611c61565b83611d22565b6113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b090613745565b60405180910390fd5b6113c58484848461205c565b50505050565b60606113d682611bf5565b611415576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140c906135c5565b60405180910390fd5b6011611420836120b8565b6040516020016114319291906133eb565b6040516020818303038152906040529050919050565b61144f611c61565b73ffffffffffffffffffffffffffffffffffffffff1661146d61102e565b73ffffffffffffffffffffffffffffffffffffffff1614806114e35750611492611c61565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b611522576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611519906136c5565b60405180910390fd5b60005b818110156115775760006115396012612219565b9050600e546115486012612219565b1015611563576115586012612227565b6115628482612246565b5b50808061156f90613b03565b915050611525565b505050565b600f5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601060009054906101000a900460ff16611665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165c90613685565b60405180910390fd5b600f548111156116aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a190613705565b60405180910390fd5b600e546116b76012612219565b106116f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ee90613785565b60405180910390fd5b73f85f1872d4f6002e721a835d3c3aeec194db208973ffffffffffffffffffffffffffffffffffffffff166323b872dd33600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684600d546117599190613926565b6040518463ffffffff1660e01b81526004016117779392919061342a565b602060405180830381600087803b15801561179157600080fd5b505af11580156117a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c99190612eb1565b5060005b8181101561181f5760006117e16012612219565b9050600e546117f06012612219565b101561180b576118006012612227565b61180a3382612246565b5b50808061181790613b03565b9150506117cd565b5050565b61182b611c61565b73ffffffffffffffffffffffffffffffffffffffff1661184961102e565b73ffffffffffffffffffffffffffffffffffffffff1614806118bf575061186e611c61565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b6118fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f5906136c5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561196e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196590613545565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611a36611c61565b73ffffffffffffffffffffffffffffffffffffffff16611a5461102e565b73ffffffffffffffffffffffffffffffffffffffff161480611aca5750611a79611c61565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b611b09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b00906136c5565b60405180910390fd5b80600d8190555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611bde57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611bee5750611bed82612264565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611cdc83610c25565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611d2d82611bf5565b611d6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d63906135e5565b60405180910390fd5b6000611d7783610c25565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611de657508373ffffffffffffffffffffffffffffffffffffffff16611dce846106d1565b73ffffffffffffffffffffffffffffffffffffffff16145b80611df75750611df68185611582565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611e2082610c25565b73ffffffffffffffffffffffffffffffffffffffff1614611e76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6d906136e5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ee6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edd90613585565b60405180910390fd5b611ef18383836122ce565b611efc600082611c69565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f4c9190613980565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fa3919061389f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612067848484611e00565b612073848484846123e2565b6120b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a990613525565b60405180910390fd5b50505050565b60606000821415612100576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612214565b600082905060005b6000821461213257808061211b90613b03565b915050600a8261212b91906138f5565b9150612108565b60008167ffffffffffffffff81111561214e5761214d613c68565b5b6040519080825280601f01601f1916602001820160405280156121805781602001600182028036833780820191505090505b5090505b6000851461220d576001826121999190613980565b9150600a856121a89190613b4c565b60306121b4919061389f565b60f81b8183815181106121ca576121c9613c39565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561220691906138f5565b9450612184565b8093505050505b919050565b600081600001549050919050565b600181600001600082825461223c919061389f565b9250508190555050565b612260828260405180602001604052806000815250612579565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6122d98383836125d4565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561231c57612317816125d9565b61235b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461235a576123598382612622565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561239e576123998161278f565b6123dd565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146123dc576123db8282612860565b5b5b505050565b60006124038473ffffffffffffffffffffffffffffffffffffffff166128df565b1561256c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261242c611c61565b8786866040518563ffffffff1660e01b815260040161244e9493929190613461565b602060405180830381600087803b15801561246857600080fd5b505af192505050801561249957506040513d601f19601f820116820180604052508101906124969190612f0b565b60015b61251c573d80600081146124c9576040519150601f19603f3d011682016040523d82523d6000602084013e6124ce565b606091505b50600081511415612514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250b90613525565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612571565b600190505b949350505050565b61258383836128f2565b61259060008484846123e2565b6125cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c690613525565b60405180910390fd5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161262f84610dbc565b6126399190613980565b905060006007600084815260200190815260200160002054905081811461271e576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506127a39190613980565b90506000600960008481526020019081526020016000205490506000600883815481106127d3576127d2613c39565b5b9060005260206000200154905080600883815481106127f5576127f4613c39565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061284457612843613c0a565b5b6001900381819060005260206000200160009055905550505050565b600061286b83610dbc565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612962576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295990613665565b60405180910390fd5b61296b81611bf5565b156129ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a290613565565b60405180910390fd5b6129b7600083836122ce565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a07919061389f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612acc90613aa0565b90600052602060002090601f016020900481019282612aee5760008555612b35565b82601f10612b0757805160ff1916838001178555612b35565b82800160010185558215612b35579182015b82811115612b34578251825591602001919060010190612b19565b5b509050612b429190612b46565b5090565b5b80821115612b5f576000816000905550600101612b47565b5090565b6000612b76612b71846137e5565b6137c0565b905082815260208101848484011115612b9257612b91613c9c565b5b612b9d848285613a5e565b509392505050565b6000612bb8612bb384613816565b6137c0565b905082815260208101848484011115612bd457612bd3613c9c565b5b612bdf848285613a5e565b509392505050565b600081359050612bf68161422d565b92915050565b600081359050612c0b81614244565b92915050565b600081519050612c2081614244565b92915050565b600081359050612c358161425b565b92915050565b600081519050612c4a8161425b565b92915050565b600082601f830112612c6557612c64613c97565b5b8135612c75848260208601612b63565b91505092915050565b600082601f830112612c9357612c92613c97565b5b8135612ca3848260208601612ba5565b91505092915050565b600081359050612cbb81614272565b92915050565b600060208284031215612cd757612cd6613ca6565b5b6000612ce584828501612be7565b91505092915050565b60008060408385031215612d0557612d04613ca6565b5b6000612d1385828601612be7565b9250506020612d2485828601612be7565b9150509250929050565b600080600060608486031215612d4757612d46613ca6565b5b6000612d5586828701612be7565b9350506020612d6686828701612be7565b9250506040612d7786828701612cac565b9150509250925092565b60008060008060808587031215612d9b57612d9a613ca6565b5b6000612da987828801612be7565b9450506020612dba87828801612be7565b9350506040612dcb87828801612cac565b925050606085013567ffffffffffffffff811115612dec57612deb613ca1565b5b612df887828801612c50565b91505092959194509250565b60008060408385031215612e1b57612e1a613ca6565b5b6000612e2985828601612be7565b9250506020612e3a85828601612bfc565b9150509250929050565b60008060408385031215612e5b57612e5a613ca6565b5b6000612e6985828601612be7565b9250506020612e7a85828601612cac565b9150509250929050565b600060208284031215612e9a57612e99613ca6565b5b6000612ea884828501612bfc565b91505092915050565b600060208284031215612ec757612ec6613ca6565b5b6000612ed584828501612c11565b91505092915050565b600060208284031215612ef457612ef3613ca6565b5b6000612f0284828501612c26565b91505092915050565b600060208284031215612f2157612f20613ca6565b5b6000612f2f84828501612c3b565b91505092915050565b600060208284031215612f4e57612f4d613ca6565b5b600082013567ffffffffffffffff811115612f6c57612f6b613ca1565b5b612f7884828501612c7e565b91505092915050565b600060208284031215612f9757612f96613ca6565b5b6000612fa584828501612cac565b91505092915050565b612fb7816139b4565b82525050565b612fc6816139c6565b82525050565b6000612fd78261385c565b612fe18185613872565b9350612ff1818560208601613a6d565b612ffa81613cab565b840191505092915050565b61300e81613a28565b82525050565b600061301f82613867565b6130298185613883565b9350613039818560208601613a6d565b61304281613cab565b840191505092915050565b600061305882613867565b6130628185613894565b9350613072818560208601613a6d565b80840191505092915050565b6000815461308b81613aa0565b6130958186613894565b945060018216600081146130b057600181146130c1576130f4565b60ff198316865281860193506130f4565b6130ca85613847565b60005b838110156130ec578154818901526001820191506020810190506130cd565b838801955050505b50505092915050565b600061310a602b83613883565b915061311582613cbc565b604082019050919050565b600061312d603283613883565b915061313882613d0b565b604082019050919050565b6000613150602683613883565b915061315b82613d5a565b604082019050919050565b6000613173601c83613883565b915061317e82613da9565b602082019050919050565b6000613196602483613883565b91506131a182613dd2565b604082019050919050565b60006131b9601983613883565b91506131c482613e21565b602082019050919050565b60006131dc601483613883565b91506131e782613e4a565b602082019050919050565b60006131ff602c83613883565b915061320a82613e73565b604082019050919050565b6000613222603883613883565b915061322d82613ec2565b604082019050919050565b6000613245602a83613883565b915061325082613f11565b604082019050919050565b6000613268602983613883565b915061327382613f60565b604082019050919050565b600061328b602083613883565b915061329682613faf565b602082019050919050565b60006132ae601683613883565b91506132b982613fd8565b602082019050919050565b60006132d1602c83613883565b91506132dc82614001565b604082019050919050565b60006132f4602083613883565b91506132ff82614050565b602082019050919050565b6000613317602983613883565b915061332282614079565b604082019050919050565b600061333a602283613883565b9150613345826140c8565b604082019050919050565b600061335d602183613883565b915061336882614117565b604082019050919050565b6000613380603183613883565b915061338b82614166565b604082019050919050565b60006133a3602c83613883565b91506133ae826141b5565b604082019050919050565b60006133c6602083613883565b91506133d182614204565b602082019050919050565b6133e581613a1e565b82525050565b60006133f7828561307e565b9150613403828461304d565b91508190509392505050565b60006020820190506134246000830184612fae565b92915050565b600060608201905061343f6000830186612fae565b61344c6020830185612fae565b61345960408301846133dc565b949350505050565b60006080820190506134766000830187612fae565b6134836020830186612fae565b61349060408301856133dc565b81810360608301526134a28184612fcc565b905095945050505050565b60006020820190506134c26000830184612fbd565b92915050565b60006020820190506134dd6000830184613005565b92915050565b600060208201905081810360008301526134fd8184613014565b905092915050565b6000602082019050818103600083015261351e816130fd565b9050919050565b6000602082019050818103600083015261353e81613120565b9050919050565b6000602082019050818103600083015261355e81613143565b9050919050565b6000602082019050818103600083015261357e81613166565b9050919050565b6000602082019050818103600083015261359e81613189565b9050919050565b600060208201905081810360008301526135be816131ac565b9050919050565b600060208201905081810360008301526135de816131cf565b9050919050565b600060208201905081810360008301526135fe816131f2565b9050919050565b6000602082019050818103600083015261361e81613215565b9050919050565b6000602082019050818103600083015261363e81613238565b9050919050565b6000602082019050818103600083015261365e8161325b565b9050919050565b6000602082019050818103600083015261367e8161327e565b9050919050565b6000602082019050818103600083015261369e816132a1565b9050919050565b600060208201905081810360008301526136be816132c4565b9050919050565b600060208201905081810360008301526136de816132e7565b9050919050565b600060208201905081810360008301526136fe8161330a565b9050919050565b6000602082019050818103600083015261371e8161332d565b9050919050565b6000602082019050818103600083015261373e81613350565b9050919050565b6000602082019050818103600083015261375e81613373565b9050919050565b6000602082019050818103600083015261377e81613396565b9050919050565b6000602082019050818103600083015261379e816133b9565b9050919050565b60006020820190506137ba60008301846133dc565b92915050565b60006137ca6137db565b90506137d68282613ad2565b919050565b6000604051905090565b600067ffffffffffffffff821115613800576137ff613c68565b5b61380982613cab565b9050602081019050919050565b600067ffffffffffffffff82111561383157613830613c68565b5b61383a82613cab565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006138aa82613a1e565b91506138b583613a1e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156138ea576138e9613b7d565b5b828201905092915050565b600061390082613a1e565b915061390b83613a1e565b92508261391b5761391a613bac565b5b828204905092915050565b600061393182613a1e565b915061393c83613a1e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561397557613974613b7d565b5b828202905092915050565b600061398b82613a1e565b915061399683613a1e565b9250828210156139a9576139a8613b7d565b5b828203905092915050565b60006139bf826139fe565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000613a3382613a3a565b9050919050565b6000613a4582613a4c565b9050919050565b6000613a57826139fe565b9050919050565b82818337600083830152505050565b60005b83811015613a8b578082015181840152602081019050613a70565b83811115613a9a576000848401525b50505050565b60006002820490506001821680613ab857607f821691505b60208210811415613acc57613acb613bdb565b5b50919050565b613adb82613cab565b810181811067ffffffffffffffff82111715613afa57613af9613c68565b5b80604052505050565b6000613b0e82613a1e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b4157613b40613b7d565b5b600182019050919050565b6000613b5782613a1e565b9150613b6283613a1e565b925082613b7257613b71613bac565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f546f6b656e20646f6573206e6f74206578697374000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f436f6e7472616374206973206e6f742061637469766500000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f43616e206f6e6c79206d696e7420757020746f207075726368617365206c696d60008201527f6974000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564204441434e46545f4d4158600082015250565b614236816139b4565b811461424157600080fd5b50565b61424d816139c6565b811461425857600080fd5b50565b614264816139d2565b811461426f57600080fd5b50565b61427b81613a1e565b811461428657600080fd5b5056fea2646970667358221220a8146b56ea73f72a69c010b7fe1eca0520f8ae5e6ea80cbe6afdda2bfee7c34f64736f6c63430008070033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101da5760003560e01c8063877c86fb11610104578063b88d4fde116100a2578063e985e9c511610071578063e985e9c514610541578063efef39a114610571578063f2fde38b1461058d578063f4a0a528146105a9576101da565b8063b88d4fde146104bb578063c87b56dd146104d7578063cbce4c9714610507578063d75e611014610523576101da565b806395d89b41116100de57806395d89b4114610447578063a22cb46514610465578063acec338a14610481578063b30ddd901461049d576101da565b8063877c86fb146103ed5780638d859f3e1461040b5780638da5cb5b14610429576101da565b806342842e0e1161017c5780636352211e1161014b5780636352211e146103675780636edc43881461039757806370a08231146103b3578063715018a6146103e3576101da565b806342842e0e146102e35780634f6ccce7146102ff57806355f804b31461032f5780635e1e10041461034b576101da565b8063095ea7b3116101b8578063095ea7b31461025d57806318160ddd1461027957806323b872dd146102975780632f745c59146102b3576101da565b806301ffc9a7146101df57806306fdde031461020f578063081812fc1461022d575b600080fd5b6101f960048036038101906101f49190612ede565b6105c5565b60405161020691906134ad565b60405180910390f35b61021761063f565b60405161022491906134e3565b60405180910390f35b61024760048036038101906102429190612f81565b6106d1565b604051610254919061340f565b60405180910390f35b61027760048036038101906102729190612e44565b610756565b005b61028161086e565b60405161028e91906137a5565b60405180910390f35b6102b160048036038101906102ac9190612d2e565b61087b565b005b6102cd60048036038101906102c89190612e44565b6108db565b6040516102da91906137a5565b60405180910390f35b6102fd60048036038101906102f89190612d2e565b610980565b005b61031960048036038101906103149190612f81565b6109a0565b60405161032691906137a5565b60405180910390f35b61034960048036038101906103449190612f38565b610a11565b005b61036560048036038101906103609190612cc1565b610b06565b005b610381600480360381019061037c9190612f81565b610c25565b60405161038e919061340f565b60405180910390f35b6103b160048036038101906103ac9190612f81565b610cd7565b005b6103cd60048036038101906103c89190612cc1565b610dbc565b6040516103da91906137a5565b60405180910390f35b6103eb610e74565b005b6103f5611010565b60405161040291906134c8565b60405180910390f35b610413611028565b60405161042091906137a5565b60405180910390f35b61043161102e565b60405161043e919061340f565b60405180910390f35b61044f611058565b60405161045c91906134e3565b60405180910390f35b61047f600480360381019061047a9190612e04565b6110ea565b005b61049b60048036038101906104969190612e84565b61126b565b005b6104a5611363565b6040516104b291906137a5565b60405180910390f35b6104d560048036038101906104d09190612d81565b611369565b005b6104f160048036038101906104ec9190612f81565b6113cb565b6040516104fe91906134e3565b60405180910390f35b610521600480360381019061051c9190612e44565b611447565b005b61052b61157c565b60405161053891906137a5565b60405180910390f35b61055b60048036038101906105569190612cee565b611582565b60405161056891906134ad565b60405180910390f35b61058b60048036038101906105869190612f81565b611616565b005b6105a760048036038101906105a29190612cc1565b611823565b005b6105c360048036038101906105be9190612f81565b611a2e565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610638575061063782611b13565b5b9050919050565b60606000805461064e90613aa0565b80601f016020809104026020016040519081016040528092919081815260200182805461067a90613aa0565b80156106c75780601f1061069c576101008083540402835291602001916106c7565b820191906000526020600020905b8154815290600101906020018083116106aa57829003601f168201915b5050505050905090565b60006106dc82611bf5565b61071b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610712906136a5565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061076182610c25565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c990613725565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107f1611c61565b73ffffffffffffffffffffffffffffffffffffffff161480610820575061081f8161081a611c61565b611582565b5b61085f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085690613605565b60405180910390fd5b6108698383611c69565b505050565b6000600880549050905090565b61088c610886611c61565b82611d22565b6108cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c290613745565b60405180910390fd5b6108d6838383611e00565b505050565b60006108e683610dbc565b8210610927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091e90613505565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61099b83838360405180602001604052806000815250611369565b505050565b60006109aa61086e565b82106109eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e290613765565b60405180910390fd5b600882815481106109ff576109fe613c39565b5b90600052602060002001549050919050565b610a19611c61565b73ffffffffffffffffffffffffffffffffffffffff16610a3761102e565b73ffffffffffffffffffffffffffffffffffffffff161480610aad5750610a5c611c61565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b610aec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae3906136c5565b60405180910390fd5b8060119080519060200190610b02929190612ac0565b5050565b610b0e611c61565b73ffffffffffffffffffffffffffffffffffffffff16610b2c61102e565b73ffffffffffffffffffffffffffffffffffffffff161480610ba25750610b51611c61565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b610be1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd8906136c5565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610cce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc590613645565b60405180910390fd5b80915050919050565b610cdf611c61565b73ffffffffffffffffffffffffffffffffffffffff16610cfd61102e565b73ffffffffffffffffffffffffffffffffffffffff161480610d735750610d22611c61565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b610db2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da9906136c5565b60405180910390fd5b80600f8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2490613625565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e7c611c61565b73ffffffffffffffffffffffffffffffffffffffff16610e9a61102e565b73ffffffffffffffffffffffffffffffffffffffff161480610f105750610ebf611c61565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b610f4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f46906136c5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b73f85f1872d4f6002e721a835d3c3aeec194db208981565b600d5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461106790613aa0565b80601f016020809104026020016040519081016040528092919081815260200182805461109390613aa0565b80156110e05780601f106110b5576101008083540402835291602001916110e0565b820191906000526020600020905b8154815290600101906020018083116110c357829003601f168201915b5050505050905090565b6110f2611c61565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611160576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611157906135a5565b60405180910390fd5b806005600061116d611c61565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661121a611c61565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161125f91906134ad565b60405180910390a35050565b611273611c61565b73ffffffffffffffffffffffffffffffffffffffff1661129161102e565b73ffffffffffffffffffffffffffffffffffffffff16148061130757506112b6611c61565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b611346576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133d906136c5565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b600e5481565b61137a611374611c61565b83611d22565b6113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b090613745565b60405180910390fd5b6113c58484848461205c565b50505050565b60606113d682611bf5565b611415576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140c906135c5565b60405180910390fd5b6011611420836120b8565b6040516020016114319291906133eb565b6040516020818303038152906040529050919050565b61144f611c61565b73ffffffffffffffffffffffffffffffffffffffff1661146d61102e565b73ffffffffffffffffffffffffffffffffffffffff1614806114e35750611492611c61565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b611522576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611519906136c5565b60405180910390fd5b60005b818110156115775760006115396012612219565b9050600e546115486012612219565b1015611563576115586012612227565b6115628482612246565b5b50808061156f90613b03565b915050611525565b505050565b600f5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601060009054906101000a900460ff16611665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165c90613685565b60405180910390fd5b600f548111156116aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a190613705565b60405180910390fd5b600e546116b76012612219565b106116f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ee90613785565b60405180910390fd5b73f85f1872d4f6002e721a835d3c3aeec194db208973ffffffffffffffffffffffffffffffffffffffff166323b872dd33600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684600d546117599190613926565b6040518463ffffffff1660e01b81526004016117779392919061342a565b602060405180830381600087803b15801561179157600080fd5b505af11580156117a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c99190612eb1565b5060005b8181101561181f5760006117e16012612219565b9050600e546117f06012612219565b101561180b576118006012612227565b61180a3382612246565b5b50808061181790613b03565b9150506117cd565b5050565b61182b611c61565b73ffffffffffffffffffffffffffffffffffffffff1661184961102e565b73ffffffffffffffffffffffffffffffffffffffff1614806118bf575061186e611c61565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b6118fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f5906136c5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561196e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196590613545565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611a36611c61565b73ffffffffffffffffffffffffffffffffffffffff16611a5461102e565b73ffffffffffffffffffffffffffffffffffffffff161480611aca5750611a79611c61565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b611b09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b00906136c5565b60405180910390fd5b80600d8190555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611bde57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611bee5750611bed82612264565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611cdc83610c25565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611d2d82611bf5565b611d6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d63906135e5565b60405180910390fd5b6000611d7783610c25565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611de657508373ffffffffffffffffffffffffffffffffffffffff16611dce846106d1565b73ffffffffffffffffffffffffffffffffffffffff16145b80611df75750611df68185611582565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611e2082610c25565b73ffffffffffffffffffffffffffffffffffffffff1614611e76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6d906136e5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ee6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edd90613585565b60405180910390fd5b611ef18383836122ce565b611efc600082611c69565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f4c9190613980565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fa3919061389f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612067848484611e00565b612073848484846123e2565b6120b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a990613525565b60405180910390fd5b50505050565b60606000821415612100576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612214565b600082905060005b6000821461213257808061211b90613b03565b915050600a8261212b91906138f5565b9150612108565b60008167ffffffffffffffff81111561214e5761214d613c68565b5b6040519080825280601f01601f1916602001820160405280156121805781602001600182028036833780820191505090505b5090505b6000851461220d576001826121999190613980565b9150600a856121a89190613b4c565b60306121b4919061389f565b60f81b8183815181106121ca576121c9613c39565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561220691906138f5565b9450612184565b8093505050505b919050565b600081600001549050919050565b600181600001600082825461223c919061389f565b9250508190555050565b612260828260405180602001604052806000815250612579565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6122d98383836125d4565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561231c57612317816125d9565b61235b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461235a576123598382612622565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561239e576123998161278f565b6123dd565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146123dc576123db8282612860565b5b5b505050565b60006124038473ffffffffffffffffffffffffffffffffffffffff166128df565b1561256c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261242c611c61565b8786866040518563ffffffff1660e01b815260040161244e9493929190613461565b602060405180830381600087803b15801561246857600080fd5b505af192505050801561249957506040513d601f19601f820116820180604052508101906124969190612f0b565b60015b61251c573d80600081146124c9576040519150601f19603f3d011682016040523d82523d6000602084013e6124ce565b606091505b50600081511415612514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250b90613525565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612571565b600190505b949350505050565b61258383836128f2565b61259060008484846123e2565b6125cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c690613525565b60405180910390fd5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161262f84610dbc565b6126399190613980565b905060006007600084815260200190815260200160002054905081811461271e576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506127a39190613980565b90506000600960008481526020019081526020016000205490506000600883815481106127d3576127d2613c39565b5b9060005260206000200154905080600883815481106127f5576127f4613c39565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061284457612843613c0a565b5b6001900381819060005260206000200160009055905550505050565b600061286b83610dbc565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612962576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295990613665565b60405180910390fd5b61296b81611bf5565b156129ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a290613565565b60405180910390fd5b6129b7600083836122ce565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a07919061389f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612acc90613aa0565b90600052602060002090601f016020900481019282612aee5760008555612b35565b82601f10612b0757805160ff1916838001178555612b35565b82800160010185558215612b35579182015b82811115612b34578251825591602001919060010190612b19565b5b509050612b429190612b46565b5090565b5b80821115612b5f576000816000905550600101612b47565b5090565b6000612b76612b71846137e5565b6137c0565b905082815260208101848484011115612b9257612b91613c9c565b5b612b9d848285613a5e565b509392505050565b6000612bb8612bb384613816565b6137c0565b905082815260208101848484011115612bd457612bd3613c9c565b5b612bdf848285613a5e565b509392505050565b600081359050612bf68161422d565b92915050565b600081359050612c0b81614244565b92915050565b600081519050612c2081614244565b92915050565b600081359050612c358161425b565b92915050565b600081519050612c4a8161425b565b92915050565b600082601f830112612c6557612c64613c97565b5b8135612c75848260208601612b63565b91505092915050565b600082601f830112612c9357612c92613c97565b5b8135612ca3848260208601612ba5565b91505092915050565b600081359050612cbb81614272565b92915050565b600060208284031215612cd757612cd6613ca6565b5b6000612ce584828501612be7565b91505092915050565b60008060408385031215612d0557612d04613ca6565b5b6000612d1385828601612be7565b9250506020612d2485828601612be7565b9150509250929050565b600080600060608486031215612d4757612d46613ca6565b5b6000612d5586828701612be7565b9350506020612d6686828701612be7565b9250506040612d7786828701612cac565b9150509250925092565b60008060008060808587031215612d9b57612d9a613ca6565b5b6000612da987828801612be7565b9450506020612dba87828801612be7565b9350506040612dcb87828801612cac565b925050606085013567ffffffffffffffff811115612dec57612deb613ca1565b5b612df887828801612c50565b91505092959194509250565b60008060408385031215612e1b57612e1a613ca6565b5b6000612e2985828601612be7565b9250506020612e3a85828601612bfc565b9150509250929050565b60008060408385031215612e5b57612e5a613ca6565b5b6000612e6985828601612be7565b9250506020612e7a85828601612cac565b9150509250929050565b600060208284031215612e9a57612e99613ca6565b5b6000612ea884828501612bfc565b91505092915050565b600060208284031215612ec757612ec6613ca6565b5b6000612ed584828501612c11565b91505092915050565b600060208284031215612ef457612ef3613ca6565b5b6000612f0284828501612c26565b91505092915050565b600060208284031215612f2157612f20613ca6565b5b6000612f2f84828501612c3b565b91505092915050565b600060208284031215612f4e57612f4d613ca6565b5b600082013567ffffffffffffffff811115612f6c57612f6b613ca1565b5b612f7884828501612c7e565b91505092915050565b600060208284031215612f9757612f96613ca6565b5b6000612fa584828501612cac565b91505092915050565b612fb7816139b4565b82525050565b612fc6816139c6565b82525050565b6000612fd78261385c565b612fe18185613872565b9350612ff1818560208601613a6d565b612ffa81613cab565b840191505092915050565b61300e81613a28565b82525050565b600061301f82613867565b6130298185613883565b9350613039818560208601613a6d565b61304281613cab565b840191505092915050565b600061305882613867565b6130628185613894565b9350613072818560208601613a6d565b80840191505092915050565b6000815461308b81613aa0565b6130958186613894565b945060018216600081146130b057600181146130c1576130f4565b60ff198316865281860193506130f4565b6130ca85613847565b60005b838110156130ec578154818901526001820191506020810190506130cd565b838801955050505b50505092915050565b600061310a602b83613883565b915061311582613cbc565b604082019050919050565b600061312d603283613883565b915061313882613d0b565b604082019050919050565b6000613150602683613883565b915061315b82613d5a565b604082019050919050565b6000613173601c83613883565b915061317e82613da9565b602082019050919050565b6000613196602483613883565b91506131a182613dd2565b604082019050919050565b60006131b9601983613883565b91506131c482613e21565b602082019050919050565b60006131dc601483613883565b91506131e782613e4a565b602082019050919050565b60006131ff602c83613883565b915061320a82613e73565b604082019050919050565b6000613222603883613883565b915061322d82613ec2565b604082019050919050565b6000613245602a83613883565b915061325082613f11565b604082019050919050565b6000613268602983613883565b915061327382613f60565b604082019050919050565b600061328b602083613883565b915061329682613faf565b602082019050919050565b60006132ae601683613883565b91506132b982613fd8565b602082019050919050565b60006132d1602c83613883565b91506132dc82614001565b604082019050919050565b60006132f4602083613883565b91506132ff82614050565b602082019050919050565b6000613317602983613883565b915061332282614079565b604082019050919050565b600061333a602283613883565b9150613345826140c8565b604082019050919050565b600061335d602183613883565b915061336882614117565b604082019050919050565b6000613380603183613883565b915061338b82614166565b604082019050919050565b60006133a3602c83613883565b91506133ae826141b5565b604082019050919050565b60006133c6602083613883565b91506133d182614204565b602082019050919050565b6133e581613a1e565b82525050565b60006133f7828561307e565b9150613403828461304d565b91508190509392505050565b60006020820190506134246000830184612fae565b92915050565b600060608201905061343f6000830186612fae565b61344c6020830185612fae565b61345960408301846133dc565b949350505050565b60006080820190506134766000830187612fae565b6134836020830186612fae565b61349060408301856133dc565b81810360608301526134a28184612fcc565b905095945050505050565b60006020820190506134c26000830184612fbd565b92915050565b60006020820190506134dd6000830184613005565b92915050565b600060208201905081810360008301526134fd8184613014565b905092915050565b6000602082019050818103600083015261351e816130fd565b9050919050565b6000602082019050818103600083015261353e81613120565b9050919050565b6000602082019050818103600083015261355e81613143565b9050919050565b6000602082019050818103600083015261357e81613166565b9050919050565b6000602082019050818103600083015261359e81613189565b9050919050565b600060208201905081810360008301526135be816131ac565b9050919050565b600060208201905081810360008301526135de816131cf565b9050919050565b600060208201905081810360008301526135fe816131f2565b9050919050565b6000602082019050818103600083015261361e81613215565b9050919050565b6000602082019050818103600083015261363e81613238565b9050919050565b6000602082019050818103600083015261365e8161325b565b9050919050565b6000602082019050818103600083015261367e8161327e565b9050919050565b6000602082019050818103600083015261369e816132a1565b9050919050565b600060208201905081810360008301526136be816132c4565b9050919050565b600060208201905081810360008301526136de816132e7565b9050919050565b600060208201905081810360008301526136fe8161330a565b9050919050565b6000602082019050818103600083015261371e8161332d565b9050919050565b6000602082019050818103600083015261373e81613350565b9050919050565b6000602082019050818103600083015261375e81613373565b9050919050565b6000602082019050818103600083015261377e81613396565b9050919050565b6000602082019050818103600083015261379e816133b9565b9050919050565b60006020820190506137ba60008301846133dc565b92915050565b60006137ca6137db565b90506137d68282613ad2565b919050565b6000604051905090565b600067ffffffffffffffff821115613800576137ff613c68565b5b61380982613cab565b9050602081019050919050565b600067ffffffffffffffff82111561383157613830613c68565b5b61383a82613cab565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006138aa82613a1e565b91506138b583613a1e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156138ea576138e9613b7d565b5b828201905092915050565b600061390082613a1e565b915061390b83613a1e565b92508261391b5761391a613bac565b5b828204905092915050565b600061393182613a1e565b915061393c83613a1e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561397557613974613b7d565b5b828202905092915050565b600061398b82613a1e565b915061399683613a1e565b9250828210156139a9576139a8613b7d565b5b828203905092915050565b60006139bf826139fe565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000613a3382613a3a565b9050919050565b6000613a4582613a4c565b9050919050565b6000613a57826139fe565b9050919050565b82818337600083830152505050565b60005b83811015613a8b578082015181840152602081019050613a70565b83811115613a9a576000848401525b50505050565b60006002820490506001821680613ab857607f821691505b60208210811415613acc57613acb613bdb565b5b50919050565b613adb82613cab565b810181811067ffffffffffffffff82111715613afa57613af9613c68565b5b80604052505050565b6000613b0e82613a1e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b4157613b40613b7d565b5b600182019050919050565b6000613b5782613a1e565b9150613b6283613a1e565b925082613b7257613b71613bac565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f546f6b656e20646f6573206e6f74206578697374000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f436f6e7472616374206973206e6f742061637469766500000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f43616e206f6e6c79206d696e7420757020746f207075726368617365206c696d60008201527f6974000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564204441434e46545f4d4158600082015250565b614236816139b4565b811461424157600080fd5b50565b61424d816139c6565b811461425857600080fd5b50565b614264816139d2565b811461426f57600080fd5b50565b61427b81613a1e565b811461428657600080fd5b5056fea2646970667358221220a8146b56ea73f72a69c010b7fe1eca0520f8ae5e6ea80cbe6afdda2bfee7c34f64736f6c63430008070033
Deployed Bytecode Sourcemap
49612:2543:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36765:300;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22885:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24467:308;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23990:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37568:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25526:376;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37149:343;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25973:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37758:320;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50511:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50282:121;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22492:326;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50623:117;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22135:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46353:148;;;:::i;:::-;;49831:89;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49956:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45637:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23054:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24847:327;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50411:92;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50008:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26229:365;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51919:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50856:359;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50046:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25245:214;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51223:688;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46656:281;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50748:96;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36765:300;36912:4;36969:35;36954:50;;;:11;:50;;;;:103;;;;37021:36;37045:11;37021:23;:36::i;:::-;36954:103;36934:123;;36765:300;;;:::o;22885:100::-;22939:13;22972:5;22965:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22885:100;:::o;24467:308::-;24588:7;24635:16;24643:7;24635;:16::i;:::-;24613:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;24743:15;:24;24759:7;24743:24;;;;;;;;;;;;;;;;;;;;;24736:31;;24467:308;;;:::o;23990:411::-;24071:13;24087:23;24102:7;24087:14;:23::i;:::-;24071:39;;24135:5;24129:11;;:2;:11;;;;24121:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;24229:5;24213:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;24238:37;24255:5;24262:12;:10;:12::i;:::-;24238:16;:37::i;:::-;24213:62;24191:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;24372:21;24381:2;24385:7;24372:8;:21::i;:::-;24060:341;23990:411;;:::o;37568:113::-;37629:7;37656:10;:17;;;;37649:24;;37568:113;:::o;25526:376::-;25735:41;25754:12;:10;:12::i;:::-;25768:7;25735:18;:41::i;:::-;25713:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;25866:28;25876:4;25882:2;25886:7;25866:9;:28::i;:::-;25526:376;;;:::o;37149:343::-;37291:7;37346:23;37363:5;37346:16;:23::i;:::-;37338:5;:31;37316:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;37458:12;:19;37471:5;37458:19;;;;;;;;;;;;;;;:26;37478:5;37458:26;;;;;;;;;;;;37451:33;;37149:343;;;;:::o;25973:185::-;26111:39;26128:4;26134:2;26138:7;26111:39;;;;;;;;;;;;:16;:39::i;:::-;25973:185;;;:::o;37758:320::-;37878:7;37933:30;:28;:30::i;:::-;37925:5;:38;37903:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;38053:10;38064:5;38053:17;;;;;;;;:::i;:::-;;;;;;;;;;38046:24;;37758:320;;;:::o;50511:104::-;45882:12;:10;:12::i;:::-;45871:23;;:7;:5;:7::i;:::-;:23;;;:51;;;;45910:12;:10;:12::i;:::-;45898:24;;:8;;;;;;;;;;;:24;;;45871:51;45849:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;50600:7:::1;50584:13;:23;;;;;;;;;;;;:::i;:::-;;50511:104:::0;:::o;50282:121::-;45882:12;:10;:12::i;:::-;45871:23;;:7;:5;:7::i;:::-;:23;;;:51;;;;45910:12;:10;:12::i;:::-;45898:24;;:8;;;;;;;;;;;:24;;;45871:51;45849:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;50381:14:::1;50363:15;;:32;;;;;;;;;;;;;;;;;;50282:121:::0;:::o;22492:326::-;22609:7;22634:13;22650:7;:16;22658:7;22650:16;;;;;;;;;;;;;;;;;;;;;22634:32;;22716:1;22699:19;;:5;:19;;;;22677:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;22805:5;22798:12;;;22492:326;;;:::o;50623:117::-;45882:12;:10;:12::i;:::-;45871:23;;:7;:5;:7::i;:::-;:23;;;:51;;;;45910:12;:10;:12::i;:::-;45898:24;;:8;;;;;;;;;;;:24;;;45871:51;45849:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;50719:13:::1;50702:14;:30;;;;50623:117:::0;:::o;22135:295::-;22252:7;22316:1;22299:19;;:5;:19;;;;22277:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;22406:9;:16;22416:5;22406:16;;;;;;;;;;;;;;;;22399:23;;22135:295;;;:::o;46353:148::-;45882:12;:10;:12::i;:::-;45871:23;;:7;:5;:7::i;:::-;:23;;;:51;;;;45910:12;:10;:12::i;:::-;45898:24;;:8;;;;;;;;;;;:24;;;45871:51;45849:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;46460:1:::1;46423:40;;46444:6;;;;;;;;;;;46423:40;;;;;;;;;;;;46491:1;46474:6;;:19;;;;;;;;;;;;;;;;;;46353:148::o:0;49831:89::-;49877:42;49831:89;:::o;49956:36::-;;;;:::o;45637:87::-;45683:7;45710:6;;;;;;;;;;;45703:13;;45637:87;:::o;23054:104::-;23110:13;23143:7;23136:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23054:104;:::o;24847:327::-;24994:12;:10;:12::i;:::-;24982:24;;:8;:24;;;;24974:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;25094:8;25049:18;:32;25068:12;:10;:12::i;:::-;25049:32;;;;;;;;;;;;;;;:42;25082:8;25049:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;25147:8;25118:48;;25133:12;:10;:12::i;:::-;25118:48;;;25157:8;25118:48;;;;;;:::i;:::-;;;;;;;;24847:327;;:::o;50411:92::-;45882:12;:10;:12::i;:::-;45871:23;;:7;:5;:7::i;:::-;:23;;;:51;;;;45910:12;:10;:12::i;:::-;45898:24;;:8;;;;;;;;;;;:24;;;45871:51;45849:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;50487:8:::1;50475:9;;:20;;;;;;;;;;;;;;;;;;50411:92:::0;:::o;50008:31::-;;;;:::o;26229:365::-;26418:41;26437:12;:10;:12::i;:::-;26451:7;26418:18;:41::i;:::-;26396:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;26547:39;26561:4;26567:2;26571:7;26580:5;26547:13;:39::i;:::-;26229:365;;;;:::o;51919:233::-;51992:13;52026:16;52034:7;52026;:16::i;:::-;52018:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;52109:13;52124:18;:7;:16;:18::i;:::-;52092:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52078:66;;51919:233;;;:::o;50856:359::-;45882:12;:10;:12::i;:::-;45871:23;;:7;:5;:7::i;:::-;:23;;;:51;;;;45910:12;:10;:12::i;:::-;45898:24;;:8;;;;;;;;;;;:24;;;45871:51;45849:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;50941:9:::1;50936:272;50960:14;50956:1;:18;50936:272;;;50996:15;51014:23;:13;:21;:23::i;:::-;50996:41;;51084:10;;51058:23;:13;:21;:23::i;:::-;:36;51054:143;;;51115:25;:13;:23;:25::i;:::-;51159:22;51169:2;51173:7;51159:9;:22::i;:::-;51054:143;50981:227;50976:3;;;;;:::i;:::-;;;;50936:272;;;;50856:359:::0;;:::o;50046:33::-;;;;:::o;25245:214::-;25387:4;25416:18;:25;25435:5;25416:25;;;;;;;;;;;;;;;:35;25442:8;25416:35;;;;;;;;;;;;;;;;;;;;;;;;;25409:42;;25245:214;;;;:::o;51223:688::-;51293:9;;;;;;;;;;;51285:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;51367:14;;51349;:32;;51340:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;51465:10;;51439:23;:13;:21;:23::i;:::-;:36;51431:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;49877:42;51532:26;;;51559:10;51571:15;;;;;;;;;;;51596:14;51588:5;;:22;;;;:::i;:::-;51532:79;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;51629:9;51624:280;51648:14;51644:1;:18;51624:280;;;51684:15;51702:23;:13;:21;:23::i;:::-;51684:41;;51772:10;;51746:23;:13;:21;:23::i;:::-;:36;51742:151;;;51803:25;:13;:23;:25::i;:::-;51847:30;51857:10;51869:7;51847:9;:30::i;:::-;51742:151;51669:235;51664:3;;;;;:::i;:::-;;;;51624:280;;;;51223:688;:::o;46656:281::-;45882:12;:10;:12::i;:::-;45871:23;;:7;:5;:7::i;:::-;:23;;;:51;;;;45910:12;:10;:12::i;:::-;45898:24;;:8;;;;;;;;;;;:24;;;45871:51;45849:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;46779:1:::1;46759:22;;:8;:22;;;;46737:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;46892:8;46863:38;;46884:6;;;;;;;;;;;46863:38;;;;;;;;;;;;46921:8;46912:6;;:17;;;;;;;;;;;;;;;;;;46656:281:::0;:::o;50748:96::-;45882:12;:10;:12::i;:::-;45871:23;;:7;:5;:7::i;:::-;:23;;;:51;;;;45910:12;:10;:12::i;:::-;45898:24;;:8;;;;;;;;;;;:24;;;45871:51;45849:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;50827:9:::1;50819:5;:17;;;;50748:96:::0;:::o;21716:355::-;21863:4;21920:25;21905:40;;;:11;:40;;;;:105;;;;21977:33;21962:48;;;:11;:48;;;;21905:105;:158;;;;22027:36;22051:11;22027:23;:36::i;:::-;21905:158;21885:178;;21716:355;;;:::o;28141:127::-;28206:4;28258:1;28230:30;;:7;:16;28238:7;28230:16;;;;;;;;;;;;;;;;;;;;;:30;;;;28223:37;;28141:127;;;:::o;16895:98::-;16948:7;16975:10;16968:17;;16895:98;:::o;32264:174::-;32366:2;32339:15;:24;32355:7;32339:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;32422:7;32418:2;32384:46;;32393:23;32408:7;32393:14;:23::i;:::-;32384:46;;;;;;;;;;;;32264:174;;:::o;28435:452::-;28564:4;28608:16;28616:7;28608;:16::i;:::-;28586:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;28707:13;28723:23;28738:7;28723:14;:23::i;:::-;28707:39;;28776:5;28765:16;;:7;:16;;;:64;;;;28822:7;28798:31;;:20;28810:7;28798:11;:20::i;:::-;:31;;;28765:64;:113;;;;28846:32;28863:5;28870:7;28846:16;:32::i;:::-;28765:113;28757:122;;;28435:452;;;;:::o;31531:615::-;31704:4;31677:31;;:23;31692:7;31677:14;:23::i;:::-;:31;;;31655:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;31810:1;31796:16;;:2;:16;;;;31788:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31866:39;31887:4;31893:2;31897:7;31866:20;:39::i;:::-;31970:29;31987:1;31991:7;31970:8;:29::i;:::-;32031:1;32012:9;:15;32022:4;32012:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;32060:1;32043:9;:13;32053:2;32043:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32091:2;32072:7;:16;32080:7;32072:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32130:7;32126:2;32111:27;;32120:4;32111:27;;;;;;;;;;;;31531:615;;;:::o;27476:352::-;27633:28;27643:4;27649:2;27653:7;27633:9;:28::i;:::-;27694:48;27717:4;27723:2;27727:7;27736:5;27694:22;:48::i;:::-;27672:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;27476:352;;;;:::o;17567:723::-;17623:13;17853:1;17844:5;:10;17840:53;;;17871:10;;;;;;;;;;;;;;;;;;;;;17840:53;17903:12;17918:5;17903:20;;17934:14;17959:78;17974:1;17966:4;:9;17959:78;;17992:8;;;;;:::i;:::-;;;;18023:2;18015:10;;;;;:::i;:::-;;;17959:78;;;18047:19;18079:6;18069:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18047:39;;18097:154;18113:1;18104:5;:10;18097:154;;18141:1;18131:11;;;;;:::i;:::-;;;18208:2;18200:5;:10;;;;:::i;:::-;18187:2;:24;;;;:::i;:::-;18174:39;;18157:6;18164;18157:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18237:2;18228:11;;;;;:::i;:::-;;;18097:154;;;18275:6;18261:21;;;;;17567:723;;;;:::o;43974:114::-;44039:7;44066;:14;;;44059:21;;43974:114;;;:::o;44096:117::-;44193:1;44175:7;:14;;;:19;;;;;;;:::i;:::-;;;;;;;;44096:117;:::o;29229:110::-;29305:26;29315:2;29319:7;29305:26;;;;;;;;;;;;:9;:26::i;:::-;29229:110;;:::o;20167:207::-;20297:4;20341:25;20326:40;;;:11;:40;;;;20319:47;;20167:207;;;:::o;38691:589::-;38835:45;38862:4;38868:2;38872:7;38835:26;:45::i;:::-;38913:1;38897:18;;:4;:18;;;38893:187;;;38932:40;38964:7;38932:31;:40::i;:::-;38893:187;;;39002:2;38994:10;;:4;:10;;;38990:90;;39021:47;39054:4;39060:7;39021:32;:47::i;:::-;38990:90;38893:187;39108:1;39094:16;;:2;:16;;;39090:183;;;39127:45;39164:7;39127:36;:45::i;:::-;39090:183;;;39200:4;39194:10;;:2;:10;;;39190:83;;39221:40;39249:2;39253:7;39221:27;:40::i;:::-;39190:83;39090:183;38691:589;;;:::o;33003:1053::-;33158:4;33179:15;:2;:13;;;:15::i;:::-;33175:874;;;33248:2;33232:36;;;33291:12;:10;:12::i;:::-;33326:4;33353:7;33383:5;33232:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33211:783;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33611:1;33594:6;:13;:18;33590:389;;;33637:108;;;;;;;;;;:::i;:::-;;;;;;;;33590:389;33929:6;33923:13;33914:6;33910:2;33906:15;33899:38;33211:783;33481:45;;;33471:55;;;:6;:55;;;;33464:62;;;;;33175:874;34033:4;34026:11;;33003:1053;;;;;;;:::o;29566:321::-;29696:18;29702:2;29706:7;29696:5;:18::i;:::-;29747:54;29778:1;29782:2;29786:7;29795:5;29747:22;:54::i;:::-;29725:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;29566:321;;;:::o;34669:126::-;;;;:::o;40003:164::-;40107:10;:17;;;;40080:15;:24;40096:7;40080:24;;;;;;;;;;;:44;;;;40135:10;40151:7;40135:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40003:164;:::o;40794:1002::-;41074:22;41124:1;41099:22;41116:4;41099:16;:22::i;:::-;:26;;;;:::i;:::-;41074:51;;41136:18;41157:17;:26;41175:7;41157:26;;;;;;;;;;;;41136:47;;41304:14;41290:10;:28;41286:328;;41335:19;41357:12;:18;41370:4;41357:18;;;;;;;;;;;;;;;:34;41376:14;41357:34;;;;;;;;;;;;41335:56;;41441:11;41408:12;:18;41421:4;41408:18;;;;;;;;;;;;;;;:30;41427:10;41408:30;;;;;;;;;;;:44;;;;41558:10;41525:17;:30;41543:11;41525:30;;;;;;;;;;;:43;;;;41320:294;41286:328;41710:17;:26;41728:7;41710:26;;;;;;;;;;;41703:33;;;41754:12;:18;41767:4;41754:18;;;;;;;;;;;;;;;:34;41773:14;41754:34;;;;;;;;;;;41747:41;;;40889:907;;40794:1002;;:::o;42091:1079::-;42344:22;42389:1;42369:10;:17;;;;:21;;;;:::i;:::-;42344:46;;42401:18;42422:15;:24;42438:7;42422:24;;;;;;;;;;;;42401:45;;42773:19;42795:10;42806:14;42795:26;;;;;;;;:::i;:::-;;;;;;;;;;42773:48;;42859:11;42834:10;42845;42834:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;42970:10;42939:15;:28;42955:11;42939:28;;;;;;;;;;;:41;;;;43111:15;:24;43127:7;43111:24;;;;;;;;;;;43104:31;;;43146:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;42162:1008;;;42091:1079;:::o;39581:221::-;39666:14;39683:20;39700:2;39683:16;:20::i;:::-;39666:37;;39741:7;39714:12;:16;39727:2;39714:16;;;;;;;;;;;;;;;:24;39731:6;39714:24;;;;;;;;;;;:34;;;;39788:6;39759:17;:26;39777:7;39759:26;;;;;;;;;;;:35;;;;39655:147;39581:221;;:::o;8294:444::-;8354:4;8562:12;8686:7;8674:20;8666:28;;8729:1;8722:4;:8;8715:15;;;8294:444;;;:::o;30223:382::-;30317:1;30303:16;;:2;:16;;;;30295:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;30376:16;30384:7;30376;:16::i;:::-;30375:17;30367:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;30438:45;30467:1;30471:2;30475:7;30438:20;:45::i;:::-;30513:1;30496:9;:13;30506:2;30496:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30544:2;30525:7;:16;30533:7;30525:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30589:7;30585:2;30564:33;;30581:1;30564:33;;;;;;;;;;;;30223:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1179:5;1210:6;1204:13;1195:22;;1226:30;1250:5;1226:30;:::i;:::-;1125:137;;;;:::o;1268:::-;1313:5;1351:6;1338:20;1329:29;;1367:32;1393:5;1367:32;:::i;:::-;1268:137;;;;:::o;1411:141::-;1467:5;1498:6;1492:13;1483:22;;1514:32;1540:5;1514:32;:::i;:::-;1411:141;;;;:::o;1571:338::-;1626:5;1675:3;1668:4;1660:6;1656:17;1652:27;1642:122;;1683:79;;:::i;:::-;1642:122;1800:6;1787:20;1825:78;1899:3;1891:6;1884:4;1876:6;1872:17;1825:78;:::i;:::-;1816:87;;1632:277;1571:338;;;;:::o;1929:340::-;1985:5;2034:3;2027:4;2019:6;2015:17;2011:27;2001:122;;2042:79;;:::i;:::-;2001:122;2159:6;2146:20;2184:79;2259:3;2251:6;2244:4;2236:6;2232:17;2184:79;:::i;:::-;2175:88;;1991:278;1929:340;;;;:::o;2275:139::-;2321:5;2359:6;2346:20;2337:29;;2375:33;2402:5;2375:33;:::i;:::-;2275:139;;;;:::o;2420:329::-;2479:6;2528:2;2516:9;2507:7;2503:23;2499:32;2496:119;;;2534:79;;:::i;:::-;2496:119;2654:1;2679:53;2724:7;2715:6;2704:9;2700:22;2679:53;:::i;:::-;2669:63;;2625:117;2420:329;;;;:::o;2755:474::-;2823:6;2831;2880:2;2868:9;2859:7;2855:23;2851:32;2848:119;;;2886:79;;:::i;:::-;2848:119;3006:1;3031:53;3076:7;3067:6;3056:9;3052:22;3031:53;:::i;:::-;3021:63;;2977:117;3133:2;3159:53;3204:7;3195:6;3184:9;3180:22;3159:53;:::i;:::-;3149:63;;3104:118;2755:474;;;;;:::o;3235:619::-;3312:6;3320;3328;3377:2;3365:9;3356:7;3352:23;3348:32;3345:119;;;3383:79;;:::i;:::-;3345:119;3503:1;3528:53;3573:7;3564:6;3553:9;3549:22;3528:53;:::i;:::-;3518:63;;3474:117;3630:2;3656:53;3701:7;3692:6;3681:9;3677:22;3656:53;:::i;:::-;3646:63;;3601:118;3758:2;3784:53;3829:7;3820:6;3809:9;3805:22;3784:53;:::i;:::-;3774:63;;3729:118;3235:619;;;;;:::o;3860:943::-;3955:6;3963;3971;3979;4028:3;4016:9;4007:7;4003:23;3999:33;3996:120;;;4035:79;;:::i;:::-;3996:120;4155:1;4180:53;4225:7;4216:6;4205:9;4201:22;4180:53;:::i;:::-;4170:63;;4126:117;4282:2;4308:53;4353:7;4344:6;4333:9;4329:22;4308:53;:::i;:::-;4298:63;;4253:118;4410:2;4436:53;4481:7;4472:6;4461:9;4457:22;4436:53;:::i;:::-;4426:63;;4381:118;4566:2;4555:9;4551:18;4538:32;4597:18;4589:6;4586:30;4583:117;;;4619:79;;:::i;:::-;4583:117;4724:62;4778:7;4769:6;4758:9;4754:22;4724:62;:::i;:::-;4714:72;;4509:287;3860:943;;;;;;;:::o;4809:468::-;4874:6;4882;4931:2;4919:9;4910:7;4906:23;4902:32;4899:119;;;4937:79;;:::i;:::-;4899:119;5057:1;5082:53;5127:7;5118:6;5107:9;5103:22;5082:53;:::i;:::-;5072:63;;5028:117;5184:2;5210:50;5252:7;5243:6;5232:9;5228:22;5210:50;:::i;:::-;5200:60;;5155:115;4809:468;;;;;:::o;5283:474::-;5351:6;5359;5408:2;5396:9;5387:7;5383:23;5379:32;5376:119;;;5414:79;;:::i;:::-;5376:119;5534:1;5559:53;5604:7;5595:6;5584:9;5580:22;5559:53;:::i;:::-;5549:63;;5505:117;5661:2;5687:53;5732:7;5723:6;5712:9;5708:22;5687:53;:::i;:::-;5677:63;;5632:118;5283:474;;;;;:::o;5763:323::-;5819:6;5868:2;5856:9;5847:7;5843:23;5839:32;5836:119;;;5874:79;;:::i;:::-;5836:119;5994:1;6019:50;6061:7;6052:6;6041:9;6037:22;6019:50;:::i;:::-;6009:60;;5965:114;5763:323;;;;:::o;6092:345::-;6159:6;6208:2;6196:9;6187:7;6183:23;6179:32;6176:119;;;6214:79;;:::i;:::-;6176:119;6334:1;6359:61;6412:7;6403:6;6392:9;6388:22;6359:61;:::i;:::-;6349:71;;6305:125;6092:345;;;;:::o;6443:327::-;6501:6;6550:2;6538:9;6529:7;6525:23;6521:32;6518:119;;;6556:79;;:::i;:::-;6518:119;6676:1;6701:52;6745:7;6736:6;6725:9;6721:22;6701:52;:::i;:::-;6691:62;;6647:116;6443:327;;;;:::o;6776:349::-;6845:6;6894:2;6882:9;6873:7;6869:23;6865:32;6862:119;;;6900:79;;:::i;:::-;6862:119;7020:1;7045:63;7100:7;7091:6;7080:9;7076:22;7045:63;:::i;:::-;7035:73;;6991:127;6776:349;;;;:::o;7131:509::-;7200:6;7249:2;7237:9;7228:7;7224:23;7220:32;7217:119;;;7255:79;;:::i;:::-;7217:119;7403:1;7392:9;7388:17;7375:31;7433:18;7425:6;7422:30;7419:117;;;7455:79;;:::i;:::-;7419:117;7560:63;7615:7;7606:6;7595:9;7591:22;7560:63;:::i;:::-;7550:73;;7346:287;7131:509;;;;:::o;7646:329::-;7705:6;7754:2;7742:9;7733:7;7729:23;7725:32;7722:119;;;7760:79;;:::i;:::-;7722:119;7880:1;7905:53;7950:7;7941:6;7930:9;7926:22;7905:53;:::i;:::-;7895:63;;7851:117;7646:329;;;;:::o;7981:118::-;8068:24;8086:5;8068:24;:::i;:::-;8063:3;8056:37;7981:118;;:::o;8105:109::-;8186:21;8201:5;8186:21;:::i;:::-;8181:3;8174:34;8105:109;;:::o;8220:360::-;8306:3;8334:38;8366:5;8334:38;:::i;:::-;8388:70;8451:6;8446:3;8388:70;:::i;:::-;8381:77;;8467:52;8512:6;8507:3;8500:4;8493:5;8489:16;8467:52;:::i;:::-;8544:29;8566:6;8544:29;:::i;:::-;8539:3;8535:39;8528:46;;8310:270;8220:360;;;;:::o;8586:161::-;8688:52;8734:5;8688:52;:::i;:::-;8683:3;8676:65;8586:161;;:::o;8753:364::-;8841:3;8869:39;8902:5;8869:39;:::i;:::-;8924:71;8988:6;8983:3;8924:71;:::i;:::-;8917:78;;9004:52;9049:6;9044:3;9037:4;9030:5;9026:16;9004:52;:::i;:::-;9081:29;9103:6;9081:29;:::i;:::-;9076:3;9072:39;9065:46;;8845:272;8753:364;;;;:::o;9123:377::-;9229:3;9257:39;9290:5;9257:39;:::i;:::-;9312:89;9394:6;9389:3;9312:89;:::i;:::-;9305:96;;9410:52;9455:6;9450:3;9443:4;9436:5;9432:16;9410:52;:::i;:::-;9487:6;9482:3;9478:16;9471:23;;9233:267;9123:377;;;;:::o;9530:845::-;9633:3;9670:5;9664:12;9699:36;9725:9;9699:36;:::i;:::-;9751:89;9833:6;9828:3;9751:89;:::i;:::-;9744:96;;9871:1;9860:9;9856:17;9887:1;9882:137;;;;10033:1;10028:341;;;;9849:520;;9882:137;9966:4;9962:9;9951;9947:25;9942:3;9935:38;10002:6;9997:3;9993:16;9986:23;;9882:137;;10028:341;10095:38;10127:5;10095:38;:::i;:::-;10155:1;10169:154;10183:6;10180:1;10177:13;10169:154;;;10257:7;10251:14;10247:1;10242:3;10238:11;10231:35;10307:1;10298:7;10294:15;10283:26;;10205:4;10202:1;10198:12;10193:17;;10169:154;;;10352:6;10347:3;10343:16;10336:23;;10035:334;;9849:520;;9637:738;;9530:845;;;;:::o;10381:366::-;10523:3;10544:67;10608:2;10603:3;10544:67;:::i;:::-;10537:74;;10620:93;10709:3;10620:93;:::i;:::-;10738:2;10733:3;10729:12;10722:19;;10381:366;;;:::o;10753:::-;10895:3;10916:67;10980:2;10975:3;10916:67;:::i;:::-;10909:74;;10992:93;11081:3;10992:93;:::i;:::-;11110:2;11105:3;11101:12;11094:19;;10753:366;;;:::o;11125:::-;11267:3;11288:67;11352:2;11347:3;11288:67;:::i;:::-;11281:74;;11364:93;11453:3;11364:93;:::i;:::-;11482:2;11477:3;11473:12;11466:19;;11125:366;;;:::o;11497:::-;11639:3;11660:67;11724:2;11719:3;11660:67;:::i;:::-;11653:74;;11736:93;11825:3;11736:93;:::i;:::-;11854:2;11849:3;11845:12;11838:19;;11497:366;;;:::o;11869:::-;12011:3;12032:67;12096:2;12091:3;12032:67;:::i;:::-;12025:74;;12108:93;12197:3;12108:93;:::i;:::-;12226:2;12221:3;12217:12;12210:19;;11869:366;;;:::o;12241:::-;12383:3;12404:67;12468:2;12463:3;12404:67;:::i;:::-;12397:74;;12480:93;12569:3;12480:93;:::i;:::-;12598:2;12593:3;12589:12;12582:19;;12241:366;;;:::o;12613:::-;12755:3;12776:67;12840:2;12835:3;12776:67;:::i;:::-;12769:74;;12852:93;12941:3;12852:93;:::i;:::-;12970:2;12965:3;12961:12;12954:19;;12613:366;;;:::o;12985:::-;13127:3;13148:67;13212:2;13207:3;13148:67;:::i;:::-;13141:74;;13224:93;13313:3;13224:93;:::i;:::-;13342:2;13337:3;13333:12;13326:19;;12985:366;;;:::o;13357:::-;13499:3;13520:67;13584:2;13579:3;13520:67;:::i;:::-;13513:74;;13596:93;13685:3;13596:93;:::i;:::-;13714:2;13709:3;13705:12;13698:19;;13357:366;;;:::o;13729:::-;13871:3;13892:67;13956:2;13951:3;13892:67;:::i;:::-;13885:74;;13968:93;14057:3;13968:93;:::i;:::-;14086:2;14081:3;14077:12;14070:19;;13729:366;;;:::o;14101:::-;14243:3;14264:67;14328:2;14323:3;14264:67;:::i;:::-;14257:74;;14340:93;14429:3;14340:93;:::i;:::-;14458:2;14453:3;14449:12;14442:19;;14101:366;;;:::o;14473:::-;14615:3;14636:67;14700:2;14695:3;14636:67;:::i;:::-;14629:74;;14712:93;14801:3;14712:93;:::i;:::-;14830:2;14825:3;14821:12;14814:19;;14473:366;;;:::o;14845:::-;14987:3;15008:67;15072:2;15067:3;15008:67;:::i;:::-;15001:74;;15084:93;15173:3;15084:93;:::i;:::-;15202:2;15197:3;15193:12;15186:19;;14845:366;;;:::o;15217:::-;15359:3;15380:67;15444:2;15439:3;15380:67;:::i;:::-;15373:74;;15456:93;15545:3;15456:93;:::i;:::-;15574:2;15569:3;15565:12;15558:19;;15217:366;;;:::o;15589:::-;15731:3;15752:67;15816:2;15811:3;15752:67;:::i;:::-;15745:74;;15828:93;15917:3;15828:93;:::i;:::-;15946:2;15941:3;15937:12;15930:19;;15589:366;;;:::o;15961:::-;16103:3;16124:67;16188:2;16183:3;16124:67;:::i;:::-;16117:74;;16200:93;16289:3;16200:93;:::i;:::-;16318:2;16313:3;16309:12;16302:19;;15961:366;;;:::o;16333:::-;16475:3;16496:67;16560:2;16555:3;16496:67;:::i;:::-;16489:74;;16572:93;16661:3;16572:93;:::i;:::-;16690:2;16685:3;16681:12;16674:19;;16333:366;;;:::o;16705:::-;16847:3;16868:67;16932:2;16927:3;16868:67;:::i;:::-;16861:74;;16944:93;17033:3;16944:93;:::i;:::-;17062:2;17057:3;17053:12;17046:19;;16705:366;;;:::o;17077:::-;17219:3;17240:67;17304:2;17299:3;17240:67;:::i;:::-;17233:74;;17316:93;17405:3;17316:93;:::i;:::-;17434:2;17429:3;17425:12;17418:19;;17077:366;;;:::o;17449:::-;17591:3;17612:67;17676:2;17671:3;17612:67;:::i;:::-;17605:74;;17688:93;17777:3;17688:93;:::i;:::-;17806:2;17801:3;17797:12;17790:19;;17449:366;;;:::o;17821:::-;17963:3;17984:67;18048:2;18043:3;17984:67;:::i;:::-;17977:74;;18060:93;18149:3;18060:93;:::i;:::-;18178:2;18173:3;18169:12;18162:19;;17821:366;;;:::o;18193:118::-;18280:24;18298:5;18280:24;:::i;:::-;18275:3;18268:37;18193:118;;:::o;18317:429::-;18494:3;18516:92;18604:3;18595:6;18516:92;:::i;:::-;18509:99;;18625:95;18716:3;18707:6;18625:95;:::i;:::-;18618:102;;18737:3;18730:10;;18317:429;;;;;:::o;18752:222::-;18845:4;18883:2;18872:9;18868:18;18860:26;;18896:71;18964:1;18953:9;18949:17;18940:6;18896:71;:::i;:::-;18752:222;;;;:::o;18980:442::-;19129:4;19167:2;19156:9;19152:18;19144:26;;19180:71;19248:1;19237:9;19233:17;19224:6;19180:71;:::i;:::-;19261:72;19329:2;19318:9;19314:18;19305:6;19261:72;:::i;:::-;19343;19411:2;19400:9;19396:18;19387:6;19343:72;:::i;:::-;18980:442;;;;;;:::o;19428:640::-;19623:4;19661:3;19650:9;19646:19;19638:27;;19675:71;19743:1;19732:9;19728:17;19719:6;19675:71;:::i;:::-;19756:72;19824:2;19813:9;19809:18;19800:6;19756:72;:::i;:::-;19838;19906:2;19895:9;19891:18;19882:6;19838:72;:::i;:::-;19957:9;19951:4;19947:20;19942:2;19931:9;19927:18;19920:48;19985:76;20056:4;20047:6;19985:76;:::i;:::-;19977:84;;19428:640;;;;;;;:::o;20074:210::-;20161:4;20199:2;20188:9;20184:18;20176:26;;20212:65;20274:1;20263:9;20259:17;20250:6;20212:65;:::i;:::-;20074:210;;;;:::o;20290:252::-;20398:4;20436:2;20425:9;20421:18;20413:26;;20449:86;20532:1;20521:9;20517:17;20508:6;20449:86;:::i;:::-;20290:252;;;;:::o;20548:313::-;20661:4;20699:2;20688:9;20684:18;20676:26;;20748:9;20742:4;20738:20;20734:1;20723:9;20719:17;20712:47;20776:78;20849:4;20840:6;20776:78;:::i;:::-;20768:86;;20548:313;;;;:::o;20867:419::-;21033:4;21071:2;21060:9;21056:18;21048:26;;21120:9;21114:4;21110:20;21106:1;21095:9;21091:17;21084:47;21148:131;21274:4;21148:131;:::i;:::-;21140:139;;20867:419;;;:::o;21292:::-;21458:4;21496:2;21485:9;21481:18;21473:26;;21545:9;21539:4;21535:20;21531:1;21520:9;21516:17;21509:47;21573:131;21699:4;21573:131;:::i;:::-;21565:139;;21292:419;;;:::o;21717:::-;21883:4;21921:2;21910:9;21906:18;21898:26;;21970:9;21964:4;21960:20;21956:1;21945:9;21941:17;21934:47;21998:131;22124:4;21998:131;:::i;:::-;21990:139;;21717:419;;;:::o;22142:::-;22308:4;22346:2;22335:9;22331:18;22323:26;;22395:9;22389:4;22385:20;22381:1;22370:9;22366:17;22359:47;22423:131;22549:4;22423:131;:::i;:::-;22415:139;;22142:419;;;:::o;22567:::-;22733:4;22771:2;22760:9;22756:18;22748:26;;22820:9;22814:4;22810:20;22806:1;22795:9;22791:17;22784:47;22848:131;22974:4;22848:131;:::i;:::-;22840:139;;22567:419;;;:::o;22992:::-;23158:4;23196:2;23185:9;23181:18;23173:26;;23245:9;23239:4;23235:20;23231:1;23220:9;23216:17;23209:47;23273:131;23399:4;23273:131;:::i;:::-;23265:139;;22992:419;;;:::o;23417:::-;23583:4;23621:2;23610:9;23606:18;23598:26;;23670:9;23664:4;23660:20;23656:1;23645:9;23641:17;23634:47;23698:131;23824:4;23698:131;:::i;:::-;23690:139;;23417:419;;;:::o;23842:::-;24008:4;24046:2;24035:9;24031:18;24023:26;;24095:9;24089:4;24085:20;24081:1;24070:9;24066:17;24059:47;24123:131;24249:4;24123:131;:::i;:::-;24115:139;;23842:419;;;:::o;24267:::-;24433:4;24471:2;24460:9;24456:18;24448:26;;24520:9;24514:4;24510:20;24506:1;24495:9;24491:17;24484:47;24548:131;24674:4;24548:131;:::i;:::-;24540:139;;24267:419;;;:::o;24692:::-;24858:4;24896:2;24885:9;24881:18;24873:26;;24945:9;24939:4;24935:20;24931:1;24920:9;24916:17;24909:47;24973:131;25099:4;24973:131;:::i;:::-;24965:139;;24692:419;;;:::o;25117:::-;25283:4;25321:2;25310:9;25306:18;25298:26;;25370:9;25364:4;25360:20;25356:1;25345:9;25341:17;25334:47;25398:131;25524:4;25398:131;:::i;:::-;25390:139;;25117:419;;;:::o;25542:::-;25708:4;25746:2;25735:9;25731:18;25723:26;;25795:9;25789:4;25785:20;25781:1;25770:9;25766:17;25759:47;25823:131;25949:4;25823:131;:::i;:::-;25815:139;;25542:419;;;:::o;25967:::-;26133:4;26171:2;26160:9;26156:18;26148:26;;26220:9;26214:4;26210:20;26206:1;26195:9;26191:17;26184:47;26248:131;26374:4;26248:131;:::i;:::-;26240:139;;25967:419;;;:::o;26392:::-;26558:4;26596:2;26585:9;26581:18;26573:26;;26645:9;26639:4;26635:20;26631:1;26620:9;26616:17;26609:47;26673:131;26799:4;26673:131;:::i;:::-;26665:139;;26392:419;;;:::o;26817:::-;26983:4;27021:2;27010:9;27006:18;26998:26;;27070:9;27064:4;27060:20;27056:1;27045:9;27041:17;27034:47;27098:131;27224:4;27098:131;:::i;:::-;27090:139;;26817:419;;;:::o;27242:::-;27408:4;27446:2;27435:9;27431:18;27423:26;;27495:9;27489:4;27485:20;27481:1;27470:9;27466:17;27459:47;27523:131;27649:4;27523:131;:::i;:::-;27515:139;;27242:419;;;:::o;27667:::-;27833:4;27871:2;27860:9;27856:18;27848:26;;27920:9;27914:4;27910:20;27906:1;27895:9;27891:17;27884:47;27948:131;28074:4;27948:131;:::i;:::-;27940:139;;27667:419;;;:::o;28092:::-;28258:4;28296:2;28285:9;28281:18;28273:26;;28345:9;28339:4;28335:20;28331:1;28320:9;28316:17;28309:47;28373:131;28499:4;28373:131;:::i;:::-;28365:139;;28092:419;;;:::o;28517:::-;28683:4;28721:2;28710:9;28706:18;28698:26;;28770:9;28764:4;28760:20;28756:1;28745:9;28741:17;28734:47;28798:131;28924:4;28798:131;:::i;:::-;28790:139;;28517:419;;;:::o;28942:::-;29108:4;29146:2;29135:9;29131:18;29123:26;;29195:9;29189:4;29185:20;29181:1;29170:9;29166:17;29159:47;29223:131;29349:4;29223:131;:::i;:::-;29215:139;;28942:419;;;:::o;29367:::-;29533:4;29571:2;29560:9;29556:18;29548:26;;29620:9;29614:4;29610:20;29606:1;29595:9;29591:17;29584:47;29648:131;29774:4;29648:131;:::i;:::-;29640:139;;29367:419;;;:::o;29792:222::-;29885:4;29923:2;29912:9;29908:18;29900:26;;29936:71;30004:1;29993:9;29989:17;29980:6;29936:71;:::i;:::-;29792:222;;;;:::o;30020:129::-;30054:6;30081:20;;:::i;:::-;30071:30;;30110:33;30138:4;30130:6;30110:33;:::i;:::-;30020:129;;;:::o;30155:75::-;30188:6;30221:2;30215:9;30205:19;;30155:75;:::o;30236:307::-;30297:4;30387:18;30379:6;30376:30;30373:56;;;30409:18;;:::i;:::-;30373:56;30447:29;30469:6;30447:29;:::i;:::-;30439:37;;30531:4;30525;30521:15;30513:23;;30236:307;;;:::o;30549:308::-;30611:4;30701:18;30693:6;30690:30;30687:56;;;30723:18;;:::i;:::-;30687:56;30761:29;30783:6;30761:29;:::i;:::-;30753:37;;30845:4;30839;30835:15;30827:23;;30549:308;;;:::o;30863:141::-;30912:4;30935:3;30927:11;;30958:3;30955:1;30948:14;30992:4;30989:1;30979:18;30971:26;;30863:141;;;:::o;31010:98::-;31061:6;31095:5;31089:12;31079:22;;31010:98;;;:::o;31114:99::-;31166:6;31200:5;31194:12;31184:22;;31114:99;;;:::o;31219:168::-;31302:11;31336:6;31331:3;31324:19;31376:4;31371:3;31367:14;31352:29;;31219:168;;;;:::o;31393:169::-;31477:11;31511:6;31506:3;31499:19;31551:4;31546:3;31542:14;31527:29;;31393:169;;;;:::o;31568:148::-;31670:11;31707:3;31692:18;;31568:148;;;;:::o;31722:305::-;31762:3;31781:20;31799:1;31781:20;:::i;:::-;31776:25;;31815:20;31833:1;31815:20;:::i;:::-;31810:25;;31969:1;31901:66;31897:74;31894:1;31891:81;31888:107;;;31975:18;;:::i;:::-;31888:107;32019:1;32016;32012:9;32005:16;;31722:305;;;;:::o;32033:185::-;32073:1;32090:20;32108:1;32090:20;:::i;:::-;32085:25;;32124:20;32142:1;32124:20;:::i;:::-;32119:25;;32163:1;32153:35;;32168:18;;:::i;:::-;32153:35;32210:1;32207;32203:9;32198:14;;32033:185;;;;:::o;32224:348::-;32264:7;32287:20;32305:1;32287:20;:::i;:::-;32282:25;;32321:20;32339:1;32321:20;:::i;:::-;32316:25;;32509:1;32441:66;32437:74;32434:1;32431:81;32426:1;32419:9;32412:17;32408:105;32405:131;;;32516:18;;:::i;:::-;32405:131;32564:1;32561;32557:9;32546:20;;32224:348;;;;:::o;32578:191::-;32618:4;32638:20;32656:1;32638:20;:::i;:::-;32633:25;;32672:20;32690:1;32672:20;:::i;:::-;32667:25;;32711:1;32708;32705:8;32702:34;;;32716:18;;:::i;:::-;32702:34;32761:1;32758;32754:9;32746:17;;32578:191;;;;:::o;32775:96::-;32812:7;32841:24;32859:5;32841:24;:::i;:::-;32830:35;;32775:96;;;:::o;32877:90::-;32911:7;32954:5;32947:13;32940:21;32929:32;;32877:90;;;:::o;32973:149::-;33009:7;33049:66;33042:5;33038:78;33027:89;;32973:149;;;:::o;33128:126::-;33165:7;33205:42;33198:5;33194:54;33183:65;;33128:126;;;:::o;33260:77::-;33297:7;33326:5;33315:16;;33260:77;;;:::o;33343:141::-;33408:9;33441:37;33472:5;33441:37;:::i;:::-;33428:50;;33343:141;;;:::o;33490:126::-;33540:9;33573:37;33604:5;33573:37;:::i;:::-;33560:50;;33490:126;;;:::o;33622:113::-;33672:9;33705:24;33723:5;33705:24;:::i;:::-;33692:37;;33622:113;;;:::o;33741:154::-;33825:6;33820:3;33815;33802:30;33887:1;33878:6;33873:3;33869:16;33862:27;33741:154;;;:::o;33901:307::-;33969:1;33979:113;33993:6;33990:1;33987:13;33979:113;;;34078:1;34073:3;34069:11;34063:18;34059:1;34054:3;34050:11;34043:39;34015:2;34012:1;34008:10;34003:15;;33979:113;;;34110:6;34107:1;34104:13;34101:101;;;34190:1;34181:6;34176:3;34172:16;34165:27;34101:101;33950:258;33901:307;;;:::o;34214:320::-;34258:6;34295:1;34289:4;34285:12;34275:22;;34342:1;34336:4;34332:12;34363:18;34353:81;;34419:4;34411:6;34407:17;34397:27;;34353:81;34481:2;34473:6;34470:14;34450:18;34447:38;34444:84;;;34500:18;;:::i;:::-;34444:84;34265:269;34214:320;;;:::o;34540:281::-;34623:27;34645:4;34623:27;:::i;:::-;34615:6;34611:40;34753:6;34741:10;34738:22;34717:18;34705:10;34702:34;34699:62;34696:88;;;34764:18;;:::i;:::-;34696:88;34804:10;34800:2;34793:22;34583:238;34540:281;;:::o;34827:233::-;34866:3;34889:24;34907:5;34889:24;:::i;:::-;34880:33;;34935:66;34928:5;34925:77;34922:103;;;35005:18;;:::i;:::-;34922:103;35052:1;35045:5;35041:13;35034:20;;34827:233;;;:::o;35066:176::-;35098:1;35115:20;35133:1;35115:20;:::i;:::-;35110:25;;35149:20;35167:1;35149:20;:::i;:::-;35144:25;;35188:1;35178:35;;35193:18;;:::i;:::-;35178:35;35234:1;35231;35227:9;35222:14;;35066:176;;;;:::o;35248:180::-;35296:77;35293:1;35286:88;35393:4;35390:1;35383:15;35417:4;35414:1;35407:15;35434:180;35482:77;35479:1;35472:88;35579:4;35576:1;35569:15;35603:4;35600:1;35593:15;35620:180;35668:77;35665:1;35658:88;35765:4;35762:1;35755:15;35789:4;35786:1;35779:15;35806:180;35854:77;35851:1;35844:88;35951:4;35948:1;35941:15;35975:4;35972:1;35965:15;35992:180;36040:77;36037:1;36030:88;36137:4;36134:1;36127:15;36161:4;36158:1;36151:15;36178:180;36226:77;36223:1;36216:88;36323:4;36320:1;36313:15;36347:4;36344:1;36337:15;36364:117;36473:1;36470;36463:12;36487:117;36596:1;36593;36586:12;36610:117;36719:1;36716;36709:12;36733:117;36842:1;36839;36832:12;36856:102;36897:6;36948:2;36944:7;36939:2;36932:5;36928:14;36924:28;36914:38;;36856:102;;;:::o;36964:230::-;37104:34;37100:1;37092:6;37088:14;37081:58;37173:13;37168:2;37160:6;37156:15;37149:38;36964:230;:::o;37200:237::-;37340:34;37336:1;37328:6;37324:14;37317:58;37409:20;37404:2;37396:6;37392:15;37385:45;37200:237;:::o;37443:225::-;37583:34;37579:1;37571:6;37567:14;37560:58;37652:8;37647:2;37639:6;37635:15;37628:33;37443:225;:::o;37674:178::-;37814:30;37810:1;37802:6;37798:14;37791:54;37674:178;:::o;37858:223::-;37998:34;37994:1;37986:6;37982:14;37975:58;38067:6;38062:2;38054:6;38050:15;38043:31;37858:223;:::o;38087:175::-;38227:27;38223:1;38215:6;38211:14;38204:51;38087:175;:::o;38268:170::-;38408:22;38404:1;38396:6;38392:14;38385:46;38268:170;:::o;38444:231::-;38584:34;38580:1;38572:6;38568:14;38561:58;38653:14;38648:2;38640:6;38636:15;38629:39;38444:231;:::o;38681:243::-;38821:34;38817:1;38809:6;38805:14;38798:58;38890:26;38885:2;38877:6;38873:15;38866:51;38681:243;:::o;38930:229::-;39070:34;39066:1;39058:6;39054:14;39047:58;39139:12;39134:2;39126:6;39122:15;39115:37;38930:229;:::o;39165:228::-;39305:34;39301:1;39293:6;39289:14;39282:58;39374:11;39369:2;39361:6;39357:15;39350:36;39165:228;:::o;39399:182::-;39539:34;39535:1;39527:6;39523:14;39516:58;39399:182;:::o;39587:172::-;39727:24;39723:1;39715:6;39711:14;39704:48;39587:172;:::o;39765:231::-;39905:34;39901:1;39893:6;39889:14;39882:58;39974:14;39969:2;39961:6;39957:15;39950:39;39765:231;:::o;40002:182::-;40142:34;40138:1;40130:6;40126:14;40119:58;40002:182;:::o;40190:228::-;40330:34;40326:1;40318:6;40314:14;40307:58;40399:11;40394:2;40386:6;40382:15;40375:36;40190:228;:::o;40424:221::-;40564:34;40560:1;40552:6;40548:14;40541:58;40633:4;40628:2;40620:6;40616:15;40609:29;40424:221;:::o;40651:220::-;40791:34;40787:1;40779:6;40775:14;40768:58;40860:3;40855:2;40847:6;40843:15;40836:28;40651:220;:::o;40877:236::-;41017:34;41013:1;41005:6;41001:14;40994:58;41086:19;41081:2;41073:6;41069:15;41062:44;40877:236;:::o;41119:231::-;41259:34;41255:1;41247:6;41243:14;41236:58;41328:14;41323:2;41315:6;41311:15;41304:39;41119:231;:::o;41356:182::-;41496:34;41492:1;41484:6;41480:14;41473:58;41356:182;:::o;41544:122::-;41617:24;41635:5;41617:24;:::i;:::-;41610:5;41607:35;41597:63;;41656:1;41653;41646:12;41597:63;41544:122;:::o;41672:116::-;41742:21;41757:5;41742:21;:::i;:::-;41735:5;41732:32;41722:60;;41778:1;41775;41768:12;41722:60;41672:116;:::o;41794:120::-;41866:23;41883:5;41866:23;:::i;:::-;41859:5;41856:34;41846:62;;41904:1;41901;41894:12;41846:62;41794:120;:::o;41920:122::-;41993:24;42011:5;41993:24;:::i;:::-;41986:5;41983:35;41973:63;;42032:1;42029;42022:12;41973:63;41920:122;:::o
Swarm Source
ipfs://a8146b56ea73f72a69c010b7fe1eca0520f8ae5e6ea80cbe6afdda2bfee7c34f
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.