Overview
TokenID
1151
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
ZenCats
Compiler Version
v0.8.1+commit.df193b15
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.1; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/security/Pausable.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "@openzeppelin/contracts/utils/math/SafeMath.sol"; import "@openzeppelin/contracts/access/AccessControl.sol"; import "@openzeppelin/contracts/utils/Counters.sol"; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol"; /** * @title Creature * Creature - a contract for my non-fungible creatures. */ contract ZenCats is ERC721,ERC721Enumerable,Ownable,AccessControl,Pausable { using SafeMath for uint256; using Counters for Counters.Counter; bytes32 internal constant ASSOCIATE_CONTRACT_ROLE = keccak256("ASSOCIATE_CONTRACT_ROLE"); Counters.Counter internal _nextTokenIdLevel0; Counters.Counter internal _nextTokenIdLevel1; Counters.Counter internal _nextTokenIdLevel2; Counters.Counter internal _nextTokenIdLevel3; uint internal constant _baseLevel0 = 0; uint internal constant _baseLevel1 = 10000; uint internal constant _baseLevel2 = 20000; uint internal constant _baseLevel3 = 30000; function allow_contract(address addr) public onlyOwner { _grantRole(ASSOCIATE_CONTRACT_ROLE,addr); } function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); } function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function tokenLevel(uint _tokenId) public pure returns (uint256) { if (_tokenId > _baseLevel0 && _tokenId < _baseLevel1) return 0; if (_tokenId > _baseLevel1 && _tokenId < _baseLevel2) return 1; if (_tokenId > _baseLevel2 && _tokenId < _baseLevel3) return 2; return 3; } function mintTo(address _to,uint level) public whenNotPaused { require(hasRole(ASSOCIATE_CONTRACT_ROLE,_msgSender()) || owner() == _msgSender() , "DOES_NOT_HAVE_PERMISSION"); require(level <= 3, "invalid level"); // TODO: check level boundries uint256 currentTokenId = 0; if (level == 0) { currentTokenId =_baseLevel0 + _nextTokenIdLevel0.current(); _nextTokenIdLevel0.increment(); } else if(level == 1) { currentTokenId =_baseLevel1 + _nextTokenIdLevel1.current(); _nextTokenIdLevel1.increment(); } else if(level == 2) { currentTokenId = _baseLevel2 + _nextTokenIdLevel2.current(); _nextTokenIdLevel2.increment(); }else if(level == 3) { currentTokenId = _baseLevel3 + _nextTokenIdLevel3.current(); _nextTokenIdLevel3.increment(); } _safeMint(_to, currentTokenId); } function burn(uint256 tokenId) public whenNotPaused { require(hasRole(ASSOCIATE_CONTRACT_ROLE,_msgSender()) || owner() == _msgSender() , "DOES_NOT_HAVE_PERMISSION"); _burn(tokenId); } bool internal run_once = false; function transfer_teamReserved(address _to) public onlyOwner { require(!run_once , "You can only run this once"); for (uint256 index = 0; index < 40; index++) { mintTo(_to,0); } for (uint256 index = 0; index < 7; index++) { mintTo(_to,1); } for (uint256 index = 0; index < 3; index++) { mintTo(_to,2); } run_once = true; } constructor() ERC721("ZenCats", "ZCT") { _nextTokenIdLevel0.increment(); _nextTokenIdLevel1.increment(); _nextTokenIdLevel2.increment(); _nextTokenIdLevel3.increment(); } function tokenURI(uint256 _tokenId) public override pure returns (string memory) { return string(abi.encodePacked(baseTokenURI(), Strings.toString(_tokenId))); } function baseTokenURI() public pure returns (string memory) { return "https://api.zencats.io/cats/"; } function contractURI() public pure returns (string memory) { return "https://api.zencats.io/contract/zencats"; } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721,ERC721Enumerable, AccessControl) returns (bool) { return super.supportsInterface(interfaceId); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControl.sol) pragma solidity ^0.8.0; import "./IAccessControl.sol"; import "../utils/Context.sol"; import "../utils/Strings.sol"; import "../utils/introspection/ERC165.sol"; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_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 { _transferOwnership(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"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./extensions/IERC721Metadata.sol"; import "../../utils/Address.sol"; import "../../utils/Context.sol"; import "../../utils/Strings.sol"; import "../../utils/introspection/ERC165.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_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); _afterTokenTransfer(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); _afterTokenTransfer(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 from incorrect owner"); 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); _afterTokenTransfer(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 Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @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 {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; import "../ERC721.sol"; import "./IERC721Enumerable.sol"; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since 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; } } }
{ "remappings": [], "optimizer": { "enabled": true, "runs": 200 }, "evmVersion": "istanbul", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"allow_contract","outputs":[],"stateMutability":"nonpayable","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":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"level","type":"uint256"}],"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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","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":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"transfer_teamReserved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526011805460ff191690553480156200001b57600080fd5b5060408051808201825260078152665a656e4361747360c81b6020808301918252835180850190945260038452621690d560ea1b908401528151919291620000669160009162000165565b5080516200007c90600190602084019062000165565b50505062000099620000936200010660201b60201c565b6200010a565b600c805460ff19169055620000bb600d6200015c602090811b62000e9a17901c565b620000d2600e6200015c60201b62000e9a1760201c565b620000e9600f6200015c60201b62000e9a1760201c565b6200010060106200015c60201b62000e9a1760201c565b62000248565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b80546001019055565b82805462000173906200020b565b90600052602060002090601f016020900481019282620001975760008555620001e2565b82601f10620001b257805160ff1916838001178555620001e2565b82800160010185558215620001e2579182015b82811115620001e2578251825591602001919060010190620001c5565b50620001f0929150620001f4565b5090565b5b80821115620001f05760008155600101620001f5565b6002810460018216806200022057607f821691505b602082108114156200024257634e487b7160e01b600052602260045260246000fd5b50919050565b6128d480620002586000396000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c80636352211e11610125578063a22cb465116100ad578063d547741f1161007c578063d547741f1461042c578063d547cfb71461043f578063e8a3d48514610447578063e985e9c51461044f578063f2fde38b1461046257610211565b8063a22cb465146103e0578063ab8ece8b146103f3578063b88d4fde14610406578063c87b56dd1461041957610211565b80638456cb59116100f45780638456cb59146103ad5780638da5cb5b146103b557806391d14854146103bd57806395d89b41146103d0578063a217fddf146103d857610211565b80636352211e1461036c57806370274fd81461037f57806370a0823114610392578063715018a6146103a557610211565b80632f2ff15d116101a857806342842e0e1161017757806342842e0e1461031857806342966c681461032b578063449a52f81461033e5780634f6ccce7146103515780635c975abb1461036457610211565b80632f2ff15d146102d75780632f745c59146102ea57806336568abe146102fd5780633f4ba83a1461031057610211565b80630c863995116101e45780630c8639951461028957806318160ddd1461029c57806323b872dd146102b1578063248a9ca3146102c457610211565b806301ffc9a71461021657806306fdde031461023f578063081812fc14610254578063095ea7b314610274575b600080fd5b610229610224366004611f75565b610475565b60405161023691906120ce565b60405180910390f35b610247610488565b60405161023691906120e2565b610267610262366004611f3b565b61051a565b604051610236919061207d565b610287610282366004611f12565b610566565b005b610287610297366004611d7c565b6105fe565b6102a46106ee565b60405161023691906120d9565b6102876102bf366004611dc8565b6106f4565b6102a46102d2366004611f3b565b61072c565b6102876102e5366004611f53565b610741565b6102a46102f8366004611f12565b610765565b61028761030b366004611f53565b6107b7565b6102876107fd565b610287610326366004611dc8565b610846565b610287610339366004611f3b565b610861565b61028761034c366004611f12565b610904565b6102a461035f366004611f3b565b610a74565b610229610acf565b61026761037a366004611f3b565b610ad8565b61028761038d366004611d7c565b610b0d565b6102a46103a0366004611d7c565b610b76565b610287610bba565b610287610c03565b610267610c4a565b6102296103cb366004611f53565b610c59565b610247610c84565b6102a4610c93565b6102876103ee366004611ed8565b610c98565b6102a4610401366004611f3b565b610caa565b610287610414366004611e03565b610d0f565b610247610427366004611f3b565b610d4e565b61028761043a366004611f53565b610d88565b610247610da7565b610247610dde565b61022961045d366004611d96565b610dfe565b610287610470366004611d7c565b610e2c565b600061048082610ea3565b90505b919050565b606060008054610497906127b5565b80601f01602080910402602001604051908101604052809291908181526020018280546104c3906127b5565b80156105105780601f106104e557610100808354040283529160200191610510565b820191906000526020600020905b8154815290600101906020018083116104f357829003601f168201915b5050505050905090565b600061052582610ec8565b61054a5760405162461bcd60e51b815260040161054190612562565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061057182610ad8565b9050806001600160a01b0316836001600160a01b031614156105a55760405162461bcd60e51b8152600401610541906125e3565b806001600160a01b03166105b7610ee5565b6001600160a01b031614806105d357506105d38161045d610ee5565b6105ef5760405162461bcd60e51b815260040161054190612406565b6105f98383610ee9565b505050565b610606610ee5565b6001600160a01b0316610617610c4a565b6001600160a01b03161461063d5760405162461bcd60e51b8152600401610541906125ae565b60115460ff16156106605760405162461bcd60e51b815260040161054190612463565b60005b602881101561068957610677826000610904565b80610681816127f0565b915050610663565b5060005b60078110156106b3576106a1826001610904565b806106ab816127f0565b91505061068d565b5060005b60038110156106dd576106cb826002610904565b806106d5816127f0565b9150506106b7565b50506011805460ff19166001179055565b60085490565b6107056106ff610ee5565b82610f57565b6107215760405162461bcd60e51b815260040161054190612624565b6105f9838383610fdc565b6000908152600b602052604090206001015490565b61074a8261072c565b61075b81610756610ee5565b61110f565b6105f98383611173565b600061077083610b76565b821061078e5760405162461bcd60e51b81526004016105419061218f565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6107bf610ee5565b6001600160a01b0316816001600160a01b0316146107ef5760405162461bcd60e51b8152600401610541906126c1565b6107f982826111fa565b5050565b610805610ee5565b6001600160a01b0316610816610c4a565b6001600160a01b03161461083c5760405162461bcd60e51b8152600401610541906125ae565b61084461127f565b565b6105f983838360405180602001604052806000815250610d0f565b610869610acf565b156108865760405162461bcd60e51b8152600401610541906123dc565b6108b27f17d79d89ee018972c13cf287c0a959e9afe18da13452dd04e1016c10c2909a346103cb610ee5565b806108dc57506108c0610ee5565b6001600160a01b03166108d1610c4a565b6001600160a01b0316145b6108f85760405162461bcd60e51b815260040161054190612158565b610901816112ed565b50565b61090c610acf565b156109295760405162461bcd60e51b8152600401610541906123dc565b6109557f17d79d89ee018972c13cf287c0a959e9afe18da13452dd04e1016c10c2909a346103cb610ee5565b8061097f5750610963610ee5565b6001600160a01b0316610974610c4a565b6001600160a01b0316145b61099b5760405162461bcd60e51b815260040161054190612158565b60038111156109bc5760405162461bcd60e51b8152600401610541906122ee565b6000816109e9576109cd600d61139c565b6109d8906000612710565b90506109e4600d610e9a565b610a6a565b8160011415610a14576109fc600e61139c565b610a0890612710612710565b90506109e4600e610e9a565b8160021415610a3f57610a27600f61139c565b610a3390614e20612710565b90506109e4600f610e9a565b8160031415610a6a57610a52601061139c565b610a5e90617530612710565b9050610a6a6010610e9a565b6105f983826113a0565b6000610a7e6106ee565b8210610a9c5760405162461bcd60e51b815260040161054190612675565b60088281548110610abd57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b600c5460ff1690565b6000818152600260205260408120546001600160a01b0316806104805760405162461bcd60e51b8152600401610541906124e4565b610b15610ee5565b6001600160a01b0316610b26610c4a565b6001600160a01b031614610b4c5760405162461bcd60e51b8152600401610541906125ae565b6109017f17d79d89ee018972c13cf287c0a959e9afe18da13452dd04e1016c10c2909a3482611173565b60006001600160a01b038216610b9e5760405162461bcd60e51b81526004016105419061249a565b506001600160a01b031660009081526003602052604090205490565b610bc2610ee5565b6001600160a01b0316610bd3610c4a565b6001600160a01b031614610bf95760405162461bcd60e51b8152600401610541906125ae565b61084460006113ba565b610c0b610ee5565b6001600160a01b0316610c1c610c4a565b6001600160a01b031614610c425760405162461bcd60e51b8152600401610541906125ae565b61084461140c565b600a546001600160a01b031690565b6000918252600b602090815260408084206001600160a01b0393909316845291905290205460ff1690565b606060018054610497906127b5565b600081565b6107f9610ca3610ee5565b8383611467565b60008082118015610cbc575061271082105b15610cc957506000610483565b61271082118015610cdb5750614e2082105b15610ce857506001610483565b614e2082118015610cfa575061753082105b15610d0757506002610483565b506003919050565b610d20610d1a610ee5565b83610f57565b610d3c5760405162461bcd60e51b815260040161054190612624565b610d488484848461150a565b50505050565b6060610d58610da7565b610d618361153d565b604051602001610d72929190611fd9565b6040516020818303038152906040529050919050565b610d918261072c565b610d9d81610756610ee5565b6105f983836111fa565b60408051808201909152601c81527f68747470733a2f2f6170692e7a656e636174732e696f2f636174732f00000000602082015290565b606060405180606001604052806027815260200161287860279139905090565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b610e34610ee5565b6001600160a01b0316610e45610c4a565b6001600160a01b031614610e6b5760405162461bcd60e51b8152600401610541906125ae565b6001600160a01b038116610e915760405162461bcd60e51b81526004016105419061222c565b610901816113ba565b80546001019055565b60006001600160e01b03198216637965db0b60e01b1480610480575061048082611658565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610f1e82610ad8565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610f6282610ec8565b610f7e5760405162461bcd60e51b815260040161054190612390565b6000610f8983610ad8565b9050806001600160a01b0316846001600160a01b03161480610fc45750836001600160a01b0316610fb98461051a565b6001600160a01b0316145b80610fd45750610fd48185610dfe565b949350505050565b826001600160a01b0316610fef82610ad8565b6001600160a01b0316146110155760405162461bcd60e51b815260040161054190612272565b6001600160a01b03821661103b5760405162461bcd60e51b815260040161054190612315565b61104683838361167d565b611051600082610ee9565b6001600160a01b038316600090815260036020526040812080546001929061107a90849061275b565b90915550506001600160a01b03821660009081526003602052604081208054600192906110a8908490612710565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a46105f98383836105f9565b6111198282610c59565b6107f957611131816001600160a01b03166014611688565b61113c836020611688565b60405160200161114d929190612008565b60408051601f198184030181529082905262461bcd60e51b8252610541916004016120e2565b61117d8282610c59565b6107f9576000828152600b602090815260408083206001600160a01b03851684529091529020805460ff191660011790556111b6610ee5565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6112048282610c59565b156107f9576000828152600b602090815260408083206001600160a01b03851684529091529020805460ff1916905561123b610ee5565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b611287610acf565b6112a35760405162461bcd60e51b81526004016105419061212a565b600c805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6112d6610ee5565b6040516112e3919061207d565b60405180910390a1565b60006112f882610ad8565b90506113068160008461167d565b611311600083610ee9565b6001600160a01b038116600090815260036020526040812080546001929061133a90849061275b565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a46107f9816000846105f9565b5490565b6107f9828260405180602001604052806000815250611841565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611414610acf565b156114315760405162461bcd60e51b8152600401610541906123dc565b600c805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586112d6610ee5565b816001600160a01b0316836001600160a01b031614156114995760405162461bcd60e51b815260040161054190612359565b6001600160a01b0383811660008181526005602090815260408083209487168084529490915290819020805460ff1916851515179055517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31906114fd9085906120ce565b60405180910390a3505050565b611515848484610fdc565b61152184848484611874565b610d485760405162461bcd60e51b8152600401610541906121da565b60608161156257506040805180820190915260018152600360fc1b6020820152610483565b8160005b811561158c5780611576816127f0565b91506115859050600a83612728565b9150611566565b60008167ffffffffffffffff8111156115b557634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156115df576020820181803683370190505b5090505b8415610fd4576115f460018361275b565b9150611601600a8661280b565b61160c906030612710565b60f81b81838151811061162f57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611651600a86612728565b94506115e3565b60006001600160e01b0319821663780e9d6360e01b148061048057506104808261198f565b6105f98383836119cf565b6060600061169783600261273c565b6116a2906002612710565b67ffffffffffffffff8111156116c857634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156116f2576020820181803683370190505b509050600360fc1b8160008151811061171b57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061175857634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600061177c84600261273c565b611787906001612710565b90505b600181111561181b576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106117c957634e487b7160e01b600052603260045260246000fd5b1a60f81b8282815181106117ed57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c936118148161279e565b905061178a565b50831561183a5760405162461bcd60e51b8152600401610541906120f5565b9392505050565b61184b8383611a58565b6118586000848484611874565b6105f95760405162461bcd60e51b8152600401610541906121da565b6000611888846001600160a01b0316611b3f565b1561198457836001600160a01b031663150b7a026118a4610ee5565b8786866040518563ffffffff1660e01b81526004016118c69493929190612091565b602060405180830381600087803b1580156118e057600080fd5b505af1925050508015611910575060408051601f3d908101601f1916820190925261190d91810190611f91565b60015b61196a573d80801561193e576040519150601f19603f3d011682016040523d82523d6000602084013e611943565b606091505b5080516119625760405162461bcd60e51b8152600401610541906121da565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610fd4565b506001949350505050565b60006001600160e01b031982166380ac58cd60e01b14806119c057506001600160e01b03198216635b5e139f60e01b145b80610480575061048082611b4e565b6119da8383836105f9565b6001600160a01b0383166119f6576119f181611b67565b611a19565b816001600160a01b0316836001600160a01b031614611a1957611a198382611bab565b6001600160a01b038216611a3557611a3081611c48565b6105f9565b826001600160a01b0316826001600160a01b0316146105f9576105f98282611d21565b6001600160a01b038216611a7e5760405162461bcd60e51b81526004016105419061252d565b611a8781610ec8565b15611aa45760405162461bcd60e51b8152600401610541906122b7565b611ab06000838361167d565b6001600160a01b0382166000908152600360205260408120805460019290611ad9908490612710565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46107f9600083836105f9565b6001600160a01b03163b151590565b6001600160e01b031981166301ffc9a760e01b14919050565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b60006001611bb884610b76565b611bc2919061275b565b600083815260076020526040902054909150808214611c15576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611c5a9060019061275b565b60008381526009602052604081205460088054939450909284908110611c9057634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060088381548110611cbf57634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611d0557634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000611d2c83610b76565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b80356001600160a01b038116811461048357600080fd5b600060208284031215611d8d578081fd5b61183a82611d65565b60008060408385031215611da8578081fd5b611db183611d65565b9150611dbf60208401611d65565b90509250929050565b600080600060608486031215611ddc578081fd5b611de584611d65565b9250611df360208501611d65565b9150604084013590509250925092565b60008060008060808587031215611e18578081fd5b611e2185611d65565b9350611e2f60208601611d65565b925060408501359150606085013567ffffffffffffffff80821115611e52578283fd5b818701915087601f830112611e65578283fd5b813581811115611e7757611e7761284b565b604051601f8201601f19908116603f01168101908382118183101715611e9f57611e9f61284b565b816040528281528a6020848701011115611eb7578586fd5b82602086016020830137918201602001949094529598949750929550505050565b60008060408385031215611eea578182fd5b611ef383611d65565b915060208301358015158114611f07578182fd5b809150509250929050565b60008060408385031215611f24578182fd5b611f2d83611d65565b946020939093013593505050565b600060208284031215611f4c578081fd5b5035919050565b60008060408385031215611f65578182fd5b82359150611dbf60208401611d65565b600060208284031215611f86578081fd5b813561183a81612861565b600060208284031215611fa2578081fd5b815161183a81612861565b60008151808452611fc5816020860160208601612772565b601f01601f19169290920160200192915050565b60008351611feb818460208801612772565b835190830190611fff818360208801612772565b01949350505050565b60007f416363657373436f6e74726f6c3a206163636f756e742000000000000000000082528351612040816017850160208801612772565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351612071816028840160208801612772565b01602801949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906120c490830184611fad565b9695505050505050565b901515815260200190565b90815260200190565b60006020825261183a6020830184611fad565b6020808252818101527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604082015260600190565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b60208082526018908201527f444f45535f4e4f545f484156455f5045524d495353494f4e0000000000000000604082015260600190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b6020808252600d908201526c1a5b9d985b1a59081b195d995b609a1b604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252601a908201527f596f752063616e206f6e6c792072756e2074686973206f6e6365000000000000604082015260600190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b6020808252602f908201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560408201526e103937b632b9903337b91039b2b63360891b606082015260800190565b600082198211156127235761272361281f565b500190565b60008261273757612737612835565b500490565b60008160001904831182151516156127565761275661281f565b500290565b60008282101561276d5761276d61281f565b500390565b60005b8381101561278d578181015183820152602001612775565b83811115610d485750506000910152565b6000816127ad576127ad61281f565b506000190190565b6002810460018216806127c957607f821691505b602082108114156127ea57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156128045761280461281f565b5060010190565b60008261281a5761281a612835565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461090157600080fdfe68747470733a2f2f6170692e7a656e636174732e696f2f636f6e74726163742f7a656e63617473a2646970667358221220d31a577478e11d06d69c7d741eccdf717c2e60e348b8085fe17743ebdcbc474964736f6c63430008010033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102115760003560e01c80636352211e11610125578063a22cb465116100ad578063d547741f1161007c578063d547741f1461042c578063d547cfb71461043f578063e8a3d48514610447578063e985e9c51461044f578063f2fde38b1461046257610211565b8063a22cb465146103e0578063ab8ece8b146103f3578063b88d4fde14610406578063c87b56dd1461041957610211565b80638456cb59116100f45780638456cb59146103ad5780638da5cb5b146103b557806391d14854146103bd57806395d89b41146103d0578063a217fddf146103d857610211565b80636352211e1461036c57806370274fd81461037f57806370a0823114610392578063715018a6146103a557610211565b80632f2ff15d116101a857806342842e0e1161017757806342842e0e1461031857806342966c681461032b578063449a52f81461033e5780634f6ccce7146103515780635c975abb1461036457610211565b80632f2ff15d146102d75780632f745c59146102ea57806336568abe146102fd5780633f4ba83a1461031057610211565b80630c863995116101e45780630c8639951461028957806318160ddd1461029c57806323b872dd146102b1578063248a9ca3146102c457610211565b806301ffc9a71461021657806306fdde031461023f578063081812fc14610254578063095ea7b314610274575b600080fd5b610229610224366004611f75565b610475565b60405161023691906120ce565b60405180910390f35b610247610488565b60405161023691906120e2565b610267610262366004611f3b565b61051a565b604051610236919061207d565b610287610282366004611f12565b610566565b005b610287610297366004611d7c565b6105fe565b6102a46106ee565b60405161023691906120d9565b6102876102bf366004611dc8565b6106f4565b6102a46102d2366004611f3b565b61072c565b6102876102e5366004611f53565b610741565b6102a46102f8366004611f12565b610765565b61028761030b366004611f53565b6107b7565b6102876107fd565b610287610326366004611dc8565b610846565b610287610339366004611f3b565b610861565b61028761034c366004611f12565b610904565b6102a461035f366004611f3b565b610a74565b610229610acf565b61026761037a366004611f3b565b610ad8565b61028761038d366004611d7c565b610b0d565b6102a46103a0366004611d7c565b610b76565b610287610bba565b610287610c03565b610267610c4a565b6102296103cb366004611f53565b610c59565b610247610c84565b6102a4610c93565b6102876103ee366004611ed8565b610c98565b6102a4610401366004611f3b565b610caa565b610287610414366004611e03565b610d0f565b610247610427366004611f3b565b610d4e565b61028761043a366004611f53565b610d88565b610247610da7565b610247610dde565b61022961045d366004611d96565b610dfe565b610287610470366004611d7c565b610e2c565b600061048082610ea3565b90505b919050565b606060008054610497906127b5565b80601f01602080910402602001604051908101604052809291908181526020018280546104c3906127b5565b80156105105780601f106104e557610100808354040283529160200191610510565b820191906000526020600020905b8154815290600101906020018083116104f357829003601f168201915b5050505050905090565b600061052582610ec8565b61054a5760405162461bcd60e51b815260040161054190612562565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061057182610ad8565b9050806001600160a01b0316836001600160a01b031614156105a55760405162461bcd60e51b8152600401610541906125e3565b806001600160a01b03166105b7610ee5565b6001600160a01b031614806105d357506105d38161045d610ee5565b6105ef5760405162461bcd60e51b815260040161054190612406565b6105f98383610ee9565b505050565b610606610ee5565b6001600160a01b0316610617610c4a565b6001600160a01b03161461063d5760405162461bcd60e51b8152600401610541906125ae565b60115460ff16156106605760405162461bcd60e51b815260040161054190612463565b60005b602881101561068957610677826000610904565b80610681816127f0565b915050610663565b5060005b60078110156106b3576106a1826001610904565b806106ab816127f0565b91505061068d565b5060005b60038110156106dd576106cb826002610904565b806106d5816127f0565b9150506106b7565b50506011805460ff19166001179055565b60085490565b6107056106ff610ee5565b82610f57565b6107215760405162461bcd60e51b815260040161054190612624565b6105f9838383610fdc565b6000908152600b602052604090206001015490565b61074a8261072c565b61075b81610756610ee5565b61110f565b6105f98383611173565b600061077083610b76565b821061078e5760405162461bcd60e51b81526004016105419061218f565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6107bf610ee5565b6001600160a01b0316816001600160a01b0316146107ef5760405162461bcd60e51b8152600401610541906126c1565b6107f982826111fa565b5050565b610805610ee5565b6001600160a01b0316610816610c4a565b6001600160a01b03161461083c5760405162461bcd60e51b8152600401610541906125ae565b61084461127f565b565b6105f983838360405180602001604052806000815250610d0f565b610869610acf565b156108865760405162461bcd60e51b8152600401610541906123dc565b6108b27f17d79d89ee018972c13cf287c0a959e9afe18da13452dd04e1016c10c2909a346103cb610ee5565b806108dc57506108c0610ee5565b6001600160a01b03166108d1610c4a565b6001600160a01b0316145b6108f85760405162461bcd60e51b815260040161054190612158565b610901816112ed565b50565b61090c610acf565b156109295760405162461bcd60e51b8152600401610541906123dc565b6109557f17d79d89ee018972c13cf287c0a959e9afe18da13452dd04e1016c10c2909a346103cb610ee5565b8061097f5750610963610ee5565b6001600160a01b0316610974610c4a565b6001600160a01b0316145b61099b5760405162461bcd60e51b815260040161054190612158565b60038111156109bc5760405162461bcd60e51b8152600401610541906122ee565b6000816109e9576109cd600d61139c565b6109d8906000612710565b90506109e4600d610e9a565b610a6a565b8160011415610a14576109fc600e61139c565b610a0890612710612710565b90506109e4600e610e9a565b8160021415610a3f57610a27600f61139c565b610a3390614e20612710565b90506109e4600f610e9a565b8160031415610a6a57610a52601061139c565b610a5e90617530612710565b9050610a6a6010610e9a565b6105f983826113a0565b6000610a7e6106ee565b8210610a9c5760405162461bcd60e51b815260040161054190612675565b60088281548110610abd57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b600c5460ff1690565b6000818152600260205260408120546001600160a01b0316806104805760405162461bcd60e51b8152600401610541906124e4565b610b15610ee5565b6001600160a01b0316610b26610c4a565b6001600160a01b031614610b4c5760405162461bcd60e51b8152600401610541906125ae565b6109017f17d79d89ee018972c13cf287c0a959e9afe18da13452dd04e1016c10c2909a3482611173565b60006001600160a01b038216610b9e5760405162461bcd60e51b81526004016105419061249a565b506001600160a01b031660009081526003602052604090205490565b610bc2610ee5565b6001600160a01b0316610bd3610c4a565b6001600160a01b031614610bf95760405162461bcd60e51b8152600401610541906125ae565b61084460006113ba565b610c0b610ee5565b6001600160a01b0316610c1c610c4a565b6001600160a01b031614610c425760405162461bcd60e51b8152600401610541906125ae565b61084461140c565b600a546001600160a01b031690565b6000918252600b602090815260408084206001600160a01b0393909316845291905290205460ff1690565b606060018054610497906127b5565b600081565b6107f9610ca3610ee5565b8383611467565b60008082118015610cbc575061271082105b15610cc957506000610483565b61271082118015610cdb5750614e2082105b15610ce857506001610483565b614e2082118015610cfa575061753082105b15610d0757506002610483565b506003919050565b610d20610d1a610ee5565b83610f57565b610d3c5760405162461bcd60e51b815260040161054190612624565b610d488484848461150a565b50505050565b6060610d58610da7565b610d618361153d565b604051602001610d72929190611fd9565b6040516020818303038152906040529050919050565b610d918261072c565b610d9d81610756610ee5565b6105f983836111fa565b60408051808201909152601c81527f68747470733a2f2f6170692e7a656e636174732e696f2f636174732f00000000602082015290565b606060405180606001604052806027815260200161287860279139905090565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b610e34610ee5565b6001600160a01b0316610e45610c4a565b6001600160a01b031614610e6b5760405162461bcd60e51b8152600401610541906125ae565b6001600160a01b038116610e915760405162461bcd60e51b81526004016105419061222c565b610901816113ba565b80546001019055565b60006001600160e01b03198216637965db0b60e01b1480610480575061048082611658565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610f1e82610ad8565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610f6282610ec8565b610f7e5760405162461bcd60e51b815260040161054190612390565b6000610f8983610ad8565b9050806001600160a01b0316846001600160a01b03161480610fc45750836001600160a01b0316610fb98461051a565b6001600160a01b0316145b80610fd45750610fd48185610dfe565b949350505050565b826001600160a01b0316610fef82610ad8565b6001600160a01b0316146110155760405162461bcd60e51b815260040161054190612272565b6001600160a01b03821661103b5760405162461bcd60e51b815260040161054190612315565b61104683838361167d565b611051600082610ee9565b6001600160a01b038316600090815260036020526040812080546001929061107a90849061275b565b90915550506001600160a01b03821660009081526003602052604081208054600192906110a8908490612710565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a46105f98383836105f9565b6111198282610c59565b6107f957611131816001600160a01b03166014611688565b61113c836020611688565b60405160200161114d929190612008565b60408051601f198184030181529082905262461bcd60e51b8252610541916004016120e2565b61117d8282610c59565b6107f9576000828152600b602090815260408083206001600160a01b03851684529091529020805460ff191660011790556111b6610ee5565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6112048282610c59565b156107f9576000828152600b602090815260408083206001600160a01b03851684529091529020805460ff1916905561123b610ee5565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b611287610acf565b6112a35760405162461bcd60e51b81526004016105419061212a565b600c805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6112d6610ee5565b6040516112e3919061207d565b60405180910390a1565b60006112f882610ad8565b90506113068160008461167d565b611311600083610ee9565b6001600160a01b038116600090815260036020526040812080546001929061133a90849061275b565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a46107f9816000846105f9565b5490565b6107f9828260405180602001604052806000815250611841565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611414610acf565b156114315760405162461bcd60e51b8152600401610541906123dc565b600c805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586112d6610ee5565b816001600160a01b0316836001600160a01b031614156114995760405162461bcd60e51b815260040161054190612359565b6001600160a01b0383811660008181526005602090815260408083209487168084529490915290819020805460ff1916851515179055517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31906114fd9085906120ce565b60405180910390a3505050565b611515848484610fdc565b61152184848484611874565b610d485760405162461bcd60e51b8152600401610541906121da565b60608161156257506040805180820190915260018152600360fc1b6020820152610483565b8160005b811561158c5780611576816127f0565b91506115859050600a83612728565b9150611566565b60008167ffffffffffffffff8111156115b557634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156115df576020820181803683370190505b5090505b8415610fd4576115f460018361275b565b9150611601600a8661280b565b61160c906030612710565b60f81b81838151811061162f57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611651600a86612728565b94506115e3565b60006001600160e01b0319821663780e9d6360e01b148061048057506104808261198f565b6105f98383836119cf565b6060600061169783600261273c565b6116a2906002612710565b67ffffffffffffffff8111156116c857634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156116f2576020820181803683370190505b509050600360fc1b8160008151811061171b57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061175857634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600061177c84600261273c565b611787906001612710565b90505b600181111561181b576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106117c957634e487b7160e01b600052603260045260246000fd5b1a60f81b8282815181106117ed57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c936118148161279e565b905061178a565b50831561183a5760405162461bcd60e51b8152600401610541906120f5565b9392505050565b61184b8383611a58565b6118586000848484611874565b6105f95760405162461bcd60e51b8152600401610541906121da565b6000611888846001600160a01b0316611b3f565b1561198457836001600160a01b031663150b7a026118a4610ee5565b8786866040518563ffffffff1660e01b81526004016118c69493929190612091565b602060405180830381600087803b1580156118e057600080fd5b505af1925050508015611910575060408051601f3d908101601f1916820190925261190d91810190611f91565b60015b61196a573d80801561193e576040519150601f19603f3d011682016040523d82523d6000602084013e611943565b606091505b5080516119625760405162461bcd60e51b8152600401610541906121da565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610fd4565b506001949350505050565b60006001600160e01b031982166380ac58cd60e01b14806119c057506001600160e01b03198216635b5e139f60e01b145b80610480575061048082611b4e565b6119da8383836105f9565b6001600160a01b0383166119f6576119f181611b67565b611a19565b816001600160a01b0316836001600160a01b031614611a1957611a198382611bab565b6001600160a01b038216611a3557611a3081611c48565b6105f9565b826001600160a01b0316826001600160a01b0316146105f9576105f98282611d21565b6001600160a01b038216611a7e5760405162461bcd60e51b81526004016105419061252d565b611a8781610ec8565b15611aa45760405162461bcd60e51b8152600401610541906122b7565b611ab06000838361167d565b6001600160a01b0382166000908152600360205260408120805460019290611ad9908490612710565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46107f9600083836105f9565b6001600160a01b03163b151590565b6001600160e01b031981166301ffc9a760e01b14919050565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b60006001611bb884610b76565b611bc2919061275b565b600083815260076020526040902054909150808214611c15576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611c5a9060019061275b565b60008381526009602052604081205460088054939450909284908110611c9057634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060088381548110611cbf57634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611d0557634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000611d2c83610b76565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b80356001600160a01b038116811461048357600080fd5b600060208284031215611d8d578081fd5b61183a82611d65565b60008060408385031215611da8578081fd5b611db183611d65565b9150611dbf60208401611d65565b90509250929050565b600080600060608486031215611ddc578081fd5b611de584611d65565b9250611df360208501611d65565b9150604084013590509250925092565b60008060008060808587031215611e18578081fd5b611e2185611d65565b9350611e2f60208601611d65565b925060408501359150606085013567ffffffffffffffff80821115611e52578283fd5b818701915087601f830112611e65578283fd5b813581811115611e7757611e7761284b565b604051601f8201601f19908116603f01168101908382118183101715611e9f57611e9f61284b565b816040528281528a6020848701011115611eb7578586fd5b82602086016020830137918201602001949094529598949750929550505050565b60008060408385031215611eea578182fd5b611ef383611d65565b915060208301358015158114611f07578182fd5b809150509250929050565b60008060408385031215611f24578182fd5b611f2d83611d65565b946020939093013593505050565b600060208284031215611f4c578081fd5b5035919050565b60008060408385031215611f65578182fd5b82359150611dbf60208401611d65565b600060208284031215611f86578081fd5b813561183a81612861565b600060208284031215611fa2578081fd5b815161183a81612861565b60008151808452611fc5816020860160208601612772565b601f01601f19169290920160200192915050565b60008351611feb818460208801612772565b835190830190611fff818360208801612772565b01949350505050565b60007f416363657373436f6e74726f6c3a206163636f756e742000000000000000000082528351612040816017850160208801612772565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351612071816028840160208801612772565b01602801949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906120c490830184611fad565b9695505050505050565b901515815260200190565b90815260200190565b60006020825261183a6020830184611fad565b6020808252818101527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604082015260600190565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b60208082526018908201527f444f45535f4e4f545f484156455f5045524d495353494f4e0000000000000000604082015260600190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b6020808252600d908201526c1a5b9d985b1a59081b195d995b609a1b604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252601a908201527f596f752063616e206f6e6c792072756e2074686973206f6e6365000000000000604082015260600190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b6020808252602f908201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560408201526e103937b632b9903337b91039b2b63360891b606082015260800190565b600082198211156127235761272361281f565b500190565b60008261273757612737612835565b500490565b60008160001904831182151516156127565761275661281f565b500290565b60008282101561276d5761276d61281f565b500390565b60005b8381101561278d578181015183820152602001612775565b83811115610d485750506000910152565b6000816127ad576127ad61281f565b506000190190565b6002810460018216806127c957607f821691505b602082108114156127ea57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156128045761280461281f565b5060010190565b60008261281a5761281a612835565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461090157600080fdfe68747470733a2f2f6170692e7a656e636174732e696f2f636f6e74726163742f7a656e63617473a2646970667358221220d31a577478e11d06d69c7d741eccdf717c2e60e348b8085fe17743ebdcbc474964736f6c63430008010033
Deployed Bytecode Sourcemap
609:3981:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4396:191;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2488:98:5;;;:::i;:::-;;;;;;;:::i;3999:217::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3537:401::-;;;;;;:::i;:::-;;:::i;:::-;;3295:431:0;;;;;;:::i;:::-;;:::i;1615:111:8:-;;;:::i;:::-;;;;;;;:::i;4726:330:5:-;;;;;;:::i;:::-;;:::i;4008:129:1:-;;;;;;:::i;:::-;;:::i;4387:145::-;;;;;;:::i;:::-;;:::i;1291:253:8:-;;;;;;:::i;:::-;;:::i;5404:214:1:-;;;;;;:::i;:::-;;:::i;1431:63:0:-;;;:::i;5122:179:5:-;;;;;;:::i;:::-;;:::i;3046:207:0:-;;;;;;:::i;:::-;;:::i;2050:990::-;;;;;;:::i;:::-;;:::i;1798:230:8:-;;;;;;:::i;:::-;;:::i;1098:84:4:-;;;:::i;2191:235:5:-;;;;;;:::i;:::-;;:::i;1248:112:0:-;;;;;;:::i;:::-;;:::i;1929:205:5:-;;;;;;:::i;:::-;;:::i;1668:101:3:-;;;:::i;1366:59:0:-;;;:::i;1036:85:3:-;;;:::i;2909:145:1:-;;;;;;:::i;:::-;;:::i;2650:102:5:-;;;:::i;2027:49:1:-;;;:::i;4283:153:5:-;;;;;;:::i;:::-;;:::i;1685:360:0:-;;;;;;:::i;:::-;;:::i;5367:320:5:-;;;;;;:::i;:::-;;:::i;3964:174:0:-;;;;;;:::i;:::-;;:::i;4766:147:1:-;;;;;;:::i;:::-;;:::i;4144:115:0:-;;;:::i;4266:124::-;;;:::i;4502:162:5:-;;;;;;:::i;:::-;;:::i;1918:198:3:-;;;;;;:::i;:::-;;:::i;4396:191:0:-;4521:4;4544:36;4568:11;4544:23;:36::i;:::-;4537:43;;4396:191;;;;:::o;2488:98:5:-;2542:13;2574:5;2567:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2488:98;:::o;3999:217::-;4075:7;4102:16;4110:7;4102;:16::i;:::-;4094:73;;;;-1:-1:-1;;;4094:73:5;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;4185:24:5;;;;:15;:24;;;;;;-1:-1:-1;;;;;4185:24:5;;3999:217::o;3537:401::-;3617:13;3633:23;3648:7;3633:14;:23::i;:::-;3617:39;;3680:5;-1:-1:-1;;;;;3674:11:5;:2;-1:-1:-1;;;;;3674:11:5;;;3666:57;;;;-1:-1:-1;;;3666:57:5;;;;;;;:::i;:::-;3771:5;-1:-1:-1;;;;;3755:21:5;:12;:10;:12::i;:::-;-1:-1:-1;;;;;3755:21:5;;:62;;;;3780:37;3797:5;3804:12;:10;:12::i;3780:37::-;3734:165;;;;-1:-1:-1;;;3734:165:5;;;;;;;:::i;:::-;3910:21;3919:2;3923:7;3910:8;:21::i;:::-;3537:401;;;:::o;3295:431:0:-;1259:12:3;:10;:12::i;:::-;-1:-1:-1;;;;;1248:23:3;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1248:23:3;;1240:68;;;;-1:-1:-1;;;1240:68:3;;;;;;;:::i;:::-;3380:8:0::1;::::0;::::1;;3379:9;3371:49;;;;-1:-1:-1::0;;;3371:49:0::1;;;;;;;:::i;:::-;3435:13;3430:83;3462:2;3454:5;:10;3430:83;;;3489:13;3496:3;3500:1;3489:6;:13::i;:::-;3466:7:::0;::::1;::::0;::::1;:::i;:::-;;;;3430:83;;;;3527:13;3522:82;3554:1;3546:5;:9;3522:82;;;3580:13;3587:3;3591:1;3580:6;:13::i;:::-;3557:7:::0;::::1;::::0;::::1;:::i;:::-;;;;3522:82;;;;3618:13;3613:82;3645:1;3637:5;:9;3613:82;;;3671:13;3678:3;3682:1;3671:6;:13::i;:::-;3648:7:::0;::::1;::::0;::::1;:::i;:::-;;;;3613:82;;;-1:-1:-1::0;;3704:8:0::1;:15:::0;;-1:-1:-1;;3704:15:0::1;3715:4;3704:15;::::0;;3295:431::o;1615:111:8:-;1702:10;:17;1615:111;:::o;4726:330:5:-;4915:41;4934:12;:10;:12::i;:::-;4948:7;4915:18;:41::i;:::-;4907:103;;;;-1:-1:-1;;;4907:103:5;;;;;;;:::i;:::-;5021:28;5031:4;5037:2;5041:7;5021:9;:28::i;4008:129:1:-;4082:7;4108:12;;;:6;:12;;;;;:22;;;;4008:129::o;4387:145::-;4470:18;4483:4;4470:12;:18::i;:::-;2505:30;2516:4;2522:12;:10;:12::i;:::-;2505:10;:30::i;:::-;4500:25:::1;4511:4;4517:7;4500:10;:25::i;1291:253:8:-:0;1388:7;1423:23;1440:5;1423:16;:23::i;:::-;1415:5;:31;1407:87;;;;-1:-1:-1;;;1407:87:8;;;;;;;:::i;:::-;-1:-1:-1;;;;;;1511:19:8;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;1291:253::o;5404:214:1:-;5510:12;:10;:12::i;:::-;-1:-1:-1;;;;;5499:23:1;:7;-1:-1:-1;;;;;5499:23:1;;5491:83;;;;-1:-1:-1;;;5491:83:1;;;;;;;:::i;:::-;5585:26;5597:4;5603:7;5585:11;:26::i;:::-;5404:214;;:::o;1431:63:0:-;1259:12:3;:10;:12::i;:::-;-1:-1:-1;;;;;1248:23:3;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1248:23:3;;1240:68;;;;-1:-1:-1;;;1240:68:3;;;;;;;:::i;:::-;1477:10:0::1;:8;:10::i;:::-;1431:63::o:0;5122:179:5:-;5255:39;5272:4;5278:2;5282:7;5255:39;;;;;;;;;;;;:16;:39::i;3046:207:0:-;1412:8:4;:6;:8::i;:::-;1411:9;1403:38;;;;-1:-1:-1;;;1403:38:4;;;;;;;:::i;:::-;3120:45:0::1;816:36;3152:12;:10;:12::i;3120:45::-;:72;;;;3180:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;3169:23:0::1;:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;3169:23:0::1;;3120:72;3112:110;;;;-1:-1:-1::0;;;3112:110:0::1;;;;;;;:::i;:::-;3232:14;3238:7;3232:5;:14::i;:::-;3046:207:::0;:::o;2050:990::-;1412:8:4;:6;:8::i;:::-;1411:9;1403:38;;;;-1:-1:-1;;;1403:38:4;;;;;;;:::i;:::-;2130:45:0::1;816:36;2162:12;:10;:12::i;2130:45::-;:72;;;;2190:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;2179:23:0::1;:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;2179:23:0::1;;2130:72;2122:110;;;;-1:-1:-1::0;;;2122:110:0::1;;;;;;;:::i;:::-;2259:1;2250:5;:10;;2242:36;;;;-1:-1:-1::0;;;2242:36:0::1;;;;;;;:::i;:::-;2327:22;2367:10:::0;2363:631:::1;;2432:28;:18;:26;:28::i;:::-;2417:43;::::0;1097:1:::1;2417:43;:::i;:::-;2401:59;;2474:30;:18;:28;:30::i;:::-;2363:631;;;2524:5;2533:1;2524:10;2521:473;;;2589:28;:18;:26;:28::i;:::-;2574:43;::::0;1141:5:::1;2574:43;:::i;:::-;2558:59;;2631:30;:18;:28;:30::i;2521:473::-;2684:5;2693:1;2684:10;2681:313;;;2749:28;:18;:26;:28::i;:::-;2735:42;::::0;1189:5:::1;2735:42;:::i;:::-;2718:59;;2791:30;:18;:28;:30::i;2681:313::-;2843:5;2852:1;2843:10;2840:154;;;2908:28;:18;:26;:28::i;:::-;2894:42;::::0;1237:5:::1;2894:42;:::i;:::-;2877:59;;2950:30;:18;:28;:30::i;:::-;3003;3013:3;3018:14;3003:9;:30::i;1798:230:8:-:0;1873:7;1908:30;:28;:30::i;:::-;1900:5;:38;1892:95;;;;-1:-1:-1;;;1892:95:8;;;;;;;:::i;:::-;2004:10;2015:5;2004:17;;;;;;-1:-1:-1;;;2004:17:8;;;;;;;;;;;;;;;;;1997:24;;1798:230;;;:::o;1098:84:4:-;1168:7;;;;1098:84;:::o;2191:235:5:-;2263:7;2298:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2298:16:5;2332:19;2324:73;;;;-1:-1:-1;;;2324:73:5;;;;;;;:::i;1248:112:0:-;1259:12:3;:10;:12::i;:::-;-1:-1:-1;;;;;1248:23:3;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1248:23:3;;1240:68;;;;-1:-1:-1;;;1240:68:3;;;;;;;:::i;:::-;1313:40:0::1;816:36;1348:4;1313:10;:40::i;1929:205:5:-:0;2001:7;-1:-1:-1;;;;;2028:19:5;;2020:74;;;;-1:-1:-1;;;2020:74:5;;;;;;;:::i;:::-;-1:-1:-1;;;;;;2111:16:5;;;;;:9;:16;;;;;;;1929:205::o;1668:101:3:-;1259:12;:10;:12::i;:::-;-1:-1:-1;;;;;1248:23:3;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1248:23:3;;1240:68;;;;-1:-1:-1;;;1240:68:3;;;;;;;:::i;:::-;1732:30:::1;1759:1;1732:18;:30::i;1366:59:0:-:0;1259:12:3;:10;:12::i;:::-;-1:-1:-1;;;;;1248:23:3;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1248:23:3;;1240:68;;;;-1:-1:-1;;;1240:68:3;;;;;;;:::i;:::-;1410:8:0::1;:6;:8::i;1036:85:3:-:0;1108:6;;-1:-1:-1;;;;;1108:6:3;1036:85;:::o;2909:145:1:-;2995:4;3018:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;3018:29:1;;;;;;;;;;;;;;;2909:145::o;2650:102:5:-;2706:13;2738:7;2731:14;;;;;:::i;2027:49:1:-;2072:4;2027:49;:::o;4283:153:5:-;4377:52;4396:12;:10;:12::i;:::-;4410:8;4420;4377:18;:52::i;1685:360:0:-;1741:7;1097:1;1769:8;:22;:48;;;;;1141:5;1795:8;:22;1769:48;1765:74;;;-1:-1:-1;1838:1:0;1831:8;;1765:74;1141:5;1854:8;:22;:48;;;;;1189:5;1880:8;:22;1854:48;1850:74;;;-1:-1:-1;1923:1:0;1916:8;;1850:74;1189:5;1939:8;:22;:48;;;;;1237:5;1965:8;:22;1939:48;1935:74;;;-1:-1:-1;2008:1:0;2001:8;;1935:74;-1:-1:-1;2027:1:0;1685:360;;;:::o;5367:320:5:-;5536:41;5555:12;:10;:12::i;:::-;5569:7;5536:18;:41::i;:::-;5528:103;;;;-1:-1:-1;;;5528:103:5;;;;;;;:::i;:::-;5641:39;5655:4;5661:2;5665:7;5674:5;5641:13;:39::i;:::-;5367:320;;;;:::o;3964:174:0:-;4031:13;4087:14;:12;:14::i;:::-;4103:26;4120:8;4103:16;:26::i;:::-;4070:60;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4056:75;;3964:174;;;:::o;4766:147:1:-;4850:18;4863:4;4850:12;:18::i;:::-;2505:30;2516:4;2522:12;:10;:12::i;2505:30::-;4880:26:::1;4892:4;4898:7;4880:11;:26::i;4144:115:0:-:0;4215:37;;;;;;;;;;;;;;;;;4144:115;:::o;4266:124::-;4310:13;4335:48;;;;;;;;;;;;;;;;;;;4266:124;:::o;4502:162:5:-;-1:-1:-1;;;;;4622:25:5;;;4599:4;4622:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4502:162::o;1918:198:3:-;1259:12;:10;:12::i;:::-;-1:-1:-1;;;;;1248:23:3;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1248:23:3;;1240:68;;;;-1:-1:-1;;;1240:68:3;;;;;;;:::i;:::-;-1:-1:-1;;;;;2006:22:3;::::1;1998:73;;;;-1:-1:-1::0;;;1998:73:3::1;;;;;;;:::i;:::-;2081:28;2100:8;2081:18;:28::i;945:123:13:-:0;1032:19;;1050:1;1032:19;;;945:123::o;2620:202:1:-;2705:4;-1:-1:-1;;;;;;2728:47:1;;-1:-1:-1;;;2728:47:1;;:87;;;2779:36;2803:11;2779:23;:36::i;7159:125:5:-;7224:4;7247:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7247:16:5;:30;;;7159:125::o;640:96:12:-;719:10;640:96;:::o;11168:171:5:-;11242:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;11242:29:5;-1:-1:-1;;;;;11242:29:5;;;;;;;;:24;;11295:23;11242:24;11295:14;:23::i;:::-;-1:-1:-1;;;;;11286:46:5;;;;;;;;;;;11168:171;;:::o;7442:344::-;7535:4;7559:16;7567:7;7559;:16::i;:::-;7551:73;;;;-1:-1:-1;;;7551:73:5;;;;;;;:::i;:::-;7634:13;7650:23;7665:7;7650:14;:23::i;:::-;7634:39;;7702:5;-1:-1:-1;;;;;7691:16:5;:7;-1:-1:-1;;;;;7691:16:5;;:51;;;;7735:7;-1:-1:-1;;;;;7711:31:5;:20;7723:7;7711:11;:20::i;:::-;-1:-1:-1;;;;;7711:31:5;;7691:51;:87;;;;7746:32;7763:5;7770:7;7746:16;:32::i;:::-;7683:96;7442:344;-1:-1:-1;;;;7442:344:5:o;10452:605::-;10606:4;-1:-1:-1;;;;;10579:31:5;:23;10594:7;10579:14;:23::i;:::-;-1:-1:-1;;;;;10579:31:5;;10571:81;;;;-1:-1:-1;;;10571:81:5;;;;;;;:::i;:::-;-1:-1:-1;;;;;10670:16:5;;10662:65;;;;-1:-1:-1;;;10662:65:5;;;;;;;:::i;:::-;10738:39;10759:4;10765:2;10769:7;10738:20;:39::i;:::-;10839:29;10856:1;10860:7;10839:8;:29::i;:::-;-1:-1:-1;;;;;10879:15:5;;;;;;:9;:15;;;;;:20;;10898:1;;10879:15;:20;;10898:1;;10879:20;:::i;:::-;;;;-1:-1:-1;;;;;;;10909:13:5;;;;;;:9;:13;;;;;:18;;10926:1;;10909:13;:18;;10926:1;;10909:18;:::i;:::-;;;;-1:-1:-1;;10937:16:5;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;10937:21:5;-1:-1:-1;;;;;10937:21:5;;;;;;;;;10974:27;;10937:16;;10974:27;;;;;;;11012:38;11032:4;11038:2;11042:7;11012:19;:38::i;3335:492:1:-;3423:22;3431:4;3437:7;3423;:22::i;:::-;3418:403;;3606:41;3634:7;-1:-1:-1;;;;;3606:41:1;3644:2;3606:19;:41::i;:::-;3718:38;3746:4;3753:2;3718:19;:38::i;:::-;3513:265;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;3513:265:1;;;;;;;;;;-1:-1:-1;;;3461:349:1;;;;;;;:::i;6861:233::-;6944:22;6952:4;6958:7;6944;:22::i;:::-;6939:149;;6982:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;6982:29:1;;;;;;;;;:36;;-1:-1:-1;;6982:36:1;7014:4;6982:36;;;7064:12;:10;:12::i;:::-;-1:-1:-1;;;;;7037:40:1;7055:7;-1:-1:-1;;;;;7037:40:1;7049:4;7037:40;;;;;;;;;;6861:233;;:::o;7219:234::-;7302:22;7310:4;7316:7;7302;:22::i;:::-;7298:149;;;7372:5;7340:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;7340:29:1;;;;;;;;;:37;;-1:-1:-1;;7340:37:1;;;7423:12;:10;:12::i;:::-;-1:-1:-1;;;;;7396:40:1;7414:7;-1:-1:-1;;;;;7396:40:1;7408:4;7396:40;;;;;;;;;;7219:234;;:::o;2110:117:4:-;1677:8;:6;:8::i;:::-;1669:41;;;;-1:-1:-1;;;1669:41:4;;;;;;;:::i;:::-;2168:7:::1;:15:::0;;-1:-1:-1;;2168:15:4::1;::::0;;2198:22:::1;2207:12;:10;:12::i;:::-;2198:22;;;;;;:::i;:::-;;;;;;;;2110:117::o:0;9722:406:5:-;9781:13;9797:23;9812:7;9797:14;:23::i;:::-;9781:39;;9831:48;9852:5;9867:1;9871:7;9831:20;:48::i;:::-;9917:29;9934:1;9938:7;9917:8;:29::i;:::-;-1:-1:-1;;;;;9957:16:5;;;;;;:9;:16;;;;;:21;;9977:1;;9957:16;:21;;9977:1;;9957:21;:::i;:::-;;;;-1:-1:-1;;9995:16:5;;;;:7;:16;;;;;;9988:23;;-1:-1:-1;;;;;;9988:23:5;;;10027:36;10003:7;;9995:16;-1:-1:-1;;;;;10027:36:5;;;;;9995:16;;10027:36;10074:47;10094:5;10109:1;10113:7;10074:19;:47::i;827:112:13:-;918:14;;827:112::o;8116:108:5:-;8191:26;8201:2;8205:7;8191:26;;;;;;;;;;;;:9;:26::i;2270:187:3:-;2362:6;;;-1:-1:-1;;;;;2378:17:3;;;-1:-1:-1;;;;;;2378:17:3;;;;;;;2410:40;;2362:6;;;2378:17;2362:6;;2410:40;;2343:16;;2410:40;2270:187;;:::o;1863:115:4:-;1412:8;:6;:8::i;:::-;1411:9;1403:38;;;;-1:-1:-1;;;1403:38:4;;;;;;;:::i;:::-;1922:7:::1;:14:::0;;-1:-1:-1;;1922:14:4::1;1932:4;1922:14;::::0;;1951:20:::1;1958:12;:10;:12::i;11474:307:5:-:0;11624:8;-1:-1:-1;;;;;11615:17:5;:5;-1:-1:-1;;;;;11615:17:5;;;11607:55;;;;-1:-1:-1;;;11607:55:5;;;;;;;:::i;:::-;-1:-1:-1;;;;;11672:25:5;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;:46;;-1:-1:-1;;11672:46:5;;;;;;;11733:41;;;;;11672:46;;11733:41;:::i;:::-;;;;;;;;11474:307;;;:::o;6549:::-;6700:28;6710:4;6716:2;6720:7;6700:9;:28::i;:::-;6746:48;6769:4;6775:2;6779:7;6788:5;6746:22;:48::i;:::-;6738:111;;;;-1:-1:-1;;;6738:111:5;;;;;;;:::i;328:703:14:-;384:13;601:10;597:51;;-1:-1:-1;627:10:14;;;;;;;;;;;;-1:-1:-1;;;627:10:14;;;;;;597:51;672:5;657:12;711:75;718:9;;711:75;;743:8;;;;:::i;:::-;;-1:-1:-1;765:10:14;;-1:-1:-1;773:2:14;765:10;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;-1:-1:-1;;;817:17:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;817:17:14;;795:39;;844:150;851:10;;844:150;;877:11;887:1;877:11;;:::i;:::-;;-1:-1:-1;945:10:14;953:2;945:5;:10;:::i;:::-;932:24;;:2;:24;:::i;:::-;919:39;;902:6;909;902:14;;;;;;-1:-1:-1;;;902:14:14;;;;;;;;;;;;:56;-1:-1:-1;;;;;902:56:14;;;;;;;;-1:-1:-1;972:11:14;981:2;972:11;;:::i;:::-;;;844:150;;990:222:8;1092:4;-1:-1:-1;;;;;;1115:50:8;;-1:-1:-1;;;1115:50:8;;:90;;;1169:36;1193:11;1169:23;:36::i;1500:179:0:-;1627:45;1654:4;1660:2;1664:7;1627:26;:45::i;1588:441:14:-;1663:13;1688:19;1720:10;1724:6;1720:1;:10;:::i;:::-;:14;;1733:1;1720:14;:::i;:::-;1710:25;;;;;;-1:-1:-1;;;1710:25:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1710:25:14;;1688:47;;-1:-1:-1;;;1745:6:14;1752:1;1745:9;;;;;;-1:-1:-1;;;1745:9:14;;;;;;;;;;;;:15;-1:-1:-1;;;;;1745:15:14;;;;;;;;;-1:-1:-1;;;1770:6:14;1777:1;1770:9;;;;;;-1:-1:-1;;;1770:9:14;;;;;;;;;;;;:15;-1:-1:-1;;;;;1770:15:14;;;;;;;;-1:-1:-1;1800:9:14;1812:10;1816:6;1812:1;:10;:::i;:::-;:14;;1825:1;1812:14;:::i;:::-;1800:26;;1795:132;1832:1;1828;:5;1795:132;;;-1:-1:-1;;;1879:5:14;1887:3;1879:11;1866:25;;;;;-1:-1:-1;;;1866:25:14;;;;;;;;;;;;1854:6;1861:1;1854:9;;;;;;-1:-1:-1;;;1854:9:14;;;;;;;;;;;;:37;-1:-1:-1;;;;;1854:37:14;;;;;;;;-1:-1:-1;1915:1:14;1905:11;;;;;1835:3;;;:::i;:::-;;;1795:132;;;-1:-1:-1;1944:10:14;;1936:55;;;;-1:-1:-1;;;1936:55:14;;;;;;;:::i;:::-;2015:6;1588:441;-1:-1:-1;;;1588:441:14:o;8445:311:5:-;8570:18;8576:2;8580:7;8570:5;:18::i;:::-;8619:54;8650:1;8654:2;8658:7;8667:5;8619:22;:54::i;:::-;8598:151;;;;-1:-1:-1;;;8598:151:5;;;;;;;:::i;12334:778::-;12484:4;12504:15;:2;-1:-1:-1;;;;;12504:13:5;;:15::i;:::-;12500:606;;;12555:2;-1:-1:-1;;;;;12539:36:5;;12576:12;:10;:12::i;:::-;12590:4;12596:7;12605:5;12539:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12539:72:5;;;;;;;;-1:-1:-1;;12539:72:5;;;;;;;;;;;;:::i;:::-;;;12535:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12778:13:5;;12774:266;;12820:60;;-1:-1:-1;;;12820:60:5;;;;;;;:::i;12774:266::-;12992:6;12986:13;12977:6;12973:2;12969:15;12962:38;12535:519;-1:-1:-1;;;;;;12661:51:5;-1:-1:-1;;;12661:51:5;;-1:-1:-1;12654:58:5;;12500:606;-1:-1:-1;13091:4:5;12334:778;;;;;;:::o;1570:300::-;1672:4;-1:-1:-1;;;;;;1707:40:5;;-1:-1:-1;;;1707:40:5;;:104;;-1:-1:-1;;;;;;;1763:48:5;;-1:-1:-1;;;1763:48:5;1707:104;:156;;;;1827:36;1851:11;1827:23;:36::i;2624:572:8:-;2763:45;2790:4;2796:2;2800:7;2763:26;:45::i;:::-;-1:-1:-1;;;;;2823:18:8;;2819:183;;2857:40;2889:7;2857:31;:40::i;:::-;2819:183;;;2926:2;-1:-1:-1;;;;;2918:10:8;:4;-1:-1:-1;;;;;2918:10:8;;2914:88;;2944:47;2977:4;2983:7;2944:32;:47::i;:::-;-1:-1:-1;;;;;3015:16:8;;3011:179;;3047:45;3084:7;3047:36;:45::i;:::-;3011:179;;;3119:4;-1:-1:-1;;;;;3113:10:8;:2;-1:-1:-1;;;;;3113:10:8;;3109:81;;3139:40;3167:2;3171:7;3139:27;:40::i;9078:427:5:-;-1:-1:-1;;;;;9157:16:5;;9149:61;;;;-1:-1:-1;;;9149:61:5;;;;;;;:::i;:::-;9229:16;9237:7;9229;:16::i;:::-;9228:17;9220:58;;;;-1:-1:-1;;;9220:58:5;;;;;;;:::i;:::-;9289:45;9318:1;9322:2;9326:7;9289:20;:45::i;:::-;-1:-1:-1;;;;;9345:13:5;;;;;;:9;:13;;;;;:18;;9362:1;;9345:13;:18;;9362:1;;9345:18;:::i;:::-;;;;-1:-1:-1;;9373:16:5;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9373:21:5;-1:-1:-1;;;;;9373:21:5;;;;;;;;9410:33;;9373:16;;;9410:33;;9373:16;;9410:33;9454:44;9482:1;9486:2;9490:7;9454:19;:44::i;1175:320:11:-;-1:-1:-1;;;;;1465:19:11;;:23;;;1175:320::o;829:155:15:-;-1:-1:-1;;;;;;937:40:15;;-1:-1:-1;;;937:40:15;829:155;;;:::o;3902:161:8:-;4005:10;:17;;3978:24;;;;:15;:24;;;;;:44;;;4032:24;;;;;;;;;;;;3902:161::o;4680:970::-;4942:22;4992:1;4967:22;4984:4;4967:16;:22::i;:::-;:26;;;;:::i;:::-;5003:18;5024:26;;;:17;:26;;;;;;4942:51;;-1:-1:-1;5154:28:8;;;5150:323;;-1:-1:-1;;;;;5220:18:8;;5198:19;5220:18;;;:12;:18;;;;;;;;:34;;;;;;;;;5269:30;;;;;;:44;;;5385:30;;:17;:30;;;;;:43;;;5150:323;-1:-1:-1;5566:26:8;;;;:17;:26;;;;;;;;5559:33;;;-1:-1:-1;;;;;5609:18:8;;;;;:12;:18;;;;;:34;;;;;;;5602:41;4680:970::o;5938:1061::-;6212:10;:17;6187:22;;6212:21;;6232:1;;6212:21;:::i;:::-;6243:18;6264:24;;;:15;:24;;;;;;6632:10;:26;;6187:46;;-1:-1:-1;6264:24:8;;6187:46;;6632:26;;;;-1:-1:-1;;;6632:26:8;;;;;;;;;;;;;;;;;6610:48;;6694:11;6669:10;6680;6669:22;;;;;;-1:-1:-1;;;6669:22:8;;;;;;;;;;;;;;;;;;;;:36;;;;6773:28;;;:15;:28;;;;;;;:41;;;6942:24;;;;;6935:31;6976:10;:16;;;;;-1:-1:-1;;;6976:16:8;;;;;;;;;;;;;;;;;;;;;;;;;;5938:1061;;;;:::o;3490:217::-;3574:14;3591:20;3608:2;3591:16;:20::i;:::-;-1:-1:-1;;;;;3621:16:8;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;3665:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;3490:217:8:o;14:175:18:-;84:20;;-1:-1:-1;;;;;133:31:18;;123:42;;113:2;;179:1;176;169:12;194:198;;306:2;294:9;285:7;281:23;277:32;274:2;;;327:6;319;312:22;274:2;355:31;376:9;355:31;:::i;397:274::-;;;526:2;514:9;505:7;501:23;497:32;494:2;;;547:6;539;532:22;494:2;575:31;596:9;575:31;:::i;:::-;565:41;;625:40;661:2;650:9;646:18;625:40;:::i;:::-;615:50;;484:187;;;;;:::o;676:342::-;;;;822:2;810:9;801:7;797:23;793:32;790:2;;;843:6;835;828:22;790:2;871:31;892:9;871:31;:::i;:::-;861:41;;921:40;957:2;946:9;942:18;921:40;:::i;:::-;911:50;;1008:2;997:9;993:18;980:32;970:42;;780:238;;;;;:::o;1023:1187::-;;;;;1195:3;1183:9;1174:7;1170:23;1166:33;1163:2;;;1217:6;1209;1202:22;1163:2;1245:31;1266:9;1245:31;:::i;:::-;1235:41;;1295:40;1331:2;1320:9;1316:18;1295:40;:::i;:::-;1285:50;;1382:2;1371:9;1367:18;1354:32;1344:42;;1437:2;1426:9;1422:18;1409:32;1460:18;1501:2;1493:6;1490:14;1487:2;;;1522:6;1514;1507:22;1487:2;1565:6;1554:9;1550:22;1540:32;;1610:7;1603:4;1599:2;1595:13;1591:27;1581:2;;1637:6;1629;1622:22;1581:2;1678;1665:16;1700:2;1696;1693:10;1690:2;;;1706:18;;:::i;:::-;1781:2;1775:9;1749:2;1835:13;;-1:-1:-1;;1831:22:18;;;1855:2;1827:31;1823:40;1811:53;;;1879:18;;;1899:22;;;1876:46;1873:2;;;1925:18;;:::i;:::-;1965:10;1961:2;1954:22;2000:2;1992:6;1985:18;2040:7;2035:2;2030;2026;2022:11;2018:20;2015:33;2012:2;;;2066:6;2058;2051:22;2012:2;2127;2122;2118;2114:11;2109:2;2101:6;2097:15;2084:46;2150:15;;;2167:2;2146:24;2139:40;;;;1153:1057;;;;-1:-1:-1;1153:1057:18;;-1:-1:-1;;;;1153:1057:18:o;2215:369::-;;;2341:2;2329:9;2320:7;2316:23;2312:32;2309:2;;;2362:6;2354;2347:22;2309:2;2390:31;2411:9;2390:31;:::i;:::-;2380:41;;2471:2;2460:9;2456:18;2443:32;2518:5;2511:13;2504:21;2497:5;2494:32;2484:2;;2545:6;2537;2530:22;2484:2;2573:5;2563:15;;;2299:285;;;;;:::o;2589:266::-;;;2718:2;2706:9;2697:7;2693:23;2689:32;2686:2;;;2739:6;2731;2724:22;2686:2;2767:31;2788:9;2767:31;:::i;:::-;2757:41;2845:2;2830:18;;;;2817:32;;-1:-1:-1;;;2676:179:18:o;2860:190::-;;2972:2;2960:9;2951:7;2947:23;2943:32;2940:2;;;2993:6;2985;2978:22;2940:2;-1:-1:-1;3021:23:18;;2930:120;-1:-1:-1;2930:120:18:o;3055:266::-;;;3184:2;3172:9;3163:7;3159:23;3155:32;3152:2;;;3205:6;3197;3190:22;3152:2;3246:9;3233:23;3223:33;;3275:40;3311:2;3300:9;3296:18;3275:40;:::i;3326:257::-;;3437:2;3425:9;3416:7;3412:23;3408:32;3405:2;;;3458:6;3450;3443:22;3405:2;3502:9;3489:23;3521:32;3547:5;3521:32;:::i;3588:261::-;;3710:2;3698:9;3689:7;3685:23;3681:32;3678:2;;;3731:6;3723;3716:22;3678:2;3768:9;3762:16;3787:32;3813:5;3787:32;:::i;4049:259::-;;4130:5;4124:12;4157:6;4152:3;4145:19;4173:63;4229:6;4222:4;4217:3;4213:14;4206:4;4199:5;4195:16;4173:63;:::i;:::-;4290:2;4269:15;-1:-1:-1;;4265:29:18;4256:39;;;;4297:4;4252:50;;4100:208;-1:-1:-1;;4100:208:18:o;4313:470::-;;4530:6;4524:13;4546:53;4592:6;4587:3;4580:4;4572:6;4568:17;4546:53;:::i;:::-;4662:13;;4621:16;;;;4684:57;4662:13;4621:16;4718:4;4706:17;;4684:57;:::i;:::-;4757:20;;4500:283;-1:-1:-1;;;;4500:283:18:o;4788:786::-;;5199:25;5194:3;5187:38;5254:6;5248:13;5270:62;5325:6;5320:2;5315:3;5311:12;5304:4;5296:6;5292:17;5270:62;:::i;:::-;-1:-1:-1;;;5391:2:18;5351:16;;;5383:11;;;5376:40;5441:13;;5463:63;5441:13;5512:2;5504:11;;5497:4;5485:17;;5463:63;:::i;:::-;5546:17;5565:2;5542:26;;5177:397;-1:-1:-1;;;;5177:397:18:o;5579:203::-;-1:-1:-1;;;;;5743:32:18;;;;5725:51;;5713:2;5698:18;;5680:102::o;5787:490::-;-1:-1:-1;;;;;6056:15:18;;;6038:34;;6108:15;;6103:2;6088:18;;6081:43;6155:2;6140:18;;6133:34;;;6203:3;6198:2;6183:18;;6176:31;;;5787:490;;6224:47;;6251:19;;6243:6;6224:47;:::i;:::-;6216:55;5990:287;-1:-1:-1;;;;;;5990:287:18:o;6282:187::-;6447:14;;6440:22;6422:41;;6410:2;6395:18;;6377:92::o;6474:177::-;6620:25;;;6608:2;6593:18;;6575:76::o;6656:221::-;;6805:2;6794:9;6787:21;6825:46;6867:2;6856:9;6852:18;6844:6;6825:46;:::i;6882:356::-;7084:2;7066:21;;;7103:18;;;7096:30;7162:34;7157:2;7142:18;;7135:62;7229:2;7214:18;;7056:182::o;7243:344::-;7445:2;7427:21;;;7484:2;7464:18;;;7457:30;-1:-1:-1;;;7518:2:18;7503:18;;7496:50;7578:2;7563:18;;7417:170::o;7592:348::-;7794:2;7776:21;;;7833:2;7813:18;;;7806:30;7872:26;7867:2;7852:18;;7845:54;7931:2;7916:18;;7766:174::o;7945:407::-;8147:2;8129:21;;;8186:2;8166:18;;;8159:30;8225:34;8220:2;8205:18;;8198:62;-1:-1:-1;;;8291:2:18;8276:18;;8269:41;8342:3;8327:19;;8119:233::o;8357:414::-;8559:2;8541:21;;;8598:2;8578:18;;;8571:30;8637:34;8632:2;8617:18;;8610:62;-1:-1:-1;;;8703:2:18;8688:18;;8681:48;8761:3;8746:19;;8531:240::o;8776:402::-;8978:2;8960:21;;;9017:2;8997:18;;;8990:30;9056:34;9051:2;9036:18;;9029:62;-1:-1:-1;;;9122:2:18;9107:18;;9100:36;9168:3;9153:19;;8950:228::o;9183:401::-;9385:2;9367:21;;;9424:2;9404:18;;;9397:30;9463:34;9458:2;9443:18;;9436:62;-1:-1:-1;;;9529:2:18;9514:18;;9507:35;9574:3;9559:19;;9357:227::o;9589:352::-;9791:2;9773:21;;;9830:2;9810:18;;;9803:30;9869;9864:2;9849:18;;9842:58;9932:2;9917:18;;9763:178::o;9946:337::-;10148:2;10130:21;;;10187:2;10167:18;;;10160:30;-1:-1:-1;;;10221:2:18;10206:18;;10199:43;10274:2;10259:18;;10120:163::o;10288:400::-;10490:2;10472:21;;;10529:2;10509:18;;;10502:30;10568:34;10563:2;10548:18;;10541:62;-1:-1:-1;;;10634:2:18;10619:18;;10612:34;10678:3;10663:19;;10462:226::o;10693:349::-;10895:2;10877:21;;;10934:2;10914:18;;;10907:30;10973:27;10968:2;10953:18;;10946:55;11033:2;11018:18;;10867:175::o;11047:408::-;11249:2;11231:21;;;11288:2;11268:18;;;11261:30;11327:34;11322:2;11307:18;;11300:62;-1:-1:-1;;;11393:2:18;11378:18;;11371:42;11445:3;11430:19;;11221:234::o;11460:340::-;11662:2;11644:21;;;11701:2;11681:18;;;11674:30;-1:-1:-1;;;11735:2:18;11720:18;;11713:46;11791:2;11776:18;;11634:166::o;11805:420::-;12007:2;11989:21;;;12046:2;12026:18;;;12019:30;12085:34;12080:2;12065:18;;12058:62;12156:26;12151:2;12136:18;;12129:54;12215:3;12200:19;;11979:246::o;12230:350::-;12432:2;12414:21;;;12471:2;12451:18;;;12444:30;12510:28;12505:2;12490:18;;12483:56;12571:2;12556:18;;12404:176::o;12585:406::-;12787:2;12769:21;;;12826:2;12806:18;;;12799:30;12865:34;12860:2;12845:18;;12838:62;-1:-1:-1;;;12931:2:18;12916:18;;12909:40;12981:3;12966:19;;12759:232::o;12996:405::-;13198:2;13180:21;;;13237:2;13217:18;;;13210:30;13276:34;13271:2;13256:18;;13249:62;-1:-1:-1;;;13342:2:18;13327:18;;13320:39;13391:3;13376:19;;13170:231::o;13406:356::-;13608:2;13590:21;;;13627:18;;;13620:30;13686:34;13681:2;13666:18;;13659:62;13753:2;13738:18;;13580:182::o;13767:408::-;13969:2;13951:21;;;14008:2;13988:18;;;13981:30;14047:34;14042:2;14027:18;;14020:62;-1:-1:-1;;;14113:2:18;14098:18;;14091:42;14165:3;14150:19;;13941:234::o;14180:356::-;14382:2;14364:21;;;14401:18;;;14394:30;14460:34;14455:2;14440:18;;14433:62;14527:2;14512:18;;14354:182::o;14541:397::-;14743:2;14725:21;;;14782:2;14762:18;;;14755:30;14821:34;14816:2;14801:18;;14794:62;-1:-1:-1;;;14887:2:18;14872:18;;14865:31;14928:3;14913:19;;14715:223::o;14943:413::-;15145:2;15127:21;;;15184:2;15164:18;;;15157:30;15223:34;15218:2;15203:18;;15196:62;-1:-1:-1;;;15289:2:18;15274:18;;15267:47;15346:3;15331:19;;15117:239::o;15361:408::-;15563:2;15545:21;;;15602:2;15582:18;;;15575:30;15641:34;15636:2;15621:18;;15614:62;-1:-1:-1;;;15707:2:18;15692:18;;15685:42;15759:3;15744:19;;15535:234::o;15774:411::-;15976:2;15958:21;;;16015:2;15995:18;;;15988:30;16054:34;16049:2;16034:18;;16027:62;-1:-1:-1;;;16120:2:18;16105:18;;16098:45;16175:3;16160:19;;15948:237::o;16372:128::-;;16443:1;16439:6;16436:1;16433:13;16430:2;;;16449:18;;:::i;:::-;-1:-1:-1;16485:9:18;;16420:80::o;16505:120::-;;16571:1;16561:2;;16576:18;;:::i;:::-;-1:-1:-1;16610:9:18;;16551:74::o;16630:168::-;;16736:1;16732;16728:6;16724:14;16721:1;16718:21;16713:1;16706:9;16699:17;16695:45;16692:2;;;16743:18;;:::i;:::-;-1:-1:-1;16783:9:18;;16682:116::o;16803:125::-;;16871:1;16868;16865:8;16862:2;;;16876:18;;:::i;:::-;-1:-1:-1;16913:9:18;;16852:76::o;16933:258::-;17005:1;17015:113;17029:6;17026:1;17023:13;17015:113;;;17105:11;;;17099:18;17086:11;;;17079:39;17051:2;17044:10;17015:113;;;17146:6;17143:1;17140:13;17137:2;;;-1:-1:-1;;17181:1:18;17163:16;;17156:27;16986:205::o;17196:136::-;;17263:5;17253:2;;17272:18;;:::i;:::-;-1:-1:-1;;;17308:18:18;;17243:89::o;17337:380::-;17422:1;17412:12;;17469:1;17459:12;;;17480:2;;17534:4;17526:6;17522:17;17512:27;;17480:2;17587;17579:6;17576:14;17556:18;17553:38;17550:2;;;17633:10;17628:3;17624:20;17621:1;17614:31;17668:4;17665:1;17658:15;17696:4;17693:1;17686:15;17550:2;;17392:325;;;:::o;17722:135::-;;-1:-1:-1;;17782:17:18;;17779:2;;;17802:18;;:::i;:::-;-1:-1:-1;17849:1:18;17838:13;;17769:88::o;17862:112::-;;17920:1;17910:2;;17925:18;;:::i;:::-;-1:-1:-1;17959:9:18;;17900:74::o;17979:127::-;18040:10;18035:3;18031:20;18028:1;18021:31;18071:4;18068:1;18061:15;18095:4;18092:1;18085:15;18111:127;18172:10;18167:3;18163:20;18160:1;18153:31;18203:4;18200:1;18193:15;18227:4;18224:1;18217:15;18243:127;18304:10;18299:3;18295:20;18292:1;18285:31;18335:4;18332:1;18325:15;18359:4;18356:1;18349:15;18375:133;-1:-1:-1;;;;;;18451:32:18;;18441:43;;18431:2;;18498:1;18495;18488:12
Swarm Source
ipfs://d31a577478e11d06d69c7d741eccdf717c2e60e348b8085fe17743ebdcbc4749
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.