ERC-721
Overview
Max Total Supply
6,382 ROOM
Holders
893
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Balance
1 ROOMLoading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
RoomsNFT
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "./SafeMath.sol"; import "./Ownable.sol"; import "./ERC721Enumerable.sol"; import "./ERC721URIStorage.sol"; contract RoomsNFT is ERC721Enumerable, ERC721URIStorage, Ownable { using SafeMath for uint256; // supply uint256 private constant _maxSupply = 8192; uint256 private constant _initPrice = 1 ether; // metadata root string private _baseTokenURI; bool private _paused = false; constructor() ERC721("Roompixes", "ROOM") { transferOwnership(0xF264f5EF4eE1F60d199f8f442623A39D9dfcfdED); require(totalSupply() == 0); } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } // public mint function mint(uint256 num) public payable { uint256 supply = totalSupply(); uint256 price = getPrice(); require(!_paused, "Paused (probably due to maintenance)"); require(num > 0 && num <= 10); require(supply.add(num) <= _maxSupply); require(msg.value >= price.mul(num)); for (uint256 i = 0; i < num; i++) { _safeMint(msg.sender, supply.add(i)); } } // can be set anytime - updates metadata location function setBaseURI(string memory baseURI) public onlyOwner { _baseTokenURI = baseURI; } function setPaused() public onlyOwner { _paused = true; } function setUnpaused() public onlyOwner { _paused = false; } function getPrice() public view returns (uint256) { uint256 supply = totalSupply(); return _initPrice.add((supply/1000).mul(1 ether)); } function withdraw() public onlyOwner { uint256 balance = address(this).balance; require(payable(msg.sender).send(balance)); } function _burn(uint256 tokenID) internal virtual override(ERC721, ERC721URIStorage) { return ERC721URIStorage._burn(tokenID); } function setTokenURI(uint256 tokenID, string memory uri) public onlyOwner() { _setTokenURI(tokenID, uri); } function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function supportsInterface(bytes4 interfaceId) public view virtual override( ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } function tokenURI(uint256 tokenID) public view override(ERC721, ERC721URIStorage) returns (string memory) { return ERC721URIStorage.tokenURI(tokenID); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @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; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./IERC721Metadata.sol"; import "./Address.sol"; import "./Context.sol"; import "./Strings.sol"; import "./ERC165.sol"; /** * @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}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ERC721.sol"; import "./IERC721Enumerable.sol"; /** * @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(); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ERC721.sol"; /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorage is ERC721 { using Strings for uint256; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @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 override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } }
// 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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @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; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @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); }
// SPDX-License-Identifier: MIT 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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
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":[{"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":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"},{"internalType":"string","name":"uri","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setUnpaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600d60006101000a81548160ff0219169083151502179055503480156200002c57600080fd5b506040518060400160405280600981526020017f526f6f6d706978657300000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f524f4f4d000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000b192919062000350565b508060019080519060200190620000ca92919062000350565b505050620000ed620000e16200013560201b60201c565b6200013d60201b60201c565b6200011273f264f5ef4ee1f60d199f8f442623a39d9dfcfded6200020360201b60201c565b6000620001246200031960201b60201c565b146200012f57600080fd5b62000580565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002136200013560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002396200032660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000292576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002899062000470565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000305576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002fc906200044e565b60405180910390fd5b62000316816200013d60201b60201c565b50565b6000600880549050905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200035e90620004a3565b90600052602060002090601f016020900481019282620003825760008555620003ce565b82601f106200039d57805160ff1916838001178555620003ce565b82800160010185558215620003ce579182015b82811115620003cd578251825591602001919060010190620003b0565b5b509050620003dd9190620003e1565b5090565b5b80821115620003fc576000816000905550600101620003e2565b5090565b60006200040f60268362000492565b91506200041c8262000508565b604082019050919050565b60006200043660208362000492565b9150620004438262000557565b602082019050919050565b60006020820190508181036000830152620004698162000400565b9050919050565b600060208201905081810360008301526200048b8162000427565b9050919050565b600082825260208201905092915050565b60006002820490506001821680620004bc57607f821691505b60208210811415620004d357620004d2620004d9565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b613fb180620005906000396000f3fe6080604052600436106101815760003560e01c806355f804b3116100d157806398d5fdca1161008a578063b88d4fde11610064578063b88d4fde14610539578063c87b56dd14610562578063e985e9c51461059f578063f2fde38b146105dc57610181565b806398d5fdca146104c9578063a0712d68146104f4578063a22cb4651461051057610181565b806355f804b3146103b95780636352211e146103e257806370a082311461041f578063715018a61461045c5780638da5cb5b1461047357806395d89b411461049e57610181565b806323b872dd1161013e5780633c89edce116101185780633c89edce146103255780633ccfd60b1461033c57806342842e0e146103535780634f6ccce71461037c57610181565b806323b872dd146102a85780632f745c59146102d157806337a66d851461030e57610181565b806301ffc9a71461018657806306fdde03146101c3578063081812fc146101ee578063095ea7b31461022b578063162094c41461025457806318160ddd1461027d575b600080fd5b34801561019257600080fd5b506101ad60048036038101906101a89190612c2d565b610605565b6040516101ba9190613193565b60405180910390f35b3480156101cf57600080fd5b506101d8610617565b6040516101e591906131ae565b60405180910390f35b3480156101fa57600080fd5b5061021560048036038101906102109190612cd0565b6106a9565b604051610222919061312c565b60405180910390f35b34801561023757600080fd5b50610252600480360381019061024d9190612bed565b61072e565b005b34801561026057600080fd5b5061027b60048036038101906102769190612cfd565b610846565b005b34801561028957600080fd5b506102926108d0565b60405161029f9190613470565b60405180910390f35b3480156102b457600080fd5b506102cf60048036038101906102ca9190612ad7565b6108dd565b005b3480156102dd57600080fd5b506102f860048036038101906102f39190612bed565b61093d565b6040516103059190613470565b60405180910390f35b34801561031a57600080fd5b506103236109e2565b005b34801561033157600080fd5b5061033a610a7b565b005b34801561034857600080fd5b50610351610b14565b005b34801561035f57600080fd5b5061037a60048036038101906103759190612ad7565b610bd6565b005b34801561038857600080fd5b506103a3600480360381019061039e9190612cd0565b610bf6565b6040516103b09190613470565b60405180910390f35b3480156103c557600080fd5b506103e060048036038101906103db9190612c87565b610c67565b005b3480156103ee57600080fd5b5061040960048036038101906104049190612cd0565b610cfd565b604051610416919061312c565b60405180910390f35b34801561042b57600080fd5b5061044660048036038101906104419190612a6a565b610daf565b6040516104539190613470565b60405180910390f35b34801561046857600080fd5b50610471610e67565b005b34801561047f57600080fd5b50610488610eef565b604051610495919061312c565b60405180910390f35b3480156104aa57600080fd5b506104b3610f19565b6040516104c091906131ae565b60405180910390f35b3480156104d557600080fd5b506104de610fab565b6040516104eb9190613470565b60405180910390f35b61050e60048036038101906105099190612cd0565b611000565b005b34801561051c57600080fd5b5061053760048036038101906105329190612bad565b611102565b005b34801561054557600080fd5b50610560600480360381019061055b9190612b2a565b611283565b005b34801561056e57600080fd5b5061058960048036038101906105849190612cd0565b6112e5565b60405161059691906131ae565b60405180910390f35b3480156105ab57600080fd5b506105c660048036038101906105c19190612a97565b6112f7565b6040516105d39190613193565b60405180910390f35b3480156105e857600080fd5b5061060360048036038101906105fe9190612a6a565b61138b565b005b600061061082611483565b9050919050565b60606000805461062690613720565b80601f016020809104026020016040519081016040528092919081815260200182805461065290613720565b801561069f5780601f106106745761010080835404028352916020019161069f565b820191906000526020600020905b81548152906001019060200180831161068257829003601f168201915b5050505050905090565b60006106b4826114fd565b6106f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ea90613390565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061073982610cfd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a190613410565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107c9611569565b73ffffffffffffffffffffffffffffffffffffffff1614806107f857506107f7816107f2611569565b6112f7565b5b610837576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082e906132b0565b60405180910390fd5b6108418383611571565b505050565b61084e611569565b73ffffffffffffffffffffffffffffffffffffffff1661086c610eef565b73ffffffffffffffffffffffffffffffffffffffff16146108c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b9906133b0565b60405180910390fd5b6108cc828261162a565b5050565b6000600880549050905090565b6108ee6108e8611569565b8261169e565b61092d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092490613430565b60405180910390fd5b61093883838361177c565b505050565b600061094883610daf565b8210610989576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610980906131d0565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6109ea611569565b73ffffffffffffffffffffffffffffffffffffffff16610a08610eef565b73ffffffffffffffffffffffffffffffffffffffff1614610a5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a55906133b0565b60405180910390fd5b6001600d60006101000a81548160ff021916908315150217905550565b610a83611569565b73ffffffffffffffffffffffffffffffffffffffff16610aa1610eef565b73ffffffffffffffffffffffffffffffffffffffff1614610af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aee906133b0565b60405180910390fd5b6000600d60006101000a81548160ff021916908315150217905550565b610b1c611569565b73ffffffffffffffffffffffffffffffffffffffff16610b3a610eef565b73ffffffffffffffffffffffffffffffffffffffff1614610b90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b87906133b0565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050610bd357600080fd5b50565b610bf183838360405180602001604052806000815250611283565b505050565b6000610c006108d0565b8210610c41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3890613450565b60405180910390fd5b60088281548110610c5557610c546138b9565b5b90600052602060002001549050919050565b610c6f611569565b73ffffffffffffffffffffffffffffffffffffffff16610c8d610eef565b73ffffffffffffffffffffffffffffffffffffffff1614610ce3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cda906133b0565b60405180910390fd5b80600c9080519060200190610cf992919061287e565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610da6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9d906132f0565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e17906132d0565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e6f611569565b73ffffffffffffffffffffffffffffffffffffffff16610e8d610eef565b73ffffffffffffffffffffffffffffffffffffffff1614610ee3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eda906133b0565b60405180910390fd5b610eed60006119d8565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610f2890613720565b80601f0160208091040260200160405190810160405280929190818152602001828054610f5490613720565b8015610fa15780601f10610f7657610100808354040283529160200191610fa1565b820191906000526020600020905b815481529060010190602001808311610f8457829003601f168201915b5050505050905090565b600080610fb66108d0565b9050610ffa610fe3670de0b6b3a76400006103e884610fd591906135ab565b611a9e90919063ffffffff16565b670de0b6b3a7640000611ab490919063ffffffff16565b91505090565b600061100a6108d0565b90506000611016610fab565b9050600d60009054906101000a900460ff1615611068576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105f90613350565b60405180910390fd5b6000831180156110795750600a8311155b61108257600080fd5b6120006110988484611ab490919063ffffffff16565b11156110a357600080fd5b6110b68382611a9e90919063ffffffff16565b3410156110c257600080fd5b60005b838110156110fc576110e9336110e48386611ab490919063ffffffff16565b611aca565b80806110f490613783565b9150506110c5565b50505050565b61110a611569565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116f90613270565b60405180910390fd5b8060056000611185611569565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611232611569565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112779190613193565b60405180910390a35050565b61129461128e611569565b8361169e565b6112d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ca90613430565b60405180910390fd5b6112df84848484611ae8565b50505050565b60606112f082611b44565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611393611569565b73ffffffffffffffffffffffffffffffffffffffff166113b1610eef565b73ffffffffffffffffffffffffffffffffffffffff1614611407576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fe906133b0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146e90613210565b60405180910390fd5b611480816119d8565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806114f657506114f582611c96565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166115e483610cfd565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611633826114fd565b611672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166990613310565b60405180910390fd5b80600a6000848152602001908152602001600020908051906020019061169992919061287e565b505050565b60006116a9826114fd565b6116e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116df90613290565b60405180910390fd5b60006116f383610cfd565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061176257508373ffffffffffffffffffffffffffffffffffffffff1661174a846106a9565b73ffffffffffffffffffffffffffffffffffffffff16145b80611773575061177281856112f7565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661179c82610cfd565b73ffffffffffffffffffffffffffffffffffffffff16146117f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e9906133d0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611862576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185990613250565b60405180910390fd5b61186d838383611d78565b611878600082611571565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118c89190613636565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461191f9190613555565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008183611aac91906135dc565b905092915050565b60008183611ac29190613555565b905092915050565b611ae4828260405180602001604052806000815250611d88565b5050565b611af384848461177c565b611aff84848484611de3565b611b3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b35906131f0565b60405180910390fd5b50505050565b6060611b4f826114fd565b611b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8590613370565b60405180910390fd5b6000600a60008481526020019081526020016000208054611bae90613720565b80601f0160208091040260200160405190810160405280929190818152602001828054611bda90613720565b8015611c275780601f10611bfc57610100808354040283529160200191611c27565b820191906000526020600020905b815481529060010190602001808311611c0a57829003601f168201915b505050505090506000611c38611f7a565b9050600081511415611c4e578192505050611c91565b600082511115611c83578082604051602001611c6b929190613108565b60405160208183030381529060405292505050611c91565b611c8c8461200c565b925050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d6157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611d715750611d70826120b3565b5b9050919050565b611d8383838361211d565b505050565b611d928383612231565b611d9f6000848484611de3565b611dde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd5906131f0565b60405180910390fd5b505050565b6000611e048473ffffffffffffffffffffffffffffffffffffffff166123ff565b15611f6d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611e2d611569565b8786866040518563ffffffff1660e01b8152600401611e4f9493929190613147565b602060405180830381600087803b158015611e6957600080fd5b505af1925050508015611e9a57506040513d601f19601f82011682018060405250810190611e979190612c5a565b60015b611f1d573d8060008114611eca576040519150601f19603f3d011682016040523d82523d6000602084013e611ecf565b606091505b50600081511415611f15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0c906131f0565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611f72565b600190505b949350505050565b6060600c8054611f8990613720565b80601f0160208091040260200160405190810160405280929190818152602001828054611fb590613720565b80156120025780601f10611fd757610100808354040283529160200191612002565b820191906000526020600020905b815481529060010190602001808311611fe557829003601f168201915b5050505050905090565b6060612017826114fd565b612056576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204d906133f0565b60405180910390fd5b6000612060611f7a565b9050600081511161208057604051806020016040528060008152506120ab565b8061208a84612412565b60405160200161209b929190613108565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612128838383612573565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561216b5761216681612578565b6121aa565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146121a9576121a883826125c1565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121ed576121e88161272e565b61222c565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461222b5761222a82826127ff565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229890613330565b60405180910390fd5b6122aa816114fd565b156122ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e190613230565b60405180910390fd5b6122f660008383611d78565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123469190613555565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6060600082141561245a576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061256e565b600082905060005b6000821461248c57808061247590613783565b915050600a8261248591906135ab565b9150612462565b60008167ffffffffffffffff8111156124a8576124a76138e8565b5b6040519080825280601f01601f1916602001820160405280156124da5781602001600182028036833780820191505090505b5090505b60008514612567576001826124f39190613636565b9150600a8561250291906137cc565b603061250e9190613555565b60f81b818381518110612524576125236138b9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561256091906135ab565b94506124de565b8093505050505b919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016125ce84610daf565b6125d89190613636565b90506000600760008481526020019081526020016000205490508181146126bd576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506127429190613636565b9050600060096000848152602001908152602001600020549050600060088381548110612772576127716138b9565b5b906000526020600020015490508060088381548110612794576127936138b9565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806127e3576127e261388a565b5b6001900381819060005260206000200160009055905550505050565b600061280a83610daf565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461288a90613720565b90600052602060002090601f0160209004810192826128ac57600085556128f3565b82601f106128c557805160ff19168380011785556128f3565b828001600101855582156128f3579182015b828111156128f25782518255916020019190600101906128d7565b5b5090506129009190612904565b5090565b5b8082111561291d576000816000905550600101612905565b5090565b600061293461292f846134b0565b61348b565b9050828152602081018484840111156129505761294f61391c565b5b61295b8482856136de565b509392505050565b6000612976612971846134e1565b61348b565b9050828152602081018484840111156129925761299161391c565b5b61299d8482856136de565b509392505050565b6000813590506129b481613f1f565b92915050565b6000813590506129c981613f36565b92915050565b6000813590506129de81613f4d565b92915050565b6000815190506129f381613f4d565b92915050565b600082601f830112612a0e57612a0d613917565b5b8135612a1e848260208601612921565b91505092915050565b600082601f830112612a3c57612a3b613917565b5b8135612a4c848260208601612963565b91505092915050565b600081359050612a6481613f64565b92915050565b600060208284031215612a8057612a7f613926565b5b6000612a8e848285016129a5565b91505092915050565b60008060408385031215612aae57612aad613926565b5b6000612abc858286016129a5565b9250506020612acd858286016129a5565b9150509250929050565b600080600060608486031215612af057612aef613926565b5b6000612afe868287016129a5565b9350506020612b0f868287016129a5565b9250506040612b2086828701612a55565b9150509250925092565b60008060008060808587031215612b4457612b43613926565b5b6000612b52878288016129a5565b9450506020612b63878288016129a5565b9350506040612b7487828801612a55565b925050606085013567ffffffffffffffff811115612b9557612b94613921565b5b612ba1878288016129f9565b91505092959194509250565b60008060408385031215612bc457612bc3613926565b5b6000612bd2858286016129a5565b9250506020612be3858286016129ba565b9150509250929050565b60008060408385031215612c0457612c03613926565b5b6000612c12858286016129a5565b9250506020612c2385828601612a55565b9150509250929050565b600060208284031215612c4357612c42613926565b5b6000612c51848285016129cf565b91505092915050565b600060208284031215612c7057612c6f613926565b5b6000612c7e848285016129e4565b91505092915050565b600060208284031215612c9d57612c9c613926565b5b600082013567ffffffffffffffff811115612cbb57612cba613921565b5b612cc784828501612a27565b91505092915050565b600060208284031215612ce657612ce5613926565b5b6000612cf484828501612a55565b91505092915050565b60008060408385031215612d1457612d13613926565b5b6000612d2285828601612a55565b925050602083013567ffffffffffffffff811115612d4357612d42613921565b5b612d4f85828601612a27565b9150509250929050565b612d628161366a565b82525050565b612d718161367c565b82525050565b6000612d8282613512565b612d8c8185613528565b9350612d9c8185602086016136ed565b612da58161392b565b840191505092915050565b6000612dbb8261351d565b612dc58185613539565b9350612dd58185602086016136ed565b612dde8161392b565b840191505092915050565b6000612df48261351d565b612dfe818561354a565b9350612e0e8185602086016136ed565b80840191505092915050565b6000612e27602b83613539565b9150612e328261393c565b604082019050919050565b6000612e4a603283613539565b9150612e558261398b565b604082019050919050565b6000612e6d602683613539565b9150612e78826139da565b604082019050919050565b6000612e90601c83613539565b9150612e9b82613a29565b602082019050919050565b6000612eb3602483613539565b9150612ebe82613a52565b604082019050919050565b6000612ed6601983613539565b9150612ee182613aa1565b602082019050919050565b6000612ef9602c83613539565b9150612f0482613aca565b604082019050919050565b6000612f1c603883613539565b9150612f2782613b19565b604082019050919050565b6000612f3f602a83613539565b9150612f4a82613b68565b604082019050919050565b6000612f62602983613539565b9150612f6d82613bb7565b604082019050919050565b6000612f85602e83613539565b9150612f9082613c06565b604082019050919050565b6000612fa8602083613539565b9150612fb382613c55565b602082019050919050565b6000612fcb602483613539565b9150612fd682613c7e565b604082019050919050565b6000612fee603183613539565b9150612ff982613ccd565b604082019050919050565b6000613011602c83613539565b915061301c82613d1c565b604082019050919050565b6000613034602083613539565b915061303f82613d6b565b602082019050919050565b6000613057602983613539565b915061306282613d94565b604082019050919050565b600061307a602f83613539565b915061308582613de3565b604082019050919050565b600061309d602183613539565b91506130a882613e32565b604082019050919050565b60006130c0603183613539565b91506130cb82613e81565b604082019050919050565b60006130e3602c83613539565b91506130ee82613ed0565b604082019050919050565b613102816136d4565b82525050565b60006131148285612de9565b91506131208284612de9565b91508190509392505050565b60006020820190506131416000830184612d59565b92915050565b600060808201905061315c6000830187612d59565b6131696020830186612d59565b61317660408301856130f9565b81810360608301526131888184612d77565b905095945050505050565b60006020820190506131a86000830184612d68565b92915050565b600060208201905081810360008301526131c88184612db0565b905092915050565b600060208201905081810360008301526131e981612e1a565b9050919050565b6000602082019050818103600083015261320981612e3d565b9050919050565b6000602082019050818103600083015261322981612e60565b9050919050565b6000602082019050818103600083015261324981612e83565b9050919050565b6000602082019050818103600083015261326981612ea6565b9050919050565b6000602082019050818103600083015261328981612ec9565b9050919050565b600060208201905081810360008301526132a981612eec565b9050919050565b600060208201905081810360008301526132c981612f0f565b9050919050565b600060208201905081810360008301526132e981612f32565b9050919050565b6000602082019050818103600083015261330981612f55565b9050919050565b6000602082019050818103600083015261332981612f78565b9050919050565b6000602082019050818103600083015261334981612f9b565b9050919050565b6000602082019050818103600083015261336981612fbe565b9050919050565b6000602082019050818103600083015261338981612fe1565b9050919050565b600060208201905081810360008301526133a981613004565b9050919050565b600060208201905081810360008301526133c981613027565b9050919050565b600060208201905081810360008301526133e98161304a565b9050919050565b600060208201905081810360008301526134098161306d565b9050919050565b6000602082019050818103600083015261342981613090565b9050919050565b60006020820190508181036000830152613449816130b3565b9050919050565b60006020820190508181036000830152613469816130d6565b9050919050565b600060208201905061348560008301846130f9565b92915050565b60006134956134a6565b90506134a18282613752565b919050565b6000604051905090565b600067ffffffffffffffff8211156134cb576134ca6138e8565b5b6134d48261392b565b9050602081019050919050565b600067ffffffffffffffff8211156134fc576134fb6138e8565b5b6135058261392b565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613560826136d4565b915061356b836136d4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156135a05761359f6137fd565b5b828201905092915050565b60006135b6826136d4565b91506135c1836136d4565b9250826135d1576135d061382c565b5b828204905092915050565b60006135e7826136d4565b91506135f2836136d4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561362b5761362a6137fd565b5b828202905092915050565b6000613641826136d4565b915061364c836136d4565b92508282101561365f5761365e6137fd565b5b828203905092915050565b6000613675826136b4565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561370b5780820151818401526020810190506136f0565b8381111561371a576000848401525b50505050565b6000600282049050600182168061373857607f821691505b6020821081141561374c5761374b61385b565b5b50919050565b61375b8261392b565b810181811067ffffffffffffffff8211171561377a576137796138e8565b5b80604052505050565b600061378e826136d4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156137c1576137c06137fd565b5b600182019050919050565b60006137d7826136d4565b91506137e2836136d4565b9250826137f2576137f161382c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f506175736564202870726f6261626c792064756520746f206d61696e74656e6160008201527f6e63652900000000000000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b613f288161366a565b8114613f3357600080fd5b50565b613f3f8161367c565b8114613f4a57600080fd5b50565b613f5681613688565b8114613f6157600080fd5b50565b613f6d816136d4565b8114613f7857600080fd5b5056fea2646970667358221220d20a35aa7a009b99c967df9f95f4accfe52a46731be52343d89501ffdd1ed16964736f6c63430008070033
Deployed Bytecode
0x6080604052600436106101815760003560e01c806355f804b3116100d157806398d5fdca1161008a578063b88d4fde11610064578063b88d4fde14610539578063c87b56dd14610562578063e985e9c51461059f578063f2fde38b146105dc57610181565b806398d5fdca146104c9578063a0712d68146104f4578063a22cb4651461051057610181565b806355f804b3146103b95780636352211e146103e257806370a082311461041f578063715018a61461045c5780638da5cb5b1461047357806395d89b411461049e57610181565b806323b872dd1161013e5780633c89edce116101185780633c89edce146103255780633ccfd60b1461033c57806342842e0e146103535780634f6ccce71461037c57610181565b806323b872dd146102a85780632f745c59146102d157806337a66d851461030e57610181565b806301ffc9a71461018657806306fdde03146101c3578063081812fc146101ee578063095ea7b31461022b578063162094c41461025457806318160ddd1461027d575b600080fd5b34801561019257600080fd5b506101ad60048036038101906101a89190612c2d565b610605565b6040516101ba9190613193565b60405180910390f35b3480156101cf57600080fd5b506101d8610617565b6040516101e591906131ae565b60405180910390f35b3480156101fa57600080fd5b5061021560048036038101906102109190612cd0565b6106a9565b604051610222919061312c565b60405180910390f35b34801561023757600080fd5b50610252600480360381019061024d9190612bed565b61072e565b005b34801561026057600080fd5b5061027b60048036038101906102769190612cfd565b610846565b005b34801561028957600080fd5b506102926108d0565b60405161029f9190613470565b60405180910390f35b3480156102b457600080fd5b506102cf60048036038101906102ca9190612ad7565b6108dd565b005b3480156102dd57600080fd5b506102f860048036038101906102f39190612bed565b61093d565b6040516103059190613470565b60405180910390f35b34801561031a57600080fd5b506103236109e2565b005b34801561033157600080fd5b5061033a610a7b565b005b34801561034857600080fd5b50610351610b14565b005b34801561035f57600080fd5b5061037a60048036038101906103759190612ad7565b610bd6565b005b34801561038857600080fd5b506103a3600480360381019061039e9190612cd0565b610bf6565b6040516103b09190613470565b60405180910390f35b3480156103c557600080fd5b506103e060048036038101906103db9190612c87565b610c67565b005b3480156103ee57600080fd5b5061040960048036038101906104049190612cd0565b610cfd565b604051610416919061312c565b60405180910390f35b34801561042b57600080fd5b5061044660048036038101906104419190612a6a565b610daf565b6040516104539190613470565b60405180910390f35b34801561046857600080fd5b50610471610e67565b005b34801561047f57600080fd5b50610488610eef565b604051610495919061312c565b60405180910390f35b3480156104aa57600080fd5b506104b3610f19565b6040516104c091906131ae565b60405180910390f35b3480156104d557600080fd5b506104de610fab565b6040516104eb9190613470565b60405180910390f35b61050e60048036038101906105099190612cd0565b611000565b005b34801561051c57600080fd5b5061053760048036038101906105329190612bad565b611102565b005b34801561054557600080fd5b50610560600480360381019061055b9190612b2a565b611283565b005b34801561056e57600080fd5b5061058960048036038101906105849190612cd0565b6112e5565b60405161059691906131ae565b60405180910390f35b3480156105ab57600080fd5b506105c660048036038101906105c19190612a97565b6112f7565b6040516105d39190613193565b60405180910390f35b3480156105e857600080fd5b5061060360048036038101906105fe9190612a6a565b61138b565b005b600061061082611483565b9050919050565b60606000805461062690613720565b80601f016020809104026020016040519081016040528092919081815260200182805461065290613720565b801561069f5780601f106106745761010080835404028352916020019161069f565b820191906000526020600020905b81548152906001019060200180831161068257829003601f168201915b5050505050905090565b60006106b4826114fd565b6106f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ea90613390565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061073982610cfd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a190613410565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107c9611569565b73ffffffffffffffffffffffffffffffffffffffff1614806107f857506107f7816107f2611569565b6112f7565b5b610837576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082e906132b0565b60405180910390fd5b6108418383611571565b505050565b61084e611569565b73ffffffffffffffffffffffffffffffffffffffff1661086c610eef565b73ffffffffffffffffffffffffffffffffffffffff16146108c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b9906133b0565b60405180910390fd5b6108cc828261162a565b5050565b6000600880549050905090565b6108ee6108e8611569565b8261169e565b61092d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092490613430565b60405180910390fd5b61093883838361177c565b505050565b600061094883610daf565b8210610989576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610980906131d0565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6109ea611569565b73ffffffffffffffffffffffffffffffffffffffff16610a08610eef565b73ffffffffffffffffffffffffffffffffffffffff1614610a5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a55906133b0565b60405180910390fd5b6001600d60006101000a81548160ff021916908315150217905550565b610a83611569565b73ffffffffffffffffffffffffffffffffffffffff16610aa1610eef565b73ffffffffffffffffffffffffffffffffffffffff1614610af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aee906133b0565b60405180910390fd5b6000600d60006101000a81548160ff021916908315150217905550565b610b1c611569565b73ffffffffffffffffffffffffffffffffffffffff16610b3a610eef565b73ffffffffffffffffffffffffffffffffffffffff1614610b90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b87906133b0565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050610bd357600080fd5b50565b610bf183838360405180602001604052806000815250611283565b505050565b6000610c006108d0565b8210610c41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3890613450565b60405180910390fd5b60088281548110610c5557610c546138b9565b5b90600052602060002001549050919050565b610c6f611569565b73ffffffffffffffffffffffffffffffffffffffff16610c8d610eef565b73ffffffffffffffffffffffffffffffffffffffff1614610ce3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cda906133b0565b60405180910390fd5b80600c9080519060200190610cf992919061287e565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610da6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9d906132f0565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e17906132d0565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e6f611569565b73ffffffffffffffffffffffffffffffffffffffff16610e8d610eef565b73ffffffffffffffffffffffffffffffffffffffff1614610ee3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eda906133b0565b60405180910390fd5b610eed60006119d8565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610f2890613720565b80601f0160208091040260200160405190810160405280929190818152602001828054610f5490613720565b8015610fa15780601f10610f7657610100808354040283529160200191610fa1565b820191906000526020600020905b815481529060010190602001808311610f8457829003601f168201915b5050505050905090565b600080610fb66108d0565b9050610ffa610fe3670de0b6b3a76400006103e884610fd591906135ab565b611a9e90919063ffffffff16565b670de0b6b3a7640000611ab490919063ffffffff16565b91505090565b600061100a6108d0565b90506000611016610fab565b9050600d60009054906101000a900460ff1615611068576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105f90613350565b60405180910390fd5b6000831180156110795750600a8311155b61108257600080fd5b6120006110988484611ab490919063ffffffff16565b11156110a357600080fd5b6110b68382611a9e90919063ffffffff16565b3410156110c257600080fd5b60005b838110156110fc576110e9336110e48386611ab490919063ffffffff16565b611aca565b80806110f490613783565b9150506110c5565b50505050565b61110a611569565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116f90613270565b60405180910390fd5b8060056000611185611569565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611232611569565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112779190613193565b60405180910390a35050565b61129461128e611569565b8361169e565b6112d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ca90613430565b60405180910390fd5b6112df84848484611ae8565b50505050565b60606112f082611b44565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611393611569565b73ffffffffffffffffffffffffffffffffffffffff166113b1610eef565b73ffffffffffffffffffffffffffffffffffffffff1614611407576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fe906133b0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146e90613210565b60405180910390fd5b611480816119d8565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806114f657506114f582611c96565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166115e483610cfd565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611633826114fd565b611672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166990613310565b60405180910390fd5b80600a6000848152602001908152602001600020908051906020019061169992919061287e565b505050565b60006116a9826114fd565b6116e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116df90613290565b60405180910390fd5b60006116f383610cfd565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061176257508373ffffffffffffffffffffffffffffffffffffffff1661174a846106a9565b73ffffffffffffffffffffffffffffffffffffffff16145b80611773575061177281856112f7565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661179c82610cfd565b73ffffffffffffffffffffffffffffffffffffffff16146117f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e9906133d0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611862576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185990613250565b60405180910390fd5b61186d838383611d78565b611878600082611571565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118c89190613636565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461191f9190613555565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008183611aac91906135dc565b905092915050565b60008183611ac29190613555565b905092915050565b611ae4828260405180602001604052806000815250611d88565b5050565b611af384848461177c565b611aff84848484611de3565b611b3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b35906131f0565b60405180910390fd5b50505050565b6060611b4f826114fd565b611b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8590613370565b60405180910390fd5b6000600a60008481526020019081526020016000208054611bae90613720565b80601f0160208091040260200160405190810160405280929190818152602001828054611bda90613720565b8015611c275780601f10611bfc57610100808354040283529160200191611c27565b820191906000526020600020905b815481529060010190602001808311611c0a57829003601f168201915b505050505090506000611c38611f7a565b9050600081511415611c4e578192505050611c91565b600082511115611c83578082604051602001611c6b929190613108565b60405160208183030381529060405292505050611c91565b611c8c8461200c565b925050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d6157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611d715750611d70826120b3565b5b9050919050565b611d8383838361211d565b505050565b611d928383612231565b611d9f6000848484611de3565b611dde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd5906131f0565b60405180910390fd5b505050565b6000611e048473ffffffffffffffffffffffffffffffffffffffff166123ff565b15611f6d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611e2d611569565b8786866040518563ffffffff1660e01b8152600401611e4f9493929190613147565b602060405180830381600087803b158015611e6957600080fd5b505af1925050508015611e9a57506040513d601f19601f82011682018060405250810190611e979190612c5a565b60015b611f1d573d8060008114611eca576040519150601f19603f3d011682016040523d82523d6000602084013e611ecf565b606091505b50600081511415611f15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0c906131f0565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611f72565b600190505b949350505050565b6060600c8054611f8990613720565b80601f0160208091040260200160405190810160405280929190818152602001828054611fb590613720565b80156120025780601f10611fd757610100808354040283529160200191612002565b820191906000526020600020905b815481529060010190602001808311611fe557829003601f168201915b5050505050905090565b6060612017826114fd565b612056576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204d906133f0565b60405180910390fd5b6000612060611f7a565b9050600081511161208057604051806020016040528060008152506120ab565b8061208a84612412565b60405160200161209b929190613108565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612128838383612573565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561216b5761216681612578565b6121aa565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146121a9576121a883826125c1565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121ed576121e88161272e565b61222c565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461222b5761222a82826127ff565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229890613330565b60405180910390fd5b6122aa816114fd565b156122ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e190613230565b60405180910390fd5b6122f660008383611d78565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123469190613555565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6060600082141561245a576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061256e565b600082905060005b6000821461248c57808061247590613783565b915050600a8261248591906135ab565b9150612462565b60008167ffffffffffffffff8111156124a8576124a76138e8565b5b6040519080825280601f01601f1916602001820160405280156124da5781602001600182028036833780820191505090505b5090505b60008514612567576001826124f39190613636565b9150600a8561250291906137cc565b603061250e9190613555565b60f81b818381518110612524576125236138b9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561256091906135ab565b94506124de565b8093505050505b919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016125ce84610daf565b6125d89190613636565b90506000600760008481526020019081526020016000205490508181146126bd576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506127429190613636565b9050600060096000848152602001908152602001600020549050600060088381548110612772576127716138b9565b5b906000526020600020015490508060088381548110612794576127936138b9565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806127e3576127e261388a565b5b6001900381819060005260206000200160009055905550505050565b600061280a83610daf565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461288a90613720565b90600052602060002090601f0160209004810192826128ac57600085556128f3565b82601f106128c557805160ff19168380011785556128f3565b828001600101855582156128f3579182015b828111156128f25782518255916020019190600101906128d7565b5b5090506129009190612904565b5090565b5b8082111561291d576000816000905550600101612905565b5090565b600061293461292f846134b0565b61348b565b9050828152602081018484840111156129505761294f61391c565b5b61295b8482856136de565b509392505050565b6000612976612971846134e1565b61348b565b9050828152602081018484840111156129925761299161391c565b5b61299d8482856136de565b509392505050565b6000813590506129b481613f1f565b92915050565b6000813590506129c981613f36565b92915050565b6000813590506129de81613f4d565b92915050565b6000815190506129f381613f4d565b92915050565b600082601f830112612a0e57612a0d613917565b5b8135612a1e848260208601612921565b91505092915050565b600082601f830112612a3c57612a3b613917565b5b8135612a4c848260208601612963565b91505092915050565b600081359050612a6481613f64565b92915050565b600060208284031215612a8057612a7f613926565b5b6000612a8e848285016129a5565b91505092915050565b60008060408385031215612aae57612aad613926565b5b6000612abc858286016129a5565b9250506020612acd858286016129a5565b9150509250929050565b600080600060608486031215612af057612aef613926565b5b6000612afe868287016129a5565b9350506020612b0f868287016129a5565b9250506040612b2086828701612a55565b9150509250925092565b60008060008060808587031215612b4457612b43613926565b5b6000612b52878288016129a5565b9450506020612b63878288016129a5565b9350506040612b7487828801612a55565b925050606085013567ffffffffffffffff811115612b9557612b94613921565b5b612ba1878288016129f9565b91505092959194509250565b60008060408385031215612bc457612bc3613926565b5b6000612bd2858286016129a5565b9250506020612be3858286016129ba565b9150509250929050565b60008060408385031215612c0457612c03613926565b5b6000612c12858286016129a5565b9250506020612c2385828601612a55565b9150509250929050565b600060208284031215612c4357612c42613926565b5b6000612c51848285016129cf565b91505092915050565b600060208284031215612c7057612c6f613926565b5b6000612c7e848285016129e4565b91505092915050565b600060208284031215612c9d57612c9c613926565b5b600082013567ffffffffffffffff811115612cbb57612cba613921565b5b612cc784828501612a27565b91505092915050565b600060208284031215612ce657612ce5613926565b5b6000612cf484828501612a55565b91505092915050565b60008060408385031215612d1457612d13613926565b5b6000612d2285828601612a55565b925050602083013567ffffffffffffffff811115612d4357612d42613921565b5b612d4f85828601612a27565b9150509250929050565b612d628161366a565b82525050565b612d718161367c565b82525050565b6000612d8282613512565b612d8c8185613528565b9350612d9c8185602086016136ed565b612da58161392b565b840191505092915050565b6000612dbb8261351d565b612dc58185613539565b9350612dd58185602086016136ed565b612dde8161392b565b840191505092915050565b6000612df48261351d565b612dfe818561354a565b9350612e0e8185602086016136ed565b80840191505092915050565b6000612e27602b83613539565b9150612e328261393c565b604082019050919050565b6000612e4a603283613539565b9150612e558261398b565b604082019050919050565b6000612e6d602683613539565b9150612e78826139da565b604082019050919050565b6000612e90601c83613539565b9150612e9b82613a29565b602082019050919050565b6000612eb3602483613539565b9150612ebe82613a52565b604082019050919050565b6000612ed6601983613539565b9150612ee182613aa1565b602082019050919050565b6000612ef9602c83613539565b9150612f0482613aca565b604082019050919050565b6000612f1c603883613539565b9150612f2782613b19565b604082019050919050565b6000612f3f602a83613539565b9150612f4a82613b68565b604082019050919050565b6000612f62602983613539565b9150612f6d82613bb7565b604082019050919050565b6000612f85602e83613539565b9150612f9082613c06565b604082019050919050565b6000612fa8602083613539565b9150612fb382613c55565b602082019050919050565b6000612fcb602483613539565b9150612fd682613c7e565b604082019050919050565b6000612fee603183613539565b9150612ff982613ccd565b604082019050919050565b6000613011602c83613539565b915061301c82613d1c565b604082019050919050565b6000613034602083613539565b915061303f82613d6b565b602082019050919050565b6000613057602983613539565b915061306282613d94565b604082019050919050565b600061307a602f83613539565b915061308582613de3565b604082019050919050565b600061309d602183613539565b91506130a882613e32565b604082019050919050565b60006130c0603183613539565b91506130cb82613e81565b604082019050919050565b60006130e3602c83613539565b91506130ee82613ed0565b604082019050919050565b613102816136d4565b82525050565b60006131148285612de9565b91506131208284612de9565b91508190509392505050565b60006020820190506131416000830184612d59565b92915050565b600060808201905061315c6000830187612d59565b6131696020830186612d59565b61317660408301856130f9565b81810360608301526131888184612d77565b905095945050505050565b60006020820190506131a86000830184612d68565b92915050565b600060208201905081810360008301526131c88184612db0565b905092915050565b600060208201905081810360008301526131e981612e1a565b9050919050565b6000602082019050818103600083015261320981612e3d565b9050919050565b6000602082019050818103600083015261322981612e60565b9050919050565b6000602082019050818103600083015261324981612e83565b9050919050565b6000602082019050818103600083015261326981612ea6565b9050919050565b6000602082019050818103600083015261328981612ec9565b9050919050565b600060208201905081810360008301526132a981612eec565b9050919050565b600060208201905081810360008301526132c981612f0f565b9050919050565b600060208201905081810360008301526132e981612f32565b9050919050565b6000602082019050818103600083015261330981612f55565b9050919050565b6000602082019050818103600083015261332981612f78565b9050919050565b6000602082019050818103600083015261334981612f9b565b9050919050565b6000602082019050818103600083015261336981612fbe565b9050919050565b6000602082019050818103600083015261338981612fe1565b9050919050565b600060208201905081810360008301526133a981613004565b9050919050565b600060208201905081810360008301526133c981613027565b9050919050565b600060208201905081810360008301526133e98161304a565b9050919050565b600060208201905081810360008301526134098161306d565b9050919050565b6000602082019050818103600083015261342981613090565b9050919050565b60006020820190508181036000830152613449816130b3565b9050919050565b60006020820190508181036000830152613469816130d6565b9050919050565b600060208201905061348560008301846130f9565b92915050565b60006134956134a6565b90506134a18282613752565b919050565b6000604051905090565b600067ffffffffffffffff8211156134cb576134ca6138e8565b5b6134d48261392b565b9050602081019050919050565b600067ffffffffffffffff8211156134fc576134fb6138e8565b5b6135058261392b565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613560826136d4565b915061356b836136d4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156135a05761359f6137fd565b5b828201905092915050565b60006135b6826136d4565b91506135c1836136d4565b9250826135d1576135d061382c565b5b828204905092915050565b60006135e7826136d4565b91506135f2836136d4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561362b5761362a6137fd565b5b828202905092915050565b6000613641826136d4565b915061364c836136d4565b92508282101561365f5761365e6137fd565b5b828203905092915050565b6000613675826136b4565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561370b5780820151818401526020810190506136f0565b8381111561371a576000848401525b50505050565b6000600282049050600182168061373857607f821691505b6020821081141561374c5761374b61385b565b5b50919050565b61375b8261392b565b810181811067ffffffffffffffff8211171561377a576137796138e8565b5b80604052505050565b600061378e826136d4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156137c1576137c06137fd565b5b600182019050919050565b60006137d7826136d4565b91506137e2836136d4565b9250826137f2576137f161382c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f506175736564202870726f6261626c792064756520746f206d61696e74656e6160008201527f6e63652900000000000000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b613f288161366a565b8114613f3357600080fd5b50565b613f3f8161367c565b8114613f4a57600080fd5b50565b613f5681613688565b8114613f6157600080fd5b50565b613f6d816136d4565b8114613f7857600080fd5b5056fea2646970667358221220d20a35aa7a009b99c967df9f95f4accfe52a46731be52343d89501ffdd1ed16964736f6c63430008070033
Deployed Bytecode Sourcemap
173:2525:12:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2348:178;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2349:98:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3860:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3398:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2030:119:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1534:111:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4724:330:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1210:253:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1415:69:12;;;;;;;;;;;;;:::i;:::-;;1490:72;;;;;;;;;;;;;:::i;:::-;;1734:145;;;;;;;;;;;;;:::i;:::-;;5120:179:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1717:230:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1309:100:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2052:235:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1790:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1598:92:11;;;;;;;;;;;;;:::i;:::-;;966:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2511:102:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1572:156:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;806:439;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4144:290:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5365:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2532:164:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4500:162:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1839:189:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2348:178:12;2460:4;2483:36;2507:11;2483:23;:36::i;:::-;2476:43;;2348:178;;;:::o;2349:98:3:-;2403:13;2435:5;2428:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2349:98;:::o;3860:217::-;3936:7;3963:16;3971:7;3963;:16::i;:::-;3955:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4046:15;:24;4062:7;4046:24;;;;;;;;;;;;;;;;;;;;;4039:31;;3860:217;;;:::o;3398:401::-;3478:13;3494:23;3509:7;3494:14;:23::i;:::-;3478:39;;3541:5;3535:11;;:2;:11;;;;3527:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3632:5;3616:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3641:37;3658:5;3665:12;:10;:12::i;:::-;3641:16;:37::i;:::-;3616:62;3595:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;3771:21;3780:2;3784:7;3771:8;:21::i;:::-;3468:331;3398:401;;:::o;2030:119:12:-;1189:12:11;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2116:26:12::1;2129:7;2138:3;2116:12;:26::i;:::-;2030:119:::0;;:::o;1534:111:4:-;1595:7;1621:10;:17;;;;1614:24;;1534:111;:::o;4724:330:3:-;4913:41;4932:12;:10;:12::i;:::-;4946:7;4913:18;:41::i;:::-;4905:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5019:28;5029:4;5035:2;5039:7;5019:9;:28::i;:::-;4724:330;;;:::o;1210:253:4:-;1307:7;1342:23;1359:5;1342:16;:23::i;:::-;1334:5;:31;1326:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1430:12;:19;1443:5;1430:19;;;;;;;;;;;;;;;:26;1450:5;1430:26;;;;;;;;;;;;1423:33;;1210:253;;;;:::o;1415:69:12:-;1189:12:11;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1473:4:12::1;1463:7;;:14;;;;;;;;;;;;;;;;;;1415:69::o:0;1490:72::-;1189:12:11;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1550:5:12::1;1540:7;;:15;;;;;;;;;;;;;;;;;;1490:72::o:0;1734:145::-;1189:12:11;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1781:15:12::1;1799:21;1781:39;;1846:10;1838:24;;:33;1863:7;1838:33;;;;;;;;;;;;;;;;;;;;;;;1830:42;;;::::0;::::1;;1771:108;1734:145::o:0;5120:179:3:-;5253:39;5270:4;5276:2;5280:7;5253:39;;;;;;;;;;;;:16;:39::i;:::-;5120:179;;;:::o;1717:230:4:-;1792:7;1827:30;:28;:30::i;:::-;1819:5;:38;1811:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;1923:10;1934:5;1923:17;;;;;;;;:::i;:::-;;;;;;;;;;1916:24;;1717:230;;;:::o;1309:100:12:-;1189:12:11;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1395:7:12::1;1379:13;:23;;;;;;;;;;;;:::i;:::-;;1309:100:::0;:::o;2052:235:3:-;2124:7;2143:13;2159:7;:16;2167:7;2159:16;;;;;;;;;;;;;;;;;;;;;2143:32;;2210:1;2193:19;;:5;:19;;;;2185:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2275:5;2268:12;;;2052:235;;;:::o;1790:205::-;1862:7;1906:1;1889:19;;:5;:19;;;;1881:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;1972:9;:16;1982:5;1972:16;;;;;;;;;;;;;;;;1965:23;;1790:205;;;:::o;1598:92:11:-;1189:12;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1662:21:::1;1680:1;1662:9;:21::i;:::-;1598:92::o:0;966:85::-;1012:7;1038:6;;;;;;;;;;;1031:13;;966:85;:::o;2511:102:3:-;2567:13;2599:7;2592:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2511:102;:::o;1572:156:12:-;1613:7;1632:14;1649:13;:11;:13::i;:::-;1632:30;;1679:42;1694:26;1712:7;1702:4;1695:6;:11;;;;:::i;:::-;1694:17;;:26;;;;:::i;:::-;381:7;1679:14;;:42;;;;:::i;:::-;1672:49;;;1572:156;:::o;806:439::-;858:14;875:13;:11;:13::i;:::-;858:30;;898:13;914:10;:8;:10::i;:::-;898:26;;952:7;;;;;;;;;;;951:8;943:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;1024:1;1018:3;:7;:20;;;;;1036:2;1029:3;:9;;1018:20;1010:29;;;;;;333:4;1057:15;1068:3;1057:6;:10;;:15;;;;:::i;:::-;:29;;1049:38;;;;;;1118:14;1128:3;1118:5;:9;;:14;;;;:::i;:::-;1105:9;:27;;1097:36;;;;;;1149:9;1144:95;1168:3;1164:1;:7;1144:95;;;1192:36;1202:10;1214:13;1225:1;1214:6;:10;;:13;;;;:::i;:::-;1192:9;:36::i;:::-;1173:3;;;;;:::i;:::-;;;;1144:95;;;;848:397;;806:439;:::o;4144:290:3:-;4258:12;:10;:12::i;:::-;4246:24;;:8;:24;;;;4238:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;4356:8;4311:18;:32;4330:12;:10;:12::i;:::-;4311:32;;;;;;;;;;;;;;;:42;4344:8;4311:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;4408:8;4379:48;;4394:12;:10;:12::i;:::-;4379:48;;;4418:8;4379:48;;;;;;:::i;:::-;;;;;;;;4144:290;;:::o;5365:320::-;5534:41;5553:12;:10;:12::i;:::-;5567:7;5534:18;:41::i;:::-;5526:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5639:39;5653:4;5659:2;5663:7;5672:5;5639:13;:39::i;:::-;5365:320;;;;:::o;2532:164:12:-;2623:13;2655:34;2681:7;2655:25;:34::i;:::-;2648:41;;2532:164;;;:::o;4500:162:3:-;4597:4;4620:18;:25;4639:5;4620:25;;;;;;;;;;;;;;;:35;4646:8;4620:35;;;;;;;;;;;;;;;;;;;;;;;;;4613:42;;4500:162;;;;:::o;1839:189:11:-;1189:12;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1947:1:::1;1927:22;;:8;:22;;;;1919:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2002:19;2012:8;2002:9;:19::i;:::-;1839:189:::0;:::o;909:222:4:-;1011:4;1049:35;1034:50;;;:11;:50;;;;:90;;;;1088:36;1112:11;1088:23;:36::i;:::-;1034:90;1027:97;;909:222;;;:::o;7157:125:3:-;7222:4;7273:1;7245:30;;:7;:16;7253:7;7245:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7238:37;;7157:125;;;:::o;587:96:1:-;640:7;666:10;659:17;;587:96;:::o;11008:171:3:-;11109:2;11082:15;:24;11098:7;11082:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11164:7;11160:2;11126:46;;11135:23;11150:7;11135:14;:23::i;:::-;11126:46;;;;;;;;;;;;11008:171;;:::o;1196:214:5:-;1295:16;1303:7;1295;:16::i;:::-;1287:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;1394:9;1372:10;:19;1383:7;1372:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;1196:214;;:::o;7440:344:3:-;7533:4;7557:16;7565:7;7557;:16::i;:::-;7549:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7632:13;7648:23;7663:7;7648:14;:23::i;:::-;7632:39;;7700:5;7689:16;;:7;:16;;;:51;;;;7733:7;7709:31;;:20;7721:7;7709:11;:20::i;:::-;:31;;;7689:51;:87;;;;7744:32;7761:5;7768:7;7744:16;:32::i;:::-;7689:87;7681:96;;;7440:344;;;;:::o;10337:560::-;10491:4;10464:31;;:23;10479:7;10464:14;:23::i;:::-;:31;;;10456:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10573:1;10559:16;;:2;:16;;;;10551:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10627:39;10648:4;10654:2;10658:7;10627:20;:39::i;:::-;10728:29;10745:1;10749:7;10728:8;:29::i;:::-;10787:1;10768:9;:15;10778:4;10768:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10815:1;10798:9;:13;10808:2;10798:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10845:2;10826:7;:16;10834:7;10826:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10882:7;10878:2;10863:27;;10872:4;10863:27;;;;;;;;;;;;10337:560;;;:::o;2034:169:11:-;2089:16;2108:6;;;;;;;;;;;2089:25;;2133:8;2124:6;;:17;;;;;;;;;;;;;;;;;;2187:8;2156:40;;2177:8;2156:40;;;;;;;;;;;;2079:124;2034:169;:::o;3382:96:13:-;3440:7;3470:1;3466;:5;;;;:::i;:::-;3459:12;;3382:96;;;;:::o;2672:::-;2730:7;2760:1;2756;:5;;;;:::i;:::-;2749:12;;2672:96;;;;:::o;8114:108:3:-;8189:26;8199:2;8203:7;8189:26;;;;;;;;;;;;:9;:26::i;:::-;8114:108;;:::o;6547:307::-;6698:28;6708:4;6714:2;6718:7;6698:9;:28::i;:::-;6744:48;6767:4;6773:2;6777:7;6786:5;6744:22;:48::i;:::-;6736:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6547:307;;;;:::o;386:663:5:-;459:13;492:16;500:7;492;:16::i;:::-;484:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;573:23;599:10;:19;610:7;599:19;;;;;;;;;;;573:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;628:18;649:10;:8;:10::i;:::-;628:31;;754:1;738:4;732:18;:23;728:70;;;778:9;771:16;;;;;;728:70;926:1;906:9;900:23;:27;896:106;;;974:4;980:9;957:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;943:48;;;;;;896:106;1019:23;1034:7;1019:14;:23::i;:::-;1012:30;;;;386:663;;;;:::o;1431:300:3:-;1533:4;1583:25;1568:40;;;:11;:40;;;;:104;;;;1639:33;1624:48;;;:11;:48;;;;1568:104;:156;;;;1688:36;1712:11;1688:23;:36::i;:::-;1568:156;1549:175;;1431:300;;;:::o;2155:187:12:-;2290:45;2317:4;2323:2;2327:7;2290:26;:45::i;:::-;2155:187;;;:::o;8443:311:3:-;8568:18;8574:2;8578:7;8568:5;:18::i;:::-;8617:54;8648:1;8652:2;8656:7;8665:5;8617:22;:54::i;:::-;8596:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;8443:311;;;:::o;11732:778::-;11882:4;11902:15;:2;:13;;;:15::i;:::-;11898:606;;;11953:2;11937:36;;;11974:12;:10;:12::i;:::-;11988:4;11994:7;12003:5;11937:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;11933:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12193:1;12176:6;:13;:18;12172:266;;;12218:60;;;;;;;;;;:::i;:::-;;;;;;;;12172:266;12390:6;12384:13;12375:6;12371:2;12367:15;12360:38;11933:519;12069:41;;;12059:51;;;:6;:51;;;;12052:58;;;;;11898:606;12489:4;12482:11;;11732:778;;;;;;;:::o;669:112:12:-;729:13;761;754:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;669:112;:::o;2679:329:3:-;2752:13;2785:16;2793:7;2785;:16::i;:::-;2777:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;2864:21;2888:10;:8;:10::i;:::-;2864:34;;2939:1;2921:7;2915:21;:25;:86;;;;;;;;;;;;;;;;;2967:7;2976:18;:7;:16;:18::i;:::-;2950:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2915:86;2908:93;;;2679:329;;;:::o;763:155:2:-;848:4;886:25;871:40;;;:11;:40;;;;864:47;;763:155;;;:::o;2543:572:4:-;2682:45;2709:4;2715:2;2719:7;2682:26;:45::i;:::-;2758:1;2742:18;;:4;:18;;;2738:183;;;2776:40;2808:7;2776:31;:40::i;:::-;2738:183;;;2845:2;2837:10;;:4;:10;;;2833:88;;2863:47;2896:4;2902:7;2863:32;:47::i;:::-;2833:88;2738:183;2948:1;2934:16;;:2;:16;;;2930:179;;;2966:45;3003:7;2966:36;:45::i;:::-;2930:179;;;3038:4;3032:10;;:2;:10;;;3028:81;;3058:40;3086:2;3090:7;3058:27;:40::i;:::-;3028:81;2930:179;2543:572;;;:::o;9076:372:3:-;9169:1;9155:16;;:2;:16;;;;9147:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9227:16;9235:7;9227;:16::i;:::-;9226:17;9218:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9287:45;9316:1;9320:2;9324:7;9287:20;:45::i;:::-;9360:1;9343:9;:13;9353:2;9343:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9390:2;9371:7;:16;9379:7;9371:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9433:7;9429:2;9408:33;;9425:1;9408:33;;;;;;;;;;;;9076:372;;:::o;718:377:0:-;778:4;981:12;1046:7;1034:20;1026:28;;1087:1;1080:4;:8;1073:15;;;718:377;;;:::o;275:703:14:-;331:13;557:1;548:5;:10;544:51;;;574:10;;;;;;;;;;;;;;;;;;;;;544:51;604:12;619:5;604:20;;634:14;658:75;673:1;665:4;:9;658:75;;690:8;;;;;:::i;:::-;;;;720:2;712:10;;;;;:::i;:::-;;;658:75;;;742:19;774:6;764:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;742:39;;791:150;807:1;798:5;:10;791:150;;834:1;824:11;;;;;:::i;:::-;;;900:2;892:5;:10;;;;:::i;:::-;879:2;:24;;;;:::i;:::-;866:39;;849:6;856;849:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;928:2;919:11;;;;;:::i;:::-;;;791:150;;;964:6;950:21;;;;;275:703;;;;:::o;13066:122:3:-;;;;:::o;3821:161:4:-;3924:10;:17;;;;3897:15;:24;3913:7;3897:24;;;;;;;;;;;:44;;;;3951:10;3967:7;3951:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3821:161;:::o;4599:970::-;4861:22;4911:1;4886:22;4903:4;4886:16;:22::i;:::-;:26;;;;:::i;:::-;4861:51;;4922:18;4943:17;:26;4961:7;4943:26;;;;;;;;;;;;4922:47;;5087:14;5073:10;:28;5069:323;;5117:19;5139:12;:18;5152:4;5139:18;;;;;;;;;;;;;;;:34;5158:14;5139:34;;;;;;;;;;;;5117:56;;5221:11;5188:12;:18;5201:4;5188:18;;;;;;;;;;;;;;;:30;5207:10;5188:30;;;;;;;;;;;:44;;;;5337:10;5304:17;:30;5322:11;5304:30;;;;;;;;;;;:43;;;;5103:289;5069:323;5485:17;:26;5503:7;5485:26;;;;;;;;;;;5478:33;;;5528:12;:18;5541:4;5528:18;;;;;;;;;;;;;;;:34;5547:14;5528:34;;;;;;;;;;;5521:41;;;4680:889;;4599:970;;:::o;5857:1061::-;6106:22;6151:1;6131:10;:17;;;;:21;;;;:::i;:::-;6106:46;;6162:18;6183:15;:24;6199:7;6183:24;;;;;;;;;;;;6162:45;;6529:19;6551:10;6562:14;6551:26;;;;;;;;:::i;:::-;;;;;;;;;;6529:48;;6613:11;6588:10;6599;6588:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;6723:10;6692:15;:28;6708:11;6692:28;;;;;;;;;;;:41;;;;6861:15;:24;6877:7;6861:24;;;;;;;;;;;6854:31;;;6895:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5928:990;;;5857:1061;:::o;3409:217::-;3493:14;3510:20;3527:2;3510:16;:20::i;:::-;3493:37;;3567:7;3540:12;:16;3553:2;3540:16;;;;;;;;;;;;;;;:24;3557:6;3540:24;;;;;;;;;;;:34;;;;3613:6;3584:17;:26;3602:7;3584:26;;;;;;;;;;;:35;;;;3483:143;3409:217;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:15:-;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::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:327::-;5678:6;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:52;5922:7;5913:6;5902:9;5898:22;5878:52;:::i;:::-;5868:62;;5824:116;5620:327;;;;:::o;5953:349::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:63;6277:7;6268:6;6257:9;6253:22;6222:63;:::i;:::-;6212:73;;6168:127;5953:349;;;;:::o;6308:509::-;6377:6;6426:2;6414:9;6405:7;6401:23;6397:32;6394:119;;;6432:79;;:::i;:::-;6394:119;6580:1;6569:9;6565:17;6552:31;6610:18;6602:6;6599:30;6596:117;;;6632:79;;:::i;:::-;6596:117;6737:63;6792:7;6783:6;6772:9;6768:22;6737:63;:::i;:::-;6727:73;;6523:287;6308:509;;;;:::o;6823:329::-;6882:6;6931:2;6919:9;6910:7;6906:23;6902:32;6899:119;;;6937:79;;:::i;:::-;6899:119;7057:1;7082:53;7127:7;7118:6;7107:9;7103:22;7082:53;:::i;:::-;7072:63;;7028:117;6823:329;;;;:::o;7158:654::-;7236:6;7244;7293:2;7281:9;7272:7;7268:23;7264:32;7261:119;;;7299:79;;:::i;:::-;7261:119;7419:1;7444:53;7489:7;7480:6;7469:9;7465:22;7444:53;:::i;:::-;7434:63;;7390:117;7574:2;7563:9;7559:18;7546:32;7605:18;7597:6;7594:30;7591:117;;;7627:79;;:::i;:::-;7591:117;7732:63;7787:7;7778:6;7767:9;7763:22;7732:63;:::i;:::-;7722:73;;7517:288;7158:654;;;;;:::o;7818:118::-;7905:24;7923:5;7905:24;:::i;:::-;7900:3;7893:37;7818:118;;:::o;7942:109::-;8023:21;8038:5;8023:21;:::i;:::-;8018:3;8011:34;7942:109;;:::o;8057:360::-;8143:3;8171:38;8203:5;8171:38;:::i;:::-;8225:70;8288:6;8283:3;8225:70;:::i;:::-;8218:77;;8304:52;8349:6;8344:3;8337:4;8330:5;8326:16;8304:52;:::i;:::-;8381:29;8403:6;8381:29;:::i;:::-;8376:3;8372:39;8365:46;;8147:270;8057:360;;;;:::o;8423:364::-;8511:3;8539:39;8572:5;8539:39;:::i;:::-;8594:71;8658:6;8653:3;8594:71;:::i;:::-;8587:78;;8674:52;8719:6;8714:3;8707:4;8700:5;8696:16;8674:52;:::i;:::-;8751:29;8773:6;8751:29;:::i;:::-;8746:3;8742:39;8735:46;;8515:272;8423:364;;;;:::o;8793:377::-;8899:3;8927:39;8960:5;8927:39;:::i;:::-;8982:89;9064:6;9059:3;8982:89;:::i;:::-;8975:96;;9080:52;9125:6;9120:3;9113:4;9106:5;9102:16;9080:52;:::i;:::-;9157:6;9152:3;9148:16;9141:23;;8903:267;8793:377;;;;:::o;9176:366::-;9318:3;9339:67;9403:2;9398:3;9339:67;:::i;:::-;9332:74;;9415:93;9504:3;9415:93;:::i;:::-;9533:2;9528:3;9524:12;9517:19;;9176:366;;;:::o;9548:::-;9690:3;9711:67;9775:2;9770:3;9711:67;:::i;:::-;9704:74;;9787:93;9876:3;9787:93;:::i;:::-;9905:2;9900:3;9896:12;9889:19;;9548:366;;;:::o;9920:::-;10062:3;10083:67;10147:2;10142:3;10083:67;:::i;:::-;10076:74;;10159:93;10248:3;10159:93;:::i;:::-;10277:2;10272:3;10268:12;10261:19;;9920:366;;;:::o;10292:::-;10434:3;10455:67;10519:2;10514:3;10455:67;:::i;:::-;10448:74;;10531:93;10620:3;10531:93;:::i;:::-;10649:2;10644:3;10640:12;10633:19;;10292:366;;;:::o;10664:::-;10806:3;10827:67;10891:2;10886:3;10827:67;:::i;:::-;10820:74;;10903:93;10992:3;10903:93;:::i;:::-;11021:2;11016:3;11012:12;11005:19;;10664:366;;;:::o;11036:::-;11178:3;11199:67;11263:2;11258:3;11199:67;:::i;:::-;11192:74;;11275:93;11364:3;11275:93;:::i;:::-;11393:2;11388:3;11384:12;11377:19;;11036:366;;;:::o;11408:::-;11550:3;11571:67;11635:2;11630:3;11571:67;:::i;:::-;11564:74;;11647:93;11736:3;11647:93;:::i;:::-;11765:2;11760:3;11756:12;11749:19;;11408:366;;;:::o;11780:::-;11922:3;11943:67;12007:2;12002:3;11943:67;:::i;:::-;11936:74;;12019:93;12108:3;12019:93;:::i;:::-;12137:2;12132:3;12128:12;12121:19;;11780:366;;;:::o;12152:::-;12294:3;12315:67;12379:2;12374:3;12315:67;:::i;:::-;12308:74;;12391:93;12480:3;12391:93;:::i;:::-;12509:2;12504:3;12500:12;12493:19;;12152:366;;;:::o;12524:::-;12666:3;12687:67;12751:2;12746:3;12687:67;:::i;:::-;12680:74;;12763:93;12852:3;12763:93;:::i;:::-;12881:2;12876:3;12872:12;12865:19;;12524:366;;;:::o;12896:::-;13038:3;13059:67;13123:2;13118:3;13059:67;:::i;:::-;13052:74;;13135:93;13224:3;13135:93;:::i;:::-;13253:2;13248:3;13244:12;13237:19;;12896:366;;;:::o;13268:::-;13410:3;13431:67;13495:2;13490:3;13431:67;:::i;:::-;13424:74;;13507:93;13596:3;13507:93;:::i;:::-;13625:2;13620:3;13616:12;13609:19;;13268:366;;;:::o;13640:::-;13782:3;13803:67;13867:2;13862:3;13803:67;:::i;:::-;13796:74;;13879:93;13968:3;13879:93;:::i;:::-;13997:2;13992:3;13988:12;13981:19;;13640:366;;;:::o;14012:::-;14154:3;14175:67;14239:2;14234:3;14175:67;:::i;:::-;14168:74;;14251:93;14340:3;14251:93;:::i;:::-;14369:2;14364:3;14360:12;14353:19;;14012:366;;;:::o;14384:::-;14526:3;14547:67;14611:2;14606:3;14547:67;:::i;:::-;14540:74;;14623:93;14712:3;14623:93;:::i;:::-;14741:2;14736:3;14732:12;14725:19;;14384:366;;;:::o;14756:::-;14898:3;14919:67;14983:2;14978:3;14919:67;:::i;:::-;14912:74;;14995:93;15084:3;14995:93;:::i;:::-;15113:2;15108:3;15104:12;15097:19;;14756:366;;;:::o;15128:::-;15270:3;15291:67;15355:2;15350:3;15291:67;:::i;:::-;15284:74;;15367:93;15456:3;15367:93;:::i;:::-;15485:2;15480:3;15476:12;15469:19;;15128:366;;;:::o;15500:::-;15642:3;15663:67;15727:2;15722:3;15663:67;:::i;:::-;15656:74;;15739:93;15828:3;15739:93;:::i;:::-;15857:2;15852:3;15848:12;15841:19;;15500:366;;;:::o;15872:::-;16014:3;16035:67;16099:2;16094:3;16035:67;:::i;:::-;16028:74;;16111:93;16200:3;16111:93;:::i;:::-;16229:2;16224:3;16220:12;16213:19;;15872:366;;;:::o;16244:::-;16386:3;16407:67;16471:2;16466:3;16407:67;:::i;:::-;16400:74;;16483:93;16572:3;16483:93;:::i;:::-;16601:2;16596:3;16592:12;16585:19;;16244:366;;;:::o;16616:::-;16758:3;16779:67;16843:2;16838:3;16779:67;:::i;:::-;16772:74;;16855:93;16944:3;16855:93;:::i;:::-;16973:2;16968:3;16964:12;16957:19;;16616:366;;;:::o;16988:118::-;17075:24;17093:5;17075:24;:::i;:::-;17070:3;17063:37;16988:118;;:::o;17112:435::-;17292:3;17314:95;17405:3;17396:6;17314:95;:::i;:::-;17307:102;;17426:95;17517:3;17508:6;17426:95;:::i;:::-;17419:102;;17538:3;17531:10;;17112:435;;;;;:::o;17553:222::-;17646:4;17684:2;17673:9;17669:18;17661:26;;17697:71;17765:1;17754:9;17750:17;17741:6;17697:71;:::i;:::-;17553:222;;;;:::o;17781:640::-;17976:4;18014:3;18003:9;17999:19;17991:27;;18028:71;18096:1;18085:9;18081:17;18072:6;18028:71;:::i;:::-;18109:72;18177:2;18166:9;18162:18;18153:6;18109:72;:::i;:::-;18191;18259:2;18248:9;18244:18;18235:6;18191:72;:::i;:::-;18310:9;18304:4;18300:20;18295:2;18284:9;18280:18;18273:48;18338:76;18409:4;18400:6;18338:76;:::i;:::-;18330:84;;17781:640;;;;;;;:::o;18427:210::-;18514:4;18552:2;18541:9;18537:18;18529:26;;18565:65;18627:1;18616:9;18612:17;18603:6;18565:65;:::i;:::-;18427:210;;;;:::o;18643:313::-;18756:4;18794:2;18783:9;18779:18;18771:26;;18843:9;18837:4;18833:20;18829:1;18818:9;18814:17;18807:47;18871:78;18944:4;18935:6;18871:78;:::i;:::-;18863:86;;18643:313;;;;:::o;18962:419::-;19128:4;19166:2;19155:9;19151:18;19143:26;;19215:9;19209:4;19205:20;19201:1;19190:9;19186:17;19179:47;19243:131;19369:4;19243:131;:::i;:::-;19235:139;;18962:419;;;:::o;19387:::-;19553:4;19591:2;19580:9;19576:18;19568:26;;19640:9;19634:4;19630:20;19626:1;19615:9;19611:17;19604:47;19668:131;19794:4;19668:131;:::i;:::-;19660:139;;19387:419;;;:::o;19812:::-;19978:4;20016:2;20005:9;20001:18;19993:26;;20065:9;20059:4;20055:20;20051:1;20040:9;20036:17;20029:47;20093:131;20219:4;20093:131;:::i;:::-;20085:139;;19812:419;;;:::o;20237:::-;20403:4;20441:2;20430:9;20426:18;20418:26;;20490:9;20484:4;20480:20;20476:1;20465:9;20461:17;20454:47;20518:131;20644:4;20518:131;:::i;:::-;20510:139;;20237:419;;;:::o;20662:::-;20828:4;20866:2;20855:9;20851:18;20843:26;;20915:9;20909:4;20905:20;20901:1;20890:9;20886:17;20879:47;20943:131;21069:4;20943:131;:::i;:::-;20935:139;;20662:419;;;:::o;21087:::-;21253:4;21291:2;21280:9;21276:18;21268:26;;21340:9;21334:4;21330:20;21326:1;21315:9;21311:17;21304:47;21368:131;21494:4;21368:131;:::i;:::-;21360:139;;21087:419;;;:::o;21512:::-;21678:4;21716:2;21705:9;21701:18;21693:26;;21765:9;21759:4;21755:20;21751:1;21740:9;21736:17;21729:47;21793:131;21919:4;21793:131;:::i;:::-;21785:139;;21512:419;;;:::o;21937:::-;22103:4;22141:2;22130:9;22126:18;22118:26;;22190:9;22184:4;22180:20;22176:1;22165:9;22161:17;22154:47;22218:131;22344:4;22218:131;:::i;:::-;22210:139;;21937:419;;;:::o;22362:::-;22528:4;22566:2;22555:9;22551:18;22543:26;;22615:9;22609:4;22605:20;22601:1;22590:9;22586:17;22579:47;22643:131;22769:4;22643:131;:::i;:::-;22635:139;;22362:419;;;:::o;22787:::-;22953:4;22991:2;22980:9;22976:18;22968:26;;23040:9;23034:4;23030:20;23026:1;23015:9;23011:17;23004:47;23068:131;23194:4;23068:131;:::i;:::-;23060:139;;22787:419;;;:::o;23212:::-;23378:4;23416:2;23405:9;23401:18;23393:26;;23465:9;23459:4;23455:20;23451:1;23440:9;23436:17;23429:47;23493:131;23619:4;23493:131;:::i;:::-;23485:139;;23212:419;;;:::o;23637:::-;23803:4;23841:2;23830:9;23826:18;23818:26;;23890:9;23884:4;23880:20;23876:1;23865:9;23861:17;23854:47;23918:131;24044:4;23918:131;:::i;:::-;23910:139;;23637:419;;;:::o;24062:::-;24228:4;24266:2;24255:9;24251:18;24243:26;;24315:9;24309:4;24305:20;24301:1;24290:9;24286:17;24279:47;24343:131;24469:4;24343:131;:::i;:::-;24335:139;;24062:419;;;:::o;24487:::-;24653:4;24691:2;24680:9;24676:18;24668:26;;24740:9;24734:4;24730:20;24726:1;24715:9;24711:17;24704:47;24768:131;24894:4;24768:131;:::i;:::-;24760:139;;24487:419;;;:::o;24912:::-;25078:4;25116:2;25105:9;25101:18;25093:26;;25165:9;25159:4;25155:20;25151:1;25140:9;25136:17;25129:47;25193:131;25319:4;25193:131;:::i;:::-;25185:139;;24912:419;;;:::o;25337:::-;25503:4;25541:2;25530:9;25526:18;25518:26;;25590:9;25584:4;25580:20;25576:1;25565:9;25561:17;25554:47;25618:131;25744:4;25618:131;:::i;:::-;25610:139;;25337:419;;;:::o;25762:::-;25928:4;25966:2;25955:9;25951:18;25943:26;;26015:9;26009:4;26005:20;26001:1;25990:9;25986:17;25979:47;26043:131;26169:4;26043:131;:::i;:::-;26035:139;;25762:419;;;:::o;26187:::-;26353:4;26391:2;26380:9;26376:18;26368:26;;26440:9;26434:4;26430:20;26426:1;26415:9;26411:17;26404:47;26468:131;26594:4;26468:131;:::i;:::-;26460:139;;26187:419;;;:::o;26612:::-;26778:4;26816:2;26805:9;26801:18;26793:26;;26865:9;26859:4;26855:20;26851:1;26840:9;26836:17;26829:47;26893:131;27019:4;26893:131;:::i;:::-;26885:139;;26612:419;;;:::o;27037:::-;27203:4;27241:2;27230:9;27226:18;27218:26;;27290:9;27284:4;27280:20;27276:1;27265:9;27261:17;27254:47;27318:131;27444:4;27318:131;:::i;:::-;27310:139;;27037:419;;;:::o;27462:::-;27628:4;27666:2;27655:9;27651:18;27643:26;;27715:9;27709:4;27705:20;27701:1;27690:9;27686:17;27679:47;27743:131;27869:4;27743:131;:::i;:::-;27735:139;;27462:419;;;:::o;27887:222::-;27980:4;28018:2;28007:9;28003:18;27995:26;;28031:71;28099:1;28088:9;28084:17;28075:6;28031:71;:::i;:::-;27887:222;;;;:::o;28115:129::-;28149:6;28176:20;;:::i;:::-;28166:30;;28205:33;28233:4;28225:6;28205:33;:::i;:::-;28115:129;;;:::o;28250:75::-;28283:6;28316:2;28310:9;28300:19;;28250:75;:::o;28331:307::-;28392:4;28482:18;28474:6;28471:30;28468:56;;;28504:18;;:::i;:::-;28468:56;28542:29;28564:6;28542:29;:::i;:::-;28534:37;;28626:4;28620;28616:15;28608:23;;28331:307;;;:::o;28644:308::-;28706:4;28796:18;28788:6;28785:30;28782:56;;;28818:18;;:::i;:::-;28782:56;28856:29;28878:6;28856:29;:::i;:::-;28848:37;;28940:4;28934;28930:15;28922:23;;28644:308;;;:::o;28958:98::-;29009:6;29043:5;29037:12;29027:22;;28958:98;;;:::o;29062:99::-;29114:6;29148:5;29142:12;29132:22;;29062:99;;;:::o;29167:168::-;29250:11;29284:6;29279:3;29272:19;29324:4;29319:3;29315:14;29300:29;;29167:168;;;;:::o;29341:169::-;29425:11;29459:6;29454:3;29447:19;29499:4;29494:3;29490:14;29475:29;;29341:169;;;;:::o;29516:148::-;29618:11;29655:3;29640:18;;29516:148;;;;:::o;29670:305::-;29710:3;29729:20;29747:1;29729:20;:::i;:::-;29724:25;;29763:20;29781:1;29763:20;:::i;:::-;29758:25;;29917:1;29849:66;29845:74;29842:1;29839:81;29836:107;;;29923:18;;:::i;:::-;29836:107;29967:1;29964;29960:9;29953:16;;29670:305;;;;:::o;29981:185::-;30021:1;30038:20;30056:1;30038:20;:::i;:::-;30033:25;;30072:20;30090:1;30072:20;:::i;:::-;30067:25;;30111:1;30101:35;;30116:18;;:::i;:::-;30101:35;30158:1;30155;30151:9;30146:14;;29981:185;;;;:::o;30172:348::-;30212:7;30235:20;30253:1;30235:20;:::i;:::-;30230:25;;30269:20;30287:1;30269:20;:::i;:::-;30264:25;;30457:1;30389:66;30385:74;30382:1;30379:81;30374:1;30367:9;30360:17;30356:105;30353:131;;;30464:18;;:::i;:::-;30353:131;30512:1;30509;30505:9;30494:20;;30172:348;;;;:::o;30526:191::-;30566:4;30586:20;30604:1;30586:20;:::i;:::-;30581:25;;30620:20;30638:1;30620:20;:::i;:::-;30615:25;;30659:1;30656;30653:8;30650:34;;;30664:18;;:::i;:::-;30650:34;30709:1;30706;30702:9;30694:17;;30526:191;;;;:::o;30723:96::-;30760:7;30789:24;30807:5;30789:24;:::i;:::-;30778:35;;30723:96;;;:::o;30825:90::-;30859:7;30902:5;30895:13;30888:21;30877:32;;30825:90;;;:::o;30921:149::-;30957:7;30997:66;30990:5;30986:78;30975:89;;30921:149;;;:::o;31076:126::-;31113:7;31153:42;31146:5;31142:54;31131:65;;31076:126;;;:::o;31208:77::-;31245:7;31274:5;31263:16;;31208:77;;;:::o;31291:154::-;31375:6;31370:3;31365;31352:30;31437:1;31428:6;31423:3;31419:16;31412:27;31291:154;;;:::o;31451:307::-;31519:1;31529:113;31543:6;31540:1;31537:13;31529:113;;;31628:1;31623:3;31619:11;31613:18;31609:1;31604:3;31600:11;31593:39;31565:2;31562:1;31558:10;31553:15;;31529:113;;;31660:6;31657:1;31654:13;31651:101;;;31740:1;31731:6;31726:3;31722:16;31715:27;31651:101;31500:258;31451:307;;;:::o;31764:320::-;31808:6;31845:1;31839:4;31835:12;31825:22;;31892:1;31886:4;31882:12;31913:18;31903:81;;31969:4;31961:6;31957:17;31947:27;;31903:81;32031:2;32023:6;32020:14;32000:18;31997:38;31994:84;;;32050:18;;:::i;:::-;31994:84;31815:269;31764:320;;;:::o;32090:281::-;32173:27;32195:4;32173:27;:::i;:::-;32165:6;32161:40;32303:6;32291:10;32288:22;32267:18;32255:10;32252:34;32249:62;32246:88;;;32314:18;;:::i;:::-;32246:88;32354:10;32350:2;32343:22;32133:238;32090:281;;:::o;32377:233::-;32416:3;32439:24;32457:5;32439:24;:::i;:::-;32430:33;;32485:66;32478:5;32475:77;32472:103;;;32555:18;;:::i;:::-;32472:103;32602:1;32595:5;32591:13;32584:20;;32377:233;;;:::o;32616:176::-;32648:1;32665:20;32683:1;32665:20;:::i;:::-;32660:25;;32699:20;32717:1;32699:20;:::i;:::-;32694:25;;32738:1;32728:35;;32743:18;;:::i;:::-;32728:35;32784:1;32781;32777:9;32772:14;;32616:176;;;;:::o;32798:180::-;32846:77;32843:1;32836:88;32943:4;32940:1;32933:15;32967:4;32964:1;32957:15;32984:180;33032:77;33029:1;33022:88;33129:4;33126:1;33119:15;33153:4;33150:1;33143:15;33170:180;33218:77;33215:1;33208:88;33315:4;33312:1;33305:15;33339:4;33336:1;33329:15;33356:180;33404:77;33401:1;33394:88;33501:4;33498:1;33491:15;33525:4;33522:1;33515:15;33542:180;33590:77;33587:1;33580:88;33687:4;33684:1;33677:15;33711:4;33708:1;33701:15;33728:180;33776:77;33773:1;33766:88;33873:4;33870:1;33863:15;33897:4;33894:1;33887:15;33914:117;34023:1;34020;34013:12;34037:117;34146:1;34143;34136:12;34160:117;34269:1;34266;34259:12;34283:117;34392:1;34389;34382:12;34406:102;34447:6;34498:2;34494:7;34489:2;34482:5;34478:14;34474:28;34464:38;;34406:102;;;:::o;34514:230::-;34654:34;34650:1;34642:6;34638:14;34631:58;34723:13;34718:2;34710:6;34706:15;34699:38;34514:230;:::o;34750:237::-;34890:34;34886:1;34878:6;34874:14;34867:58;34959:20;34954:2;34946:6;34942:15;34935:45;34750:237;:::o;34993:225::-;35133:34;35129:1;35121:6;35117:14;35110:58;35202:8;35197:2;35189:6;35185:15;35178:33;34993:225;:::o;35224:178::-;35364:30;35360:1;35352:6;35348:14;35341:54;35224:178;:::o;35408:223::-;35548:34;35544:1;35536:6;35532:14;35525:58;35617:6;35612:2;35604:6;35600:15;35593:31;35408:223;:::o;35637:175::-;35777:27;35773:1;35765:6;35761:14;35754:51;35637:175;:::o;35818:231::-;35958:34;35954:1;35946:6;35942:14;35935:58;36027:14;36022:2;36014:6;36010:15;36003:39;35818:231;:::o;36055:243::-;36195:34;36191:1;36183:6;36179:14;36172:58;36264:26;36259:2;36251:6;36247:15;36240:51;36055:243;:::o;36304:229::-;36444:34;36440:1;36432:6;36428:14;36421:58;36513:12;36508:2;36500:6;36496:15;36489:37;36304:229;:::o;36539:228::-;36679:34;36675:1;36667:6;36663:14;36656:58;36748:11;36743:2;36735:6;36731:15;36724:36;36539:228;:::o;36773:233::-;36913:34;36909:1;36901:6;36897:14;36890:58;36982:16;36977:2;36969:6;36965:15;36958:41;36773:233;:::o;37012:182::-;37152:34;37148:1;37140:6;37136:14;37129:58;37012:182;:::o;37200:223::-;37340:34;37336:1;37328:6;37324:14;37317:58;37409:6;37404:2;37396:6;37392:15;37385:31;37200:223;:::o;37429:236::-;37569:34;37565:1;37557:6;37553:14;37546:58;37638:19;37633:2;37625:6;37621:15;37614:44;37429:236;:::o;37671:231::-;37811:34;37807:1;37799:6;37795:14;37788:58;37880:14;37875:2;37867:6;37863:15;37856:39;37671:231;:::o;37908:182::-;38048:34;38044:1;38036:6;38032:14;38025:58;37908:182;:::o;38096:228::-;38236:34;38232:1;38224:6;38220:14;38213:58;38305:11;38300:2;38292:6;38288:15;38281:36;38096:228;:::o;38330:234::-;38470:34;38466:1;38458:6;38454:14;38447:58;38539:17;38534:2;38526:6;38522:15;38515:42;38330:234;:::o;38570:220::-;38710:34;38706:1;38698:6;38694:14;38687:58;38779:3;38774:2;38766:6;38762:15;38755:28;38570:220;:::o;38796:236::-;38936:34;38932:1;38924:6;38920:14;38913:58;39005:19;39000:2;38992:6;38988:15;38981:44;38796:236;:::o;39038:231::-;39178:34;39174:1;39166:6;39162:14;39155:58;39247:14;39242:2;39234:6;39230:15;39223:39;39038:231;:::o;39275:122::-;39348:24;39366:5;39348:24;:::i;:::-;39341:5;39338:35;39328:63;;39387:1;39384;39377:12;39328:63;39275:122;:::o;39403:116::-;39473:21;39488:5;39473:21;:::i;:::-;39466:5;39463:32;39453:60;;39509:1;39506;39499:12;39453:60;39403:116;:::o;39525:120::-;39597:23;39614:5;39597:23;:::i;:::-;39590:5;39587:34;39577:62;;39635:1;39632;39625:12;39577:62;39525:120;:::o;39651:122::-;39724:24;39742:5;39724:24;:::i;:::-;39717:5;39714:35;39704:63;;39763:1;39760;39753:12;39704:63;39651:122;:::o
Swarm Source
ipfs://d20a35aa7a009b99c967df9f95f4accfe52a46731be52343d89501ffdd1ed169
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.