ERC-721
Overview
Max Total Supply
9,673 ROOT
Holders
625
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
0 ROOTLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
AzurRoot
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import {MultiOwnable} from "./MultiOwnable.sol"; import {IDelegationRegistry} from "./IDelegationRegistry.sol"; import {ERC721} from "solmate/tokens/ERC721.sol"; import {ERC2981} from "openzeppelin-contracts/contracts/token/common/ERC2981.sol"; import {Strings} from "openzeppelin-contracts/contracts/utils/Strings.sol"; import {DefaultOperatorFilterer} from "operator-filter-registry/DefaultOperatorFilterer.sol"; interface IERC721 { function ownerOf(uint256 tokenId) external view returns (address); function transferFrom(address from, address to, uint256 id) external; } interface IAzurian { function burnRootAndMint(uint256[] calldata rootIds) external; } contract AzurRoot is DefaultOperatorFilterer, ERC721, ERC2981, MultiOwnable { /// @notice The Bored and Dangerous contract address public immutable BOOK; /// @notice Total number of tokens which have minted uint256 public totalSupply = 0; /// @notice The prefix to attach to the tokenId to get the metadata uri string public baseTokenURI; /// @notice Whether the burning is open bool public burnOpen; /// @notice The delegation registry for burning root authentication IDelegationRegistry public constant delegationRegistry = IDelegationRegistry(0x00000000000076A84feF008CDAbe6409d2FE638B); /// @notice Emitted when a token is minted event Mint(address indexed owner, uint256 indexed tokenId); /// @notice Raised when the mint has not reached the required timestamp error MintNotOpen(); /// @notice Raised when two calldata arrays do not have the same length error MismatchedArrays(); /// @notice Raised when `sender` does not pass the proper ether amount to `recipient` error FailedToSendEther(address sender, address recipient); /// @notice Raised when `msg.sender` does not own the roots they're attempting to burn error BurnAuthentication(); constructor(address _book) ERC721("Azur Root", "ROOT") { BOOK = _book; } /// @notice Admin mint a batch of tokens function ownerMint(address[] calldata recipients) external { if (msg.sender != mintingOwner) { revert AccessControl(); } unchecked { uint256 _totalSupply = totalSupply; for (uint256 i = 0; i < recipients.length; ++i) { _mint(recipients[i], _totalSupply + i); } totalSupply += recipients.length; } } /// @notice Burn a token function burn(uint256 id) external { address from = _ownerOf[id]; require( msg.sender == from || isApprovedForAll[from][msg.sender] || msg.sender == getApproved[id], "NOT_AUTHORIZED" ); _burn(id); } ////////////////// // BOOK BURNING // ////////////////// /// @notice Burn a book to receive an azur root function burnBooks(uint256[] calldata tokenIds) external { if (!burnOpen) { revert MintNotOpen(); } // Cache the totalSupply to minimize storage reads uint256 _totalSupply = totalSupply; for (uint256 i = 0; i < tokenIds.length; ++i) { // Attempt to transfer token from the msg sender, revert if not owned or approved IERC721(BOOK).transferFrom(msg.sender, address(this), tokenIds[i]); _mint(msg.sender, _totalSupply + i); } totalSupply += tokenIds.length; } /// @notice Burn a root to receive an azurian function burnRoots(address azurians, uint256[] calldata rootIds) external { for (uint256 i = 0; i < rootIds.length; ++i) { address rootOwner = ownerOf(rootIds[i]); if (!(msg.sender == rootOwner || delegationRegistry.checkDelegateForToken(msg.sender, rootOwner, address(this), rootIds[i]))) { revert BurnAuthentication(); } _burn(rootIds[i]); } IAzurian(azurians).burnRootAndMint(rootIds); } ///////////////////////// // ADMIN FUNCTIONALITY // ///////////////////////// /// @notice Set metadata function setBaseTokenURI(string memory _baseTokenURI) external { if (msg.sender != metadataOwner) { revert AccessControl(); } baseTokenURI = _baseTokenURI; } /// @notice Set burn open function setBurnOpen(bool _burnOpen) external { if (msg.sender != mintingOwner) { revert AccessControl(); } burnOpen = _burnOpen; } /// @notice Claim funds function claimFunds(address payable recipient) external { if (!(msg.sender == mintingOwner || msg.sender == metadataOwner || msg.sender == royaltyOwner)) { revert AccessControl(); } (bool sent,) = recipient.call{value: address(this).balance}(""); if (!sent) { revert FailedToSendEther(address(this), recipient); } } // ROYALTY FUNCTIONALITY /// @dev See {IERC165-supportsInterface}. function supportsInterface(bytes4 interfaceId) public pure override(ERC721, ERC2981) returns (bool) { return interfaceId == 0x2a55205a // ERC165 Interface ID for ERC2981 || interfaceId == 0x01ffc9a7 // ERC165 Interface ID for ERC165 || interfaceId == 0x80ac58cd // ERC165 Interface ID for ERC721 || interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata } /// @dev See {ERC2981-_setDefaultRoyalty}. function setDefaultRoyalty(address receiver, uint96 feeNumerator) external { if (msg.sender != royaltyOwner) { revert AccessControl(); } _setDefaultRoyalty(receiver, feeNumerator); } /// @dev See {ERC2981-_deleteDefaultRoyalty}. function deleteDefaultRoyalty() external { if (msg.sender != royaltyOwner) { revert AccessControl(); } _deleteDefaultRoyalty(); } /// @dev See {ERC2981-_setTokenRoyalty}. function setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) external { if (msg.sender != royaltyOwner) { revert AccessControl(); } _setTokenRoyalty(tokenId, receiver, feeNumerator); } /// @dev See {ERC2981-_resetTokenRoyalty}. function resetTokenRoyalty(uint256 tokenId) external { if (msg.sender != royaltyOwner) { revert AccessControl(); } _resetTokenRoyalty(tokenId); } // METADATA FUNCTIONALITY /// @notice Returns the metadata URI for a given token function tokenURI(uint256 tokenId) public view override returns (string memory) { return string(abi.encodePacked(baseTokenURI, Strings.toString(tokenId))); } // OPERATOR FILTER function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) { super.setApprovalForAll(operator, approved); } function approve(address operator, uint256 tokenId) public override onlyAllowedOperatorApproval(operator) { super.approve(operator, tokenId); } function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; abstract contract MultiOwnable { /// @notice The address which can admin mint for free, set merkle roots, and set auction params address public mintingOwner; /// @notice The address which can update the metadata uri address public metadataOwner; /// @notice The address which will be returned for the ERC721 owner() standard for setting royalties address public royaltyOwner; /// @notice Raised when an unauthorized user calls a gated function error AccessControl(); constructor() { mintingOwner = msg.sender; metadataOwner = msg.sender; royaltyOwner = msg.sender; } modifier onlyMintingOwner() { if (msg.sender != mintingOwner) { revert AccessControl(); } _; } modifier onlyMetadataOwner() { if (msg.sender != metadataOwner) { revert AccessControl(); } _; } modifier onlyRoyaltyOwner() { if (msg.sender != royaltyOwner) { revert AccessControl(); } _; } //////////////////////////////////// // ACCESS CONTROL ADDRESS UPDATES // //////////////////////////////////// /// @notice Update the mintingOwner /// @dev Can also be used to revoke this power by setting to 0x0 function setMintingOwner(address _mintingOwner) external onlyMintingOwner { mintingOwner = _mintingOwner; } /// @notice Update the metadataOwner /// @dev Can also be used to revoke this power by setting to 0x0 /// @dev Should only be revoked after setting an IPFS url so others can pin function setMetadataOwner(address _metadataOwner) external onlyMetadataOwner { metadataOwner = _metadataOwner; } /// @notice Update the royaltyOwner /// @dev Can also be used to revoke this power by setting to 0x0 function setRoyaltyOwner(address _royaltyOwner) external onlyRoyaltyOwner { royaltyOwner = _royaltyOwner; } /// @notice The address which can set royalties function owner() external view returns (address) { return royaltyOwner; } }
// SPDX-License-Identifier: CC0-1.0 pragma solidity ^0.8.17; /** * @title An immutable registry contract to be deployed as a standalone primitive * @dev See EIP-5639, new project launches can read previous cold wallet -> hot wallet delegations * from here and integrate those permissions into their flow */ interface IDelegationRegistry { /// @notice Delegation type enum DelegationType { NONE, ALL, CONTRACT, TOKEN } /// @notice Info about a single delegation, used for onchain enumeration struct DelegationInfo { DelegationType type_; address vault; address delegate; address contract_; uint256 tokenId; } /// @notice Info about a single contract-level delegation struct ContractDelegation { address contract_; address delegate; } /// @notice Info about a single token-level delegation struct TokenDelegation { address contract_; uint256 tokenId; address delegate; } /// @notice Emitted when a user delegates their entire wallet event DelegateForAll(address vault, address delegate, bool value); /// @notice Emitted when a user delegates a specific contract event DelegateForContract(address vault, address delegate, address contract_, bool value); /// @notice Emitted when a user delegates a specific token event DelegateForToken(address vault, address delegate, address contract_, uint256 tokenId, bool value); /// @notice Emitted when a user revokes all delegations event RevokeAllDelegates(address vault); /// @notice Emitted when a user revoes all delegations for a given delegate event RevokeDelegate(address vault, address delegate); /** * ----------- WRITE ----------- */ /** * @notice Allow the delegate to act on your behalf for all contracts * @param delegate The hotwallet to act on your behalf * @param value Whether to enable or disable delegation for this address, true for setting and false for revoking */ function delegateForAll(address delegate, bool value) external; /** * @notice Allow the delegate to act on your behalf for a specific contract * @param delegate The hotwallet to act on your behalf * @param contract_ The address for the contract you're delegating * @param value Whether to enable or disable delegation for this address, true for setting and false for revoking */ function delegateForContract(address delegate, address contract_, bool value) external; /** * @notice Allow the delegate to act on your behalf for a specific token * @param delegate The hotwallet to act on your behalf * @param contract_ The address for the contract you're delegating * @param tokenId The token id for the token you're delegating * @param value Whether to enable or disable delegation for this address, true for setting and false for revoking */ function delegateForToken(address delegate, address contract_, uint256 tokenId, bool value) external; /** * @notice Revoke all delegates */ function revokeAllDelegates() external; /** * @notice Revoke a specific delegate for all their permissions * @param delegate The hotwallet to revoke */ function revokeDelegate(address delegate) external; /** * @notice Remove yourself as a delegate for a specific vault * @param vault The vault which delegated to the msg.sender, and should be removed */ function revokeSelf(address vault) external; /** * ----------- READ ----------- */ /** * @notice Returns all active delegations a given delegate is able to claim on behalf of * @param delegate The delegate that you would like to retrieve delegations for * @return info Array of DelegationInfo structs */ function getDelegationsByDelegate(address delegate) external view returns (DelegationInfo[] memory); /** * @notice Returns an array of wallet-level delegates for a given vault * @param vault The cold wallet who issued the delegation * @return addresses Array of wallet-level delegates for a given vault */ function getDelegatesForAll(address vault) external view returns (address[] memory); /** * @notice Returns an array of contract-level delegates for a given vault and contract * @param vault The cold wallet who issued the delegation * @param contract_ The address for the contract you're delegating * @return addresses Array of contract-level delegates for a given vault and contract */ function getDelegatesForContract(address vault, address contract_) external view returns (address[] memory); /** * @notice Returns an array of contract-level delegates for a given vault's token * @param vault The cold wallet who issued the delegation * @param contract_ The address for the contract holding the token * @param tokenId The token id for the token you're delegating * @return addresses Array of contract-level delegates for a given vault's token */ function getDelegatesForToken(address vault, address contract_, uint256 tokenId) external view returns (address[] memory); /** * @notice Returns all contract-level delegations for a given vault * @param vault The cold wallet who issued the delegations * @return delegations Array of ContractDelegation structs */ function getContractLevelDelegations(address vault) external view returns (ContractDelegation[] memory delegations); /** * @notice Returns all token-level delegations for a given vault * @param vault The cold wallet who issued the delegations * @return delegations Array of TokenDelegation structs */ function getTokenLevelDelegations(address vault) external view returns (TokenDelegation[] memory delegations); /** * @notice Returns true if the address is delegated to act on the entire vault * @param delegate The hotwallet to act on your behalf * @param vault The cold wallet who issued the delegation */ function checkDelegateForAll(address delegate, address vault) external view returns (bool); /** * @notice Returns true if the address is delegated to act on your behalf for a token contract or an entire vault * @param delegate The hotwallet to act on your behalf * @param contract_ The address for the contract you're delegating * @param vault The cold wallet who issued the delegation */ function checkDelegateForContract(address delegate, address vault, address contract_) external view returns (bool); /** * @notice Returns true if the address is delegated to act on your behalf for a specific token, the token's contract or an entire vault * @param delegate The hotwallet to act on your behalf * @param contract_ The address for the contract you're delegating * @param tokenId The token id for the token you're delegating * @param vault The cold wallet who issued the delegation */ function checkDelegateForToken(address delegate, address vault, address contract_, uint256 tokenId) external view returns (bool); }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.8.0; /// @notice Modern, minimalist, and gas efficient ERC-721 implementation. /// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol) abstract contract ERC721 { /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event Transfer(address indexed from, address indexed to, uint256 indexed id); event Approval(address indexed owner, address indexed spender, uint256 indexed id); event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /*////////////////////////////////////////////////////////////// METADATA STORAGE/LOGIC //////////////////////////////////////////////////////////////*/ string public name; string public symbol; function tokenURI(uint256 id) public view virtual returns (string memory); /*////////////////////////////////////////////////////////////// ERC721 BALANCE/OWNER STORAGE //////////////////////////////////////////////////////////////*/ mapping(uint256 => address) internal _ownerOf; mapping(address => uint256) internal _balanceOf; function ownerOf(uint256 id) public view virtual returns (address owner) { require((owner = _ownerOf[id]) != address(0), "NOT_MINTED"); } function balanceOf(address owner) public view virtual returns (uint256) { require(owner != address(0), "ZERO_ADDRESS"); return _balanceOf[owner]; } /*////////////////////////////////////////////////////////////// ERC721 APPROVAL STORAGE //////////////////////////////////////////////////////////////*/ mapping(uint256 => address) public getApproved; mapping(address => mapping(address => bool)) public isApprovedForAll; /*////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ constructor(string memory _name, string memory _symbol) { name = _name; symbol = _symbol; } /*////////////////////////////////////////////////////////////// ERC721 LOGIC //////////////////////////////////////////////////////////////*/ function approve(address spender, uint256 id) public virtual { address owner = _ownerOf[id]; require(msg.sender == owner || isApprovedForAll[owner][msg.sender], "NOT_AUTHORIZED"); getApproved[id] = spender; emit Approval(owner, spender, id); } function setApprovalForAll(address operator, bool approved) public virtual { isApprovedForAll[msg.sender][operator] = approved; emit ApprovalForAll(msg.sender, operator, approved); } function transferFrom( address from, address to, uint256 id ) public virtual { require(from == _ownerOf[id], "WRONG_FROM"); require(to != address(0), "INVALID_RECIPIENT"); require( msg.sender == from || isApprovedForAll[from][msg.sender] || msg.sender == getApproved[id], "NOT_AUTHORIZED" ); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. unchecked { _balanceOf[from]--; _balanceOf[to]++; } _ownerOf[id] = to; delete getApproved[id]; emit Transfer(from, to, id); } function safeTransferFrom( address from, address to, uint256 id ) public virtual { transferFrom(from, to, id); require( to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, "") == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } function safeTransferFrom( address from, address to, uint256 id, bytes calldata data ) public virtual { transferFrom(from, to, id); require( to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } /*////////////////////////////////////////////////////////////// ERC165 LOGIC //////////////////////////////////////////////////////////////*/ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165 interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721 interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata } /*////////////////////////////////////////////////////////////// INTERNAL MINT/BURN LOGIC //////////////////////////////////////////////////////////////*/ function _mint(address to, uint256 id) internal virtual { require(to != address(0), "INVALID_RECIPIENT"); require(_ownerOf[id] == address(0), "ALREADY_MINTED"); // Counter overflow is incredibly unrealistic. unchecked { _balanceOf[to]++; } _ownerOf[id] = to; emit Transfer(address(0), to, id); } function _burn(uint256 id) internal virtual { address owner = _ownerOf[id]; require(owner != address(0), "NOT_MINTED"); // Ownership check above ensures no underflow. unchecked { _balanceOf[owner]--; } delete _ownerOf[id]; delete getApproved[id]; emit Transfer(owner, address(0), id); } /*////////////////////////////////////////////////////////////// INTERNAL SAFE MINT LOGIC //////////////////////////////////////////////////////////////*/ function _safeMint(address to, uint256 id) internal virtual { _mint(to, id); require( to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, "") == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } function _safeMint( address to, uint256 id, bytes memory data ) internal virtual { _mint(to, id); require( to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data) == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } } /// @notice A generic interface for a contract which properly accepts ERC721 tokens. /// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol) abstract contract ERC721TokenReceiver { function onERC721Received( address, address, uint256, bytes calldata ) external virtual returns (bytes4) { return ERC721TokenReceiver.onERC721Received.selector; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol) pragma solidity ^0.8.0; import "../../interfaces/IERC2981.sol"; import "../../utils/introspection/ERC165.sol"; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @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); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import {OperatorFilterer} from "./OperatorFilterer.sol"; import {CANONICAL_CORI_SUBSCRIPTION} from "./lib/Constants.sol"; /** * @title DefaultOperatorFilterer * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription. * @dev Please note that if your token contract does not provide an owner with EIP-173, it must provide * administration methods on the contract itself to interact with the registry otherwise the subscription * will be locked to the options set during construction. */ abstract contract DefaultOperatorFilterer is OperatorFilterer { /// @dev The constructor that is called when the contract is being deployed. constructor() OperatorFilterer(CANONICAL_CORI_SUBSCRIPTION, true) {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; import "../utils/introspection/IERC165.sol"; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); }
// 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 pragma solidity ^0.8.13; import {IOperatorFilterRegistry} from "./IOperatorFilterRegistry.sol"; import {CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS} from "./lib/Constants.sol"; /** * @title OperatorFilterer * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry. * @dev This smart contract is meant to be inherited by token contracts so they can use the following: * - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods. * - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods. * Please note that if your token contract does not provide an owner with EIP-173, it must provide * administration methods on the contract itself to interact with the registry otherwise the subscription * will be locked to the options set during construction. */ abstract contract OperatorFilterer { /// @dev Emitted when an operator is not allowed. error OperatorNotAllowed(address operator); IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS); /// @dev The constructor that is called when the contract is being deployed. constructor(address subscriptionOrRegistrantToCopy, bool subscribe) { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (subscribe) { OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { OPERATOR_FILTER_REGISTRY.register(address(this)); } } } } /** * @dev A helper function to check if an operator is allowed. */ modifier onlyAllowedOperator(address from) virtual { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from != msg.sender) { _checkFilterOperator(msg.sender); } _; } /** * @dev A helper function to check if an operator approval is allowed. */ modifier onlyAllowedOperatorApproval(address operator) virtual { _checkFilterOperator(operator); _; } /** * @dev A helper function to check if an operator is allowed. */ function _checkFilterOperator(address operator) internal view virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { // under normal circumstances, this function will revert rather than return false, but inheriting contracts // may specify their own OperatorFilterRegistry implementations, which may behave differently if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; address constant CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS = 0x000000000000AAeB6D7670E522A718067333cd4E; address constant CANONICAL_CORI_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6;
// 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 pragma solidity ^0.8.13; interface IOperatorFilterRegistry { /** * @notice Returns true if operator is not filtered for a given token, either by address or codeHash. Also returns * true if supplied registrant address is not registered. */ function isOperatorAllowed(address registrant, address operator) external view returns (bool); /** * @notice Registers an address with the registry. May be called by address itself or by EIP-173 owner. */ function register(address registrant) external; /** * @notice Registers an address with the registry and "subscribes" to another address's filtered operators and codeHashes. */ function registerAndSubscribe(address registrant, address subscription) external; /** * @notice Registers an address with the registry and copies the filtered operators and codeHashes from another * address without subscribing. */ function registerAndCopyEntries(address registrant, address registrantToCopy) external; /** * @notice Unregisters an address with the registry and removes its subscription. May be called by address itself or by EIP-173 owner. * Note that this does not remove any filtered addresses or codeHashes. * Also note that any subscriptions to this registrant will still be active and follow the existing filtered addresses and codehashes. */ function unregister(address addr) external; /** * @notice Update an operator address for a registered address - when filtered is true, the operator is filtered. */ function updateOperator(address registrant, address operator, bool filtered) external; /** * @notice Update multiple operators for a registered address - when filtered is true, the operators will be filtered. Reverts on duplicates. */ function updateOperators(address registrant, address[] calldata operators, bool filtered) external; /** * @notice Update a codeHash for a registered address - when filtered is true, the codeHash is filtered. */ function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; /** * @notice Update multiple codeHashes for a registered address - when filtered is true, the codeHashes will be filtered. Reverts on duplicates. */ function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; /** * @notice Subscribe an address to another registrant's filtered operators and codeHashes. Will remove previous * subscription if present. * Note that accounts with subscriptions may go on to subscribe to other accounts - in this case, * subscriptions will not be forwarded. Instead the former subscription's existing entries will still be * used. */ function subscribe(address registrant, address registrantToSubscribe) external; /** * @notice Unsubscribe an address from its current subscribed registrant, and optionally copy its filtered operators and codeHashes. */ function unsubscribe(address registrant, bool copyExistingEntries) external; /** * @notice Get the subscription address of a given registrant, if any. */ function subscriptionOf(address addr) external returns (address registrant); /** * @notice Get the set of addresses subscribed to a given registrant. * Note that order is not guaranteed as updates are made. */ function subscribers(address registrant) external returns (address[] memory); /** * @notice Get the subscriber at a given index in the set of addresses subscribed to a given registrant. * Note that order is not guaranteed as updates are made. */ function subscriberAt(address registrant, uint256 index) external returns (address); /** * @notice Copy filtered operators and codeHashes from a different registrantToCopy to addr. */ function copyEntriesOf(address registrant, address registrantToCopy) external; /** * @notice Returns true if operator is filtered by a given address or its subscription. */ function isOperatorFiltered(address registrant, address operator) external returns (bool); /** * @notice Returns true if the hash of an address's code is filtered by a given address or its subscription. */ function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); /** * @notice Returns true if a codeHash is filtered by a given address or its subscription. */ function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); /** * @notice Returns a list of filtered operators for a given address or its subscription. */ function filteredOperators(address addr) external returns (address[] memory); /** * @notice Returns the set of filtered codeHashes for a given address or its subscription. * Note that order is not guaranteed as updates are made. */ function filteredCodeHashes(address addr) external returns (bytes32[] memory); /** * @notice Returns the filtered operator at the given index of the set of filtered operators for a given address or * its subscription. * Note that order is not guaranteed as updates are made. */ function filteredOperatorAt(address registrant, uint256 index) external returns (address); /** * @notice Returns the filtered codeHash at the given index of the list of filtered codeHashes for a given address or * its subscription. * Note that order is not guaranteed as updates are made. */ function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); /** * @notice Returns true if an address has registered */ function isRegistered(address addr) external returns (bool); /** * @dev Convenience method to compute the code hash of an arbitrary contract */ function codeHashOf(address addr) external returns (bytes32); }
{ "remappings": [ "@rari-capital/solmate/=lib/solmate/", "contracts/=contracts/", "ds-test/=lib/ds-test/src/", "erc4626-tests/=lib/operator-filter-registry/lib/openzeppelin-contracts/lib/erc4626-tests/", "forge-std/=lib/forge-std/src/", "murky/=lib/murky/src/", "openzeppelin-contracts-upgradeable/=lib/operator-filter-registry/lib/openzeppelin-contracts-upgradeable/", "openzeppelin-contracts/=lib/openzeppelin-contracts/", "operator-filter-registry/=lib/operator-filter-registry/src/", "solmate/=lib/solmate/src/" ], "optimizer": { "enabled": true, "runs": 200 }, "metadata": { "bytecodeHash": "none", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "evmVersion": "shanghai", "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_book","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControl","type":"error"},{"inputs":[],"name":"BurnAuthentication","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"}],"name":"FailedToSendEther","type":"error"},{"inputs":[],"name":"MintNotOpen","type":"error"},{"inputs":[],"name":"MismatchedArrays","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","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":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Mint","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":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BOOK","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"burnBooks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"azurians","type":"address"},{"internalType":"uint256[]","name":"rootIds","type":"uint256[]"}],"name":"burnRoots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"recipient","type":"address"}],"name":"claimFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"delegationRegistry","outputs":[{"internalType":"contract IDelegationRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deleteDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"address[]","name":"recipients","type":"address[]"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"resetTokenRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_burnOpen","type":"bool"}],"name":"setBurnOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_metadataOwner","type":"address"}],"name":"setMetadataOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_mintingOwner","type":"address"}],"name":"setMintingOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_royaltyOwner","type":"address"}],"name":"setRoyaltyOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setTokenRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040525f600b5534801562000014575f80fd5b506040516200257a3803806200257a833981016040819052620000379162000225565b6040805180820182526009815268105e9d5c88149bdbdd60ba1b602080830191909152825180840190935260048352631493d3d560e21b9083015290733cc6cdda760b79bafa08df41ecfa224f810dceb660016daaeb6d7670e522a718067333cd4e3b15620001c55780156200011857604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b5f604051808303815f87803b158015620000fb575f80fd5b505af11580156200010e573d5f803e3d5ffd5b50505050620001c5565b6001600160a01b03821615620001695760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af290390604401620000e3565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e486906024015f604051808303815f87803b158015620001ad575f80fd5b505af1158015620001c0573d5f803e3d5ffd5b505050505b505f9050620001d58382620002f4565b506001620001e48282620002f4565b505060088054336001600160a01b0319918216811790925560098054821683179055600a80549091169091179055506001600160a01b0316608052620003bc565b5f6020828403121562000236575f80fd5b81516001600160a01b03811681146200024d575f80fd5b9392505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200027d57607f821691505b6020821081036200029c57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620002ef575f81815260208120601f850160051c81016020861015620002ca5750805b601f850160051c820191505b81811015620002eb57828155600101620002d6565b5050505b505050565b81516001600160401b0381111562000310576200031062000254565b620003288162000321845462000268565b84620002a2565b602080601f8311600181146200035e575f8415620003465750858301515b5f19600386901b1c1916600185901b178555620002eb565b5f85815260208120601f198616915b828110156200038e578886015182559484019460019091019084016200036d565b5085821015620003ac57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805161219e620003dc5f395f818161054f0152610e30015261219e5ff3fe608060405234801561000f575f80fd5b5060043610610229575f3560e01c80636352211e1161012a578063aa1b103f116100b4578063d547cfb711610079578063d547cfb7146104ef578063db5eb702146104f7578063e985e9c51461050a578063ecde3c8914610537578063f91c7bed1461054a575f80fd5b8063aa1b103f1461049b578063b113c608146104a3578063b88d4fde146104b6578063bd37b9ed146104c9578063c87b56dd146104dc575f80fd5b80638a39c2e0116100fa5780638a39c2e0146104495780638a616bc01461045c5780638da5cb5b1461046f57806395d89b4114610480578063a22cb46514610488575f80fd5b80636352211e146103fd578063661e3e3614610410578063693d0df21461042357806370a0823114610436575f80fd5b80632525b3d7116101b657806342842e0e1161017b57806342842e0e146103a457806342966c68146103b7578063477dfefb146103ca5780635944c753146103d75780635c49d2cb146103ea575f80fd5b80632525b3d7146103245780632a55205a1461033757806330176e131461036957806335137cd01461037c57806341f434341461038f575f80fd5b8063095ea7b3116101fc578063095ea7b3146102bf57806311949ab3146102d257806318160ddd146102e55780631fbdd72d146102fc57806323b872dd14610311575f80fd5b806301ffc9a71461022d57806304634d8d1461025557806306fdde031461026a578063081812fc1461027f575b5f80fd5b61024061023b366004611973565b610571565b60405190151581526020015b60405180910390f35b6102686102633660046119bf565b6105dd565b005b610272610616565b60405161024c9190611a14565b6102a761028d366004611a46565b60046020525f90815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161024c565b6102686102cd366004611a5d565b6106a1565b6102686102e0366004611ac8565b6106ba565b6102ee600b5481565b60405190815260200161024c565b6102a76d76a84fef008cdabe6409d2fe638b81565b61026861031f366004611b19565b610857565b610268610332366004611b57565b610882565b61034a610345366004611b72565b6108cf565b604080516001600160a01b03909316835260208301919091520161024c565b610268610377366004611ba6565b61097b565b61026861038a366004611b57565b6109b2565b6102a76daaeb6d7670e522a718067333cd4e81565b6102686103b2366004611b19565b6109ff565b6102686103c5366004611a46565b610a24565b600d546102409060ff1681565b6102686103e5366004611c51565b610ab9565b6008546102a7906001600160a01b031681565b6102a761040b366004611a46565b610aef565b61026861041e366004611c8c565b610b45565b610268610431366004611b57565b610bc5565b6102ee610444366004611b57565b610c9b565b610268610457366004611cd8565b610cfc565b61026861046a366004611a46565b610d3a565b600a546001600160a01b03166102a7565b610272610d78565b610268610496366004611cf3565b610d85565b610268610d99565b6009546102a7906001600160a01b031681565b6102686104c4366004611d2a565b610dcf565b6102686104d7366004611c8c565b610dfe565b6102726104ea366004611a46565b610f1f565b610272610f53565b600a546102a7906001600160a01b031681565b610240610518366004611dc1565b600560209081525f928352604080842090915290825290205460ff1681565b610268610545366004611b57565b610f60565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b5f63152a902d60e11b6001600160e01b0319831614806105a157506301ffc9a760e01b6001600160e01b03198316145b806105bc57506380ac58cd60e01b6001600160e01b03198316145b806105d75750635b5e139f60e01b6001600160e01b03198316145b92915050565b600a546001600160a01b0316331461060857604051631f7c4bf360e01b815260040160405180910390fd5b6106128282610fad565b5050565b5f805461062290611ded565b80601f016020809104026020016040519081016040528092919081815260200182805461064e90611ded565b80156106995780601f1061067057610100808354040283529160200191610699565b820191905f5260205f20905b81548152906001019060200180831161067c57829003601f168201915b505050505081565b816106ab81611067565b6106b5838361111e565b505050565b5f5b818110156107f7575f6106e68484848181106106da576106da611e25565b90506020020135610aef565b9050336001600160a01b03821614806107a857506d76a84fef008cdabe6409d2fe638b63aba69cf833833088888881811061072357610723611e25565b60405160e088901b6001600160e01b03191681526001600160a01b03968716600482015294861660248601529290941660448401526020909102013560648201526084019050602060405180830381865afa158015610784573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107a89190611e39565b6107c557604051631d557fdb60e31b815260040160405180910390fd5b6107e68484848181106107da576107da611e25565b905060200201356111dc565b506107f081611e68565b90506106bc565b5060405162019f0960ee1b81526001600160a01b038416906367c24000906108259085908590600401611e80565b5f604051808303815f87803b15801561083c575f80fd5b505af115801561084e573d5f803e3d5ffd5b50505050505050565b826001600160a01b03811633146108715761087133611067565b61087c8484846112a6565b50505050565b600a546001600160a01b031633146108ad57604051631f7c4bf360e01b815260040160405180910390fd5b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b5f8281526007602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b03169282019290925282916109435750604080518082019091526006546001600160a01b0381168252600160a01b90046001600160601b031660208201525b60208101515f9061271090610961906001600160601b031687611eb7565b61096b9190611ee2565b91519350909150505b9250929050565b6009546001600160a01b031633146109a657604051631f7c4bf360e01b815260040160405180910390fd5b600c6106128282611f3a565b6008546001600160a01b031633146109dd57604051631f7c4bf360e01b815260040160405180910390fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b826001600160a01b0381163314610a1957610a1933611067565b61087c848484611447565b5f818152600260205260409020546001600160a01b031633811480610a6b57506001600160a01b0381165f90815260056020908152604080832033845290915290205460ff165b80610a8b57505f828152600460205260409020546001600160a01b031633145b610ab05760405162461bcd60e51b8152600401610aa790611ff6565b60405180910390fd5b610612826111dc565b600a546001600160a01b03163314610ae457604051631f7c4bf360e01b815260040160405180910390fd5b6106b5838383611536565b5f818152600260205260409020546001600160a01b031680610b405760405162461bcd60e51b815260206004820152600a6024820152691393d517d3525395115160b21b6044820152606401610aa7565b919050565b6008546001600160a01b03163314610b7057604051631f7c4bf360e01b815260040160405180910390fd5b600b545f5b82811015610bb757610baf848483818110610b9257610b92611e25565b9050602002016020810190610ba79190611b57565b828401611600565b600101610b75565b5050600b8054909101905550565b6008546001600160a01b0316331480610be857506009546001600160a01b031633145b80610bfd5750600a546001600160a01b031633145b610c1a57604051631f7c4bf360e01b815260040160405180910390fd5b5f816001600160a01b0316476040515f6040518083038185875af1925050503d805f8114610c63576040519150601f19603f3d011682016040523d82523d5f602084013e610c68565b606091505b50509050806106125760405163b0b0ec3560e01b81523060048201526001600160a01b0383166024820152604401610aa7565b5f6001600160a01b038216610ce15760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b6044820152606401610aa7565b506001600160a01b03165f9081526003602052604090205490565b6008546001600160a01b03163314610d2757604051631f7c4bf360e01b815260040160405180910390fd5b600d805460ff1916911515919091179055565b600a546001600160a01b03163314610d6557604051631f7c4bf360e01b815260040160405180910390fd5b5f90815260076020526040812055565b50565b6001805461062290611ded565b81610d8f81611067565b6106b58383611709565b600a546001600160a01b03163314610dc457604051631f7c4bf360e01b815260040160405180910390fd5b610dcd5f600655565b565b846001600160a01b0381163314610de957610de933611067565b610df68686868686611774565b505050505050565b600d5460ff16610e215760405163951b974f60e01b815260040160405180910390fd5b600b545f5b82811015610f00577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166323b872dd3330878786818110610e7157610e71611e25565b6040516001600160e01b031960e088901b1681526001600160a01b039586166004820152949093166024850152506020909102013560448201526064015f604051808303815f87803b158015610ec5575f80fd5b505af1158015610ed7573d5f803e3d5ffd5b50505050610ef0338284610eeb919061201e565b611600565b610ef981611e68565b9050610e26565b5082829050600b5f828254610f15919061201e565b9091555050505050565b6060600c610f2c83611859565b604051602001610f3d929190612031565b6040516020818303038152906040529050919050565b600c805461062290611ded565b6009546001600160a01b03163314610f8b57604051631f7c4bf360e01b815260040160405180910390fd5b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6127106001600160601b0382161115610fd85760405162461bcd60e51b8152600401610aa7906120b4565b6001600160a01b03821661102e5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610aa7565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600655565b6daaeb6d7670e522a718067333cd4e3b15610d7557604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156110d2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110f69190611e39565b610d7557604051633b79c77360e21b81526001600160a01b0382166004820152602401610aa7565b5f818152600260205260409020546001600160a01b03163381148061116557506001600160a01b0381165f90815260056020908152604080832033845290915290205460ff165b6111815760405162461bcd60e51b8152600401610aa790611ff6565b5f8281526004602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b5f818152600260205260409020546001600160a01b03168061122d5760405162461bcd60e51b815260206004820152600a6024820152691393d517d3525395115160b21b6044820152606401610aa7565b6001600160a01b0381165f81815260036020908152604080832080545f190190558583526002825280832080546001600160a01b031990811690915560049092528083208054909216909155518492907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b5f818152600260205260409020546001600160a01b038481169116146112fb5760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b6044820152606401610aa7565b6001600160a01b0382166113455760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b6044820152606401610aa7565b336001600160a01b038416148061137e57506001600160a01b0383165f90815260056020908152604080832033845290915290205460ff165b8061139e57505f818152600460205260409020546001600160a01b031633145b6113ba5760405162461bcd60e51b8152600401610aa790611ff6565b6001600160a01b038084165f81815260036020908152604080832080545f19019055938616808352848320805460010190558583526002825284832080546001600160a01b03199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b611452838383610857565b6001600160a01b0382163b15806114f75750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401525f608484015290919084169063150b7a029060a4016020604051808303815f875af11580156114c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114eb91906120fe565b6001600160e01b031916145b6106b55760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b6044820152606401610aa7565b6127106001600160601b03821611156115615760405162461bcd60e51b8152600401610aa7906120b4565b6001600160a01b0382166115b75760405162461bcd60e51b815260206004820152601b60248201527f455243323938313a20496e76616c696420706172616d657465727300000000006044820152606401610aa7565b6040805180820182526001600160a01b0393841681526001600160601b0392831660208083019182525f968752600790529190942093519051909116600160a01b029116179055565b6001600160a01b03821661164a5760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b6044820152606401610aa7565b5f818152600260205260409020546001600160a01b03161561169f5760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b6044820152606401610aa7565b6001600160a01b0382165f81815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b335f8181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61177f858585610857565b6001600160a01b0384163b15806118135750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a02906117c79033908a90899089908990600401612119565b6020604051808303815f875af11580156117e3573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061180791906120fe565b6001600160e01b031916145b6118525760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b6044820152606401610aa7565b5050505050565b6060815f0361187f5750506040805180820190915260018152600360fc1b602082015290565b815f5b81156118a8578061189281611e68565b91506118a19050600a83611ee2565b9150611882565b5f8167ffffffffffffffff8111156118c2576118c2611b92565b6040519080825280601f01601f1916602001820160405280156118ec576020820181803683370190505b5090505b84156119565761190160018361216b565b915061190e600a8661217e565b61191990603061201e565b60f81b81838151811061192e5761192e611e25565b60200101906001600160f81b03191690815f1a90535061194f600a86611ee2565b94506118f0565b949350505050565b6001600160e01b031981168114610d75575f80fd5b5f60208284031215611983575f80fd5b813561198e8161195e565b9392505050565b6001600160a01b0381168114610d75575f80fd5b80356001600160601b0381168114610b40575f80fd5b5f80604083850312156119d0575f80fd5b82356119db81611995565b91506119e9602084016119a9565b90509250929050565b5f5b83811015611a0c5781810151838201526020016119f4565b50505f910152565b602081525f8251806020840152611a328160408501602087016119f2565b601f01601f19169190910160400192915050565b5f60208284031215611a56575f80fd5b5035919050565b5f8060408385031215611a6e575f80fd5b8235611a7981611995565b946020939093013593505050565b5f8083601f840112611a97575f80fd5b50813567ffffffffffffffff811115611aae575f80fd5b6020830191508360208260051b8501011115610974575f80fd5b5f805f60408486031215611ada575f80fd5b8335611ae581611995565b9250602084013567ffffffffffffffff811115611b00575f80fd5b611b0c86828701611a87565b9497909650939450505050565b5f805f60608486031215611b2b575f80fd5b8335611b3681611995565b92506020840135611b4681611995565b929592945050506040919091013590565b5f60208284031215611b67575f80fd5b813561198e81611995565b5f8060408385031215611b83575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215611bb6575f80fd5b813567ffffffffffffffff80821115611bcd575f80fd5b818401915084601f830112611be0575f80fd5b813581811115611bf257611bf2611b92565b604051601f8201601f19908116603f01168101908382118183101715611c1a57611c1a611b92565b81604052828152876020848701011115611c32575f80fd5b826020860160208301375f928101602001929092525095945050505050565b5f805f60608486031215611c63575f80fd5b833592506020840135611c7581611995565b9150611c83604085016119a9565b90509250925092565b5f8060208385031215611c9d575f80fd5b823567ffffffffffffffff811115611cb3575f80fd5b611cbf85828601611a87565b90969095509350505050565b8015158114610d75575f80fd5b5f60208284031215611ce8575f80fd5b813561198e81611ccb565b5f8060408385031215611d04575f80fd5b8235611d0f81611995565b91506020830135611d1f81611ccb565b809150509250929050565b5f805f805f60808688031215611d3e575f80fd5b8535611d4981611995565b94506020860135611d5981611995565b935060408601359250606086013567ffffffffffffffff80821115611d7c575f80fd5b818801915088601f830112611d8f575f80fd5b813581811115611d9d575f80fd5b896020828501011115611dae575f80fd5b9699959850939650602001949392505050565b5f8060408385031215611dd2575f80fd5b8235611ddd81611995565b91506020830135611d1f81611995565b600181811c90821680611e0157607f821691505b602082108103611e1f57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611e49575f80fd5b815161198e81611ccb565b634e487b7160e01b5f52601160045260245ffd5b5f60018201611e7957611e79611e54565b5060010190565b602080825281018290525f6001600160fb1b03831115611e9e575f80fd5b8260051b80856040850137919091016040019392505050565b80820281158282048414176105d7576105d7611e54565b634e487b7160e01b5f52601260045260245ffd5b5f82611ef057611ef0611ece565b500490565b601f8211156106b5575f81815260208120601f850160051c81016020861015611f1b5750805b601f850160051c820191505b81811015610df657828155600101611f27565b815167ffffffffffffffff811115611f5457611f54611b92565b611f6881611f628454611ded565b84611ef5565b602080601f831160018114611f9b575f8415611f845750858301515b5f19600386901b1c1916600185901b178555610df6565b5f85815260208120601f198616915b82811015611fc957888601518255948401946001909101908401611faa565b5085821015611fe657878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b6020808252600e908201526d1393d517d055551213d49256915160921b604082015260600190565b808201808211156105d7576105d7611e54565b5f80845461203e81611ded565b60018281168015612056576001811461206b57612097565b60ff1984168752821515830287019450612097565b885f526020805f205f5b8581101561208e5781548a820152908401908201612075565b50505082870194505b5050505083516120ab8183602088016119f2565b01949350505050565b6020808252602a908201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646040820152692073616c65507269636560b01b606082015260800190565b5f6020828403121561210e575f80fd5b815161198e8161195e565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290525f828460a08401375f60a0848401015260a0601f19601f85011683010190509695505050505050565b818103818111156105d7576105d7611e54565b5f8261218c5761218c611ece565b50069056fea164736f6c6343000814000a000000000000000000000000ba627f3d081cc97ac0edc40591eda7053ac63532
Deployed Bytecode
0x608060405234801561000f575f80fd5b5060043610610229575f3560e01c80636352211e1161012a578063aa1b103f116100b4578063d547cfb711610079578063d547cfb7146104ef578063db5eb702146104f7578063e985e9c51461050a578063ecde3c8914610537578063f91c7bed1461054a575f80fd5b8063aa1b103f1461049b578063b113c608146104a3578063b88d4fde146104b6578063bd37b9ed146104c9578063c87b56dd146104dc575f80fd5b80638a39c2e0116100fa5780638a39c2e0146104495780638a616bc01461045c5780638da5cb5b1461046f57806395d89b4114610480578063a22cb46514610488575f80fd5b80636352211e146103fd578063661e3e3614610410578063693d0df21461042357806370a0823114610436575f80fd5b80632525b3d7116101b657806342842e0e1161017b57806342842e0e146103a457806342966c68146103b7578063477dfefb146103ca5780635944c753146103d75780635c49d2cb146103ea575f80fd5b80632525b3d7146103245780632a55205a1461033757806330176e131461036957806335137cd01461037c57806341f434341461038f575f80fd5b8063095ea7b3116101fc578063095ea7b3146102bf57806311949ab3146102d257806318160ddd146102e55780631fbdd72d146102fc57806323b872dd14610311575f80fd5b806301ffc9a71461022d57806304634d8d1461025557806306fdde031461026a578063081812fc1461027f575b5f80fd5b61024061023b366004611973565b610571565b60405190151581526020015b60405180910390f35b6102686102633660046119bf565b6105dd565b005b610272610616565b60405161024c9190611a14565b6102a761028d366004611a46565b60046020525f90815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161024c565b6102686102cd366004611a5d565b6106a1565b6102686102e0366004611ac8565b6106ba565b6102ee600b5481565b60405190815260200161024c565b6102a76d76a84fef008cdabe6409d2fe638b81565b61026861031f366004611b19565b610857565b610268610332366004611b57565b610882565b61034a610345366004611b72565b6108cf565b604080516001600160a01b03909316835260208301919091520161024c565b610268610377366004611ba6565b61097b565b61026861038a366004611b57565b6109b2565b6102a76daaeb6d7670e522a718067333cd4e81565b6102686103b2366004611b19565b6109ff565b6102686103c5366004611a46565b610a24565b600d546102409060ff1681565b6102686103e5366004611c51565b610ab9565b6008546102a7906001600160a01b031681565b6102a761040b366004611a46565b610aef565b61026861041e366004611c8c565b610b45565b610268610431366004611b57565b610bc5565b6102ee610444366004611b57565b610c9b565b610268610457366004611cd8565b610cfc565b61026861046a366004611a46565b610d3a565b600a546001600160a01b03166102a7565b610272610d78565b610268610496366004611cf3565b610d85565b610268610d99565b6009546102a7906001600160a01b031681565b6102686104c4366004611d2a565b610dcf565b6102686104d7366004611c8c565b610dfe565b6102726104ea366004611a46565b610f1f565b610272610f53565b600a546102a7906001600160a01b031681565b610240610518366004611dc1565b600560209081525f928352604080842090915290825290205460ff1681565b610268610545366004611b57565b610f60565b6102a77f000000000000000000000000ba627f3d081cc97ac0edc40591eda7053ac6353281565b5f63152a902d60e11b6001600160e01b0319831614806105a157506301ffc9a760e01b6001600160e01b03198316145b806105bc57506380ac58cd60e01b6001600160e01b03198316145b806105d75750635b5e139f60e01b6001600160e01b03198316145b92915050565b600a546001600160a01b0316331461060857604051631f7c4bf360e01b815260040160405180910390fd5b6106128282610fad565b5050565b5f805461062290611ded565b80601f016020809104026020016040519081016040528092919081815260200182805461064e90611ded565b80156106995780601f1061067057610100808354040283529160200191610699565b820191905f5260205f20905b81548152906001019060200180831161067c57829003601f168201915b505050505081565b816106ab81611067565b6106b5838361111e565b505050565b5f5b818110156107f7575f6106e68484848181106106da576106da611e25565b90506020020135610aef565b9050336001600160a01b03821614806107a857506d76a84fef008cdabe6409d2fe638b63aba69cf833833088888881811061072357610723611e25565b60405160e088901b6001600160e01b03191681526001600160a01b03968716600482015294861660248601529290941660448401526020909102013560648201526084019050602060405180830381865afa158015610784573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107a89190611e39565b6107c557604051631d557fdb60e31b815260040160405180910390fd5b6107e68484848181106107da576107da611e25565b905060200201356111dc565b506107f081611e68565b90506106bc565b5060405162019f0960ee1b81526001600160a01b038416906367c24000906108259085908590600401611e80565b5f604051808303815f87803b15801561083c575f80fd5b505af115801561084e573d5f803e3d5ffd5b50505050505050565b826001600160a01b03811633146108715761087133611067565b61087c8484846112a6565b50505050565b600a546001600160a01b031633146108ad57604051631f7c4bf360e01b815260040160405180910390fd5b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b5f8281526007602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b03169282019290925282916109435750604080518082019091526006546001600160a01b0381168252600160a01b90046001600160601b031660208201525b60208101515f9061271090610961906001600160601b031687611eb7565b61096b9190611ee2565b91519350909150505b9250929050565b6009546001600160a01b031633146109a657604051631f7c4bf360e01b815260040160405180910390fd5b600c6106128282611f3a565b6008546001600160a01b031633146109dd57604051631f7c4bf360e01b815260040160405180910390fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b826001600160a01b0381163314610a1957610a1933611067565b61087c848484611447565b5f818152600260205260409020546001600160a01b031633811480610a6b57506001600160a01b0381165f90815260056020908152604080832033845290915290205460ff165b80610a8b57505f828152600460205260409020546001600160a01b031633145b610ab05760405162461bcd60e51b8152600401610aa790611ff6565b60405180910390fd5b610612826111dc565b600a546001600160a01b03163314610ae457604051631f7c4bf360e01b815260040160405180910390fd5b6106b5838383611536565b5f818152600260205260409020546001600160a01b031680610b405760405162461bcd60e51b815260206004820152600a6024820152691393d517d3525395115160b21b6044820152606401610aa7565b919050565b6008546001600160a01b03163314610b7057604051631f7c4bf360e01b815260040160405180910390fd5b600b545f5b82811015610bb757610baf848483818110610b9257610b92611e25565b9050602002016020810190610ba79190611b57565b828401611600565b600101610b75565b5050600b8054909101905550565b6008546001600160a01b0316331480610be857506009546001600160a01b031633145b80610bfd5750600a546001600160a01b031633145b610c1a57604051631f7c4bf360e01b815260040160405180910390fd5b5f816001600160a01b0316476040515f6040518083038185875af1925050503d805f8114610c63576040519150601f19603f3d011682016040523d82523d5f602084013e610c68565b606091505b50509050806106125760405163b0b0ec3560e01b81523060048201526001600160a01b0383166024820152604401610aa7565b5f6001600160a01b038216610ce15760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b6044820152606401610aa7565b506001600160a01b03165f9081526003602052604090205490565b6008546001600160a01b03163314610d2757604051631f7c4bf360e01b815260040160405180910390fd5b600d805460ff1916911515919091179055565b600a546001600160a01b03163314610d6557604051631f7c4bf360e01b815260040160405180910390fd5b5f90815260076020526040812055565b50565b6001805461062290611ded565b81610d8f81611067565b6106b58383611709565b600a546001600160a01b03163314610dc457604051631f7c4bf360e01b815260040160405180910390fd5b610dcd5f600655565b565b846001600160a01b0381163314610de957610de933611067565b610df68686868686611774565b505050505050565b600d5460ff16610e215760405163951b974f60e01b815260040160405180910390fd5b600b545f5b82811015610f00577f000000000000000000000000ba627f3d081cc97ac0edc40591eda7053ac635326001600160a01b03166323b872dd3330878786818110610e7157610e71611e25565b6040516001600160e01b031960e088901b1681526001600160a01b039586166004820152949093166024850152506020909102013560448201526064015f604051808303815f87803b158015610ec5575f80fd5b505af1158015610ed7573d5f803e3d5ffd5b50505050610ef0338284610eeb919061201e565b611600565b610ef981611e68565b9050610e26565b5082829050600b5f828254610f15919061201e565b9091555050505050565b6060600c610f2c83611859565b604051602001610f3d929190612031565b6040516020818303038152906040529050919050565b600c805461062290611ded565b6009546001600160a01b03163314610f8b57604051631f7c4bf360e01b815260040160405180910390fd5b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6127106001600160601b0382161115610fd85760405162461bcd60e51b8152600401610aa7906120b4565b6001600160a01b03821661102e5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610aa7565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600655565b6daaeb6d7670e522a718067333cd4e3b15610d7557604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156110d2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110f69190611e39565b610d7557604051633b79c77360e21b81526001600160a01b0382166004820152602401610aa7565b5f818152600260205260409020546001600160a01b03163381148061116557506001600160a01b0381165f90815260056020908152604080832033845290915290205460ff165b6111815760405162461bcd60e51b8152600401610aa790611ff6565b5f8281526004602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b5f818152600260205260409020546001600160a01b03168061122d5760405162461bcd60e51b815260206004820152600a6024820152691393d517d3525395115160b21b6044820152606401610aa7565b6001600160a01b0381165f81815260036020908152604080832080545f190190558583526002825280832080546001600160a01b031990811690915560049092528083208054909216909155518492907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b5f818152600260205260409020546001600160a01b038481169116146112fb5760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b6044820152606401610aa7565b6001600160a01b0382166113455760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b6044820152606401610aa7565b336001600160a01b038416148061137e57506001600160a01b0383165f90815260056020908152604080832033845290915290205460ff165b8061139e57505f818152600460205260409020546001600160a01b031633145b6113ba5760405162461bcd60e51b8152600401610aa790611ff6565b6001600160a01b038084165f81815260036020908152604080832080545f19019055938616808352848320805460010190558583526002825284832080546001600160a01b03199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b611452838383610857565b6001600160a01b0382163b15806114f75750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401525f608484015290919084169063150b7a029060a4016020604051808303815f875af11580156114c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114eb91906120fe565b6001600160e01b031916145b6106b55760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b6044820152606401610aa7565b6127106001600160601b03821611156115615760405162461bcd60e51b8152600401610aa7906120b4565b6001600160a01b0382166115b75760405162461bcd60e51b815260206004820152601b60248201527f455243323938313a20496e76616c696420706172616d657465727300000000006044820152606401610aa7565b6040805180820182526001600160a01b0393841681526001600160601b0392831660208083019182525f968752600790529190942093519051909116600160a01b029116179055565b6001600160a01b03821661164a5760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b6044820152606401610aa7565b5f818152600260205260409020546001600160a01b03161561169f5760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b6044820152606401610aa7565b6001600160a01b0382165f81815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b335f8181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61177f858585610857565b6001600160a01b0384163b15806118135750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a02906117c79033908a90899089908990600401612119565b6020604051808303815f875af11580156117e3573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061180791906120fe565b6001600160e01b031916145b6118525760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b6044820152606401610aa7565b5050505050565b6060815f0361187f5750506040805180820190915260018152600360fc1b602082015290565b815f5b81156118a8578061189281611e68565b91506118a19050600a83611ee2565b9150611882565b5f8167ffffffffffffffff8111156118c2576118c2611b92565b6040519080825280601f01601f1916602001820160405280156118ec576020820181803683370190505b5090505b84156119565761190160018361216b565b915061190e600a8661217e565b61191990603061201e565b60f81b81838151811061192e5761192e611e25565b60200101906001600160f81b03191690815f1a90535061194f600a86611ee2565b94506118f0565b949350505050565b6001600160e01b031981168114610d75575f80fd5b5f60208284031215611983575f80fd5b813561198e8161195e565b9392505050565b6001600160a01b0381168114610d75575f80fd5b80356001600160601b0381168114610b40575f80fd5b5f80604083850312156119d0575f80fd5b82356119db81611995565b91506119e9602084016119a9565b90509250929050565b5f5b83811015611a0c5781810151838201526020016119f4565b50505f910152565b602081525f8251806020840152611a328160408501602087016119f2565b601f01601f19169190910160400192915050565b5f60208284031215611a56575f80fd5b5035919050565b5f8060408385031215611a6e575f80fd5b8235611a7981611995565b946020939093013593505050565b5f8083601f840112611a97575f80fd5b50813567ffffffffffffffff811115611aae575f80fd5b6020830191508360208260051b8501011115610974575f80fd5b5f805f60408486031215611ada575f80fd5b8335611ae581611995565b9250602084013567ffffffffffffffff811115611b00575f80fd5b611b0c86828701611a87565b9497909650939450505050565b5f805f60608486031215611b2b575f80fd5b8335611b3681611995565b92506020840135611b4681611995565b929592945050506040919091013590565b5f60208284031215611b67575f80fd5b813561198e81611995565b5f8060408385031215611b83575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215611bb6575f80fd5b813567ffffffffffffffff80821115611bcd575f80fd5b818401915084601f830112611be0575f80fd5b813581811115611bf257611bf2611b92565b604051601f8201601f19908116603f01168101908382118183101715611c1a57611c1a611b92565b81604052828152876020848701011115611c32575f80fd5b826020860160208301375f928101602001929092525095945050505050565b5f805f60608486031215611c63575f80fd5b833592506020840135611c7581611995565b9150611c83604085016119a9565b90509250925092565b5f8060208385031215611c9d575f80fd5b823567ffffffffffffffff811115611cb3575f80fd5b611cbf85828601611a87565b90969095509350505050565b8015158114610d75575f80fd5b5f60208284031215611ce8575f80fd5b813561198e81611ccb565b5f8060408385031215611d04575f80fd5b8235611d0f81611995565b91506020830135611d1f81611ccb565b809150509250929050565b5f805f805f60808688031215611d3e575f80fd5b8535611d4981611995565b94506020860135611d5981611995565b935060408601359250606086013567ffffffffffffffff80821115611d7c575f80fd5b818801915088601f830112611d8f575f80fd5b813581811115611d9d575f80fd5b896020828501011115611dae575f80fd5b9699959850939650602001949392505050565b5f8060408385031215611dd2575f80fd5b8235611ddd81611995565b91506020830135611d1f81611995565b600181811c90821680611e0157607f821691505b602082108103611e1f57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611e49575f80fd5b815161198e81611ccb565b634e487b7160e01b5f52601160045260245ffd5b5f60018201611e7957611e79611e54565b5060010190565b602080825281018290525f6001600160fb1b03831115611e9e575f80fd5b8260051b80856040850137919091016040019392505050565b80820281158282048414176105d7576105d7611e54565b634e487b7160e01b5f52601260045260245ffd5b5f82611ef057611ef0611ece565b500490565b601f8211156106b5575f81815260208120601f850160051c81016020861015611f1b5750805b601f850160051c820191505b81811015610df657828155600101611f27565b815167ffffffffffffffff811115611f5457611f54611b92565b611f6881611f628454611ded565b84611ef5565b602080601f831160018114611f9b575f8415611f845750858301515b5f19600386901b1c1916600185901b178555610df6565b5f85815260208120601f198616915b82811015611fc957888601518255948401946001909101908401611faa565b5085821015611fe657878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b6020808252600e908201526d1393d517d055551213d49256915160921b604082015260600190565b808201808211156105d7576105d7611e54565b5f80845461203e81611ded565b60018281168015612056576001811461206b57612097565b60ff1984168752821515830287019450612097565b885f526020805f205f5b8581101561208e5781548a820152908401908201612075565b50505082870194505b5050505083516120ab8183602088016119f2565b01949350505050565b6020808252602a908201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646040820152692073616c65507269636560b01b606082015260800190565b5f6020828403121561210e575f80fd5b815161198e8161195e565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290525f828460a08401375f60a0848401015260a0601f19601f85011683010190509695505050505050565b818103818111156105d7576105d7611e54565b5f8261218c5761218c611ece565b50069056fea164736f6c6343000814000a
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000ba627f3d081cc97ac0edc40591eda7053ac63532
-----Decoded View---------------
Arg [0] : _book (address): 0xBA627f3d081cc97ac0eDc40591eda7053AC63532
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000ba627f3d081cc97ac0edc40591eda7053ac63532
Deployed Bytecode Sourcemap
735:6980:10:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5061:417;;;;;;:::i;:::-;;:::i;:::-;;;565:14:13;;558:22;540:41;;528:2;513:18;5061:417:10;;;;;;;;5531:222;;;;;;:::i;:::-;;:::i;:::-;;896:18:9;;;:::i;:::-;;;;;;;:::i;1841:46::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;1841:46:9;;;;;;-1:-1:-1;;;;;2241:32:13;;;2223:51;;2211:2;2196:18;1841:46:9;2077:203:13;6986:155:10;;;;;;:::i;:::-;;:::i;3549:482::-;;;;;;:::i;:::-;;:::i;959:30::-;;;;;;;;;3700:25:13;;;3688:2;3673:18;959:30:10;3554:177:13;1248:120:10;;1325:42;1248:120;;7147:161;;;;;;:::i;:::-;;:::i;1906:119:12:-;;;;;;:::i;:::-;;:::i;1671:432:1:-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;5130:32:13;;;5112:51;;5194:2;5179:18;;5172:34;;;;5085:18;1671:432:1;4938:274:13;4157:197:10;;;;;;:::i;:::-;;:::i;1352:119:12:-;;;;;;:::i;:::-;;:::i;1158:142:7:-;;120:42:8;1158:142:7;;7314:169:10;;;;;;:::i;:::-;;:::i;2553:246::-;;;;;;:::i;:::-;;:::i;1149:20::-;;;;;;;;;6029:244;;;;;;:::i;:::-;;:::i;196:27:12:-;;;;;-1:-1:-1;;;;;196:27:12;;;1324:149:9;;;;;;:::i;:::-;;:::i;2107:411:10:-;;;;;;:::i;:::-;;:::i;4595:384::-;;;;;;:::i;:::-;;:::i;1479:168:9:-;;;;;;:::i;:::-;;:::i;4390:171:10:-;;;;;;:::i;:::-;;:::i;6326:185::-;;;;;;:::i;:::-;;:::i;2083:85:12:-;2149:12;;-1:-1:-1;;;;;2149:12:12;2083:85;;921:20:9;;;:::i;6806:174:10:-;;;;;;:::i;:::-;;:::i;5809:169::-;;;:::i;291:28:12:-;;;;;-1:-1:-1;;;;;291:28:12;;;7489:224:10;;;;;;:::i;:::-;;:::i;2927:566::-;;;;;;:::i;:::-;;:::i;6607:169::-;;;;;;:::i;:::-;;:::i;1072:26::-;;;:::i;430:27:12:-;;;;;-1:-1:-1;;;;;430:27:12;;;1894:68:9;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;1667:124:12;;;;;;:::i;:::-;;:::i;866:29:10:-;;;;;5061:417;5155:4;-1:-1:-1;;;;;;;;;5178:25:10;;;;:101;;-1:-1:-1;;;;;;;;;;5254:25:10;;;5178:101;:176;;;-1:-1:-1;;;;;;;;;;5329:25:10;;;5178:176;:251;;;-1:-1:-1;;;;;;;;;;5404:25:10;;;5178:251;5171:258;5061:417;-1:-1:-1;;5061:417:10:o;5531:222::-;5634:12;;-1:-1:-1;;;;;5634:12:10;5620:10;:26;5616:79;;5669:15;;-1:-1:-1;;;5669:15:10;;;;;;;;;;;5616:79;5704:42;5723:8;5733:12;5704:18;:42::i;:::-;5531:222;;:::o;896:18:9:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;6986:155:10:-;7082:8;2902:30:7;2923:8;2902:20;:30::i;:::-;7102:32:10::1;7116:8;7126:7;7102:13;:32::i;:::-;6986:155:::0;;;:::o;3549:482::-;3638:9;3633:339;3653:18;;;3633:339;;;3692:17;3712:19;3720:7;;3728:1;3720:10;;;;;;;:::i;:::-;;;;;;;3712:7;:19::i;:::-;3692:39;-1:-1:-1;3751:10:10;-1:-1:-1;;;;;3751:23:10;;;;:117;;-1:-1:-1;1325:42:10;3778:40;3819:10;3831:9;3850:4;3857:7;;3865:1;3857:10;;;;;;;:::i;:::-;3778:90;;;;;;-1:-1:-1;;;;;;3778:90:10;;;-1:-1:-1;;;;;10945:15:13;;;3778:90:10;;;10927:34:13;10997:15;;;10977:18;;;10970:43;11049:15;;;;11029:18;;;11022:43;3857:10:10;;;;;;11081:18:13;;;11074:34;10861:19;;;-1:-1:-1;3778:90:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3745:186;;3896:20;;-1:-1:-1;;;3896:20:10;;;;;;;;;;;3745:186;3944:17;3950:7;;3958:1;3950:10;;;;;;;:::i;:::-;;;;;;;3944:5;:17::i;:::-;-1:-1:-1;3673:3:10;;;:::i;:::-;;;3633:339;;;-1:-1:-1;3981:43:10;;-1:-1:-1;;;3981:43:10;;-1:-1:-1;;;;;3981:34:10;;;;;:43;;4016:7;;;;3981:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3549:482;;;:::o;7147:161::-;7248:4;-1:-1:-1;;;;;2638:18:7;;2646:10;2638:18;2634:81;;2672:32;2693:10;2672:20;:32::i;:::-;7264:37:10::1;7283:4;7289:2;7293:7;7264:18;:37::i;:::-;7147:161:::0;;;;:::o;1906:119:12:-;1035:12;;-1:-1:-1;;;;;1035:12:12;1021:10;:26;1017:79;;1070:15;;-1:-1:-1;;;1070:15:12;;;;;;;;;;;1017:79;1990:12:::1;:28:::0;;-1:-1:-1;;;;;;1990:28:12::1;-1:-1:-1::0;;;;;1990:28:12;;;::::1;::::0;;;::::1;::::0;;1906:119::o;1671:432:1:-;1768:7;1825:27;;;:17;:27;;;;;;;;1796:56;;;;;;;;;-1:-1:-1;;;;;1796:56:1;;;;;-1:-1:-1;;;1796:56:1;;;-1:-1:-1;;;;;1796:56:1;;;;;;;;1768:7;;1863:90;;-1:-1:-1;1913:29:1;;;;;;;;;1923:19;1913:29;-1:-1:-1;;;;;1913:29:1;;;;-1:-1:-1;;;1913:29:1;;-1:-1:-1;;;;;1913:29:1;;;;;1863:90;2001:23;;;;1963:21;;2461:5;;1988:36;;-1:-1:-1;;;;;1988:36:1;:10;:36;:::i;:::-;1987:58;;;;:::i;:::-;2064:16;;;-1:-1:-1;1963:82:1;;-1:-1:-1;;1671:432:1;;;;;;:::o;4157:197:10:-;4248:13;;-1:-1:-1;;;;;4248:13:10;4234:10;:27;4230:80;;4284:15;;-1:-1:-1;;;4284:15:10;;;;;;;;;;;4230:80;4319:12;:28;4334:13;4319:12;:28;:::i;1352:119:12:-;753:12;;-1:-1:-1;;;;;753:12:12;739:10;:26;735:79;;788:15;;-1:-1:-1;;;788:15:12;;;;;;;;;;;735:79;1436:12:::1;:28:::0;;-1:-1:-1;;;;;;1436:28:12::1;-1:-1:-1::0;;;;;1436:28:12;;;::::1;::::0;;;::::1;::::0;;1352:119::o;7314:169:10:-;7419:4;-1:-1:-1;;;;;2638:18:7;;2646:10;2638:18;2634:81;;2672:32;2693:10;2672:20;:32::i;:::-;7435:41:10::1;7458:4;7464:2;7468:7;7435:22;:41::i;2553:246::-:0;2598:12;2613;;;:8;:12;;;;;;-1:-1:-1;;;;;2613:12:10;2656:10;:18;;;:56;;-1:-1:-1;;;;;;2678:22:10;;;;;;:16;:22;;;;;;;;2701:10;2678:34;;;;;;;;;;2656:56;:89;;;-1:-1:-1;2730:15:10;;;;:11;:15;;;;;;-1:-1:-1;;;;;2730:15:10;2716:10;:29;2656:89;2635:138;;;;-1:-1:-1;;;2635:138:10;;;;;;;:::i;:::-;;;;;;;;;2783:9;2789:2;2783:5;:9::i;6029:244::-;6147:12;;-1:-1:-1;;;;;6147:12:10;6133:10;:26;6129:79;;6182:15;;-1:-1:-1;;;6182:15:10;;;;;;;;;;;6129:79;6217:49;6234:7;6243:8;6253:12;6217:16;:49::i;1324:149:9:-;1382:13;1424:12;;;:8;:12;;;;;;-1:-1:-1;;;;;1424:12:9;;1407:59;;;;-1:-1:-1;;;1407:59:9;;15268:2:13;1407:59:9;;;15250:21:13;15307:2;15287:18;;;15280:30;-1:-1:-1;;;15326:18:13;;;15319:40;15376:18;;1407:59:9;15066:334:13;1407:59:9;1324:149;;;:::o;2107:411:10:-;2194:12;;-1:-1:-1;;;;;2194:12:10;2180:10;:26;2176:79;;2229:15;;-1:-1:-1;;;2229:15:10;;;;;;;;;;;2176:79;2312:11;;2289:20;2337:119;2357:21;;;2337:119;;;2403:38;2409:10;;2420:1;2409:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;2439:1;2424:12;:16;2403:5;:38::i;:::-;2380:3;;2337:119;;;-1:-1:-1;;2469:11:10;:32;;;;;;;-1:-1:-1;2107:411:10:o;4595:384::-;4681:12;;-1:-1:-1;;;;;4681:12:10;4667:10;:26;;:57;;-1:-1:-1;4711:13:10;;-1:-1:-1;;;;;4711:13:10;4697:10;:27;4667:57;:87;;;-1:-1:-1;4742:12:10;;-1:-1:-1;;;;;4742:12:10;4728:10;:26;4667:87;4661:143;;4778:15;;-1:-1:-1;;;4778:15:10;;;;;;;;;;;4661:143;4815:9;4829;-1:-1:-1;;;;;4829:14:10;4851:21;4829:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4814:63;;;4892:4;4887:86;;4919:43;;-1:-1:-1;;;4919:43:10;;4945:4;4919:43;;;15835:34:13;-1:-1:-1;;;;;15905:15:13;;15885:18;;;15878:43;15770:18;;4919:43:10;15615:312:13;1479:168:9;1542:7;-1:-1:-1;;;;;1569:19:9;;1561:44;;;;-1:-1:-1;;;1561:44:9;;16134:2:13;1561:44:9;;;16116:21:13;16173:2;16153:18;;;16146:30;-1:-1:-1;;;16192:18:13;;;16185:42;16244:18;;1561:44:9;15932:336:13;1561:44:9;-1:-1:-1;;;;;;1623:17:9;;;;;:10;:17;;;;;;;1479:168::o;4390:171:10:-;4464:12;;-1:-1:-1;;;;;4464:12:10;4450:10;:26;4446:79;;4499:15;;-1:-1:-1;;;4499:15:10;;;;;;;;;;;4446:79;4534:8;:20;;-1:-1:-1;;4534:20:10;;;;;;;;;;4390:171::o;6326:185::-;6407:12;;-1:-1:-1;;;;;6407:12:10;6393:10;:26;6389:79;;6442:15;;-1:-1:-1;;;6442:15:10;;;;;;;;;;;6389:79;4061:26:1;;;;:17;:26;;;;;4054:33;6326:185:10:o;6477:27::-;6326:185;:::o;921:20:9:-;;;;;;;:::i;6806:174:10:-;6910:8;2902:30:7;2923:8;2902:20;:30::i;:::-;6930:43:10::1;6954:8;6964;6930:23;:43::i;5809:169::-:0;5878:12;;-1:-1:-1;;;;;5878:12:10;5864:10;:26;5860:79;;5913:15;;-1:-1:-1;;;5913:15:10;;;;;;;;;;;5860:79;5948:23;3199:19:1;;3192:26;3132:93;5948:23:10;5809:169::o;7489:224::-;7639:4;-1:-1:-1;;;;;2638:18:7;;2646:10;2638:18;2634:81;;2672:32;2693:10;2672:20;:32::i;:::-;7659:47:10::1;7682:4;7688:2;7692:7;7701:4;;7659:22;:47::i;:::-;7489:224:::0;;;;;;:::o;2927:566::-;2999:8;;;;2994:60;;3030:13;;-1:-1:-1;;;3030:13:10;;;;;;;;;;;2994:60;3146:11;;3123:20;3167:280;3187:19;;;3167:280;;;3329:4;-1:-1:-1;;;;;3321:26:10;;3348:10;3368:4;3375:8;;3384:1;3375:11;;;;;;;:::i;:::-;3321:66;;-1:-1:-1;;;;;;3321:66:10;;;;;;;-1:-1:-1;;;;;16531:15:13;;;3321:66:10;;;16513:34:13;16583:15;;;;16563:18;;;16556:43;-1:-1:-1;3375:11:10;;;;;;16615:18:13;;;16608:34;16448:18;;3321:66:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3401:35;3407:10;3434:1;3419:12;:16;;;;:::i;:::-;3401:5;:35::i;:::-;3208:3;;;:::i;:::-;;;3167:280;;;;3471:8;;:15;;3456:11;;:30;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;2927:566:10:o;6607:169::-;6672:13;6728:12;6742:25;6759:7;6742:16;:25::i;:::-;6711:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;6697:72;;6607:169;;;:::o;1072:26::-;;;;;;;:::i;1667:124:12:-;894:13;;-1:-1:-1;;;;;894:13:12;880:10;:27;876:80;;930:15;;-1:-1:-1;;;930:15:12;;;;;;;;;;;876:80;1754:13:::1;:30:::0;;-1:-1:-1;;;;;;1754:30:12::1;-1:-1:-1::0;;;;;1754:30:12;;;::::1;::::0;;;::::1;::::0;;1667:124::o;2734:327:1:-;2461:5;-1:-1:-1;;;;;2836:33:1;;;;2828:88;;;;-1:-1:-1;;;2828:88:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;2934:22:1;;2926:60;;;;-1:-1:-1;;;2926:60:1;;18421:2:13;2926:60:1;;;18403:21:13;18460:2;18440:18;;;18433:30;18499:27;18479:18;;;18472:55;18544:18;;2926:60:1;18219:349:13;2926:60:1;3019:35;;;;;;;;;-1:-1:-1;;;;;3019:35:1;;;;;;-1:-1:-1;;;;;3019:35:1;;;;;;;;;;-1:-1:-1;;;2997:57:1;;;;:19;:57;2734:327::o;3038:638:7:-;120:42:8;3227:45:7;:49;3223:447;;3523:67;;-1:-1:-1;;;3523:67:7;;3574:4;3523:67;;;15835:34:13;-1:-1:-1;;;;;15905:15:13;;15885:18;;;15878:43;120:42:8;;3523::7;;15770:18:13;;3523:67:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3518:142;;3617:28;;-1:-1:-1;;;3617:28:7;;-1:-1:-1;;;;;2241:32:13;;3617:28:7;;;2223:51:13;2196:18;;3617:28:7;2077:203:13;2450:282:9;2521:13;2537:12;;;:8;:12;;;;;;-1:-1:-1;;;;;2537:12:9;2568:10;:19;;;:58;;-1:-1:-1;;;;;;2591:23:9;;;;;;:16;:23;;;;;;;;2615:10;2591:35;;;;;;;;;;2568:58;2560:85;;;;-1:-1:-1;;;2560:85:9;;;;;;;:::i;:::-;2656:15;;;;:11;:15;;;;;;:25;;-1:-1:-1;;;;;;2656:25:9;-1:-1:-1;;;;;2656:25:9;;;;;;;;;2697:28;;2656:15;;2697:28;;;;;;;2511:221;2450:282;;:::o;5617:371::-;5671:13;5687:12;;;:8;:12;;;;;;-1:-1:-1;;;;;5687:12:9;;5710:42;;;;-1:-1:-1;;;5710:42:9;;15268:2:13;5710:42:9;;;15250:21:13;15307:2;15287:18;;;15280:30;-1:-1:-1;;;15326:18:13;;;15319:40;15376:18;;5710:42:9;15066:334:13;5710:42:9;-1:-1:-1;;;;;5842:17:9;;;;;;:10;:17;;;;;;;;:19;;-1:-1:-1;;5842:19:9;;;5889:12;;;:8;:12;;;;;5882:19;;-1:-1:-1;;;;;;5882:19:9;;;;;;5919:11;:15;;;;;;5912:22;;;;;;;;5950:31;5898:2;;5842:17;5950:31;;5842:17;;5950:31;5661:327;5617:371;:::o;2947:741::-;3078:12;;;;:8;:12;;;;;;-1:-1:-1;;;;;3070:20:9;;;3078:12;;3070:20;3062:43;;;;-1:-1:-1;;;3062:43:9;;19084:2:13;3062:43:9;;;19066:21:13;19123:2;19103:18;;;19096:30;-1:-1:-1;;;19142:18:13;;;19135:40;19192:18;;3062:43:9;18882:334:13;3062:43:9;-1:-1:-1;;;;;3124:16:9;;3116:46;;;;-1:-1:-1;;;3116:46:9;;19423:2:13;3116:46:9;;;19405:21:13;19462:2;19442:18;;;19435:30;-1:-1:-1;;;19481:18:13;;;19474:47;19538:18;;3116:46:9;19221:341:13;3116:46:9;3194:10;-1:-1:-1;;;;;3194:18:9;;;;:56;;-1:-1:-1;;;;;;3216:22:9;;;;;;:16;:22;;;;;;;;3239:10;3216:34;;;;;;;;;;3194:56;:89;;;-1:-1:-1;3268:15:9;;;;:11;:15;;;;;;-1:-1:-1;;;;;3268:15:9;3254:10;:29;3194:89;3173:150;;;;-1:-1:-1;;;3173:150:9;;;;;;;:::i;:::-;-1:-1:-1;;;;;3523:16:9;;;;;;;:10;:16;;;;;;;;:18;;-1:-1:-1;;3523:18:9;;;3556:14;;;;;;;;;:16;;3523:18;3556:16;;;3593:12;;;:8;:12;;;;;:17;;-1:-1:-1;;;;;;3593:17:9;;;;;;;;3628:11;:15;;;;;;3621:22;;;;;;;;3659;;3602:2;;3556:14;3523:16;3659:22;;;2947:741;;;:::o;3694:396::-;3813:26;3826:4;3832:2;3836;3813:12;:26::i;:::-;-1:-1:-1;;;;;3871:14:9;;;:19;;:170;;-1:-1:-1;3910:66:9;;-1:-1:-1;;;3910:66:9;;;3951:10;3910:66;;;19872:34:13;-1:-1:-1;;;;;19942:15:13;;;19922:18;;;19915:43;19974:18;;;19967:34;;;20037:3;20017:18;;;20010:31;-1:-1:-1;20057:19:13;;;20050:30;3996:45:9;;3910:40;;;;3996:45;;20097:19:13;;3910:66:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;3910:131:9;;3871:170;3850:233;;;;-1:-1:-1;;;3850:233:9;;20583:2:13;3850:233:9;;;20565:21:13;20622:2;20602:18;;;20595:30;-1:-1:-1;;;20641:18:13;;;20634:46;20697:18;;3850:233:9;20381:340:13;3495:381:1;2461:5;-1:-1:-1;;;;;3642:33:1;;;;3634:88;;;;-1:-1:-1;;;3634:88:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;3740:22:1;;3732:62;;;;-1:-1:-1;;;3732:62:1;;20928:2:13;3732:62:1;;;20910:21:13;20967:2;20947:18;;;20940:30;21006:29;20986:18;;;20979:57;21053:18;;3732:62:1;20726:351:13;3732:62:1;3834:35;;;;;;;;-1:-1:-1;;;;;3834:35:1;;;;;-1:-1:-1;;;;;3834:35:1;;;;;;;;;;-1:-1:-1;3805:26:1;;;:17;:26;;;;;;:64;;;;;;;-1:-1:-1;;;3805:64:1;;;;;;3495:381::o;5240:371:9:-;-1:-1:-1;;;;;5314:16:9;;5306:46;;;;-1:-1:-1;;;5306:46:9;;19423:2:13;5306:46:9;;;19405:21:13;19462:2;19442:18;;;19435:30;-1:-1:-1;;;19481:18:13;;;19474:47;19538:18;;5306:46:9;19221:341:13;5306:46:9;5395:1;5371:12;;;:8;:12;;;;;;-1:-1:-1;;;;;5371:12:9;:26;5363:53;;;;-1:-1:-1;;;5363:53:9;;21284:2:13;5363:53:9;;;21266:21:13;21323:2;21303:18;;;21296:30;-1:-1:-1;;;21342:18:13;;;21335:44;21396:18;;5363:53:9;21082:338:13;5363:53:9;-1:-1:-1;;;;;5506:14:9;;;;;;:10;:14;;;;;;;;:16;;;;;;5543:12;;;:8;:12;;;;;;:17;;-1:-1:-1;;;;;;5543:17:9;;;;;5576:28;5552:2;;5506:14;;5576:28;;5506:14;;5576:28;5240:371;;:::o;2738:203::-;2840:10;2823:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;2823:38:9;;;;;;;;;;;;:49;;-1:-1:-1;;2823:49:9;;;;;;;;;;2888:46;;540:41:13;;;2823:38:9;;2840:10;2888:46;;513:18:13;2888:46:9;;;;;;;2738:203;;:::o;4096:427::-;4244:26;4257:4;4263:2;4267;4244:12;:26::i;:::-;-1:-1:-1;;;;;4302:14:9;;;:19;;:172;;-1:-1:-1;4341:68:9;;-1:-1:-1;;;4341:68:9;;;4429:45;-1:-1:-1;;;;;4341:40:9;;;4429:45;;4341:68;;4382:10;;4394:4;;4400:2;;4404:4;;;;4341:68;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;4341:133:9;;4302:172;4281:235;;;;-1:-1:-1;;;4281:235:9;;20583:2:13;4281:235:9;;;20565:21:13;20622:2;20602:18;;;20595:30;-1:-1:-1;;;20641:18:13;;;20634:46;20697:18;;4281:235:9;20381:340:13;4281:235:9;4096:427;;;;;:::o;392:703:2:-;448:13;665:5;674:1;665:10;661:51;;-1:-1:-1;;691:10:2;;;;;;;;;;;;-1:-1:-1;;;691:10:2;;;;;392:703::o;661:51::-;736:5;721:12;775:75;782:9;;775:75;;807:8;;;;:::i;:::-;;-1:-1:-1;829:10:2;;-1:-1:-1;837:2:2;829:10;;:::i;:::-;;;775:75;;;859:19;891:6;881:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;881:17:2;;859:39;;908:150;915:10;;908:150;;941:11;951:1;941:11;;:::i;:::-;;-1:-1:-1;1009:10:2;1017:2;1009:5;:10;:::i;:::-;996:24;;:2;:24;:::i;:::-;983:39;;966:6;973;966:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;966:56:2;;;;;;;;-1:-1:-1;1036:11:2;1045:2;1036:11;;:::i;:::-;;;908:150;;;1081:6;392:703;-1:-1:-1;;;;392:703:2:o;14:131:13:-;-1:-1:-1;;;;;;88:32:13;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;:::-;384:5;150:245;-1:-1:-1;;;150:245:13:o;592:131::-;-1:-1:-1;;;;;667:31:13;;657:42;;647:70;;713:1;710;703:12;728:179;795:20;;-1:-1:-1;;;;;844:38:13;;834:49;;824:77;;897:1;894;887:12;912:319;979:6;987;1040:2;1028:9;1019:7;1015:23;1011:32;1008:52;;;1056:1;1053;1046:12;1008:52;1095:9;1082:23;1114:31;1139:5;1114:31;:::i;:::-;1164:5;-1:-1:-1;1188:37:13;1221:2;1206:18;;1188:37;:::i;:::-;1178:47;;912:319;;;;;:::o;1236:250::-;1321:1;1331:113;1345:6;1342:1;1339:13;1331:113;;;1421:11;;;1415:18;1402:11;;;1395:39;1367:2;1360:10;1331:113;;;-1:-1:-1;;1478:1:13;1460:16;;1453:27;1236:250::o;1491:396::-;1640:2;1629:9;1622:21;1603:4;1672:6;1666:13;1715:6;1710:2;1699:9;1695:18;1688:34;1731:79;1803:6;1798:2;1787:9;1783:18;1778:2;1770:6;1766:15;1731:79;:::i;:::-;1871:2;1850:15;-1:-1:-1;;1846:29:13;1831:45;;;;1878:2;1827:54;;1491:396;-1:-1:-1;;1491:396:13:o;1892:180::-;1951:6;2004:2;1992:9;1983:7;1979:23;1975:32;1972:52;;;2020:1;2017;2010:12;1972:52;-1:-1:-1;2043:23:13;;1892:180;-1:-1:-1;1892:180:13:o;2285:315::-;2353:6;2361;2414:2;2402:9;2393:7;2389:23;2385:32;2382:52;;;2430:1;2427;2420:12;2382:52;2469:9;2456:23;2488:31;2513:5;2488:31;:::i;:::-;2538:5;2590:2;2575:18;;;;2562:32;;-1:-1:-1;;;2285:315:13:o;2605:367::-;2668:8;2678:6;2732:3;2725:4;2717:6;2713:17;2709:27;2699:55;;2750:1;2747;2740:12;2699:55;-1:-1:-1;2773:20:13;;2816:18;2805:30;;2802:50;;;2848:1;2845;2838:12;2802:50;2885:4;2877:6;2873:17;2861:29;;2945:3;2938:4;2928:6;2925:1;2921:14;2913:6;2909:27;2905:38;2902:47;2899:67;;;2962:1;2959;2952:12;2977:572;3072:6;3080;3088;3141:2;3129:9;3120:7;3116:23;3112:32;3109:52;;;3157:1;3154;3147:12;3109:52;3196:9;3183:23;3215:31;3240:5;3215:31;:::i;:::-;3265:5;-1:-1:-1;3321:2:13;3306:18;;3293:32;3348:18;3337:30;;3334:50;;;3380:1;3377;3370:12;3334:50;3419:70;3481:7;3472:6;3461:9;3457:22;3419:70;:::i;:::-;2977:572;;3508:8;;-1:-1:-1;3393:96:13;;-1:-1:-1;;;;2977:572:13:o;3972:456::-;4049:6;4057;4065;4118:2;4106:9;4097:7;4093:23;4089:32;4086:52;;;4134:1;4131;4124:12;4086:52;4173:9;4160:23;4192:31;4217:5;4192:31;:::i;:::-;4242:5;-1:-1:-1;4299:2:13;4284:18;;4271:32;4312:33;4271:32;4312:33;:::i;:::-;3972:456;;4364:7;;-1:-1:-1;;;4418:2:13;4403:18;;;;4390:32;;3972:456::o;4433:247::-;4492:6;4545:2;4533:9;4524:7;4520:23;4516:32;4513:52;;;4561:1;4558;4551:12;4513:52;4600:9;4587:23;4619:31;4644:5;4619:31;:::i;4685:248::-;4753:6;4761;4814:2;4802:9;4793:7;4789:23;4785:32;4782:52;;;4830:1;4827;4820:12;4782:52;-1:-1:-1;;4853:23:13;;;4923:2;4908:18;;;4895:32;;-1:-1:-1;4685:248:13:o;5217:127::-;5278:10;5273:3;5269:20;5266:1;5259:31;5309:4;5306:1;5299:15;5333:4;5330:1;5323:15;5349:922;5418:6;5471:2;5459:9;5450:7;5446:23;5442:32;5439:52;;;5487:1;5484;5477:12;5439:52;5527:9;5514:23;5556:18;5597:2;5589:6;5586:14;5583:34;;;5613:1;5610;5603:12;5583:34;5651:6;5640:9;5636:22;5626:32;;5696:7;5689:4;5685:2;5681:13;5677:27;5667:55;;5718:1;5715;5708:12;5667:55;5754:2;5741:16;5776:2;5772;5769:10;5766:36;;;5782:18;;:::i;:::-;5857:2;5851:9;5825:2;5911:13;;-1:-1:-1;;5907:22:13;;;5931:2;5903:31;5899:40;5887:53;;;5955:18;;;5975:22;;;5952:46;5949:72;;;6001:18;;:::i;:::-;6041:10;6037:2;6030:22;6076:2;6068:6;6061:18;6116:7;6111:2;6106;6102;6098:11;6094:20;6091:33;6088:53;;;6137:1;6134;6127:12;6088:53;6193:2;6188;6184;6180:11;6175:2;6167:6;6163:15;6150:46;6238:1;6216:15;;;6233:2;6212:24;6205:35;;;;-1:-1:-1;6220:6:13;5349:922;-1:-1:-1;;;;;5349:922:13:o;6515:387::-;6591:6;6599;6607;6660:2;6648:9;6639:7;6635:23;6631:32;6628:52;;;6676:1;6673;6666:12;6628:52;6712:9;6699:23;6689:33;;6772:2;6761:9;6757:18;6744:32;6785:31;6810:5;6785:31;:::i;:::-;6835:5;-1:-1:-1;6859:37:13;6892:2;6877:18;;6859:37;:::i;:::-;6849:47;;6515:387;;;;;:::o;6907:437::-;6993:6;7001;7054:2;7042:9;7033:7;7029:23;7025:32;7022:52;;;7070:1;7067;7060:12;7022:52;7110:9;7097:23;7143:18;7135:6;7132:30;7129:50;;;7175:1;7172;7165:12;7129:50;7214:70;7276:7;7267:6;7256:9;7252:22;7214:70;:::i;:::-;7303:8;;7188:96;;-1:-1:-1;6907:437:13;-1:-1:-1;;;;6907:437:13:o;7609:118::-;7695:5;7688:13;7681:21;7674:5;7671:32;7661:60;;7717:1;7714;7707:12;7732:241;7788:6;7841:2;7829:9;7820:7;7816:23;7812:32;7809:52;;;7857:1;7854;7847:12;7809:52;7896:9;7883:23;7915:28;7937:5;7915:28;:::i;7978:382::-;8043:6;8051;8104:2;8092:9;8083:7;8079:23;8075:32;8072:52;;;8120:1;8117;8110:12;8072:52;8159:9;8146:23;8178:31;8203:5;8178:31;:::i;:::-;8228:5;-1:-1:-1;8285:2:13;8270:18;;8257:32;8298:30;8257:32;8298:30;:::i;:::-;8347:7;8337:17;;;7978:382;;;;;:::o;8365:936::-;8462:6;8470;8478;8486;8494;8547:3;8535:9;8526:7;8522:23;8518:33;8515:53;;;8564:1;8561;8554:12;8515:53;8603:9;8590:23;8622:31;8647:5;8622:31;:::i;:::-;8672:5;-1:-1:-1;8729:2:13;8714:18;;8701:32;8742:33;8701:32;8742:33;:::i;:::-;8794:7;-1:-1:-1;8848:2:13;8833:18;;8820:32;;-1:-1:-1;8903:2:13;8888:18;;8875:32;8926:18;8956:14;;;8953:34;;;8983:1;8980;8973:12;8953:34;9021:6;9010:9;9006:22;8996:32;;9066:7;9059:4;9055:2;9051:13;9047:27;9037:55;;9088:1;9085;9078:12;9037:55;9128:2;9115:16;9154:2;9146:6;9143:14;9140:34;;;9170:1;9167;9160:12;9140:34;9215:7;9210:2;9201:6;9197:2;9193:15;9189:24;9186:37;9183:57;;;9236:1;9233;9226:12;9183:57;8365:936;;;;-1:-1:-1;8365:936:13;;-1:-1:-1;9267:2:13;9259:11;;9289:6;8365:936;-1:-1:-1;;;8365:936:13:o;9748:388::-;9816:6;9824;9877:2;9865:9;9856:7;9852:23;9848:32;9845:52;;;9893:1;9890;9883:12;9845:52;9932:9;9919:23;9951:31;9976:5;9951:31;:::i;:::-;10001:5;-1:-1:-1;10058:2:13;10043:18;;10030:32;10071:33;10030:32;10071:33;:::i;10141:380::-;10220:1;10216:12;;;;10263;;;10284:61;;10338:4;10330:6;10326:17;10316:27;;10284:61;10391:2;10383:6;10380:14;10360:18;10357:38;10354:161;;10437:10;10432:3;10428:20;10425:1;10418:31;10472:4;10469:1;10462:15;10500:4;10497:1;10490:15;10354:161;;10141:380;;;:::o;10526:127::-;10587:10;10582:3;10578:20;10575:1;10568:31;10618:4;10615:1;10608:15;10642:4;10639:1;10632:15;11119:245;11186:6;11239:2;11227:9;11218:7;11214:23;11210:32;11207:52;;;11255:1;11252;11245:12;11207:52;11287:9;11281:16;11306:28;11328:5;11306:28;:::i;11369:127::-;11430:10;11425:3;11421:20;11418:1;11411:31;11461:4;11458:1;11451:15;11485:4;11482:1;11475:15;11501:135;11540:3;11561:17;;;11558:43;;11581:18;;:::i;:::-;-1:-1:-1;11628:1:13;11617:13;;11501:135::o;11641:443::-;11830:2;11812:21;;;11849:18;;11842:34;;;-1:-1:-1;;;;;;11888:31:13;;11885:51;;;11932:1;11929;11922:12;11885:51;11966:6;11963:1;11959:14;12023:6;12015;12010:2;11999:9;11995:18;11982:48;12051:22;;;;12075:2;12047:31;;11641:443;-1:-1:-1;;;11641:443:13:o;12089:168::-;12162:9;;;12193;;12210:15;;;12204:22;;12190:37;12180:71;;12231:18;;:::i;12262:127::-;12323:10;12318:3;12314:20;12311:1;12304:31;12354:4;12351:1;12344:15;12378:4;12375:1;12368:15;12394:120;12434:1;12460;12450:35;;12465:18;;:::i;:::-;-1:-1:-1;12499:9:13;;12394:120::o;12645:545::-;12747:2;12742:3;12739:11;12736:448;;;12783:1;12808:5;12804:2;12797:17;12853:4;12849:2;12839:19;12923:2;12911:10;12907:19;12904:1;12900:27;12894:4;12890:38;12959:4;12947:10;12944:20;12941:47;;;-1:-1:-1;12982:4:13;12941:47;13037:2;13032:3;13028:12;13025:1;13021:20;13015:4;13011:31;13001:41;;13092:82;13110:2;13103:5;13100:13;13092:82;;;13155:17;;;13136:1;13125:13;13092:82;;13366:1352;13492:3;13486:10;13519:18;13511:6;13508:30;13505:56;;;13541:18;;:::i;:::-;13570:97;13660:6;13620:38;13652:4;13646:11;13620:38;:::i;:::-;13614:4;13570:97;:::i;:::-;13722:4;;13786:2;13775:14;;13803:1;13798:663;;;;14505:1;14522:6;14519:89;;;-1:-1:-1;14574:19:13;;;14568:26;14519:89;-1:-1:-1;;13323:1:13;13319:11;;;13315:24;13311:29;13301:40;13347:1;13343:11;;;13298:57;14621:81;;13768:944;;13798:663;12592:1;12585:14;;;12629:4;12616:18;;-1:-1:-1;;13834:20:13;;;13952:236;13966:7;13963:1;13960:14;13952:236;;;14055:19;;;14049:26;14034:42;;14147:27;;;;14115:1;14103:14;;;;13982:19;;13952:236;;;13956:3;14216:6;14207:7;14204:19;14201:201;;;14277:19;;;14271:26;-1:-1:-1;;14360:1:13;14356:14;;;14372:3;14352:24;14348:37;14344:42;14329:58;14314:74;;14201:201;-1:-1:-1;;;;;14448:1:13;14432:14;;;14428:22;14415:36;;-1:-1:-1;13366:1352:13:o;14723:338::-;14925:2;14907:21;;;14964:2;14944:18;;;14937:30;-1:-1:-1;;;14998:2:13;14983:18;;14976:44;15052:2;15037:18;;14723:338::o;16653:125::-;16718:9;;;16739:10;;;16736:36;;;16752:18;;:::i;16783:1020::-;16959:3;16988:1;17021:6;17015:13;17051:36;17077:9;17051:36;:::i;:::-;17106:1;17123:18;;;17150:133;;;;17297:1;17292:356;;;;17116:532;;17150:133;-1:-1:-1;;17183:24:13;;17171:37;;17256:14;;17249:22;17237:35;;17228:45;;;-1:-1:-1;17150:133:13;;17292:356;17323:6;17320:1;17313:17;17353:4;17398:2;17395:1;17385:16;17423:1;17437:165;17451:6;17448:1;17445:13;17437:165;;;17529:14;;17516:11;;;17509:35;17572:16;;;;17466:10;;17437:165;;;17441:3;;;17631:6;17626:3;17622:16;17615:23;;17116:532;;;;;17679:6;17673:13;17695:68;17754:8;17749:3;17742:4;17734:6;17730:17;17695:68;:::i;:::-;17779:18;;16783:1020;-1:-1:-1;;;;16783:1020:13:o;17808:406::-;18010:2;17992:21;;;18049:2;18029:18;;;18022:30;18088:34;18083:2;18068:18;;18061:62;-1:-1:-1;;;18154:2:13;18139:18;;18132:40;18204:3;18189:19;;17808:406::o;20127:249::-;20196:6;20249:2;20237:9;20228:7;20224:23;20220:32;20217:52;;;20265:1;20262;20255:12;20217:52;20297:9;20291:16;20316:30;20340:5;20316:30;:::i;21425:662::-;-1:-1:-1;;;;;21704:15:13;;;21686:34;;21756:15;;21751:2;21736:18;;21729:43;21803:2;21788:18;;21781:34;;;21851:3;21846:2;21831:18;;21824:31;;;21871:19;;21864:35;;;21629:4;21892:6;21942;21666:3;21921:19;;21908:49;22007:1;22001:3;21992:6;21981:9;21977:22;21973:32;21966:43;22077:3;22070:2;22066:7;22061:2;22053:6;22049:15;22045:29;22034:9;22030:45;22026:55;22018:63;;21425:662;;;;;;;;:::o;22092:128::-;22159:9;;;22180:11;;;22177:37;;;22194:18;;:::i;22225:112::-;22257:1;22283;22273:35;;22288:18;;:::i;:::-;-1:-1:-1;22322:9:13;;22225:112::o
Swarm Source
none
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.