ERC-721
Overview
Max Total Supply
0 URQA-C
Holders
97
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 URQA-CLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
UreeqaCollectibleNFTv2
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-01-24 */ // File: @openzeppelin/contracts/utils/introspection/IERC165.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @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) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/utils/Strings.sol pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @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}. 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 || ERC721.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 || ERC721.isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual { _mint(to, tokenId); require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { // solhint-disable-next-line no-inline-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { } } // File: @openzeppelin/contracts/utils/structs/EnumerableSet.sol pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } // File: contracts/OwnershipAgreementv3.sol pragma solidity >=0.7.0 <0.9.0; /// @title Creates an Ownership Agreement, with an optional Operator role /// @author Dr. Jonathan Shahen at UREEQA /// @notice TODO /// @dev Maximum number of Owners is set to 255 (unit8.MAX_VALUE) contract OwnershipAgreementv3 { /* * Storage */ // ResolutionTypes: uint constant private resTypeNone = 0; // This indicates that the resolution hasn't been set (default value) uint constant private resTypeAddOwner = 1; uint constant private resTypeRemoveOwner = 2; uint constant private resTypeReplaceOwner = 3; uint constant private resTypeAddOperator = 4; uint constant private resTypeRemoveOperator = 5; uint constant private resTypeReplaceOperator = 6; uint constant private resTypeUpdateThreshold = 7; uint constant private resTypeUpdateTransactionLimit = 8; uint constant private resTypePause = 9; uint constant private resTypeUnpause = 10; uint constant private resTypeCustom = 1000; // Custom resoutions for each subclass struct Resolution { // Has the resolution already been passed bool passed; // The type of resolution uint256 resType; // The old address, can be address(0). oldAddress and newAddress cannot both equal address(0). address oldAddress; // The new address, can be address(0). oldAddress and newAddress cannot both equal address(0). address newAddress; // Able to store extra information for custom resolutions bytes32[] extra; } using EnumerableSet for EnumerableSet.AddressSet; // Set of owners // NOTE: we utilize a set, so we can enumerate the owners and so that the list only contains one instance of an account // NOTE: address(0) is not a valid owner EnumerableSet.AddressSet private _owners; // Value to indicate if the smart contract is paused bool private _paused; // An address, usually controlled by a computer, that performs regular/automated operations within the smart contract // NOTE: address(0) is not a valid operator EnumerableSet.AddressSet private _operators; // Limit the number of operators uint256 public operatorLimit = 1; // The number of owners it takes to come to an agreement uint256 public ownerAgreementThreshold = 1; // Limit per Transaction to impose // A limit of zero means no limit imposed uint256 public transactionLimit = 0; // Stores each vote for each resolution number (int) mapping(address => mapping(uint256 => bool)) public ownerVotes; // The next available resolution number uint256 public nextResolution = 1; mapping(address => uint256) lastOwnerResolutionNumber; // Stores the resolutions mapping(uint256 => Resolution) public resolutions; // //////////////////////////////////////////////////// // EVENTS // //////////////////////////////////////////////////// event OwnerAddition(address owner); event OwnerRemoval(address owner); event OwnerReplacement(address oldOwner, address newOwner); event OperatorAddition(address newOperator); event OperatorRemoval(address oldOperator); event OperatorReplacement(address oldOperator, address newOperator); event UpdateThreshold(uint256 newThreshold); event UpdateNumberOfOperators(uint256 newOperators); event UpdateTransactionLimit(uint256 newLimit); /// @dev Emitted when the pause is triggered by `account`. event Paused(address account); /// @dev Emitted when the pause is lifted by `account`. event Unpaused(address account); // //////////////////////////////////////////////////// // MODIFIERS // //////////////////////////////////////////////////// function isValidAddress(address newAddr) public pure { require(newAddr != address(0), "Invaild Address"); } modifier onlyOperators() { isValidAddress(msg.sender); require( EnumerableSet.contains(_operators, msg.sender) == true, "Only the operator can run this function." ); _; } modifier onlyOwners() { isValidAddress(msg.sender); require( EnumerableSet.contains(_owners, msg.sender) == true, "Only an owner can run this function." ); _; } modifier onlyOwnersOrOperator() { isValidAddress(msg.sender); require( EnumerableSet.contains(_operators, msg.sender) == true || EnumerableSet.contains(_owners, msg.sender) == true, "Only an owner or the operator can run this function." ); _; } modifier ownerExists(address thisOwner) { require( EnumerableSet.contains(_owners, thisOwner) == true, "Owner does not exists." ); _; } /** * @dev Modifier to make a function callable only when the contract is not paused. * Requirements: The contract must not be paused. */ modifier whenNotPaused() { require(!_paused, "Smart Contract is paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * Requirements: The contract must be paused. */ modifier whenPaused() { require(_paused, "Smart Contract is not paused"); _; } /// @dev Modifier to make a function callable only when the amount is within the transaction limit modifier withinLimit(uint256 amount) { require( transactionLimit == 0 || amount <= transactionLimit, "Amount is over the transaction limit" ); _; } // //////////////////////////////////////////////////// // CONSTRUCTOR // //////////////////////////////////////////////////// constructor() { _addOwner(msg.sender); _paused = false; } // //////////////////////////////////////////////////// // VIEW FUNCTIONS // //////////////////////////////////////////////////// /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { if(EnumerableSet.length(_owners) == 0) return address(0); return EnumerableSet.at(_owners, 0); } /// @dev Returns list of owners. /// @return List of owner addresses. function getOwners() public view returns (address[] memory) { uint256 len = EnumerableSet.length(_owners); address[] memory o = new address[](len); for (uint256 i = 0; i < len; i++) { o[i] = EnumerableSet.at(_owners, i); } return o; } /// @dev Returns the number of owners. /// @return Number of owners. function getNumberOfOwners() public view returns (uint) { return EnumerableSet.length(_owners); } /// @dev Returns list of owners. /// @return List of owner addresses. function getOperators() public view returns (address[] memory) { uint256 len = EnumerableSet.length(_operators); address[] memory o = new address[](len); for (uint256 i = 0; i < len; i++) { o[i] = EnumerableSet.at(_operators, i); } return o; } /// @dev Returns the number of operators. /// @return Number of operators. function getNumberOfOperators() public view returns (uint8) { return uint8(EnumerableSet.length(_operators)); } /// @dev How many owners does it take to approve a resolution /// @return minimum number of owner votes function getVoteThreshold() public view returns (uint256) { return ownerAgreementThreshold; } /// @dev Returns the maximum amount a transaction can contain /// @return maximum amount or zero is no limit function getTransactionLimit() public view returns (uint256) { return transactionLimit; } /// @dev Returns the next available resolution. /// @return The next available resolution number function getNextResolutionNumber() public view returns (uint256) { return nextResolution; } /// @dev Returns the next available resolution. /// @return The next available resolution number function getLastOwnerResolutionNumber(address thisOwner) public view returns (uint256) { return lastOwnerResolutionNumber[thisOwner]; } /// @dev Returns true if the contract is paused, and false otherwise. function paused() public view returns (bool) { return _paused; } /// @dev Helper function to fail if resolution number is already in use. function resolutionAlreadyUsed(uint256 resNum) public view { require( // atleast one of the address must not be equal to address(0) !(resolutions[resNum].oldAddress != address(0) || resolutions[resNum].newAddress != address(0)), "Resolution is already in use." ); } function isResolutionPassed(uint256 resNum) public view returns (bool) { return resolutions[resNum].passed; } function canResolutionPass(uint256 resNum) public view returns (bool) { uint256 voteCount = 0; uint256 len = EnumerableSet.length(_owners); for (uint256 i = 0; i < len; i++) { if (ownerVotes[EnumerableSet.at(_owners, i)][resNum] == true) { voteCount++; } } return voteCount >= ownerAgreementThreshold; } // //////////////////////////////////////////////////// // PUBLIC FUNCTIONS // //////////////////////////////////////////////////// /// @notice Vote Yes on a Resolution. /// @dev The owner who tips the agreement threshold will pay the gas for performing the resolution. /// @return TRUE if the resolution passed function voteResolution(uint256 resNum) public onlyOwners() returns (bool) { ownerVotes[msg.sender][resNum] = true; // If the reolution has already passed, then do nothing if (isResolutionPassed(resNum)) { return true; } // If the resolution can now be passed, then do so if (canResolutionPass(resNum)) { _performResolution(resNum); return true; } // The resolution cannot be passed yet return false; } /// @dev Create a resolution to add an owner. Performs addition if threshold is 1 or zero. function createResolutionAddOwner(address newOwner) public onlyOwners() { isValidAddress(newOwner); require( !EnumerableSet.contains(_owners, newOwner), "newOwner already exists." ); createResolution(resTypeAddOwner, address(0), newOwner, new bytes32[](0)); } /// @dev Create a resolution to remove an owner. Performs removal if threshold is 1 or zero. /// @dev Updates the threshold to keep it less than or equal to the number of new owners function createResolutionRemoveOwner(address oldOwner) public onlyOwners() { isValidAddress(oldOwner); require(getNumberOfOwners() > 1, "Must always be one owner"); require( EnumerableSet.contains(_owners, oldOwner), "owner is not an owner." ); createResolution(resTypeRemoveOwner, oldOwner, address(0), new bytes32[](0)); } /// @dev Create a resolution to repalce an owner. Performs replacement if threshold is 1 or zero. function createResolutionReplaceOwner(address oldOwner, address newOwner) public onlyOwners() { isValidAddress(oldOwner); isValidAddress(newOwner); require( EnumerableSet.contains(_owners, oldOwner), "oldOwner is not an owner." ); require( !EnumerableSet.contains(_owners, newOwner), "newOwner already exists." ); createResolution(resTypeReplaceOwner, oldOwner, newOwner, new bytes32[](0)); } /// @dev Create a resolution to add an operator. Performs addition if threshold is 1 or zero. function createResolutionAddOperator(address newOperator) public onlyOwners() { isValidAddress(newOperator); require( !EnumerableSet.contains(_operators, newOperator), "newOperator already exists." ); createResolution(resTypeAddOperator, address(0), newOperator, new bytes32[](0)); } /// @dev Create a resolution to remove the operator. Performs removal if threshold is 1 or zero. function createResolutionRemoveOperator(address operator) public onlyOwners() { require( EnumerableSet.contains(_operators, operator), "operator is not an Operator." ); createResolution(resTypeRemoveOperator, operator, address(0), new bytes32[](0)); } /// @dev Create a resolution to replace the operator account. Performs replacement if threshold is 1 or zero. function createResolutionReplaceOperator( address oldOperator, address newOperator ) public onlyOwners() { isValidAddress(oldOperator); isValidAddress(newOperator); require( EnumerableSet.contains(_operators, oldOperator), "oldOperator is not an Operator." ); require( !EnumerableSet.contains(_operators, newOperator), "newOperator already exists." ); createResolution(resTypeReplaceOperator, oldOperator, newOperator,new bytes32[](0)); } /// @dev Create a resolution to update the transaction limit. Performs update if threshold is 1 or zero. function createResolutionUpdateTransactionLimit(uint160 newLimit) public onlyOwners() { createResolution( resTypeUpdateTransactionLimit, address(0), address(newLimit), new bytes32[](0) ); } /// @dev Create a resolution to update the owner agreement threshold. Performs update if threshold is 1 or zero. function createResolutionUpdateThreshold(uint160 threshold) public onlyOwners() { createResolution( resTypeUpdateThreshold, address(0), address(threshold), new bytes32[](0) ); } /// @dev Pause the contract. Does not require owner agreement. function pause() public onlyOwners() { _pause(); } /// @dev Create a resolution to unpause the contract. Performs update if threshold is 1 or zero. function createResolutionUnpause() public onlyOwners() { createResolution(resTypeUnpause, address(1), address(1), new bytes32[](0)); } // //////////////////////////////////////////////////// // INTERNAL FUNCTIONS // //////////////////////////////////////////////////// /// @dev Create a resolution and check if we can call perofrm the resolution with 1 vote. function createResolution( uint256 resType, address oldAddress, address newAddress, bytes32[] memory extra ) internal { uint256 resNum = nextResolution; nextResolution++; resolutionAlreadyUsed(resNum); resolutions[resNum].resType = resType; resolutions[resNum].oldAddress = oldAddress; resolutions[resNum].newAddress = newAddress; resolutions[resNum].extra = extra; ownerVotes[msg.sender][resNum] = true; lastOwnerResolutionNumber[msg.sender] = resNum; // Check if agreement is already reached if (ownerAgreementThreshold <= 1) { _performResolution(resNum); } } /// @dev Performs the resolution and then marks it as passed. No checks prevent it from performing the resolutions. function _performResolution(uint256 resNum) internal { if (resolutions[resNum].resType == resTypeAddOwner) { _addOwner(resolutions[resNum].newAddress); } else if (resolutions[resNum].resType == resTypeRemoveOwner) { _removeOwner(resolutions[resNum].oldAddress); } else if (resolutions[resNum].resType == resTypeReplaceOwner) { _replaceOwner( resolutions[resNum].oldAddress, resolutions[resNum].newAddress ); } else if (resolutions[resNum].resType == resTypeAddOperator) { _addOperator(resolutions[resNum].newAddress); } else if (resolutions[resNum].resType == resTypeRemoveOperator) { _removeOperator(resolutions[resNum].oldAddress); } else if (resolutions[resNum].resType == resTypeReplaceOperator) { _replaceOperator( resolutions[resNum].oldAddress, resolutions[resNum].newAddress ); } else if ( resolutions[resNum].resType == resTypeUpdateTransactionLimit ) { _updateTransactionLimit(uint160(resolutions[resNum].newAddress)); } else if (resolutions[resNum].resType == resTypeUpdateThreshold) { _updateThreshold(uint160(resolutions[resNum].newAddress)); } else if (resolutions[resNum].resType == resTypePause) { _pause(); } else if (resolutions[resNum].resType == resTypeUnpause) { _unpause(); } else { _customResolutions(resNum); return; } resolutions[resNum].passed = true; } /** * @dev Able to handle Custom Resolutions. * * Requirements: * * - Must set the resolution passed: resolutions[resNum].passed = true; * - You should check the resolutions[resNum].resType to know what to perform */ function _customResolutions(uint256 resNum) internal virtual {} /// @dev function _addOwner(address newOwner) internal { EnumerableSet.add(_owners, newOwner); emit OwnerAddition(newOwner); } /// @dev function _removeOwner(address newOwner) internal { EnumerableSet.remove(_owners, newOwner); emit OwnerRemoval(newOwner); uint numOwners = getNumberOfOwners(); if (ownerAgreementThreshold > numOwners) { _updateThreshold(numOwners); } } /// @dev function _replaceOwner(address oldOwner, address newOwner) internal { EnumerableSet.remove(_owners, oldOwner); EnumerableSet.add(_owners, newOwner); emit OwnerReplacement(oldOwner, newOwner); } /// @dev function _addOperator(address operator) internal { EnumerableSet.add(_operators, operator); emit OperatorAddition(operator); } /// @dev function _removeOperator(address operator) internal { EnumerableSet.remove(_operators, operator); emit OperatorRemoval(operator); } /// @dev function _replaceOperator(address oldOperator, address newOperator) internal { emit OperatorReplacement(oldOperator, newOperator); EnumerableSet.remove(_operators, oldOperator); EnumerableSet.add(_operators, newOperator); } /// @dev Internal function to update and emit the new transaction limit function _updateTransactionLimit(uint256 newLimit) internal { emit UpdateTransactionLimit(newLimit); transactionLimit = newLimit; } /// @dev Internal function to update and emit the new voting threshold function _updateThreshold(uint threshold) internal { require( threshold <= getNumberOfOwners(), "Unable to set threshold above the number of owners" ); emit UpdateThreshold(threshold); ownerAgreementThreshold = threshold; } /// @dev Internal function to update and emit the new voting threshold function _updateNumberOfOperators(uint160 numOperators) internal { require( numOperators >= getNumberOfOperators(), "Unable to set number of Operators below the number of operators" ); emit UpdateNumberOfOperators(numOperators); operatorLimit = numOperators; } /** * @dev Triggers stopped state. * * Requirements: The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(msg.sender); } /** * @dev Returns to normal state. * * Requirements: The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(msg.sender); } } // File: contracts/UreeqaCollectibleNFTsv2.sol pragma solidity >=0.7.0 <0.9.0; /// @title Official Collectible NFTs /// @author Dr. Jonathan Shahen at UREEQA /// @notice Collectible NFTs that are officially connected to a Validated UREEQA NFT /// @dev Check the Package of Proof associated with the UREEQA Validated NFT before Purchase contract UreeqaCollectibleNFTv2 is OwnershipAgreementv3, ERC721 { // //////////////////////////////////////////////////// // STORAGE // //////////////////////////////////////////////////// string private _baseUrl; // Owner Validated NFT mapping(uint256 => address) _validatedNFTAddress; mapping(uint256 => uint256) _validatedNFTID; // Attached File mapping(uint256 => bytes32) _attachedFileHash; // //////////////////////////////////////////////////// // CONSTRUCTOR // //////////////////////////////////////////////////// /// @dev Add an Operator if `operator` is not equal to address(0) constructor( string memory name, string memory symbol, address operator ) ERC721(name, symbol) { _baseUrl = string( abi.encodePacked( "https://nft.ureeqa.com/contract/", toString(abi.encodePacked(address(this))), "/" ) ); if (operator != address(0)) { createResolutionAddOperator(operator); } } // //////////////////////////////////////////////////// // EVENTS // //////////////////////////////////////////////////// event UpdateNFT( address oldContract, uint256 oldNFTId, address newContract, uint256 newNFTId ); event UpdateFileHash(bytes32 oldFileHash, bytes32 newFileHash); // //////////////////////////////////////////////////// // MODIFIERS // //////////////////////////////////////////////////// // //////////////////////////////////////////////////// // VIEW FUNCTIONS // //////////////////////////////////////////////////// /// @dev returns the Contract's URI function contractURI() public view returns (string memory) { return _baseUrl; } /// @dev Returns if an NFT exists (was minted) function exists(uint256 tokenId) public view returns (bool) { return _exists(tokenId); } /// @dev Returns the Smart Cotnract address and the NFT ID of the parent Validated NFT function getValidatedNFT(uint256 tokenId) public view returns (address, uint256) { return (_validatedNFTAddress[tokenId], _validatedNFTID[tokenId]); } /// @dev Returns the Smart Cotnract address and the NFT ID of the parent Validated NFT function getAttachedFileHash(uint256 tokenId) public view returns (bytes32) { return _attachedFileHash[tokenId]; } // //////////////////////////////////////////////////// // PUBLIC FUNCTIONS // //////////////////////////////////////////////////// // //////////////////////////////////////////////////// // OPERATOR FUNCTIONS // //////////////////////////////////////////////////// /** * @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} nad {UpdateNFT} events. */ function safeMint( address to, uint256 tokenId, address validatedAddress, uint256 validatedID, bytes32 attachedFileHash ) public onlyOperators() { _safeMint(to, tokenId, ""); emit UpdateNFT( _validatedNFTAddress[tokenId], _validatedNFTID[tokenId], validatedAddress, validatedID ); _validatedNFTAddress[tokenId] = validatedAddress; _validatedNFTID[tokenId] = validatedID; _attachedFileHash[tokenId] = attachedFileHash; } /** * @dev Safely mints `tokenId`s and transfers it to `to`s. * * 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 safeMintBatch( address[] calldata to, uint256[] calldata tokenId, address[] calldata validatedAddress, uint256[] calldata validatedID, bytes32[] calldata attachedFileHash ) public onlyOperators() { require( to.length == tokenId.length && validatedAddress.length == tokenId.length && attachedFileHash.length == tokenId.length && validatedAddress.length == validatedID.length, "To and TokenID must have the same length" ); for (uint256 i = 0; i < to.length; i++) { _safeMint(to[i], tokenId[i], ""); emit UpdateNFT( _validatedNFTAddress[tokenId[i]], _validatedNFTID[tokenId[i]], validatedAddress[i], validatedID[i] ); _validatedNFTAddress[tokenId[i]] = validatedAddress[i]; _validatedNFTID[tokenId[i]] = validatedID[i]; _attachedFileHash[tokenId[i]] = attachedFileHash[i]; } } /** * @dev Updates the connected Validated NFT for a Collectible * * Emits a {UpdateNFT} event. */ function updateValidatedNFT( uint256 tokenId, address validatedAddress, uint256 validatedID ) public onlyOperators() { emit UpdateNFT( _validatedNFTAddress[tokenId], _validatedNFTID[tokenId], validatedAddress, validatedID ); _validatedNFTAddress[tokenId] = validatedAddress; _validatedNFTID[tokenId] = validatedID; } /** * @dev Batch Updates the connected Validated NFT for a Collectible * * Emits a {UpdateNFT} event. */ function updateValidatedNFTBatch( uint256[] calldata tokenId, address[] calldata validatedAddress, uint256[] calldata validatedID ) public onlyOperators() { require( validatedAddress.length == tokenId.length && validatedAddress.length == validatedID.length, "Input arrays must have the same length" ); for (uint256 i = 0; i < tokenId.length; i++) { emit UpdateNFT( _validatedNFTAddress[tokenId[i]], _validatedNFTID[tokenId[i]], validatedAddress[i], validatedID[i] ); _validatedNFTAddress[tokenId[i]] = validatedAddress[i]; _validatedNFTID[tokenId[i]] = validatedID[i]; } } /** * @dev Updates the attached File Hash for a Collectible * * Emits a {UpdateFileHash} event. */ function updateAttachedFileHash(uint256 tokenId, bytes32 fileHash) public onlyOperators() { emit UpdateFileHash(_attachedFileHash[tokenId], fileHash); _attachedFileHash[tokenId] = fileHash; } /** * @dev Batch Updates the attached File Hash for a Collectible * * Emits a {UpdateFileHash} event. */ function updateAttachedFileHashBatch( uint256[] calldata tokenId, bytes32[] calldata fileHash ) public onlyOperators() { require( fileHash.length == tokenId.length, "Input arrays must have the same length" ); for (uint256 i = 0; i < tokenId.length; i++) { emit UpdateFileHash(_attachedFileHash[tokenId[i]], fileHash[i]); _attachedFileHash[tokenId[i]] = fileHash[i]; } } // //////////////////////////////////////////////////// // INTERNAL FUNCTIONS // //////////////////////////////////////////////////// /** * @dev Base URI for computing {tokenURI}. */ function _baseURI() internal view override returns (string memory) { return _baseUrl; } function toString(bytes memory data) public pure returns (string memory) { bytes memory alphabet = "0123456789abcdef"; bytes memory str = new bytes(2 + data.length * 2); str[0] = "0"; str[1] = "x"; for (uint256 i = 0; i < data.length; i++) { str[2 + i * 2] = alphabet[uint256(uint8(data[i] >> 4))]; str[3 + i * 2] = alphabet[uint256(uint8(data[i] & 0x0f))]; } return string(str); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOperator","type":"address"}],"name":"OperatorAddition","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldOperator","type":"address"}],"name":"OperatorRemoval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldOperator","type":"address"},{"indexed":false,"internalType":"address","name":"newOperator","type":"address"}],"name":"OperatorReplacement","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"OwnerAddition","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"OwnerRemoval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerReplacement","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"oldFileHash","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"newFileHash","type":"bytes32"}],"name":"UpdateFileHash","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldContract","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldNFTId","type":"uint256"},{"indexed":false,"internalType":"address","name":"newContract","type":"address"},{"indexed":false,"internalType":"uint256","name":"newNFTId","type":"uint256"}],"name":"UpdateNFT","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newOperators","type":"uint256"}],"name":"UpdateNumberOfOperators","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"UpdateThreshold","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"UpdateTransactionLimit","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"resNum","type":"uint256"}],"name":"canResolutionPass","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOperator","type":"address"}],"name":"createResolutionAddOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"createResolutionAddOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"createResolutionRemoveOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"oldOwner","type":"address"}],"name":"createResolutionRemoveOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"oldOperator","type":"address"},{"internalType":"address","name":"newOperator","type":"address"}],"name":"createResolutionReplaceOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"oldOwner","type":"address"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"createResolutionReplaceOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"createResolutionUnpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint160","name":"threshold","type":"uint160"}],"name":"createResolutionUpdateThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint160","name":"newLimit","type":"uint160"}],"name":"createResolutionUpdateTransactionLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getAttachedFileHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"thisOwner","type":"address"}],"name":"getLastOwnerResolutionNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNextResolutionNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfOperators","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfOwners","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOperators","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwners","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTransactionLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getValidatedNFT","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVoteThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"resNum","type":"uint256"}],"name":"isResolutionPassed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAddr","type":"address"}],"name":"isValidAddress","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextResolution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerAgreementThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownerVotes","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"resNum","type":"uint256"}],"name":"resolutionAlreadyUsed","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"resolutions","outputs":[{"internalType":"bool","name":"passed","type":"bool"},{"internalType":"uint256","name":"resType","type":"uint256"},{"internalType":"address","name":"oldAddress","type":"address"},{"internalType":"address","name":"newAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"validatedAddress","type":"address"},{"internalType":"uint256","name":"validatedID","type":"uint256"},{"internalType":"bytes32","name":"attachedFileHash","type":"bytes32"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"to","type":"address[]"},{"internalType":"uint256[]","name":"tokenId","type":"uint256[]"},{"internalType":"address[]","name":"validatedAddress","type":"address[]"},{"internalType":"uint256[]","name":"validatedID","type":"uint256[]"},{"internalType":"bytes32[]","name":"attachedFileHash","type":"bytes32[]"}],"name":"safeMintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"bytes","name":"data","type":"bytes"}],"name":"toString","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transactionLimit","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":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes32","name":"fileHash","type":"bytes32"}],"name":"updateAttachedFileHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenId","type":"uint256[]"},{"internalType":"bytes32[]","name":"fileHash","type":"bytes32[]"}],"name":"updateAttachedFileHashBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"validatedAddress","type":"address"},{"internalType":"uint256","name":"validatedID","type":"uint256"}],"name":"updateValidatedNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenId","type":"uint256[]"},{"internalType":"address[]","name":"validatedAddress","type":"address[]"},{"internalType":"uint256[]","name":"validatedID","type":"uint256[]"}],"name":"updateValidatedNFTBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"resNum","type":"uint256"}],"name":"voteResolution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260016005556001600655600060075560016009553480156200002557600080fd5b506040516200538d3803806200538d833981016040819052620000489162000fa3565b8282620000553362000117565b6002805460ff1916905581516200007490600c90602085019062000e37565b5080516200008a90600d90602084019062000e37565b505050620000ba30604051602001620000a491906200102c565b60408051601f198184030181529190526200016c565b604051602001620000cc919062001044565b60405160208183030381529060405260129080519060200190620000f292919062000e37565b506001600160a01b038116156200010e576200010e816200041c565b50505062001379565b6200012f600082620004d260201b620020ae1760201c565b507ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d8160405162000161919062001096565b60405180910390a150565b60408051808201909152601081526f181899199a1a9b1b9c1cb0b131b232b360811b6020820152815160609190600090620001a990600262001283565b620001b690600262001268565b6001600160401b03811115620001dc57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801562000207576020820181803683370190505b509050600360fc1b816000815181106200023157634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106200026f57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060005b84518110156200041457826004868381518110620002b757634e487b7160e01b600052603260045260246000fd5b016020015182516001600160f81b031990911690911c60f81c908110620002ee57634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b031916826200030b83600262001283565b6200031890600262001268565b815181106200033757634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350828582815181106200037057634e487b7160e01b600052603260045260246000fd5b602091010151815160f89190911c600f169081106200039f57634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b03191682620003bc83600262001283565b620003c990600362001268565b81518110620003e857634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350806200040b816200132f565b91505062000289565b509392505050565b6200042733620004f2565b6200043f6000336200051b60201b620020c31760201c565b15156001146200046c5760405162461bcd60e51b8152600401620004639062001184565b60405180910390fd5b6200047781620004f2565b6200048f6003826200051b60201b620020c31760201c565b15620004af5760405162461bcd60e51b815260040162000463906200114d565b60408051600080825260208201909252620004cf91600491849062000532565b50565b6000620004e9836001600160a01b0384166200060a565b90505b92915050565b6001600160a01b038116620004cf5760405162461bcd60e51b81526004016200046390620011ff565b6000620004e9836001600160a01b03841662000659565b60098054908190600062000546836200132f565b909155506200055790508162000671565b6000818152600b60209081526040909120600181018790556002810180546001600160a01b038089166001600160a01b031992831617909255600383018054928816929091169190911790558351620005b99260049092019185019062000ec6565b503360008181526008602090815260408083208584528252808320805460ff19166001908117909155938352600a90915290208290556006541162000603576200060381620006d3565b5050505050565b600062000618838362000659565b6200065057508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620004ec565b506000620004ec565b60009081526001919091016020526040902054151590565b6000818152600b60205260409020600201546001600160a01b0316151580620006b357506000818152600b60205260409020600301546001600160a01b031615155b15620004cf5760405162461bcd60e51b8152600401620004639062001228565b6000818152600b6020526040902060019081015414156200071a576000818152600b602052604090206003015462000714906001600160a01b031662000117565b62000952565b6000818152600b6020526040902060010154600214156200075b576000818152600b602052604090206002015462000714906001600160a01b03166200096e565b6000818152600b602052604090206001015460031415620007a7576000818152600b60205260409020600281015460039091015462000714916001600160a01b039081169116620009e8565b6000818152600b602052604090206001015460041415620007e8576000818152600b602052604090206003015462000714906001600160a01b031662000a59565b6000818152600b60205260409020600101546005141562000829576000818152600b602052604090206002015462000714906001600160a01b031662000aa3565b6000818152600b60205260409020600101546006141562000875576000818152600b60205260409020600281015460039091015462000714916001600160a01b03908116911662000aed565b6000818152600b602052604090206001015460081415620008b6576000818152600b602052604090206003015462000714906001600160a01b031662000b5e565b6000818152600b602052604090206001015460071415620008f7576000818152600b602052604090206003015462000714906001600160a01b031662000b9c565b6000818152600b6020526040902060010154600914156200091c576200071462000c06565b6000818152600b6020526040902060010154600a141562000941576200071462000c75565b6200094c81620004cf565b620004cf565b6000818152600b60205260409020805460ff1916600117905550565b6200098660008262000cd660201b620020d81760201c565b507f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9081604051620009b8919062001096565b60405180910390a16000620009cc62000ced565b9050806006541115620009e457620009e48162000b9c565b5050565b62000a0060008362000cd660201b620020d81760201c565b5062000a19600082620004d260201b620020ae1760201c565b507f1b82188083c6040dda91df3d142280a20fa00e5a433eb921fdbf2e4ad1db45e5828260405162000a4d929190620010aa565b60405180910390a15050565b62000a71600382620004d260201b620020ae1760201c565b507fe96a56aa17dd8ae64ac3a51347e8e8a03d52f1cb2acdf8ed49b20d55662ebecc8160405162000161919062001096565b62000abb60038262000cd660201b620020d81760201c565b507f108286147377add4f5f7bcdd7b6104dc6bdac3443e499142a612d418aa0be1548160405162000161919062001096565b7f409833df5b08419a3bd86d34683f91767845e813a29d30d8a4338fba95158d8a828260405162000b20929190620010aa565b60405180910390a162000b4060038362000cd660201b620020d81760201c565b5062000b59600382620004d260201b620020ae1760201c565b505050565b7f5ba74490711ccc5e81b24b40b8c5d2bd282981e4bc080dd8789bb10c1dfc2ea98160405162000b8f91906200125f565b60405180910390a1600755565b62000ba662000ced565b81111562000bc85760405162461bcd60e51b81526004016200046390620010c4565b7fcfbc3e24bcdbf875f7af2b101605919fdbd3cb0b217ae54c372ae49417c58d018160405162000bf991906200125f565b60405180910390a1600655565b60025460ff161562000c2c5760405162461bcd60e51b81526004016200046390620011c8565b6002805460ff191660011790556040517f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2589062000c6b90339062001096565b60405180910390a1565b60025460ff1662000c9a5760405162461bcd60e51b8152600401620004639062001116565b6002805460ff191690556040517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa9062000c6b90339062001096565b6000620004e9836001600160a01b03841662000d0b565b600062000d06600062000e2c60201b620020ed1760201c565b905090565b6000818152600183016020526040812054801562000e2157600062000d32600183620012a5565b855490915060009062000d4890600190620012a5565b9050600086600001828154811062000d7057634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508087600001848154811062000da257634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101929092558281526001890190915260409020849055865487908062000de457634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050620004ec565b6000915050620004ec565b6000620004ec825490565b82805462000e4590620012f2565b90600052602060002090601f01602090048101928262000e69576000855562000eb4565b82601f1062000e8457805160ff191683800117855562000eb4565b8280016001018555821562000eb4579182015b8281111562000eb457825182559160200191906001019062000e97565b5062000ec292915062000f03565b5090565b82805482825590600052602060002090810192821562000eb4579160200282018281111562000eb457825182559160200191906001019062000e97565b5b8082111562000ec2576000815560010162000f04565b600082601f83011262000f2b578081fd5b81516001600160401b038082111562000f485762000f4862001363565b604051601f8301601f19168101602001828111828210171562000f6f5762000f6f62001363565b60405282815284830160200186101562000f87578384fd5b62000f9a836020830160208801620012bf565b95945050505050565b60008060006060848603121562000fb8578283fd5b83516001600160401b038082111562000fcf578485fd5b62000fdd8783880162000f1a565b9450602086015191508082111562000ff3578384fd5b50620010028682870162000f1a565b604086015190935090506001600160a01b038116811462001021578182fd5b809150509250925092565b60609190911b6001600160601b031916815260140190565b60007f68747470733a2f2f6e66742e7572656571612e636f6d2f636f6e74726163742f825282516200107e816020850160208701620012bf565b602f60f81b6020939091019283015250602101919050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b60208082526032908201527f556e61626c6520746f20736574207468726573686f6c642061626f766520746860408201527165206e756d626572206f66206f776e65727360701b606082015260800190565b6020808252601c908201527f536d61727420436f6e7472616374206973206e6f742070617573656400000000604082015260600190565b6020808252601b908201527f6e65774f70657261746f7220616c7265616479206578697374732e0000000000604082015260600190565b60208082526024908201527f4f6e6c7920616e206f776e65722063616e2072756e20746869732066756e637460408201526334b7b71760e11b606082015260800190565b60208082526018908201527f536d61727420436f6e7472616374206973207061757365640000000000000000604082015260600190565b6020808252600f908201526e496e7661696c64204164647265737360881b604082015260600190565b6020808252601d908201527f5265736f6c7574696f6e20697320616c726561647920696e207573652e000000604082015260600190565b90815260200190565b600082198211156200127e576200127e6200134d565b500190565b6000816000190483118215151615620012a057620012a06200134d565b500290565b600082821015620012ba57620012ba6200134d565b500390565b60005b83811015620012dc578181015183820152602001620012c2565b83811115620012ec576000848401525b50505050565b6002810460018216806200130757607f821691505b602082108114156200132957634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156200134657620013466200134d565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b61400480620013896000396000f3fe608060405234801561001057600080fd5b506004361061035c5760003560e01c80638456cb59116101d3578063b8d95d7e11610104578063ce6f7549116100a2578063e985e9c51161007c578063e985e9c5146106e6578063f1376a98146106f9578063f19605d61461070c578063fb3da8e5146107145761035c565b8063ce6f7549146106c3578063dee80c0f146106d6578063e8a3d485146106de5761035c565b8063c0d795de116100de578063c0d795de1461068d578063c3743cff146106a0578063c87b56dd146106a8578063ccc19752146106bb5761035c565b8063b8d95d7e1461065f578063baa98fbd14610672578063bc64745f1461067a5761035c565b806395d89b4111610171578063a4b7f5ce1161014b578063a4b7f5ce1461060e578063abefed8314610631578063b85e5b7414610644578063b88d4fde1461064c5761035c565b806395d89b41146105eb578063a0e67e2b146105f3578063a22cb465146105fb5761035c565b80638da5cb5b116101ad5780638da5cb5b146105a75780638dfc731f146105af57806390e4ed59146105c25780639425c908146105ca5761035c565b80638456cb591461057757806384be5ea91461057f57806385a1a60b146105925761035c565b80632e33e1e3116102ad578063654079ba1161024b57806370a082311161022557806370a082311461052b57806371aad10d1461053e57806378f880d2146105515780637ad8ed1e146105645761035c565b8063654079ba146104f25780636cc8bcff146105055780636f80210a146105185761035c565b80634f558e79116102875780634f558e79146104bc5780635c975abb146104cf5780635e7d907f146104d75780636352211e146104df5761035c565b80632e33e1e31461048e5780633a008949146104a157806342842e0e146104a95761035c565b8063095ea7b31161031a57806320336566116102f4578063203365661461044057806323b872dd1461045357806326eb27351461046657806327a099d8146104795761035c565b8063095ea7b31461040757806312c290cb1461041a57806312c445151461042d5761035c565b80623f07fa1461036157806301ffc9a714610376578063037af12c1461039f578063053a04f1146103bf57806306fdde03146103d2578063081812fc146103e7575b600080fd5b61037461036f366004613047565b610727565b005b6103896103843660046133dc565b610759565b60405161039691906135fc565b60405180910390f35b6103b26103ad366004613047565b6107a1565b6040516103969190613630565b6103896103cd366004613447565b6107bc565b6103da6107d1565b6040516103969190613647565b6103fa6103f5366004613447565b610864565b6040516103969190613501565b610374610415366004613176565b6108a7565b610374610428366004613047565b61093f565b61037461043b366004613047565b6109de565b61037461044e366004613063565b610a21565b61037461046136600461309b565b610ac9565b610374610474366004613047565b610b01565b610481610b9b565b60405161039691906135af565b61037461049c366004613047565b610c67565b6103b2610cdb565b6103746104b736600461309b565b610ce1565b6103896104ca366004613447565b610cfc565b610389610d07565b6103b2610d10565b6103fa6104ed366004613447565b610d16565b610389610500366004613176565b610d4b565b610374610513366004613447565b610d6b565b61037461052636600461345f565b610dc9565b6103b2610539366004613047565b610e84565b6103da61054c366004613414565b610ec8565b61037461055f366004613485565b61115f565b610374610572366004613047565b6111ee565b610374611231565b61037461058d366004613063565b611270565b61059a611314565b6040516103969190613e3b565b6103fa611325565b6103746105bd366004613373565b611348565b6103b26114bd565b6105dd6105d8366004613447565b6114c3565b60405161039692919061356c565b6103da6114ec565b6104816114fb565b610374610609366004613145565b6115c0565b61062161061c366004613447565b61168e565b6040516103969493929190613607565b61037461063f3660046131f2565b6116c6565b6103b2611a3e565b61037461065a3660046130db565b611a4a565b61037461066d366004613047565b611a89565b610374611af3565b6103b2610688366004613447565b611b37565b61038961069b366004613447565b611b49565b6103b2611bd3565b6103da6106b6366004613447565b611bd9565b6103b2611c5c565b6103746106d13660046132dd565b611c62565b6103b2611ee8565b6103da611eee565b6103896106f4366004613063565b611efd565b610389610707366004613447565b611f2d565b6103b2611fc6565b6103746107223660046131a1565b611fcc565b6001600160a01b0381166107565760405162461bcd60e51b815260040161074d90613da4565b60405180910390fd5b50565b60006001600160e01b031982166380ac58cd60e01b148061078a57506001600160e01b03198216635b5e139f60e01b145b806107995750610799826120f8565b90505b919050565b6001600160a01b03166000908152600a602052604090205490565b6000908152600b602052604090205460ff1690565b6060600c80546107e090613ed7565b80601f016020809104026020016040519081016040528092919081815260200182805461080c90613ed7565b80156108595780601f1061082e57610100808354040283529160200191610859565b820191906000526020600020905b81548152906001019060200180831161083c57829003601f168201915b505050505090505b90565b600061086f82612111565b61088b5760405162461bcd60e51b815260040161074d90613bb3565b506000908152601060205260409020546001600160a01b031690565b60006108b282610d16565b9050806001600160a01b0316836001600160a01b031614156108e65760405162461bcd60e51b815260040161074d90613c97565b806001600160a01b03166108f861212e565b6001600160a01b031614806109145750610914816106f461212e565b6109305760405162461bcd60e51b815260040161074d90613973565b61093a8383612132565b505050565b61094833610727565b6109536000336120c3565b15156001146109745760405162461bcd60e51b815260040161074d90613d29565b61097d81610727565b6109886003826120c3565b156109a55760405162461bcd60e51b815260040161074d90613ad1565b6107566004600083815b6040519080825280602002602001820160405280156109d8578160200160208202803683370190505b506121a0565b6109e733610727565b6109f26000336120c3565b1515600114610a135760405162461bcd60e51b815260040161074d90613d29565b6107566007600083816109af565b610a2a33610727565b610a356000336120c3565b1515600114610a565760405162461bcd60e51b815260040161074d90613d29565b610a5f82610727565b610a6881610727565b610a736003836120c3565b610a8f5760405162461bcd60e51b815260040161074d906137ae565b610a9a6003826120c3565b15610ab75760405162461bcd60e51b815260040161074d90613ad1565b610ac56006838360006109af565b5050565b610ada610ad461212e565b82612267565b610af65760405162461bcd60e51b815260040161074d90613cd8565b61093a8383836122ec565b610b0a33610727565b610b156000336120c3565b1515600114610b365760405162461bcd60e51b815260040161074d90613d29565b610b3f81610727565b6001610b49611a3e565b11610b665760405162461bcd60e51b815260040161074d90613740565b610b716000826120c3565b610b8d5760405162461bcd60e51b815260040161074d90613b83565b6107566002826000806109af565b60606000610ba960036120ed565b905060008167ffffffffffffffff811115610bd457634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610bfd578160200160208202803683370190505b50905060005b82811015610c6057610c16600382612419565b828281518110610c3657634e487b7160e01b600052603260045260246000fd5b6001600160a01b039092166020928302919091019091015280610c5881613f12565b915050610c03565b5091505090565b610c7033610727565b610c7b6000336120c3565b1515600114610c9c5760405162461bcd60e51b815260040161074d90613d29565b610ca581610727565b610cb06000826120c3565b15610ccd5760405162461bcd60e51b815260040161074d906138f4565b6107566001600083816109af565b60095490565b61093a83838360405180602001604052806000815250611a4a565b600061079982612111565b60025460ff1690565b60065490565b6000818152600e60205260408120546001600160a01b0316806107995760405162461bcd60e51b815260040161074d90613a1a565b600860209081526000928352604080842090915290825290205460ff1681565b6000818152600b60205260409020600201546001600160a01b0316151580610dac57506000818152600b60205260409020600301546001600160a01b031615155b156107565760405162461bcd60e51b815260040161074d90613e04565b610dd233610727565b610ddd6003336120c3565b1515600114610dfe5760405162461bcd60e51b815260040161074d90613860565b600083815260136020908152604080832054601490925291829020549151600080516020613faf83398151915292610e43926001600160a01b03169186908690613585565b60405180910390a1600092835260136020908152604080852080546001600160a01b0319166001600160a01b03959095169490941790935560149052912055565b60006001600160a01b038216610eac5760405162461bcd60e51b815260040161074d906139d0565b506001600160a01b03166000908152600f602052604090205490565b60408051808201909152601081526f181899199a1a9b1b9c1cb0b131b232b360811b6020820152815160609190600090610f03906002613e75565b610f0e906002613e49565b67ffffffffffffffff811115610f3457634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015610f5e576020820181803683370190505b509050600360fc1b81600081518110610f8757634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110610fc457634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060005b84518110156111575782600486838151811061100a57634e487b7160e01b600052603260045260246000fd5b016020015182516001600160f81b031990911690911c60f81c90811061104057634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b0319168261105b836002613e75565b611066906002613e49565b8151811061108457634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350828582815181106110bc57634e487b7160e01b600052603260045260246000fd5b602091010151815160f89190911c600f169081106110ea57634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b03191682611105836002613e75565b611110906003613e49565b8151811061112e57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053508061114f81613f12565b915050610fde565b509392505050565b61116833610727565b6111736003336120c3565b15156001146111945760405162461bcd60e51b815260040161074d90613860565b600082815260156020526040908190205490517f2dbfd0069a9236a97389d9573cc238a1ba0cb78a195d33231fc1cbc87e4ccd17916111d4918490613639565b60405180910390a160009182526015602052604090912055565b6111f733610727565b6112026000336120c3565b15156001146112235760405162461bcd60e51b815260040161074d90613d29565b6107566008600083816109af565b61123a33610727565b6112456000336120c3565b15156001146112665760405162461bcd60e51b815260040161074d90613d29565b61126e612425565b565b61127933610727565b6112846000336120c3565b15156001146112a55760405162461bcd60e51b815260040161074d90613d29565b6112ae82610727565b6112b781610727565b6112c26000836120c3565b6112de5760405162461bcd60e51b815260040161074d90613a63565b6112e96000826120c3565b156113065760405162461bcd60e51b815260040161074d906138f4565b610ac56003838360006109af565b600061132060036120ed565b905090565b600061133160006120ed565b61133d57506000610861565b611320600080612419565b61135133610727565b61135c6003336120c3565b151560011461137d5760405162461bcd60e51b815260040161074d90613860565b80831461139c5760405162461bcd60e51b815260040161074d90613b3d565b60005b838110156114b6577f2dbfd0069a9236a97389d9573cc238a1ba0cb78a195d33231fc1cbc87e4ccd17601560008787858181106113ec57634e487b7160e01b600052603260045260246000fd5b9050602002013581526020019081526020016000205484848481811061142257634e487b7160e01b600052603260045260246000fd5b90506020020135604051611437929190613639565b60405180910390a182828281811061145f57634e487b7160e01b600052603260045260246000fd5b905060200201356015600087878581811061148a57634e487b7160e01b600052603260045260246000fd5b9050602002013581526020019081526020016000208190555080806114ae90613f12565b91505061139f565b5050505050565b60055481565b6000908152601360209081526040808320546014909252909120546001600160a01b0390911691565b6060600d80546107e090613ed7565b6060600061150960006120ed565b905060008167ffffffffffffffff81111561153457634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561155d578160200160208202803683370190505b50905060005b82811015610c6057611576600082612419565b82828151811061159657634e487b7160e01b600052603260045260246000fd5b6001600160a01b0390921660209283029190910190910152806115b881613f12565b915050611563565b6115c861212e565b6001600160a01b0316826001600160a01b031614156115f95760405162461bcd60e51b815260040161074d90613829565b806011600061160661212e565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff19169215159290921790915561164a61212e565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161168291906135fc565b60405180910390a35050565b600b60205260009081526040902080546001820154600283015460039093015460ff9092169290916001600160a01b03918216911684565b6116cf33610727565b6116da6003336120c3565b15156001146116fb5760405162461bcd60e51b815260040161074d90613860565b888714801561170957508487145b801561171457508087145b801561171f57508483145b61173b5760405162461bcd60e51b815260040161074d9061392b565b60005b89811015611a31576117ba8b8b8381811061176957634e487b7160e01b600052603260045260246000fd5b905060200201602081019061177e9190613047565b8a8a8481811061179e57634e487b7160e01b600052603260045260246000fd5b905060200201356040518060200160405280600081525061248f565b600080516020613faf833981519152601360008b8b858181106117ed57634e487b7160e01b600052603260045260246000fd5b90506020020135815260200190815260200160002060009054906101000a90046001600160a01b0316601460008c8c8681811061183a57634e487b7160e01b600052603260045260246000fd5b9050602002013581526020019081526020016000205489898581811061187057634e487b7160e01b600052603260045260246000fd5b90506020020160208101906118859190613047565b8888868181106118a557634e487b7160e01b600052603260045260246000fd5b905060200201356040516118bc9493929190613585565b60405180910390a18686828181106118e457634e487b7160e01b600052603260045260246000fd5b90506020020160208101906118f99190613047565b601360008b8b8581811061191d57634e487b7160e01b600052603260045260246000fd5b90506020020135815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555084848281811061197657634e487b7160e01b600052603260045260246000fd5b90506020020135601460008b8b858181106119a157634e487b7160e01b600052603260045260246000fd5b905060200201358152602001908152602001600020819055508282828181106119da57634e487b7160e01b600052603260045260246000fd5b90506020020135601560008b8b85818110611a0557634e487b7160e01b600052603260045260246000fd5b905060200201358152602001908152602001600020819055508080611a2990613f12565b91505061173e565b5050505050505050505050565b600061132060006120ed565b611a5b611a5561212e565b83612267565b611a775760405162461bcd60e51b815260040161074d90613cd8565b611a83848484846124c2565b50505050565b611a9233610727565b611a9d6000336120c3565b1515600114611abe5760405162461bcd60e51b815260040161074d90613d29565b611ac96003826120c3565b611ae55760405162461bcd60e51b815260040161074d90613dcd565b6107566005826000806109af565b611afc33610727565b611b076000336120c3565b1515600114611b285760405162461bcd60e51b815260040161074d90613d29565b61126e600a60018060006109af565b60009081526015602052604090205490565b60008080611b56816120ed565b905060005b81811015611bc65760086000611b72600084612419565b6001600160a01b031681526020808201929092526040908101600090812088825290925290205460ff16151560011415611bb45782611bb081613f12565b9350505b80611bbe81613f12565b915050611b5b565b5050600654111592915050565b60075490565b6060611be482612111565b611c005760405162461bcd60e51b815260040161074d90613c48565b6000611c0a611eee565b90506000815111611c2a5760405180602001604052806000815250611c55565b80611c34846124f5565b604051602001611c459291906134d2565b6040516020818303038152906040525b9392505050565b60095481565b611c6b33610727565b611c766003336120c3565b1515600114611c975760405162461bcd60e51b815260040161074d90613860565b8285148015611ca557508281145b611cc15760405162461bcd60e51b815260040161074d90613b3d565b60005b85811015611edf57600080516020613faf83398151915260136000898985818110611cff57634e487b7160e01b600052603260045260246000fd5b90506020020135815260200190815260200160002060009054906101000a90046001600160a01b0316601460008a8a86818110611d4c57634e487b7160e01b600052603260045260246000fd5b90506020020135815260200190815260200160002054878785818110611d8257634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611d979190613047565b868686818110611db757634e487b7160e01b600052603260045260246000fd5b90506020020135604051611dce9493929190613585565b60405180910390a1848482818110611df657634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611e0b9190613047565b60136000898985818110611e2f57634e487b7160e01b600052603260045260246000fd5b90506020020135815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550828282818110611e8857634e487b7160e01b600052603260045260246000fd5b9050602002013560146000898985818110611eb357634e487b7160e01b600052603260045260246000fd5b905060200201358152602001908152602001600020819055508080611ed790613f12565b915050611cc4565b50505050505050565b60065481565b6060601280546107e090613ed7565b6001600160a01b0380831660009081526011602090815260408083209385168352929052205460ff165b92915050565b6000611f3833610727565b611f436000336120c3565b1515600114611f645760405162461bcd60e51b815260040161074d90613d29565b3360009081526008602090815260408083208584529091529020805460ff19166001179055611f92826107bc565b15611f9f5750600161079c565b611fa882611b49565b15611fbe57611fb682612610565b50600161079c565b506000919050565b60075481565b611fd533610727565b611fe06003336120c3565b15156001146120015760405162461bcd60e51b815260040161074d90613860565b61201b85856040518060200160405280600081525061248f565b600084815260136020908152604080832054601490925291829020549151600080516020613faf83398151915292612060926001600160a01b03169187908790613585565b60405180910390a1600093845260136020908152604080862080546001600160a01b0319166001600160a01b0396909616959095179094556014815283852092909255601590915291205550565b6000611c55836001600160a01b038416612889565b6000611c55836001600160a01b0384166128d3565b6000611c55836001600160a01b0384166128eb565b600061079982612a02565b6001600160e01b031981166301ffc9a760e01b14919050565b6000908152600e60205260409020546001600160a01b0316151590565b3390565b600081815260106020526040902080546001600160a01b0319166001600160a01b038416908117909155819061216782610d16565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6009805490819060006121b283613f12565b91905055506121c081610d6b565b6000818152600b60209081526040909120600181018790556002810180546001600160a01b038089166001600160a01b03199283161790925560038301805492881692909116919091179055835161222092600490920191850190612f1d565b503360008181526008602090815260408083208584528252808320805460ff19166001908117909155938352600a9091529020829055600654116114b6576114b681612610565b600061227282612111565b61228e5760405162461bcd60e51b815260040161074d906138a8565b600061229983610d16565b9050806001600160a01b0316846001600160a01b031614806122d45750836001600160a01b03166122c984610864565b6001600160a01b0316145b806122e457506122e48185611efd565b949350505050565b826001600160a01b03166122ff82610d16565b6001600160a01b0316146123255760405162461bcd60e51b815260040161074d90613bff565b6001600160a01b03821661234b5760405162461bcd60e51b815260040161074d906137e5565b61235683838361093a565b612361600082612132565b6001600160a01b0383166000908152600f6020526040812080546001929061238a908490613e94565b90915550506001600160a01b0382166000908152600f602052604081208054600192906123b8908490613e49565b90915550506000818152600e602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000611c558383612a06565b60025460ff16156124485760405162461bcd60e51b815260040161074d90613d6d565b6002805460ff191660011790556040517f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890612485903390613501565b60405180910390a1565b6124998383612a5f565b6124a66000848484612b3e565b61093a5760405162461bcd60e51b815260040161074d906136ee565b6124cd8484846122ec565b6124d984848484612b3e565b611a835760405162461bcd60e51b815260040161074d906136ee565b60608161251a57506040805180820190915260018152600360fc1b602082015261079c565b8160005b8115612544578061252e81613f12565b915061253d9050600a83613e61565b915061251e565b60008167ffffffffffffffff81111561256d57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612597576020820181803683370190505b5090505b84156122e4576125ac600183613e94565b91506125b9600a86613f2d565b6125c4906030613e49565b60f81b8183815181106125e757634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612609600a86613e61565b945061259b565b6000818152600b602052604090206001908101541415612653576000818152600b602052604090206003015461264e906001600160a01b0316612c59565b61286d565b6000818152600b602052604090206001015460021415612691576000818152600b602052604090206002015461264e906001600160a01b0316612c9f565b6000818152600b6020526040902060010154600314156126da576000818152600b60205260409020600281015460039091015461264e916001600160a01b039081169116612d01565b6000818152600b602052604090206001015460041415612718576000818152600b602052604090206003015461264e906001600160a01b0316612d56565b6000818152600b602052604090206001015460051415612756576000818152600b602052604090206002015461264e906001600160a01b0316612d91565b6000818152600b60205260409020600101546006141561279f576000818152600b60205260409020600281015460039091015461264e916001600160a01b039081169116612dcc565b6000818152600b6020526040902060010154600814156127dd576000818152600b602052604090206003015461264e906001600160a01b0316612e1c565b6000818152600b60205260409020600101546007141561281b576000818152600b602052604090206003015461264e906001600160a01b0316612e58565b6000818152600b60205260409020600101546009141561283d5761264e612425565b6000818152600b6020526040902060010154600a141561285f5761264e612ebb565b61286881610756565b610756565b6000818152600b60205260409020805460ff1916600117905550565b600061289583836128d3565b6128cb57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155611f27565b506000611f27565b60009081526001919091016020526040902054151590565b600081815260018301602052604081205480156129f857600061290f600183613e94565b855490915060009061292390600190613e94565b9050600086600001828154811061294a57634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508087600001848154811061297b57634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600189019091526040902084905586548790806129bc57634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050611f27565b6000915050611f27565b5490565b81546000908210612a295760405162461bcd60e51b815260040161074d9061365a565b826000018281548110612a4c57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b6001600160a01b038216612a855760405162461bcd60e51b815260040161074d90613b08565b612a8e81612111565b15612aab5760405162461bcd60e51b815260040161074d90613777565b612ab76000838361093a565b6001600160a01b0382166000908152600f60205260408120805460019290612ae0908490613e49565b90915550506000818152600e602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000612b52846001600160a01b0316612f17565b15612c4e57836001600160a01b031663150b7a02612b6e61212e565b8786866040518563ffffffff1660e01b8152600401612b90949392919061352f565b602060405180830381600087803b158015612baa57600080fd5b505af1925050508015612bda575060408051601f3d908101601f19168201909252612bd7918101906133f8565b60015b612c34573d808015612c08576040519150601f19603f3d011682016040523d82523d6000602084013e612c0d565b606091505b508051612c2c5760405162461bcd60e51b815260040161074d906136ee565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506122e4565b506001949350505050565b612c646000826120ae565b507ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d81604051612c949190613501565b60405180910390a150565b612caa6000826120d8565b507f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9081604051612cda9190613501565b60405180910390a16000612cec611a3e565b9050806006541115610ac557610ac581612e58565b612d0c6000836120d8565b50612d186000826120ae565b507f1b82188083c6040dda91df3d142280a20fa00e5a433eb921fdbf2e4ad1db45e58282604051612d4a929190613515565b60405180910390a15050565b612d616003826120ae565b507fe96a56aa17dd8ae64ac3a51347e8e8a03d52f1cb2acdf8ed49b20d55662ebecc81604051612c949190613501565b612d9c6003826120d8565b507f108286147377add4f5f7bcdd7b6104dc6bdac3443e499142a612d418aa0be15481604051612c949190613501565b7f409833df5b08419a3bd86d34683f91767845e813a29d30d8a4338fba95158d8a8282604051612dfd929190613515565b60405180910390a1612e106003836120d8565b5061093a6003826120ae565b7f5ba74490711ccc5e81b24b40b8c5d2bd282981e4bc080dd8789bb10c1dfc2ea981604051612e4b9190613630565b60405180910390a1600755565b612e60611a3e565b811115612e7f5760405162461bcd60e51b815260040161074d9061369c565b7fcfbc3e24bcdbf875f7af2b101605919fdbd3cb0b217ae54c372ae49417c58d0181604051612eae9190613630565b60405180910390a1600655565b60025460ff16612edd5760405162461bcd60e51b815260040161074d90613a9a565b6002805460ff191690556040517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa90612485903390613501565b3b151590565b828054828255906000526020600020908101928215612f58579160200282015b82811115612f58578251825591602001919060010190612f3d565b50612f64929150612f68565b5090565b5b80821115612f645760008155600101612f69565b60008083601f840112612f8e578081fd5b50813567ffffffffffffffff811115612fa5578182fd5b6020830191508360208083028501011115612fbf57600080fd5b9250929050565b600082601f830112612fd6578081fd5b813567ffffffffffffffff80821115612ff157612ff1613f6d565b604051601f8301601f19168101602001828111828210171561301557613015613f6d565b60405282815284830160200186101561302c578384fd5b82602086016020830137918201602001929092529392505050565b600060208284031215613058578081fd5b8135611c5581613f83565b60008060408385031215613075578081fd5b823561308081613f83565b9150602083013561309081613f83565b809150509250929050565b6000806000606084860312156130af578081fd5b83356130ba81613f83565b925060208401356130ca81613f83565b929592945050506040919091013590565b600080600080608085870312156130f0578081fd5b84356130fb81613f83565b9350602085013561310b81613f83565b925060408501359150606085013567ffffffffffffffff81111561312d578182fd5b61313987828801612fc6565b91505092959194509250565b60008060408385031215613157578182fd5b823561316281613f83565b915060208301358015158114613090578182fd5b60008060408385031215613188578182fd5b823561319381613f83565b946020939093013593505050565b600080600080600060a086880312156131b8578081fd5b85356131c381613f83565b94506020860135935060408601356131da81613f83565b94979396509394606081013594506080013592915050565b60008060008060008060008060008060a08b8d031215613210578485fd5b8a3567ffffffffffffffff80821115613227578687fd5b6132338e838f01612f7d565b909c509a5060208d013591508082111561324b578687fd5b6132578e838f01612f7d565b909a50985060408d013591508082111561326f578687fd5b61327b8e838f01612f7d565b909850965060608d0135915080821115613293578586fd5b61329f8e838f01612f7d565b909650945060808d01359150808211156132b7578384fd5b506132c48d828e01612f7d565b915080935050809150509295989b9194979a5092959850565b600080600080600080606087890312156132f5578182fd5b863567ffffffffffffffff8082111561330c578384fd5b6133188a838b01612f7d565b90985096506020890135915080821115613330578384fd5b61333c8a838b01612f7d565b90965094506040890135915080821115613354578384fd5b5061336189828a01612f7d565b979a9699509497509295939492505050565b60008060008060408587031215613388578182fd5b843567ffffffffffffffff8082111561339f578384fd5b6133ab88838901612f7d565b909650945060208701359150808211156133c3578384fd5b506133d087828801612f7d565b95989497509550505050565b6000602082840312156133ed578081fd5b8135611c5581613f98565b600060208284031215613409578081fd5b8151611c5581613f98565b600060208284031215613425578081fd5b813567ffffffffffffffff81111561343b578182fd5b6122e484828501612fc6565b600060208284031215613458578081fd5b5035919050565b600080600060608486031215613473578081fd5b8335925060208401356130ca81613f83565b60008060408385031215613497578182fd5b50508035926020909101359150565b600081518084526134be816020860160208601613eab565b601f01601f19169290920160200192915050565b600083516134e4818460208801613eab565b8351908301906134f8818360208801613eab565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613562908301846134a6565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039485168152602081019390935292166040820152606081019190915260800190565b6020808252825182820181905260009190848201906040850190845b818110156135f05783516001600160a01b0316835292840192918401916001016135cb565b50909695505050505050565b901515815260200190565b931515845260208401929092526001600160a01b03908116604084015216606082015260800190565b90815260200190565b918252602082015260400190565b600060208252611c5560208301846134a6565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b60208082526032908201527f556e61626c6520746f20736574207468726573686f6c642061626f766520746860408201527165206e756d626572206f66206f776e65727360701b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526018908201527f4d75737420616c77617973206265206f6e65206f776e65720000000000000000604082015260600190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b6020808252601f908201527f6f6c644f70657261746f72206973206e6f7420616e204f70657261746f722e00604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b60208082526028908201527f4f6e6c7920746865206f70657261746f722063616e2072756e207468697320666040820152673ab731ba34b7b71760c11b606082015260800190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526018908201527f6e65774f776e657220616c7265616479206578697374732e0000000000000000604082015260600190565b60208082526028908201527f546f20616e6420546f6b656e4944206d7573742068617665207468652073616d6040820152670ca40d8cadccee8d60c31b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b60208082526019908201527f6f6c644f776e6572206973206e6f7420616e206f776e65722e00000000000000604082015260600190565b6020808252601c908201527f536d61727420436f6e7472616374206973206e6f742070617573656400000000604082015260600190565b6020808252601b908201527f6e65774f70657261746f7220616c7265616479206578697374732e0000000000604082015260600190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526026908201527f496e70757420617272617973206d7573742068617665207468652073616d65206040820152650d8cadccee8d60d31b606082015260800190565b60208082526016908201527537bbb732b91034b9903737ba1030b71037bbb732b91760511b604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526024908201527f4f6e6c7920616e206f776e65722063616e2072756e20746869732066756e637460408201526334b7b71760e11b606082015260800190565b60208082526018908201527f536d61727420436f6e7472616374206973207061757365640000000000000000604082015260600190565b6020808252600f908201526e496e7661696c64204164647265737360881b604082015260600190565b6020808252601c908201527f6f70657261746f72206973206e6f7420616e204f70657261746f722e00000000604082015260600190565b6020808252601d908201527f5265736f6c7574696f6e20697320616c726561647920696e207573652e000000604082015260600190565b60ff91909116815260200190565b60008219821115613e5c57613e5c613f41565b500190565b600082613e7057613e70613f57565b500490565b6000816000190483118215151615613e8f57613e8f613f41565b500290565b600082821015613ea657613ea6613f41565b500390565b60005b83811015613ec6578181015183820152602001613eae565b83811115611a835750506000910152565b600281046001821680613eeb57607f821691505b60208210811415613f0c57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613f2657613f26613f41565b5060010190565b600082613f3c57613f3c613f57565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461075657600080fd5b6001600160e01b03198116811461075657600080fdfe94e823969ed6ed7ab64ec5ba9dbcdf3117af9e0563e0f43a62e9e6a74a3f43a1a2646970667358221220e67864a3eb7e12b01e8b04935666c8a95c0096afff886b2afb99b2f0cabd447e64736f6c63430008000033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000002e2090300faf6de6495e3070df102bbc1e4ce7fa000000000000000000000000000000000000000000000000000000000000001355524545514120436f6c6c65637469626c6573000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006555251412d430000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061035c5760003560e01c80638456cb59116101d3578063b8d95d7e11610104578063ce6f7549116100a2578063e985e9c51161007c578063e985e9c5146106e6578063f1376a98146106f9578063f19605d61461070c578063fb3da8e5146107145761035c565b8063ce6f7549146106c3578063dee80c0f146106d6578063e8a3d485146106de5761035c565b8063c0d795de116100de578063c0d795de1461068d578063c3743cff146106a0578063c87b56dd146106a8578063ccc19752146106bb5761035c565b8063b8d95d7e1461065f578063baa98fbd14610672578063bc64745f1461067a5761035c565b806395d89b4111610171578063a4b7f5ce1161014b578063a4b7f5ce1461060e578063abefed8314610631578063b85e5b7414610644578063b88d4fde1461064c5761035c565b806395d89b41146105eb578063a0e67e2b146105f3578063a22cb465146105fb5761035c565b80638da5cb5b116101ad5780638da5cb5b146105a75780638dfc731f146105af57806390e4ed59146105c25780639425c908146105ca5761035c565b80638456cb591461057757806384be5ea91461057f57806385a1a60b146105925761035c565b80632e33e1e3116102ad578063654079ba1161024b57806370a082311161022557806370a082311461052b57806371aad10d1461053e57806378f880d2146105515780637ad8ed1e146105645761035c565b8063654079ba146104f25780636cc8bcff146105055780636f80210a146105185761035c565b80634f558e79116102875780634f558e79146104bc5780635c975abb146104cf5780635e7d907f146104d75780636352211e146104df5761035c565b80632e33e1e31461048e5780633a008949146104a157806342842e0e146104a95761035c565b8063095ea7b31161031a57806320336566116102f4578063203365661461044057806323b872dd1461045357806326eb27351461046657806327a099d8146104795761035c565b8063095ea7b31461040757806312c290cb1461041a57806312c445151461042d5761035c565b80623f07fa1461036157806301ffc9a714610376578063037af12c1461039f578063053a04f1146103bf57806306fdde03146103d2578063081812fc146103e7575b600080fd5b61037461036f366004613047565b610727565b005b6103896103843660046133dc565b610759565b60405161039691906135fc565b60405180910390f35b6103b26103ad366004613047565b6107a1565b6040516103969190613630565b6103896103cd366004613447565b6107bc565b6103da6107d1565b6040516103969190613647565b6103fa6103f5366004613447565b610864565b6040516103969190613501565b610374610415366004613176565b6108a7565b610374610428366004613047565b61093f565b61037461043b366004613047565b6109de565b61037461044e366004613063565b610a21565b61037461046136600461309b565b610ac9565b610374610474366004613047565b610b01565b610481610b9b565b60405161039691906135af565b61037461049c366004613047565b610c67565b6103b2610cdb565b6103746104b736600461309b565b610ce1565b6103896104ca366004613447565b610cfc565b610389610d07565b6103b2610d10565b6103fa6104ed366004613447565b610d16565b610389610500366004613176565b610d4b565b610374610513366004613447565b610d6b565b61037461052636600461345f565b610dc9565b6103b2610539366004613047565b610e84565b6103da61054c366004613414565b610ec8565b61037461055f366004613485565b61115f565b610374610572366004613047565b6111ee565b610374611231565b61037461058d366004613063565b611270565b61059a611314565b6040516103969190613e3b565b6103fa611325565b6103746105bd366004613373565b611348565b6103b26114bd565b6105dd6105d8366004613447565b6114c3565b60405161039692919061356c565b6103da6114ec565b6104816114fb565b610374610609366004613145565b6115c0565b61062161061c366004613447565b61168e565b6040516103969493929190613607565b61037461063f3660046131f2565b6116c6565b6103b2611a3e565b61037461065a3660046130db565b611a4a565b61037461066d366004613047565b611a89565b610374611af3565b6103b2610688366004613447565b611b37565b61038961069b366004613447565b611b49565b6103b2611bd3565b6103da6106b6366004613447565b611bd9565b6103b2611c5c565b6103746106d13660046132dd565b611c62565b6103b2611ee8565b6103da611eee565b6103896106f4366004613063565b611efd565b610389610707366004613447565b611f2d565b6103b2611fc6565b6103746107223660046131a1565b611fcc565b6001600160a01b0381166107565760405162461bcd60e51b815260040161074d90613da4565b60405180910390fd5b50565b60006001600160e01b031982166380ac58cd60e01b148061078a57506001600160e01b03198216635b5e139f60e01b145b806107995750610799826120f8565b90505b919050565b6001600160a01b03166000908152600a602052604090205490565b6000908152600b602052604090205460ff1690565b6060600c80546107e090613ed7565b80601f016020809104026020016040519081016040528092919081815260200182805461080c90613ed7565b80156108595780601f1061082e57610100808354040283529160200191610859565b820191906000526020600020905b81548152906001019060200180831161083c57829003601f168201915b505050505090505b90565b600061086f82612111565b61088b5760405162461bcd60e51b815260040161074d90613bb3565b506000908152601060205260409020546001600160a01b031690565b60006108b282610d16565b9050806001600160a01b0316836001600160a01b031614156108e65760405162461bcd60e51b815260040161074d90613c97565b806001600160a01b03166108f861212e565b6001600160a01b031614806109145750610914816106f461212e565b6109305760405162461bcd60e51b815260040161074d90613973565b61093a8383612132565b505050565b61094833610727565b6109536000336120c3565b15156001146109745760405162461bcd60e51b815260040161074d90613d29565b61097d81610727565b6109886003826120c3565b156109a55760405162461bcd60e51b815260040161074d90613ad1565b6107566004600083815b6040519080825280602002602001820160405280156109d8578160200160208202803683370190505b506121a0565b6109e733610727565b6109f26000336120c3565b1515600114610a135760405162461bcd60e51b815260040161074d90613d29565b6107566007600083816109af565b610a2a33610727565b610a356000336120c3565b1515600114610a565760405162461bcd60e51b815260040161074d90613d29565b610a5f82610727565b610a6881610727565b610a736003836120c3565b610a8f5760405162461bcd60e51b815260040161074d906137ae565b610a9a6003826120c3565b15610ab75760405162461bcd60e51b815260040161074d90613ad1565b610ac56006838360006109af565b5050565b610ada610ad461212e565b82612267565b610af65760405162461bcd60e51b815260040161074d90613cd8565b61093a8383836122ec565b610b0a33610727565b610b156000336120c3565b1515600114610b365760405162461bcd60e51b815260040161074d90613d29565b610b3f81610727565b6001610b49611a3e565b11610b665760405162461bcd60e51b815260040161074d90613740565b610b716000826120c3565b610b8d5760405162461bcd60e51b815260040161074d90613b83565b6107566002826000806109af565b60606000610ba960036120ed565b905060008167ffffffffffffffff811115610bd457634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610bfd578160200160208202803683370190505b50905060005b82811015610c6057610c16600382612419565b828281518110610c3657634e487b7160e01b600052603260045260246000fd5b6001600160a01b039092166020928302919091019091015280610c5881613f12565b915050610c03565b5091505090565b610c7033610727565b610c7b6000336120c3565b1515600114610c9c5760405162461bcd60e51b815260040161074d90613d29565b610ca581610727565b610cb06000826120c3565b15610ccd5760405162461bcd60e51b815260040161074d906138f4565b6107566001600083816109af565b60095490565b61093a83838360405180602001604052806000815250611a4a565b600061079982612111565b60025460ff1690565b60065490565b6000818152600e60205260408120546001600160a01b0316806107995760405162461bcd60e51b815260040161074d90613a1a565b600860209081526000928352604080842090915290825290205460ff1681565b6000818152600b60205260409020600201546001600160a01b0316151580610dac57506000818152600b60205260409020600301546001600160a01b031615155b156107565760405162461bcd60e51b815260040161074d90613e04565b610dd233610727565b610ddd6003336120c3565b1515600114610dfe5760405162461bcd60e51b815260040161074d90613860565b600083815260136020908152604080832054601490925291829020549151600080516020613faf83398151915292610e43926001600160a01b03169186908690613585565b60405180910390a1600092835260136020908152604080852080546001600160a01b0319166001600160a01b03959095169490941790935560149052912055565b60006001600160a01b038216610eac5760405162461bcd60e51b815260040161074d906139d0565b506001600160a01b03166000908152600f602052604090205490565b60408051808201909152601081526f181899199a1a9b1b9c1cb0b131b232b360811b6020820152815160609190600090610f03906002613e75565b610f0e906002613e49565b67ffffffffffffffff811115610f3457634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015610f5e576020820181803683370190505b509050600360fc1b81600081518110610f8757634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110610fc457634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060005b84518110156111575782600486838151811061100a57634e487b7160e01b600052603260045260246000fd5b016020015182516001600160f81b031990911690911c60f81c90811061104057634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b0319168261105b836002613e75565b611066906002613e49565b8151811061108457634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350828582815181106110bc57634e487b7160e01b600052603260045260246000fd5b602091010151815160f89190911c600f169081106110ea57634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b03191682611105836002613e75565b611110906003613e49565b8151811061112e57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053508061114f81613f12565b915050610fde565b509392505050565b61116833610727565b6111736003336120c3565b15156001146111945760405162461bcd60e51b815260040161074d90613860565b600082815260156020526040908190205490517f2dbfd0069a9236a97389d9573cc238a1ba0cb78a195d33231fc1cbc87e4ccd17916111d4918490613639565b60405180910390a160009182526015602052604090912055565b6111f733610727565b6112026000336120c3565b15156001146112235760405162461bcd60e51b815260040161074d90613d29565b6107566008600083816109af565b61123a33610727565b6112456000336120c3565b15156001146112665760405162461bcd60e51b815260040161074d90613d29565b61126e612425565b565b61127933610727565b6112846000336120c3565b15156001146112a55760405162461bcd60e51b815260040161074d90613d29565b6112ae82610727565b6112b781610727565b6112c26000836120c3565b6112de5760405162461bcd60e51b815260040161074d90613a63565b6112e96000826120c3565b156113065760405162461bcd60e51b815260040161074d906138f4565b610ac56003838360006109af565b600061132060036120ed565b905090565b600061133160006120ed565b61133d57506000610861565b611320600080612419565b61135133610727565b61135c6003336120c3565b151560011461137d5760405162461bcd60e51b815260040161074d90613860565b80831461139c5760405162461bcd60e51b815260040161074d90613b3d565b60005b838110156114b6577f2dbfd0069a9236a97389d9573cc238a1ba0cb78a195d33231fc1cbc87e4ccd17601560008787858181106113ec57634e487b7160e01b600052603260045260246000fd5b9050602002013581526020019081526020016000205484848481811061142257634e487b7160e01b600052603260045260246000fd5b90506020020135604051611437929190613639565b60405180910390a182828281811061145f57634e487b7160e01b600052603260045260246000fd5b905060200201356015600087878581811061148a57634e487b7160e01b600052603260045260246000fd5b9050602002013581526020019081526020016000208190555080806114ae90613f12565b91505061139f565b5050505050565b60055481565b6000908152601360209081526040808320546014909252909120546001600160a01b0390911691565b6060600d80546107e090613ed7565b6060600061150960006120ed565b905060008167ffffffffffffffff81111561153457634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561155d578160200160208202803683370190505b50905060005b82811015610c6057611576600082612419565b82828151811061159657634e487b7160e01b600052603260045260246000fd5b6001600160a01b0390921660209283029190910190910152806115b881613f12565b915050611563565b6115c861212e565b6001600160a01b0316826001600160a01b031614156115f95760405162461bcd60e51b815260040161074d90613829565b806011600061160661212e565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff19169215159290921790915561164a61212e565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161168291906135fc565b60405180910390a35050565b600b60205260009081526040902080546001820154600283015460039093015460ff9092169290916001600160a01b03918216911684565b6116cf33610727565b6116da6003336120c3565b15156001146116fb5760405162461bcd60e51b815260040161074d90613860565b888714801561170957508487145b801561171457508087145b801561171f57508483145b61173b5760405162461bcd60e51b815260040161074d9061392b565b60005b89811015611a31576117ba8b8b8381811061176957634e487b7160e01b600052603260045260246000fd5b905060200201602081019061177e9190613047565b8a8a8481811061179e57634e487b7160e01b600052603260045260246000fd5b905060200201356040518060200160405280600081525061248f565b600080516020613faf833981519152601360008b8b858181106117ed57634e487b7160e01b600052603260045260246000fd5b90506020020135815260200190815260200160002060009054906101000a90046001600160a01b0316601460008c8c8681811061183a57634e487b7160e01b600052603260045260246000fd5b9050602002013581526020019081526020016000205489898581811061187057634e487b7160e01b600052603260045260246000fd5b90506020020160208101906118859190613047565b8888868181106118a557634e487b7160e01b600052603260045260246000fd5b905060200201356040516118bc9493929190613585565b60405180910390a18686828181106118e457634e487b7160e01b600052603260045260246000fd5b90506020020160208101906118f99190613047565b601360008b8b8581811061191d57634e487b7160e01b600052603260045260246000fd5b90506020020135815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555084848281811061197657634e487b7160e01b600052603260045260246000fd5b90506020020135601460008b8b858181106119a157634e487b7160e01b600052603260045260246000fd5b905060200201358152602001908152602001600020819055508282828181106119da57634e487b7160e01b600052603260045260246000fd5b90506020020135601560008b8b85818110611a0557634e487b7160e01b600052603260045260246000fd5b905060200201358152602001908152602001600020819055508080611a2990613f12565b91505061173e565b5050505050505050505050565b600061132060006120ed565b611a5b611a5561212e565b83612267565b611a775760405162461bcd60e51b815260040161074d90613cd8565b611a83848484846124c2565b50505050565b611a9233610727565b611a9d6000336120c3565b1515600114611abe5760405162461bcd60e51b815260040161074d90613d29565b611ac96003826120c3565b611ae55760405162461bcd60e51b815260040161074d90613dcd565b6107566005826000806109af565b611afc33610727565b611b076000336120c3565b1515600114611b285760405162461bcd60e51b815260040161074d90613d29565b61126e600a60018060006109af565b60009081526015602052604090205490565b60008080611b56816120ed565b905060005b81811015611bc65760086000611b72600084612419565b6001600160a01b031681526020808201929092526040908101600090812088825290925290205460ff16151560011415611bb45782611bb081613f12565b9350505b80611bbe81613f12565b915050611b5b565b5050600654111592915050565b60075490565b6060611be482612111565b611c005760405162461bcd60e51b815260040161074d90613c48565b6000611c0a611eee565b90506000815111611c2a5760405180602001604052806000815250611c55565b80611c34846124f5565b604051602001611c459291906134d2565b6040516020818303038152906040525b9392505050565b60095481565b611c6b33610727565b611c766003336120c3565b1515600114611c975760405162461bcd60e51b815260040161074d90613860565b8285148015611ca557508281145b611cc15760405162461bcd60e51b815260040161074d90613b3d565b60005b85811015611edf57600080516020613faf83398151915260136000898985818110611cff57634e487b7160e01b600052603260045260246000fd5b90506020020135815260200190815260200160002060009054906101000a90046001600160a01b0316601460008a8a86818110611d4c57634e487b7160e01b600052603260045260246000fd5b90506020020135815260200190815260200160002054878785818110611d8257634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611d979190613047565b868686818110611db757634e487b7160e01b600052603260045260246000fd5b90506020020135604051611dce9493929190613585565b60405180910390a1848482818110611df657634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611e0b9190613047565b60136000898985818110611e2f57634e487b7160e01b600052603260045260246000fd5b90506020020135815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550828282818110611e8857634e487b7160e01b600052603260045260246000fd5b9050602002013560146000898985818110611eb357634e487b7160e01b600052603260045260246000fd5b905060200201358152602001908152602001600020819055508080611ed790613f12565b915050611cc4565b50505050505050565b60065481565b6060601280546107e090613ed7565b6001600160a01b0380831660009081526011602090815260408083209385168352929052205460ff165b92915050565b6000611f3833610727565b611f436000336120c3565b1515600114611f645760405162461bcd60e51b815260040161074d90613d29565b3360009081526008602090815260408083208584529091529020805460ff19166001179055611f92826107bc565b15611f9f5750600161079c565b611fa882611b49565b15611fbe57611fb682612610565b50600161079c565b506000919050565b60075481565b611fd533610727565b611fe06003336120c3565b15156001146120015760405162461bcd60e51b815260040161074d90613860565b61201b85856040518060200160405280600081525061248f565b600084815260136020908152604080832054601490925291829020549151600080516020613faf83398151915292612060926001600160a01b03169187908790613585565b60405180910390a1600093845260136020908152604080862080546001600160a01b0319166001600160a01b0396909616959095179094556014815283852092909255601590915291205550565b6000611c55836001600160a01b038416612889565b6000611c55836001600160a01b0384166128d3565b6000611c55836001600160a01b0384166128eb565b600061079982612a02565b6001600160e01b031981166301ffc9a760e01b14919050565b6000908152600e60205260409020546001600160a01b0316151590565b3390565b600081815260106020526040902080546001600160a01b0319166001600160a01b038416908117909155819061216782610d16565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6009805490819060006121b283613f12565b91905055506121c081610d6b565b6000818152600b60209081526040909120600181018790556002810180546001600160a01b038089166001600160a01b03199283161790925560038301805492881692909116919091179055835161222092600490920191850190612f1d565b503360008181526008602090815260408083208584528252808320805460ff19166001908117909155938352600a9091529020829055600654116114b6576114b681612610565b600061227282612111565b61228e5760405162461bcd60e51b815260040161074d906138a8565b600061229983610d16565b9050806001600160a01b0316846001600160a01b031614806122d45750836001600160a01b03166122c984610864565b6001600160a01b0316145b806122e457506122e48185611efd565b949350505050565b826001600160a01b03166122ff82610d16565b6001600160a01b0316146123255760405162461bcd60e51b815260040161074d90613bff565b6001600160a01b03821661234b5760405162461bcd60e51b815260040161074d906137e5565b61235683838361093a565b612361600082612132565b6001600160a01b0383166000908152600f6020526040812080546001929061238a908490613e94565b90915550506001600160a01b0382166000908152600f602052604081208054600192906123b8908490613e49565b90915550506000818152600e602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000611c558383612a06565b60025460ff16156124485760405162461bcd60e51b815260040161074d90613d6d565b6002805460ff191660011790556040517f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890612485903390613501565b60405180910390a1565b6124998383612a5f565b6124a66000848484612b3e565b61093a5760405162461bcd60e51b815260040161074d906136ee565b6124cd8484846122ec565b6124d984848484612b3e565b611a835760405162461bcd60e51b815260040161074d906136ee565b60608161251a57506040805180820190915260018152600360fc1b602082015261079c565b8160005b8115612544578061252e81613f12565b915061253d9050600a83613e61565b915061251e565b60008167ffffffffffffffff81111561256d57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612597576020820181803683370190505b5090505b84156122e4576125ac600183613e94565b91506125b9600a86613f2d565b6125c4906030613e49565b60f81b8183815181106125e757634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612609600a86613e61565b945061259b565b6000818152600b602052604090206001908101541415612653576000818152600b602052604090206003015461264e906001600160a01b0316612c59565b61286d565b6000818152600b602052604090206001015460021415612691576000818152600b602052604090206002015461264e906001600160a01b0316612c9f565b6000818152600b6020526040902060010154600314156126da576000818152600b60205260409020600281015460039091015461264e916001600160a01b039081169116612d01565b6000818152600b602052604090206001015460041415612718576000818152600b602052604090206003015461264e906001600160a01b0316612d56565b6000818152600b602052604090206001015460051415612756576000818152600b602052604090206002015461264e906001600160a01b0316612d91565b6000818152600b60205260409020600101546006141561279f576000818152600b60205260409020600281015460039091015461264e916001600160a01b039081169116612dcc565b6000818152600b6020526040902060010154600814156127dd576000818152600b602052604090206003015461264e906001600160a01b0316612e1c565b6000818152600b60205260409020600101546007141561281b576000818152600b602052604090206003015461264e906001600160a01b0316612e58565b6000818152600b60205260409020600101546009141561283d5761264e612425565b6000818152600b6020526040902060010154600a141561285f5761264e612ebb565b61286881610756565b610756565b6000818152600b60205260409020805460ff1916600117905550565b600061289583836128d3565b6128cb57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155611f27565b506000611f27565b60009081526001919091016020526040902054151590565b600081815260018301602052604081205480156129f857600061290f600183613e94565b855490915060009061292390600190613e94565b9050600086600001828154811061294a57634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508087600001848154811061297b57634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600189019091526040902084905586548790806129bc57634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050611f27565b6000915050611f27565b5490565b81546000908210612a295760405162461bcd60e51b815260040161074d9061365a565b826000018281548110612a4c57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b6001600160a01b038216612a855760405162461bcd60e51b815260040161074d90613b08565b612a8e81612111565b15612aab5760405162461bcd60e51b815260040161074d90613777565b612ab76000838361093a565b6001600160a01b0382166000908152600f60205260408120805460019290612ae0908490613e49565b90915550506000818152600e602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000612b52846001600160a01b0316612f17565b15612c4e57836001600160a01b031663150b7a02612b6e61212e565b8786866040518563ffffffff1660e01b8152600401612b90949392919061352f565b602060405180830381600087803b158015612baa57600080fd5b505af1925050508015612bda575060408051601f3d908101601f19168201909252612bd7918101906133f8565b60015b612c34573d808015612c08576040519150601f19603f3d011682016040523d82523d6000602084013e612c0d565b606091505b508051612c2c5760405162461bcd60e51b815260040161074d906136ee565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506122e4565b506001949350505050565b612c646000826120ae565b507ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d81604051612c949190613501565b60405180910390a150565b612caa6000826120d8565b507f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9081604051612cda9190613501565b60405180910390a16000612cec611a3e565b9050806006541115610ac557610ac581612e58565b612d0c6000836120d8565b50612d186000826120ae565b507f1b82188083c6040dda91df3d142280a20fa00e5a433eb921fdbf2e4ad1db45e58282604051612d4a929190613515565b60405180910390a15050565b612d616003826120ae565b507fe96a56aa17dd8ae64ac3a51347e8e8a03d52f1cb2acdf8ed49b20d55662ebecc81604051612c949190613501565b612d9c6003826120d8565b507f108286147377add4f5f7bcdd7b6104dc6bdac3443e499142a612d418aa0be15481604051612c949190613501565b7f409833df5b08419a3bd86d34683f91767845e813a29d30d8a4338fba95158d8a8282604051612dfd929190613515565b60405180910390a1612e106003836120d8565b5061093a6003826120ae565b7f5ba74490711ccc5e81b24b40b8c5d2bd282981e4bc080dd8789bb10c1dfc2ea981604051612e4b9190613630565b60405180910390a1600755565b612e60611a3e565b811115612e7f5760405162461bcd60e51b815260040161074d9061369c565b7fcfbc3e24bcdbf875f7af2b101605919fdbd3cb0b217ae54c372ae49417c58d0181604051612eae9190613630565b60405180910390a1600655565b60025460ff16612edd5760405162461bcd60e51b815260040161074d90613a9a565b6002805460ff191690556040517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa90612485903390613501565b3b151590565b828054828255906000526020600020908101928215612f58579160200282015b82811115612f58578251825591602001919060010190612f3d565b50612f64929150612f68565b5090565b5b80821115612f645760008155600101612f69565b60008083601f840112612f8e578081fd5b50813567ffffffffffffffff811115612fa5578182fd5b6020830191508360208083028501011115612fbf57600080fd5b9250929050565b600082601f830112612fd6578081fd5b813567ffffffffffffffff80821115612ff157612ff1613f6d565b604051601f8301601f19168101602001828111828210171561301557613015613f6d565b60405282815284830160200186101561302c578384fd5b82602086016020830137918201602001929092529392505050565b600060208284031215613058578081fd5b8135611c5581613f83565b60008060408385031215613075578081fd5b823561308081613f83565b9150602083013561309081613f83565b809150509250929050565b6000806000606084860312156130af578081fd5b83356130ba81613f83565b925060208401356130ca81613f83565b929592945050506040919091013590565b600080600080608085870312156130f0578081fd5b84356130fb81613f83565b9350602085013561310b81613f83565b925060408501359150606085013567ffffffffffffffff81111561312d578182fd5b61313987828801612fc6565b91505092959194509250565b60008060408385031215613157578182fd5b823561316281613f83565b915060208301358015158114613090578182fd5b60008060408385031215613188578182fd5b823561319381613f83565b946020939093013593505050565b600080600080600060a086880312156131b8578081fd5b85356131c381613f83565b94506020860135935060408601356131da81613f83565b94979396509394606081013594506080013592915050565b60008060008060008060008060008060a08b8d031215613210578485fd5b8a3567ffffffffffffffff80821115613227578687fd5b6132338e838f01612f7d565b909c509a5060208d013591508082111561324b578687fd5b6132578e838f01612f7d565b909a50985060408d013591508082111561326f578687fd5b61327b8e838f01612f7d565b909850965060608d0135915080821115613293578586fd5b61329f8e838f01612f7d565b909650945060808d01359150808211156132b7578384fd5b506132c48d828e01612f7d565b915080935050809150509295989b9194979a5092959850565b600080600080600080606087890312156132f5578182fd5b863567ffffffffffffffff8082111561330c578384fd5b6133188a838b01612f7d565b90985096506020890135915080821115613330578384fd5b61333c8a838b01612f7d565b90965094506040890135915080821115613354578384fd5b5061336189828a01612f7d565b979a9699509497509295939492505050565b60008060008060408587031215613388578182fd5b843567ffffffffffffffff8082111561339f578384fd5b6133ab88838901612f7d565b909650945060208701359150808211156133c3578384fd5b506133d087828801612f7d565b95989497509550505050565b6000602082840312156133ed578081fd5b8135611c5581613f98565b600060208284031215613409578081fd5b8151611c5581613f98565b600060208284031215613425578081fd5b813567ffffffffffffffff81111561343b578182fd5b6122e484828501612fc6565b600060208284031215613458578081fd5b5035919050565b600080600060608486031215613473578081fd5b8335925060208401356130ca81613f83565b60008060408385031215613497578182fd5b50508035926020909101359150565b600081518084526134be816020860160208601613eab565b601f01601f19169290920160200192915050565b600083516134e4818460208801613eab565b8351908301906134f8818360208801613eab565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613562908301846134a6565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039485168152602081019390935292166040820152606081019190915260800190565b6020808252825182820181905260009190848201906040850190845b818110156135f05783516001600160a01b0316835292840192918401916001016135cb565b50909695505050505050565b901515815260200190565b931515845260208401929092526001600160a01b03908116604084015216606082015260800190565b90815260200190565b918252602082015260400190565b600060208252611c5560208301846134a6565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b60208082526032908201527f556e61626c6520746f20736574207468726573686f6c642061626f766520746860408201527165206e756d626572206f66206f776e65727360701b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526018908201527f4d75737420616c77617973206265206f6e65206f776e65720000000000000000604082015260600190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b6020808252601f908201527f6f6c644f70657261746f72206973206e6f7420616e204f70657261746f722e00604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b60208082526028908201527f4f6e6c7920746865206f70657261746f722063616e2072756e207468697320666040820152673ab731ba34b7b71760c11b606082015260800190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526018908201527f6e65774f776e657220616c7265616479206578697374732e0000000000000000604082015260600190565b60208082526028908201527f546f20616e6420546f6b656e4944206d7573742068617665207468652073616d6040820152670ca40d8cadccee8d60c31b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b60208082526019908201527f6f6c644f776e6572206973206e6f7420616e206f776e65722e00000000000000604082015260600190565b6020808252601c908201527f536d61727420436f6e7472616374206973206e6f742070617573656400000000604082015260600190565b6020808252601b908201527f6e65774f70657261746f7220616c7265616479206578697374732e0000000000604082015260600190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526026908201527f496e70757420617272617973206d7573742068617665207468652073616d65206040820152650d8cadccee8d60d31b606082015260800190565b60208082526016908201527537bbb732b91034b9903737ba1030b71037bbb732b91760511b604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526024908201527f4f6e6c7920616e206f776e65722063616e2072756e20746869732066756e637460408201526334b7b71760e11b606082015260800190565b60208082526018908201527f536d61727420436f6e7472616374206973207061757365640000000000000000604082015260600190565b6020808252600f908201526e496e7661696c64204164647265737360881b604082015260600190565b6020808252601c908201527f6f70657261746f72206973206e6f7420616e204f70657261746f722e00000000604082015260600190565b6020808252601d908201527f5265736f6c7574696f6e20697320616c726561647920696e207573652e000000604082015260600190565b60ff91909116815260200190565b60008219821115613e5c57613e5c613f41565b500190565b600082613e7057613e70613f57565b500490565b6000816000190483118215151615613e8f57613e8f613f41565b500290565b600082821015613ea657613ea6613f41565b500390565b60005b83811015613ec6578181015183820152602001613eae565b83811115611a835750506000910152565b600281046001821680613eeb57607f821691505b60208210811415613f0c57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613f2657613f26613f41565b5060010190565b600082613f3c57613f3c613f57565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461075657600080fd5b6001600160e01b03198116811461075657600080fdfe94e823969ed6ed7ab64ec5ba9dbcdf3117af9e0563e0f43a62e9e6a74a3f43a1a2646970667358221220e67864a3eb7e12b01e8b04935666c8a95c0096afff886b2afb99b2f0cabd447e64736f6c63430008000033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000002e2090300faf6de6495e3070df102bbc1e4ce7fa000000000000000000000000000000000000000000000000000000000000001355524545514120436f6c6c65637469626c6573000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006555251412d430000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name (string): UREEQA Collectibles
Arg [1] : symbol (string): URQA-C
Arg [2] : operator (address): 0x2e2090300FAF6DE6495E3070DF102BBC1e4cE7Fa
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 0000000000000000000000002e2090300faf6de6495e3070df102bbc1e4ce7fa
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000013
Arg [4] : 55524545514120436f6c6c65637469626c657300000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [6] : 555251412d430000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
63654:8644:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45967:121;;;;;;:::i;:::-;;:::i;:::-;;20548:292;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50583:181;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;51363:123::-;;;;;;:::i;:::-;;:::i;21480:100::-;;;:::i;:::-;;;;;;;:::i;22947:221::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;22477:404::-;;;;;;:::i;:::-;;:::i;54568:375::-;;;;;;:::i;:::-;;:::i;56622:275::-;;;;;;:::i;:::-;;:::i;55508:583::-;;;;;;:::i;:::-;;:::i;23837:305::-;;;;;;:::i;:::-;;:::i;53411:402::-;;;;;;:::i;:::-;;:::i;49261:310::-;;;:::i;:::-;;;;;;;:::i;52883:328::-;;;;;;:::i;:::-;;:::i;50363:105::-;;;:::i;24213:151::-;;;;;;:::i;:::-;;:::i;65618:102::-;;;;;;:::i;:::-;;:::i;50847:78::-;;;:::i;49911:107::-;;;:::i;21174:239::-;;;;;;:::i;:::-;;:::i;44702:62::-;;;;;;:::i;:::-;;:::i;51011:344::-;;;;;;:::i;:::-;;:::i;69095:441::-;;;;;;:::i;:::-;;:::i;20904:208::-;;;;;;:::i;:::-;;:::i;71818:477::-;;;;;;:::i;:::-;;:::i;70622:237::-;;;;;;:::i;:::-;;:::i;56209:287::-;;;;;;:::i;:::-;;:::i;56973:64::-;;;:::i;53924:537::-;;;;;;:::i;:::-;;:::i;49664:125::-;;;:::i;:::-;;;;;;;:::i;48410:176::-;;;:::i;71001:485::-;;;;;;:::i;:::-;;:::i;44365:32::-;;;:::i;65820:196::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;21649:104::-;;;:::i;48674:301::-;;;:::i;23240:295::-;;;;;;:::i;:::-;;:::i;44947:49::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;67861:1098::-;;;;;;:::i;:::-;;:::i;49062:111::-;;;:::i;24435:285::-;;;;;;:::i;:::-;;:::i;55053:332::-;;;;;;:::i;:::-;;:::i;57147:148::-;;;:::i;66116:160::-;;;;;;:::i;:::-;;:::i;51494:400::-;;;;;;:::i;:::-;;:::i;50145:103::-;;;:::i;21824:360::-;;;;;;:::i;:::-;;:::i;44816:33::-;;;:::i;69678:808::-;;;;;;:::i;:::-;;:::i;44466:42::-;;;:::i;65465:93::-;;;:::i;23606:164::-;;;;;;:::i;:::-;;:::i;52246:533::-;;;;;;:::i;:::-;;:::i;44602:35::-;;;:::i;66935:582::-;;;;;;:::i;:::-;;:::i;45967:121::-;-1:-1:-1;;;;;46039:21:0;;46031:49;;;;-1:-1:-1;;;46031:49:0;;;;;;;:::i;:::-;;;;;;;;;45967:121;:::o;20548:292::-;20650:4;-1:-1:-1;;;;;;20674:40:0;;-1:-1:-1;;;20674:40:0;;:105;;-1:-1:-1;;;;;;;20731:48:0;;-1:-1:-1;;;20731:48:0;20674:105;:158;;;;20796:36;20820:11;20796:23;:36::i;:::-;20667:165;;20548:292;;;;:::o;50583:181::-;-1:-1:-1;;;;;50720:36:0;50688:7;50720:36;;;:25;:36;;;;;;;50583:181::o;51363:123::-;51428:4;51452:19;;;:11;:19;;;;;:26;;;;51363:123::o;21480:100::-;21534:13;21567:5;21560:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21480:100;;:::o;22947:221::-;23023:7;23051:16;23059:7;23051;:16::i;:::-;23043:73;;;;-1:-1:-1;;;23043:73:0;;;;;;;:::i;:::-;-1:-1:-1;23136:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;23136:24:0;;22947:221::o;22477:404::-;22558:13;22574:23;22589:7;22574:14;:23::i;:::-;22558:39;;22622:5;-1:-1:-1;;;;;22616:11:0;:2;-1:-1:-1;;;;;22616:11:0;;;22608:57;;;;-1:-1:-1;;;22608:57:0;;;;;;;:::i;:::-;22702:5;-1:-1:-1;;;;;22686:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;22686:21:0;;:69;;;;22711:44;22735:5;22742:12;:10;:12::i;22711:44::-;22678:161;;;;-1:-1:-1;;;22678:161:0;;;;;;;:::i;:::-;22852:21;22861:2;22865:7;22852:8;:21::i;:::-;22477:404;;;:::o;54568:375::-;46372:26;46387:10;46372:14;:26::i;:::-;46431:43;46454:7;46463:10;46431:22;:43::i;:::-;:51;;46478:4;46431:51;46409:137;;;;-1:-1:-1;;;46409:137:0;;;;;;;:::i;:::-;54680:27:::1;54695:11;54680:14;:27::i;:::-;54741:47;54764:10;54776:11;54741:22;:47::i;:::-;54740:48;54718:125;;;;-1:-1:-1::0;;;54718:125:0::1;;;;;;;:::i;:::-;54856:79;42783:1;54901;54905:11:::0;54901:1;54918:16:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;54918:16:0::1;;54856;:79::i;56622:275::-:0;46372:26;46387:10;46372:14;:26::i;:::-;46431:43;46454:7;46463:10;46431:22;:43::i;:::-;:51;;46478:4;46431:51;46409:137;;;;-1:-1:-1;;;46409:137:0;;;;;;;:::i;:::-;56736:153:::1;42947:1;56812;56837:9:::0;56812:1;56862:16:::1;::::0;55508:583;46372:26;46387:10;46372:14;:26::i;:::-;46431:43;46454:7;46463:10;46431:22;:43::i;:::-;:51;;46478:4;46431:51;46409:137;;;;-1:-1:-1;;;46409:137:0;;;;;;;:::i;:::-;55647:27:::1;55662:11;55647:14;:27::i;:::-;55685;55700:11;55685:14;:27::i;:::-;55745:47;55768:10;55780:11;55745:22;:47::i;:::-;55723:128;;;;-1:-1:-1::0;;;55723:128:0::1;;;;;;;:::i;:::-;55885:47;55908:10;55920:11;55885:22;:47::i;:::-;55884:48;55862:125;;;;-1:-1:-1::0;;;55862:125:0::1;;;;;;;:::i;:::-;56000:83;42892:1;56041:11:::0;56054;56080:1:::1;56066:16;::::0;56000:83:::1;55508:583:::0;;:::o;23837:305::-;23998:41;24017:12;:10;:12::i;:::-;24031:7;23998:18;:41::i;:::-;23990:103;;;;-1:-1:-1;;;23990:103:0;;;;;;;:::i;:::-;24106:28;24116:4;24122:2;24126:7;24106:9;:28::i;53411:402::-;46372:26;46387:10;46372:14;:26::i;:::-;46431:43;46454:7;46463:10;46431:22;:43::i;:::-;:51;;46478:4;46431:51;46409:137;;;;-1:-1:-1;;;46409:137:0;;;;;;;:::i;:::-;53497:24:::1;53512:8;53497:14;:24::i;:::-;53562:1;53540:19;:17;:19::i;:::-;:23;53532:60;;;;-1:-1:-1::0;;;53532:60:0::1;;;;;;;:::i;:::-;53625:41;53648:7;53657:8;53625:22;:41::i;:::-;53603:113;;;;-1:-1:-1::0;;;53603:113:0::1;;;;;;;:::i;:::-;53729:76;42680:1;53766:8:::0;53784:1:::1;::::0;53788:16:::1;::::0;49261:310;49306:16;49335:11;49349:32;49370:10;49349:20;:32::i;:::-;49335:46;;49392:18;49427:3;49413:18;;;;;;-1:-1:-1;;;49413:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49413:18:0;;49392:39;;49449:9;49444:99;49468:3;49464:1;:7;49444:99;;;49500:31;49517:10;49529:1;49500:16;:31::i;:::-;49493:1;49495;49493:4;;;;;;-1:-1:-1;;;49493:4:0;;;;;;;;;-1:-1:-1;;;;;49493:38:0;;;:4;;;;;;;;;;;:38;49473:3;;;;:::i;:::-;;;;49444:99;;;-1:-1:-1;49562:1:0;-1:-1:-1;;49261:310:0;:::o;52883:328::-;46372:26;46387:10;46372:14;:26::i;:::-;46431:43;46454:7;46463:10;46431:22;:43::i;:::-;:51;;46478:4;46431:51;46409:137;;;;-1:-1:-1;;;46409:137:0;;;;;;;:::i;:::-;52966:24:::1;52981:8;52966:14;:24::i;:::-;53024:41;53047:7;53056:8;53024:22;:41::i;:::-;53023:42;53001:116;;;;-1:-1:-1::0;;;53001:116:0::1;;;;;;;:::i;:::-;53130:73;42629:1;53172;53176:8:::0;53172:1;53186:16:::1;::::0;50363:105;50446:14;;50363:105;:::o;24213:151::-;24317:39;24334:4;24340:2;24344:7;24317:39;;;;;;;;;;;;:16;:39::i;65618:102::-;65672:4;65696:16;65704:7;65696;:16::i;50847:78::-;50910:7;;;;50847:78;:::o;49911:107::-;49987:23;;49911:107;:::o;21174:239::-;21246:7;21282:16;;;:7;:16;;;;;;-1:-1:-1;;;;;21282:16:0;21317:19;21309:73;;;;-1:-1:-1;;;21309:73:0;;;;;;;:::i;44702:62::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51011:344::-;51222:1;51180:19;;;:11;:19;;;;;:30;;;-1:-1:-1;;;;;51180:30:0;:44;;;:109;;-1:-1:-1;51287:1:0;51245:19;;;:11;:19;;;;;:30;;;-1:-1:-1;;;;;51245:30:0;:44;;51180:109;51178:112;51081:266;;;;-1:-1:-1;;;51081:266:0;;;;;;;:::i;69095:441::-;46132:26;46147:10;46132:14;:26::i;:::-;46191:46;46214:10;46226;46191:22;:46::i;:::-;:54;;46241:4;46191:54;46169:144;;;;-1:-1:-1;;;46169:144:0;;;;;;;:::i;:::-;69284:29:::1;::::0;;;:20:::1;:29;::::0;;;;;;;;69328:15:::1;:24:::0;;;;;;;;69260:160;;-1:-1:-1;;;;;;;;;;;69260:160:0;::::1;::::0;-1:-1:-1;;;;;69284:29:0::1;::::0;69367:16;;69398:11;;69260:160:::1;:::i;:::-;;;;;;;;69431:29;::::0;;;:20:::1;:29;::::0;;;;;;;:48;;-1:-1:-1;;;;;;69431:48:0::1;-1:-1:-1::0;;;;;69431:48:0;;;::::1;::::0;;;::::1;::::0;;;69490:15:::1;:24:::0;;;;:38;69095:441::o;20904:208::-;20976:7;-1:-1:-1;;;;;21004:19:0;;20996:74;;;;-1:-1:-1;;;20996:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;21088:16:0;;;;;:9;:16;;;;;;;20904:208::o;71818:477::-;71902:42;;;;;;;;;;;;-1:-1:-1;;;71902:42:0;;;;71990:11;;71876:13;;71902:42;:21;;71990:15;;72004:1;71990:15;:::i;:::-;71986:19;;:1;:19;:::i;:::-;71976:30;;;;;;-1:-1:-1;;;71976:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;71976:30:0;;71957:49;;-1:-1:-1;;;72017:3:0;72021:1;72017:6;;;;;;-1:-1:-1;;;72017:6:0;;;;;;;;;;;;:12;-1:-1:-1;;;;;72017:12:0;;;;;;;;;-1:-1:-1;;;72040:3:0;72044:1;72040:6;;;;;;-1:-1:-1;;;72040:6:0;;;;;;;;;;;;:12;-1:-1:-1;;;;;72040:12:0;;;;;;;;;72068:9;72063:196;72087:4;:11;72083:1;:15;72063:196;;;72137:8;72171:1;72160:4;72165:1;72160:7;;;;;;-1:-1:-1;;;72160:7:0;;;;;;;;;;;;;72137:38;;-1:-1:-1;;;;;;72160:7:0;;;:12;;;:7;72154:19;;72137:38;;;;-1:-1:-1;;;72137:38:0;;;;;;;;;;;;;-1:-1:-1;;;;;;72137:38:0;72120:3;72128:5;:1;72132;72128:5;:::i;:::-;72124:9;;:1;:9;:::i;:::-;72120:14;;;;;;-1:-1:-1;;;72120:14:0;;;;;;;;;;;;:55;-1:-1:-1;;;;;72120:55:0;;;;;;;;;72207:8;72230:4;72235:1;72230:7;;;;;;-1:-1:-1;;;72230:7:0;;;;;;;;;;;;;;72207:40;;72230:7;;;;;72240:4;72224:21;;72207:40;;;;-1:-1:-1;;;72207:40:0;;;;;;;;;;;;;-1:-1:-1;;;;;;72207:40:0;72190:3;72198:5;:1;72202;72198:5;:::i;:::-;72194:9;;:1;:9;:::i;:::-;72190:14;;;;;;-1:-1:-1;;;72190:14:0;;;;;;;;;;;;:57;-1:-1:-1;;;;;72190:57:0;;;;;;;;-1:-1:-1;72100:3:0;;;;:::i;:::-;;;;72063:196;;;-1:-1:-1;72283:3:0;71818:477;-1:-1:-1;;;71818:477:0:o;70622:237::-;46132:26;46147:10;46132:14;:26::i;:::-;46191:46;46214:10;46226;46191:22;:46::i;:::-;:54;;46241:4;46191:54;46169:144;;;;-1:-1:-1;;;46169:144:0;;;;;;;:::i;:::-;70766:26:::1;::::0;;;:17:::1;:26;::::0;;;;;;;70751:52;;::::1;::::0;::::1;::::0;70794:8;;70751:52:::1;:::i;:::-;;;;;;;;70814:26;::::0;;;:17:::1;:26;::::0;;;;;:37;70622:237::o;56209:287::-;46372:26;46387:10;46372:14;:26::i;:::-;46431:43;46454:7;46463:10;46431:22;:43::i;:::-;:51;;46478:4;46431:51;46409:137;;;;-1:-1:-1;;;46409:137:0;;;;;;;:::i;:::-;56329:159:::1;43009:1;56412;56437:8:::0;56412:1;56461:16:::1;::::0;56973:64;46372:26;46387:10;46372:14;:26::i;:::-;46431:43;46454:7;46463:10;46431:22;:43::i;:::-;:51;;46478:4;46431:51;46409:137;;;;-1:-1:-1;;;46409:137:0;;;;;;;:::i;:::-;57021:8:::1;:6;:8::i;:::-;56973:64::o:0;53924:537::-;46372:26;46387:10;46372:14;:26::i;:::-;46431:43;46454:7;46463:10;46431:22;:43::i;:::-;:51;;46478:4;46431:51;46409:137;;;;-1:-1:-1;;;46409:137:0;;;;;;;:::i;:::-;54052:24:::1;54067:8;54052:14;:24::i;:::-;54087;54102:8;54087:14;:24::i;:::-;54144:41;54167:7;54176:8;54144:22;:41::i;:::-;54122:116;;;;-1:-1:-1::0;;;54122:116:0::1;;;;;;;:::i;:::-;54272:41;54295:7;54304:8;54272:22;:41::i;:::-;54271:42;54249:116;;;;-1:-1:-1::0;;;54249:116:0::1;;;;;;;:::i;:::-;54378:75;42732:1;54416:8:::0;54426;54450:1:::1;54436:16;::::0;49664:125;49717:5;49748:32;49769:10;49748:20;:32::i;:::-;49735:46;;49664:125;:::o;48410:176::-;48456:7;48479:29;48500:7;48479:20;:29::i;:::-;48476:56;;-1:-1:-1;48530:1:0;48515:17;;48476:56;48550:28;48567:7;48576:1;48550:16;:28::i;71001:485::-;46132:26;46147:10;46132:14;:26::i;:::-;46191:46;46214:10;46226;46191:22;:46::i;:::-;:54;;46241:4;46191:54;46169:144;;;;-1:-1:-1;;;46169:144:0;;;;;;;:::i;:::-;71176:33;;::::1;71154:121;;;;-1:-1:-1::0;;;71154:121:0::1;;;;;;;:::i;:::-;71291:9;71286:193;71306:18:::0;;::::1;71286:193;;;71351:58;71366:17;:29;71384:7;;71392:1;71384:10;;;;;-1:-1:-1::0;;;71384:10:0::1;;;;;;;;;;;;;;;71366:29;;;;;;;;;;;;71397:8;;71406:1;71397:11;;;;;-1:-1:-1::0;;;71397:11:0::1;;;;;;;;;;;;;;;71351:58;;;;;;;:::i;:::-;;;;;;;;71456:8;;71465:1;71456:11;;;;;-1:-1:-1::0;;;71456:11:0::1;;;;;;;;;;;;;;;71424:17;:29;71442:7;;71450:1;71442:10;;;;;-1:-1:-1::0;;;71442:10:0::1;;;;;;;;;;;;;;;71424:29;;;;;;;;;;;:43;;;;71326:3;;;;;:::i;:::-;;;;71286:193;;;;71001:485:::0;;;;:::o;44365:32::-;;;;:::o;65820:196::-;65910:7;65952:29;;;:20;:29;;;;;;;;;65983:15;:24;;;;;;;-1:-1:-1;;;;;65952:29:0;;;;65820:196::o;21649:104::-;21705:13;21738:7;21731:14;;;;;:::i;48674:301::-;48716:16;48745:11;48759:29;48780:7;48759:20;:29::i;:::-;48745:43;;48799:18;48834:3;48820:18;;;;;;-1:-1:-1;;;48820:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48820:18:0;;48799:39;;48856:9;48851:96;48875:3;48871:1;:7;48851:96;;;48907:28;48924:7;48933:1;48907:16;:28::i;:::-;48900:1;48902;48900:4;;;;;;-1:-1:-1;;;48900:4:0;;;;;;;;;-1:-1:-1;;;;;48900:35:0;;;:4;;;;;;;;;;;:35;48880:3;;;;:::i;:::-;;;;48851:96;;23240:295;23355:12;:10;:12::i;:::-;-1:-1:-1;;;;;23343:24:0;:8;-1:-1:-1;;;;;23343:24:0;;;23335:62;;;;-1:-1:-1;;;23335:62:0;;;;;;;:::i;:::-;23455:8;23410:18;:32;23429:12;:10;:12::i;:::-;-1:-1:-1;;;;;23410:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;23410:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;23410:53:0;;;;;;;;;;;23494:12;:10;:12::i;:::-;-1:-1:-1;;;;;23479:48:0;;23518:8;23479:48;;;;;;:::i;:::-;;;;;;;;23240:295;;:::o;44947:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44947:49:0;;;;;;:::o;67861:1098::-;46132:26;46147:10;46132:14;:26::i;:::-;46191:46;46214:10;46226;46191:22;:46::i;:::-;:54;;46241:4;46191:54;46169:144;;;;-1:-1:-1;;;46169:144:0;;;;;;;:::i;:::-;68149:27;;::::1;:89:::0;::::1;;;-1:-1:-1::0;68197:41:0;;::::1;68149:89;:151;;;;-1:-1:-1::0;68259:41:0;;::::1;68149:151;:217;;;;-1:-1:-1::0;68321:45:0;;::::1;68149:217;68127:307;;;;-1:-1:-1::0;;;68127:307:0::1;;;;;;;:::i;:::-;68450:9;68445:507;68465:13:::0;;::::1;68445:507;;;68500:32;68510:2;;68513:1;68510:5;;;;;-1:-1:-1::0;;;68510:5:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68517:7;;68525:1;68517:10;;;;;-1:-1:-1::0;;;68517:10:0::1;;;;;;;;;;;;;;;68500:32;;;;;;;;;;;::::0;:9:::1;:32::i;:::-;-1:-1:-1::0;;;;;;;;;;;68582:20:0::1;:32;68603:7;;68611:1;68603:10;;;;;-1:-1:-1::0;;;68603:10:0::1;;;;;;;;;;;;;;;68582:32;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;68582:32:0::1;68633:15;:27;68649:7;;68657:1;68649:10;;;;;-1:-1:-1::0;;;68649:10:0::1;;;;;;;;;;;;;;;68633:27;;;;;;;;;;;;68679:16;;68696:1;68679:19;;;;;-1:-1:-1::0;;;68679:19:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68717:11;;68729:1;68717:14;;;;;-1:-1:-1::0;;;68717:14:0::1;;;;;;;;;;;;;;;68554:192;;;;;;;;;:::i;:::-;;;;;;;;68796:16;;68813:1;68796:19;;;;;-1:-1:-1::0;;;68796:19:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68761:20;:32;68782:7;;68790:1;68782:10;;;;;-1:-1:-1::0;;;68782:10:0::1;;;;;;;;;;;;;;;68761:32;;;;;;;;;;;;:54;;;;;-1:-1:-1::0;;;;;68761:54:0::1;;;;;-1:-1:-1::0;;;;;68761:54:0::1;;;;;;68860:11;;68872:1;68860:14;;;;;-1:-1:-1::0;;;68860:14:0::1;;;;;;;;;;;;;;;68830:15;:27;68846:7;;68854:1;68846:10;;;;;-1:-1:-1::0;;;68846:10:0::1;;;;;;;;;;;;;;;68830:27;;;;;;;;;;;:44;;;;68921:16;;68938:1;68921:19;;;;;-1:-1:-1::0;;;68921:19:0::1;;;;;;;;;;;;;;;68889:17;:29;68907:7;;68915:1;68907:10;;;;;-1:-1:-1::0;;;68907:10:0::1;;;;;;;;;;;;;;;68889:29;;;;;;;;;;;:51;;;;68480:3;;;;;:::i;:::-;;;;68445:507;;;;67861:1098:::0;;;;;;;;;;:::o;49062:111::-;49112:4;49136:29;49157:7;49136:20;:29::i;24435:285::-;24567:41;24586:12;:10;:12::i;:::-;24600:7;24567:18;:41::i;:::-;24559:103;;;;-1:-1:-1;;;24559:103:0;;;;;;;:::i;:::-;24673:39;24687:4;24693:2;24697:7;24706:5;24673:13;:39::i;:::-;24435:285;;;;:::o;55053:332::-;46372:26;46387:10;46372:14;:26::i;:::-;46431:43;46454:7;46463:10;46431:22;:43::i;:::-;:51;;46478:4;46431:51;46409:137;;;;-1:-1:-1;;;46409:137:0;;;;;;;:::i;:::-;55187:44:::1;55210:10;55222:8;55187:22;:44::i;:::-;55165:122;;;;-1:-1:-1::0;;;55165:122:0::1;;;;;;;:::i;:::-;55298:79;42837:1;55338:8:::0;55356:1:::1;::::0;55360:16:::1;::::0;57147:148;46372:26;46387:10;46372:14;:26::i;:::-;46431:43;46454:7;46463:10;46431:22;:43::i;:::-;:51;;46478:4;46431:51;46409:137;;;;-1:-1:-1;;;46409:137:0;;;;;;;:::i;:::-;57213:74:::1;43101:2;57254:1;::::0;57284::::1;57270:16;::::0;66116:160;66210:7;66242:26;;;:17;:26;;;;;;;66116:160::o;51494:400::-;51558:4;;;51621:29;51558:4;51621:20;:29::i;:::-;51607:43;;51668:9;51663:168;51687:3;51683:1;:7;51663:168;;;51716:10;:40;51727:28;51744:7;51753:1;51727:16;:28::i;:::-;-1:-1:-1;;;;;51716:40:0;;;;;;;;;;;;;;;-1:-1:-1;51716:40:0;;;:48;;;;;;;;;;;:56;;:48;:56;51712:108;;;51793:11;;;;:::i;:::-;;;;51712:108;51692:3;;;;:::i;:::-;;;;51663:168;;;-1:-1:-1;;51863:23:0;;-1:-1:-1;51850:36:0;;51494:400;-1:-1:-1;;51494:400:0:o;50145:103::-;50224:16;;50145:103;:::o;21824:360::-;21897:13;21931:16;21939:7;21931;:16::i;:::-;21923:76;;;;-1:-1:-1;;;21923:76:0;;;;;;;:::i;:::-;22012:21;22036:10;:8;:10::i;:::-;22012:34;;22088:1;22070:7;22064:21;:25;:112;;;;;;;;;;;;;;;;;22129:7;22138:18;:7;:16;:18::i;:::-;22112:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22064:112;22057:119;21824:360;-1:-1:-1;;;21824:360:0:o;44816:33::-;;;;:::o;69678:808::-;46132:26;46147:10;46132:14;:26::i;:::-;46191:46;46214:10;46226;46191:22;:46::i;:::-;:54;;46241:4;46191:54;46169:144;;;;-1:-1:-1;;;46169:144:0;;;;;;;:::i;:::-;69898:41;;::::1;:107:::0;::::1;;;-1:-1:-1::0;69960:45:0;;::::1;69898:107;69876:195;;;;-1:-1:-1::0;;;69876:195:0::1;;;;;;;:::i;:::-;70087:9;70082:397;70102:18:::0;;::::1;70082:397;;;-1:-1:-1::0;;;;;;;;;;;70175:20:0::1;:32;70196:7;;70204:1;70196:10;;;;;-1:-1:-1::0;;;70196:10:0::1;;;;;;;;;;;;;;;70175:32;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;70175:32:0::1;70226:15;:27;70242:7;;70250:1;70242:10;;;;;-1:-1:-1::0;;;70242:10:0::1;;;;;;;;;;;;;;;70226:27;;;;;;;;;;;;70272:16;;70289:1;70272:19;;;;;-1:-1:-1::0;;;70272:19:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70310:11;;70322:1;70310:14;;;;;-1:-1:-1::0;;;70310:14:0::1;;;;;;;;;;;;;;;70147:192;;;;;;;;;:::i;:::-;;;;;;;;70389:16;;70406:1;70389:19;;;;;-1:-1:-1::0;;;70389:19:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70354:20;:32;70375:7;;70383:1;70375:10;;;;;-1:-1:-1::0;;;70375:10:0::1;;;;;;;;;;;;;;;70354:32;;;;;;;;;;;;:54;;;;;-1:-1:-1::0;;;;;70354:54:0::1;;;;;-1:-1:-1::0;;;;;70354:54:0::1;;;;;;70453:11;;70465:1;70453:14;;;;;-1:-1:-1::0;;;70453:14:0::1;;;;;;;;;;;;;;;70423:15;:27;70439:7;;70447:1;70439:10;;;;;-1:-1:-1::0;;;70439:10:0::1;;;;;;;;;;;;;;;70423:27;;;;;;;;;;;:44;;;;70122:3;;;;;:::i;:::-;;;;70082:397;;;;69678:808:::0;;;;;;:::o;44466:42::-;;;;:::o;65465:93::-;65509:13;65542:8;65535:15;;;;;:::i;23606:164::-;-1:-1:-1;;;;;23727:25:0;;;23703:4;23727:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;23606:164;;;;;:::o;52246:533::-;52315:4;46372:26;46387:10;46372:14;:26::i;:::-;46431:43;46454:7;46463:10;46431:22;:43::i;:::-;:51;;46478:4;46431:51;46409:137;;;;-1:-1:-1;;;46409:137:0;;;;;;;:::i;:::-;52343:10:::1;52332:22;::::0;;;:10:::1;:22;::::0;;;;;;;:30;;;;;;;;:37;;-1:-1:-1;;52332:37:0::1;52365:4;52332:37;::::0;;52451:26:::1;52355:6:::0;52451:18:::1;:26::i;:::-;52447:70;;;-1:-1:-1::0;52501:4:0::1;52494:11;;52447:70;52593:25;52611:6;52593:17;:25::i;:::-;52589:110;;;52635:26;52654:6;52635:18;:26::i;:::-;-1:-1:-1::0;52683:4:0::1;52676:11;;52589:110;-1:-1:-1::0;52766:5:0::1;52246:533:::0;;;:::o;44602:35::-;;;;:::o;66935:582::-;46132:26;46147:10;46132:14;:26::i;:::-;46191:46;46214:10;46226;46191:22;:46::i;:::-;:54;;46241:4;46191:54;46169:144;;;;-1:-1:-1;;;46169:144:0;;;;;;;:::i;:::-;67141:26:::1;67151:2;67155:7;67141:26;;;;;;;;;;;::::0;:9:::1;:26::i;:::-;67209:29;::::0;;;:20:::1;:29;::::0;;;;;;;;67253:15:::1;:24:::0;;;;;;;;67185:160;;-1:-1:-1;;;;;;;;;;;67185:160:0;::::1;::::0;-1:-1:-1;;;;;67209:29:0::1;::::0;67292:16;;67323:11;;67185:160:::1;:::i;:::-;;;;;;;;67356:29;::::0;;;:20:::1;:29;::::0;;;;;;;:48;;-1:-1:-1;;;;;;67356:48:0::1;-1:-1:-1::0;;;;;67356:48:0;;;::::1;::::0;;;::::1;::::0;;;67415:15:::1;:24:::0;;;;;:38;;;;67464:17:::1;:26:::0;;;;;:45;-1:-1:-1;66935:582:0:o;39031:152::-;39101:4;39125:50;39130:3;-1:-1:-1;;;;;39150:23:0;;39125:4;:50::i;39603:167::-;39683:4;39707:55;39717:3;-1:-1:-1;;;;;39737:23:0;;39707:9;:55::i;39359:158::-;39432:4;39456:53;39464:3;-1:-1:-1;;;;;39484:23:0;;39456:7;:53::i;39856:117::-;39919:7;39946:19;39954:3;39946:7;:19::i;19046:157::-;-1:-1:-1;;;;;;19155:40:0;;-1:-1:-1;;;19155:40:0;19046:157;;;:::o;26187:127::-;26252:4;26276:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26276:16:0;:30;;;26187:127::o;15840:98::-;15920:10;15840:98;:::o;30071:174::-;30146:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;30146:29:0;-1:-1:-1;;;;;30146:29:0;;;;;;;;:24;;30200:23;30146:24;30200:14;:23::i;:::-;-1:-1:-1;;;;;30191:46:0;;;;;;;;;;;30071:174;;:::o;57547:734::-;57734:14;;;;;;57717;57759:16;57734:14;57759:16;:::i;:::-;;;;;;57786:29;57808:6;57786:21;:29::i;:::-;57828:19;;;;:11;:19;;;;;;;;:27;;;:37;;;57876:30;;;:43;;-1:-1:-1;;;;;57876:43:0;;;-1:-1:-1;;;;;;57876:43:0;;;;;;;57930:30;;;:43;;;;;;;;;;;;;;;57984:33;;;;:25;;;;;:33;;;;:::i;:::-;-1:-1:-1;58041:10:0;58030:22;;;;:10;:22;;;;;;;;:30;;;;;;;;:37;;-1:-1:-1;;58030:37:0;58063:4;58030:37;;;;;;58078;;;:25;:37;;;;;:46;;;58191:23;;:28;58187:87;;58236:26;58255:6;58236:18;:26::i;26481:355::-;26574:4;26599:16;26607:7;26599;:16::i;:::-;26591:73;;;;-1:-1:-1;;;26591:73:0;;;;;;;:::i;:::-;26675:13;26691:23;26706:7;26691:14;:23::i;:::-;26675:39;;26744:5;-1:-1:-1;;;;;26733:16:0;:7;-1:-1:-1;;;;;26733:16:0;;:51;;;;26777:7;-1:-1:-1;;;;;26753:31:0;:20;26765:7;26753:11;:20::i;:::-;-1:-1:-1;;;;;26753:31:0;;26733:51;:94;;;;26788:39;26812:5;26819:7;26788:23;:39::i;:::-;26725:103;26481:355;-1:-1:-1;;;;26481:355:0:o;29409:544::-;29534:4;-1:-1:-1;;;;;29507:31:0;:23;29522:7;29507:14;:23::i;:::-;-1:-1:-1;;;;;29507:31:0;;29499:85;;;;-1:-1:-1;;;29499:85:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29603:16:0;;29595:65;;;;-1:-1:-1;;;29595:65:0;;;;;;;:::i;:::-;29673:39;29694:4;29700:2;29704:7;29673:20;:39::i;:::-;29777:29;29794:1;29798:7;29777:8;:29::i;:::-;-1:-1:-1;;;;;29819:15:0;;;;;;:9;:15;;;;;:20;;29838:1;;29819:15;:20;;29838:1;;29819:20;:::i;:::-;;;;-1:-1:-1;;;;;;;29850:13:0;;;;;;:9;:13;;;;;:18;;29867:1;;29850:13;:18;;29867:1;;29850:18;:::i;:::-;;;;-1:-1:-1;;29879:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29879:21:0;-1:-1:-1;;;;;29879:21:0;;;;;;;;;29918:27;;29879:16;;29918:27;;;;;;;29409:544;;;:::o;40317:158::-;40391:7;40442:22;40446:3;40458:5;40442:3;:22::i;62940:116::-;47317:7;;;;47316:8;47308:45;;;;-1:-1:-1;;;47308:45:0;;;;;;;:::i;:::-;63000:7:::1;:14:::0;;-1:-1:-1;;63000:14:0::1;63010:4;63000:14;::::0;;63030:18:::1;::::0;::::1;::::0;::::1;::::0;63037:10:::1;::::0;63030:18:::1;:::i;:::-;;;;;;;;62940:116::o:0;27515:250::-;27611:18;27617:2;27621:7;27611:5;:18::i;:::-;27648:54;27679:1;27683:2;27687:7;27696:5;27648:22;:54::i;:::-;27640:117;;;;-1:-1:-1;;;27640:117:0;;;;;;;:::i;25602:272::-;25716:28;25726:4;25732:2;25736:7;25716:9;:28::i;:::-;25763:48;25786:4;25792:2;25796:7;25805:5;25763:22;:48::i;:::-;25755:111;;;;-1:-1:-1;;;25755:111:0;;;;;;;:::i;16493:723::-;16549:13;16770:10;16766:53;;-1:-1:-1;16797:10:0;;;;;;;;;;;;-1:-1:-1;;;16797:10:0;;;;;;16766:53;16844:5;16829:12;16885:78;16892:9;;16885:78;;16918:8;;;;:::i;:::-;;-1:-1:-1;16941:10:0;;-1:-1:-1;16949:2:0;16941:10;;:::i;:::-;;;16885:78;;;16973:19;17005:6;16995:17;;;;;;-1:-1:-1;;;16995:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16995:17:0;;16973:39;;17023:154;17030:10;;17023:154;;17057:11;17067:1;17057:11;;:::i;:::-;;-1:-1:-1;17126:10:0;17134:2;17126:5;:10;:::i;:::-;17113:24;;:2;:24;:::i;:::-;17100:39;;17083:6;17090;17083:14;;;;;;-1:-1:-1;;;17083:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;17083:56:0;;;;;;;;-1:-1:-1;17154:11:0;17163:2;17154:11;;:::i;:::-;;;17023:154;;58410:1675;58478:19;;;;:11;:19;;;;;42629:1;58478:27;;;;:46;58474:1558;;;58551:19;;;;:11;:19;;;;;:30;;;58541:41;;-1:-1:-1;;;;;58551:30:0;58541:9;:41::i;:::-;58474:1558;;;58604:19;;;;:11;:19;;;;;:27;;;42680:1;58604:49;58600:1432;;;58683:19;;;;:11;:19;;;;;:30;;;58670:44;;-1:-1:-1;;;;;58683:30:0;58670:12;:44::i;58600:1432::-;58736:19;;;;:11;:19;;;;;:27;;;42732:1;58736:50;58732:1300;;;58835:19;;;;:11;:19;;;;;:30;;;;58884;;;;;58803:126;;-1:-1:-1;;;;;58835:30:0;;;;58884;58803:13;:126::i;58732:1300::-;58951:19;;;;:11;:19;;;;;:27;;;42783:1;58951:49;58947:1085;;;59030:19;;;;:11;:19;;;;;:30;;;59017:44;;-1:-1:-1;;;;;59030:30:0;59017:12;:44::i;58947:1085::-;59083:19;;;;:11;:19;;;;;:27;;;42837:1;59083:52;59079:953;;;59168:19;;;;:11;:19;;;;;:30;;;59152:47;;-1:-1:-1;;;;;59168:30:0;59152:15;:47::i;59079:953::-;59221:19;;;;:11;:19;;;;;:27;;;42892:1;59221:53;59217:815;;;59326:19;;;;:11;:19;;;;;:30;;;;59375;;;;;59291:129;;-1:-1:-1;;;;;59326:30:0;;;;59375;59291:16;:129::i;59217:815::-;59456:19;;;;:11;:19;;;;;:27;;;43009:1;59456:60;59438:594;;;59575:19;;;;:11;:19;;;;;:30;;;59543:64;;-1:-1:-1;;;;;59575:30:0;59543:23;:64::i;59438:594::-;59629:19;;;;:11;:19;;;;;:27;;;42947:1;59629:53;59625:407;;;59724:19;;;;:11;:19;;;;;:30;;;59699:57;;-1:-1:-1;;;;;59724:30:0;59699:16;:57::i;59625:407::-;59778:19;;;;:11;:19;;;;;:27;;;43054:1;59778:43;59774:258;;;59838:8;:6;:8::i;59774:258::-;59868:19;;;;:11;:19;;;;;:27;;;43101:2;59868:45;59864:168;;;59930:10;:8;:10::i;59864:168::-;59973:26;59992:6;59973:18;:26::i;:::-;60014:7;;59864:168;60044:19;;;;:11;:19;;;;;:33;;-1:-1:-1;;60044:33:0;60073:4;60044:33;;;58410:1675;:::o;34086:414::-;34149:4;34171:21;34181:3;34186:5;34171:9;:21::i;:::-;34166:327;;-1:-1:-1;34209:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;34392:18;;34370:19;;;:12;;;:19;;;;;;:40;;;;34425:11;;34166:327;-1:-1:-1;34476:5:0;34469:12;;36315:129;36388:4;36412:19;;;:12;;;;;:19;;;;;;:24;;;36315:129::o;34676:1553::-;34742:4;34881:19;;;:12;;;:19;;;;;;34917:15;;34913:1309;;35279:21;35303:14;35316:1;35303:10;:14;:::i;:::-;35352:18;;35279:38;;-1:-1:-1;35332:17:0;;35352:22;;35373:1;;35352:22;:::i;:::-;35332:42;;35619:17;35639:3;:11;;35651:9;35639:22;;;;;;-1:-1:-1;;;35639:22:0;;;;;;;;;;;;;;;;;35619:42;;35785:9;35756:3;:11;;35768:13;35756:26;;;;;;-1:-1:-1;;;35756:26:0;;;;;;;;;;;;;;;;;;;;:38;;;;35862:23;;;:12;;;:23;;;;;;:36;;;36023:17;;35862:3;;36023:17;;;-1:-1:-1;;;36023:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;36118:3;:12;;:19;36131:5;36118:19;;;;;;;;;;;36111:26;;;36161:4;36154:11;;;;;;;;34913:1309;36205:5;36198:12;;;;;36530:109;36613:18;;36530:109::o;36983:204::-;37078:18;;37050:7;;37078:26;-1:-1:-1;37070:73:0;;;;-1:-1:-1;;;37070:73:0;;;;;;;:::i;:::-;37161:3;:11;;37173:5;37161:18;;;;;;-1:-1:-1;;;37161:18:0;;;;;;;;;;;;;;;;;37154:25;;36983:204;;;;:::o;28101:382::-;-1:-1:-1;;;;;28181:16:0;;28173:61;;;;-1:-1:-1;;;28173:61:0;;;;;;;:::i;:::-;28254:16;28262:7;28254;:16::i;:::-;28253:17;28245:58;;;;-1:-1:-1;;;28245:58:0;;;;;;;:::i;:::-;28316:45;28345:1;28349:2;28353:7;28316:20;:45::i;:::-;-1:-1:-1;;;;;28374:13:0;;;;;;:9;:13;;;;;:18;;28391:1;;28374:13;:18;;28391:1;;28374:18;:::i;:::-;;;;-1:-1:-1;;28403:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;28403:21:0;-1:-1:-1;;;;;28403:21:0;;;;;;;;28442:33;;28403:16;;;28442:33;;28403:16;;28442:33;28101:382;;:::o;30810:843::-;30931:4;30957:15;:2;-1:-1:-1;;;;;30957:13:0;;:15::i;:::-;30953:693;;;31009:2;-1:-1:-1;;;;;30993:36:0;;31030:12;:10;:12::i;:::-;31044:4;31050:7;31059:5;30993:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30993:72:0;;;;;;;;-1:-1:-1;;30993:72:0;;;;;;;;;;;;:::i;:::-;;;30989:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31239:13:0;;31235:341;;31282:60;;-1:-1:-1;;;31282:60:0;;;;;;;:::i;31235:341::-;31526:6;31520:13;31511:6;31507:2;31503:15;31496:38;30989:602;-1:-1:-1;;;;;;31116:55:0;-1:-1:-1;;;31116:55:0;;-1:-1:-1;31109:62:0;;30953:693;-1:-1:-1;31630:4:0;30810:843;;;;;;:::o;60444:140::-;60501:36;60519:7;60528:8;60501:17;:36::i;:::-;;60553:23;60567:8;60553:23;;;;;;:::i;:::-;;;;;;;;60444:140;:::o;60606:299::-;60666:39;60687:7;60696:8;60666:20;:39::i;:::-;;60721:22;60734:8;60721:22;;;;;;:::i;:::-;;;;;;;;60756:14;60773:19;:17;:19::i;:::-;60756:36;;60833:9;60807:23;;:35;60803:95;;;60859:27;60876:9;60859:16;:27::i;60927:225::-;61006:39;61027:7;61036:8;61006:20;:39::i;:::-;;61056:36;61074:7;61083:8;61056:17;:36::i;:::-;;61108;61125:8;61135;61108:36;;;;;;;:::i;:::-;;;;;;;;60927:225;;:::o;61174:149::-;61234:39;61252:10;61264:8;61234:17;:39::i;:::-;;61289:26;61306:8;61289:26;;;;;;:::i;61345:154::-;61408:42;61429:10;61441:8;61408:20;:42::i;:::-;;61466:25;61482:8;61466:25;;;;;;:::i;61521:269::-;61628:45;61648:11;61661;61628:45;;;;;;;:::i;:::-;;;;;;;;61684;61705:10;61717:11;61684:20;:45::i;:::-;;61740:42;61758:10;61770:11;61740:17;:42::i;61875:154::-;61951:32;61974:8;61951:32;;;;;;:::i;:::-;;;;;;;;61994:16;:27;61875:154::o;62113:290::-;62210:19;:17;:19::i;:::-;62197:9;:32;;62175:132;;;;-1:-1:-1;;;62175:132:0;;;;;;;:::i;:::-;62323:26;62339:9;62323:26;;;;;;:::i;:::-;;;;;;;;62360:23;:35;62113:290::o;63179:118::-;47575:7;;;;47567:48;;;;-1:-1:-1;;;47567:48:0;;;;;;;:::i;:::-;63238:7:::1;:15:::0;;-1:-1:-1;;63238:15:0::1;::::0;;63269:20:::1;::::0;::::1;::::0;::::1;::::0;63278:10:::1;::::0;63269:20:::1;:::i;7959:422::-:0;8326:20;8365:8;;;7959:422::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:400:1;;;147:3;140:4;132:6;128:17;124:27;114:2;;170:6;162;155:22;114:2;-1:-1:-1;198:20:1;;241:18;230:30;;227:2;;;280:8;270;263:26;227:2;324:4;316:6;312:17;300:29;;387:3;380:4;372;364:6;360:17;352:6;348:30;344:41;341:50;338:2;;;404:1;401;394:12;338:2;104:310;;;;;:::o;419:712::-;;516:3;509:4;501:6;497:17;493:27;483:2;;538:5;531;524:20;483:2;578:6;565:20;604:18;641:2;637;634:10;631:2;;;647:18;;:::i;:::-;696:2;690:9;765:2;746:13;;-1:-1:-1;;742:27:1;730:40;;772:4;726:51;792:18;;;812:22;;;789:46;786:2;;;838:18;;:::i;:::-;874:2;867:22;898:18;;;935:15;;;952:4;931:26;928:35;-1:-1:-1;925:2:1;;;980:5;973;966:20;925:2;1048;1041:4;1033:6;1029:17;1022:4;1014:6;1010:17;997:54;1071:15;;;1088:4;1067:26;1060:41;;;;1075:6;473:658;-1:-1:-1;;;473:658:1:o;1136:259::-;;1248:2;1236:9;1227:7;1223:23;1219:32;1216:2;;;1269:6;1261;1254:22;1216:2;1313:9;1300:23;1332:33;1359:5;1332:33;:::i;1400:402::-;;;1529:2;1517:9;1508:7;1504:23;1500:32;1497:2;;;1550:6;1542;1535:22;1497:2;1594:9;1581:23;1613:33;1640:5;1613:33;:::i;:::-;1665:5;-1:-1:-1;1722:2:1;1707:18;;1694:32;1735:35;1694:32;1735:35;:::i;:::-;1789:7;1779:17;;;1487:315;;;;;:::o;1807:470::-;;;;1953:2;1941:9;1932:7;1928:23;1924:32;1921:2;;;1974:6;1966;1959:22;1921:2;2018:9;2005:23;2037:33;2064:5;2037:33;:::i;:::-;2089:5;-1:-1:-1;2146:2:1;2131:18;;2118:32;2159:35;2118:32;2159:35;:::i;:::-;1911:366;;2213:7;;-1:-1:-1;;;2267:2:1;2252:18;;;;2239:32;;1911:366::o;2282:691::-;;;;;2454:3;2442:9;2433:7;2429:23;2425:33;2422:2;;;2476:6;2468;2461:22;2422:2;2520:9;2507:23;2539:33;2566:5;2539:33;:::i;:::-;2591:5;-1:-1:-1;2648:2:1;2633:18;;2620:32;2661:35;2620:32;2661:35;:::i;:::-;2715:7;-1:-1:-1;2769:2:1;2754:18;;2741:32;;-1:-1:-1;2824:2:1;2809:18;;2796:32;2851:18;2840:30;;2837:2;;;2888:6;2880;2873:22;2837:2;2916:51;2959:7;2950:6;2939:9;2935:22;2916:51;:::i;:::-;2906:61;;;2412:561;;;;;;;:::o;2978:438::-;;;3104:2;3092:9;3083:7;3079:23;3075:32;3072:2;;;3125:6;3117;3110:22;3072:2;3169:9;3156:23;3188:33;3215:5;3188:33;:::i;:::-;3240:5;-1:-1:-1;3297:2:1;3282:18;;3269:32;3339:15;;3332:23;3320:36;;3310:2;;3375:6;3367;3360:22;3421:327;;;3550:2;3538:9;3529:7;3525:23;3521:32;3518:2;;;3571:6;3563;3556:22;3518:2;3615:9;3602:23;3634:33;3661:5;3634:33;:::i;:::-;3686:5;3738:2;3723:18;;;;3710:32;;-1:-1:-1;;;3508:240:1:o;3753:608::-;;;;;;3933:3;3921:9;3912:7;3908:23;3904:33;3901:2;;;3955:6;3947;3940:22;3901:2;3999:9;3986:23;4018:33;4045:5;4018:33;:::i;:::-;4070:5;-1:-1:-1;4122:2:1;4107:18;;4094:32;;-1:-1:-1;4178:2:1;4163:18;;4150:32;4191:35;4150:32;4191:35;:::i;:::-;3891:470;;;;-1:-1:-1;4245:7:1;;4299:2;4284:18;;4271:32;;-1:-1:-1;4350:3:1;4335:19;4322:33;;3891:470;-1:-1:-1;;3891:470:1:o;4366:1810::-;;;;;;;;;;;4721:3;4709:9;4700:7;4696:23;4692:33;4689:2;;;4743:6;4735;4728:22;4689:2;4788:9;4775:23;4817:18;4858:2;4850:6;4847:14;4844:2;;;4879:6;4871;4864:22;4844:2;4923:76;4991:7;4982:6;4971:9;4967:22;4923:76;:::i;:::-;5018:8;;-1:-1:-1;4897:102:1;-1:-1:-1;5106:2:1;5091:18;;5078:32;;-1:-1:-1;5122:16:1;;;5119:2;;;5156:6;5148;5141:22;5119:2;5200:78;5270:7;5259:8;5248:9;5244:24;5200:78;:::i;:::-;5297:8;;-1:-1:-1;5174:104:1;-1:-1:-1;5385:2:1;5370:18;;5357:32;;-1:-1:-1;5401:16:1;;;5398:2;;;5435:6;5427;5420:22;5398:2;5479:78;5549:7;5538:8;5527:9;5523:24;5479:78;:::i;:::-;5576:8;;-1:-1:-1;5453:104:1;-1:-1:-1;5664:2:1;5649:18;;5636:32;;-1:-1:-1;5680:16:1;;;5677:2;;;5714:6;5706;5699:22;5677:2;5758:78;5828:7;5817:8;5806:9;5802:24;5758:78;:::i;:::-;5855:8;;-1:-1:-1;5732:104:1;-1:-1:-1;5943:3:1;5928:19;;5915:33;;-1:-1:-1;5960:16:1;;;5957:2;;;5994:6;5986;5979:22;5957:2;;6038:78;6108:7;6097:8;6086:9;6082:24;6038:78;:::i;:::-;6012:104;;6135:8;6125:18;;;6162:8;6152:18;;;4679:1497;;;;;;;;;;;;;:::o;6181:1146::-;;;;;;;6432:2;6420:9;6411:7;6407:23;6403:32;6400:2;;;6453:6;6445;6438:22;6400:2;6498:9;6485:23;6527:18;6568:2;6560:6;6557:14;6554:2;;;6589:6;6581;6574:22;6554:2;6633:76;6701:7;6692:6;6681:9;6677:22;6633:76;:::i;:::-;6728:8;;-1:-1:-1;6607:102:1;-1:-1:-1;6816:2:1;6801:18;;6788:32;;-1:-1:-1;6832:16:1;;;6829:2;;;6866:6;6858;6851:22;6829:2;6910:78;6980:7;6969:8;6958:9;6954:24;6910:78;:::i;:::-;7007:8;;-1:-1:-1;6884:104:1;-1:-1:-1;7095:2:1;7080:18;;7067:32;;-1:-1:-1;7111:16:1;;;7108:2;;;7145:6;7137;7130:22;7108:2;;7189:78;7259:7;7248:8;7237:9;7233:24;7189:78;:::i;:::-;6390:937;;;;-1:-1:-1;6390:937:1;;-1:-1:-1;6390:937:1;;7286:8;;6390:937;-1:-1:-1;;;6390:937:1:o;7332:815::-;;;;;7531:2;7519:9;7510:7;7506:23;7502:32;7499:2;;;7552:6;7544;7537:22;7499:2;7597:9;7584:23;7626:18;7667:2;7659:6;7656:14;7653:2;;;7688:6;7680;7673:22;7653:2;7732:76;7800:7;7791:6;7780:9;7776:22;7732:76;:::i;:::-;7827:8;;-1:-1:-1;7706:102:1;-1:-1:-1;7915:2:1;7900:18;;7887:32;;-1:-1:-1;7931:16:1;;;7928:2;;;7965:6;7957;7950:22;7928:2;;8009:78;8079:7;8068:8;8057:9;8053:24;8009:78;:::i;:::-;7489:658;;;;-1:-1:-1;8106:8:1;-1:-1:-1;;;;7489:658:1:o;8152:257::-;;8263:2;8251:9;8242:7;8238:23;8234:32;8231:2;;;8284:6;8276;8269:22;8231:2;8328:9;8315:23;8347:32;8373:5;8347:32;:::i;8414:261::-;;8536:2;8524:9;8515:7;8511:23;8507:32;8504:2;;;8557:6;8549;8542:22;8504:2;8594:9;8588:16;8613:32;8639:5;8613:32;:::i;8680:342::-;;8801:2;8789:9;8780:7;8776:23;8772:32;8769:2;;;8822:6;8814;8807:22;8769:2;8867:9;8854:23;8900:18;8892:6;8889:30;8886:2;;;8937:6;8929;8922:22;8886:2;8965:51;9008:7;8999:6;8988:9;8984:22;8965:51;:::i;9291:190::-;;9403:2;9391:9;9382:7;9378:23;9374:32;9371:2;;;9424:6;9416;9409:22;9371:2;-1:-1:-1;9452:23:1;;9361:120;-1:-1:-1;9361:120:1:o;9486:395::-;;;;9632:2;9620:9;9611:7;9607:23;9603:32;9600:2;;;9653:6;9645;9638:22;9600:2;9694:9;9681:23;9671:33;;9754:2;9743:9;9739:18;9726:32;9767:33;9794:5;9767:33;:::i;9886:258::-;;;10015:2;10003:9;9994:7;9990:23;9986:32;9983:2;;;10036:6;10028;10021:22;9983:2;-1:-1:-1;;10064:23:1;;;10134:2;10119:18;;;10106:32;;-1:-1:-1;9973:171:1:o;10149:259::-;;10230:5;10224:12;10257:6;10252:3;10245:19;10273:63;10329:6;10322:4;10317:3;10313:14;10306:4;10299:5;10295:16;10273:63;:::i;:::-;10390:2;10369:15;-1:-1:-1;;10365:29:1;10356:39;;;;10397:4;10352:50;;10200:208;-1:-1:-1;;10200:208:1:o;10413:470::-;;10630:6;10624:13;10646:53;10692:6;10687:3;10680:4;10672:6;10668:17;10646:53;:::i;:::-;10762:13;;10721:16;;;;10784:57;10762:13;10721:16;10818:4;10806:17;;10784:57;:::i;:::-;10857:20;;10600:283;-1:-1:-1;;;;10600:283:1:o;10888:203::-;-1:-1:-1;;;;;11052:32:1;;;;11034:51;;11022:2;11007:18;;10989:102::o;11096:304::-;-1:-1:-1;;;;;11326:15:1;;;11308:34;;11378:15;;11373:2;11358:18;;11351:43;11258:2;11243:18;;11225:175::o;11405:490::-;-1:-1:-1;;;;;11674:15:1;;;11656:34;;11726:15;;11721:2;11706:18;;11699:43;11773:2;11758:18;;11751:34;;;11821:3;11816:2;11801:18;;11794:31;;;11405:490;;11842:47;;11869:19;;11861:6;11842:47;:::i;:::-;11834:55;11608:287;-1:-1:-1;;;;;;11608:287:1:o;11900:274::-;-1:-1:-1;;;;;12092:32:1;;;;12074:51;;12156:2;12141:18;;12134:34;12062:2;12047:18;;12029:145::o;12179:447::-;-1:-1:-1;;;;;12466:15:1;;;12448:34;;12513:2;12498:18;;12491:34;;;;12561:15;;12556:2;12541:18;;12534:43;12608:2;12593:18;;12586:34;;;;12397:3;12382:19;;12364:262::o;12631:661::-;12802:2;12854:21;;;12924:13;;12827:18;;;12946:22;;;12631:661;;12802:2;13025:15;;;;12999:2;12984:18;;;12631:661;13071:195;13085:6;13082:1;13079:13;13071:195;;;13150:13;;-1:-1:-1;;;;;13146:39:1;13134:52;;13241:15;;;;13206:12;;;;13182:1;13100:9;13071:195;;;-1:-1:-1;13283:3:1;;12782:510;-1:-1:-1;;;;;;12782:510:1:o;13297:187::-;13462:14;;13455:22;13437:41;;13425:2;13410:18;;13392:92::o;13489:457::-;13739:14;;13732:22;13714:41;;13786:2;13771:18;;13764:34;;;;-1:-1:-1;;;;;13872:15:1;;;13867:2;13852:18;;13845:43;13924:15;13919:2;13904:18;;13897:43;13701:3;13686:19;;13668:278::o;13951:177::-;14097:25;;;14085:2;14070:18;;14052:76::o;14133:248::-;14307:25;;;14363:2;14348:18;;14341:34;14295:2;14280:18;;14262:119::o;14386:221::-;;14535:2;14524:9;14517:21;14555:46;14597:2;14586:9;14582:18;14574:6;14555:46;:::i;14612:398::-;14814:2;14796:21;;;14853:2;14833:18;;;14826:30;14892:34;14887:2;14872:18;;14865:62;-1:-1:-1;;;14958:2:1;14943:18;;14936:32;15000:3;14985:19;;14786:224::o;15015:414::-;15217:2;15199:21;;;15256:2;15236:18;;;15229:30;15295:34;15290:2;15275:18;;15268:62;-1:-1:-1;;;15361:2:1;15346:18;;15339:48;15419:3;15404:19;;15189:240::o;15434:414::-;15636:2;15618:21;;;15675:2;15655:18;;;15648:30;15714:34;15709:2;15694:18;;15687:62;-1:-1:-1;;;15780:2:1;15765:18;;15758:48;15838:3;15823:19;;15608:240::o;15853:348::-;16055:2;16037:21;;;16094:2;16074:18;;;16067:30;16133:26;16128:2;16113:18;;16106:54;16192:2;16177:18;;16027:174::o;16206:352::-;16408:2;16390:21;;;16447:2;16427:18;;;16420:30;16486;16481:2;16466:18;;16459:58;16549:2;16534:18;;16380:178::o;16563:355::-;16765:2;16747:21;;;16804:2;16784:18;;;16777:30;16843:33;16838:2;16823:18;;16816:61;16909:2;16894:18;;16737:181::o;16923:400::-;17125:2;17107:21;;;17164:2;17144:18;;;17137:30;17203:34;17198:2;17183:18;;17176:62;-1:-1:-1;;;17269:2:1;17254:18;;17247:34;17313:3;17298:19;;17097:226::o;17328:349::-;17530:2;17512:21;;;17569:2;17549:18;;;17542:30;17608:27;17603:2;17588:18;;17581:55;17668:2;17653:18;;17502:175::o;17682:404::-;17884:2;17866:21;;;17923:2;17903:18;;;17896:30;17962:34;17957:2;17942:18;;17935:62;-1:-1:-1;;;18028:2:1;18013:18;;18006:38;18076:3;18061:19;;17856:230::o;18091:408::-;18293:2;18275:21;;;18332:2;18312:18;;;18305:30;18371:34;18366:2;18351:18;;18344:62;-1:-1:-1;;;18437:2:1;18422:18;;18415:42;18489:3;18474:19;;18265:234::o;18504:348::-;18706:2;18688:21;;;18745:2;18725:18;;;18718:30;18784:26;18779:2;18764:18;;18757:54;18843:2;18828:18;;18678:174::o;18857:404::-;19059:2;19041:21;;;19098:2;19078:18;;;19071:30;19137:34;19132:2;19117:18;;19110:62;-1:-1:-1;;;19203:2:1;19188:18;;19181:38;19251:3;19236:19;;19031:230::o;19266:420::-;19468:2;19450:21;;;19507:2;19487:18;;;19480:30;19546:34;19541:2;19526:18;;19519:62;19617:26;19612:2;19597:18;;19590:54;19676:3;19661:19;;19440:246::o;19691:406::-;19893:2;19875:21;;;19932:2;19912:18;;;19905:30;19971:34;19966:2;19951:18;;19944:62;-1:-1:-1;;;20037:2:1;20022:18;;20015:40;20087:3;20072:19;;19865:232::o;20102:405::-;20304:2;20286:21;;;20343:2;20323:18;;;20316:30;20382:34;20377:2;20362:18;;20355:62;-1:-1:-1;;;20448:2:1;20433:18;;20426:39;20497:3;20482:19;;20276:231::o;20512:349::-;20714:2;20696:21;;;20753:2;20733:18;;;20726:30;20792:27;20787:2;20772:18;;20765:55;20852:2;20837:18;;20686:175::o;20866:352::-;21068:2;21050:21;;;21107:2;21087:18;;;21080:30;21146;21141:2;21126:18;;21119:58;21209:2;21194:18;;21040:178::o;21223:351::-;21425:2;21407:21;;;21464:2;21444:18;;;21437:30;21503:29;21498:2;21483:18;;21476:57;21565:2;21550:18;;21397:177::o;21579:356::-;21781:2;21763:21;;;21800:18;;;21793:30;21859:34;21854:2;21839:18;;21832:62;21926:2;21911:18;;21753:182::o;21940:402::-;22142:2;22124:21;;;22181:2;22161:18;;;22154:30;22220:34;22215:2;22200:18;;22193:62;-1:-1:-1;;;22286:2:1;22271:18;;22264:36;22332:3;22317:19;;22114:228::o;22347:346::-;22549:2;22531:21;;;22588:2;22568:18;;;22561:30;-1:-1:-1;;;22622:2:1;22607:18;;22600:52;22684:2;22669:18;;22521:172::o;22698:408::-;22900:2;22882:21;;;22939:2;22919:18;;;22912:30;22978:34;22973:2;22958:18;;22951:62;-1:-1:-1;;;23044:2:1;23029:18;;23022:42;23096:3;23081:19;;22872:234::o;23111:405::-;23313:2;23295:21;;;23352:2;23332:18;;;23325:30;23391:34;23386:2;23371:18;;23364:62;-1:-1:-1;;;23457:2:1;23442:18;;23435:39;23506:3;23491:19;;23285:231::o;23521:411::-;23723:2;23705:21;;;23762:2;23742:18;;;23735:30;23801:34;23796:2;23781:18;;23774:62;-1:-1:-1;;;23867:2:1;23852:18;;23845:45;23922:3;23907:19;;23695:237::o;23937:397::-;24139:2;24121:21;;;24178:2;24158:18;;;24151:30;24217:34;24212:2;24197:18;;24190:62;-1:-1:-1;;;24283:2:1;24268:18;;24261:31;24324:3;24309:19;;24111:223::o;24339:413::-;24541:2;24523:21;;;24580:2;24560:18;;;24553:30;24619:34;24614:2;24599:18;;24592:62;-1:-1:-1;;;24685:2:1;24670:18;;24663:47;24742:3;24727:19;;24513:239::o;24757:400::-;24959:2;24941:21;;;24998:2;24978:18;;;24971:30;25037:34;25032:2;25017:18;;25010:62;-1:-1:-1;;;25103:2:1;25088:18;;25081:34;25147:3;25132:19;;24931:226::o;25162:348::-;25364:2;25346:21;;;25403:2;25383:18;;;25376:30;25442:26;25437:2;25422:18;;25415:54;25501:2;25486:18;;25336:174::o;25515:339::-;25717:2;25699:21;;;25756:2;25736:18;;;25729:30;-1:-1:-1;;;25790:2:1;25775:18;;25768:45;25845:2;25830:18;;25689:165::o;25859:352::-;26061:2;26043:21;;;26100:2;26080:18;;;26073:30;26139;26134:2;26119:18;;26112:58;26202:2;26187:18;;26033:178::o;26216:353::-;26418:2;26400:21;;;26457:2;26437:18;;;26430:30;26496:31;26491:2;26476:18;;26469:59;26560:2;26545:18;;26390:179::o;26756:184::-;26928:4;26916:17;;;;26898:36;;26886:2;26871:18;;26853:87::o;26945:128::-;;27016:1;27012:6;27009:1;27006:13;27003:2;;;27022:18;;:::i;:::-;-1:-1:-1;27058:9:1;;26993:80::o;27078:120::-;;27144:1;27134:2;;27149:18;;:::i;:::-;-1:-1:-1;27183:9:1;;27124:74::o;27203:168::-;;27309:1;27305;27301:6;27297:14;27294:1;27291:21;27286:1;27279:9;27272:17;27268:45;27265:2;;;27316:18;;:::i;:::-;-1:-1:-1;27356:9:1;;27255:116::o;27376:125::-;;27444:1;27441;27438:8;27435:2;;;27449:18;;:::i;:::-;-1:-1:-1;27486:9:1;;27425:76::o;27506:258::-;27578:1;27588:113;27602:6;27599:1;27596:13;27588:113;;;27678:11;;;27672:18;27659:11;;;27652:39;27624:2;27617:10;27588:113;;;27719:6;27716:1;27713:13;27710:2;;;-1:-1:-1;;27754:1:1;27736:16;;27729:27;27559:205::o;27769:380::-;27854:1;27844:12;;27901:1;27891:12;;;27912:2;;27966:4;27958:6;27954:17;27944:27;;27912:2;28019;28011:6;28008:14;27988:18;27985:38;27982:2;;;28065:10;28060:3;28056:20;28053:1;28046:31;28100:4;28097:1;28090:15;28128:4;28125:1;28118:15;27982:2;;27824:325;;;:::o;28154:135::-;;-1:-1:-1;;28214:17:1;;28211:2;;;28234:18;;:::i;:::-;-1:-1:-1;28281:1:1;28270:13;;28201:88::o;28294:112::-;;28352:1;28342:2;;28357:18;;:::i;:::-;-1:-1:-1;28391:9:1;;28332:74::o;28411:127::-;28472:10;28467:3;28463:20;28460:1;28453:31;28503:4;28500:1;28493:15;28527:4;28524:1;28517:15;28543:127;28604:10;28599:3;28595:20;28592:1;28585:31;28635:4;28632:1;28625:15;28659:4;28656:1;28649:15;28675:127;28736:10;28731:3;28727:20;28724:1;28717:31;28767:4;28764:1;28757:15;28791:4;28788:1;28781:15;28807:133;-1:-1:-1;;;;;28884:31:1;;28874:42;;28864:2;;28930:1;28927;28920:12;28945:133;-1:-1:-1;;;;;;29021:32:1;;29011:43;;29001:2;;29068:1;29065;29058:12
Swarm Source
ipfs://e67864a3eb7e12b01e8b04935666c8a95c0096afff886b2afb99b2f0cabd447e
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.