ERC-721
NFT
Overview
Max Total Supply
2,933 SHADOW
Holders
668
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 SHADOWLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
OrderOfShadows
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-09-14 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; // File: @openzeppelin/contracts/utils/introspection/IERC165.sol /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.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; } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.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); } // File: @openzeppelin/contracts/utils/Address.sol /** * @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); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/Context.sol pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/utils/Strings.sol pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require( owner != address(0), "ERC721: balance query for the zero address" ); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require( owner != address(0), "ERC721: owner query for nonexistent token" ); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. 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(to).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 {} } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require( index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds" ); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require( index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds" ); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; 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); } } contract OrderOfShadows is ERC721, Ownable { bool public saleActive = false; bool public presaleActive = false; string internal baseTokenURI = "https://nftorderofshadows.com/api/metadata?tokenId="; uint public price = 0.0369 ether; uint public totalSupply = 4000; uint public apeMaxSupply = 300; uint public presaleMaxSupply = 1500; uint public nonce = 0; uint public presaleNonce = 0; uint public apeNonce = 0; uint public maxTx = 10; uint public presaleMaxTx = 3; event Mint(address owner, uint qty); event ApeMint(address owner, uint qty); event Giveaway(address to, uint qty); event Withdraw(uint amount); address public a1 = 0x2027e0fE56278f671D174CbE4BCd7A42D25cc6a3; address public a2 = 0x7D58e81CeCf7F1B0071580CAB07d53EDE7858B17; address public a3 = 0x70184259C8CbF0B85C96e2A84ad74EB097759aeE; address public a4 = 0x4f95219f13dC43641645B5ebE5259b040e38b281; address public a5 = 0x57ccEFe8fDD9F2B17B9dD148061ae9a5f3a7e767; address public a6 = 0xd4E4A63153dC52081eC8a33Ecc140b369d964511; address public a7 = 0x80f039085f78fFF512a1edE6d25eC64927392888; constructor() ERC721("OrderOfShadows", "SHADOW") {} function setPrice(uint newPrice) external onlyOwner { price = newPrice; } function setBaseTokenURI(string calldata _uri) external onlyOwner { baseTokenURI = _uri; } function setTotalSupply(uint newSupply) external onlyOwner { totalSupply = newSupply; } function setPresaleActive(bool val) public onlyOwner { presaleActive = val; } function setSaleActive(bool val) public onlyOwner { saleActive = val; } function setMembersAddresses(address[] memory _a) public onlyOwner { a1 = _a[0]; a2 = _a[1]; a3 = _a[2]; a4 = _a[3]; a5 = _a[4]; a6 = _a[5]; a7 = _a[6]; } function setMaxTx(uint newMax) external onlyOwner { maxTx = newMax; } function setPresaleMaxTx(uint newMax) external onlyOwner { presaleMaxTx = newMax; } function getAssetsByOwner(address _owner) public view returns(uint[] memory) { uint[] memory result = new uint[](balanceOf(_owner)); uint counter = 0; for (uint i = 0; i < nonce; i++) { if (ownerOf(i) == _owner) { result[counter] = i; counter++; } } return result; } function getMyAssets() external view returns(uint[] memory){ return getAssetsByOwner(tx.origin); } function _baseURI() internal override view returns (string memory) { return baseTokenURI; } function getBalanceOfOwner(address _owner) external view returns(uint256){ return balanceOf(_owner); } function giveaway(address to, uint qty) external onlyOwner { require(qty + nonce <= totalSupply, "Value exceeds totalSupply"); for(uint i = 0; i < qty; i++){ uint tokenId = nonce; _safeMint(to, tokenId); nonce++; } emit Giveaway(to, qty); } function buyPresale(uint qty) external payable { require(presaleActive, "Presale is not active"); require(balanceOf(msg.sender) + qty <= presaleMaxTx, "Too many, or you've already minted the maximum for presale"); require(qty + presaleNonce <= presaleMaxSupply, "Value exceeds presaleMaxSupply"); require(qty + nonce <= totalSupply, "Value exceeds totalSupply"); require(msg.value == price * qty, "Invalid value"); for(uint i = 0; i < qty; i++){ uint tokenId = nonce; _safeMint(msg.sender, tokenId); nonce++; presaleNonce++; } emit ApeMint(msg.sender, qty); } function apeBuy(uint qty) external payable { require(presaleActive, "Presale is not active"); require(qty + apeNonce <= apeMaxSupply, "Too many, or the value exceeds the total ape supply"); require(qty <= maxTx || qty < 1, "Qty of mints too high or too low"); require(qty + apeNonce <= apeMaxSupply, "Value exceeds totalSupply"); require(qty + nonce <= totalSupply, "Value exceeds totalSupply"); require(msg.value == price * qty, "Invalid value"); for(uint i = 0; i < qty; i++){ uint tokenId = nonce; _safeMint(msg.sender, tokenId); nonce++; apeNonce++; } emit Mint(msg.sender, qty); } function buy(uint qty) external payable { require(saleActive, "Sale is not active"); require(qty <= maxTx || qty < 1, "Qty of mints too high or too low"); require(qty + nonce <= totalSupply, "Value exceeds totalSupply"); require(msg.value == price * qty, "Invalid value"); for(uint i = 0; i < qty; i++){ uint tokenId = nonce; _safeMint(msg.sender, tokenId); nonce++; } emit Mint(msg.sender, qty); } function withdrawTeam() external onlyOwner { uint256 balance = address(this).balance; require(payable(a1).send((balance * 5) / 100)); require(payable(a2).send((balance * 5) / 100)); require(payable(a3).send((balance * 5) / 100)); require(payable(a4).send((balance * 5) / 100)); require(payable(a5).send((balance * 5) / 100)); require(payable(a6).send((balance * 2) / 100)); require(payable(a7).send((balance * 73) / 100)); } function withdrawOwner() external onlyOwner { payable(msg.sender).transfer(address(this).balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"qty","type":"uint256"}],"name":"ApeMint","type":"event"},{"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":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"qty","type":"uint256"}],"name":"Giveaway","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"qty","type":"uint256"}],"name":"Mint","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"a1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"a2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"a3","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"a4","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"a5","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"a6","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"a7","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"apeBuy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"apeMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"apeNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"buyPresale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getAssetsByOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getBalanceOfOwner","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMyAssets","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"giveaway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleMaxTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"_uri","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"setMaxTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_a","type":"address[]"}],"name":"setMembersAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"val","type":"bool"}],"name":"setPresaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"setPresaleMaxTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"val","type":"bool"}],"name":"setSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newSupply","type":"uint256"}],"name":"setTotalSupply","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":"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":"withdrawOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawTeam","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6006805461ffff60a01b1916905560e06040526033608081815290620031b660a039805162000037916007916020909101906200023d565b506683185ac0364000600855610fa060095561012c600a9081556105dc600b556000600c819055600d819055600e55600f556003601055601180546001600160a01b0319908116732027e0fe56278f671d174cbe4bcd7a42d25cc6a317909155601280548216737d58e81cecf7f1b0071580cab07d53ede7858b171790556013805482167370184259c8cbf0b85c96e2a84ad74eb097759aee179055601480548216734f95219f13dc43641645b5ebe5259b040e38b2811790556015805482167357ccefe8fdd9f2b17b9dd148061ae9a5f3a7e76717905560168054821673d4e4a63153dc52081ec8a33ecc140b369d964511179055601780549091167380f039085f78fff512a1ede6d25ec649273928881790553480156200015957600080fd5b50604080518082018252600e81526d4f726465724f66536861646f777360901b602080830191825283518085019094526006845265534841444f5760d01b908401528151919291620001ae916000916200023d565b508051620001c49060019060208401906200023d565b505050620001e1620001db620001e760201b60201c565b620001eb565b62000320565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200024b90620002e3565b90600052602060002090601f0160209004810192826200026f5760008555620002ba565b82601f106200028a57805160ff1916838001178555620002ba565b82800160010185558215620002ba579182015b82811115620002ba5782518255916020019190600101906200029d565b50620002c8929150620002cc565b5090565b5b80821115620002c85760008155600101620002cd565b600281046001821680620002f857607f821691505b602082108114156200031a57634e487b7160e01b600052602260045260246000fd5b50919050565b612e8680620003306000396000f3fe6080604052600436106102e45760003560e01c80636352211e11610190578063affed0e0116100dc578063e2310ef211610095578063e985e9c51161006f578063e985e9c5146107e6578063f2fde38b14610806578063f74ea41814610826578063f7ea7a3d1461083b576102e4565b8063e2310ef21461079c578063e562723e146107bc578063e8cc00ad146107d1576102e4565b8063affed0e0146106ff578063b88d4fde14610714578063bb51f32d14610734578063bc33718214610749578063c87b56dd14610769578063d96a094a14610789576102e4565b80638da5cb5b1161014957806395d89b411161012357806395d89b41146106a0578063969e9d0c146106b5578063a035b1fe146106ca578063a22cb465146106df576102e4565b80638da5cb5b1461065657806391b7f5ed1461066b5780639426eef81461068b576102e4565b80636352211e146105b757806368428a1b146105d757806370a08231146105ec578063715018a61461060c5780637437681e14610621578063841718a614610636576102e4565b806330176e131161024f57806347002d1d1161020857806353135ca0116101e257806353135ca0146105585780635563ef181461056d5780635e048cc91461058d578063615db6e1146105a2576102e4565b806347002d1d1461051b578063475053801461053057806349c3221714610545576102e4565b806330176e131461047157806336606a6c146104915780633aea5bdb146104a65780633f8121a2146104bb57806342842e0e146104db57806343970161146104fb576102e4565b8063095ea7b3116102a1578063095ea7b3146103c5578063119552a1146103e557806318160ddd146103fa5780631ae5b0911461040f57806323b872dd14610424578063276f093414610444576102e4565b806301ffc9a7146102e9578063034c708b1461031f578063050225ea1461033457806306fdde0314610354578063081812fc1461037657806308fc299b146103a3575b600080fd5b3480156102f557600080fd5b506103096103043660046124ae565b61085b565b6040516103169190612674565b60405180910390f35b61033261032d366004612553565b6108a3565b005b34801561034057600080fd5b5061033261034f3660046123bd565b610a4b565b34801561036057600080fd5b50610369610b37565b604051610316919061267f565b34801561038257600080fd5b50610396610391366004612553565b610bc9565b60405161031691906125c6565b3480156103af57600080fd5b506103b8610c0c565b6040516103169190612ccd565b3480156103d157600080fd5b506103326103e03660046123bd565b610c12565b3480156103f157600080fd5b50610396610caa565b34801561040657600080fd5b506103b8610cb9565b34801561041b57600080fd5b506103b8610cbf565b34801561043057600080fd5b5061033261043f3660046122a1565b610cc5565b34801561045057600080fd5b5061046461045f366004612255565b610cfd565b6040516103169190612630565b34801561047d57600080fd5b5061033261048c3660046124e6565b610de1565b34801561049d57600080fd5b506103b8610e2c565b3480156104b257600080fd5b506103b8610e32565b3480156104c757600080fd5b506103326104d6366004612494565b610e38565b3480156104e757600080fd5b506103326104f63660046122a1565b610e95565b34801561050757600080fd5b506103326105163660046123e6565b610eb0565b34801561052757600080fd5b5061046461111b565b34801561053c57600080fd5b5061039661112b565b610332610553366004612553565b61113a565b34801561056457600080fd5b506103096112a8565b34801561057957600080fd5b50610332610588366004612553565b6112b8565b34801561059957600080fd5b506103966112fc565b3480156105ae57600080fd5b5061039661130b565b3480156105c357600080fd5b506103966105d2366004612553565b61131a565b3480156105e357600080fd5b5061030961134f565b3480156105f857600080fd5b506103b8610607366004612255565b61135f565b34801561061857600080fd5b506103326113a3565b34801561062d57600080fd5b506103b86113ee565b34801561064257600080fd5b50610332610651366004612494565b6113f4565b34801561066257600080fd5b50610396611451565b34801561067757600080fd5b50610332610686366004612553565b611460565b34801561069757600080fd5b506103966114a4565b3480156106ac57600080fd5b506103696114b3565b3480156106c157600080fd5b506103966114c2565b3480156106d657600080fd5b506103b86114d1565b3480156106eb57600080fd5b506103326106fa366004612394565b6114d7565b34801561070b57600080fd5b506103b86115a5565b34801561072057600080fd5b5061033261072f3660046122dc565b6115ab565b34801561074057600080fd5b506103326115ea565b34801561075557600080fd5b50610332610764366004612553565b611818565b34801561077557600080fd5b50610369610784366004612553565b61185c565b610332610797366004612553565b6118df565b3480156107a857600080fd5b506103b86107b7366004612255565b6119d0565b3480156107c857600080fd5b506103b86119db565b3480156107dd57600080fd5b506103326119e1565b3480156107f257600080fd5b5061030961080136600461226f565b611a4c565b34801561081257600080fd5b50610332610821366004612255565b611a7a565b34801561083257600080fd5b50610396611ae8565b34801561084757600080fd5b50610332610856366004612553565b611af7565b60006001600160e01b031982166380ac58cd60e01b148061088c57506001600160e01b03198216635b5e139f60e01b145b8061089b575061089b82611b3b565b90505b919050565b600654600160a81b900460ff166108d55760405162461bcd60e51b81526004016108cc90612c9e565b60405180910390fd5b600a54600e546108e59083612d00565b11156109035760405162461bcd60e51b81526004016108cc90612bfa565b600f54811115806109145750600181105b6109305760405162461bcd60e51b81526004016108cc906127f5565b600a54600e546109409083612d00565b111561095e5760405162461bcd60e51b81526004016108cc90612b82565b600954600c5461096e9083612d00565b111561098c5760405162461bcd60e51b81526004016108cc90612b82565b8060085461099a9190612d2c565b34146109b85760405162461bcd60e51b81526004016108cc90612b0c565b60005b81811015610a0e57600c546109d03382611b54565b600c80549060006109e083612dc9565b9091555050600e80549060006109f583612dc9565b9190505550508080610a0690612dc9565b9150506109bb565b507f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968853382604051610a40929190612617565b60405180910390a150565b610a53611b72565b6001600160a01b0316610a64611451565b6001600160a01b031614610a8a5760405162461bcd60e51b81526004016108cc90612a8e565b600954600c54610a9a9083612d00565b1115610ab85760405162461bcd60e51b81526004016108cc90612b82565b60005b81811015610af957600c54610ad08482611b54565b600c8054906000610ae083612dc9565b9190505550508080610af190612dc9565b915050610abb565b507f2118eda2a5fcc2e5f909a608477a856272adadcb48e1373747c51d2d3f6fc2ef8282604051610b2b929190612617565b60405180910390a15050565b606060008054610b4690612d8e565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7290612d8e565b8015610bbf5780601f10610b9457610100808354040283529160200191610bbf565b820191906000526020600020905b815481529060010190602001808311610ba257829003601f168201915b5050505050905090565b6000610bd482611b76565b610bf05760405162461bcd60e51b81526004016108cc90612a42565b506000908152600460205260409020546001600160a01b031690565b600b5481565b6000610c1d8261131a565b9050806001600160a01b0316836001600160a01b03161415610c515760405162461bcd60e51b81526004016108cc90612bb9565b806001600160a01b0316610c63611b72565b6001600160a01b03161480610c7f5750610c7f81610801611b72565b610c9b5760405162461bcd60e51b81526004016108cc9061291d565b610ca58383611b93565b505050565b6011546001600160a01b031681565b60095481565b60105481565b610cd6610cd0611b72565b82611c01565b610cf25760405162461bcd60e51b81526004016108cc90612c4d565b610ca5838383611c86565b60606000610d0a8361135f565b67ffffffffffffffff811115610d3057634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610d59578160200160208202803683370190505b5090506000805b600c54811015610dd857846001600160a01b0316610d7d8261131a565b6001600160a01b03161415610dc65780838381518110610dad57634e487b7160e01b600052603260045260246000fd5b602090810291909101015281610dc281612dc9565b9250505b80610dd081612dc9565b915050610d60565b50909392505050565b610de9611b72565b6001600160a01b0316610dfa611451565b6001600160a01b031614610e205760405162461bcd60e51b81526004016108cc90612a8e565b610ca560078383612195565b600e5481565b600a5481565b610e40611b72565b6001600160a01b0316610e51611451565b6001600160a01b031614610e775760405162461bcd60e51b81526004016108cc90612a8e565b60068054911515600160a81b0260ff60a81b19909216919091179055565b610ca5838383604051806020016040528060008152506115ab565b610eb8611b72565b6001600160a01b0316610ec9611451565b6001600160a01b031614610eef5760405162461bcd60e51b81526004016108cc90612a8e565b80600081518110610f1057634e487b7160e01b600052603260045260246000fd5b6020026020010151601160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080600181518110610f5f57634e487b7160e01b600052603260045260246000fd5b6020026020010151601260006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080600281518110610fae57634e487b7160e01b600052603260045260246000fd5b6020026020010151601360006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080600381518110610ffd57634e487b7160e01b600052603260045260246000fd5b6020026020010151601460006101000a8154816001600160a01b0302191690836001600160a01b031602179055508060048151811061104c57634e487b7160e01b600052603260045260246000fd5b6020026020010151601560006101000a8154816001600160a01b0302191690836001600160a01b031602179055508060058151811061109b57634e487b7160e01b600052603260045260246000fd5b6020026020010151601660006101000a8154816001600160a01b0302191690836001600160a01b03160217905550806006815181106110ea57634e487b7160e01b600052603260045260246000fd5b6020026020010151601760006101000a8154816001600160a01b0302191690836001600160a01b0316021790555050565b606061112632610cfd565b905090565b6016546001600160a01b031681565b600654600160a81b900460ff166111635760405162461bcd60e51b81526004016108cc90612c9e565b601054816111703361135f565b61117a9190612d00565b11156111985760405162461bcd60e51b81526004016108cc9061272a565b600b54600d546111a89083612d00565b11156111c65760405162461bcd60e51b81526004016108cc906127be565b600954600c546111d69083612d00565b11156111f45760405162461bcd60e51b81526004016108cc90612b82565b806008546112029190612d2c565b34146112205760405162461bcd60e51b81526004016108cc90612b0c565b60005b8181101561127657600c546112383382611b54565b600c805490600061124883612dc9565b9091555050600d805490600061125d83612dc9565b919050555050808061126e90612dc9565b915050611223565b507fee0ec82f2272142465300ec3d87176cc6ebbe2b93c6a2d6b9c870db38ef8b8d83382604051610a40929190612617565b600654600160a81b900460ff1681565b6112c0611b72565b6001600160a01b03166112d1611451565b6001600160a01b0316146112f75760405162461bcd60e51b81526004016108cc90612a8e565b601055565b6017546001600160a01b031681565b6015546001600160a01b031681565b6000818152600260205260408120546001600160a01b03168061089b5760405162461bcd60e51b81526004016108cc906129c4565b600654600160a01b900460ff1681565b60006001600160a01b0382166113875760405162461bcd60e51b81526004016108cc9061297a565b506001600160a01b031660009081526003602052604090205490565b6113ab611b72565b6001600160a01b03166113bc611451565b6001600160a01b0316146113e25760405162461bcd60e51b81526004016108cc90612a8e565b6113ec6000611db3565b565b600f5481565b6113fc611b72565b6001600160a01b031661140d611451565b6001600160a01b0316146114335760405162461bcd60e51b81526004016108cc90612a8e565b60068054911515600160a01b0260ff60a01b19909216919091179055565b6006546001600160a01b031690565b611468611b72565b6001600160a01b0316611479611451565b6001600160a01b03161461149f5760405162461bcd60e51b81526004016108cc90612a8e565b600855565b6013546001600160a01b031681565b606060018054610b4690612d8e565b6012546001600160a01b031681565b60085481565b6114df611b72565b6001600160a01b0316826001600160a01b031614156115105760405162461bcd60e51b81526004016108cc9061286e565b806005600061151d611b72565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155611561611b72565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115999190612674565b60405180910390a35050565b600c5481565b6115bc6115b6611b72565b83611c01565b6115d85760405162461bcd60e51b81526004016108cc90612c4d565b6115e484848484611e05565b50505050565b6115f2611b72565b6001600160a01b0316611603611451565b6001600160a01b0316146116295760405162461bcd60e51b81526004016108cc90612a8e565b60115447906001600160a01b03166108fc6064611647846005612d2c565b6116519190612d18565b6040518115909202916000818181858888f1935050505061167157600080fd5b6012546001600160a01b03166108fc606461168d846005612d2c565b6116979190612d18565b6040518115909202916000818181858888f193505050506116b757600080fd5b6013546001600160a01b03166108fc60646116d3846005612d2c565b6116dd9190612d18565b6040518115909202916000818181858888f193505050506116fd57600080fd5b6014546001600160a01b03166108fc6064611719846005612d2c565b6117239190612d18565b6040518115909202916000818181858888f1935050505061174357600080fd5b6015546001600160a01b03166108fc606461175f846005612d2c565b6117699190612d18565b6040518115909202916000818181858888f1935050505061178957600080fd5b6016546001600160a01b03166108fc60646117a5846002612d2c565b6117af9190612d18565b6040518115909202916000818181858888f193505050506117cf57600080fd5b6017546001600160a01b03166108fc60646117eb846049612d2c565b6117f59190612d18565b6040518115909202916000818181858888f1935050505061181557600080fd5b50565b611820611b72565b6001600160a01b0316611831611451565b6001600160a01b0316146118575760405162461bcd60e51b81526004016108cc90612a8e565b600f55565b606061186782611b76565b6118835760405162461bcd60e51b81526004016108cc90612b33565b600061188d611e38565b905060008151116118ad57604051806020016040528060008152506118d8565b806118b784611e47565b6040516020016118c8929190612597565b6040516020818303038152906040525b9392505050565b600654600160a01b900460ff166119085760405162461bcd60e51b81526004016108cc906128a5565b600f54811115806119195750600181105b6119355760405162461bcd60e51b81526004016108cc906127f5565b600954600c546119459083612d00565b11156119635760405162461bcd60e51b81526004016108cc90612b82565b806008546119719190612d2c565b341461198f5760405162461bcd60e51b81526004016108cc90612b0c565b60005b81811015610a0e57600c546119a73382611b54565b600c80549060006119b783612dc9565b91905055505080806119c890612dc9565b915050611992565b600061089b8261135f565b600d5481565b6119e9611b72565b6001600160a01b03166119fa611451565b6001600160a01b031614611a205760405162461bcd60e51b81526004016108cc90612a8e565b60405133904780156108fc02916000818181858888f19350505050158015611815573d6000803e3d6000fd5b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b611a82611b72565b6001600160a01b0316611a93611451565b6001600160a01b031614611ab95760405162461bcd60e51b81526004016108cc90612a8e565b6001600160a01b038116611adf5760405162461bcd60e51b81526004016108cc906126e4565b61181581611db3565b6014546001600160a01b031681565b611aff611b72565b6001600160a01b0316611b10611451565b6001600160a01b031614611b365760405162461bcd60e51b81526004016108cc90612a8e565b600955565b6001600160e01b031981166301ffc9a760e01b14919050565b611b6e828260405180602001604052806000815250611f62565b5050565b3390565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611bc88261131a565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611c0c82611b76565b611c285760405162461bcd60e51b81526004016108cc906128d1565b6000611c338361131a565b9050806001600160a01b0316846001600160a01b03161480611c6e5750836001600160a01b0316611c6384610bc9565b6001600160a01b0316145b80611c7e5750611c7e8185611a4c565b949350505050565b826001600160a01b0316611c998261131a565b6001600160a01b031614611cbf5760405162461bcd60e51b81526004016108cc90612ac3565b6001600160a01b038216611ce55760405162461bcd60e51b81526004016108cc9061282a565b611cf0838383610ca5565b611cfb600082611b93565b6001600160a01b0383166000908152600360205260408120805460019290611d24908490612d4b565b90915550506001600160a01b0382166000908152600360205260408120805460019290611d52908490612d00565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611e10848484611c86565b611e1c84848484611f95565b6115e45760405162461bcd60e51b81526004016108cc90612692565b606060078054610b4690612d8e565b606081611e6c57506040805180820190915260018152600360fc1b602082015261089e565b8160005b8115611e965780611e8081612dc9565b9150611e8f9050600a83612d18565b9150611e70565b60008167ffffffffffffffff811115611ebf57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611ee9576020820181803683370190505b5090505b8415611c7e57611efe600183612d4b565b9150611f0b600a86612de4565b611f16906030612d00565b60f81b818381518110611f3957634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611f5b600a86612d18565b9450611eed565b611f6c83836120b0565b611f796000848484611f95565b610ca55760405162461bcd60e51b81526004016108cc90612692565b6000611fa9846001600160a01b031661218f565b156120a557836001600160a01b031663150b7a02611fc5611b72565b8786866040518563ffffffff1660e01b8152600401611fe794939291906125da565b602060405180830381600087803b15801561200157600080fd5b505af1925050508015612031575060408051601f3d908101601f1916820190925261202e918101906124ca565b60015b61208b573d80801561205f576040519150601f19603f3d011682016040523d82523d6000602084013e612064565b606091505b5080516120835760405162461bcd60e51b81526004016108cc90612692565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611c7e565b506001949350505050565b6001600160a01b0382166120d65760405162461bcd60e51b81526004016108cc90612a0d565b6120df81611b76565b156120fc5760405162461bcd60e51b81526004016108cc90612787565b61210860008383610ca5565b6001600160a01b0382166000908152600360205260408120805460019290612131908490612d00565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b3b151590565b8280546121a190612d8e565b90600052602060002090601f0160209004810192826121c35760008555612209565b82601f106121dc5782800160ff19823516178555612209565b82800160010185558215612209579182015b828111156122095782358255916020019190600101906121ee565b50612215929150612219565b5090565b5b80821115612215576000815560010161221a565b80356001600160a01b038116811461089e57600080fd5b8035801515811461089e57600080fd5b600060208284031215612266578081fd5b6118d88261222e565b60008060408385031215612281578081fd5b61228a8361222e565b91506122986020840161222e565b90509250929050565b6000806000606084860312156122b5578081fd5b6122be8461222e565b92506122cc6020850161222e565b9150604084013590509250925092565b600080600080608085870312156122f1578081fd5b6122fa8561222e565b9350602061230981870161222e565b935060408601359250606086013567ffffffffffffffff8082111561232c578384fd5b818801915088601f83011261233f578384fd5b81358181111561235157612351612e24565b612363601f8201601f19168501612cd6565b91508082528984828501011115612378578485fd5b8084840185840137810190920192909252939692955090935050565b600080604083850312156123a6578182fd5b6123af8361222e565b915061229860208401612245565b600080604083850312156123cf578182fd5b6123d88361222e565b946020939093013593505050565b600060208083850312156123f8578182fd5b823567ffffffffffffffff8082111561240f578384fd5b818501915085601f830112612422578384fd5b81358181111561243457612434612e24565b8381029150612444848301612cd6565b8181528481019084860184860187018a101561245e578788fd5b8795505b83861015612487576124738161222e565b835260019590950194918601918601612462565b5098975050505050505050565b6000602082840312156124a5578081fd5b6118d882612245565b6000602082840312156124bf578081fd5b81356118d881612e3a565b6000602082840312156124db578081fd5b81516118d881612e3a565b600080602083850312156124f8578182fd5b823567ffffffffffffffff8082111561250f578384fd5b818501915085601f830112612522578384fd5b813581811115612530578485fd5b866020828501011115612541578485fd5b60209290920196919550909350505050565b600060208284031215612564578081fd5b5035919050565b60008151808452612583816020860160208601612d62565b601f01601f19169290920160200192915050565b600083516125a9818460208801612d62565b8351908301906125bd818360208801612d62565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061260d9083018461256b565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b818110156126685783518352928401929184019160010161264c565b50909695505050505050565b901515815260200190565b6000602082526118d8602083018461256b565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252603a908201527f546f6f206d616e792c206f7220796f7527766520616c7265616479206d696e7460408201527f656420746865206d6178696d756d20666f722070726573616c65000000000000606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b6020808252601e908201527f56616c756520657863656564732070726573616c654d6178537570706c790000604082015260600190565b6020808252818101527f517479206f66206d696e747320746f6f2068696768206f7220746f6f206c6f77604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b60208082526012908201527153616c65206973206e6f742061637469766560701b604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252600d908201526c496e76616c69642076616c756560981b604082015260600190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526019908201527f56616c7565206578636565647320746f74616c537570706c7900000000000000604082015260600190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526033908201527f546f6f206d616e792c206f72207468652076616c756520657863656564732074604082015272686520746f74616c2061706520737570706c7960681b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526015908201527450726573616c65206973206e6f742061637469766560581b604082015260600190565b90815260200190565b60405181810167ffffffffffffffff81118282101715612cf857612cf8612e24565b604052919050565b60008219821115612d1357612d13612df8565b500190565b600082612d2757612d27612e0e565b500490565b6000816000190483118215151615612d4657612d46612df8565b500290565b600082821015612d5d57612d5d612df8565b500390565b60005b83811015612d7d578181015183820152602001612d65565b838111156115e45750506000910152565b600281046001821680612da257607f821691505b60208210811415612dc357634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612ddd57612ddd612df8565b5060010190565b600082612df357612df3612e0e565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461181557600080fdfea2646970667358221220b0597d04aacd38ebcbe076a8e3b34d3f51ffb2d8a427e5b4d8b81dadb1a459fb64736f6c6343000800003368747470733a2f2f6e66746f726465726f66736861646f77732e636f6d2f6170692f6d657461646174613f746f6b656e49643d
Deployed Bytecode
0x6080604052600436106102e45760003560e01c80636352211e11610190578063affed0e0116100dc578063e2310ef211610095578063e985e9c51161006f578063e985e9c5146107e6578063f2fde38b14610806578063f74ea41814610826578063f7ea7a3d1461083b576102e4565b8063e2310ef21461079c578063e562723e146107bc578063e8cc00ad146107d1576102e4565b8063affed0e0146106ff578063b88d4fde14610714578063bb51f32d14610734578063bc33718214610749578063c87b56dd14610769578063d96a094a14610789576102e4565b80638da5cb5b1161014957806395d89b411161012357806395d89b41146106a0578063969e9d0c146106b5578063a035b1fe146106ca578063a22cb465146106df576102e4565b80638da5cb5b1461065657806391b7f5ed1461066b5780639426eef81461068b576102e4565b80636352211e146105b757806368428a1b146105d757806370a08231146105ec578063715018a61461060c5780637437681e14610621578063841718a614610636576102e4565b806330176e131161024f57806347002d1d1161020857806353135ca0116101e257806353135ca0146105585780635563ef181461056d5780635e048cc91461058d578063615db6e1146105a2576102e4565b806347002d1d1461051b578063475053801461053057806349c3221714610545576102e4565b806330176e131461047157806336606a6c146104915780633aea5bdb146104a65780633f8121a2146104bb57806342842e0e146104db57806343970161146104fb576102e4565b8063095ea7b3116102a1578063095ea7b3146103c5578063119552a1146103e557806318160ddd146103fa5780631ae5b0911461040f57806323b872dd14610424578063276f093414610444576102e4565b806301ffc9a7146102e9578063034c708b1461031f578063050225ea1461033457806306fdde0314610354578063081812fc1461037657806308fc299b146103a3575b600080fd5b3480156102f557600080fd5b506103096103043660046124ae565b61085b565b6040516103169190612674565b60405180910390f35b61033261032d366004612553565b6108a3565b005b34801561034057600080fd5b5061033261034f3660046123bd565b610a4b565b34801561036057600080fd5b50610369610b37565b604051610316919061267f565b34801561038257600080fd5b50610396610391366004612553565b610bc9565b60405161031691906125c6565b3480156103af57600080fd5b506103b8610c0c565b6040516103169190612ccd565b3480156103d157600080fd5b506103326103e03660046123bd565b610c12565b3480156103f157600080fd5b50610396610caa565b34801561040657600080fd5b506103b8610cb9565b34801561041b57600080fd5b506103b8610cbf565b34801561043057600080fd5b5061033261043f3660046122a1565b610cc5565b34801561045057600080fd5b5061046461045f366004612255565b610cfd565b6040516103169190612630565b34801561047d57600080fd5b5061033261048c3660046124e6565b610de1565b34801561049d57600080fd5b506103b8610e2c565b3480156104b257600080fd5b506103b8610e32565b3480156104c757600080fd5b506103326104d6366004612494565b610e38565b3480156104e757600080fd5b506103326104f63660046122a1565b610e95565b34801561050757600080fd5b506103326105163660046123e6565b610eb0565b34801561052757600080fd5b5061046461111b565b34801561053c57600080fd5b5061039661112b565b610332610553366004612553565b61113a565b34801561056457600080fd5b506103096112a8565b34801561057957600080fd5b50610332610588366004612553565b6112b8565b34801561059957600080fd5b506103966112fc565b3480156105ae57600080fd5b5061039661130b565b3480156105c357600080fd5b506103966105d2366004612553565b61131a565b3480156105e357600080fd5b5061030961134f565b3480156105f857600080fd5b506103b8610607366004612255565b61135f565b34801561061857600080fd5b506103326113a3565b34801561062d57600080fd5b506103b86113ee565b34801561064257600080fd5b50610332610651366004612494565b6113f4565b34801561066257600080fd5b50610396611451565b34801561067757600080fd5b50610332610686366004612553565b611460565b34801561069757600080fd5b506103966114a4565b3480156106ac57600080fd5b506103696114b3565b3480156106c157600080fd5b506103966114c2565b3480156106d657600080fd5b506103b86114d1565b3480156106eb57600080fd5b506103326106fa366004612394565b6114d7565b34801561070b57600080fd5b506103b86115a5565b34801561072057600080fd5b5061033261072f3660046122dc565b6115ab565b34801561074057600080fd5b506103326115ea565b34801561075557600080fd5b50610332610764366004612553565b611818565b34801561077557600080fd5b50610369610784366004612553565b61185c565b610332610797366004612553565b6118df565b3480156107a857600080fd5b506103b86107b7366004612255565b6119d0565b3480156107c857600080fd5b506103b86119db565b3480156107dd57600080fd5b506103326119e1565b3480156107f257600080fd5b5061030961080136600461226f565b611a4c565b34801561081257600080fd5b50610332610821366004612255565b611a7a565b34801561083257600080fd5b50610396611ae8565b34801561084757600080fd5b50610332610856366004612553565b611af7565b60006001600160e01b031982166380ac58cd60e01b148061088c57506001600160e01b03198216635b5e139f60e01b145b8061089b575061089b82611b3b565b90505b919050565b600654600160a81b900460ff166108d55760405162461bcd60e51b81526004016108cc90612c9e565b60405180910390fd5b600a54600e546108e59083612d00565b11156109035760405162461bcd60e51b81526004016108cc90612bfa565b600f54811115806109145750600181105b6109305760405162461bcd60e51b81526004016108cc906127f5565b600a54600e546109409083612d00565b111561095e5760405162461bcd60e51b81526004016108cc90612b82565b600954600c5461096e9083612d00565b111561098c5760405162461bcd60e51b81526004016108cc90612b82565b8060085461099a9190612d2c565b34146109b85760405162461bcd60e51b81526004016108cc90612b0c565b60005b81811015610a0e57600c546109d03382611b54565b600c80549060006109e083612dc9565b9091555050600e80549060006109f583612dc9565b9190505550508080610a0690612dc9565b9150506109bb565b507f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968853382604051610a40929190612617565b60405180910390a150565b610a53611b72565b6001600160a01b0316610a64611451565b6001600160a01b031614610a8a5760405162461bcd60e51b81526004016108cc90612a8e565b600954600c54610a9a9083612d00565b1115610ab85760405162461bcd60e51b81526004016108cc90612b82565b60005b81811015610af957600c54610ad08482611b54565b600c8054906000610ae083612dc9565b9190505550508080610af190612dc9565b915050610abb565b507f2118eda2a5fcc2e5f909a608477a856272adadcb48e1373747c51d2d3f6fc2ef8282604051610b2b929190612617565b60405180910390a15050565b606060008054610b4690612d8e565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7290612d8e565b8015610bbf5780601f10610b9457610100808354040283529160200191610bbf565b820191906000526020600020905b815481529060010190602001808311610ba257829003601f168201915b5050505050905090565b6000610bd482611b76565b610bf05760405162461bcd60e51b81526004016108cc90612a42565b506000908152600460205260409020546001600160a01b031690565b600b5481565b6000610c1d8261131a565b9050806001600160a01b0316836001600160a01b03161415610c515760405162461bcd60e51b81526004016108cc90612bb9565b806001600160a01b0316610c63611b72565b6001600160a01b03161480610c7f5750610c7f81610801611b72565b610c9b5760405162461bcd60e51b81526004016108cc9061291d565b610ca58383611b93565b505050565b6011546001600160a01b031681565b60095481565b60105481565b610cd6610cd0611b72565b82611c01565b610cf25760405162461bcd60e51b81526004016108cc90612c4d565b610ca5838383611c86565b60606000610d0a8361135f565b67ffffffffffffffff811115610d3057634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610d59578160200160208202803683370190505b5090506000805b600c54811015610dd857846001600160a01b0316610d7d8261131a565b6001600160a01b03161415610dc65780838381518110610dad57634e487b7160e01b600052603260045260246000fd5b602090810291909101015281610dc281612dc9565b9250505b80610dd081612dc9565b915050610d60565b50909392505050565b610de9611b72565b6001600160a01b0316610dfa611451565b6001600160a01b031614610e205760405162461bcd60e51b81526004016108cc90612a8e565b610ca560078383612195565b600e5481565b600a5481565b610e40611b72565b6001600160a01b0316610e51611451565b6001600160a01b031614610e775760405162461bcd60e51b81526004016108cc90612a8e565b60068054911515600160a81b0260ff60a81b19909216919091179055565b610ca5838383604051806020016040528060008152506115ab565b610eb8611b72565b6001600160a01b0316610ec9611451565b6001600160a01b031614610eef5760405162461bcd60e51b81526004016108cc90612a8e565b80600081518110610f1057634e487b7160e01b600052603260045260246000fd5b6020026020010151601160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080600181518110610f5f57634e487b7160e01b600052603260045260246000fd5b6020026020010151601260006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080600281518110610fae57634e487b7160e01b600052603260045260246000fd5b6020026020010151601360006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080600381518110610ffd57634e487b7160e01b600052603260045260246000fd5b6020026020010151601460006101000a8154816001600160a01b0302191690836001600160a01b031602179055508060048151811061104c57634e487b7160e01b600052603260045260246000fd5b6020026020010151601560006101000a8154816001600160a01b0302191690836001600160a01b031602179055508060058151811061109b57634e487b7160e01b600052603260045260246000fd5b6020026020010151601660006101000a8154816001600160a01b0302191690836001600160a01b03160217905550806006815181106110ea57634e487b7160e01b600052603260045260246000fd5b6020026020010151601760006101000a8154816001600160a01b0302191690836001600160a01b0316021790555050565b606061112632610cfd565b905090565b6016546001600160a01b031681565b600654600160a81b900460ff166111635760405162461bcd60e51b81526004016108cc90612c9e565b601054816111703361135f565b61117a9190612d00565b11156111985760405162461bcd60e51b81526004016108cc9061272a565b600b54600d546111a89083612d00565b11156111c65760405162461bcd60e51b81526004016108cc906127be565b600954600c546111d69083612d00565b11156111f45760405162461bcd60e51b81526004016108cc90612b82565b806008546112029190612d2c565b34146112205760405162461bcd60e51b81526004016108cc90612b0c565b60005b8181101561127657600c546112383382611b54565b600c805490600061124883612dc9565b9091555050600d805490600061125d83612dc9565b919050555050808061126e90612dc9565b915050611223565b507fee0ec82f2272142465300ec3d87176cc6ebbe2b93c6a2d6b9c870db38ef8b8d83382604051610a40929190612617565b600654600160a81b900460ff1681565b6112c0611b72565b6001600160a01b03166112d1611451565b6001600160a01b0316146112f75760405162461bcd60e51b81526004016108cc90612a8e565b601055565b6017546001600160a01b031681565b6015546001600160a01b031681565b6000818152600260205260408120546001600160a01b03168061089b5760405162461bcd60e51b81526004016108cc906129c4565b600654600160a01b900460ff1681565b60006001600160a01b0382166113875760405162461bcd60e51b81526004016108cc9061297a565b506001600160a01b031660009081526003602052604090205490565b6113ab611b72565b6001600160a01b03166113bc611451565b6001600160a01b0316146113e25760405162461bcd60e51b81526004016108cc90612a8e565b6113ec6000611db3565b565b600f5481565b6113fc611b72565b6001600160a01b031661140d611451565b6001600160a01b0316146114335760405162461bcd60e51b81526004016108cc90612a8e565b60068054911515600160a01b0260ff60a01b19909216919091179055565b6006546001600160a01b031690565b611468611b72565b6001600160a01b0316611479611451565b6001600160a01b03161461149f5760405162461bcd60e51b81526004016108cc90612a8e565b600855565b6013546001600160a01b031681565b606060018054610b4690612d8e565b6012546001600160a01b031681565b60085481565b6114df611b72565b6001600160a01b0316826001600160a01b031614156115105760405162461bcd60e51b81526004016108cc9061286e565b806005600061151d611b72565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155611561611b72565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115999190612674565b60405180910390a35050565b600c5481565b6115bc6115b6611b72565b83611c01565b6115d85760405162461bcd60e51b81526004016108cc90612c4d565b6115e484848484611e05565b50505050565b6115f2611b72565b6001600160a01b0316611603611451565b6001600160a01b0316146116295760405162461bcd60e51b81526004016108cc90612a8e565b60115447906001600160a01b03166108fc6064611647846005612d2c565b6116519190612d18565b6040518115909202916000818181858888f1935050505061167157600080fd5b6012546001600160a01b03166108fc606461168d846005612d2c565b6116979190612d18565b6040518115909202916000818181858888f193505050506116b757600080fd5b6013546001600160a01b03166108fc60646116d3846005612d2c565b6116dd9190612d18565b6040518115909202916000818181858888f193505050506116fd57600080fd5b6014546001600160a01b03166108fc6064611719846005612d2c565b6117239190612d18565b6040518115909202916000818181858888f1935050505061174357600080fd5b6015546001600160a01b03166108fc606461175f846005612d2c565b6117699190612d18565b6040518115909202916000818181858888f1935050505061178957600080fd5b6016546001600160a01b03166108fc60646117a5846002612d2c565b6117af9190612d18565b6040518115909202916000818181858888f193505050506117cf57600080fd5b6017546001600160a01b03166108fc60646117eb846049612d2c565b6117f59190612d18565b6040518115909202916000818181858888f1935050505061181557600080fd5b50565b611820611b72565b6001600160a01b0316611831611451565b6001600160a01b0316146118575760405162461bcd60e51b81526004016108cc90612a8e565b600f55565b606061186782611b76565b6118835760405162461bcd60e51b81526004016108cc90612b33565b600061188d611e38565b905060008151116118ad57604051806020016040528060008152506118d8565b806118b784611e47565b6040516020016118c8929190612597565b6040516020818303038152906040525b9392505050565b600654600160a01b900460ff166119085760405162461bcd60e51b81526004016108cc906128a5565b600f54811115806119195750600181105b6119355760405162461bcd60e51b81526004016108cc906127f5565b600954600c546119459083612d00565b11156119635760405162461bcd60e51b81526004016108cc90612b82565b806008546119719190612d2c565b341461198f5760405162461bcd60e51b81526004016108cc90612b0c565b60005b81811015610a0e57600c546119a73382611b54565b600c80549060006119b783612dc9565b91905055505080806119c890612dc9565b915050611992565b600061089b8261135f565b600d5481565b6119e9611b72565b6001600160a01b03166119fa611451565b6001600160a01b031614611a205760405162461bcd60e51b81526004016108cc90612a8e565b60405133904780156108fc02916000818181858888f19350505050158015611815573d6000803e3d6000fd5b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b611a82611b72565b6001600160a01b0316611a93611451565b6001600160a01b031614611ab95760405162461bcd60e51b81526004016108cc90612a8e565b6001600160a01b038116611adf5760405162461bcd60e51b81526004016108cc906126e4565b61181581611db3565b6014546001600160a01b031681565b611aff611b72565b6001600160a01b0316611b10611451565b6001600160a01b031614611b365760405162461bcd60e51b81526004016108cc90612a8e565b600955565b6001600160e01b031981166301ffc9a760e01b14919050565b611b6e828260405180602001604052806000815250611f62565b5050565b3390565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611bc88261131a565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611c0c82611b76565b611c285760405162461bcd60e51b81526004016108cc906128d1565b6000611c338361131a565b9050806001600160a01b0316846001600160a01b03161480611c6e5750836001600160a01b0316611c6384610bc9565b6001600160a01b0316145b80611c7e5750611c7e8185611a4c565b949350505050565b826001600160a01b0316611c998261131a565b6001600160a01b031614611cbf5760405162461bcd60e51b81526004016108cc90612ac3565b6001600160a01b038216611ce55760405162461bcd60e51b81526004016108cc9061282a565b611cf0838383610ca5565b611cfb600082611b93565b6001600160a01b0383166000908152600360205260408120805460019290611d24908490612d4b565b90915550506001600160a01b0382166000908152600360205260408120805460019290611d52908490612d00565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611e10848484611c86565b611e1c84848484611f95565b6115e45760405162461bcd60e51b81526004016108cc90612692565b606060078054610b4690612d8e565b606081611e6c57506040805180820190915260018152600360fc1b602082015261089e565b8160005b8115611e965780611e8081612dc9565b9150611e8f9050600a83612d18565b9150611e70565b60008167ffffffffffffffff811115611ebf57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611ee9576020820181803683370190505b5090505b8415611c7e57611efe600183612d4b565b9150611f0b600a86612de4565b611f16906030612d00565b60f81b818381518110611f3957634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611f5b600a86612d18565b9450611eed565b611f6c83836120b0565b611f796000848484611f95565b610ca55760405162461bcd60e51b81526004016108cc90612692565b6000611fa9846001600160a01b031661218f565b156120a557836001600160a01b031663150b7a02611fc5611b72565b8786866040518563ffffffff1660e01b8152600401611fe794939291906125da565b602060405180830381600087803b15801561200157600080fd5b505af1925050508015612031575060408051601f3d908101601f1916820190925261202e918101906124ca565b60015b61208b573d80801561205f576040519150601f19603f3d011682016040523d82523d6000602084013e612064565b606091505b5080516120835760405162461bcd60e51b81526004016108cc90612692565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611c7e565b506001949350505050565b6001600160a01b0382166120d65760405162461bcd60e51b81526004016108cc90612a0d565b6120df81611b76565b156120fc5760405162461bcd60e51b81526004016108cc90612787565b61210860008383610ca5565b6001600160a01b0382166000908152600360205260408120805460019290612131908490612d00565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b3b151590565b8280546121a190612d8e565b90600052602060002090601f0160209004810192826121c35760008555612209565b82601f106121dc5782800160ff19823516178555612209565b82800160010185558215612209579182015b828111156122095782358255916020019190600101906121ee565b50612215929150612219565b5090565b5b80821115612215576000815560010161221a565b80356001600160a01b038116811461089e57600080fd5b8035801515811461089e57600080fd5b600060208284031215612266578081fd5b6118d88261222e565b60008060408385031215612281578081fd5b61228a8361222e565b91506122986020840161222e565b90509250929050565b6000806000606084860312156122b5578081fd5b6122be8461222e565b92506122cc6020850161222e565b9150604084013590509250925092565b600080600080608085870312156122f1578081fd5b6122fa8561222e565b9350602061230981870161222e565b935060408601359250606086013567ffffffffffffffff8082111561232c578384fd5b818801915088601f83011261233f578384fd5b81358181111561235157612351612e24565b612363601f8201601f19168501612cd6565b91508082528984828501011115612378578485fd5b8084840185840137810190920192909252939692955090935050565b600080604083850312156123a6578182fd5b6123af8361222e565b915061229860208401612245565b600080604083850312156123cf578182fd5b6123d88361222e565b946020939093013593505050565b600060208083850312156123f8578182fd5b823567ffffffffffffffff8082111561240f578384fd5b818501915085601f830112612422578384fd5b81358181111561243457612434612e24565b8381029150612444848301612cd6565b8181528481019084860184860187018a101561245e578788fd5b8795505b83861015612487576124738161222e565b835260019590950194918601918601612462565b5098975050505050505050565b6000602082840312156124a5578081fd5b6118d882612245565b6000602082840312156124bf578081fd5b81356118d881612e3a565b6000602082840312156124db578081fd5b81516118d881612e3a565b600080602083850312156124f8578182fd5b823567ffffffffffffffff8082111561250f578384fd5b818501915085601f830112612522578384fd5b813581811115612530578485fd5b866020828501011115612541578485fd5b60209290920196919550909350505050565b600060208284031215612564578081fd5b5035919050565b60008151808452612583816020860160208601612d62565b601f01601f19169290920160200192915050565b600083516125a9818460208801612d62565b8351908301906125bd818360208801612d62565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061260d9083018461256b565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b818110156126685783518352928401929184019160010161264c565b50909695505050505050565b901515815260200190565b6000602082526118d8602083018461256b565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252603a908201527f546f6f206d616e792c206f7220796f7527766520616c7265616479206d696e7460408201527f656420746865206d6178696d756d20666f722070726573616c65000000000000606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b6020808252601e908201527f56616c756520657863656564732070726573616c654d6178537570706c790000604082015260600190565b6020808252818101527f517479206f66206d696e747320746f6f2068696768206f7220746f6f206c6f77604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b60208082526012908201527153616c65206973206e6f742061637469766560701b604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252600d908201526c496e76616c69642076616c756560981b604082015260600190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526019908201527f56616c7565206578636565647320746f74616c537570706c7900000000000000604082015260600190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526033908201527f546f6f206d616e792c206f72207468652076616c756520657863656564732074604082015272686520746f74616c2061706520737570706c7960681b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526015908201527450726573616c65206973206e6f742061637469766560581b604082015260600190565b90815260200190565b60405181810167ffffffffffffffff81118282101715612cf857612cf8612e24565b604052919050565b60008219821115612d1357612d13612df8565b500190565b600082612d2757612d27612e0e565b500490565b6000816000190483118215151615612d4657612d46612df8565b500290565b600082821015612d5d57612d5d612df8565b500390565b60005b83811015612d7d578181015183820152602001612d65565b838111156115e45750506000910152565b600281046001821680612da257607f821691505b60208210811415612dc357634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612ddd57612ddd612df8565b5060010190565b600082612df357612df3612e0e565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461181557600080fdfea2646970667358221220b0597d04aacd38ebcbe076a8e3b34d3f51ffb2d8a427e5b4d8b81dadb1a459fb64736f6c63430008000033
Deployed Bytecode Sourcemap
44772:5886:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21003:355;;;;;;;;;;-1:-1:-1;21003:355:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48773:723;;;;;;:::i;:::-;;:::i;:::-;;47745:320;;;;;;;;;;-1:-1:-1;47745:320:0;;;;;:::i;:::-;;:::i;22172:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;23865:308::-;;;;;;;;;;-1:-1:-1;23865:308:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;45114:35::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;23388:411::-;;;;;;;;;;-1:-1:-1;23388:411:0;;;;;:::i;:::-;;:::i;45490:62::-;;;;;;;;;;;;;:::i;45040:30::-;;;;;;;;;;;;;:::i;45279:28::-;;;;;;;;;;;;;:::i;24924:376::-;;;;;;;;;;-1:-1:-1;24924:376:0;;;;;:::i;:::-;;:::i;46992:::-;;;;;;;;;;-1:-1:-1;46992:376:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;46137:104::-;;;;;;;;;;-1:-1:-1;46137:104:0;;;;;:::i;:::-;;:::i;45219:24::-;;;;;;;;;;;;;:::i;45077:30::-;;;;;;;;;;;;;:::i;46362:91::-;;;;;;;;;;-1:-1:-1;46362:91:0;;;;;:::i;:::-;;:::i;25371:185::-;;;;;;;;;;-1:-1:-1;25371:185:0;;;;;:::i;:::-;;:::i;46554:222::-;;;;;;;;;;-1:-1:-1;46554:222:0;;;;;:::i;:::-;;:::i;47380:112::-;;;;;;;;;;;;;:::i;45835:62::-;;;;;;;;;;;;;:::i;48073:688::-;;;;;;:::i;:::-;;:::i;44862:33::-;;;;;;;;;;;;;:::i;46883:97::-;;;;;;;;;;-1:-1:-1;46883:97:0;;;;;:::i;:::-;;:::i;45904:62::-;;;;;;;;;;;;;:::i;45766:::-;;;;;;;;;;;;;:::i;21779:326::-;;;;;;;;;;-1:-1:-1;21779:326:0;;;;;:::i;:::-;;:::i;44825:30::-;;;;;;;;;;;;;:::i;21422:295::-;;;;;;;;;;-1:-1:-1;21422:295:0;;;;;:::i;:::-;;:::i;44104:94::-;;;;;;;;;;;;;:::i;45250:22::-;;;;;;;;;;;;;:::i;46461:85::-;;;;;;;;;;-1:-1:-1;46461:85:0;;;;;:::i;:::-;;:::i;43453:87::-;;;;;;;;;;;;;:::i;46038:::-;;;;;;;;;;-1:-1:-1;46038:87:0;;;;;:::i;:::-;;:::i;45628:62::-;;;;;;;;;;;;;:::i;22341:104::-;;;;;;;;;;;;;:::i;45559:62::-;;;;;;;;;;;;;:::i;45001:32::-;;;;;;;;;;;;;:::i;24245:327::-;;;;;;;;;;-1:-1:-1;24245:327:0;;;;;:::i;:::-;;:::i;45156:21::-;;;;;;;;;;;;;:::i;25627:365::-;;;;;;;;;;-1:-1:-1;25627:365:0;;;;;:::i;:::-;;:::i;50031:498::-;;;;;;;;;;;;;:::i;46788:83::-;;;;;;;;;;-1:-1:-1;46788:83:0;;;;;:::i;:::-;;:::i;22516:468::-;;;;;;;;;;-1:-1:-1;22516:468:0;;;;;:::i;:::-;;:::i;49514:505::-;;;;;;:::i;:::-;;:::i;47617:116::-;;;;;;;;;;-1:-1:-1;47617:116:0;;;;;:::i;:::-;;:::i;45184:28::-;;;;;;;;;;;;;:::i;50541:114::-;;;;;;;;;;;;;:::i;24643:214::-;;;;;;;;;;-1:-1:-1;24643:214:0;;;;;:::i;:::-;;:::i;44353:229::-;;;;;;;;;;-1:-1:-1;44353:229:0;;;;;:::i;:::-;;:::i;45697:62::-;;;;;;;;;;;;;:::i;46253:101::-;;;;;;;;;;-1:-1:-1;46253:101:0;;;;;:::i;:::-;;:::i;21003:355::-;21150:4;-1:-1:-1;;;;;;21192:40:0;;-1:-1:-1;;;21192:40:0;;:105;;-1:-1:-1;;;;;;;21249:48:0;;-1:-1:-1;;;21249:48:0;21192:105;:158;;;;21314:36;21338:11;21314:23;:36::i;:::-;21172:178;;21003:355;;;;:::o;48773:723::-;48835:13;;-1:-1:-1;;;48835:13:0;;;;48827:47;;;;-1:-1:-1;;;48827:47:0;;;;;;;:::i;:::-;;;;;;;;;48911:12;;48899:8;;48893:14;;:3;:14;:::i;:::-;:30;;48885:94;;;;-1:-1:-1;;;48885:94:0;;;;;;;:::i;:::-;49005:5;;48998:3;:12;;:23;;;;49020:1;49014:3;:7;48998:23;48990:68;;;;-1:-1:-1;;;48990:68:0;;;;;;;:::i;:::-;49095:12;;49083:8;;49077:14;;:3;:14;:::i;:::-;:30;;49069:68;;;;-1:-1:-1;;;49069:68:0;;;;;;;:::i;:::-;49171:11;;49162:5;;49156:11;;:3;:11;:::i;:::-;:26;;49148:64;;;;-1:-1:-1;;;49148:64:0;;;;;;;:::i;:::-;49252:3;49244:5;;:11;;;;:::i;:::-;49231:9;:24;49223:50;;;;-1:-1:-1;;;49223:50:0;;;;;;;:::i;:::-;49288:6;49284:168;49304:3;49300:1;:7;49284:168;;;49343:5;;49363:30;49373:10;49343:5;49363:9;:30::i;:::-;49408:5;:7;;;:5;:7;;;:::i;:::-;;;;-1:-1:-1;;49430:8:0;:10;;;:8;:10;;;:::i;:::-;;;;;;49284:168;49309:3;;;;;:::i;:::-;;;;49284:168;;;;49467:21;49472:10;49484:3;49467:21;;;;;;;:::i;:::-;;;;;;;;48773:723;:::o;47745:320::-;43684:12;:10;:12::i;:::-;-1:-1:-1;;;;;43673:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43673:23:0;;43665:68;;;;-1:-1:-1;;;43665:68:0;;;;;;;:::i;:::-;47838:11:::1;::::0;47829:5:::1;::::0;47823:11:::1;::::0;:3;:11:::1;:::i;:::-;:26;;47815:64;;;;-1:-1:-1::0;;;47815:64:0::1;;;;;;;:::i;:::-;47894:6;47890:135;47910:3;47906:1;:7;47890:135;;;47949:5;::::0;47969:22:::1;47979:2:::0;47949:5;47969:9:::1;:22::i;:::-;48006:5;:7:::0;;;:5:::1;:7;::::0;::::1;:::i;:::-;;;;;;47890:135;47915:3;;;;;:::i;:::-;;;;47890:135;;;;48040:17;48049:2;48053:3;48040:17;;;;;;;:::i;:::-;;;;;;;;47745:320:::0;;:::o;22172:100::-;22226:13;22259:5;22252:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22172:100;:::o;23865:308::-;23986:7;24033:16;24041:7;24033;:16::i;:::-;24011:110;;;;-1:-1:-1;;;24011:110:0;;;;;;;:::i;:::-;-1:-1:-1;24141:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24141:24:0;;23865:308::o;45114:35::-;;;;:::o;23388:411::-;23469:13;23485:23;23500:7;23485:14;:23::i;:::-;23469:39;;23533:5;-1:-1:-1;;;;;23527:11:0;:2;-1:-1:-1;;;;;23527:11:0;;;23519:57;;;;-1:-1:-1;;;23519:57:0;;;;;;;:::i;:::-;23627:5;-1:-1:-1;;;;;23611:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;23611:21:0;;:62;;;;23636:37;23653:5;23660:12;:10;:12::i;23636:37::-;23589:168;;;;-1:-1:-1;;;23589:168:0;;;;;;;:::i;:::-;23770:21;23779:2;23783:7;23770:8;:21::i;:::-;23388:411;;;:::o;45490:62::-;;;-1:-1:-1;;;;;45490:62:0;;:::o;45040:30::-;;;;:::o;45279:28::-;;;;:::o;24924:376::-;25133:41;25152:12;:10;:12::i;:::-;25166:7;25133:18;:41::i;:::-;25111:140;;;;-1:-1:-1;;;25111:140:0;;;;;;;:::i;:::-;25264:28;25274:4;25280:2;25284:7;25264:9;:28::i;46992:376::-;47054:13;47080:20;47114:17;47124:6;47114:9;:17::i;:::-;47103:29;;;;;;-1:-1:-1;;;47103:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47103:29:0;;47080:52;;47143:12;47175:6;47170:167;47191:5;;47187:1;:9;47170:167;;;47236:6;-1:-1:-1;;;;;47222:20:0;:10;47230:1;47222:7;:10::i;:::-;-1:-1:-1;;;;;47222:20:0;;47218:108;;;47281:1;47263:6;47270:7;47263:15;;;;;;-1:-1:-1;;;47263:15:0;;;;;;;;;;;;;;;;;;:19;47301:9;;;;:::i;:::-;;;;47218:108;47198:3;;;;:::i;:::-;;;;47170:167;;;-1:-1:-1;47354:6:0;;46992:376;-1:-1:-1;;;46992:376:0:o;46137:104::-;43684:12;:10;:12::i;:::-;-1:-1:-1;;;;;43673:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43673:23:0;;43665:68;;;;-1:-1:-1;;;43665:68:0;;;;;;;:::i;:::-;46214:19:::1;:12;46229:4:::0;;46214:19:::1;:::i;45219:24::-:0;;;;:::o;45077:30::-;;;;:::o;46362:91::-;43684:12;:10;:12::i;:::-;-1:-1:-1;;;;;43673:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43673:23:0;;43665:68;;;;-1:-1:-1;;;43665:68:0;;;;;;;:::i;:::-;46426:13:::1;:19:::0;;;::::1;;-1:-1:-1::0;;;46426:19:0::1;-1:-1:-1::0;;;;46426:19:0;;::::1;::::0;;;::::1;::::0;;46362:91::o;25371:185::-;25509:39;25526:4;25532:2;25536:7;25509:39;;;;;;;;;;;;:16;:39::i;46554:222::-;43684:12;:10;:12::i;:::-;-1:-1:-1;;;;;43673:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43673:23:0;;43665:68;;;;-1:-1:-1;;;43665:68:0;;;;;;;:::i;:::-;46637:2:::1;46640:1;46637:5;;;;;;-1:-1:-1::0;;;46637:5:0::1;;;;;;;;;;;;;;;46632:2;;:10;;;;;-1:-1:-1::0;;;;;46632:10:0::1;;;;;-1:-1:-1::0;;;;;46632:10:0::1;;;;;;46658:2;46661:1;46658:5;;;;;;-1:-1:-1::0;;;46658:5:0::1;;;;;;;;;;;;;;;46653:2;;:10;;;;;-1:-1:-1::0;;;;;46653:10:0::1;;;;;-1:-1:-1::0;;;;;46653:10:0::1;;;;;;46679:2;46682:1;46679:5;;;;;;-1:-1:-1::0;;;46679:5:0::1;;;;;;;;;;;;;;;46674:2;;:10;;;;;-1:-1:-1::0;;;;;46674:10:0::1;;;;;-1:-1:-1::0;;;;;46674:10:0::1;;;;;;46700:2;46703:1;46700:5;;;;;;-1:-1:-1::0;;;46700:5:0::1;;;;;;;;;;;;;;;46695:2;;:10;;;;;-1:-1:-1::0;;;;;46695:10:0::1;;;;;-1:-1:-1::0;;;;;46695:10:0::1;;;;;;46721:2;46724:1;46721:5;;;;;;-1:-1:-1::0;;;46721:5:0::1;;;;;;;;;;;;;;;46716:2;;:10;;;;;-1:-1:-1::0;;;;;46716:10:0::1;;;;;-1:-1:-1::0;;;;;46716:10:0::1;;;;;;46742:2;46745:1;46742:5;;;;;;-1:-1:-1::0;;;46742:5:0::1;;;;;;;;;;;;;;;46737:2;;:10;;;;;-1:-1:-1::0;;;;;46737:10:0::1;;;;;-1:-1:-1::0;;;;;46737:10:0::1;;;;;;46763:2;46766:1;46763:5;;;;;;-1:-1:-1::0;;;46763:5:0::1;;;;;;;;;;;;;;;46758:2;;:10;;;;;-1:-1:-1::0;;;;;46758:10:0::1;;;;;-1:-1:-1::0;;;;;46758:10:0::1;;;;;;46554:222:::0;:::o;47380:112::-;47425:13;47457:27;47474:9;47457:16;:27::i;:::-;47450:34;;47380:112;:::o;45835:62::-;;;-1:-1:-1;;;;;45835:62:0;;:::o;48073:688::-;48139:13;;-1:-1:-1;;;48139:13:0;;;;48131:47;;;;-1:-1:-1;;;48131:47:0;;;;;;;:::i;:::-;48228:12;;48221:3;48197:21;48207:10;48197:9;:21::i;:::-;:27;;;;:::i;:::-;:43;;48189:114;;;;-1:-1:-1;;;48189:114:0;;;;;;;:::i;:::-;48344:16;;48328:12;;48322:18;;:3;:18;:::i;:::-;:38;;48314:81;;;;-1:-1:-1;;;48314:81:0;;;;;;;:::i;:::-;48429:11;;48420:5;;48414:11;;:3;:11;:::i;:::-;:26;;48406:64;;;;-1:-1:-1;;;48406:64:0;;;;;;;:::i;:::-;48510:3;48502:5;;:11;;;;:::i;:::-;48489:9;:24;48481:50;;;;-1:-1:-1;;;48481:50:0;;;;;;;:::i;:::-;48546:6;48542:172;48562:3;48558:1;:7;48542:172;;;48601:5;;48621:30;48631:10;48601:5;48621:9;:30::i;:::-;48666:5;:7;;;:5;:7;;;:::i;:::-;;;;-1:-1:-1;;48688:12:0;:14;;;:12;:14;;;:::i;:::-;;;;;;48542:172;48567:3;;;;;:::i;:::-;;;;48542:172;;;;48729:24;48737:10;48749:3;48729:24;;;;;;;:::i;44862:33::-;;;-1:-1:-1;;;44862:33:0;;;;;:::o;46883:97::-;43684:12;:10;:12::i;:::-;-1:-1:-1;;;;;43673:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43673:23:0;;43665:68;;;;-1:-1:-1;;;43665:68:0;;;;;;;:::i;:::-;46951:12:::1;:21:::0;46883:97::o;45904:62::-;;;-1:-1:-1;;;;;45904:62:0;;:::o;45766:::-;;;-1:-1:-1;;;;;45766:62:0;;:::o;21779:326::-;21896:7;21937:16;;;:7;:16;;;;;;-1:-1:-1;;;;;21937:16:0;21986:19;21964:110;;;;-1:-1:-1;;;21964:110:0;;;;;;;:::i;44825:30::-;;;-1:-1:-1;;;44825:30:0;;;;;:::o;21422:295::-;21539:7;-1:-1:-1;;;;;21586:19:0;;21564:111;;;;-1:-1:-1;;;21564:111:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;21693:16:0;;;;;:9;:16;;;;;;;21422:295::o;44104:94::-;43684:12;:10;:12::i;:::-;-1:-1:-1;;;;;43673:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43673:23:0;;43665:68;;;;-1:-1:-1;;;43665:68:0;;;;;;;:::i;:::-;44169:21:::1;44187:1;44169:9;:21::i;:::-;44104:94::o:0;45250:22::-;;;;:::o;46461:85::-;43684:12;:10;:12::i;:::-;-1:-1:-1;;;;;43673:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43673:23:0;;43665:68;;;;-1:-1:-1;;;43665:68:0;;;;;;;:::i;:::-;46522:10:::1;:16:::0;;;::::1;;-1:-1:-1::0;;;46522:16:0::1;-1:-1:-1::0;;;;46522:16:0;;::::1;::::0;;;::::1;::::0;;46461:85::o;43453:87::-;43526:6;;-1:-1:-1;;;;;43526:6:0;43453:87;:::o;46038:::-;43684:12;:10;:12::i;:::-;-1:-1:-1;;;;;43673:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43673:23:0;;43665:68;;;;-1:-1:-1;;;43665:68:0;;;;;;;:::i;:::-;46101:5:::1;:16:::0;46038:87::o;45628:62::-;;;-1:-1:-1;;;;;45628:62:0;;:::o;22341:104::-;22397:13;22430:7;22423:14;;;;;:::i;45559:62::-;;;-1:-1:-1;;;;;45559:62:0;;:::o;45001:32::-;;;;:::o;24245:327::-;24392:12;:10;:12::i;:::-;-1:-1:-1;;;;;24380:24:0;:8;-1:-1:-1;;;;;24380:24:0;;;24372:62;;;;-1:-1:-1;;;24372:62:0;;;;;;;:::i;:::-;24492:8;24447:18;:32;24466:12;:10;:12::i;:::-;-1:-1:-1;;;;;24447:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;24447:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;24447:53:0;;;;;;;;;;;24531:12;:10;:12::i;:::-;-1:-1:-1;;;;;24516:48:0;;24555:8;24516:48;;;;;;:::i;:::-;;;;;;;;24245:327;;:::o;45156:21::-;;;;:::o;25627:365::-;25816:41;25835:12;:10;:12::i;:::-;25849:7;25816:18;:41::i;:::-;25794:140;;;;-1:-1:-1;;;25794:140:0;;;;;;;:::i;:::-;25945:39;25959:4;25965:2;25969:7;25978:5;25945:13;:39::i;:::-;25627:365;;;;:::o;50031:498::-;43684:12;:10;:12::i;:::-;-1:-1:-1;;;;;43673:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43673:23:0;;43665:68;;;;-1:-1:-1;;;43665:68:0;;;;;;;:::i;:::-;50148:2:::1;::::0;50100:21:::1;::::0;-1:-1:-1;;;;;50148:2:0::1;50140:37;50173:3;50158:11;50100:21:::0;50168:1:::1;50158:11;:::i;:::-;50157:19;;;;:::i;:::-;50140:37;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;50132:46;;;::::0;::::1;;50205:2;::::0;-1:-1:-1;;;;;50205:2:0::1;50197:37;50230:3;50215:11;:7:::0;50225:1:::1;50215:11;:::i;:::-;50214:19;;;;:::i;:::-;50197:37;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;50189:46;;;::::0;::::1;;50262:2;::::0;-1:-1:-1;;;;;50262:2:0::1;50254:37;50287:3;50272:11;:7:::0;50282:1:::1;50272:11;:::i;:::-;50271:19;;;;:::i;:::-;50254:37;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;50246:46;;;::::0;::::1;;50319:2;::::0;-1:-1:-1;;;;;50319:2:0::1;50311:37;50344:3;50329:11;:7:::0;50339:1:::1;50329:11;:::i;:::-;50328:19;;;;:::i;:::-;50311:37;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;50303:46;;;::::0;::::1;;50376:2;::::0;-1:-1:-1;;;;;50376:2:0::1;50368:37;50401:3;50386:11;:7:::0;50396:1:::1;50386:11;:::i;:::-;50385:19;;;;:::i;:::-;50368:37;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;50360:46;;;::::0;::::1;;50433:2;::::0;-1:-1:-1;;;;;50433:2:0::1;50425:37;50458:3;50443:11;:7:::0;50453:1:::1;50443:11;:::i;:::-;50442:19;;;;:::i;:::-;50425:37;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;50417:46;;;::::0;::::1;;50490:2;::::0;-1:-1:-1;;;;;50490:2:0::1;50482:38;50516:3;50500:12;:7:::0;50510:2:::1;50500:12;:::i;:::-;50499:20;;;;:::i;:::-;50482:38;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;50474:47;;;::::0;::::1;;43744:1;50031:498::o:0;46788:83::-;43684:12;:10;:12::i;:::-;-1:-1:-1;;;;;43673:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43673:23:0;;43665:68;;;;-1:-1:-1;;;43665:68:0;;;;;;;:::i;:::-;46849:5:::1;:14:::0;46788:83::o;22516:468::-;22634:13;22687:16;22695:7;22687;:16::i;:::-;22665:113;;;;-1:-1:-1;;;22665:113:0;;;;;;;:::i;:::-;22791:21;22815:10;:8;:10::i;:::-;22791:34;;22880:1;22862:7;22856:21;:25;:120;;;;;;;;;;;;;;;;;22925:7;22934:18;:7;:16;:18::i;:::-;22908:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22856:120;22836:140;22516:468;-1:-1:-1;;;22516:468:0:o;49514:505::-;49573:10;;-1:-1:-1;;;49573:10:0;;;;49565:41;;;;-1:-1:-1;;;49565:41:0;;;;;;;:::i;:::-;49632:5;;49625:3;:12;;:23;;;;49647:1;49641:3;:7;49625:23;49617:68;;;;-1:-1:-1;;;49617:68:0;;;;;;;:::i;:::-;49719:11;;49710:5;;49704:11;;:3;:11;:::i;:::-;:26;;49696:64;;;;-1:-1:-1;;;49696:64:0;;;;;;;:::i;:::-;49800:3;49792:5;;:11;;;;:::i;:::-;49779:9;:24;49771:50;;;;-1:-1:-1;;;49771:50:0;;;;;;;:::i;:::-;49836:6;49832:143;49852:3;49848:1;:7;49832:143;;;49891:5;;49911:30;49921:10;49891:5;49911:9;:30::i;:::-;49956:5;:7;;;:5;:7;;;:::i;:::-;;;;;;49832:143;49857:3;;;;;:::i;:::-;;;;49832:143;;47617:116;47682:7;47708:17;47718:6;47708:9;:17::i;45184:28::-;;;;:::o;50541:114::-;43684:12;:10;:12::i;:::-;-1:-1:-1;;;;;43673:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43673:23:0;;43665:68;;;;-1:-1:-1;;;43665:68:0;;;;;;;:::i;:::-;50596:51:::1;::::0;50604:10:::1;::::0;50625:21:::1;50596:51:::0;::::1;;;::::0;::::1;::::0;;;50625:21;50604:10;50596:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;24643:214:::0;-1:-1:-1;;;;;24814:25:0;;;24785:4;24814:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;24643:214::o;44353:229::-;43684:12;:10;:12::i;:::-;-1:-1:-1;;;;;43673:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43673:23:0;;43665:68;;;;-1:-1:-1;;;43665:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44456:22:0;::::1;44434:110;;;;-1:-1:-1::0;;;44434:110:0::1;;;;;;;:::i;:::-;44555:19;44565:8;44555:9;:19::i;45697:62::-:0;;;-1:-1:-1;;;;;45697:62:0;;:::o;46253:101::-;43684:12;:10;:12::i;:::-;-1:-1:-1;;;;;43673:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43673:23:0;;43665:68;;;;-1:-1:-1;;;43665:68:0;;;;;;;:::i;:::-;46323:11:::1;:23:::0;46253:101::o;19475:207::-;-1:-1:-1;;;;;;19634:40:0;;-1:-1:-1;;;19634:40:0;19475:207;;;:::o;28627:110::-;28703:26;28713:2;28717:7;28703:26;;;;;;;;;;;;:9;:26::i;:::-;28627:110;;:::o;16371:98::-;16451:10;16371:98;:::o;27539:127::-;27604:4;27628:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27628:16:0;:30;;;27539:127::o;31662:174::-;31737:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;31737:29:0;-1:-1:-1;;;;;31737:29:0;;;;;;;;:24;;31791:23;31737:24;31791:14;:23::i;:::-;-1:-1:-1;;;;;31782:46:0;;;;;;;;;;;31662:174;;:::o;27833:452::-;27962:4;28006:16;28014:7;28006;:16::i;:::-;27984:110;;;;-1:-1:-1;;;27984:110:0;;;;;;;:::i;:::-;28105:13;28121:23;28136:7;28121:14;:23::i;:::-;28105:39;;28174:5;-1:-1:-1;;;;;28163:16:0;:7;-1:-1:-1;;;;;28163:16:0;;:64;;;;28220:7;-1:-1:-1;;;;;28196:31:0;:20;28208:7;28196:11;:20::i;:::-;-1:-1:-1;;;;;28196:31:0;;28163:64;:113;;;;28244:32;28261:5;28268:7;28244:16;:32::i;:::-;28155:122;27833:452;-1:-1:-1;;;;27833:452:0:o;30929:615::-;31102:4;-1:-1:-1;;;;;31075:31:0;:23;31090:7;31075:14;:23::i;:::-;-1:-1:-1;;;;;31075:31:0;;31053:122;;;;-1:-1:-1;;;31053:122:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31194:16:0;;31186:65;;;;-1:-1:-1;;;31186:65:0;;;;;;;:::i;:::-;31264:39;31285:4;31291:2;31295:7;31264:20;:39::i;:::-;31368:29;31385:1;31389:7;31368:8;:29::i;:::-;-1:-1:-1;;;;;31410:15:0;;;;;;:9;:15;;;;;:20;;31429:1;;31410:15;:20;;31429:1;;31410:20;:::i;:::-;;;;-1:-1:-1;;;;;;;31441:13:0;;;;;;:9;:13;;;;;:18;;31458:1;;31441:13;:18;;31458:1;;31441:18;:::i;:::-;;;;-1:-1:-1;;31470:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31470:21:0;-1:-1:-1;;;;;31470:21:0;;;;;;;;;31509:27;;31470:16;;31509:27;;;;;;;30929:615;;;:::o;44590:173::-;44665:6;;;-1:-1:-1;;;;;44682:17:0;;;-1:-1:-1;;;;;;44682:17:0;;;;;;;44715:40;;44665:6;;;44682:17;44665:6;;44715:40;;44646:16;;44715:40;44590:173;;:::o;26874:352::-;27031:28;27041:4;27047:2;27051:7;27031:9;:28::i;:::-;27092:48;27115:4;27121:2;27125:7;27134:5;27092:22;:48::i;:::-;27070:148;;;;-1:-1:-1;;;27070:148:0;;;;;;;:::i;47500:105::-;47552:13;47585:12;47578:19;;;;;:::i;16892:723::-;16948:13;17169:10;17165:53;;-1:-1:-1;17196:10:0;;;;;;;;;;;;-1:-1:-1;;;17196:10:0;;;;;;17165:53;17243:5;17228:12;17284:78;17291:9;;17284:78;;17317:8;;;;:::i;:::-;;-1:-1:-1;17340:10:0;;-1:-1:-1;17348:2:0;17340:10;;:::i;:::-;;;17284:78;;;17372:19;17404:6;17394:17;;;;;;-1:-1:-1;;;17394:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17394:17:0;;17372:39;;17422:154;17429:10;;17422:154;;17456:11;17466:1;17456:11;;:::i;:::-;;-1:-1:-1;17525:10:0;17533:2;17525:5;:10;:::i;:::-;17512:24;;:2;:24;:::i;:::-;17499:39;;17482:6;17489;17482:14;;;;;;-1:-1:-1;;;17482:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;17482:56:0;;;;;;;;-1:-1:-1;17553:11:0;17562:2;17553:11;;:::i;:::-;;;17422:154;;28964:321;29094:18;29100:2;29104:7;29094:5;:18::i;:::-;29145:54;29176:1;29180:2;29184:7;29193:5;29145:22;:54::i;:::-;29123:154;;;;-1:-1:-1;;;29123:154:0;;;;;;;:::i;32401:984::-;32556:4;32577:15;:2;-1:-1:-1;;;;;32577:13:0;;:15::i;:::-;32573:805;;;32646:2;-1:-1:-1;;;;;32630:36:0;;32689:12;:10;:12::i;:::-;32724:4;32751:7;32781:5;32630:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32630:175:0;;;;;;;;-1:-1:-1;;32630:175:0;;;;;;;;;;;;:::i;:::-;;;32609:714;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32992:13:0;;32988:320;;33035:108;;-1:-1:-1;;;33035:108:0;;;;;;;:::i;32988:320::-;33258:6;33252:13;33243:6;33239:2;33235:15;33228:38;32609:714;-1:-1:-1;;;;;;32869:55:0;-1:-1:-1;;;32869:55:0;;-1:-1:-1;32862:62:0;;32573:805;-1:-1:-1;33362:4:0;32401:984;;;;;;:::o;29621:382::-;-1:-1:-1;;;;;29701:16:0;;29693:61;;;;-1:-1:-1;;;29693:61:0;;;;;;;:::i;:::-;29774:16;29782:7;29774;:16::i;:::-;29773:17;29765:58;;;;-1:-1:-1;;;29765:58:0;;;;;;;:::i;:::-;29836:45;29865:1;29869:2;29873:7;29836:20;:45::i;:::-;-1:-1:-1;;;;;29894:13:0;;;;;;:9;:13;;;;;:18;;29911:1;;29894:13;:18;;29911:1;;29894:18;:::i;:::-;;;;-1:-1:-1;;29923:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29923:21:0;-1:-1:-1;;;;;29923:21:0;;;;;;;;29962:33;;29923:16;;;29962:33;;29923:16;;29962:33;29621:382;;:::o;8170:387::-;8493:20;8541:8;;;8170:387::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:175:1;84:20;;-1:-1:-1;;;;;133:31:1;;123:42;;113:2;;179:1;176;169:12;194:162;261:20;;317:13;;310:21;300:32;;290:2;;346:1;343;336:12;361:198;;473:2;461:9;452:7;448:23;444:32;441:2;;;494:6;486;479:22;441:2;522:31;543:9;522:31;:::i;564:274::-;;;693:2;681:9;672:7;668:23;664:32;661:2;;;714:6;706;699:22;661:2;742:31;763:9;742:31;:::i;:::-;732:41;;792:40;828:2;817:9;813:18;792:40;:::i;:::-;782:50;;651:187;;;;;:::o;843:342::-;;;;989:2;977:9;968:7;964:23;960:32;957:2;;;1010:6;1002;995:22;957:2;1038:31;1059:9;1038:31;:::i;:::-;1028:41;;1088:40;1124:2;1113:9;1109:18;1088:40;:::i;:::-;1078:50;;1175:2;1164:9;1160:18;1147:32;1137:42;;947:238;;;;;:::o;1190:1028::-;;;;;1362:3;1350:9;1341:7;1337:23;1333:33;1330:2;;;1384:6;1376;1369:22;1330:2;1412:31;1433:9;1412:31;:::i;:::-;1402:41;;1462:2;1483:40;1519:2;1508:9;1504:18;1483:40;:::i;:::-;1473:50;;1570:2;1559:9;1555:18;1542:32;1532:42;;1625:2;1614:9;1610:18;1597:32;1648:18;1689:2;1681:6;1678:14;1675:2;;;1710:6;1702;1695:22;1675:2;1753:6;1742:9;1738:22;1728:32;;1798:7;1791:4;1787:2;1783:13;1779:27;1769:2;;1825:6;1817;1810:22;1769:2;1866;1853:16;1888:2;1884;1881:10;1878:2;;;1894:18;;:::i;:::-;1936:52;1978:2;1959:13;;-1:-1:-1;;1955:27:1;1951:36;;1936:52;:::i;:::-;1923:65;;2011:2;2004:5;1997:17;2051:7;2046:2;2041;2037;2033:11;2029:20;2026:33;2023:2;;;2077:6;2069;2062:22;2023:2;2137;2132;2128;2124:11;2119:2;2112:5;2108:14;2095:45;2160:14;;2156:23;;;2149:39;;;;1320:898;;;;-1:-1:-1;1320:898:1;;-1:-1:-1;;1320:898:1:o;2223:268::-;;;2349:2;2337:9;2328:7;2324:23;2320:32;2317:2;;;2370:6;2362;2355:22;2317:2;2398:31;2419:9;2398:31;:::i;:::-;2388:41;;2448:37;2481:2;2470:9;2466:18;2448:37;:::i;2496:266::-;;;2625:2;2613:9;2604:7;2600:23;2596:32;2593:2;;;2646:6;2638;2631:22;2593:2;2674:31;2695:9;2674:31;:::i;:::-;2664:41;2752:2;2737:18;;;;2724:32;;-1:-1:-1;;;2583:179:1:o;2767:1010::-;;2882:2;2925;2913:9;2904:7;2900:23;2896:32;2893:2;;;2946:6;2938;2931:22;2893:2;2991:9;2978:23;3020:18;3061:2;3053:6;3050:14;3047:2;;;3082:6;3074;3067:22;3047:2;3125:6;3114:9;3110:22;3100:32;;3170:7;3163:4;3159:2;3155:13;3151:27;3141:2;;3197:6;3189;3182:22;3141:2;3238;3225:16;3260:2;3256;3253:10;3250:2;;;3266:18;;:::i;:::-;3313:2;3309;3305:11;3295:21;;3336:27;3359:2;3355;3351:11;3336:27;:::i;:::-;3397:15;;;3428:12;;;;3460:11;;;3490;;;3486:20;;3483:33;-1:-1:-1;3480:2:1;;;3534:6;3526;3519:22;3480:2;3561:6;3552:15;;3576:171;3590:2;3587:1;3584:9;3576:171;;;3647:25;3668:3;3647:25;:::i;:::-;3635:38;;3608:1;3601:9;;;;;3693:12;;;;3725;;3576:171;;;-1:-1:-1;3766:5:1;2862:915;-1:-1:-1;;;;;;;;2862:915:1:o;3782:192::-;;3891:2;3879:9;3870:7;3866:23;3862:32;3859:2;;;3912:6;3904;3897:22;3859:2;3940:28;3958:9;3940:28;:::i;3979:257::-;;4090:2;4078:9;4069:7;4065:23;4061:32;4058:2;;;4111:6;4103;4096:22;4058:2;4155:9;4142:23;4174:32;4200:5;4174:32;:::i;4241:261::-;;4363:2;4351:9;4342:7;4338:23;4334:32;4331:2;;;4384:6;4376;4369:22;4331:2;4421:9;4415:16;4440:32;4466:5;4440:32;:::i;4507:642::-;;;4639:2;4627:9;4618:7;4614:23;4610:32;4607:2;;;4660:6;4652;4645:22;4607:2;4705:9;4692:23;4734:18;4775:2;4767:6;4764:14;4761:2;;;4796:6;4788;4781:22;4761:2;4839:6;4828:9;4824:22;4814:32;;4884:7;4877:4;4873:2;4869:13;4865:27;4855:2;;4911:6;4903;4896:22;4855:2;4956;4943:16;4982:2;4974:6;4971:14;4968:2;;;5003:6;4995;4988:22;4968:2;5053:7;5048:2;5039:6;5035:2;5031:15;5027:24;5024:37;5021:2;;;5079:6;5071;5064:22;5021:2;5115;5107:11;;;;;5137:6;;-1:-1:-1;4597:552:1;;-1:-1:-1;;;;4597:552:1:o;5154:190::-;;5266:2;5254:9;5245:7;5241:23;5237:32;5234:2;;;5287:6;5279;5272:22;5234:2;-1:-1:-1;5315:23:1;;5224:120;-1:-1:-1;5224:120:1:o;5349:259::-;;5430:5;5424:12;5457:6;5452:3;5445:19;5473:63;5529:6;5522:4;5517:3;5513:14;5506:4;5499:5;5495:16;5473:63;:::i;:::-;5590:2;5569:15;-1:-1:-1;;5565:29:1;5556:39;;;;5597:4;5552:50;;5400:208;-1:-1:-1;;5400:208:1:o;5613:470::-;;5830:6;5824:13;5846:53;5892:6;5887:3;5880:4;5872:6;5868:17;5846:53;:::i;:::-;5962:13;;5921:16;;;;5984:57;5962:13;5921:16;6018:4;6006:17;;5984:57;:::i;:::-;6057:20;;5800:283;-1:-1:-1;;;;5800:283:1:o;6088:203::-;-1:-1:-1;;;;;6252:32:1;;;;6234:51;;6222:2;6207:18;;6189:102::o;6296:490::-;-1:-1:-1;;;;;6565:15:1;;;6547:34;;6617:15;;6612:2;6597:18;;6590:43;6664:2;6649:18;;6642:34;;;6712:3;6707:2;6692:18;;6685:31;;;6296:490;;6733:47;;6760:19;;6752:6;6733:47;:::i;:::-;6725:55;6499:287;-1:-1:-1;;;;;;6499:287:1:o;6791:274::-;-1:-1:-1;;;;;6983:32:1;;;;6965:51;;7047:2;7032:18;;7025:34;6953:2;6938:18;;6920:145::o;7070:635::-;7241:2;7293:21;;;7363:13;;7266:18;;;7385:22;;;7070:635;;7241:2;7464:15;;;;7438:2;7423:18;;;7070:635;7510:169;7524:6;7521:1;7518:13;7510:169;;;7585:13;;7573:26;;7654:15;;;;7619:12;;;;7546:1;7539:9;7510:169;;;-1:-1:-1;7696:3:1;;7221:484;-1:-1:-1;;;;;;7221:484:1:o;7710:187::-;7875:14;;7868:22;7850:41;;7838:2;7823:18;;7805:92::o;7902:221::-;;8051:2;8040:9;8033:21;8071:46;8113:2;8102:9;8098:18;8090:6;8071:46;:::i;8128:414::-;8330:2;8312:21;;;8369:2;8349:18;;;8342:30;8408:34;8403:2;8388:18;;8381:62;-1:-1:-1;;;8474:2:1;8459:18;;8452:48;8532:3;8517:19;;8302:240::o;8547:402::-;8749:2;8731:21;;;8788:2;8768:18;;;8761:30;8827:34;8822:2;8807:18;;8800:62;-1:-1:-1;;;8893:2:1;8878:18;;8871:36;8939:3;8924:19;;8721:228::o;8954:422::-;9156:2;9138:21;;;9195:2;9175:18;;;9168:30;9234:34;9229:2;9214:18;;9207:62;9305:28;9300:2;9285:18;;9278:56;9366:3;9351:19;;9128:248::o;9381:352::-;9583:2;9565:21;;;9622:2;9602:18;;;9595:30;9661;9656:2;9641:18;;9634:58;9724:2;9709:18;;9555:178::o;9738:354::-;9940:2;9922:21;;;9979:2;9959:18;;;9952:30;10018:32;10013:2;9998:18;;9991:60;10083:2;10068:18;;9912:180::o;10097:356::-;10299:2;10281:21;;;10318:18;;;10311:30;10377:34;10372:2;10357:18;;10350:62;10444:2;10429:18;;10271:182::o;10458:400::-;10660:2;10642:21;;;10699:2;10679:18;;;10672:30;10738:34;10733:2;10718:18;;10711:62;-1:-1:-1;;;10804:2:1;10789:18;;10782:34;10848:3;10833:19;;10632:226::o;10863:349::-;11065:2;11047:21;;;11104:2;11084:18;;;11077:30;11143:27;11138:2;11123:18;;11116:55;11203:2;11188:18;;11037:175::o;11217:342::-;11419:2;11401:21;;;11458:2;11438:18;;;11431:30;-1:-1:-1;;;11492:2:1;11477:18;;11470:48;11550:2;11535:18;;11391:168::o;11564:408::-;11766:2;11748:21;;;11805:2;11785:18;;;11778:30;11844:34;11839:2;11824:18;;11817:62;-1:-1:-1;;;11910:2:1;11895:18;;11888:42;11962:3;11947:19;;11738:234::o;11977:420::-;12179:2;12161:21;;;12218:2;12198:18;;;12191:30;12257:34;12252:2;12237:18;;12230:62;12328:26;12323:2;12308:18;;12301:54;12387:3;12372:19;;12151:246::o;12402:406::-;12604:2;12586:21;;;12643:2;12623:18;;;12616:30;12682:34;12677:2;12662:18;;12655:62;-1:-1:-1;;;12748:2:1;12733:18;;12726:40;12798:3;12783:19;;12576:232::o;12813:405::-;13015:2;12997:21;;;13054:2;13034:18;;;13027:30;13093:34;13088:2;13073:18;;13066:62;-1:-1:-1;;;13159:2:1;13144:18;;13137:39;13208:3;13193:19;;12987:231::o;13223:356::-;13425:2;13407:21;;;13444:18;;;13437:30;13503:34;13498:2;13483:18;;13476:62;13570:2;13555:18;;13397:182::o;13584:408::-;13786:2;13768:21;;;13825:2;13805:18;;;13798:30;13864:34;13859:2;13844:18;;13837:62;-1:-1:-1;;;13930:2:1;13915:18;;13908:42;13982:3;13967:19;;13758:234::o;13997:356::-;14199:2;14181:21;;;14218:18;;;14211:30;14277:34;14272:2;14257:18;;14250:62;14344:2;14329:18;;14171:182::o;14358:405::-;14560:2;14542:21;;;14599:2;14579:18;;;14572:30;14638:34;14633:2;14618:18;;14611:62;-1:-1:-1;;;14704:2:1;14689:18;;14682:39;14753:3;14738:19;;14532:231::o;14768:337::-;14970:2;14952:21;;;15009:2;14989:18;;;14982:30;-1:-1:-1;;;15043:2:1;15028:18;;15021:43;15096:2;15081:18;;14942:163::o;15110:411::-;15312:2;15294:21;;;15351:2;15331:18;;;15324:30;15390:34;15385:2;15370:18;;15363:62;-1:-1:-1;;;15456:2:1;15441:18;;15434:45;15511:3;15496:19;;15284:237::o;15526:349::-;15728:2;15710:21;;;15767:2;15747:18;;;15740:30;15806:27;15801:2;15786:18;;15779:55;15866:2;15851:18;;15700:175::o;15880:397::-;16082:2;16064:21;;;16121:2;16101:18;;;16094:30;16160:34;16155:2;16140:18;;16133:62;-1:-1:-1;;;16226:2:1;16211:18;;16204:31;16267:3;16252:19;;16054:223::o;16282:415::-;16484:2;16466:21;;;16523:2;16503:18;;;16496:30;16562:34;16557:2;16542:18;;16535:62;-1:-1:-1;;;16628:2:1;16613:18;;16606:49;16687:3;16672:19;;16456:241::o;16702:413::-;16904:2;16886:21;;;16943:2;16923:18;;;16916:30;16982:34;16977:2;16962:18;;16955:62;-1:-1:-1;;;17048:2:1;17033:18;;17026:47;17105:3;17090:19;;16876:239::o;17120:345::-;17322:2;17304:21;;;17361:2;17341:18;;;17334:30;-1:-1:-1;;;17395:2:1;17380:18;;17373:51;17456:2;17441:18;;17294:171::o;17470:177::-;17616:25;;;17604:2;17589:18;;17571:76::o;17652:251::-;17722:2;17716:9;17752:17;;;17799:18;17784:34;;17820:22;;;17781:62;17778:2;;;17846:18;;:::i;:::-;17882:2;17875:22;17696:207;;-1:-1:-1;17696:207:1:o;17908:128::-;;17979:1;17975:6;17972:1;17969:13;17966:2;;;17985:18;;:::i;:::-;-1:-1:-1;18021:9:1;;17956:80::o;18041:120::-;;18107:1;18097:2;;18112:18;;:::i;:::-;-1:-1:-1;18146:9:1;;18087:74::o;18166:168::-;;18272:1;18268;18264:6;18260:14;18257:1;18254:21;18249:1;18242:9;18235:17;18231:45;18228:2;;;18279:18;;:::i;:::-;-1:-1:-1;18319:9:1;;18218:116::o;18339:125::-;;18407:1;18404;18401:8;18398:2;;;18412:18;;:::i;:::-;-1:-1:-1;18449:9:1;;18388:76::o;18469:258::-;18541:1;18551:113;18565:6;18562:1;18559:13;18551:113;;;18641:11;;;18635:18;18622:11;;;18615:39;18587:2;18580:10;18551:113;;;18682:6;18679:1;18676:13;18673:2;;;-1:-1:-1;;18717:1:1;18699:16;;18692:27;18522:205::o;18732:380::-;18817:1;18807:12;;18864:1;18854:12;;;18875:2;;18929:4;18921:6;18917:17;18907:27;;18875:2;18982;18974:6;18971:14;18951:18;18948:38;18945:2;;;19028:10;19023:3;19019:20;19016:1;19009:31;19063:4;19060:1;19053:15;19091:4;19088:1;19081:15;18945:2;;18787:325;;;:::o;19117:135::-;;-1:-1:-1;;19177:17:1;;19174:2;;;19197:18;;:::i;:::-;-1:-1:-1;19244:1:1;19233:13;;19164:88::o;19257:112::-;;19315:1;19305:2;;19320:18;;:::i;:::-;-1:-1:-1;19354:9:1;;19295:74::o;19374:127::-;19435:10;19430:3;19426:20;19423:1;19416:31;19466:4;19463:1;19456:15;19490:4;19487:1;19480:15;19506:127;19567:10;19562:3;19558:20;19555:1;19548:31;19598:4;19595:1;19588:15;19622:4;19619:1;19612:15;19638:127;19699:10;19694:3;19690:20;19687:1;19680:31;19730:4;19727:1;19720:15;19754:4;19751:1;19744:15;19770:133;-1:-1:-1;;;;;;19846:32:1;;19836:43;;19826:2;;19893:1;19890;19883:12
Swarm Source
ipfs://b0597d04aacd38ebcbe076a8e3b34d3f51ffb2d8a427e5b4d8b81dadb1a459fb
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.