Overview
ETH Balance
0.08 ETH
Eth Value
$149.77 (@ $1,872.15/ETH)More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 69 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 14227578 | 1119 days ago | IN | 0 ETH | 0.0018948 | ||||
Safe Transfer Fr... | 13958392 | 1160 days ago | IN | 0 ETH | 0.01134754 | ||||
Safe Transfer Fr... | 13958389 | 1160 days ago | IN | 0 ETH | 0.00825641 | ||||
Safe Transfer Fr... | 13958386 | 1160 days ago | IN | 0 ETH | 0.01361671 | ||||
Transfer From | 13946643 | 1162 days ago | IN | 0 ETH | 0.01089866 | ||||
Transfer From | 13946630 | 1162 days ago | IN | 0 ETH | 0.01474179 | ||||
Mint By User | 13125458 | 1290 days ago | IN | 0.4 ETH | 0.05194805 | ||||
Mint By User | 13124950 | 1290 days ago | IN | 0.08 ETH | 0.01410906 | ||||
Mint By User | 13110190 | 1293 days ago | IN | 0.08 ETH | 0.01320265 | ||||
Mint By User | 13105047 | 1294 days ago | IN | 0.08 ETH | 0.01662268 | ||||
Mint By User | 13104855 | 1294 days ago | IN | 0.08 ETH | 0.01362813 | ||||
Mint By User | 13104156 | 1294 days ago | IN | 0.24 ETH | 0.05459422 | ||||
Mint By User | 13103327 | 1294 days ago | IN | 0.08 ETH | 0.0160495 | ||||
Mint By User | 13100662 | 1294 days ago | IN | 0.16 ETH | 0.01923292 | ||||
Mint By User | 13100517 | 1294 days ago | IN | 0.24 ETH | 0.02542297 | ||||
Mint By User | 13100400 | 1294 days ago | IN | 0.08 ETH | 0.01039408 | ||||
Mint By User | 13100374 | 1294 days ago | IN | 0.24 ETH | 0.02245457 | ||||
Mint By User | 13100317 | 1294 days ago | IN | 1.6 ETH | 0.24568922 | ||||
Mint By User | 13100297 | 1294 days ago | IN | 0.08 ETH | 0.01584957 | ||||
Mint By User | 13100288 | 1294 days ago | IN | 0.08 ETH | 0.01111199 | ||||
Mint By User | 13100252 | 1294 days ago | IN | 0.8 ETH | 0.08963822 | ||||
Mint By User | 13100187 | 1294 days ago | IN | 0.08 ETH | 0.01150585 | ||||
Mint By User | 13100072 | 1294 days ago | IN | 0.08 ETH | 0.0108493 | ||||
Mint By User | 13100050 | 1294 days ago | IN | 0.08 ETH | 0.0115451 | ||||
Mint By User | 13100026 | 1294 days ago | IN | 0.08 ETH | 0.00953859 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Method | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|---|
- | 13125458 | 1290 days ago | 0.4 ETH | ||||
- | 13124950 | 1290 days ago | 0.08 ETH | ||||
- | 13110190 | 1293 days ago | 0.08 ETH | ||||
- | 13105047 | 1294 days ago | 0.08 ETH | ||||
- | 13104855 | 1294 days ago | 0.08 ETH | ||||
- | 13104156 | 1294 days ago | 0.24 ETH | ||||
- | 13103327 | 1294 days ago | 0.08 ETH | ||||
- | 13100662 | 1294 days ago | 0.16 ETH | ||||
- | 13100517 | 1294 days ago | 0.24 ETH | ||||
- | 13100400 | 1294 days ago | 0.08 ETH | ||||
- | 13100374 | 1294 days ago | 0.24 ETH | ||||
- | 13100317 | 1294 days ago | 1.6 ETH | ||||
- | 13100297 | 1294 days ago | 0.08 ETH | ||||
- | 13100288 | 1294 days ago | 0.08 ETH | ||||
- | 13100252 | 1294 days ago | 0.8 ETH | ||||
- | 13100187 | 1294 days ago | 0.08 ETH | ||||
- | 13100072 | 1294 days ago | 0.08 ETH | ||||
- | 13100050 | 1294 days ago | 0.08 ETH | ||||
- | 13100026 | 1294 days ago | 0.08 ETH | ||||
- | 13100023 | 1294 days ago | 0.4 ETH | ||||
- | 13100016 | 1294 days ago | 0.08 ETH | ||||
- | 13100014 | 1294 days ago | 0.08 ETH | ||||
- | 13100014 | 1294 days ago | 0.08 ETH | ||||
- | 13100007 | 1294 days ago | 0.08 ETH | ||||
- | 13099995 | 1294 days ago | 0.16 ETH |
Loading...
Loading
Contract Name:
JuraNFT
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-08-25 */ // Sources flattened with hardhat v2.6.0 https://hardhat.org // File @openzeppelin/contracts/utils/introspection/[email protected] // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/[email protected] /** * @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/[email protected] /** * @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/[email protected] /** * @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/[email protected] /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); (bool success, ) = recipient.call{value: amount}(""); require( success, "Address: unable to send value, recipient may have reverted" ); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue( target, data, value, "Address: low-level call with value failed" ); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require( address(this).balance >= value, "Address: insufficient balance for call" ); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}( data ); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall( target, data, "Address: low-level static call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall( target, data, "Address: low-level delegate call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/utils/[email protected] /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/utils/[email protected] /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File @openzeppelin/contracts/utils/introspection/[email protected] /** * @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/[email protected] /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require( owner != address(0), "ERC721: balance query for the zero address" ); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require( owner != address(0), "ERC721: owner query for nonexistent token" ); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require( _exists(tokenId), "ERC721: approved query for nonexistent token" ); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved" ); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved" ); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require( _exists(tokenId), "ERC721: operator query for nonexistent token" ); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require( ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own" ); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received( _msgSender(), from, tokenId, _data ) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert( "ERC721: transfer to non ERC721Receiver implementer" ); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require( index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds" ); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require( index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds" ); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File @openzeppelin/contracts/access/[email protected] /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require( newOwner != address(0), "Ownable: new owner is the zero address" ); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/utils/math/[email protected] // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File @openzeppelin/contracts/token/ERC20/[email protected] /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval( address indexed owner, address indexed spender, uint256 value ); } // File contracts/common/meta-transactions/ContentMixin.sol abstract contract ContextMixin { function msgSender() internal view returns (address payable sender) { if (msg.sender == address(this)) { bytes memory array = msg.data; uint256 index = msg.data.length; assembly { // Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those. sender := and( mload(add(array, index)), 0xffffffffffffffffffffffffffffffffffffffff ) } } else { sender = payable(msg.sender); } return sender; } } // File contracts/common/meta-transactions/Initializable.sol contract Initializable { bool inited = false; modifier initializer() { require(!inited, "already inited"); _; inited = true; } } // File contracts/common/meta-transactions/EIP712Base.sol contract EIP712Base is Initializable { struct EIP712Domain { string name; string version; address verifyingContract; bytes32 salt; } string public constant ERC712_VERSION = "1"; bytes32 internal constant EIP712_DOMAIN_TYPEHASH = keccak256( bytes( "EIP712Domain(string name,string version,address verifyingContract,bytes32 salt)" ) ); bytes32 internal domainSeperator; // supposed to be called once while initializing. // one of the contracts that inherits this contract follows proxy pattern // so it is not possible to do this in a constructor function _initializeEIP712(string memory name) internal initializer { _setDomainSeperator(name); } function _setDomainSeperator(string memory name) internal { domainSeperator = keccak256( abi.encode( EIP712_DOMAIN_TYPEHASH, keccak256(bytes(name)), keccak256(bytes(ERC712_VERSION)), address(this), bytes32(getChainId()) ) ); } function getDomainSeperator() public view returns (bytes32) { return domainSeperator; } function getChainId() public view returns (uint256) { uint256 id; assembly { id := chainid() } return id; } /** * Accept message hash and returns hash message in EIP712 compatible form * So that it can be used to recover signer from signature signed using EIP712 formatted data * https://eips.ethereum.org/EIPS/eip-712 * "\\x19" makes the encoding deterministic * "\\x01" is the version byte to make it compatible to EIP-191 */ function toTypedMessageHash(bytes32 messageHash) internal view returns (bytes32) { return keccak256( abi.encodePacked("\x19\x01", getDomainSeperator(), messageHash) ); } } // File contracts/common/meta-transactions/NativeMetaTransaction.sol contract NativeMetaTransaction is EIP712Base { using SafeMath for uint256; bytes32 private constant META_TRANSACTION_TYPEHASH = keccak256( bytes( "MetaTransaction(uint256 nonce,address from,bytes functionSignature)" ) ); event MetaTransactionExecuted( address userAddress, address payable relayerAddress, bytes functionSignature ); mapping(address => uint256) nonces; /* * Meta transaction structure. * No point of including value field here as if user is doing value transfer then he has the funds to pay for gas * He should call the desired function directly in that case. */ struct MetaTransaction { uint256 nonce; address from; bytes functionSignature; } function executeMetaTransaction( address userAddress, bytes memory functionSignature, bytes32 sigR, bytes32 sigS, uint8 sigV ) public payable returns (bytes memory) { MetaTransaction memory metaTx = MetaTransaction({ nonce: nonces[userAddress], from: userAddress, functionSignature: functionSignature }); require( verify(userAddress, metaTx, sigR, sigS, sigV), "Signer and signature do not match" ); // increase nonce for user (to avoid re-use) nonces[userAddress] = nonces[userAddress].add(1); emit MetaTransactionExecuted( userAddress, payable(msg.sender), functionSignature ); // Append userAddress and relayer address at the end to extract it from calling context (bool success, bytes memory returnData) = address(this).call( abi.encodePacked(functionSignature, userAddress) ); require(success, "Function call not successful"); return returnData; } function hashMetaTransaction(MetaTransaction memory metaTx) internal pure returns (bytes32) { return keccak256( abi.encode( META_TRANSACTION_TYPEHASH, metaTx.nonce, metaTx.from, keccak256(metaTx.functionSignature) ) ); } function getNonce(address user) public view returns (uint256 nonce) { nonce = nonces[user]; } function verify( address signer, MetaTransaction memory metaTx, bytes32 sigR, bytes32 sigS, uint8 sigV ) internal view returns (bool) { require(signer != address(0), "NativeMetaTransaction: INVALID_SIGNER"); return signer == ecrecover( toTypedMessageHash(hashMetaTransaction(metaTx)), sigV, sigR, sigS ); } } // File contracts/common/StringsUtil.sol /** * @dev String operations. */ library StringsUtil { function concat(string memory _base, string memory _value) internal pure returns (string memory) { bytes memory _baseBytes = bytes(_base); bytes memory _valueBytes = bytes(_value); string memory _tmpValue = new string( _baseBytes.length + _valueBytes.length ); bytes memory _newValue = bytes(_tmpValue); uint256 i; uint256 j; for (i = 0; i < _baseBytes.length; i++) { _newValue[j++] = _baseBytes[i]; } for (i = 0; i < _valueBytes.length; i++) { _newValue[j++] = _valueBytes[i]; } return string(_newValue); } } // File contracts/JuraNFT.sol contract OwnableDelegateProxy { } contract ProxyRegistry { mapping(address => OwnableDelegateProxy) public proxies; } abstract contract ERC721Tradable is ContextMixin, ERC721Enumerable, NativeMetaTransaction, Ownable { using SafeMath for uint256; address proxyRegistryAddress; uint256 private _currentTokenId = 0; constructor( string memory _name, string memory _symbol, address _proxyRegistryAddress ) ERC721(_name, _symbol) { proxyRegistryAddress = _proxyRegistryAddress; _initializeEIP712(_name); } /** * @dev Mints a token to an address with a tokenURI. * @param _to address of the future owner of the token */ function mintTo(address _to) public onlyOwner { uint256 newTokenId = _getNextTokenId(); _mint(_to, newTokenId); _incrementTokenId(); } function _mintTo(address _to) internal returns (uint256) { uint256 newTokenId = _getNextTokenId(); _mint(_to, newTokenId); _incrementTokenId(); return newTokenId; } /** * @dev calculates the next token ID based on value of _currentTokenId * @return uint256 for the next token ID */ function _getNextTokenId() private view returns (uint256) { return _currentTokenId.add(1); } /** * @dev increments the value of _currentTokenId */ function _incrementTokenId() private { _currentTokenId++; } function baseTokenURI() public view virtual returns (string memory); function tokenURI(uint256 _tokenId) public view override returns (string memory) { return string( abi.encodePacked(baseTokenURI(), Strings.toString(_tokenId)) ); } /** * Override isApprovedForAll to whitelist user's OpenSea proxy accounts to enable gas-less listings. */ function isApprovedForAll(address owner, address operator) public view override returns (bool) { // Whitelist OpenSea proxy contract for easy trading. ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress); if (address(proxyRegistry.proxies(owner)) == operator) { return true; } return super.isApprovedForAll(owner, operator); } /** * This is used instead of msg.sender as transactions won't be sent by the original token owner, but by OpenSea. */ function _msgSender() internal view override returns (address sender) { return ContextMixin.msgSender(); } } interface IERC20Mint is IERC20 { function mint(address _account, uint256 _amount) external; function remainMintable() external view returns (uint256); } /// @title nft with power /// @notice buy/hold nft to get power,then you can claim jura token that amount depend on the amount of power you have. /// @dev change power of address events: 1,transfer nft; 2,claim jura (called by jura ERC20 contract) contract JuraNFT is ERC721Tradable { using StringsUtil for string; using SafeMath for uint256; string public metaURI; uint256 public powerPerBlock = 181 * (10**14); uint256 public jurPrice = 80 * (10**15); address public jurBanker; IERC20Mint public juraToken; uint256 public heightOnClaimBegin; // block height on token(ID) last received/mint mapping(uint256 => uint256) public heightsOnTokenReceived; // block height on user(address) last claim power mapping(address => uint256) public heightsOnUserClaimPower; // total power of user(address) mapping(address => uint256) public tPowers; // debt/consumed power of user(address): powerClaimable = tPower - dPower mapping(address => uint256) public dPowers; constructor(address _proxyRegistryAddress, IERC20Mint _juraToken) ERC721Tradable("JurassicNFT", "JUR", _proxyRegistryAddress) { juraToken = _juraToken; heightOnClaimBegin = block.number + 30; jurBanker = 0x1f00e2F18b64B90A9449965399be6f3DB1128044; metaURI = "https://jurassicnft.com/"; } // in only owner function mintByUser(uint256 _amount) public payable { require( _amount > 0 && _amount <= 20, "param limit: amount must between 1 and 20 " ); uint256 needCoins = jurPrice * _amount; require(msg.value >= needCoins, "send value: not enough to mint "); require( jurBanker != address(0), "config error: jur banker/receive con not be 0" ); payable(jurBanker).transfer(needCoins); // remain value will auto return to msg sender for (uint256 i = 0; i < _amount; i++) { uint256 tokenId = _mintTo(_msgSender()); heightsOnTokenReceived[tokenId] = block.number; } } function claimPower() public { uint256 amount = getAmountOfPowerClaimable(); require(amount > 0, "business: no claimable power"); // todo: require claim start time and had unminted jura token require( block.number >= heightOnClaimBegin, "business: claim not begin" ); uint256 remainMintable = juraToken.remainMintable(); require(remainMintable > 0, "business:all juraToken had been minted"); if (amount > remainMintable) { amount = remainMintable; } address holder = _msgSender(); tPowers[holder] = tPowers[holder].add(amount); dPowers[holder] = dPowers[holder].add(amount); heightsOnUserClaimPower[holder] = block.number; // mint jura token juraToken.mint(_msgSender(), amount); } function _transfer( address from, address to, uint256 tokenId ) internal override { tPowers[from] += getPowerPerToken(tokenId, from); super._transfer(from, to, tokenId); heightsOnTokenReceived[tokenId] = block.number; } function setMetaURI(string calldata _metaURI) public onlyOwner { require(bytes(_metaURI).length > 0, "param error: meta URI is empty"); metaURI = _metaURI; } function setPowerPerBlock(uint256 _powerPerBlock) public onlyOwner { powerPerBlock = _powerPerBlock; } function setJurPrice(uint256 _jurPrice) public onlyOwner { jurPrice = _jurPrice; } function setJurBanker(address _banker) public onlyOwner { require( _banker != address(0), "param limit: banker address con not be 0 " ); jurBanker = _banker; } function setJuraToken(IERC20Mint _juraToken) public onlyOwner { juraToken = _juraToken; } function setHeightOnClaimBegin(uint256 _height) public onlyOwner { require( _height > block.number, "param error: begin height must > current block height" ); heightOnClaimBegin = _height; } // out // get the amount of power that user claimable // cPowerPerToken = scaleByTokenID * (currHeight-max(heightOnTokenReceived,heightOnUserClaimPower))*powerPerBlock // tPower = tPower + sum(cPowerPerToken) // cPower = tPower - dPower function getAmountOfPowerClaimable() public view returns (uint256) { address holder = _msgSender(); return (tPowers[holder]).add(getPowerPerUser(holder)).sub(dPowers[holder]); } function getPowerPerUser(address _holder) public view returns (uint256) { uint256 balance = balanceOf(_holder); if (balance == 0) return 0; uint256 sum = 0; for (uint256 i = 0; i < balance; i++) { uint256 tokenId = tokenOfOwnerByIndex(_holder, i); sum = sum.add(getPowerPerToken(tokenId, _holder)); } return sum; } function getPowerPerToken(uint256 _tokenId, address _holder) public view returns (uint256) { uint256 scale = getScaleByTokenID(_tokenId); uint256 eHeight = getEffectHeights(_tokenId, _holder); uint256 p = scale * eHeight * powerPerBlock; p = p.div(100); return p; } function getEffectHeights(uint256 _tokenId, address _holder) public view returns (uint256) { uint256 rHeight = heightsOnTokenReceived[_tokenId]; uint256 cHeight = heightsOnUserClaimPower[_holder]; uint256 startHeight = rHeight >= cHeight ? rHeight : cHeight; uint256 currHeight = block.number; if (startHeight == 0 || startHeight > currHeight) { return 0; } else { return currHeight - startHeight; } } function getScaleByTokenID(uint256 _tokenId) public pure returns (uint256) { if (_tokenId > 0 && _tokenId <= 50) { return 120; } if ( _tokenId == 88 || _tokenId == 188 || _tokenId == 288 || _tokenId == 388 || _tokenId == 488 || _tokenId == 588 || _tokenId == 688 || _tokenId == 788 || _tokenId == 888 || _tokenId == 988 || _tokenId == 1088 || _tokenId == 1188 || _tokenId == 1288 || _tokenId == 1388 || _tokenId == 1488 || _tokenId == 1588 || _tokenId == 1688 || _tokenId == 1788 || _tokenId == 1888 || _tokenId == 1988 ) { return 200; } return 100; } function baseTokenURI() public view override returns (string memory) { return metaURI.concat("api/jura/"); } function contractURI() public view returns (string memory) { string memory mURI = metaURI; string memory api = "api/contract/jurassicnft"; return mURI.concat(api); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_proxyRegistryAddress","type":"address"},{"internalType":"contract IERC20Mint","name":"_juraToken","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":"userAddress","type":"address"},{"indexed":false,"internalType":"address payable","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"ERC712_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimPower","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"dPowers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getAmountOfPowerClaimable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDomainSeperator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_holder","type":"address"}],"name":"getEffectHeights","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_holder","type":"address"}],"name":"getPowerPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"}],"name":"getPowerPerUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getScaleByTokenID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"heightOnClaimBegin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"heightsOnTokenReceived","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"heightsOnUserClaimPower","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":[],"name":"jurBanker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"jurPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"juraToken","outputs":[{"internalType":"contract IERC20Mint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metaURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintByUser","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"mintTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"powerPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_height","type":"uint256"}],"name":"setHeightOnClaimBegin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_banker","type":"address"}],"name":"setJurBanker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_jurPrice","type":"uint256"}],"name":"setJurPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20Mint","name":"_juraToken","type":"address"}],"name":"setJuraToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_metaURI","type":"string"}],"name":"setMetaURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_powerPerBlock","type":"uint256"}],"name":"setPowerPerBlock","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":"address","name":"","type":"address"}],"name":"tPowers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600a805460ff191690556000600f5566404ddaa66f400060115567011c37937e0800006012553480156200003757600080fd5b5060405162003b5538038062003b558339810160408190526200005a916200042a565b6040518060400160405280600b81526020016a129d5c985cdcda58d3919560aa1b81525060405180604001604052806003815260200162252aa960e91b8152508382828160009080519060200190620000b592919062000384565b508051620000cb90600190602084019062000384565b505050620000e8620000e2620001b160201b60201c565b620001cd565b600e80546001600160a01b0319166001600160a01b0383161790556200010e836200021f565b5050601480546001600160a01b0319166001600160a01b038416179055506200013943601e62000468565b601555601380546001600160a01b031916731f00e2f18b64b90a9449965399be6f3db11280441790556040805180820190915260188082527f68747470733a2f2f6a757261737369636e66742e636f6d2f00000000000000006020909201918252620001a89160109162000384565b505050620004e3565b6000620001c86200028360201b620020171760201c565b905090565b600d80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600a5460ff1615620002685760405162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e481a5b9a5d195960921b604482015260640160405180910390fd5b6200027381620002e2565b50600a805460ff19166001179055565b600033301415620002dc57600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b03169150620002df9050565b50335b90565b6040518060800160405280604f815260200162003b06604f9139805160209182012082519282019290922060408051808201825260018152603160f81b90840152805180840194909452838101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608401523060808401524660a0808501919091528151808503909101815260c090930190528151910120600b55565b82805462000392906200048d565b90600052602060002090601f016020900481019282620003b6576000855562000401565b82601f10620003d157805160ff191683800117855562000401565b8280016001018555821562000401579182015b8281111562000401578251825591602001919060010190620003e4565b506200040f92915062000413565b5090565b5b808211156200040f576000815560010162000414565b600080604083850312156200043d578182fd5b82516200044a81620004ca565b60208401519092506200045d81620004ca565b809150509250929050565b600082198211156200048857634e487b7160e01b81526011600452602481fd5b500190565b600181811c90821680620004a257607f821691505b60208210811415620004c457634e487b7160e01b600052602260045260246000fd5b50919050565b6001600160a01b0381168114620004e057600080fd5b50565b61361380620004f36000396000f3fe6080604052600436106102c95760003560e01c8063715018a611610175578063a714edb6116100dc578063caefa00c11610095578063e8a3d4851161006f578063e8a3d4851461088f578063e985e9c5146108a4578063edc3efb9146108c4578063f2fde38b146108da57600080fd5b8063caefa00c1461082d578063d547cfb71461085a578063d8c4367f1461086f57600080fd5b8063a714edb614610777578063aa7b089c14610797578063b88d4fde146107b7578063b96eae5f146107d7578063c87b56dd146107f7578063ca5685df1461081757600080fd5b80638a36cd7b1161012e5780638a36cd7b146106c45780638da5cb5b146106e457806395d89b4114610702578063a0eddf7e14610717578063a22cb46514610737578063a4507f9f1461075757600080fd5b8063715018a61461060d578063755edd17146106225780637661d103146106425780637707b1e2146106625780637f775f551461068f5780638215ae57146106af57600080fd5b80632d0335ab1161023457806342842e0e116101ed57806366102d2d116101c757806366102d2d146105af57806367605787146105c25780636b75da50146105d757806370a08231146105ed57600080fd5b806342842e0e1461054f5780634f6ccce71461056f5780636352211e1461058f57600080fd5b80632d0335ab146104915780632f745c59146104c757806333bbdb0e146104e75780633408e4701461050757806336d725411461051a5780633d2f6e7f1461052f57600080fd5b80630c53c51c116102865780630c53c51c146103da5780630f7e5970146103ed57806318160ddd1461041a57806320379ee51461042f57806323b872dd1461044457806328fb932a1461046457600080fd5b806301b2ef8c146102ce57806301ffc9a7146103015780630387b97a1461033157806306fdde031461035e578063081812fc14610380578063095ea7b3146103b8575b600080fd5b3480156102da57600080fd5b506102ee6102e93660046131e0565b6108fa565b6040519081526020015b60405180910390f35b34801561030d57600080fd5b5061032161031c36600461311f565b610a15565b60405190151581526020016102f8565b34801561033d57600080fd5b506102ee61034c366004612f4a565b60176020526000908152604090205481565b34801561036a57600080fd5b50610373610a40565b6040516102f8919061334a565b34801561038c57600080fd5b506103a061039b3660046131e0565b610ad2565b6040516001600160a01b0390911681526020016102f8565b3480156103c457600080fd5b506103d86103d33660046130f4565b610b6c565b005b6103736103e8366004613079565b610c94565b3480156103f957600080fd5b50610373604051806040016040528060018152602001603160f81b81525081565b34801561042657600080fd5b506008546102ee565b34801561043b57600080fd5b50600b546102ee565b34801561045057600080fd5b506103d861045f366004612f9e565b610e7e565b34801561047057600080fd5b506102ee61047f366004612f4a565b60186020526000908152604090205481565b34801561049d57600080fd5b506102ee6104ac366004612f4a565b6001600160a01b03166000908152600c602052604090205490565b3480156104d357600080fd5b506102ee6104e23660046130f4565b610eb6565b3480156104f357600080fd5b506103d8610502366004612f4a565b610f4c565b34801561051357600080fd5b50466102ee565b34801561052657600080fd5b506102ee610fb7565b34801561053b57600080fd5b506103d861054a3660046131e0565b611019565b34801561055b57600080fd5b506103d861056a366004612f9e565b611067565b34801561057b57600080fd5b506102ee61058a3660046131e0565b611082565b34801561059b57600080fd5b506103a06105aa3660046131e0565b611123565b6103d86105bd3660046131e0565b61119a565b3480156105ce57600080fd5b50610373611356565b3480156105e357600080fd5b506102ee60125481565b3480156105f957600080fd5b506102ee610608366004612f4a565b6113e4565b34801561061957600080fd5b506103d861146b565b34801561062e57600080fd5b506103d861063d366004612f4a565b6114c0565b34801561064e57600080fd5b506103d861065d366004612f4a565b61152b565b34801561066e57600080fd5b506102ee61067d366004612f4a565b60196020526000908152604090205481565b34801561069b57600080fd5b506102ee6106aa366004612f4a565b6115fe565b3480156106bb57600080fd5b506103d8611666565b3480156106d057600080fd5b506013546103a0906001600160a01b031681565b3480156106f057600080fd5b50600d546001600160a01b03166103a0565b34801561070e57600080fd5b506103736118fe565b34801561072357600080fd5b506103d8610732366004613173565b61190d565b34801561074357600080fd5b506103d8610752366004613048565b6119af565b34801561076357600080fd5b506014546103a0906001600160a01b031681565b34801561078357600080fd5b506103d86107923660046131e0565b611ab1565b3480156107a357600080fd5b506103d86107b23660046131e0565b611b6c565b3480156107c357600080fd5b506103d86107d2366004612fde565b611bba565b3480156107e357600080fd5b506102ee6107f2366004613210565b611bf9565b34801561080357600080fd5b506103736108123660046131e0565b611c66565b34801561082357600080fd5b506102ee60155481565b34801561083957600080fd5b506102ee6108483660046131e0565b60166020526000908152604090205481565b34801561086657600080fd5b50610373611ca0565b34801561087b57600080fd5b506102ee61088a366004613210565b611d65565b34801561089b57600080fd5b50610373611db3565b3480156108b057600080fd5b506103216108bf366004612f66565b611e8d565b3480156108d057600080fd5b506102ee60115481565b3480156108e657600080fd5b506103d86108f5366004612f4a565b611f5d565b6000808211801561090c575060328211155b1561091957506078919050565b816058148061092857508160bc145b80610934575081610120145b80610940575081610184145b8061094c5750816101e8145b8061095857508161024c145b806109645750816102b0145b80610970575081610314145b8061097c575081610378145b806109885750816103dc145b80610994575081610440145b806109a05750816104a4145b806109ac575081610508145b806109b857508161056c145b806109c45750816105d0145b806109d0575081610634145b806109dc575081610698145b806109e85750816106fc145b806109f4575081610760145b80610a005750816107c4145b15610a0d575060c8919050565b506064919050565b60006001600160e01b0319821663780e9d6360e01b1480610a3a5750610a3a82612074565b92915050565b606060008054610a4f906134c3565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7b906134c3565b8015610ac85780601f10610a9d57610100808354040283529160200191610ac8565b820191906000526020600020905b815481529060010190602001808311610aab57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610b505760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610b7782611123565b9050806001600160a01b0316836001600160a01b03161415610be55760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610b47565b806001600160a01b0316610bf76120c4565b6001600160a01b03161480610c135750610c13816108bf6120c4565b610c855760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b47565b610c8f83836120ce565b505050565b60408051606081810183526001600160a01b0388166000818152600c602090815290859020548452830152918101869052610cd2878287878761213c565b610d285760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b6064820152608401610b47565b6001600160a01b0387166000908152600c6020526040902054610d4c90600161222c565b6001600160a01b0388166000908152600c60205260409081902091909155517f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b90610d9c90899033908a906132e2565b60405180910390a1600080306001600160a01b0316888a604051602001610dc492919061327c565b60408051601f1981840301815290829052610dde91613260565b6000604051808303816000865af19150503d8060008114610e1b576040519150601f19603f3d011682016040523d82523d6000602084013e610e20565b606091505b509150915081610e725760405162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c000000006044820152606401610b47565b98975050505050505050565b610e8f610e896120c4565b8261223f565b610eab5760405162461bcd60e51b8152600401610b47906133e4565b610c8f83838361230e565b6000610ec1836113e4565b8210610f235760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610b47565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610f546120c4565b6001600160a01b0316610f6f600d546001600160a01b031690565b6001600160a01b031614610f955760405162461bcd60e51b8152600401610b47906133af565b601480546001600160a01b0319166001600160a01b0392909216919091179055565b600080610fc26120c4565b6001600160a01b0381166000908152601960205260409020549091506110139061100d610fee846115fe565b6001600160a01b0385166000908152601860205260409020549061222c565b90612366565b91505090565b6110216120c4565b6001600160a01b031661103c600d546001600160a01b031690565b6001600160a01b0316146110625760405162461bcd60e51b8152600401610b47906133af565b601155565b610c8f83838360405180602001604052806000815250611bba565b600061108d60085490565b82106110f05760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610b47565b6008828154811061111157634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b031680610a3a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610b47565b6000811180156111ab575060148111155b61120a5760405162461bcd60e51b815260206004820152602a60248201527f706172616d206c696d69743a20616d6f756e74206d757374206265747765656e604482015269010189030b732101918160b51b6064820152608401610b47565b60008160125461121a9190613461565b90508034101561126c5760405162461bcd60e51b815260206004820152601f60248201527f73656e642076616c75653a206e6f7420656e6f75676820746f206d696e7420006044820152606401610b47565b6013546001600160a01b03166112da5760405162461bcd60e51b815260206004820152602d60248201527f636f6e666967206572726f723a206a75722062616e6b65722f7265636569766560448201526c020636f6e206e6f74206265203609c1b6064820152608401610b47565b6013546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015611314573d6000803e3d6000fd5b5060005b82811015610c8f57600061133261132d6120c4565b612372565b6000908152601660205260409020439055508061134e816134fe565b915050611318565b60108054611363906134c3565b80601f016020809104026020016040519081016040528092919081815260200182805461138f906134c3565b80156113dc5780601f106113b1576101008083540402835291602001916113dc565b820191906000526020600020905b8154815290600101906020018083116113bf57829003601f168201915b505050505081565b60006001600160a01b03821661144f5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610b47565b506001600160a01b031660009081526003602052604090205490565b6114736120c4565b6001600160a01b031661148e600d546001600160a01b031690565b6001600160a01b0316146114b45760405162461bcd60e51b8152600401610b47906133af565b6114be6000612391565b565b6114c86120c4565b6001600160a01b03166114e3600d546001600160a01b031690565b6001600160a01b0316146115095760405162461bcd60e51b8152600401610b47906133af565b60006115136123e3565b905061151f82826123f4565b611527612542565b5050565b6115336120c4565b6001600160a01b031661154e600d546001600160a01b031690565b6001600160a01b0316146115745760405162461bcd60e51b8152600401610b47906133af565b6001600160a01b0381166115dc5760405162461bcd60e51b815260206004820152602960248201527f706172616d206c696d69743a2062616e6b6572206164647265737320636f6e2060448201526803737ba1031329018160bd1b6064820152608401610b47565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b60008061160a836113e4565b90508061161a5750600092915050565b6000805b8281101561165e5760006116328683610eb6565b90506116486116418288611d65565b849061222c565b9250508080611656906134fe565b91505061161e565b509392505050565b6000611670610fb7565b9050600081116116c25760405162461bcd60e51b815260206004820152601c60248201527f627573696e6573733a206e6f20636c61696d61626c6520706f776572000000006044820152606401610b47565b6015544310156117145760405162461bcd60e51b815260206004820152601960248201527f627573696e6573733a20636c61696d206e6f7420626567696e000000000000006044820152606401610b47565b6014546040805163b257da4560e01b815290516000926001600160a01b03169163b257da45916004808301926020929190829003018186803b15801561175957600080fd5b505afa15801561176d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061179191906131f8565b9050600081116117f25760405162461bcd60e51b815260206004820152602660248201527f627573696e6573733a616c6c206a757261546f6b656e20686164206265656e206044820152651b5a5b9d195960d21b6064820152608401610b47565b808211156117fe578091505b60006118086120c4565b6001600160a01b03811660009081526018602052604090205490915061182e908461222c565b6001600160a01b03821660009081526018602090815260408083209390935560199052205461185d908461222c565b6001600160a01b038083166000908152601960209081526040808320949094556017905291909120439055601454166340c10f196118996120c4565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101869052604401600060405180830381600087803b1580156118e157600080fd5b505af11580156118f5573d6000803e3d6000fd5b50505050505050565b606060018054610a4f906134c3565b6119156120c4565b6001600160a01b0316611930600d546001600160a01b031690565b6001600160a01b0316146119565760405162461bcd60e51b8152600401610b47906133af565b806119a35760405162461bcd60e51b815260206004820152601e60248201527f706172616d206572726f723a206d6574612055524920697320656d70747900006044820152606401610b47565b610c8f60108383612e2a565b6119b76120c4565b6001600160a01b0316826001600160a01b03161415611a185760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b47565b8060056000611a256120c4565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155611a696120c4565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611aa5911515815260200190565b60405180910390a35050565b611ab96120c4565b6001600160a01b0316611ad4600d546001600160a01b031690565b6001600160a01b031614611afa5760405162461bcd60e51b8152600401610b47906133af565b438111611b675760405162461bcd60e51b815260206004820152603560248201527f706172616d206572726f723a20626567696e20686569676874206d757374203e6044820152740818dd5c9c995b9d08189b1bd8dac81a195a59da1d605a1b6064820152608401610b47565b601555565b611b746120c4565b6001600160a01b0316611b8f600d546001600160a01b031690565b6001600160a01b031614611bb55760405162461bcd60e51b8152600401610b47906133af565b601255565b611bcb611bc56120c4565b8361223f565b611be75760405162461bcd60e51b8152600401610b47906133e4565b611bf384848484612559565b50505050565b6000828152601660209081526040808320546001600160a01b038516845260179092528220548281831015611c2e5781611c30565b825b905043811580611c3f57508082115b15611c51576000945050505050610a3a565b611c5b8282613480565b945050505050610a3a565b6060611c70611ca0565b611c798361258c565b604051602001611c8a9291906132b3565b6040516020818303038152906040529050919050565b6060611d60604051806040016040528060098152602001686170692f6a7572612f60b81b81525060108054611cd4906134c3565b80601f0160208091040260200160405190810160405280929190818152602001828054611d00906134c3565b8015611d4d5780601f10611d2257610100808354040283529160200191611d4d565b820191906000526020600020905b815481529060010190602001808311611d3057829003601f168201915b50505050506126a690919063ffffffff16565b905090565b600080611d71846108fa565b90506000611d7f8585611bf9565b905060006011548284611d929190613461565b611d9c9190613461565b9050611da9816064612840565b9695505050505050565b6060600060108054611dc4906134c3565b80601f0160208091040260200160405190810160405280929190818152602001828054611df0906134c3565b8015611e3d5780601f10611e1257610100808354040283529160200191611e3d565b820191906000526020600020905b815481529060010190602001808311611e2057829003601f168201915b505060408051808201909152601881527f6170692f636f6e74726163742f6a757261737369636e667400000000000000006020820152939450611e8692508491508390506126a6565b9250505090565b600e5460405163c455279160e01b81526001600160a01b03848116600483015260009281169190841690829063c45527919060240160206040518083038186803b158015611eda57600080fd5b505afa158015611eee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f129190613157565b6001600160a01b03161415611f2b576001915050610a3a565b6001600160a01b0380851660009081526005602090815260408083209387168352929052205460ff165b949350505050565b611f656120c4565b6001600160a01b0316611f80600d546001600160a01b031690565b6001600160a01b031614611fa65760405162461bcd60e51b8152600401610b47906133af565b6001600160a01b03811661200b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b47565b61201481612391565b50565b60003330141561206e57600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b031691506120719050565b50335b90565b60006001600160e01b031982166380ac58cd60e01b14806120a557506001600160e01b03198216635b5e139f60e01b145b80610a3a57506301ffc9a760e01b6001600160e01b0319831614610a3a565b6000611d60612017565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061210382611123565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006001600160a01b0386166121a25760405162461bcd60e51b815260206004820152602560248201527f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360448201526424a3a722a960d91b6064820152608401610b47565b60016121b56121b08761284c565b6128c9565b6040805160008152602081018083529290925260ff851690820152606081018690526080810185905260a0016020604051602081039080840390855afa158015612203573d6000803e3d6000fd5b505050602060405103516001600160a01b0316866001600160a01b031614905095945050505050565b60006122388284613435565b9392505050565b6000818152600260205260408120546001600160a01b03166122b85760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b47565b60006122c383611123565b9050806001600160a01b0316846001600160a01b031614806122fe5750836001600160a01b03166122f384610ad2565b6001600160a01b0316145b80611f555750611f558185611e8d565b6123188184611d65565b6001600160a01b03841660009081526018602052604081208054909190612340908490613435565b9091555061235190508383836128f9565b60009081526016602052604090204390555050565b60006122388284613480565b60008061237d6123e3565b905061238983826123f4565b610a3a612542565b600d80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600f54600090611d6090600161222c565b6001600160a01b03821661244a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b47565b6000818152600260205260409020546001600160a01b0316156124af5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b47565b6124bb60008383612aa4565b6001600160a01b03821660009081526003602052604081208054600192906124e4908490613435565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600f8054906000612552836134fe565b9190505550565b61256484848461230e565b61257084848484612b5c565b611bf35760405162461bcd60e51b8152600401610b479061335d565b6060816125b05750506040805180820190915260018152600360fc1b602082015290565b8160005b81156125da57806125c4816134fe565b91506125d39050600a8361344d565b91506125b4565b60008167ffffffffffffffff81111561260357634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561262d576020820181803683370190505b5090505b8415611f5557612642600183613480565b915061264f600a86613519565b61265a906030613435565b60f81b81838151811061267d57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061269f600a8661344d565b9450612631565b80518251606091849184916000916126be9190613435565b67ffffffffffffffff8111156126e457634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561270e576020820181803683370190505b509050806000805b85518210156127a25785828151811061273f57634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b0319168382612759816134fe565b93508151811061277957634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053508161279a816134fe565b925050612716565b600091505b8451821015612833578482815181106127d057634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b03191683826127ea816134fe565b93508151811061280a57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053508161282b816134fe565b9250506127a7565b5090979650505050505050565b6000612238828461344d565b600060405180608001604052806043815260200161359b60439139805160209182012083518483015160408087015180519086012090516128ac950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b60006128d4600b5490565b60405161190160f01b60208201526022810191909152604281018390526062016128ac565b826001600160a01b031661290c82611123565b6001600160a01b0316146129745760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610b47565b6001600160a01b0382166129d65760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610b47565b6129e1838383612aa4565b6129ec6000826120ce565b6001600160a01b0383166000908152600360205260408120805460019290612a15908490613480565b90915550506001600160a01b0382166000908152600360205260408120805460019290612a43908490613435565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b038316612aff57612afa81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612b22565b816001600160a01b0316836001600160a01b031614612b2257612b228382612c70565b6001600160a01b038216612b3957610c8f81612d0d565b826001600160a01b0316826001600160a01b031614610c8f57610c8f8282612de6565b60006001600160a01b0384163b15612c6557836001600160a01b031663150b7a02612b856120c4565b8786866040518563ffffffff1660e01b8152600401612ba79493929190613317565b602060405180830381600087803b158015612bc157600080fd5b505af1925050508015612bf1575060408051601f3d908101601f19168201909252612bee9181019061313b565b60015b612c4b573d808015612c1f576040519150601f19603f3d011682016040523d82523d6000602084013e612c24565b606091505b508051612c435760405162461bcd60e51b8152600401610b479061335d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611f55565b506001949350505050565b60006001612c7d846113e4565b612c879190613480565b600083815260076020526040902054909150808214612cda576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612d1f90600190613480565b60008381526009602052604081205460088054939450909284908110612d5557634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060088381548110612d8457634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612dca57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612df1836113e4565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054612e36906134c3565b90600052602060002090601f016020900481019282612e585760008555612e9e565b82601f10612e715782800160ff19823516178555612e9e565b82800160010185558215612e9e579182015b82811115612e9e578235825591602001919060010190612e83565b50612eaa929150612eae565b5090565b5b80821115612eaa5760008155600101612eaf565b600082601f830112612ed3578081fd5b813567ffffffffffffffff80821115612eee57612eee613559565b604051601f8301601f19908116603f01168101908282118183101715612f1657612f16613559565b81604052838152866020858801011115612f2e578485fd5b8360208701602083013792830160200193909352509392505050565b600060208284031215612f5b578081fd5b81356122388161356f565b60008060408385031215612f78578081fd5b8235612f838161356f565b91506020830135612f938161356f565b809150509250929050565b600080600060608486031215612fb2578081fd5b8335612fbd8161356f565b92506020840135612fcd8161356f565b929592945050506040919091013590565b60008060008060808587031215612ff3578081fd5b8435612ffe8161356f565b9350602085013561300e8161356f565b925060408501359150606085013567ffffffffffffffff811115613030578182fd5b61303c87828801612ec3565b91505092959194509250565b6000806040838503121561305a578182fd5b82356130658161356f565b915060208301358015158114612f93578182fd5b600080600080600060a08688031215613090578081fd5b853561309b8161356f565b9450602086013567ffffffffffffffff8111156130b6578182fd5b6130c288828901612ec3565b9450506040860135925060608601359150608086013560ff811681146130e6578182fd5b809150509295509295909350565b60008060408385031215613106578182fd5b82356131118161356f565b946020939093013593505050565b600060208284031215613130578081fd5b813561223881613584565b60006020828403121561314c578081fd5b815161223881613584565b600060208284031215613168578081fd5b81516122388161356f565b60008060208385031215613185578081fd5b823567ffffffffffffffff8082111561319c578283fd5b818501915085601f8301126131af578283fd5b8135818111156131bd578384fd5b8660208285010111156131ce578384fd5b60209290920196919550909350505050565b6000602082840312156131f1578081fd5b5035919050565b600060208284031215613209578081fd5b5051919050565b60008060408385031215613222578182fd5b823591506020830135612f938161356f565b6000815180845261324c816020860160208601613497565b601f01601f19169290920160200192915050565b60008251613272818460208701613497565b9190910192915050565b6000835161328e818460208801613497565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b600083516132c5818460208801613497565b8351908301906132d9818360208801613497565b01949350505050565b6001600160a01b0384811682528316602082015260606040820181905260009061330e90830184613234565b95945050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611da990830184613234565b6020815260006122386020830184613234565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600082198211156134485761344861352d565b500190565b60008261345c5761345c613543565b500490565b600081600019048311821515161561347b5761347b61352d565b500290565b6000828210156134925761349261352d565b500390565b60005b838110156134b257818101518382015260200161349a565b83811115611bf35750506000910152565b600181811c908216806134d757607f821691505b602082108114156134f857634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156135125761351261352d565b5060010190565b60008261352857613528613543565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461201457600080fd5b6001600160e01b03198116811461201457600080fdfe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a2646970667358221220854415d6eacb72e57dd35d06a4af09626f90c98d25bd377b027ac77579009dc664736f6c63430008040033454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c6164647265737320766572696679696e67436f6e74726163742c627974657333322073616c7429000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c10000000000000000000000001d5c5705385f71a6861645f83e5d83932145b5b3
Deployed Bytecode
0x6080604052600436106102c95760003560e01c8063715018a611610175578063a714edb6116100dc578063caefa00c11610095578063e8a3d4851161006f578063e8a3d4851461088f578063e985e9c5146108a4578063edc3efb9146108c4578063f2fde38b146108da57600080fd5b8063caefa00c1461082d578063d547cfb71461085a578063d8c4367f1461086f57600080fd5b8063a714edb614610777578063aa7b089c14610797578063b88d4fde146107b7578063b96eae5f146107d7578063c87b56dd146107f7578063ca5685df1461081757600080fd5b80638a36cd7b1161012e5780638a36cd7b146106c45780638da5cb5b146106e457806395d89b4114610702578063a0eddf7e14610717578063a22cb46514610737578063a4507f9f1461075757600080fd5b8063715018a61461060d578063755edd17146106225780637661d103146106425780637707b1e2146106625780637f775f551461068f5780638215ae57146106af57600080fd5b80632d0335ab1161023457806342842e0e116101ed57806366102d2d116101c757806366102d2d146105af57806367605787146105c25780636b75da50146105d757806370a08231146105ed57600080fd5b806342842e0e1461054f5780634f6ccce71461056f5780636352211e1461058f57600080fd5b80632d0335ab146104915780632f745c59146104c757806333bbdb0e146104e75780633408e4701461050757806336d725411461051a5780633d2f6e7f1461052f57600080fd5b80630c53c51c116102865780630c53c51c146103da5780630f7e5970146103ed57806318160ddd1461041a57806320379ee51461042f57806323b872dd1461044457806328fb932a1461046457600080fd5b806301b2ef8c146102ce57806301ffc9a7146103015780630387b97a1461033157806306fdde031461035e578063081812fc14610380578063095ea7b3146103b8575b600080fd5b3480156102da57600080fd5b506102ee6102e93660046131e0565b6108fa565b6040519081526020015b60405180910390f35b34801561030d57600080fd5b5061032161031c36600461311f565b610a15565b60405190151581526020016102f8565b34801561033d57600080fd5b506102ee61034c366004612f4a565b60176020526000908152604090205481565b34801561036a57600080fd5b50610373610a40565b6040516102f8919061334a565b34801561038c57600080fd5b506103a061039b3660046131e0565b610ad2565b6040516001600160a01b0390911681526020016102f8565b3480156103c457600080fd5b506103d86103d33660046130f4565b610b6c565b005b6103736103e8366004613079565b610c94565b3480156103f957600080fd5b50610373604051806040016040528060018152602001603160f81b81525081565b34801561042657600080fd5b506008546102ee565b34801561043b57600080fd5b50600b546102ee565b34801561045057600080fd5b506103d861045f366004612f9e565b610e7e565b34801561047057600080fd5b506102ee61047f366004612f4a565b60186020526000908152604090205481565b34801561049d57600080fd5b506102ee6104ac366004612f4a565b6001600160a01b03166000908152600c602052604090205490565b3480156104d357600080fd5b506102ee6104e23660046130f4565b610eb6565b3480156104f357600080fd5b506103d8610502366004612f4a565b610f4c565b34801561051357600080fd5b50466102ee565b34801561052657600080fd5b506102ee610fb7565b34801561053b57600080fd5b506103d861054a3660046131e0565b611019565b34801561055b57600080fd5b506103d861056a366004612f9e565b611067565b34801561057b57600080fd5b506102ee61058a3660046131e0565b611082565b34801561059b57600080fd5b506103a06105aa3660046131e0565b611123565b6103d86105bd3660046131e0565b61119a565b3480156105ce57600080fd5b50610373611356565b3480156105e357600080fd5b506102ee60125481565b3480156105f957600080fd5b506102ee610608366004612f4a565b6113e4565b34801561061957600080fd5b506103d861146b565b34801561062e57600080fd5b506103d861063d366004612f4a565b6114c0565b34801561064e57600080fd5b506103d861065d366004612f4a565b61152b565b34801561066e57600080fd5b506102ee61067d366004612f4a565b60196020526000908152604090205481565b34801561069b57600080fd5b506102ee6106aa366004612f4a565b6115fe565b3480156106bb57600080fd5b506103d8611666565b3480156106d057600080fd5b506013546103a0906001600160a01b031681565b3480156106f057600080fd5b50600d546001600160a01b03166103a0565b34801561070e57600080fd5b506103736118fe565b34801561072357600080fd5b506103d8610732366004613173565b61190d565b34801561074357600080fd5b506103d8610752366004613048565b6119af565b34801561076357600080fd5b506014546103a0906001600160a01b031681565b34801561078357600080fd5b506103d86107923660046131e0565b611ab1565b3480156107a357600080fd5b506103d86107b23660046131e0565b611b6c565b3480156107c357600080fd5b506103d86107d2366004612fde565b611bba565b3480156107e357600080fd5b506102ee6107f2366004613210565b611bf9565b34801561080357600080fd5b506103736108123660046131e0565b611c66565b34801561082357600080fd5b506102ee60155481565b34801561083957600080fd5b506102ee6108483660046131e0565b60166020526000908152604090205481565b34801561086657600080fd5b50610373611ca0565b34801561087b57600080fd5b506102ee61088a366004613210565b611d65565b34801561089b57600080fd5b50610373611db3565b3480156108b057600080fd5b506103216108bf366004612f66565b611e8d565b3480156108d057600080fd5b506102ee60115481565b3480156108e657600080fd5b506103d86108f5366004612f4a565b611f5d565b6000808211801561090c575060328211155b1561091957506078919050565b816058148061092857508160bc145b80610934575081610120145b80610940575081610184145b8061094c5750816101e8145b8061095857508161024c145b806109645750816102b0145b80610970575081610314145b8061097c575081610378145b806109885750816103dc145b80610994575081610440145b806109a05750816104a4145b806109ac575081610508145b806109b857508161056c145b806109c45750816105d0145b806109d0575081610634145b806109dc575081610698145b806109e85750816106fc145b806109f4575081610760145b80610a005750816107c4145b15610a0d575060c8919050565b506064919050565b60006001600160e01b0319821663780e9d6360e01b1480610a3a5750610a3a82612074565b92915050565b606060008054610a4f906134c3565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7b906134c3565b8015610ac85780601f10610a9d57610100808354040283529160200191610ac8565b820191906000526020600020905b815481529060010190602001808311610aab57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610b505760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610b7782611123565b9050806001600160a01b0316836001600160a01b03161415610be55760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610b47565b806001600160a01b0316610bf76120c4565b6001600160a01b03161480610c135750610c13816108bf6120c4565b610c855760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b47565b610c8f83836120ce565b505050565b60408051606081810183526001600160a01b0388166000818152600c602090815290859020548452830152918101869052610cd2878287878761213c565b610d285760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b6064820152608401610b47565b6001600160a01b0387166000908152600c6020526040902054610d4c90600161222c565b6001600160a01b0388166000908152600c60205260409081902091909155517f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b90610d9c90899033908a906132e2565b60405180910390a1600080306001600160a01b0316888a604051602001610dc492919061327c565b60408051601f1981840301815290829052610dde91613260565b6000604051808303816000865af19150503d8060008114610e1b576040519150601f19603f3d011682016040523d82523d6000602084013e610e20565b606091505b509150915081610e725760405162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c000000006044820152606401610b47565b98975050505050505050565b610e8f610e896120c4565b8261223f565b610eab5760405162461bcd60e51b8152600401610b47906133e4565b610c8f83838361230e565b6000610ec1836113e4565b8210610f235760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610b47565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610f546120c4565b6001600160a01b0316610f6f600d546001600160a01b031690565b6001600160a01b031614610f955760405162461bcd60e51b8152600401610b47906133af565b601480546001600160a01b0319166001600160a01b0392909216919091179055565b600080610fc26120c4565b6001600160a01b0381166000908152601960205260409020549091506110139061100d610fee846115fe565b6001600160a01b0385166000908152601860205260409020549061222c565b90612366565b91505090565b6110216120c4565b6001600160a01b031661103c600d546001600160a01b031690565b6001600160a01b0316146110625760405162461bcd60e51b8152600401610b47906133af565b601155565b610c8f83838360405180602001604052806000815250611bba565b600061108d60085490565b82106110f05760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610b47565b6008828154811061111157634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b031680610a3a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610b47565b6000811180156111ab575060148111155b61120a5760405162461bcd60e51b815260206004820152602a60248201527f706172616d206c696d69743a20616d6f756e74206d757374206265747765656e604482015269010189030b732101918160b51b6064820152608401610b47565b60008160125461121a9190613461565b90508034101561126c5760405162461bcd60e51b815260206004820152601f60248201527f73656e642076616c75653a206e6f7420656e6f75676820746f206d696e7420006044820152606401610b47565b6013546001600160a01b03166112da5760405162461bcd60e51b815260206004820152602d60248201527f636f6e666967206572726f723a206a75722062616e6b65722f7265636569766560448201526c020636f6e206e6f74206265203609c1b6064820152608401610b47565b6013546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015611314573d6000803e3d6000fd5b5060005b82811015610c8f57600061133261132d6120c4565b612372565b6000908152601660205260409020439055508061134e816134fe565b915050611318565b60108054611363906134c3565b80601f016020809104026020016040519081016040528092919081815260200182805461138f906134c3565b80156113dc5780601f106113b1576101008083540402835291602001916113dc565b820191906000526020600020905b8154815290600101906020018083116113bf57829003601f168201915b505050505081565b60006001600160a01b03821661144f5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610b47565b506001600160a01b031660009081526003602052604090205490565b6114736120c4565b6001600160a01b031661148e600d546001600160a01b031690565b6001600160a01b0316146114b45760405162461bcd60e51b8152600401610b47906133af565b6114be6000612391565b565b6114c86120c4565b6001600160a01b03166114e3600d546001600160a01b031690565b6001600160a01b0316146115095760405162461bcd60e51b8152600401610b47906133af565b60006115136123e3565b905061151f82826123f4565b611527612542565b5050565b6115336120c4565b6001600160a01b031661154e600d546001600160a01b031690565b6001600160a01b0316146115745760405162461bcd60e51b8152600401610b47906133af565b6001600160a01b0381166115dc5760405162461bcd60e51b815260206004820152602960248201527f706172616d206c696d69743a2062616e6b6572206164647265737320636f6e2060448201526803737ba1031329018160bd1b6064820152608401610b47565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b60008061160a836113e4565b90508061161a5750600092915050565b6000805b8281101561165e5760006116328683610eb6565b90506116486116418288611d65565b849061222c565b9250508080611656906134fe565b91505061161e565b509392505050565b6000611670610fb7565b9050600081116116c25760405162461bcd60e51b815260206004820152601c60248201527f627573696e6573733a206e6f20636c61696d61626c6520706f776572000000006044820152606401610b47565b6015544310156117145760405162461bcd60e51b815260206004820152601960248201527f627573696e6573733a20636c61696d206e6f7420626567696e000000000000006044820152606401610b47565b6014546040805163b257da4560e01b815290516000926001600160a01b03169163b257da45916004808301926020929190829003018186803b15801561175957600080fd5b505afa15801561176d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061179191906131f8565b9050600081116117f25760405162461bcd60e51b815260206004820152602660248201527f627573696e6573733a616c6c206a757261546f6b656e20686164206265656e206044820152651b5a5b9d195960d21b6064820152608401610b47565b808211156117fe578091505b60006118086120c4565b6001600160a01b03811660009081526018602052604090205490915061182e908461222c565b6001600160a01b03821660009081526018602090815260408083209390935560199052205461185d908461222c565b6001600160a01b038083166000908152601960209081526040808320949094556017905291909120439055601454166340c10f196118996120c4565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101869052604401600060405180830381600087803b1580156118e157600080fd5b505af11580156118f5573d6000803e3d6000fd5b50505050505050565b606060018054610a4f906134c3565b6119156120c4565b6001600160a01b0316611930600d546001600160a01b031690565b6001600160a01b0316146119565760405162461bcd60e51b8152600401610b47906133af565b806119a35760405162461bcd60e51b815260206004820152601e60248201527f706172616d206572726f723a206d6574612055524920697320656d70747900006044820152606401610b47565b610c8f60108383612e2a565b6119b76120c4565b6001600160a01b0316826001600160a01b03161415611a185760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b47565b8060056000611a256120c4565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155611a696120c4565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611aa5911515815260200190565b60405180910390a35050565b611ab96120c4565b6001600160a01b0316611ad4600d546001600160a01b031690565b6001600160a01b031614611afa5760405162461bcd60e51b8152600401610b47906133af565b438111611b675760405162461bcd60e51b815260206004820152603560248201527f706172616d206572726f723a20626567696e20686569676874206d757374203e6044820152740818dd5c9c995b9d08189b1bd8dac81a195a59da1d605a1b6064820152608401610b47565b601555565b611b746120c4565b6001600160a01b0316611b8f600d546001600160a01b031690565b6001600160a01b031614611bb55760405162461bcd60e51b8152600401610b47906133af565b601255565b611bcb611bc56120c4565b8361223f565b611be75760405162461bcd60e51b8152600401610b47906133e4565b611bf384848484612559565b50505050565b6000828152601660209081526040808320546001600160a01b038516845260179092528220548281831015611c2e5781611c30565b825b905043811580611c3f57508082115b15611c51576000945050505050610a3a565b611c5b8282613480565b945050505050610a3a565b6060611c70611ca0565b611c798361258c565b604051602001611c8a9291906132b3565b6040516020818303038152906040529050919050565b6060611d60604051806040016040528060098152602001686170692f6a7572612f60b81b81525060108054611cd4906134c3565b80601f0160208091040260200160405190810160405280929190818152602001828054611d00906134c3565b8015611d4d5780601f10611d2257610100808354040283529160200191611d4d565b820191906000526020600020905b815481529060010190602001808311611d3057829003601f168201915b50505050506126a690919063ffffffff16565b905090565b600080611d71846108fa565b90506000611d7f8585611bf9565b905060006011548284611d929190613461565b611d9c9190613461565b9050611da9816064612840565b9695505050505050565b6060600060108054611dc4906134c3565b80601f0160208091040260200160405190810160405280929190818152602001828054611df0906134c3565b8015611e3d5780601f10611e1257610100808354040283529160200191611e3d565b820191906000526020600020905b815481529060010190602001808311611e2057829003601f168201915b505060408051808201909152601881527f6170692f636f6e74726163742f6a757261737369636e667400000000000000006020820152939450611e8692508491508390506126a6565b9250505090565b600e5460405163c455279160e01b81526001600160a01b03848116600483015260009281169190841690829063c45527919060240160206040518083038186803b158015611eda57600080fd5b505afa158015611eee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f129190613157565b6001600160a01b03161415611f2b576001915050610a3a565b6001600160a01b0380851660009081526005602090815260408083209387168352929052205460ff165b949350505050565b611f656120c4565b6001600160a01b0316611f80600d546001600160a01b031690565b6001600160a01b031614611fa65760405162461bcd60e51b8152600401610b47906133af565b6001600160a01b03811661200b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b47565b61201481612391565b50565b60003330141561206e57600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b031691506120719050565b50335b90565b60006001600160e01b031982166380ac58cd60e01b14806120a557506001600160e01b03198216635b5e139f60e01b145b80610a3a57506301ffc9a760e01b6001600160e01b0319831614610a3a565b6000611d60612017565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061210382611123565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006001600160a01b0386166121a25760405162461bcd60e51b815260206004820152602560248201527f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360448201526424a3a722a960d91b6064820152608401610b47565b60016121b56121b08761284c565b6128c9565b6040805160008152602081018083529290925260ff851690820152606081018690526080810185905260a0016020604051602081039080840390855afa158015612203573d6000803e3d6000fd5b505050602060405103516001600160a01b0316866001600160a01b031614905095945050505050565b60006122388284613435565b9392505050565b6000818152600260205260408120546001600160a01b03166122b85760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b47565b60006122c383611123565b9050806001600160a01b0316846001600160a01b031614806122fe5750836001600160a01b03166122f384610ad2565b6001600160a01b0316145b80611f555750611f558185611e8d565b6123188184611d65565b6001600160a01b03841660009081526018602052604081208054909190612340908490613435565b9091555061235190508383836128f9565b60009081526016602052604090204390555050565b60006122388284613480565b60008061237d6123e3565b905061238983826123f4565b610a3a612542565b600d80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600f54600090611d6090600161222c565b6001600160a01b03821661244a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b47565b6000818152600260205260409020546001600160a01b0316156124af5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b47565b6124bb60008383612aa4565b6001600160a01b03821660009081526003602052604081208054600192906124e4908490613435565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600f8054906000612552836134fe565b9190505550565b61256484848461230e565b61257084848484612b5c565b611bf35760405162461bcd60e51b8152600401610b479061335d565b6060816125b05750506040805180820190915260018152600360fc1b602082015290565b8160005b81156125da57806125c4816134fe565b91506125d39050600a8361344d565b91506125b4565b60008167ffffffffffffffff81111561260357634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561262d576020820181803683370190505b5090505b8415611f5557612642600183613480565b915061264f600a86613519565b61265a906030613435565b60f81b81838151811061267d57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061269f600a8661344d565b9450612631565b80518251606091849184916000916126be9190613435565b67ffffffffffffffff8111156126e457634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561270e576020820181803683370190505b509050806000805b85518210156127a25785828151811061273f57634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b0319168382612759816134fe565b93508151811061277957634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053508161279a816134fe565b925050612716565b600091505b8451821015612833578482815181106127d057634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b03191683826127ea816134fe565b93508151811061280a57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053508161282b816134fe565b9250506127a7565b5090979650505050505050565b6000612238828461344d565b600060405180608001604052806043815260200161359b60439139805160209182012083518483015160408087015180519086012090516128ac950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b60006128d4600b5490565b60405161190160f01b60208201526022810191909152604281018390526062016128ac565b826001600160a01b031661290c82611123565b6001600160a01b0316146129745760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610b47565b6001600160a01b0382166129d65760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610b47565b6129e1838383612aa4565b6129ec6000826120ce565b6001600160a01b0383166000908152600360205260408120805460019290612a15908490613480565b90915550506001600160a01b0382166000908152600360205260408120805460019290612a43908490613435565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b038316612aff57612afa81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612b22565b816001600160a01b0316836001600160a01b031614612b2257612b228382612c70565b6001600160a01b038216612b3957610c8f81612d0d565b826001600160a01b0316826001600160a01b031614610c8f57610c8f8282612de6565b60006001600160a01b0384163b15612c6557836001600160a01b031663150b7a02612b856120c4565b8786866040518563ffffffff1660e01b8152600401612ba79493929190613317565b602060405180830381600087803b158015612bc157600080fd5b505af1925050508015612bf1575060408051601f3d908101601f19168201909252612bee9181019061313b565b60015b612c4b573d808015612c1f576040519150601f19603f3d011682016040523d82523d6000602084013e612c24565b606091505b508051612c435760405162461bcd60e51b8152600401610b479061335d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611f55565b506001949350505050565b60006001612c7d846113e4565b612c879190613480565b600083815260076020526040902054909150808214612cda576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612d1f90600190613480565b60008381526009602052604081205460088054939450909284908110612d5557634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060088381548110612d8457634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612dca57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612df1836113e4565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054612e36906134c3565b90600052602060002090601f016020900481019282612e585760008555612e9e565b82601f10612e715782800160ff19823516178555612e9e565b82800160010185558215612e9e579182015b82811115612e9e578235825591602001919060010190612e83565b50612eaa929150612eae565b5090565b5b80821115612eaa5760008155600101612eaf565b600082601f830112612ed3578081fd5b813567ffffffffffffffff80821115612eee57612eee613559565b604051601f8301601f19908116603f01168101908282118183101715612f1657612f16613559565b81604052838152866020858801011115612f2e578485fd5b8360208701602083013792830160200193909352509392505050565b600060208284031215612f5b578081fd5b81356122388161356f565b60008060408385031215612f78578081fd5b8235612f838161356f565b91506020830135612f938161356f565b809150509250929050565b600080600060608486031215612fb2578081fd5b8335612fbd8161356f565b92506020840135612fcd8161356f565b929592945050506040919091013590565b60008060008060808587031215612ff3578081fd5b8435612ffe8161356f565b9350602085013561300e8161356f565b925060408501359150606085013567ffffffffffffffff811115613030578182fd5b61303c87828801612ec3565b91505092959194509250565b6000806040838503121561305a578182fd5b82356130658161356f565b915060208301358015158114612f93578182fd5b600080600080600060a08688031215613090578081fd5b853561309b8161356f565b9450602086013567ffffffffffffffff8111156130b6578182fd5b6130c288828901612ec3565b9450506040860135925060608601359150608086013560ff811681146130e6578182fd5b809150509295509295909350565b60008060408385031215613106578182fd5b82356131118161356f565b946020939093013593505050565b600060208284031215613130578081fd5b813561223881613584565b60006020828403121561314c578081fd5b815161223881613584565b600060208284031215613168578081fd5b81516122388161356f565b60008060208385031215613185578081fd5b823567ffffffffffffffff8082111561319c578283fd5b818501915085601f8301126131af578283fd5b8135818111156131bd578384fd5b8660208285010111156131ce578384fd5b60209290920196919550909350505050565b6000602082840312156131f1578081fd5b5035919050565b600060208284031215613209578081fd5b5051919050565b60008060408385031215613222578182fd5b823591506020830135612f938161356f565b6000815180845261324c816020860160208601613497565b601f01601f19169290920160200192915050565b60008251613272818460208701613497565b9190910192915050565b6000835161328e818460208801613497565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b600083516132c5818460208801613497565b8351908301906132d9818360208801613497565b01949350505050565b6001600160a01b0384811682528316602082015260606040820181905260009061330e90830184613234565b95945050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611da990830184613234565b6020815260006122386020830184613234565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600082198211156134485761344861352d565b500190565b60008261345c5761345c613543565b500490565b600081600019048311821515161561347b5761347b61352d565b500290565b6000828210156134925761349261352d565b500390565b60005b838110156134b257818101518382015260200161349a565b83811115611bf35750506000910152565b600181811c908216806134d757607f821691505b602082108114156134f857634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156135125761351261352d565b5060010190565b60008261352857613528613543565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461201457600080fd5b6001600160e01b03198116811461201457600080fdfe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a2646970667358221220854415d6eacb72e57dd35d06a4af09626f90c98d25bd377b027ac77579009dc664736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c10000000000000000000000001d5c5705385f71a6861645f83e5d83932145b5b3
-----Decoded View---------------
Arg [0] : _proxyRegistryAddress (address): 0xa5409ec958C83C3f309868babACA7c86DCB077c1
Arg [1] : _juraToken (address): 0x1D5C5705385f71A6861645f83e5D83932145B5b3
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1
Arg [1] : 0000000000000000000000001d5c5705385f71a6861645f83e5d83932145b5b3
Deployed Bytecode Sourcemap
65139:7085:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70990:896;;;;;;;;;;-1:-1:-1;70990:896:0;;;;;:::i;:::-;;:::i;:::-;;;10205:25:1;;;10193:2;10178:18;70990:896:0;;;;;;;;36206:300;;;;;;;;;;-1:-1:-1;36206:300:0;;;;;:::i;:::-;;:::i;:::-;;;10032:14:1;;10025:22;10007:41;;9995:2;9980:18;36206:300:0;9962:92:1;65654:58:0;;;;;;;;;;-1:-1:-1;65654:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;22400:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;24093:308::-;;;;;;;;;;-1:-1:-1;24093:308:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8615:32:1;;;8597:51;;8585:2;8570:18;24093:308:0;8552:102:1;23616:411:0;;;;;;;;;;-1:-1:-1;23616:411:0;;;;;:::i;:::-;;:::i;:::-;;58946:1151;;;;;;:::i;:::-;;:::i;56128:43::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;56128:43:0;;;;;37009:113;;;;;;;;;;-1:-1:-1;37097:10:0;:17;37009:113;;57123:101;;;;;;;;;;-1:-1:-1;57201:15:0;;57123:101;;25152:376;;;;;;;;;;-1:-1:-1;25152:376:0;;;;;:::i;:::-;;:::i;65756:42::-;;;;;;;;;;-1:-1:-1;65756:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;60523:107;;;;;;;;;;-1:-1:-1;60523:107:0;;;;;:::i;:::-;-1:-1:-1;;;;;60610:12:0;60576:13;60610:12;;;:6;:12;;;;;;;60523:107;36590:343;;;;;;;;;;-1:-1:-1;36590:343:0;;;;;:::i;:::-;;:::i;68843:103::-;;;;;;;;;;-1:-1:-1;68843:103:0;;;;;:::i;:::-;;:::i;57232:161::-;;;;;;;;;;-1:-1:-1;57346:9:0;57232:161;;69472:213;;;;;;;;;;;;;:::i;68390:116::-;;;;;;;;;;-1:-1:-1;68390:116:0;;;;;:::i;:::-;;:::i;25599:185::-;;;;;;;;;;-1:-1:-1;25599:185:0;;;;;:::i;:::-;;:::i;37199:320::-;;;;;;;;;;-1:-1:-1;37199:320:0;;;;;:::i;:::-;;:::i;22007:326::-;;;;;;;;;;-1:-1:-1;22007:326:0;;;;;:::i;:::-;;:::i;66307:728::-;;;;;;:::i;:::-;;:::i;65251:21::-;;;;;;;;;;;;;:::i;65331:39::-;;;;;;;;;;;;;;;;21650:295;;;;;;;;;;-1:-1:-1;21650:295:0;;;;;:::i;:::-;;:::i;44265:94::-;;;;;;;;;;;;;:::i;62741:166::-;;;;;;;;;;-1:-1:-1;62741:166:0;;;;;:::i;:::-;;:::i;68618:217::-;;;;;;;;;;-1:-1:-1;68618:217:0;;;;;:::i;:::-;;:::i;65884:42::-;;;;;;;;;;-1:-1:-1;65884:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;69693:399;;;;;;;;;;-1:-1:-1;69693:399:0;;;;;:::i;:::-;;:::i;67043:860::-;;;;;;;;;;;;;:::i;65377:24::-;;;;;;;;;;-1:-1:-1;65377:24:0;;;;-1:-1:-1;;;;;65377:24:0;;;43614:87;;;;;;;;;;-1:-1:-1;43687:6:0;;-1:-1:-1;;;;;43687:6:0;43614:87;;22569:104;;;;;;;;;;;;;:::i;68202:180::-;;;;;;;;;;-1:-1:-1;68202:180:0;;;;;:::i;:::-;;:::i;24473:327::-;;;;;;;;;;-1:-1:-1;24473:327:0;;;;;:::i;:::-;;:::i;65408:27::-;;;;;;;;;;-1:-1:-1;65408:27:0;;;;-1:-1:-1;;;;;65408:27:0;;;68954:248;;;;;;;;;;-1:-1:-1;68954:248:0;;;;;:::i;:::-;;:::i;68514:96::-;;;;;;;;;;-1:-1:-1;68514:96:0;;;;;:::i;:::-;;:::i;25855:365::-;;;;;;;;;;-1:-1:-1;25855:365:0;;;;;:::i;:::-;;:::i;70455:527::-;;;;;;;;;;-1:-1:-1;70455:527:0;;;;;:::i;:::-;;:::i;63610:261::-;;;;;;;;;;-1:-1:-1;63610:261:0;;;;;:::i;:::-;;:::i;65442:33::-;;;;;;;;;;;;;;;;65535:57;;;;;;;;;;-1:-1:-1;65535:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;71894:122;;;;;;;;;;;;;:::i;70100:347::-;;;;;;;;;;-1:-1:-1;70100:347:0;;;;;:::i;:::-;;:::i;72024:197::-;;;;;;;;;;;;;:::i;64003:445::-;;;;;;;;;;-1:-1:-1;64003:445:0;;;;;:::i;:::-;;:::i;65279:45::-;;;;;;;;;;;;;;;;44514:229;;;;;;;;;;-1:-1:-1;44514:229:0;;;;;:::i;:::-;;:::i;70990:896::-;71056:7;71091:1;71080:8;:12;:30;;;;;71108:2;71096:8;:14;;71080:30;71076:73;;;-1:-1:-1;71134:3:0;;70990:896;-1:-1:-1;70990:896:0:o;71076:73::-;71177:8;71189:2;71177:14;:46;;;;71208:8;71220:3;71208:15;71177:46;:78;;;;71240:8;71252:3;71240:15;71177:78;:110;;;;71272:8;71284:3;71272:15;71177:110;:142;;;;71304:8;71316:3;71304:15;71177:142;:174;;;;71336:8;71348:3;71336:15;71177:174;:206;;;;71368:8;71380:3;71368:15;71177:206;:238;;;;71400:8;71412:3;71400:15;71177:238;:270;;;;71432:8;71444:3;71432:15;71177:270;:302;;;;71464:8;71476:3;71464:15;71177:302;:335;;;;71496:8;71508:4;71496:16;71177:335;:368;;;;71529:8;71541:4;71529:16;71177:368;:401;;;;71562:8;71574:4;71562:16;71177:401;:434;;;;71595:8;71607:4;71595:16;71177:434;:467;;;;71628:8;71640:4;71628:16;71177:467;:500;;;;71661:8;71673:4;71661:16;71177:500;:533;;;;71694:8;71706:4;71694:16;71177:533;:566;;;;71727:8;71739:4;71727:16;71177:566;:599;;;;71760:8;71772:4;71760:16;71177:599;:632;;;;71793:8;71805:4;71793:16;71177:632;71159:699;;;-1:-1:-1;71843:3:0;;70990:896;-1:-1:-1;70990:896:0:o;71159:699::-;-1:-1:-1;71875:3:0;;70990:896;-1:-1:-1;70990:896:0:o;36206:300::-;36353:4;-1:-1:-1;;;;;;36395:50:0;;-1:-1:-1;;;36395:50:0;;:103;;;36462:36;36486:11;36462:23;:36::i;:::-;36375:123;36206:300;-1:-1:-1;;36206:300:0:o;22400:100::-;22454:13;22487:5;22480:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22400:100;:::o;24093:308::-;24214:7;27856:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27856:16:0;24239:110;;;;-1:-1:-1;;;24239:110:0;;18568:2:1;24239:110:0;;;18550:21:1;18607:2;18587:18;;;18580:30;18646:34;18626:18;;;18619:62;-1:-1:-1;;;18697:18:1;;;18690:42;18749:19;;24239:110:0;;;;;;;;;-1:-1:-1;24369:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24369:24:0;;24093:308::o;23616:411::-;23697:13;23713:23;23728:7;23713:14;:23::i;:::-;23697:39;;23761:5;-1:-1:-1;;;;;23755:11:0;:2;-1:-1:-1;;;;;23755:11:0;;;23747:57;;;;-1:-1:-1;;;23747:57:0;;20154:2:1;23747:57:0;;;20136:21:1;20193:2;20173:18;;;20166:30;20232:34;20212:18;;;20205:62;-1:-1:-1;;;20283:18:1;;;20276:31;20324:19;;23747:57:0;20126:223:1;23747:57:0;23855:5;-1:-1:-1;;;;;23839:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;23839:21:0;;:62;;;;23864:37;23881:5;23888:12;:10;:12::i;23864:37::-;23817:168;;;;-1:-1:-1;;;23817:168:0;;16602:2:1;23817:168:0;;;16584:21:1;16641:2;16621:18;;;16614:30;16680:34;16660:18;;;16653:62;16751:26;16731:18;;;16724:54;16795:19;;23817:168:0;16574:246:1;23817:168:0;23998:21;24007:2;24011:7;23998:8;:21::i;:::-;23616:411;;;:::o;58946:1151::-;59204:152;;;59147:12;59204:152;;;;;-1:-1:-1;;;;;59242:19:0;;59172:29;59242:19;;;:6;:19;;;;;;;;;59204:152;;;;;;;;;;;59391:45;59249:11;59204:152;59419:4;59425;59431;59391:6;:45::i;:::-;59369:128;;;;-1:-1:-1;;;59369:128:0;;19752:2:1;59369:128:0;;;19734:21:1;19791:2;19771:18;;;19764:30;19830:34;19810:18;;;19803:62;-1:-1:-1;;;19881:18:1;;;19874:31;19922:19;;59369:128:0;19724:223:1;59369:128:0;-1:-1:-1;;;;;59586:19:0;;;;;;:6;:19;;;;;;:26;;59610:1;59586:23;:26::i;:::-;-1:-1:-1;;;;;59564:19:0;;;;;;:6;:19;;;;;;;:48;;;;59630:126;;;;;59571:11;;59702:10;;59728:17;;59630:126;:::i;:::-;;;;;;;;59867:12;59881:23;59916:4;-1:-1:-1;;;;;59908:18:0;59958:17;59977:11;59941:48;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;59941:48:0;;;;;;;;;;59908:92;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59866:134;;;;60019:7;60011:48;;;;-1:-1:-1;;;60011:48:0;;13953:2:1;60011:48:0;;;13935:21:1;13992:2;13972:18;;;13965:30;14031;14011:18;;;14004:58;14079:18;;60011:48:0;13925:178:1;60011:48:0;60079:10;58946:1151;-1:-1:-1;;;;;;;;58946:1151:0:o;25152:376::-;25361:41;25380:12;:10;:12::i;:::-;25394:7;25361:18;:41::i;:::-;25339:140;;;;-1:-1:-1;;;25339:140:0;;;;;;;:::i;:::-;25492:28;25502:4;25508:2;25512:7;25492:9;:28::i;36590:343::-;36732:7;36787:23;36804:5;36787:16;:23::i;:::-;36779:5;:31;36757:124;;;;-1:-1:-1;;;36757:124:0;;11941:2:1;36757:124:0;;;11923:21:1;11980:2;11960:18;;;11953:30;12019:34;11999:18;;;11992:62;-1:-1:-1;;;12070:18:1;;;12063:41;12121:19;;36757:124:0;11913:233:1;36757:124:0;-1:-1:-1;;;;;;36899:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;36590:343::o;68843:103::-;43845:12;:10;:12::i;:::-;-1:-1:-1;;;;;43834:23:0;:7;43687:6;;-1:-1:-1;;;;;43687:6:0;;43614:87;43834:7;-1:-1:-1;;;;;43834:23:0;;43826:68;;;;-1:-1:-1;;;43826:68:0;;;;;;;:::i;:::-;68916:9:::1;:22:::0;;-1:-1:-1;;;;;;68916:22:0::1;-1:-1:-1::0;;;;;68916:22:0;;;::::1;::::0;;;::::1;::::0;;68843:103::o;69472:213::-;69530:7;69550:14;69567:12;:10;:12::i;:::-;-1:-1:-1;;;;;69661:15:0;;;;;;:7;:15;;;;;;69550:29;;-1:-1:-1;69610:67:0;;:46;69632:23;69550:29;69632:15;:23::i;:::-;-1:-1:-1;;;;;69611:15:0;;;;;;:7;:15;;;;;;;69610:21;:46::i;:::-;:50;;:67::i;:::-;69590:87;;;69472:213;:::o;68390:116::-;43845:12;:10;:12::i;:::-;-1:-1:-1;;;;;43834:23:0;:7;43687:6;;-1:-1:-1;;;;;43687:6:0;;43614:87;43834:7;-1:-1:-1;;;;;43834:23:0;;43826:68;;;;-1:-1:-1;;;43826:68:0;;;;;;;:::i;:::-;68468:13:::1;:30:::0;68390:116::o;25599:185::-;25737:39;25754:4;25760:2;25764:7;25737:39;;;;;;;;;;;;:16;:39::i;37199:320::-;37319:7;37374:30;37097:10;:17;;37009:113;37374:30;37366:5;:38;37344:132;;;;-1:-1:-1;;;37344:132:0;;22556:2:1;37344:132:0;;;22538:21:1;22595:2;22575:18;;;22568:30;22634:34;22614:18;;;22607:62;-1:-1:-1;;;22685:18:1;;;22678:42;22737:19;;37344:132:0;22528:234:1;37344:132:0;37494:10;37505:5;37494:17;;;;;;-1:-1:-1;;;37494:17:0;;;;;;;;;;;;;;;;;37487:24;;37199:320;;;:::o;22007:326::-;22124:7;22165:16;;;:7;:16;;;;;;-1:-1:-1;;;;;22165:16:0;22214:19;22192:110;;;;-1:-1:-1;;;22192:110:0;;17797:2:1;22192:110:0;;;17779:21:1;17836:2;17816:18;;;17809:30;17875:34;17855:18;;;17848:62;-1:-1:-1;;;17926:18:1;;;17919:39;17975:19;;22192:110:0;17769:231:1;66307:728:0;66402:1;66392:7;:11;:28;;;;;66418:2;66407:7;:13;;66392:28;66370:120;;;;-1:-1:-1;;;66370:120:0;;22145:2:1;66370:120:0;;;22127:21:1;22184:2;22164:18;;;22157:30;22223:34;22203:18;;;22196:62;-1:-1:-1;;;22274:18:1;;;22267:40;22324:19;;66370:120:0;22117:232:1;66370:120:0;66501:17;66532:7;66521:8;;:18;;;;:::i;:::-;66501:38;;66571:9;66558;:22;;66550:66;;;;-1:-1:-1;;;66550:66:0;;13186:2:1;66550:66:0;;;13168:21:1;13225:2;13205:18;;;13198:30;13264:33;13244:18;;;13237:61;13315:18;;66550:66:0;13158:181:1;66550:66:0;66649:9;;-1:-1:-1;;;;;66649:9:0;66627:118;;;;-1:-1:-1;;;66627:118:0;;12353:2:1;66627:118:0;;;12335:21:1;12392:2;12372:18;;;12365:30;12431:34;12411:18;;;12404:62;-1:-1:-1;;;12482:18:1;;;12475:43;12535:19;;66627:118:0;12325:235:1;66627:118:0;66764:9;;66756:38;;-1:-1:-1;;;;;66764:9:0;;;;66756:38;;;;;66784:9;;66764;66756:38;66764:9;66756:38;66784:9;66764;66756:38;;;;;;;;;;;;;;;;;;;;;66868:9;66863:165;66887:7;66883:1;:11;66863:165;;;66916:15;66934:21;66942:12;:10;:12::i;:::-;66934:7;:21::i;:::-;66970:31;;;;:22;:31;;;;;67004:12;66970:46;;-1:-1:-1;66896:3:0;;;;:::i;:::-;;;;66863:165;;65251:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21650:295::-;21767:7;-1:-1:-1;;;;;21814:19:0;;21792:111;;;;-1:-1:-1;;;21792:111:0;;17386:2:1;21792:111:0;;;17368:21:1;17425:2;17405:18;;;17398:30;17464:34;17444:18;;;17437:62;-1:-1:-1;;;17515:18:1;;;17508:40;17565:19;;21792:111:0;17358:232:1;21792:111:0;-1:-1:-1;;;;;;21921:16:0;;;;;:9;:16;;;;;;;21650:295::o;44265:94::-;43845:12;:10;:12::i;:::-;-1:-1:-1;;;;;43834:23:0;:7;43687:6;;-1:-1:-1;;;;;43687:6:0;;43614:87;43834:7;-1:-1:-1;;;;;43834:23:0;;43826:68;;;;-1:-1:-1;;;43826:68:0;;;;;;;:::i;:::-;44330:21:::1;44348:1;44330:9;:21::i;:::-;44265:94::o:0;62741:166::-;43845:12;:10;:12::i;:::-;-1:-1:-1;;;;;43834:23:0;:7;43687:6;;-1:-1:-1;;;;;43687:6:0;;43614:87;43834:7;-1:-1:-1;;;;;43834:23:0;;43826:68;;;;-1:-1:-1;;;43826:68:0;;;;;;;:::i;:::-;62798:18:::1;62819:17;:15;:17::i;:::-;62798:38;;62847:22;62853:3;62858:10;62847:5;:22::i;:::-;62880:19;:17;:19::i;:::-;43905:1;62741:166:::0;:::o;68618:217::-;43845:12;:10;:12::i;:::-;-1:-1:-1;;;;;43834:23:0;:7;43687:6;;-1:-1:-1;;;;;43687:6:0;;43614:87;43834:7;-1:-1:-1;;;;;43834:23:0;;43826:68;;;;-1:-1:-1;;;43826:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;68707:21:0;::::1;68685:112;;;::::0;-1:-1:-1;;;68685:112:0;;20556:2:1;68685:112:0::1;::::0;::::1;20538:21:1::0;20595:2;20575:18;;;20568:30;20634:34;20614:18;;;20607:62;-1:-1:-1;;;20685:18:1;;;20678:39;20734:19;;68685:112:0::1;20528:231:1::0;68685:112:0::1;68808:9;:19:::0;;-1:-1:-1;;;;;;68808:19:0::1;-1:-1:-1::0;;;;;68808:19:0;;;::::1;::::0;;;::::1;::::0;;68618:217::o;69693:399::-;69756:7;69776:15;69794:18;69804:7;69794:9;:18::i;:::-;69776:36;-1:-1:-1;69827:12:0;69823:26;;-1:-1:-1;69848:1:0;;69693:399;-1:-1:-1;;69693:399:0:o;69823:26::-;69860:11;69891:9;69886:178;69910:7;69906:1;:11;69886:178;;;69939:15;69957:31;69977:7;69986:1;69957:19;:31::i;:::-;69939:49;;70009:43;70017:34;70034:7;70043;70017:16;:34::i;:::-;70009:3;;:7;:43::i;:::-;70003:49;;69886:178;69919:3;;;;;:::i;:::-;;;;69886:178;;;-1:-1:-1;70081:3:0;69693:399;-1:-1:-1;;;69693:399:0:o;67043:860::-;67083:14;67100:27;:25;:27::i;:::-;67083:44;;67155:1;67146:6;:10;67138:51;;;;-1:-1:-1;;;67138:51:0;;15839:2:1;67138:51:0;;;15821:21:1;15878:2;15858:18;;;15851:30;15917;15897:18;;;15890:58;15965:18;;67138:51:0;15811:178:1;67138:51:0;67309:18;;67293:12;:34;;67271:109;;;;-1:-1:-1;;;67271:109:0;;21791:2:1;67271:109:0;;;21773:21:1;21830:2;21810:18;;;21803:30;21869:27;21849:18;;;21842:55;21914:18;;67271:109:0;21763:175:1;67271:109:0;67416:9;;:26;;;-1:-1:-1;;;67416:26:0;;;;67391:22;;-1:-1:-1;;;;;67416:9:0;;:24;;:26;;;;;;;;;;;;;;:9;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67391:51;;67478:1;67461:14;:18;67453:69;;;;-1:-1:-1;;;67453:69:0;;20966:2:1;67453:69:0;;;20948:21:1;21005:2;20985:18;;;20978:30;21044:34;21024:18;;;21017:62;-1:-1:-1;;;21095:18:1;;;21088:36;21141:19;;67453:69:0;20938:228:1;67453:69:0;67546:14;67537:6;:23;67533:79;;;67586:14;67577:23;;67533:79;67622:14;67639:12;:10;:12::i;:::-;-1:-1:-1;;;;;67680:15:0;;;;;;:7;:15;;;;;;67622:29;;-1:-1:-1;67680:27:0;;67700:6;67680:19;:27::i;:::-;-1:-1:-1;;;;;67662:15:0;;;;;;:7;:15;;;;;;;;:45;;;;67736:7;:15;;;;:27;;67756:6;67736:19;:27::i;:::-;-1:-1:-1;;;;;67718:15:0;;;;;;;:7;:15;;;;;;;;:45;;;;67774:23;:31;;;;;;67808:12;67774:46;;67859:9;;;:14;67874:12;:10;:12::i;:::-;67859:36;;-1:-1:-1;;;;;;67859:36:0;;;;;;;-1:-1:-1;;;;;9780:32:1;;;67859:36:0;;;9762:51:1;9829:18;;;9822:34;;;9735:18;;67859:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67043:860;;;:::o;22569:104::-;22625:13;22658:7;22651:14;;;;;:::i;68202:180::-;43845:12;:10;:12::i;:::-;-1:-1:-1;;;;;43834:23:0;:7;43687:6;;-1:-1:-1;;;;;43687:6:0;;43614:87;43834:7;-1:-1:-1;;;;;43834:23:0;;43826:68;;;;-1:-1:-1;;;43826:68:0;;;;;;;:::i;:::-;68284:26;68276:69:::1;;;::::0;-1:-1:-1;;;68276:69:0;;17027:2:1;68276:69:0::1;::::0;::::1;17009:21:1::0;17066:2;17046:18;;;17039:30;17105:32;17085:18;;;17078:60;17155:18;;68276:69:0::1;16999:180:1::0;68276:69:0::1;68356:18;:7;68366:8:::0;;68356:18:::1;:::i;24473:327::-:0;24620:12;:10;:12::i;:::-;-1:-1:-1;;;;;24608:24:0;:8;-1:-1:-1;;;;;24608:24:0;;;24600:62;;;;-1:-1:-1;;;24600:62:0;;15072:2:1;24600:62:0;;;15054:21:1;15111:2;15091:18;;;15084:30;15150:27;15130:18;;;15123:55;15195:18;;24600:62:0;15044:175:1;24600:62:0;24720:8;24675:18;:32;24694:12;:10;:12::i;:::-;-1:-1:-1;;;;;24675:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;24675:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;24675:53:0;;;;;;;;;;;24759:12;:10;:12::i;:::-;-1:-1:-1;;;;;24744:48:0;;24783:8;24744:48;;;;10032:14:1;10025:22;10007:41;;9995:2;9980:18;;9962:92;24744:48:0;;;;;;;;24473:327;;:::o;68954:248::-;43845:12;:10;:12::i;:::-;-1:-1:-1;;;;;43834:23:0;:7;43687:6;;-1:-1:-1;;;;;43687:6:0;;43614:87;43834:7;-1:-1:-1;;;;;43834:23:0;;43826:68;;;;-1:-1:-1;;;43826:68:0;;;;;;;:::i;:::-;69062:12:::1;69052:7;:22;69030:125;;;::::0;-1:-1:-1;;;69030:125:0;;22969:2:1;69030:125:0::1;::::0;::::1;22951:21:1::0;23008:2;22988:18;;;22981:30;23047:34;23027:18;;;23020:62;-1:-1:-1;;;23098:18:1;;;23091:51;23159:19;;69030:125:0::1;22941:243:1::0;69030:125:0::1;69166:18;:28:::0;68954:248::o;68514:96::-;43845:12;:10;:12::i;:::-;-1:-1:-1;;;;;43834:23:0;:7;43687:6;;-1:-1:-1;;;;;43687:6:0;;43614:87;43834:7;-1:-1:-1;;;;;43834:23:0;;43826:68;;;;-1:-1:-1;;;43826:68:0;;;;;;;:::i;:::-;68582:8:::1;:20:::0;68514:96::o;25855:365::-;26044:41;26063:12;:10;:12::i;:::-;26077:7;26044:18;:41::i;:::-;26022:140;;;;-1:-1:-1;;;26022:140:0;;;;;;;:::i;:::-;26173:39;26187:4;26193:2;26197:7;26206:5;26173:13;:39::i;:::-;25855:365;;;;:::o;70455:527::-;70564:7;70607:32;;;:22;:32;;;;;;;;;-1:-1:-1;;;;;70668:32:0;;;;:23;:32;;;;;;70564:7;70733:18;;;;:38;;70764:7;70733:38;;;70754:7;70733:38;70711:60;-1:-1:-1;70803:12:0;70830:16;;;:44;;;70864:10;70850:11;:24;70830:44;70826:149;;;70898:1;70891:8;;;;;;;;70826:149;70939:24;70952:11;70939:10;:24;:::i;:::-;70932:31;;;;;;;;63610:261;63712:13;63805:14;:12;:14::i;:::-;63821:26;63838:8;63821:16;:26::i;:::-;63788:60;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63743:120;;63610:261;;;:::o;71894:122::-;71948:13;71981:27;;;;;;;;;;;;;;-1:-1:-1;;;71981:27:0;;;:7;:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:27;;;;:::i;:::-;71974:34;;71894:122;:::o;70100:347::-;70209:7;70234:13;70250:27;70268:8;70250:17;:27::i;:::-;70234:43;;70288:15;70306:35;70323:8;70333:7;70306:16;:35::i;:::-;70288:53;;70352:9;70382:13;;70372:7;70364:5;:15;;;;:::i;:::-;:31;;;;:::i;:::-;70352:43;-1:-1:-1;70410:10:0;70352:43;70416:3;70410:5;:10::i;:::-;70406:14;70100:347;-1:-1:-1;;;;;;70100:347:0:o;72024:197::-;72068:13;72094:18;72115:7;72094:28;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;72133:46:0;;;;;;;;;;;;;;;;;72094:28;;-1:-1:-1;72197:16:0;;-1:-1:-1;72094:28:0;;-1:-1:-1;72133:46:0;;-1:-1:-1;72197:11:0;:16::i;:::-;72190:23;;;;72024:197;:::o;64003:445::-;64257:20;;64301:28;;-1:-1:-1;;;64301:28:0;;-1:-1:-1;;;;;8615:32:1;;;64301:28:0;;;8597:51:1;64128:4:0;;64257:20;;;64293:49;;;;64257:20;;64301:21;;8570:18:1;;64301:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;64293:49:0;;64289:93;;;64366:4;64359:11;;;;;64289:93;-1:-1:-1;;;;;25042:25:0;;;25013:4;25042:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;64401:39;64394:46;64003:445;-1:-1:-1;;;;64003:445:0:o;44514:229::-;43845:12;:10;:12::i;:::-;-1:-1:-1;;;;;43834:23:0;:7;43687:6;;-1:-1:-1;;;;;43687:6:0;;43614:87;43834:7;-1:-1:-1;;;;;43834:23:0;;43826:68;;;;-1:-1:-1;;;43826:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44617:22:0;::::1;44595:110;;;::::0;-1:-1:-1;;;44595:110:0;;13546:2:1;44595:110:0::1;::::0;::::1;13528:21:1::0;13585:2;13565:18;;;13558:30;13624:34;13604:18;;;13597:62;-1:-1:-1;;;13675:18:1;;;13668:36;13721:19;;44595:110:0::1;13518:228:1::0;44595:110:0::1;44716:19;44726:8;44716:9;:19::i;:::-;44514:229:::0;:::o;55015:618::-;55059:22;55098:10;55120:4;55098:27;55094:508;;;55142:18;55163:8;;55142:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;55202:8:0;55413:17;55407:24;-1:-1:-1;;;;;55381:134:0;;-1:-1:-1;55241:289:0;;-1:-1:-1;55241:289:0;;-1:-1:-1;55579:10:0;55094:508;55015:618;:::o;21231:355::-;21378:4;-1:-1:-1;;;;;;21420:40:0;;-1:-1:-1;;;21420:40:0;;:105;;-1:-1:-1;;;;;;;21477:48:0;;-1:-1:-1;;;21477:48:0;21420:105;:158;;;-1:-1:-1;;;;;;;;;;19883:40:0;;;21542:36;19724:207;64592:120;64646:14;64680:24;:22;:24::i;31890:174::-;31965:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;31965:29:0;-1:-1:-1;;;;;31965:29:0;;;;;;;;:24;;32019:23;31965:24;32019:14;:23::i;:::-;-1:-1:-1;;;;;32010:46:0;;;;;;;;;;;31890:174;;:::o;60638:486::-;60816:4;-1:-1:-1;;;;;60841:20:0;;60833:70;;;;-1:-1:-1;;;60833:70:0;;16196:2:1;60833:70:0;;;16178:21:1;16235:2;16215:18;;;16208:30;16274:34;16254:18;;;16247:62;-1:-1:-1;;;16325:18:1;;;16318:35;16370:19;;60833:70:0;16168:227:1;60833:70:0;60957:159;60985:47;61004:27;61024:6;61004:19;:27::i;:::-;60985:18;:47::i;:::-;60957:159;;;;;;;;;;;;10890:25:1;;;;10963:4;10951:17;;10931:18;;;10924:45;10985:18;;;10978:34;;;11028:18;;;11021:34;;;10862:19;;60957:159:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;60934:182:0;:6;-1:-1:-1;;;;;60934:182:0;;60914:202;;60638:486;;;;;;;:::o;47858:98::-;47916:7;47943:5;47947:1;47943;:5;:::i;:::-;47936:12;47858:98;-1:-1:-1;;;47858:98:0:o;28061:452::-;28190:4;27856:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27856:16:0;28212:110;;;;-1:-1:-1;;;28212:110:0;;15426:2:1;28212:110:0;;;15408:21:1;15465:2;15445:18;;;15438:30;15504:34;15484:18;;;15477:62;-1:-1:-1;;;15555:18:1;;;15548:42;15607:19;;28212:110:0;15398:234:1;28212:110:0;28333:13;28349:23;28364:7;28349:14;:23::i;:::-;28333:39;;28402:5;-1:-1:-1;;;;;28391:16:0;:7;-1:-1:-1;;;;;28391:16:0;;:64;;;;28448:7;-1:-1:-1;;;;;28424:31:0;:20;28436:7;28424:11;:20::i;:::-;-1:-1:-1;;;;;28424:31:0;;28391:64;:113;;;;28472:32;28489:5;28496:7;28472:16;:32::i;67911:283::-;68053:31;68070:7;68079:4;68053:16;:31::i;:::-;-1:-1:-1;;;;;68036:13:0;;;;;;:7;:13;;;;;:48;;:13;;;:48;;;;;:::i;:::-;;;;-1:-1:-1;68095:34:0;;-1:-1:-1;68111:4:0;68117:2;68121:7;68095:15;:34::i;:::-;68140:31;;;;:22;:31;;;;;68174:12;68140:46;;-1:-1:-1;;67911:283:0:o;48239:98::-;48297:7;48324:5;48328:1;48324;:5;:::i;62915:205::-;62963:7;62983:18;63004:17;:15;:17::i;:::-;62983:38;;63032:22;63038:3;63043:10;63032:5;:22::i;:::-;63065:19;:17;:19::i;44751:173::-;44826:6;;;-1:-1:-1;;;;;44843:17:0;;;-1:-1:-1;;;;;;44843:17:0;;;;;;;44876:40;;44826:6;;;44843:17;44826:6;;44876:40;;44807:16;;44876:40;44751:173;;:::o;63268:106::-;63344:15;;63317:7;;63344:22;;63364:1;63344:19;:22::i;29849:382::-;-1:-1:-1;;;;;29929:16:0;;29921:61;;;;-1:-1:-1;;;29921:61:0;;18207:2:1;29921:61:0;;;18189:21:1;;;18226:18;;;18219:30;18285:34;18265:18;;;18258:62;18337:18;;29921:61:0;18179:182:1;29921:61:0;27832:4;27856:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27856:16:0;:30;29993:58;;;;-1:-1:-1;;;29993:58:0;;14310:2:1;29993:58:0;;;14292:21:1;14349:2;14329:18;;;14322:30;14388;14368:18;;;14361:58;14436:18;;29993:58:0;14282:178:1;29993:58:0;30064:45;30093:1;30097:2;30101:7;30064:20;:45::i;:::-;-1:-1:-1;;;;;30122:13:0;;;;;;:9;:13;;;;;:18;;30139:1;;30122:13;:18;;30139:1;;30122:18;:::i;:::-;;;;-1:-1:-1;;30151:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30151:21:0;-1:-1:-1;;;;;30151:21:0;;;;;;;;30190:33;;30151:16;;;30190:33;;30151:16;;30190:33;29849:382;;:::o;63453:73::-;63501:15;:17;;;:15;:17;;;:::i;:::-;;;;;;63453:73::o;27102:352::-;27259:28;27269:4;27275:2;27279:7;27259:9;:28::i;:::-;27320:48;27343:4;27349:2;27353:7;27362:5;27320:22;:48::i;:::-;27298:148;;;;-1:-1:-1;;;27298:148:0;;;;;;;:::i;17162:723::-;17218:13;17439:10;17435:53;;-1:-1:-1;;17466:10:0;;;;;;;;;;;;-1:-1:-1;;;17466:10:0;;;;;17162:723::o;17435:53::-;17513:5;17498:12;17554:78;17561:9;;17554:78;;17587:8;;;;:::i;:::-;;-1:-1:-1;17610:10:0;;-1:-1:-1;17618:2:0;17610:10;;:::i;:::-;;;17554:78;;;17642:19;17674:6;17664:17;;;;;;-1:-1:-1;;;17664:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17664:17:0;;17642:39;;17692:154;17699:10;;17692:154;;17726:11;17736:1;17726:11;;:::i;:::-;;-1:-1:-1;17795:10:0;17803:2;17795:5;:10;:::i;:::-;17782:24;;:2;:24;:::i;:::-;17769:39;;17752:6;17759;17752:14;;;;;;-1:-1:-1;;;17752:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;17752:56:0;;;;;;;;-1:-1:-1;17823:11:0;17832:2;17823:11;;:::i;:::-;;;17692:154;;61240:701;61553:18;;61533:17;;61349:13;;61412:5;;61462:6;;61380:23;;61533:38;;61553:18;61533:38;:::i;:::-;61508:74;;;;;;-1:-1:-1;;;61508:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61508:74:0;-1:-1:-1;61482:100:0;-1:-1:-1;61482:100:0;61593:22;;61689:97;61705:10;:17;61701:1;:21;61689:97;;;61761:10;61772:1;61761:13;;;;;;-1:-1:-1;;;61761:13:0;;;;;;;;;;;;;-1:-1:-1;;;;;;61761:13:0;61744:9;61754:3;;;;:::i;:::-;;;61744:14;;;;;;-1:-1:-1;;;61744:14:0;;;;;;;;;;;;:30;-1:-1:-1;;;;;61744:30:0;;;;;;;;-1:-1:-1;61724:3:0;;;;:::i;:::-;;;;61689:97;;;61807:1;61803:5;;61798:99;61814:11;:18;61810:1;:22;61798:99;;;61871:11;61883:1;61871:14;;;;;;-1:-1:-1;;;61871:14:0;;;;;;;;;;;;;-1:-1:-1;;;;;;61871:14:0;61854:9;61864:3;;;;:::i;:::-;;;61854:14;;;;;;-1:-1:-1;;;61854:14:0;;;;;;;;;;;;:31;-1:-1:-1;;;;;61854:31:0;;;;;;;;-1:-1:-1;61834:3:0;;;;:::i;:::-;;;;61798:99;;;-1:-1:-1;61923:9:0;;61240:701;-1:-1:-1;;;;;;;61240:701:0:o;48995:98::-;49053:7;49080:5;49084:1;49080;:5;:::i;60105:410::-;60215:7;58270:108;;;;;;;;;;;;;;;;;58246:143;;;;;;;60369:12;;60404:11;;;;60448:24;;;;;60438:35;;;;;;60288:204;;;;;10472:25:1;;;10528:2;10513:18;;10506:34;;;;-1:-1:-1;;;;;10576:32:1;10571:2;10556:18;;10549:60;10640:2;10625:18;;10618:34;10459:3;10444:19;;10426:232;60288:204:0;;;;;;;;;;;;;60260:247;;;;;;60240:267;;60105:410;;;:::o;57762:258::-;57861:7;57963:20;57201:15;;;57123:101;57963:20;57934:63;;-1:-1:-1;;;57934:63:0;;;8312:27:1;8355:11;;;8348:27;;;;8391:12;;;8384:28;;;8428:12;;57934:63:0;8302:144:1;31157:615:0;31330:4;-1:-1:-1;;;;;31303:31:0;:23;31318:7;31303:14;:23::i;:::-;-1:-1:-1;;;;;31303:31:0;;31281:122;;;;-1:-1:-1;;;31281:122:0;;19342:2:1;31281:122:0;;;19324:21:1;19381:2;19361:18;;;19354:30;19420:34;19400:18;;;19393:62;-1:-1:-1;;;19471:18:1;;;19464:39;19520:19;;31281:122:0;19314:231:1;31281:122:0;-1:-1:-1;;;;;31422:16:0;;31414:65;;;;-1:-1:-1;;;31414:65:0;;14667:2:1;31414:65:0;;;14649:21:1;14706:2;14686:18;;;14679:30;14745:34;14725:18;;;14718:62;-1:-1:-1;;;14796:18:1;;;14789:34;14840:19;;31414:65:0;14639:226:1;31414:65:0;31492:39;31513:4;31519:2;31523:7;31492:20;:39::i;:::-;31596:29;31613:1;31617:7;31596:8;:29::i;:::-;-1:-1:-1;;;;;31638:15:0;;;;;;:9;:15;;;;;:20;;31657:1;;31638:15;:20;;31657:1;;31638:20;:::i;:::-;;;;-1:-1:-1;;;;;;;31669:13:0;;;;;;:9;:13;;;;;:18;;31686:1;;31669:13;:18;;31686:1;;31669:18;:::i;:::-;;;;-1:-1:-1;;31698:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31698:21:0;-1:-1:-1;;;;;31698:21:0;;;;;;;;;31737:27;;31698:16;;31737:27;;;;;;;31157:615;;;:::o;38132:589::-;-1:-1:-1;;;;;38338:18:0;;38334:187;;38373:40;38405:7;39548:10;:17;;39521:24;;;;:15;:24;;;;;:44;;;39576:24;;;;;;;;;;;;39444:164;38373:40;38334:187;;;38443:2;-1:-1:-1;;;;;38435:10:0;:4;-1:-1:-1;;;;;38435:10:0;;38431:90;;38462:47;38495:4;38501:7;38462:32;:47::i;:::-;-1:-1:-1;;;;;38535:16:0;;38531:183;;38568:45;38605:7;38568:36;:45::i;38531:183::-;38641:4;-1:-1:-1;;;;;38635:10:0;:2;-1:-1:-1;;;;;38635:10:0;;38631:83;;38662:40;38690:2;38694:7;38662:27;:40::i;32629:980::-;32784:4;-1:-1:-1;;;;;32805:13:0;;8587:20;8635:8;32801:801;;32874:2;-1:-1:-1;;;;;32858:36:0;;32917:12;:10;:12::i;:::-;32952:4;32979:7;33009:5;32858:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32858:175:0;;;;;;;;-1:-1:-1;;32858:175:0;;;;;;;;;;;;:::i;:::-;;;32837:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33216:13:0;;33212:320;;33259:108;;-1:-1:-1;;;33259:108:0;;;;;;;:::i;33212:320::-;33482:6;33476:13;33467:6;33463:2;33459:15;33452:38;32837:710;-1:-1:-1;;;;;;33097:51:0;-1:-1:-1;;;33097:51:0;;-1:-1:-1;33090:58:0;;32801:801;-1:-1:-1;33586:4:0;32629:980;;;;;;:::o;40235:1002::-;40515:22;40565:1;40540:22;40557:4;40540:16;:22::i;:::-;:26;;;;:::i;:::-;40577:18;40598:26;;;:17;:26;;;;;;40515:51;;-1:-1:-1;40731:28:0;;;40727:328;;-1:-1:-1;;;;;40798:18:0;;40776:19;40798:18;;;:12;:18;;;;;;;;:34;;;;;;;;;40849:30;;;;;;:44;;;40966:30;;:17;:30;;;;;:43;;;40727:328;-1:-1:-1;41151:26:0;;;;:17;:26;;;;;;;;41144:33;;;-1:-1:-1;;;;;41195:18:0;;;;;:12;:18;;;;;:34;;;;;;;41188:41;40235:1002::o;41532:1079::-;41810:10;:17;41785:22;;41810:21;;41830:1;;41810:21;:::i;:::-;41842:18;41863:24;;;:15;:24;;;;;;42236:10;:26;;41785:46;;-1:-1:-1;41863:24:0;;41785:46;;42236:26;;;;-1:-1:-1;;;42236:26:0;;;;;;;;;;;;;;;;;42214:48;;42300:11;42275:10;42286;42275:22;;;;;;-1:-1:-1;;;42275:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;42380:28;;;:15;:28;;;;;;;:41;;;42552:24;;;;;42545:31;42587:10;:16;;;;;-1:-1:-1;;;42587:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;41532:1079;;;;:::o;39022:221::-;39107:14;39124:20;39141:2;39124:16;:20::i;:::-;-1:-1:-1;;;;;39155:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;39200:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;39022:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:738:1;56:5;109:3;102:4;94:6;90:17;86:27;76:2;;131:5;124;117:20;76:2;171:6;158:20;197:18;234:2;230;227:10;224:2;;;240:18;;:::i;:::-;315:2;309:9;283:2;369:13;;-1:-1:-1;;365:22:1;;;389:2;361:31;357:40;345:53;;;413:18;;;433:22;;;410:46;407:2;;;459:18;;:::i;:::-;499:10;495:2;488:22;534:2;526:6;519:18;580:3;573:4;568:2;560:6;556:15;552:26;549:35;546:2;;;601:5;594;587:20;546:2;669;662:4;654:6;650:17;643:4;635:6;631:17;618:54;692:15;;;709:4;688:26;681:41;;;;-1:-1:-1;696:6:1;66:686;-1:-1:-1;;;66:686:1:o;757:257::-;816:6;869:2;857:9;848:7;844:23;840:32;837:2;;;890:6;882;875:22;837:2;934:9;921:23;953:31;978:5;953:31;:::i;1019:398::-;1087:6;1095;1148:2;1136:9;1127:7;1123:23;1119:32;1116:2;;;1169:6;1161;1154:22;1116:2;1213:9;1200:23;1232:31;1257:5;1232:31;:::i;:::-;1282:5;-1:-1:-1;1339:2:1;1324:18;;1311:32;1352:33;1311:32;1352:33;:::i;:::-;1404:7;1394:17;;;1106:311;;;;;:::o;1422:466::-;1499:6;1507;1515;1568:2;1556:9;1547:7;1543:23;1539:32;1536:2;;;1589:6;1581;1574:22;1536:2;1633:9;1620:23;1652:31;1677:5;1652:31;:::i;:::-;1702:5;-1:-1:-1;1759:2:1;1744:18;;1731:32;1772:33;1731:32;1772:33;:::i;:::-;1526:362;;1824:7;;-1:-1:-1;;;1878:2:1;1863:18;;;;1850:32;;1526:362::o;1893:685::-;1988:6;1996;2004;2012;2065:3;2053:9;2044:7;2040:23;2036:33;2033:2;;;2087:6;2079;2072:22;2033:2;2131:9;2118:23;2150:31;2175:5;2150:31;:::i;:::-;2200:5;-1:-1:-1;2257:2:1;2242:18;;2229:32;2270:33;2229:32;2270:33;:::i;:::-;2322:7;-1:-1:-1;2376:2:1;2361:18;;2348:32;;-1:-1:-1;2431:2:1;2416:18;;2403:32;2458:18;2447:30;;2444:2;;;2495:6;2487;2480:22;2444:2;2523:49;2564:7;2555:6;2544:9;2540:22;2523:49;:::i;:::-;2513:59;;;2023:555;;;;;;;:::o;2583:436::-;2648:6;2656;2709:2;2697:9;2688:7;2684:23;2680:32;2677:2;;;2730:6;2722;2715:22;2677:2;2774:9;2761:23;2793:31;2818:5;2793:31;:::i;:::-;2843:5;-1:-1:-1;2900:2:1;2885:18;;2872:32;2942:15;;2935:23;2923:36;;2913:2;;2978:6;2970;2963:22;3024:788;3126:6;3134;3142;3150;3158;3211:3;3199:9;3190:7;3186:23;3182:33;3179:2;;;3233:6;3225;3218:22;3179:2;3277:9;3264:23;3296:31;3321:5;3296:31;:::i;:::-;3346:5;-1:-1:-1;3402:2:1;3387:18;;3374:32;3429:18;3418:30;;3415:2;;;3466:6;3458;3451:22;3415:2;3494:49;3535:7;3526:6;3515:9;3511:22;3494:49;:::i;:::-;3484:59;;;3590:2;3579:9;3575:18;3562:32;3552:42;;3641:2;3630:9;3626:18;3613:32;3603:42;;3697:3;3686:9;3682:19;3669:33;3746:4;3737:7;3733:18;3724:7;3721:31;3711:2;;3771:6;3763;3756:22;3711:2;3799:7;3789:17;;;3169:643;;;;;;;;:::o;3817:325::-;3885:6;3893;3946:2;3934:9;3925:7;3921:23;3917:32;3914:2;;;3967:6;3959;3952:22;3914:2;4011:9;3998:23;4030:31;4055:5;4030:31;:::i;:::-;4080:5;4132:2;4117:18;;;;4104:32;;-1:-1:-1;;;3904:238:1:o;4147:255::-;4205:6;4258:2;4246:9;4237:7;4233:23;4229:32;4226:2;;;4279:6;4271;4264:22;4226:2;4323:9;4310:23;4342:30;4366:5;4342:30;:::i;4407:259::-;4476:6;4529:2;4517:9;4508:7;4504:23;4500:32;4497:2;;;4550:6;4542;4535:22;4497:2;4587:9;4581:16;4606:30;4630:5;4606:30;:::i;4952:290::-;5051:6;5104:2;5092:9;5083:7;5079:23;5075:32;5072:2;;;5125:6;5117;5110:22;5072:2;5162:9;5156:16;5181:31;5206:5;5181:31;:::i;5247:642::-;5318:6;5326;5379:2;5367:9;5358:7;5354:23;5350:32;5347:2;;;5400:6;5392;5385:22;5347:2;5445:9;5432:23;5474:18;5515:2;5507:6;5504:14;5501:2;;;5536:6;5528;5521:22;5501:2;5579:6;5568:9;5564:22;5554:32;;5624:7;5617:4;5613:2;5609:13;5605:27;5595:2;;5651:6;5643;5636:22;5595:2;5696;5683:16;5722:2;5714:6;5711:14;5708:2;;;5743:6;5735;5728:22;5708:2;5793:7;5788:2;5779:6;5775:2;5771:15;5767:24;5764:37;5761:2;;;5819:6;5811;5804:22;5761:2;5855;5847:11;;;;;5877:6;;-1:-1:-1;5337:552:1;;-1:-1:-1;;;;5337:552:1:o;5894:190::-;5953:6;6006:2;5994:9;5985:7;5981:23;5977:32;5974:2;;;6027:6;6019;6012:22;5974:2;-1:-1:-1;6055:23:1;;5964:120;-1:-1:-1;5964:120:1:o;6089:194::-;6159:6;6212:2;6200:9;6191:7;6187:23;6183:32;6180:2;;;6233:6;6225;6218:22;6180:2;-1:-1:-1;6261:16:1;;6170:113;-1:-1:-1;6170:113:1:o;6288:325::-;6356:6;6364;6417:2;6405:9;6396:7;6392:23;6388:32;6385:2;;;6438:6;6430;6423:22;6385:2;6479:9;6466:23;6456:33;;6539:2;6528:9;6524:18;6511:32;6552:31;6577:5;6552:31;:::i;6618:257::-;6659:3;6697:5;6691:12;6724:6;6719:3;6712:19;6740:63;6796:6;6789:4;6784:3;6780:14;6773:4;6766:5;6762:16;6740:63;:::i;:::-;6857:2;6836:15;-1:-1:-1;;6832:29:1;6823:39;;;;6864:4;6819:50;;6667:208;-1:-1:-1;;6667:208:1:o;6880:274::-;7009:3;7047:6;7041:13;7063:53;7109:6;7104:3;7097:4;7089:6;7085:17;7063:53;:::i;:::-;7132:16;;;;;7017:137;-1:-1:-1;;7017:137:1:o;7159:415::-;7316:3;7354:6;7348:13;7370:53;7416:6;7411:3;7404:4;7396:6;7392:17;7370:53;:::i;:::-;7492:2;7488:15;;;;-1:-1:-1;;7484:53:1;7445:16;;;;7470:68;;;7565:2;7554:14;;7324:250;-1:-1:-1;;7324:250:1:o;7579:470::-;7758:3;7796:6;7790:13;7812:53;7858:6;7853:3;7846:4;7838:6;7834:17;7812:53;:::i;:::-;7928:13;;7887:16;;;;7950:57;7928:13;7887:16;7984:4;7972:17;;7950:57;:::i;:::-;8023:20;;7766:283;-1:-1:-1;;;;7766:283:1:o;8659:431::-;-1:-1:-1;;;;;8916:15:1;;;8898:34;;8968:15;;8963:2;8948:18;;8941:43;9020:2;9015;9000:18;;8993:30;;;8841:4;;9040:44;;9065:18;;9057:6;9040:44;:::i;:::-;9032:52;8850:240;-1:-1:-1;;;;;8850:240:1:o;9095:488::-;-1:-1:-1;;;;;9364:15:1;;;9346:34;;9416:15;;9411:2;9396:18;;9389:43;9463:2;9448:18;;9441:34;;;9511:3;9506:2;9491:18;;9484:31;;;9289:4;;9532:45;;9557:19;;9549:6;9532:45;:::i;11066:217::-;11213:2;11202:9;11195:21;11176:4;11233:44;11273:2;11262:9;11258:18;11250:6;11233:44;:::i;12565:414::-;12767:2;12749:21;;;12806:2;12786:18;;;12779:30;12845:34;12840:2;12825:18;;12818:62;-1:-1:-1;;;12911:2:1;12896:18;;12889:48;12969:3;12954:19;;12739:240::o;18779:356::-;18981:2;18963:21;;;19000:18;;;18993:30;19059:34;19054:2;19039:18;;19032:62;19126:2;19111:18;;18953:182::o;21171:413::-;21373:2;21355:21;;;21412:2;21392:18;;;21385:30;21451:34;21446:2;21431:18;;21424:62;-1:-1:-1;;;21517:2:1;21502:18;;21495:47;21574:3;21559:19;;21345:239::o;23371:128::-;23411:3;23442:1;23438:6;23435:1;23432:13;23429:2;;;23448:18;;:::i;:::-;-1:-1:-1;23484:9:1;;23419:80::o;23504:120::-;23544:1;23570;23560:2;;23575:18;;:::i;:::-;-1:-1:-1;23609:9:1;;23550:74::o;23629:168::-;23669:7;23735:1;23731;23727:6;23723:14;23720:1;23717:21;23712:1;23705:9;23698:17;23694:45;23691:2;;;23742:18;;:::i;:::-;-1:-1:-1;23782:9:1;;23681:116::o;23802:125::-;23842:4;23870:1;23867;23864:8;23861:2;;;23875:18;;:::i;:::-;-1:-1:-1;23912:9:1;;23851:76::o;23932:258::-;24004:1;24014:113;24028:6;24025:1;24022:13;24014:113;;;24104:11;;;24098:18;24085:11;;;24078:39;24050:2;24043:10;24014:113;;;24145:6;24142:1;24139:13;24136:2;;;-1:-1:-1;;24180:1:1;24162:16;;24155:27;23985:205::o;24195:380::-;24274:1;24270:12;;;;24317;;;24338:2;;24392:4;24384:6;24380:17;24370:27;;24338:2;24445;24437:6;24434:14;24414:18;24411:38;24408:2;;;24491:10;24486:3;24482:20;24479:1;24472:31;24526:4;24523:1;24516:15;24554:4;24551:1;24544:15;24408:2;;24250:325;;;:::o;24580:135::-;24619:3;-1:-1:-1;;24640:17:1;;24637:2;;;24660:18;;:::i;:::-;-1:-1:-1;24707:1:1;24696:13;;24627:88::o;24720:112::-;24752:1;24778;24768:2;;24783:18;;:::i;:::-;-1:-1:-1;24817:9:1;;24758:74::o;24837:127::-;24898:10;24893:3;24889:20;24886:1;24879:31;24929:4;24926:1;24919:15;24953:4;24950:1;24943:15;24969:127;25030:10;25025:3;25021:20;25018:1;25011:31;25061:4;25058:1;25051:15;25085:4;25082:1;25075:15;25101:127;25162:10;25157:3;25153:20;25150:1;25143:31;25193:4;25190:1;25183:15;25217:4;25214:1;25207:15;25233:131;-1:-1:-1;;;;;25308:31:1;;25298:42;;25288:2;;25354:1;25351;25344:12;25369:131;-1:-1:-1;;;;;;25443:32:1;;25433:43;;25423:2;;25490:1;25487;25480:12
Swarm Source
ipfs://854415d6eacb72e57dd35d06a4af09626f90c98d25bd377b027ac77579009dc6
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $1,873.91 | 0.08 | $149.91 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.