More Info
Private Name Tags
ContractCreator
TokenTracker
Sponsored
Latest 25 from a total of 582 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer From | 58335313 | 86 days ago | IN | 0 POL | 0.00236759 | ||||
Multicall | 51547164 | 262 days ago | IN | 0 POL | 0.00893288 | ||||
Safe Transfer Fr... | 43320610 | 472 days ago | IN | 0 POL | 0.0137299 | ||||
Multicall | 41447118 | 520 days ago | IN | 0 POL | 0.03234081 | ||||
Multicall | 41193929 | 526 days ago | IN | 0 POL | 0.00339237 | ||||
Multicall | 40808693 | 536 days ago | IN | 0 POL | 0.02655945 | ||||
Multicall | 39319061 | 576 days ago | IN | 0 POL | 0.0318232 | ||||
Publish | 39177914 | 579 days ago | IN | 0 POL | 0.0498943 | ||||
Safe Transfer Fr... | 38302970 | 602 days ago | IN | 0 POL | 0.00282945 | ||||
Publish | 38292394 | 602 days ago | IN | 0 POL | 0.02000442 | ||||
Publish | 38230625 | 604 days ago | IN | 0 POL | 0.00567267 | ||||
Multicall | 37549565 | 620 days ago | IN | 0 POL | 0.00826208 | ||||
Multicall | 37549448 | 620 days ago | IN | 0 POL | 0.0066646 | ||||
Multicall | 37390303 | 624 days ago | IN | 0 POL | 0.0053496 | ||||
Multicall | 37140044 | 631 days ago | IN | 0 POL | 0.00816771 | ||||
Multicall | 37051746 | 633 days ago | IN | 0 POL | 0.01446825 | ||||
Multicall | 36584706 | 644 days ago | IN | 0 POL | 0.00360293 | ||||
Publish | 36584627 | 644 days ago | IN | 0 POL | 0.01294105 | ||||
Multicall | 36407546 | 649 days ago | IN | 0 POL | 0.00741595 | ||||
Multicall | 36290830 | 652 days ago | IN | 0 POL | 0.00486328 | ||||
Multicall | 35913492 | 661 days ago | IN | 0 POL | 0.00510644 | ||||
Transfer From | 35739252 | 665 days ago | IN | 0 POL | 0.00206717 | ||||
Set Description | 35687271 | 666 days ago | IN | 0 POL | 0.00117088 | ||||
Publish | 35685614 | 666 days ago | IN | 0 POL | 0.00854385 | ||||
Multicall | 35684330 | 666 days ago | IN | 0 POL | 0.00260919 |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
Logbook
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2022-03-20 */ //SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.4; // OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol) // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.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; } } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } }// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }/** * @dev Provides a set of functions to operate with Base64 strings. */ library Base64 { /** * @dev Base64 Encoding/Decoding Table */ string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /** * @dev Converts a `bytes` to its Bytes64 `string` representation. */ function encode(bytes memory data) internal pure returns (string memory) { /** * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol */ if (data.length == 0) return ""; // Loads the table into memory string memory table = _TABLE; // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter // and split into 4 numbers of 6 bits. // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up // - `data.length + 2` -> Round up // - `/ 3` -> Number of 3-bytes chunks // - `4 *` -> 4 characters for each chunk string memory result = new string(4 * ((data.length + 2) / 3)); assembly { // Prepare the lookup table (skip the first "length" byte) let tablePtr := add(table, 1) // Prepare result pointer, jump over length let resultPtr := add(result, 32) // Run over the input, 3 bytes at a time for { let dataPtr := data let endPtr := add(data, mload(data)) } lt(dataPtr, endPtr) { } { // Advance 3 bytes dataPtr := add(dataPtr, 3) let input := mload(dataPtr) // To write each character, shift the 3 bytes (18 bits) chunk // 4 times in blocks of 6 bits for each character (18, 12, 6, 0) // and apply logical AND with 0x3F which is the number of // the previous character in the ASCII table prior to the Base64 Table // The result is then added to the table to get the character to write, // and finally write it in the result pointer but with a left shift // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F)))) resultPtr := add(resultPtr, 1) // Advance } // When data `bytes` is not exactly 3 bytes long // it is padded with `=` characters at the end switch mod(mload(data), 3) case 1 { mstore8(sub(resultPtr, 1), 0x3d) mstore8(sub(resultPtr, 2), 0x3d) } case 2 { mstore8(sub(resultPtr, 1), 0x3d) } } return result; } } /** * @title The interface for NFT royalty */ interface IRoyalty { error ZeroAmount(); error InsufficientBalance(uint256 available, uint256 required); enum RoyaltyPurpose { Fork, Donate } /** * @notice Emitted when a royalty payment is made * @param tokenId Token id * @param sender Sender address * @param recipient Recipient address * @param purpose Purpose of the payment, e.g. fork, donate * @param amount Amount of the payment */ event Pay( uint256 indexed tokenId, address indexed sender, address indexed recipient, uint256 amount, RoyaltyPurpose purpose ); /** * @notice Emitted when a withdrawal is made * @param account Address that receives the withdrawal * @param amount Amount of the withdrawal */ event Withdraw(address indexed account, uint256 amount); /** * @notice Withdraw royalty fees * @dev Emits a {Withdraw} event */ function withdraw() external; /** * @notice Get balance of a given address * @param account_ Address */ function getBalance(address account_) external view returns (uint256); } /** * @title The interface for Logbook core contract * @dev The interface is inherited from IERC721 (for logbook as NFT) and IRoyalty (for royalty) */ interface ILogbook is IRoyalty, IERC721 { error Unauthorized(); error InvalidBPS(uint256 min, uint256 max); error InvalidTokenId(uint256 min, uint256 max); error InsufficientAmount(uint256 available, uint256 required); error InsufficientLogs(uint32 maxEndAt); error TokenNotExists(); error PublicSaleNotStarted(); struct Log { address author; // logbook that this log first publish to uint256 tokenId; } struct Book { // end position of a range of logs uint32 endAt; // total number of logs uint32 logCount; // number of transfers uint32 transferCount; // creation time of the book uint160 createdAt; // parent book uint256 parent; // fork price uint256 forkPrice; // all logs hashes in the book bytes32[] contentHashes; } struct SplitRoyaltyFees { uint256 commission; uint256 logbookOwner; uint256 perLogAuthor; } /** * @notice Emitted when logbook title was set * @param tokenId Logbook token id * @param title Logbook title */ event SetTitle(uint256 indexed tokenId, string title); /** * @notice Emitted when logbook description was set * @param tokenId Logbook token id * @param description Logbook description */ event SetDescription(uint256 indexed tokenId, string description); /** * @notice Emitted when logbook fork price was set * @param tokenId Logbook token id * @param amount Logbook fork price */ event SetForkPrice(uint256 indexed tokenId, uint256 amount); /** * @notice Emitted when a new log was created * @param author Author address * @param contentHash Deterministic unique ID, hash of the content * @param content Content string */ event Content(address indexed author, bytes32 indexed contentHash, string content); /** * @notice Emitted when logbook owner publish a new log * @param tokenId Logbook token id * @param contentHash Deterministic unique ID, hash of the content */ event Publish(uint256 indexed tokenId, bytes32 indexed contentHash); /** * @notice Emitted when a logbook was forked * @param tokenId Logbook token id * @param newTokenId New logbook token id * @param owner New logbook owner address * @param end End position of contentHashes of parent logbook (one-based) * @param amount Fork price */ event Fork(uint256 indexed tokenId, uint256 indexed newTokenId, address indexed owner, uint32 end, uint256 amount); /** * @notice Emitted when a logbook received a donation * @param tokenId Logbook token id * @param donor Donor address * @param amount Fork price */ event Donate(uint256 indexed tokenId, address indexed donor, uint256 amount); /** * @notice Set logbook title * @dev Access Control: logbook owner * @dev Emits a {SetTitle} event * @param tokenId_ logbook token id * @param title_ logbook title */ function setTitle(uint256 tokenId_, string calldata title_) external; /** * @notice Set logbook description * @dev Access Control: logbook owner * @dev Emits a {SetDescription} event * @param tokenId_ Logbook token id * @param description_ Logbook description */ function setDescription(uint256 tokenId_, string calldata description_) external; /** * @notice Set logbook fork price * @dev Access Control: logbook owner * @dev Emits a {SetForkPrice} event * @param tokenId_ Logbook token id * @param amount_ Fork price */ function setForkPrice(uint256 tokenId_, uint256 amount_) external; /** * @notice Batch calling methods of this contract * @param data Array of calldata */ function multicall(bytes[] calldata data) external payable returns (bytes[] memory results); /** * @notice Publish a new log in a logbook * @dev Access Control: logbook owner * @dev Emits a {Publish} event * @param tokenId_ Logbook token id * @param content_ Log content */ function publish(uint256 tokenId_, string calldata content_) external; /** * @notice Pay to fork a logbook * @dev Emits {Fork} and {Pay} events * @param tokenId_ Logbook token id * @param endAt_ End position of contentHashes of parent logbook (one-based) * @return tokenId New logobok token id */ function fork(uint256 tokenId_, uint32 endAt_) external payable returns (uint256 tokenId); /** * @notice Pay to fork a logbook with commission * @dev Emits {Fork} and {Pay} events * @param tokenId_ Logbook token id * @param endAt_ End position of contentHashes of parent logbook (one-based) * @param commission_ Address (frontend operator) to earn commission * @param commissionBPS_ Basis points of the commission * @return tokenId New logobok token id */ function forkWithCommission( uint256 tokenId_, uint32 endAt_, address commission_, uint256 commissionBPS_ ) external payable returns (uint256 tokenId); /** * @notice Donate to a logbook * @dev Emits {Donate} and {Pay} events * @param tokenId_ Logbook token id */ function donate(uint256 tokenId_) external payable; /** * @notice Donate to a logbook with commission * @dev Emits {Donate} and {Pay} events * @param tokenId_ Logbook token id * @param commission_ Address (frontend operator) to earn commission * @param commissionBPS_ Basis points of the commission */ function donateWithCommission( uint256 tokenId_, address commission_, uint256 commissionBPS_ ) external payable; /** * @notice Get a logbook * @param tokenId_ Logbook token id * @return book Logbook data */ function getLogbook(uint256 tokenId_) external view returns (Book memory book); /** * @notice Get a logbook's logs * @param tokenId_ Logbook token id * @return contentHashes All logs' content hashes * @return authors All logs' authors */ function getLogs(uint256 tokenId_) external view returns (bytes32[] memory contentHashes, address[] memory authors); /** * @notice Claim a logbook with a Traveloggers token * @dev Access Control: contract deployer * @param to_ Traveloggers token owner * @param logrsId_ Traveloggers token id (1-1500) */ function claim(address to_, uint256 logrsId_) external; /** * @notice Mint a logbook */ function publicSaleMint() external payable returns (uint256 tokenId); /** * @notice Set public sale * @dev Access Control: contract deployer */ function setPublicSalePrice(uint256 price_) external; /** * @notice Turn on public sale * @dev Access Control: contract deployer */ function turnOnPublicSale() external; /** * @notice Turn off public sale * @dev Access Control: contract deployer */ function turnOffPublicSale() external; }abstract contract Royalty is IRoyalty, Ownable { mapping(address => uint256) internal _balances; /// @inheritdoc IRoyalty function withdraw() public { uint256 amount = getBalance(msg.sender); if (amount == 0) revert ZeroAmount(); if (address(this).balance < amount) revert InsufficientBalance(address(this).balance, amount); _balances[msg.sender] = 1 wei; (bool success, ) = msg.sender.call{value: amount}(""); require(success); emit Withdraw(msg.sender, amount); } /// @inheritdoc IRoyalty function getBalance(address account_) public view returns (uint256 amount) { uint256 balance = _balances[account_]; amount = balance <= 1 wei ? 0 : balance - 1 wei; } }library NFTSVG { struct SVGParams { uint32 logCount; uint32 transferCount; uint160 createdAt; uint256 tokenId; } function generateSVG(SVGParams memory params) internal pure returns (string memory svg) { svg = string( abi.encodePacked( '<svg width="800" height="800" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd">', generateSVGBackground(params), generateSVGPathsA(params), generateSVGPathsB(params), generateSVGTexts(params), "</g></svg>" ) ); } function generateSVGBackground(SVGParams memory params) internal pure returns (string memory svg) { string memory colorBackground = params.logCount < 10 ? "#F3F1EA" : "#41403F"; svg = string(abi.encodePacked('<path d="M0 0h800v800H0z" fill="', colorBackground, '"/>')); } function generateSVGPathsA(SVGParams memory params) internal pure returns (string memory svg) { string memory color = string( abi.encodePacked( "rgb(", Strings.toString(uint8((params.createdAt * params.tokenId * _max(params.logCount, 1) * 10) % 256)), ",", Strings.toString(uint8((params.createdAt * params.transferCount * 80) % 256)), ",", Strings.toString(uint8(params.tokenId % 256)), ")" ) ); svg = string( abi.encodePacked( '<path d="M670.7 535.7a30 30 0 0 1 30 30V648a30 30 0 0 1-30 30h-79a30 30 0 0 1-30-30v-4.5a30 30 0 0 1 30-30h18.1a30 30 0 0 0 30-30v-17.8a30 30 0 0 1 30-30h1Zm-386.7.4a30 30 0 0 1 30 30V648a30 30 0 0 1-30 30h-1a30 30 0 0 1-30-30v-82a30 30 0 0 1 30-30Zm-150 77.6a30 30 0 0 1 30 30v3.6a30 30 0 0 1-30 30h-5.8a30 30 0 0 1-30-30v-3.5a30 30 0 0 1 30-30ZM519 536a30 30 0 0 1 30 30v5.4a30 30 0 0 1-30 30h-81.8a30 30 0 0 1-30-30v-5.4a30 30 0 0 1 30-30Zm-2.5-154.6a30 30 0 0 1 30 30v82a30 30 0 0 1-30 30h-.9a30 30 0 0 1-30-30v-82a30 30 0 0 1 30-30Zm-76-76.7a30 30 0 0 1 30 30v82a30 30 0 0 1-30 30h-82.1a30 30 0 0 1-30-30v-2.2a30 30 0 0 1 30-30h17.7a30 30 0 0 0 30-30v-19.8a30 30 0 0 1 30-30ZM210 381a30 30 0 0 1 30 30v3.6a30 30 0 0 1-30 30h-5.8a30 30 0 0 1-30-30V411a30 30 0 0 1 30-30h5.8Zm74.1-154.7a30 30 0 0 1 30 30V274a30 30 0 0 0 30 30h18.2a30 30 0 0 1 30 30v4.5a30 30 0 0 1-30 30h-79a30 30 0 0 1-30-30v-82.3a30 30 0 0 1 30-30Zm386.6 0a30 30 0 0 1 30 30v82.3a30 30 0 0 1-30 30h-79a30 30 0 0 1-30-30V334a30 30 0 0 1 30-30h18.1a30 30 0 0 0 30-30v-17.8a30 30 0 0 1 30-30h1ZM207.2 145a30 30 0 0 1 30 30v82.3a30 30 0 0 1-30 30h-.9a30 30 0 0 1-30-30v-17.8a30 30 0 0 0-30-30h-18.1a30 30 0 0 1-30-30V175a30 30 0 0 1 30-30Zm387.2.3a30 30 0 0 1 30 30v82a30 30 0 0 1-30 30h-.9a30 30 0 0 1-30-30v-82a30 30 0 0 1 30-30Zm-156.5 0a30 30 0 0 1 30 30v7.2a30 30 0 0 1-30 30h-.9a30 30 0 0 1-30-30v-7.2a30 30 0 0 1 30-30Z" fill-opacity=".5" fill="', color, '"/>' ) ); } function generateSVGPathsB(SVGParams memory params) internal pure returns (string memory svg) { string memory color = string( abi.encodePacked( "rgb(", Strings.toString(uint8((params.createdAt * params.tokenId * _max(params.logCount, 1) * 20) % 256)), ",", Strings.toString(uint8((params.createdAt * params.transferCount * 40) % 256)), ",", Strings.toString(uint8(params.tokenId % 256)), ")" ) ); svg = string( abi.encodePacked( '<path d="M356.8 535.7a30 30 0 0 1 30 30v17.8a30 30 0 0 0 30 30H435a30 30 0 0 1 30 30v4.5a30 30 0 0 1-30 30h-79a30 30 0 0 1-30-30v-82.3a30 30 0 0 1 30-30Zm-149.8 0a30 30 0 0 1 30 30V648a30 30 0 0 1-30 30h-.9a30 30 0 0 1-30-30v-17.8a30 30 0 0 0-30-30H128a30 30 0 0 1-30-30v-4.5a30 30 0 0 1 30-30Zm312.1 78a30 30 0 0 1 30 30v3.6a30 30 0 0 1-30 30h-5.8a30 30 0 0 1-30-30v-3.5a30 30 0 0 1 30-30Zm78-77.3a30 30 0 0 1 30 30v3.6a30 30 0 0 1-30 30h-5.9a30 30 0 0 1-30-30v-3.6a30 30 0 0 1 30-30h5.9Zm-4.5-154a30 30 0 0 1 30 30V430a30 30 0 0 0 30 30h18.1a30 30 0 0 1 30 30v4.5a30 30 0 0 1-30 30h-79a30 30 0 0 1-30-30v-82.3a30 30 0 0 1 30-30Zm-308.5 0a30 30 0 0 1 30 30V430a30 30 0 0 0 30 30h18.2a30 30 0 0 1 30 30v4.5a30 30 0 0 1-30 30h-79a30 30 0 0 1-30-30v-82.3a30 30 0 0 1 30-30ZM129 381a30 30 0 0 1 30 30v17.8a30 30 0 0 0 30 30H207a30 30 0 0 1 30 30v4.5a30 30 0 0 1-30 30h-79a30 30 0 0 1-30-30V411a30 30 0 0 1 30-30Zm311.6 78a30 30 0 0 1 30 30v4.3a30 30 0 0 1-30 30h-.9a30 30 0 0 1-30-30V489a30 30 0 0 1 30-30Zm230-77a30 30 0 0 1 30 30v7.2a30 30 0 0 1-30 30h-7.2a30 30 0 0 1-30-30V412a30 30 0 0 1 30-30Zm-154-78a30 30 0 0 1 30 30v7.2a30 30 0 0 1-30 30h-.9a30 30 0 0 1-30-30V334a30 30 0 0 1 30-30ZM209.8 307a30 30 0 0 1 30 30v1a30 30 0 0 1-30 30H128a30 30 0 0 1-30-30v-1a30 30 0 0 1 30-30ZM362.3 145a30 30 0 0 1 30 30v82.3a30 30 0 0 1-30 30h-1a30 30 0 0 1-30-30v-17.8a30 30 0 0 0-30-30h-18a30 30 0 0 1-30-30V175a30 30 0 0 1 30-30Zm156.8.3a30 30 0 0 1 30 30v82a30 30 0 0 1-30 30H437a30 30 0 0 1-30-30V255a30 30 0 0 1 30-30h17.7a30 30 0 0 0 30-30v-19.8a30 30 0 0 1 30-30Zm-385 81a30 30 0 0 1 30 30v1a30 30 0 0 1-30 30h-6a30 30 0 0 1-30-30v-1a30 30 0 0 1 30-30h6Zm536.3-81a30 30 0 0 1 30 30v7.2a30 30 0 0 1-30 30h-.9a30 30 0 0 1-30-30v-7.2a30 30 0 0 1 30-30Z" fill="', color, '"/>' ) ); } function generateSVGTexts(SVGParams memory params) internal pure returns (string memory svg) { string memory colorBackground = params.logCount < 10 ? "#F3F1EA" : "#41403F"; string memory colorText = params.logCount < 10 ? "#333" : "#fff"; string[3] memory texts; // title texts[0] = string( abi.encodePacked( '<text fill="', colorText, '" font-family="Roboto, Tahoma-Bold, Tahoma" font-size="48" font-weight="bold"><tspan x="99.3" y="105.4">LOGBOOK</tspan></text>', '<path stroke="', colorText, '" stroke-width="8" d="M387 88h314M99 718h602"/>' ) ); // metadata string memory numbers = string( abi.encodePacked( "Logs/", Strings.toString(params.logCount), " Transfers/", Strings.toString(params.transferCount - 1), " ID/", Strings.toString(params.tokenId) ) ); uint256 len = bytes(numbers).length; string memory placeholders; for (uint256 i = 0; i < len; i++) { placeholders = string(abi.encodePacked(placeholders, "g")); } texts[1] = string( abi.encodePacked( '<text stroke="', colorBackground, '" stroke-width="20" font-family="Roboto, Tahoma-Bold, Tahoma" font-size="18" font-weight="bold" fill="', colorText, '"><tspan x="98" y="724.2">', placeholders, "</tspan></text>" ) ); texts[2] = string( abi.encodePacked( '<text fill="', colorText, '" font-family="Roboto, Tahoma-Bold, Tahoma" font-size="18" font-weight="bold" xml:space="preserve"><tspan x="98" y="724.2">', numbers, "</tspan></text>" ) ); svg = string(abi.encodePacked(texts[0], texts[1], texts[2])); } function _max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } } contract Logbook is ERC721, Ownable, ILogbook, Royalty { uint256 private constant _ROYALTY_BPS_LOGBOOK_OWNER = 8000; uint256 private constant _ROYALTY_BPS_COMMISSION_MAX = 10000 - _ROYALTY_BPS_LOGBOOK_OWNER; uint256 private constant _PUBLIC_SALE_ON = 1; uint256 private constant _PUBLIC_SALE_OFF = 2; uint256 public publicSale = _PUBLIC_SALE_OFF; uint256 public publicSalePrice; // contentHash to log mapping(bytes32 => Log) public logs; // tokenId to logbook mapping(uint256 => Book) private _books; // starts at 1501 since 1-1500 are reseved for Traveloggers claiming using Counters for Counters.Counter; Counters.Counter internal _tokenIdCounter = Counters.Counter(1500); /** * @dev Throws if called by any account other than the logbook owner. */ modifier onlyLogbookOwner(uint256 tokenId_) { if (!_isApprovedOrOwner(msg.sender, tokenId_)) revert Unauthorized(); _; } constructor(string memory name_, string memory symbol_) ERC721(name_, symbol_) {} /// @inheritdoc ILogbook function setTitle(uint256 tokenId_, string calldata title_) external onlyLogbookOwner(tokenId_) { emit SetTitle(tokenId_, title_); } /// @inheritdoc ILogbook function setDescription(uint256 tokenId_, string calldata description_) external onlyLogbookOwner(tokenId_) { emit SetDescription(tokenId_, description_); } /// @inheritdoc ILogbook function setForkPrice(uint256 tokenId_, uint256 amount_) external onlyLogbookOwner(tokenId_) { _books[tokenId_].forkPrice = amount_; emit SetForkPrice(tokenId_, amount_); } /// @inheritdoc ILogbook function multicall(bytes[] calldata data) external payable returns (bytes[] memory results) { results = new bytes[](data.length); for (uint256 i = 0; i < data.length; i++) { (bool success, bytes memory result) = address(this).delegatecall(data[i]); require(success); results[i] = result; } return results; } /// @inheritdoc ILogbook function publish(uint256 tokenId_, string calldata content_) external onlyLogbookOwner(tokenId_) { bytes32 contentHash = keccak256(abi.encodePacked(content_)); // log Log memory log = logs[contentHash]; if (log.author == address(0)) { logs[contentHash] = Log(msg.sender, tokenId_); emit Content(msg.sender, contentHash, content_); } // logbook _books[tokenId_].logCount++; _books[tokenId_].contentHashes.push(contentHash); emit Publish(tokenId_, contentHash); } /// @inheritdoc ILogbook function fork(uint256 tokenId_, uint32 endAt_) external payable returns (uint256 tokenId) { (Book memory book, uint256 newTokenId) = _fork(tokenId_, endAt_); tokenId = newTokenId; if (msg.value > 0) { address logbookOwner = ERC721.ownerOf(tokenId_); _splitRoyalty(tokenId_, book, logbookOwner, msg.value, RoyaltyPurpose.Fork, address(0), 0); } } /// @inheritdoc ILogbook function forkWithCommission( uint256 tokenId_, uint32 endAt_, address commission_, uint256 commissionBPS_ ) external payable returns (uint256 tokenId) { if (commissionBPS_ > _ROYALTY_BPS_COMMISSION_MAX) revert InvalidBPS(0, _ROYALTY_BPS_COMMISSION_MAX); (Book memory book, uint256 newTokenId) = _fork(tokenId_, endAt_); tokenId = newTokenId; if (msg.value > 0) { address logbookOwner = ERC721.ownerOf(tokenId_); _splitRoyalty(tokenId_, book, logbookOwner, msg.value, RoyaltyPurpose.Fork, commission_, commissionBPS_); } } /// @inheritdoc ILogbook function donate(uint256 tokenId_) external payable { if (msg.value <= 0) revert ZeroAmount(); if (!_exists(tokenId_)) revert TokenNotExists(); Book memory book = _books[tokenId_]; address logbookOwner = ERC721.ownerOf(tokenId_); _splitRoyalty(tokenId_, book, logbookOwner, msg.value, RoyaltyPurpose.Donate, address(0), 0); emit Donate(tokenId_, msg.sender, msg.value); } /// @inheritdoc ILogbook function donateWithCommission( uint256 tokenId_, address commission_, uint256 commissionBPS_ ) external payable { if (msg.value <= 0) revert ZeroAmount(); if (!_exists(tokenId_)) revert TokenNotExists(); if (commissionBPS_ > _ROYALTY_BPS_COMMISSION_MAX) revert InvalidBPS(0, _ROYALTY_BPS_COMMISSION_MAX); Book memory book = _books[tokenId_]; address logbookOwner = ERC721.ownerOf(tokenId_); _splitRoyalty(tokenId_, book, logbookOwner, msg.value, RoyaltyPurpose.Donate, commission_, commissionBPS_); emit Donate(tokenId_, msg.sender, msg.value); } /// @inheritdoc ILogbook function getLogbook(uint256 tokenId_) external view returns (Book memory book) { book = _books[tokenId_]; } /// @inheritdoc ILogbook function getLogs(uint256 tokenId_) external view returns (bytes32[] memory contentHashes, address[] memory authors) { Book memory book = _books[tokenId_]; uint32 logCount = book.logCount; contentHashes = _logs(tokenId_); authors = new address[](logCount); for (uint32 i = 0; i < logCount; i++) { bytes32 contentHash = contentHashes[i]; authors[i] = logs[contentHash].author; } } /// @inheritdoc ILogbook function claim(address to_, uint256 logrsId_) external onlyOwner { if (logrsId_ < 1 || logrsId_ > 1500) revert InvalidTokenId(1, 1500); _safeMint(to_, logrsId_); _books[logrsId_].createdAt = uint160(block.timestamp); } /// @inheritdoc ILogbook function publicSaleMint() external payable returns (uint256 tokenId) { if (publicSale != _PUBLIC_SALE_ON) revert PublicSaleNotStarted(); if (msg.value < publicSalePrice) revert InsufficientAmount(msg.value, publicSalePrice); // forward value address deployer = owner(); (bool success, ) = deployer.call{value: msg.value}(""); require(success); // mint tokenId = _mint(msg.sender); } /// @inheritdoc ILogbook function setPublicSalePrice(uint256 price_) external onlyOwner { publicSalePrice = price_; } /// @inheritdoc ILogbook function turnOnPublicSale() external onlyOwner { publicSale = _PUBLIC_SALE_ON; } /// @inheritdoc ILogbook function turnOffPublicSale() external onlyOwner { publicSale = _PUBLIC_SALE_OFF; } function tokenURI(uint256 tokenId_) public view override returns (string memory) { if (!_exists(tokenId_)) revert TokenNotExists(); Book memory book = _books[tokenId_]; uint32 logCount = book.logCount; string memory tokenName = string(abi.encodePacked("Logbook #", Strings.toString(tokenId_))); string memory description = "A book that records owners' journey in Matterverse."; string memory attributeLogs = string( abi.encodePacked('{"trait_type": "Logs","value":"', Strings.toString(logCount), '"}') ); NFTSVG.SVGParams memory svgParams = NFTSVG.SVGParams({ logCount: logCount, transferCount: book.transferCount, createdAt: book.createdAt, tokenId: tokenId_ }); string memory image = Base64.encode(bytes(NFTSVG.generateSVG(svgParams))); string memory json = Base64.encode( bytes( string( abi.encodePacked( '{"name": "', tokenName, '", "description": "', description, '", "attributes": [', attributeLogs, '], "image": "data:image/svg+xml;base64,', image, '"}' ) ) ) ); string memory output = string(abi.encodePacked("data:application/json;base64,", json)); return output; } /** * @notice Get logs of a book * @param tokenId_ Logbook token id */ function _logs(uint256 tokenId_) internal view returns (bytes32[] memory contentHashes) { Book memory book = _books[tokenId_]; contentHashes = new bytes32[](book.logCount); uint32 index = 0; // copy from parents Book memory parent = _books[book.parent]; uint32 takes = book.endAt; bool hasParent = book.parent == 0 ? false : true; while (hasParent) { bytes32[] memory parentContentHashes = parent.contentHashes; for (uint32 i = 0; i < takes; i++) { contentHashes[index] = parentContentHashes[i]; index++; } if (parent.parent == 0) { hasParent = false; } else { takes = parent.endAt; parent = _books[parent.parent]; } } // copy from current bytes32[] memory currentContentHashes = book.contentHashes; for (uint32 i = 0; i < currentContentHashes.length; i++) { contentHashes[index] = currentContentHashes[i]; index++; } } function _mint(address to) internal returns (uint256 tokenId) { _tokenIdCounter.increment(); tokenId = _tokenIdCounter.current(); _safeMint(to, tokenId); _books[tokenId].createdAt = uint160(block.timestamp); } function _fork(uint256 tokenId_, uint32 endAt_) internal returns (Book memory newBook, uint256 newTokenId) { if (!_exists(tokenId_)) revert TokenNotExists(); Book memory book = _books[tokenId_]; uint32 maxEndAt = uint32(book.contentHashes.length); uint32 logCount = book.logCount; if (logCount <= 0 || endAt_ <= 0 || maxEndAt < endAt_) revert InsufficientLogs(maxEndAt); if (msg.value < book.forkPrice) revert InsufficientAmount(msg.value, book.forkPrice); // mint new logbook newTokenId = _mint(msg.sender); bytes32[] memory contentHashes = new bytes32[](0); newBook = Book({ endAt: endAt_, logCount: logCount - maxEndAt + endAt_, transferCount: 1, createdAt: uint160(block.timestamp), parent: tokenId_, forkPrice: 0 ether, contentHashes: contentHashes }); _books[newTokenId] = newBook; emit Fork(tokenId_, newTokenId, msg.sender, endAt_, msg.value); } /** * @notice Split royalty payments * @dev No repetitive checks, please make sure all arguments are valid * @param tokenId_ Logbook token id * @param book_ Logbook to be split royalty * @param amount_ Total amount to split royalty * @param purpose_ Payment purpose * @param commission_ commission_ Address (frontend operator) to earn commission * @param commissionBPS_ Basis points of the commission */ function _splitRoyalty( uint256 tokenId_, Book memory book_, address logbookOwner_, uint256 amount_, RoyaltyPurpose purpose_, address commission_, uint256 commissionBPS_ ) internal { uint32 logCount = book_.logCount; bytes32[] memory contentHashes = _logs(tokenId_); // fees calculation SplitRoyaltyFees memory fees; bool isNoCommission = commission_ == address(0) || commissionBPS_ == 0; if (!isNoCommission) { fees.commission = (amount_ * commissionBPS_) / 10000; } if (logCount <= 0) { fees.logbookOwner = amount_ - fees.commission; } else { fees.logbookOwner = (amount_ * _ROYALTY_BPS_LOGBOOK_OWNER) / 10000; fees.perLogAuthor = (amount_ - fees.logbookOwner - fees.commission) / logCount; } // split royalty // -> logbook owner _balances[logbookOwner_] += fees.logbookOwner; emit Pay({ tokenId: tokenId_, sender: msg.sender, recipient: logbookOwner_, amount: fees.logbookOwner, purpose: purpose_ }); // -> commission if (!isNoCommission) { _balances[commission_] += fees.commission; emit Pay({ tokenId: tokenId_, sender: msg.sender, recipient: commission_, amount: fees.commission, purpose: purpose_ }); } // -> logs' authors if (logCount > 0) { for (uint32 i = 0; i < logCount; i++) { Log memory log = logs[contentHashes[i]]; _balances[log.author] += fees.perLogAuthor; emit Pay({ tokenId: tokenId_, sender: msg.sender, recipient: log.author, amount: fees.perLogAuthor, purpose: purpose_ }); } } } function _afterTokenTransfer( address from_, address to_, uint256 tokenId_ ) internal virtual override { super._afterTokenTransfer(from_, to_, tokenId_); // Call parent hook _books[tokenId_].transferCount++; // warm up _balances[to] to reduce gas of SSTORE on _splitRoyalty if (_balances[to_] == 0) { _balances[to_] = 1 wei; } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"available","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"name":"InsufficientAmount","type":"error"},{"inputs":[{"internalType":"uint256","name":"available","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"uint32","name":"maxEndAt","type":"uint32"}],"name":"InsufficientLogs","type":"error"},{"inputs":[{"internalType":"uint256","name":"min","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"InvalidBPS","type":"error"},{"inputs":[{"internalType":"uint256","name":"min","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"InvalidTokenId","type":"error"},{"inputs":[],"name":"PublicSaleNotStarted","type":"error"},{"inputs":[],"name":"TokenNotExists","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"ZeroAmount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"author","type":"address"},{"indexed":true,"internalType":"bytes32","name":"contentHash","type":"bytes32"},{"indexed":false,"internalType":"string","name":"content","type":"string"}],"name":"Content","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"donor","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Donate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"newTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint32","name":"end","type":"uint32"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Fork","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"enum IRoyalty.RoyaltyPurpose","name":"purpose","type":"uint8"}],"name":"Pay","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"bytes32","name":"contentHash","type":"bytes32"}],"name":"Publish","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"description","type":"string"}],"name":"SetDescription","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SetForkPrice","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"title","type":"string"}],"name":"SetTitle","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"logrsId_","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"donate","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"},{"internalType":"address","name":"commission_","type":"address"},{"internalType":"uint256","name":"commissionBPS_","type":"uint256"}],"name":"donateWithCommission","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"},{"internalType":"uint32","name":"endAt_","type":"uint32"}],"name":"fork","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"},{"internalType":"uint32","name":"endAt_","type":"uint32"},{"internalType":"address","name":"commission_","type":"address"},{"internalType":"uint256","name":"commissionBPS_","type":"uint256"}],"name":"forkWithCommission","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account_","type":"address"}],"name":"getBalance","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"getLogbook","outputs":[{"components":[{"internalType":"uint32","name":"endAt","type":"uint32"},{"internalType":"uint32","name":"logCount","type":"uint32"},{"internalType":"uint32","name":"transferCount","type":"uint32"},{"internalType":"uint160","name":"createdAt","type":"uint160"},{"internalType":"uint256","name":"parent","type":"uint256"},{"internalType":"uint256","name":"forkPrice","type":"uint256"},{"internalType":"bytes32[]","name":"contentHashes","type":"bytes32[]"}],"internalType":"struct ILogbook.Book","name":"book","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"getLogs","outputs":[{"internalType":"bytes32[]","name":"contentHashes","type":"bytes32[]"},{"internalType":"address[]","name":"authors","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"logs","outputs":[{"internalType":"address","name":"author","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleMint","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"},{"internalType":"string","name":"content_","type":"string"}],"name":"publish","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"},{"internalType":"string","name":"description_","type":"string"}],"name":"setDescription","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"setForkPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"name":"setPublicSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"},{"internalType":"string","name":"title_","type":"string"}],"name":"setTitle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"turnOffPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"turnOnPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
600260085560a06040526105dc6080819052600c553480156200002157600080fd5b50604051620059f8380380620059f8833981016040819052620000449162000261565b8151829082906200005d906000906020850190620000ee565b50805162000073906001906020840190620000ee565b505050620000906200008a6200009860201b60201c565b6200009c565b505062000308565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620000fc90620002cb565b90600052602060002090601f0160209004810192826200012057600085556200016b565b82601f106200013b57805160ff19168380011785556200016b565b828001600101855582156200016b579182015b828111156200016b5782518255916020019190600101906200014e565b50620001799291506200017d565b5090565b5b808211156200017957600081556001016200017e565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001bc57600080fd5b81516001600160401b0380821115620001d957620001d962000194565b604051601f8301601f19908116603f0116810190828211818310171562000204576200020462000194565b816040528381526020925086838588010111156200022157600080fd5b600091505b8382101562000245578582018301518183018401529082019062000226565b83821115620002575760008385830101525b9695505050505050565b600080604083850312156200027557600080fd5b82516001600160401b03808211156200028d57600080fd5b6200029b86838701620001aa565b93506020850151915080821115620002b257600080fd5b50620002c185828601620001aa565b9150509250929050565b600181811c90821680620002e057607f821691505b602082108114156200030257634e487b7160e01b600052602260045260246000fd5b50919050565b6156e080620003186000396000f3fe60806040526004361061021a5760003560e01c806395d89b4111610123578063c87b56dd116100ab578063f14faf6f1161006f578063f14faf6f1461066b578063f2fde38b1461067e578063f463ae671461069e578063f8b2cb4f146106b3578063ffe23eab146106d357600080fd5b8063c87b56dd146105d4578063d2eb86ee146105f4578063e87704b7146105fc578063e985e9c51461060f578063f04652501461065857600080fd5b8063a22cb465116100f2578063a22cb46514610527578063a401a99314610547578063aad3ec9614610574578063ac9650d814610594578063b88d4fde146105b457600080fd5b806395d89b411461048a578063975c96ed1461049f5780639a02b653146104b25780639b6860c81461051157600080fd5b80633ccfd60b116101a657806370a082311161017557806370a08231146103f7578063715018a6146104175780637757ba871461042c578063791a25191461044c5780638da5cb5b1461046c57600080fd5b80633ccfd60b1461038257806342842e0e146103975780635102bc9d146103b75780636352211e146103d757600080fd5b8063095ea7b3116101ed578063095ea7b3146102d05780631124c05a146102f057806323b872dd1461031e5780632a6446ca1461033e57806333bc1c5c1461035e57600080fd5b806301ffc9a71461021f5780630560c7a81461025457806306fdde0314610276578063081812fc14610298575b600080fd5b34801561022b57600080fd5b5061023f61023a36600461357e565b6106e8565b60405190151581526020015b60405180910390f35b34801561026057600080fd5b5061027461026f36600461359b565b61073a565b005b34801561028257600080fd5b5061028b6108e9565b60405161024b919061366f565b3480156102a457600080fd5b506102b86102b3366004613682565b61097b565b6040516001600160a01b03909116815260200161024b565b3480156102dc57600080fd5b506102746102eb3660046136b7565b610a08565b3480156102fc57600080fd5b5061031061030b366004613682565b610b1e565b60405161024b9291906136e1565b34801561032a57600080fd5b50610274610339366004613765565b610ced565b34801561034a57600080fd5b5061027461035936600461359b565b610d1e565b34801561036a57600080fd5b5061037460085481565b60405190815260200161024b565b34801561038e57600080fd5b50610274610d85565b3480156103a357600080fd5b506102746103b2366004613765565b610e78565b3480156103c357600080fd5b506102746103d236600461359b565b610e93565b3480156103e357600080fd5b506102b86103f2366004613682565b610eec565b34801561040357600080fd5b506103746104123660046137a1565b610f63565b34801561042357600080fd5b50610274610fea565b34801561043857600080fd5b506102746104473660046137bc565b611020565b34801561045857600080fd5b50610274610467366004613682565b61109c565b34801561047857600080fd5b506006546001600160a01b03166102b8565b34801561049657600080fd5b5061028b6110cb565b6103746104ad3660046137f2565b6110da565b3480156104be57600080fd5b506104f26104cd366004613682565b600a60205260009081526040902080546001909101546001600160a01b039091169082565b604080516001600160a01b03909316835260208301919091520161024b565b34801561051d57600080fd5b5061037460095481565b34801561053357600080fd5b50610274610542366004613836565b611166565b34801561055357600080fd5b50610567610562366004613682565b611175565b60405161024b9190613872565b34801561058057600080fd5b5061027461058f3660046136b7565b611244565b6105a76105a2366004613916565b6112e5565b60405161024b919061398b565b3480156105c057600080fd5b506102746105cf366004613a03565b611400565b3480156105e057600080fd5b5061028b6105ef366004613682565b611438565b61037461164c565b61037461060a366004613adf565b611727565b34801561061b57600080fd5b5061023f61062a366004613b0b565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b610274610666366004613b35565b61176b565b610274610679366004613682565b6118f3565b34801561068a57600080fd5b506102746106993660046137a1565b611a56565b3480156106aa57600080fd5b50610274611af1565b3480156106bf57600080fd5b506103746106ce3660046137a1565b611b22565b3480156106df57600080fd5b50610274611b5e565b60006001600160e01b031982166380ac58cd60e01b148061071957506001600160e01b03198216635b5e139f60e01b145b8061073457506301ffc9a760e01b6001600160e01b03198316145b92915050565b826107453382611b8f565b610761576040516282b42960e81b815260040160405180910390fd5b60008383604051602001610776929190613b5a565b60408051601f1981840301815282825280516020918201206000818152600a835283902084840190935282546001600160a01b0316808552600190930154918401919091529250610847576040805180820182523380825260208083018a81526000878152600a90925290849020925183546001600160a01b0319166001600160a01b039091161783555160019092019190915590518391907ffbdfab4f220bab7a483ff50f4252845fc2490bfb6dc26bd0d6c3a44bb088e6139061083e9089908990613b6a565b60405180910390a35b6000868152600b602052604090208054600160201b900463ffffffff1690600461087083613baf565b825463ffffffff9182166101009390930a9283029190920219909116179055506000868152600b60209081526040808320600301805460018101825590845291832090910184905551839188917f6266f2b0183e6ca70ef95168b6adc76897eb8bfe9b52b8c9b8e1a83b8f7c94689190a3505050505050565b6060600080546108f890613bd3565b80601f016020809104026020016040519081016040528092919081815260200182805461092490613bd3565b80156109715780601f1061094657610100808354040283529160200191610971565b820191906000526020600020905b81548152906001019060200180831161095457829003601f168201915b5050505050905090565b600061098682611c79565b6109ec5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610a1382610eec565b9050806001600160a01b0316836001600160a01b03161415610a815760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016109e3565b336001600160a01b0382161480610a9d5750610a9d813361062a565b610b0f5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016109e3565b610b198383611c96565b505050565b6000818152600b60209081526040808320815160e081018352815463ffffffff8082168352600160201b8204811683870152600160401b82041682850152600160601b90046001600160a01b031660608083019190915260018301546080830152600283015460a083015260038301805485518188028101880190965280865291968796909593949360c0860193909291830182828015610bde57602002820191906000526020600020905b815481526020019060010190808311610bca575b505050919092525050506020810151909150610bf985611d04565b93508063ffffffff1667ffffffffffffffff811115610c1a57610c1a6139ed565b604051908082528060200260200182016040528015610c43578160200160208202803683370190505b50925060005b8163ffffffff168163ffffffff161015610ce5576000858263ffffffff1681518110610c7757610c77613c0e565b6020908102919091018101516000818152600a90925260409091205486519192506001600160a01b031690869063ffffffff8516908110610cba57610cba613c0e565b6001600160a01b03909216602092830291909101909101525080610cdd81613baf565b915050610c49565b505050915091565b610cf73382611b8f565b610d135760405162461bcd60e51b81526004016109e390613c24565b610b198383836120fd565b82610d293382611b8f565b610d45576040516282b42960e81b815260040160405180910390fd5b837f9fb9371bd6790dc2e5335f73b2bbfd59db3e06ae2497b48bd8b764efc1508d418484604051610d77929190613b6a565b60405180910390a250505050565b6000610d9033611b22565b905080610db057604051631f2a200560e01b815260040160405180910390fd5b80471015610dda5760405163cf47918160e01b8152476004820152602481018290526044016109e3565b33600081815260076020526040808220600190555190919083908381818185875af1925050503d8060008114610e2c576040519150601f19603f3d011682016040523d82523d6000602084013e610e31565b606091505b5050905080610e3f57600080fd5b60405182815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649060200160405180910390a25050565b610b1983838360405180602001604052806000815250611400565b82610e9e3382611b8f565b610eba576040516282b42960e81b815260040160405180910390fd5b837fabc603ff5dec64646d9c0d9ba54a2329839d1b7d66929301aff79f363d9fcfab8484604051610d77929190613b6a565b6000818152600260205260408120546001600160a01b0316806107345760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016109e3565b60006001600160a01b038216610fce5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016109e3565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146110145760405162461bcd60e51b81526004016109e390613c75565b61101e600061229f565b565b8161102b3382611b8f565b611047576040516282b42960e81b815260040160405180910390fd5b6000838152600b6020526040908190206002018390555183907f9aa6bd5de426f8395804f87597e5edfd3678b619355f6254f876c02574a882cf9061108f9085815260200190565b60405180910390a2505050565b6006546001600160a01b031633146110c65760405162461bcd60e51b81526004016109e390613c75565b600955565b6060600180546108f890613bd3565b60006110ea611f40612710613caa565b821115611123576000611101611f40612710613caa565b6040516336e3948960e21b8152600481019290925260248201526044016109e3565b60008061113087876122f1565b93509150829050341561115c57600061114888610eec565b905061115a8884833460008b8b61262b565b505b5050949350505050565b61117133838361293a565b5050565b61117d613489565b6000828152600b6020908152604091829020825160e081018452815463ffffffff8082168352600160201b8204811683860152600160401b82041682860152600160601b90046001600160a01b0316606082015260018201546080820152600282015460a08201526003820180548551818602810186019096528086529194929360c0860193929083018282801561123457602002820191906000526020600020905b815481526020019060010190808311611220575b5050505050815250509050919050565b6006546001600160a01b0316331461126e5760405162461bcd60e51b81526004016109e390613c75565b600181108061127e57506105dc81115b156112a75760405163168a450960e21b8152600160048201526105dc60248201526044016109e3565b6112b18282612a01565b6000908152600b6020526040902080546bffffffffffffffffffffffff16600160601b426001600160a01b03160217905550565b60608167ffffffffffffffff811115611300576113006139ed565b60405190808252806020026020018201604052801561133357816020015b606081526020019060019003908161131e5790505b50905060005b828110156113f9576000803086868581811061135757611357613c0e565b90506020028101906113699190613cc1565b604051611377929190613b5a565b600060405180830381855af49150503d80600081146113b2576040519150601f19603f3d011682016040523d82523d6000602084013e6113b7565b606091505b5091509150816113c657600080fd5b808484815181106113d9576113d9613c0e565b6020026020010181905250505080806113f190613d0f565b915050611339565b5092915050565b61140a3383611b8f565b6114265760405162461bcd60e51b81526004016109e390613c24565b61143284848484612a1b565b50505050565b606061144382611c79565b61145f57604051626f708760e21b815260040160405180910390fd5b6000828152600b60209081526040808320815160e081018352815463ffffffff8082168352600160201b8204811683870152600160401b82041682850152600160601b90046001600160a01b0316606082015260018201546080820152600282015460a08201526003820180548451818702810187019095528085529194929360c086019390929083018282801561151657602002820191906000526020600020905b815481526020019060010190808311611502575b505050919092525050506020810151909150600061153385612a4e565b6040516020016115439190613d46565b60408051601f198184030181526060830190915260338083529092506000919061567860208301399050600061157e8463ffffffff16612a4e565b60405160200161158e9190613d77565b60408051601f1981840301815260808301825263ffffffff8088168452888301511660208401526060808901516001600160a01b031692840192909252908201899052915060006115e66115e183612b4c565b612b9b565b90506000611618868686856040516020016116049493929190613dc8565b604051602081830303815290604052612b9b565b905060008160405160200161162d9190613ebf565b60408051601f198184030181529190529b9a5050505050505050505050565b60006001600854146116715760405163ac4d09c760e01b815260040160405180910390fd5b6009543410156116a157600954604051630da801c760e31b815234600482015260248101919091526044016109e3565b60006116b56006546001600160a01b031690565b90506000816001600160a01b03163460405160006040518083038185875af1925050503d8060008114611704576040519150601f19603f3d011682016040523d82523d6000602084013e611709565b606091505b505090508061171757600080fd5b61172033612cef565b9250505090565b600080600061173685856122f1565b93509150829050341561176357600061174e86610eec565b905061176186848334600080600061262b565b505b505092915050565b6000341161178c57604051631f2a200560e01b815260040160405180910390fd5b61179583611c79565b6117b157604051626f708760e21b815260040160405180910390fd5b6117bf611f40612710613caa565b8111156117d6576000611101611f40612710613caa565b6000838152600b60209081526040808320815160e081018352815463ffffffff8082168352600160201b8204811683870152600160401b82041682850152600160601b90046001600160a01b0316606082015260018201546080820152600282015460a08201526003820180548451818702810187019095528085529194929360c086019390929083018282801561188d57602002820191906000526020600020905b815481526020019060010190808311611879575b505050505081525050905060006118a385610eec565b90506118b5858383346001898961262b565b604051348152339086907f48def02da8c59b50861e25bab759a8a0c0de6fab6448ef85f32ce59397947d809060200160405180910390a35050505050565b6000341161191457604051631f2a200560e01b815260040160405180910390fd5b61191d81611c79565b61193957604051626f708760e21b815260040160405180910390fd5b6000818152600b60209081526040808320815160e081018352815463ffffffff8082168352600160201b8204811683870152600160401b82041682850152600160601b90046001600160a01b0316606082015260018201546080820152600282015460a08201526003820180548451818702810187019095528085529194929360c08601939092908301828280156119f057602002820191906000526020600020905b8154815260200190600101908083116119dc575b50505050508152505090506000611a0683610eec565b9050611a1983838334600160008061262b565b604051348152339084907f48def02da8c59b50861e25bab759a8a0c0de6fab6448ef85f32ce59397947d80906020015b60405180910390a3505050565b6006546001600160a01b03163314611a805760405162461bcd60e51b81526004016109e390613c75565b6001600160a01b038116611ae55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109e3565b611aee8161229f565b50565b6006546001600160a01b03163314611b1b5760405162461bcd60e51b81526004016109e390613c75565b6001600855565b6001600160a01b0381166000908152600760205260408120546001811115611b5457611b4f600182613caa565b611b57565b60005b9392505050565b6006546001600160a01b03163314611b885760405162461bcd60e51b81526004016109e390613c75565b6002600855565b6000611b9a82611c79565b611bfb5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016109e3565b6000611c0683610eec565b9050806001600160a01b0316846001600160a01b03161480611c415750836001600160a01b0316611c368461097b565b6001600160a01b0316145b80611c7157506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611ccb82610eec565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600b60209081526040808320815160e081018352815463ffffffff8082168352600160201b8204811683870152600160401b82041682850152600160601b90046001600160a01b031660608083019190915260018301546080830152600283015460a0830152600383018054855181880281018801909652808652919695929460c0860193909290830182828015611dc057602002820191906000526020600020905b815481526020019060010190808311611dac575b5050505050815250509050806020015163ffffffff1667ffffffffffffffff811115611dee57611dee6139ed565b604051908082528060200260200182016040528015611e17578160200160208202803683370190505b506080828101516000908152600b60209081526040808320815160e081018352815463ffffffff8082168352600160201b8204811683870152600160401b82041682850152600160601b90046001600160a01b03166060820152600182015495810195909552600281015460a08601526003810180548351818602810186019094528084529698509395869594919360c0860193929190830182828015611edd57602002820191906000526020600020905b815481526020019060010190808311611ec9575b50505091909252505084516080860151929350916000915015611f01576001611f04565b60005b90505b80156120775760c083015160005b8363ffffffff168163ffffffff161015611f8c57818163ffffffff1681518110611f4157611f41613c0e565b6020026020010151888763ffffffff1681518110611f6157611f61613c0e565b602090810291909101015285611f7681613baf565b9650508080611f8490613baf565b915050611f15565b506080840151611f9f5760009150612071565b83516080808601516000908152600b6020908152604091829020825160e081018452815463ffffffff8082168352600160201b8204811683860152600160401b82041682860152600160601b90046001600160a01b03166060820152600182015494810194909452600281015460a08501526003810180548451818502810185019095528085529598509394909360c08601939290919083018282801561206557602002820191906000526020600020905b815481526020019060010190808311612051575b50505050508152505093505b50611f07565b60c085015160005b81518163ffffffff1610156120f157818163ffffffff16815181106120a6576120a6613c0e565b6020026020010151888763ffffffff16815181106120c6576120c6613c0e565b6020908102919091010152856120db81613baf565b96505080806120e990613baf565b91505061207f565b50505050505050919050565b826001600160a01b031661211082610eec565b6001600160a01b0316146121745760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016109e3565b6001600160a01b0382166121d65760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016109e3565b6121e1600082611c96565b6001600160a01b038316600090815260036020526040812080546001929061220a908490613caa565b90915550506001600160a01b0382166000908152600360205260408120805460019290612238908490613f04565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4610b19838383612d43565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6122f9613489565b600061230484611c79565b61232057604051626f708760e21b815260040160405180910390fd5b6000848152600b60209081526040808320815160e081018352815463ffffffff8082168352600160201b8204811683870152600160401b82041682850152600160601b90046001600160a01b0316606082015260018201546080820152600282015460a08201526003820180548451818702810187019095528085529194929360c08601939092908301828280156123d757602002820191906000526020600020905b8154815260200190600101908083116123c3575b5050509190925250505060c08101515160208201519192509063ffffffff81161580612407575063ffffffff8616155b8061241d57508563ffffffff168263ffffffff16105b15612443576040516355f9748560e11b815263ffffffff831660048201526024016109e3565b8260a001513410156124775760a0830151604051630da801c760e31b815234600482015260248101919091526044016109e3565b61248033612cef565b60408051600081526101008101825263ffffffff89166020820190815292965091908201886124af8686613f1c565b6124b99190613f41565b63ffffffff168152602001600163ffffffff168152602001426001600160a01b031681526020018981526020016000815260200182815250955085600b600087815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160086101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001600c6101000a8154816001600160a01b0302191690836001600160a01b031602179055506080820151816001015560a0820151816002015560c08201518160030190805190602001906125d99291906134e1565b50506040805163ffffffff8a16815234602082015233925087918b917f80fa51d23f3bf5aa5a940869244b346c3df1ad758400fd8181237970f88999d0910160405180910390a4505050509250929050565b6020860151600061263b89611d04565b905061266160405180606001604052806000815260200160008152602001600081525090565b60006001600160a01b0386161580612677575084155b9050806126985761271061268b868a613f69565b6126959190613f9e565b82525b60008463ffffffff16116126bc5781516126b29089613caa565b602083015261270a565b6127106126cb611f408a613f69565b6126d59190613f9e565b60208301819052825163ffffffff8616916126f0908b613caa565b6126fa9190613caa565b6127049190613f9e565b60408301525b8160200151600760008b6001600160a01b03166001600160a01b0316815260200190815260200160002060008282546127439190613f04565b92505081905550886001600160a01b0316336001600160a01b03168c7fdbcecf0e7569a188428390e7b80fc6d093710bf642ae4f6b78fe2d74d7fd68be85602001518b604051612794929190613fb2565b60405180910390a48061281b5781516001600160a01b038716600090815260076020526040812080549091906127cb908490613f04565b909155505081516040516001600160a01b0388169133918e917fdbcecf0e7569a188428390e7b80fc6d093710bf642ae4f6b78fe2d74d7fd68be9161281291908d90613fb2565b60405180910390a45b63ffffffff84161561292d5760005b8463ffffffff168163ffffffff16101561292b576000600a6000868463ffffffff168151811061285c5761285c613c0e565b602090810291909101810151825281810192909252604090810160009081208251808401845281546001600160a01b031680825260019092015481860152888401519183526007909452918120805493945091926128bb908490613f04565b9250508190555080600001516001600160a01b0316336001600160a01b03168e7fdbcecf0e7569a188428390e7b80fc6d093710bf642ae4f6b78fe2d74d7fd68be87604001518d604051612910929190613fb2565b60405180910390a4508061292381613baf565b91505061282a565b505b5050505050505050505050565b816001600160a01b0316836001600160a01b0316141561299c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109e3565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319101611a49565b611171828260405180602001604052806000815250612dc8565b612a268484846120fd565b612a3284848484612dfb565b6114325760405162461bcd60e51b81526004016109e390613fe4565b606081612a725750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612a9c5780612a8681613d0f565b9150612a959050600a83613f9e565b9150612a76565b60008167ffffffffffffffff811115612ab757612ab76139ed565b6040519080825280601f01601f191660200182016040528015612ae1576020820181803683370190505b5090505b8415611c7157612af6600183613caa565b9150612b03600a86614036565b612b0e906030613f04565b60f81b818381518110612b2357612b23613c0e565b60200101906001600160f81b031916908160001a905350612b45600a86613f9e565b9450612ae5565b6060612b5782612ef9565b612b6083612f7f565b612b6984613060565b612b7285613125565b604051602001612b85949392919061404a565b6040516020818303038152906040529050919050565b6060815160001415612bbb57505060408051602081019091526000815290565b60006040518060600160405280604081526020016156386040913990506000600384516002612bea9190613f04565b612bf49190613f9e565b612bff906004613f69565b67ffffffffffffffff811115612c1757612c176139ed565b6040519080825280601f01601f191660200182016040528015612c41576020820181803683370190505b509050600182016020820185865187015b80821015612cad576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845350600183019250612c52565b5050600386510660018114612cc95760028114612cdc57612ce4565b603d6001830353603d6002830353612ce4565b603d60018303535b509195945050505050565b6000612cff600c80546001019055565b50600c54612d0d8282612a01565b6000818152600b6020526040902080546bffffffffffffffffffffffff16600160601b426001600160a01b031602179055919050565b6000818152600b602052604090208054600160401b900463ffffffff16906008612d6c83613baf565b825463ffffffff9182166101009390930a9283029190920219909116179055506001600160a01b038216600090815260076020526040902054610b1957506001600160a01b031660009081526007602052604090206001905550565b612dd28383613337565b612ddf6000848484612dfb565b610b195760405162461bcd60e51b81526004016109e390613fe4565b60006001600160a01b0384163b15612eee57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612e3f903390899088908890600401614143565b6020604051808303816000875af1925050508015612e7a575060408051601f3d908101601f19168201909252612e7791810190614180565b60015b612ed4573d808015612ea8576040519150601f19603f3d011682016040523d82523d6000602084013e612ead565b606091505b508051612ecc5760405162461bcd60e51b81526004016109e390613fe4565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611c71565b506001949350505050565b60606000600a836000015163ffffffff1610612f345760405180604001604052806007815260200166119a189a1819a360c91b815250612f55565b604051806040016040528060078152602001662346334631454160c81b8152505b905080604051602001612f68919061419d565b604051602081830303815290604052915050919050565b60606000612fe2610100612f9e856000015163ffffffff166001613472565b856060015186604001516001600160a01b0316612fbb9190613f69565b612fc59190613f69565b612fd090600a613f69565b612fda9190614036565b60ff16612a4e565b613017610100856020015163ffffffff16866040015161300291906141ef565b61300d9060506141ef565b612fda919061421e565b61302c6101008660600151612fda9190614036565b60405160200161303e93929190614244565b604051602081830303815290604052905080604051602001612f6891906142bc565b606060006130b161010061307f856000015163ffffffff166001613472565b856060015186604001516001600160a01b031661309c9190613f69565b6130a69190613f69565b612fd0906014613f69565b6130dc610100856020015163ffffffff1686604001516130d191906141ef565b61300d9060286141ef565b6130f16101008660600151612fda9190614036565b60405160200161310393929190614244565b604051602081830303815290604052905080604051602001612f68919061497f565b60606000600a836000015163ffffffff16106131605760405180604001604052806007815260200166119a189a1819a360c91b815250613181565b604051806040016040528060078152602001662346334631454160c81b8152505b90506000600a846000015163ffffffff16106131b9576040518060400160405280600481526020016311b3333360e11b8152506131d7565b604051806040016040528060048152602001632333333360e01b8152505b90506131e161352c565b81826040516020016131f49291906151e8565b60408051808303601f190181529190528152845160009061321a9063ffffffff16612a4e565b6132396001886020015161322e9190613f1c565b63ffffffff16612a4e565b6132468860600151612a4e565b60405160200161325893929190615324565b60408051601f198184030181529190528051909150606060005b828110156132af578160405160200161328b91906153a7565b604051602081830303815290604052915080806132a790613d0f565b915050613272565b508585826040516020016132c5939291906153cc565b60408051808303601f19018152918152602080870192909252516132ed9187918691016154f5565b60408051808303601f190181529181528581018290528551602080880151925161331b9492939291016155f4565b6040516020818303038152906040529650505050505050919050565b6001600160a01b03821661338d5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109e3565b61339681611c79565b156133e35760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109e3565b6001600160a01b038216600090815260036020526040812080546001929061340c908490613f04565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461117160008383612d43565b6000818310156134825781611b57565b5090919050565b6040518060e00160405280600063ffffffff168152602001600063ffffffff168152602001600063ffffffff16815260200160006001600160a01b031681526020016000815260200160008152602001606081525090565b82805482825590600052602060002090810192821561351c579160200282015b8281111561351c578251825591602001919060010190613501565b50613528929150613553565b5090565b60405180606001604052806003905b606081526020019060019003908161353b5790505090565b5b808211156135285760008155600101613554565b6001600160e01b031981168114611aee57600080fd5b60006020828403121561359057600080fd5b8135611b5781613568565b6000806000604084860312156135b057600080fd5b83359250602084013567ffffffffffffffff808211156135cf57600080fd5b818601915086601f8301126135e357600080fd5b8135818111156135f257600080fd5b87602082850101111561360457600080fd5b6020830194508093505050509250925092565b60005b8381101561363257818101518382015260200161361a565b838111156114325750506000910152565b6000815180845261365b816020860160208601613617565b601f01601f19169290920160200192915050565b602081526000611b576020830184613643565b60006020828403121561369457600080fd5b5035919050565b80356001600160a01b03811681146136b257600080fd5b919050565b600080604083850312156136ca57600080fd5b6136d38361369b565b946020939093013593505050565b604080825283519082018190526000906020906060840190828701845b8281101561371a578151845292840192908401906001016136fe565b5050508381038285015284518082528583019183019060005b818110156137585783516001600160a01b031683529284019291840191600101613733565b5090979650505050505050565b60008060006060848603121561377a57600080fd5b6137838461369b565b92506137916020850161369b565b9150604084013590509250925092565b6000602082840312156137b357600080fd5b611b578261369b565b600080604083850312156137cf57600080fd5b50508035926020909101359150565b803563ffffffff811681146136b257600080fd5b6000806000806080858703121561380857600080fd5b84359350613818602086016137de565b92506138266040860161369b565b9396929550929360600135925050565b6000806040838503121561384957600080fd5b6138528361369b565b91506020830135801515811461386757600080fd5b809150509250929050565b60006020808352610100830163ffffffff808651168386015280838701511660408601528060408701511660608601525060018060a01b036060860151166080850152608085015160a085015260a085015160c085015260c085015160e080860152818151808452610120870191508483019350600092505b8083101561390b57835182529284019260019290920191908401906138eb565b509695505050505050565b6000806020838503121561392957600080fd5b823567ffffffffffffffff8082111561394157600080fd5b818501915085601f83011261395557600080fd5b81358181111561396457600080fd5b8660208260051b850101111561397957600080fd5b60209290920196919550909350505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156139e057603f198886030184526139ce858351613643565b945092850192908501906001016139b2565b5092979650505050505050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215613a1957600080fd5b613a228561369b565b9350613a306020860161369b565b925060408501359150606085013567ffffffffffffffff80821115613a5457600080fd5b818701915087601f830112613a6857600080fd5b813581811115613a7a57613a7a6139ed565b604051601f8201601f19908116603f01168101908382118183101715613aa257613aa26139ed565b816040528281528a6020848701011115613abb57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215613af257600080fd5b82359150613b02602084016137de565b90509250929050565b60008060408385031215613b1e57600080fd5b613b278361369b565b9150613b026020840161369b565b600080600060608486031215613b4a57600080fd5b833592506137916020850161369b565b8183823760009101908152919050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b600052601160045260246000fd5b600063ffffffff80831681811415613bc957613bc9613b99565b6001019392505050565b600181811c90821680613be757607f821691505b60208210811415613c0857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600082821015613cbc57613cbc613b99565b500390565b6000808335601e19843603018112613cd857600080fd5b83018035915067ffffffffffffffff821115613cf357600080fd5b602001915036819003821315613d0857600080fd5b9250929050565b6000600019821415613d2357613d23613b99565b5060010190565b60008151613d3c818560208601613617565b9290920192915050565b684c6f67626f6f6b202360b81b815260008251613d6a816009850160208701613617565b9190910160090192915050565b7f7b2274726169745f74797065223a20224c6f6773222c2276616c7565223a2200815260008251613daf81601f850160208701613617565b61227d60f01b601f939091019283015250602101919050565b693d913730b6b2911d101160b11b81528451600090613dee81600a850160208a01613617565b72111610113232b9b1b934b83a34b7b7111d101160691b600a918401918201528551613e2181601d840160208a01613617565b71222c202261747472696275746573223a205b60701b601d92909101918201528451613e5481602f840160208901613617565b7f5d2c2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b602f92909101918201526618985cd94d8d0b60ca1b604f8201528351613ea2816056840160208801613617565b61227d60f01b605692909101918201526058019695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251613ef781601d850160208701613617565b91909101601d0192915050565b60008219821115613f1757613f17613b99565b500190565b600063ffffffff83811690831681811015613f3957613f39613b99565b039392505050565b600063ffffffff808316818516808303821115613f6057613f60613b99565b01949350505050565b6000816000190483118215151615613f8357613f83613b99565b500290565b634e487b7160e01b600052601260045260246000fd5b600082613fad57613fad613f88565b500490565b8281526040810160028310613fd757634e487b7160e01b600052602160045260246000fd5b8260208301529392505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60008261404557614045613f88565b500690565b7f3c7376672077696474683d2238303022206865696768743d223830302220786d81527f6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f7376672260208201527f3e3c672066696c6c3d226e6f6e65222066696c6c2d72756c653d226576656e6f6040820152633232111f60e11b6060820152600085516140db816064850160208a01613617565b8551908301906140f2816064840160208a01613617565b8551910190614108816064840160208901613617565b845191019061411e816064840160208801613617565b691e17b39f1e17b9bb339f60b11b60649290910191820152606e019695505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061417690830184613643565b9695505050505050565b60006020828403121561419257600080fd5b8151611b5781613568565b7f3c7061746820643d224d302030683830307638303048307a222066696c6c3d228152600082516141d5816020850160208701613617565b6211179f60e91b6020939091019283015250602301919050565b60006001600160a01b038281168482168115158284048211161561421557614215613b99565b02949350505050565b60006001600160a01b038381168061423857614238613f88565b92169190910692915050565b630e4cec4560e31b815260008451614263816004850160208901613617565b8083019050600b60fa1b8060048301528551614286816005850160208a01613617565b600592019182015283516142a1816006840160208801613617565b602960f81b6006929091019182015260070195945050505050565b7f3c7061746820643d224d3637302e37203533352e37613330203330203020302081527f31203330203330563634386133302033302030203020312d3330203330682d3760208201527f396133302033302030203020312d33302d3330762d342e35613330203330203060408201527f203020312033302d33306831382e316133302033302030203020302033302d3360608201527f30762d31372e386133302033302030203020312033302d333068315a6d2d333860808201527f362e372e3461333020333020302030203120333020333056363438613330203360a08201527f302030203020312d3330203330682d316133302033302030203020312d33302d60c08201527f3330762d38326133302033302030203020312033302d33305a6d2d313530203760e08201527f372e3661333020333020302030203120333020333076332e36613330203330206101008201527f30203020312d3330203330682d352e386133302033302030203020312d33302d6101208201527f3330762d332e356133302033302030203020312033302d33305a4d35313920356101408201527f333661333020333020302030203120333020333076352e3461333020333020306101608201527f203020312d3330203330682d38312e386133302033302030203020312d33302d6101808201527f3330762d352e346133302033302030203020312033302d33305a6d2d322e352d6101a08201527f3135342e366133302033302030203020312033302033307638326133302033306101c08201527f2030203020312d3330203330682d2e396133302033302030203020312d33302d6101e08201527f3330762d38326133302033302030203020312033302d33305a6d2d37362d37366102008201527f2e376133302033302030203020312033302033307638326133302033302030206102208201527f3020312d3330203330682d38322e316133302033302030203020312d33302d336102408201527f30762d322e326133302033302030203020312033302d33306831372e376133306102608201527f2033302030203020302033302d3330762d31392e3861333020333020302030206102808201527f312033302d33305a4d32313020333831613330203330203020302031203330206102a08201527f333076332e366133302033302030203020312d3330203330682d352e386133306102c08201527f2033302030203020312d33302d333056343131613330203330203020302031206102e08201527f33302d333068352e385a6d37342e312d3135342e3761333020333020302030206103008201527f31203330203330563237346133302033302030203020302033302033306831386103208201527f2e3261333020333020302030203120333020333076342e3561333020333020306103408201527f203020312d3330203330682d37396133302033302030203020312d33302d333061036082018190527f762d38322e336133302033302030203020312033302d33305a6d3338362e36206103808301527f306133302033302030203020312033302033307638322e3361333020333020306103a08301526103c08201527f563333346133302033302030203020312033302d33306831382e3161333020336103e08201527f302030203020302033302d3330762d31372e38613330203330203020302031206104008201527f33302d333068315a4d3230372e322031343561333020333020302030203120336104208201527f302033307638322e336133302033302030203020312d3330203330682d2e39616104408201527f33302033302030203020312d33302d3330762d31372e386133302033302030206104608201527f3020302d33302d3330682d31382e316133302033302030203020312d33302d336104808201527f30563137356133302033302030203020312033302d33305a6d3338372e322e336104a08201527f61333020333020302030203120333020333076383261333020333020302030206104c08201527f312d3330203330682d2e396133302033302030203020312d33302d3330762d386104e08201527f326133302033302030203020312033302d33305a6d2d3135362e3520306133306105008201527f20333020302030203120333020333076372e326133302033302030203020312d6105208201527f3330203330682d2e396133302033302030203020312d33302d3330762d372e326105408201527f6133302033302030203020312033302d33305a222066696c6c2d6f70616369746105608201526c3c9e91171a91103334b6361e9160991b6105808201526000611b5761497061058d840185613d2a565b6211179f60e91b815260030190565b7f3c7061746820643d224d3335362e38203533352e37613330203330203020302081527f312033302033307631372e38613330203330203020302030203330203330483460208201527f333561333020333020302030203120333020333076342e35613330203330203060408201527f203020312d3330203330682d37396133302033302030203020312d33302d333060608201527f762d38322e336133302033302030203020312033302d33305a6d2d3134392e3860808201527f203061333020333020302030203120333020333056363438613330203330203060a08201527f203020312d3330203330682d2e396133302033302030203020312d33302d333060c08201527f762d31372e386133302033302030203020302d33302d3330483132386133302060e08201527f33302030203020312d33302d3330762d342e35613330203330203020302031206101008201527f33302d33305a6d3331322e3120373861333020333020302030203120333020336101208201527f3076332e366133302033302030203020312d3330203330682d352e38613330206101408201527f33302030203020312d33302d3330762d332e35613330203330203020302031206101608201527f33302d33305a6d37382d37372e336133302033302030203020312033302033306101808201527f76332e366133302033302030203020312d3330203330682d352e3961333020336101a08201527f302030203020312d33302d3330762d332e3661333020333020302030203120336101c08201527f302d333068352e395a6d2d342e352d31353461333020333020302030203120336101e08201527f30203330563433306133302033302030203020302033302033306831382e31616102008201527f333020333020302030203120333020333076342e3561333020333020302030206102208201527f312d3330203330682d37396133302033302030203020312d33302d3330762d386102408201527f322e336133302033302030203020312033302d33305a6d2d3330382e352030616102608201527f33302033302030203020312033302033305634333061333020333020302030206102808201527f302033302033306831382e3261333020333020302030203120333020333076346102a08201527f2e356133302033302030203020312d3330203330682d373961333020333020306102c08201527f203020312d33302d3330762d38322e336133302033302030203020312033302d6102e08201527f33305a4d313239203338316133302033302030203020312033302033307631376103008201527f2e386133302033302030203020302033302033304832303761333020333020306103208201527f2030203120333020333076342e356133302033302030203020312d33302033306103408201527f682d37396133302033302030203020312d33302d3330563431316133302033306103608201527f2030203020312033302d33305a6d3331312e36203738613330203330203020306103808201527f203120333020333076342e336133302033302030203020312d3330203330682d6103a08201527f2e396133302033302030203020312d33302d33305634383961333020333020306103c08201527f203020312033302d33305a6d3233302d373761333020333020302030203120336103e08201527f3020333076372e326133302033302030203020312d3330203330682d372e32616104008201527f33302033302030203020312d33302d33305634313261333020333020302030206104208201527f312033302d33305a6d2d3135342d3738613330203330203020302031203330206104408201527f333076372e326133302033302030203020312d3330203330682d2e39613330206104608201527f33302030203020312d33302d33305633333461333020333020302030203120336104808201527f302d33305a4d3230392e382033303761333020333020302030203120333020336104a08201527f3076316133302033302030203020312d333020333048313238613330203330206104c08201527f30203020312d33302d3330762d316133302033302030203020312033302d33306104e08201527f5a4d3336322e33203134356133302033302030203020312033302033307638326105008201527f2e336133302033302030203020312d3330203330682d316133302033302030206105208201527f3020312d33302d3330762d31372e386133302033302030203020302d33302d336105408201527f30682d31386133302033302030203020312d33302d33305631373561333020336105608201527f302030203020312033302d33305a6d3135362e382e33613330203330203020306105808201527f20312033302033307638326133302033302030203020312d33302033304834336105a08201527f376133302033302030203020312d33302d3330563235356133302033302030206105c08201527f3020312033302d33306831372e376133302033302030203020302033302d33306105e08201527f762d31392e386133302033302030203020312033302d33305a6d2d33383520386106008201527f31613330203330203020302031203330203330763161333020333020302030206106208201527f312d3330203330682d366133302033302030203020312d33302d3330762d31616106408201527f33302033302030203020312033302d333068365a6d3533362e332d38316133306106608201527f20333020302030203120333020333076372e326133302033302030203020312d6106808201527f3330203330682d2e396133302033302030203020312d33302d3330762d372e326106a08201527f6133302033302030203020312033302d33305a222066696c6c3d2200000000006106c08201526000611b576149706106db840185613d2a565b6b1e3a32bc3a103334b6361e9160a11b8152825160009061521081600c850160208801613617565b7f2220666f6e742d66616d696c793d22526f626f746f2c205461686f6d612d426f600c918401918201527f6c642c205461686f6d612220666f6e742d73697a653d2234382220666f6e742d602c8201527f7765696768743d22626f6c64223e3c747370616e20783d2239392e332220793d604c8201527f223130352e34223e4c4f47424f4f4b3c2f747370616e3e3c2f746578743e0000606c8201526d1e3830ba341039ba3937b5b29e9160911b608a82015283516152d6816098840160208801613617565b7f22207374726f6b652d77696474683d22382220643d224d333837203838683331609892909101918201526e1a269c9c901b989c341b181911179f60891b60b882015260c701949350505050565b644c6f67732f60d81b815260008451615344816005850160208901613617565b6d202020205472616e73666572732f60901b6005918401918201528451615372816013840160208901613617565b662020202049442f60c81b60139290910191820152835161539a81601a840160208801613617565b01601a0195945050505050565b600082516153b9818460208701613617565b606760f81b920191825250600101919050565b6d1e3a32bc3a1039ba3937b5b29e9160911b815283516000906153f681600e850160208901613617565b7f22207374726f6b652d77696474683d2232302220666f6e742d66616d696c793d600e918401918201527f22526f626f746f2c205461686f6d612d426f6c642c205461686f6d612220666f602e8201527f6e742d73697a653d2231382220666f6e742d7765696768743d22626f6c642220604e820152653334b6361e9160d11b606e820152845161548e816074840160208901613617565b7f223e3c747370616e20783d2239382220793d223732342e32223e0000000000006074929091019182015283516154cc81608e840160208801613617565b6e1e17ba39b830b71f1e17ba32bc3a1f60891b608e9290910191820152609d0195945050505050565b6b1e3a32bc3a103334b6361e9160a11b8152825160009061551d81600c850160208801613617565b7f2220666f6e742d66616d696c793d22526f626f746f2c205461686f6d612d426f600c918401918201527f6c642c205461686f6d612220666f6e742d73697a653d2231382220666f6e742d602c8201527f7765696768743d22626f6c642220786d6c3a73706163653d2270726573657276604c8201527f65223e3c747370616e20783d2239382220793d223732342e32223e0000000000606c82015283516155cc816087840160208801613617565b6e1e17ba39b830b71f1e17ba32bc3a1f60891b60879290910191820152609601949350505050565b60008451615606818460208901613617565b84519083019061561a818360208901613617565b845191019061562d818360208801613617565b019594505050505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f4120626f6f6b2074686174207265636f726473206f776e65727327206a6f75726e657920696e204d617474657276657273652ea2646970667358221220f39771466d98f9b5e5ba1f288c30741db370ce790e2f67b29c57e32515df54a364736f6c634300080b00330000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000074c6f67626f6f6b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054c4f475253000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061021a5760003560e01c806395d89b4111610123578063c87b56dd116100ab578063f14faf6f1161006f578063f14faf6f1461066b578063f2fde38b1461067e578063f463ae671461069e578063f8b2cb4f146106b3578063ffe23eab146106d357600080fd5b8063c87b56dd146105d4578063d2eb86ee146105f4578063e87704b7146105fc578063e985e9c51461060f578063f04652501461065857600080fd5b8063a22cb465116100f2578063a22cb46514610527578063a401a99314610547578063aad3ec9614610574578063ac9650d814610594578063b88d4fde146105b457600080fd5b806395d89b411461048a578063975c96ed1461049f5780639a02b653146104b25780639b6860c81461051157600080fd5b80633ccfd60b116101a657806370a082311161017557806370a08231146103f7578063715018a6146104175780637757ba871461042c578063791a25191461044c5780638da5cb5b1461046c57600080fd5b80633ccfd60b1461038257806342842e0e146103975780635102bc9d146103b75780636352211e146103d757600080fd5b8063095ea7b3116101ed578063095ea7b3146102d05780631124c05a146102f057806323b872dd1461031e5780632a6446ca1461033e57806333bc1c5c1461035e57600080fd5b806301ffc9a71461021f5780630560c7a81461025457806306fdde0314610276578063081812fc14610298575b600080fd5b34801561022b57600080fd5b5061023f61023a36600461357e565b6106e8565b60405190151581526020015b60405180910390f35b34801561026057600080fd5b5061027461026f36600461359b565b61073a565b005b34801561028257600080fd5b5061028b6108e9565b60405161024b919061366f565b3480156102a457600080fd5b506102b86102b3366004613682565b61097b565b6040516001600160a01b03909116815260200161024b565b3480156102dc57600080fd5b506102746102eb3660046136b7565b610a08565b3480156102fc57600080fd5b5061031061030b366004613682565b610b1e565b60405161024b9291906136e1565b34801561032a57600080fd5b50610274610339366004613765565b610ced565b34801561034a57600080fd5b5061027461035936600461359b565b610d1e565b34801561036a57600080fd5b5061037460085481565b60405190815260200161024b565b34801561038e57600080fd5b50610274610d85565b3480156103a357600080fd5b506102746103b2366004613765565b610e78565b3480156103c357600080fd5b506102746103d236600461359b565b610e93565b3480156103e357600080fd5b506102b86103f2366004613682565b610eec565b34801561040357600080fd5b506103746104123660046137a1565b610f63565b34801561042357600080fd5b50610274610fea565b34801561043857600080fd5b506102746104473660046137bc565b611020565b34801561045857600080fd5b50610274610467366004613682565b61109c565b34801561047857600080fd5b506006546001600160a01b03166102b8565b34801561049657600080fd5b5061028b6110cb565b6103746104ad3660046137f2565b6110da565b3480156104be57600080fd5b506104f26104cd366004613682565b600a60205260009081526040902080546001909101546001600160a01b039091169082565b604080516001600160a01b03909316835260208301919091520161024b565b34801561051d57600080fd5b5061037460095481565b34801561053357600080fd5b50610274610542366004613836565b611166565b34801561055357600080fd5b50610567610562366004613682565b611175565b60405161024b9190613872565b34801561058057600080fd5b5061027461058f3660046136b7565b611244565b6105a76105a2366004613916565b6112e5565b60405161024b919061398b565b3480156105c057600080fd5b506102746105cf366004613a03565b611400565b3480156105e057600080fd5b5061028b6105ef366004613682565b611438565b61037461164c565b61037461060a366004613adf565b611727565b34801561061b57600080fd5b5061023f61062a366004613b0b565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b610274610666366004613b35565b61176b565b610274610679366004613682565b6118f3565b34801561068a57600080fd5b506102746106993660046137a1565b611a56565b3480156106aa57600080fd5b50610274611af1565b3480156106bf57600080fd5b506103746106ce3660046137a1565b611b22565b3480156106df57600080fd5b50610274611b5e565b60006001600160e01b031982166380ac58cd60e01b148061071957506001600160e01b03198216635b5e139f60e01b145b8061073457506301ffc9a760e01b6001600160e01b03198316145b92915050565b826107453382611b8f565b610761576040516282b42960e81b815260040160405180910390fd5b60008383604051602001610776929190613b5a565b60408051601f1981840301815282825280516020918201206000818152600a835283902084840190935282546001600160a01b0316808552600190930154918401919091529250610847576040805180820182523380825260208083018a81526000878152600a90925290849020925183546001600160a01b0319166001600160a01b039091161783555160019092019190915590518391907ffbdfab4f220bab7a483ff50f4252845fc2490bfb6dc26bd0d6c3a44bb088e6139061083e9089908990613b6a565b60405180910390a35b6000868152600b602052604090208054600160201b900463ffffffff1690600461087083613baf565b825463ffffffff9182166101009390930a9283029190920219909116179055506000868152600b60209081526040808320600301805460018101825590845291832090910184905551839188917f6266f2b0183e6ca70ef95168b6adc76897eb8bfe9b52b8c9b8e1a83b8f7c94689190a3505050505050565b6060600080546108f890613bd3565b80601f016020809104026020016040519081016040528092919081815260200182805461092490613bd3565b80156109715780601f1061094657610100808354040283529160200191610971565b820191906000526020600020905b81548152906001019060200180831161095457829003601f168201915b5050505050905090565b600061098682611c79565b6109ec5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610a1382610eec565b9050806001600160a01b0316836001600160a01b03161415610a815760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016109e3565b336001600160a01b0382161480610a9d5750610a9d813361062a565b610b0f5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016109e3565b610b198383611c96565b505050565b6000818152600b60209081526040808320815160e081018352815463ffffffff8082168352600160201b8204811683870152600160401b82041682850152600160601b90046001600160a01b031660608083019190915260018301546080830152600283015460a083015260038301805485518188028101880190965280865291968796909593949360c0860193909291830182828015610bde57602002820191906000526020600020905b815481526020019060010190808311610bca575b505050919092525050506020810151909150610bf985611d04565b93508063ffffffff1667ffffffffffffffff811115610c1a57610c1a6139ed565b604051908082528060200260200182016040528015610c43578160200160208202803683370190505b50925060005b8163ffffffff168163ffffffff161015610ce5576000858263ffffffff1681518110610c7757610c77613c0e565b6020908102919091018101516000818152600a90925260409091205486519192506001600160a01b031690869063ffffffff8516908110610cba57610cba613c0e565b6001600160a01b03909216602092830291909101909101525080610cdd81613baf565b915050610c49565b505050915091565b610cf73382611b8f565b610d135760405162461bcd60e51b81526004016109e390613c24565b610b198383836120fd565b82610d293382611b8f565b610d45576040516282b42960e81b815260040160405180910390fd5b837f9fb9371bd6790dc2e5335f73b2bbfd59db3e06ae2497b48bd8b764efc1508d418484604051610d77929190613b6a565b60405180910390a250505050565b6000610d9033611b22565b905080610db057604051631f2a200560e01b815260040160405180910390fd5b80471015610dda5760405163cf47918160e01b8152476004820152602481018290526044016109e3565b33600081815260076020526040808220600190555190919083908381818185875af1925050503d8060008114610e2c576040519150601f19603f3d011682016040523d82523d6000602084013e610e31565b606091505b5050905080610e3f57600080fd5b60405182815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649060200160405180910390a25050565b610b1983838360405180602001604052806000815250611400565b82610e9e3382611b8f565b610eba576040516282b42960e81b815260040160405180910390fd5b837fabc603ff5dec64646d9c0d9ba54a2329839d1b7d66929301aff79f363d9fcfab8484604051610d77929190613b6a565b6000818152600260205260408120546001600160a01b0316806107345760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016109e3565b60006001600160a01b038216610fce5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016109e3565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146110145760405162461bcd60e51b81526004016109e390613c75565b61101e600061229f565b565b8161102b3382611b8f565b611047576040516282b42960e81b815260040160405180910390fd5b6000838152600b6020526040908190206002018390555183907f9aa6bd5de426f8395804f87597e5edfd3678b619355f6254f876c02574a882cf9061108f9085815260200190565b60405180910390a2505050565b6006546001600160a01b031633146110c65760405162461bcd60e51b81526004016109e390613c75565b600955565b6060600180546108f890613bd3565b60006110ea611f40612710613caa565b821115611123576000611101611f40612710613caa565b6040516336e3948960e21b8152600481019290925260248201526044016109e3565b60008061113087876122f1565b93509150829050341561115c57600061114888610eec565b905061115a8884833460008b8b61262b565b505b5050949350505050565b61117133838361293a565b5050565b61117d613489565b6000828152600b6020908152604091829020825160e081018452815463ffffffff8082168352600160201b8204811683860152600160401b82041682860152600160601b90046001600160a01b0316606082015260018201546080820152600282015460a08201526003820180548551818602810186019096528086529194929360c0860193929083018282801561123457602002820191906000526020600020905b815481526020019060010190808311611220575b5050505050815250509050919050565b6006546001600160a01b0316331461126e5760405162461bcd60e51b81526004016109e390613c75565b600181108061127e57506105dc81115b156112a75760405163168a450960e21b8152600160048201526105dc60248201526044016109e3565b6112b18282612a01565b6000908152600b6020526040902080546bffffffffffffffffffffffff16600160601b426001600160a01b03160217905550565b60608167ffffffffffffffff811115611300576113006139ed565b60405190808252806020026020018201604052801561133357816020015b606081526020019060019003908161131e5790505b50905060005b828110156113f9576000803086868581811061135757611357613c0e565b90506020028101906113699190613cc1565b604051611377929190613b5a565b600060405180830381855af49150503d80600081146113b2576040519150601f19603f3d011682016040523d82523d6000602084013e6113b7565b606091505b5091509150816113c657600080fd5b808484815181106113d9576113d9613c0e565b6020026020010181905250505080806113f190613d0f565b915050611339565b5092915050565b61140a3383611b8f565b6114265760405162461bcd60e51b81526004016109e390613c24565b61143284848484612a1b565b50505050565b606061144382611c79565b61145f57604051626f708760e21b815260040160405180910390fd5b6000828152600b60209081526040808320815160e081018352815463ffffffff8082168352600160201b8204811683870152600160401b82041682850152600160601b90046001600160a01b0316606082015260018201546080820152600282015460a08201526003820180548451818702810187019095528085529194929360c086019390929083018282801561151657602002820191906000526020600020905b815481526020019060010190808311611502575b505050919092525050506020810151909150600061153385612a4e565b6040516020016115439190613d46565b60408051601f198184030181526060830190915260338083529092506000919061567860208301399050600061157e8463ffffffff16612a4e565b60405160200161158e9190613d77565b60408051601f1981840301815260808301825263ffffffff8088168452888301511660208401526060808901516001600160a01b031692840192909252908201899052915060006115e66115e183612b4c565b612b9b565b90506000611618868686856040516020016116049493929190613dc8565b604051602081830303815290604052612b9b565b905060008160405160200161162d9190613ebf565b60408051601f198184030181529190529b9a5050505050505050505050565b60006001600854146116715760405163ac4d09c760e01b815260040160405180910390fd5b6009543410156116a157600954604051630da801c760e31b815234600482015260248101919091526044016109e3565b60006116b56006546001600160a01b031690565b90506000816001600160a01b03163460405160006040518083038185875af1925050503d8060008114611704576040519150601f19603f3d011682016040523d82523d6000602084013e611709565b606091505b505090508061171757600080fd5b61172033612cef565b9250505090565b600080600061173685856122f1565b93509150829050341561176357600061174e86610eec565b905061176186848334600080600061262b565b505b505092915050565b6000341161178c57604051631f2a200560e01b815260040160405180910390fd5b61179583611c79565b6117b157604051626f708760e21b815260040160405180910390fd5b6117bf611f40612710613caa565b8111156117d6576000611101611f40612710613caa565b6000838152600b60209081526040808320815160e081018352815463ffffffff8082168352600160201b8204811683870152600160401b82041682850152600160601b90046001600160a01b0316606082015260018201546080820152600282015460a08201526003820180548451818702810187019095528085529194929360c086019390929083018282801561188d57602002820191906000526020600020905b815481526020019060010190808311611879575b505050505081525050905060006118a385610eec565b90506118b5858383346001898961262b565b604051348152339086907f48def02da8c59b50861e25bab759a8a0c0de6fab6448ef85f32ce59397947d809060200160405180910390a35050505050565b6000341161191457604051631f2a200560e01b815260040160405180910390fd5b61191d81611c79565b61193957604051626f708760e21b815260040160405180910390fd5b6000818152600b60209081526040808320815160e081018352815463ffffffff8082168352600160201b8204811683870152600160401b82041682850152600160601b90046001600160a01b0316606082015260018201546080820152600282015460a08201526003820180548451818702810187019095528085529194929360c08601939092908301828280156119f057602002820191906000526020600020905b8154815260200190600101908083116119dc575b50505050508152505090506000611a0683610eec565b9050611a1983838334600160008061262b565b604051348152339084907f48def02da8c59b50861e25bab759a8a0c0de6fab6448ef85f32ce59397947d80906020015b60405180910390a3505050565b6006546001600160a01b03163314611a805760405162461bcd60e51b81526004016109e390613c75565b6001600160a01b038116611ae55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109e3565b611aee8161229f565b50565b6006546001600160a01b03163314611b1b5760405162461bcd60e51b81526004016109e390613c75565b6001600855565b6001600160a01b0381166000908152600760205260408120546001811115611b5457611b4f600182613caa565b611b57565b60005b9392505050565b6006546001600160a01b03163314611b885760405162461bcd60e51b81526004016109e390613c75565b6002600855565b6000611b9a82611c79565b611bfb5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016109e3565b6000611c0683610eec565b9050806001600160a01b0316846001600160a01b03161480611c415750836001600160a01b0316611c368461097b565b6001600160a01b0316145b80611c7157506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611ccb82610eec565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600b60209081526040808320815160e081018352815463ffffffff8082168352600160201b8204811683870152600160401b82041682850152600160601b90046001600160a01b031660608083019190915260018301546080830152600283015460a0830152600383018054855181880281018801909652808652919695929460c0860193909290830182828015611dc057602002820191906000526020600020905b815481526020019060010190808311611dac575b5050505050815250509050806020015163ffffffff1667ffffffffffffffff811115611dee57611dee6139ed565b604051908082528060200260200182016040528015611e17578160200160208202803683370190505b506080828101516000908152600b60209081526040808320815160e081018352815463ffffffff8082168352600160201b8204811683870152600160401b82041682850152600160601b90046001600160a01b03166060820152600182015495810195909552600281015460a08601526003810180548351818602810186019094528084529698509395869594919360c0860193929190830182828015611edd57602002820191906000526020600020905b815481526020019060010190808311611ec9575b50505091909252505084516080860151929350916000915015611f01576001611f04565b60005b90505b80156120775760c083015160005b8363ffffffff168163ffffffff161015611f8c57818163ffffffff1681518110611f4157611f41613c0e565b6020026020010151888763ffffffff1681518110611f6157611f61613c0e565b602090810291909101015285611f7681613baf565b9650508080611f8490613baf565b915050611f15565b506080840151611f9f5760009150612071565b83516080808601516000908152600b6020908152604091829020825160e081018452815463ffffffff8082168352600160201b8204811683860152600160401b82041682860152600160601b90046001600160a01b03166060820152600182015494810194909452600281015460a08501526003810180548451818502810185019095528085529598509394909360c08601939290919083018282801561206557602002820191906000526020600020905b815481526020019060010190808311612051575b50505050508152505093505b50611f07565b60c085015160005b81518163ffffffff1610156120f157818163ffffffff16815181106120a6576120a6613c0e565b6020026020010151888763ffffffff16815181106120c6576120c6613c0e565b6020908102919091010152856120db81613baf565b96505080806120e990613baf565b91505061207f565b50505050505050919050565b826001600160a01b031661211082610eec565b6001600160a01b0316146121745760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016109e3565b6001600160a01b0382166121d65760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016109e3565b6121e1600082611c96565b6001600160a01b038316600090815260036020526040812080546001929061220a908490613caa565b90915550506001600160a01b0382166000908152600360205260408120805460019290612238908490613f04565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4610b19838383612d43565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6122f9613489565b600061230484611c79565b61232057604051626f708760e21b815260040160405180910390fd5b6000848152600b60209081526040808320815160e081018352815463ffffffff8082168352600160201b8204811683870152600160401b82041682850152600160601b90046001600160a01b0316606082015260018201546080820152600282015460a08201526003820180548451818702810187019095528085529194929360c08601939092908301828280156123d757602002820191906000526020600020905b8154815260200190600101908083116123c3575b5050509190925250505060c08101515160208201519192509063ffffffff81161580612407575063ffffffff8616155b8061241d57508563ffffffff168263ffffffff16105b15612443576040516355f9748560e11b815263ffffffff831660048201526024016109e3565b8260a001513410156124775760a0830151604051630da801c760e31b815234600482015260248101919091526044016109e3565b61248033612cef565b60408051600081526101008101825263ffffffff89166020820190815292965091908201886124af8686613f1c565b6124b99190613f41565b63ffffffff168152602001600163ffffffff168152602001426001600160a01b031681526020018981526020016000815260200182815250955085600b600087815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160086101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001600c6101000a8154816001600160a01b0302191690836001600160a01b031602179055506080820151816001015560a0820151816002015560c08201518160030190805190602001906125d99291906134e1565b50506040805163ffffffff8a16815234602082015233925087918b917f80fa51d23f3bf5aa5a940869244b346c3df1ad758400fd8181237970f88999d0910160405180910390a4505050509250929050565b6020860151600061263b89611d04565b905061266160405180606001604052806000815260200160008152602001600081525090565b60006001600160a01b0386161580612677575084155b9050806126985761271061268b868a613f69565b6126959190613f9e565b82525b60008463ffffffff16116126bc5781516126b29089613caa565b602083015261270a565b6127106126cb611f408a613f69565b6126d59190613f9e565b60208301819052825163ffffffff8616916126f0908b613caa565b6126fa9190613caa565b6127049190613f9e565b60408301525b8160200151600760008b6001600160a01b03166001600160a01b0316815260200190815260200160002060008282546127439190613f04565b92505081905550886001600160a01b0316336001600160a01b03168c7fdbcecf0e7569a188428390e7b80fc6d093710bf642ae4f6b78fe2d74d7fd68be85602001518b604051612794929190613fb2565b60405180910390a48061281b5781516001600160a01b038716600090815260076020526040812080549091906127cb908490613f04565b909155505081516040516001600160a01b0388169133918e917fdbcecf0e7569a188428390e7b80fc6d093710bf642ae4f6b78fe2d74d7fd68be9161281291908d90613fb2565b60405180910390a45b63ffffffff84161561292d5760005b8463ffffffff168163ffffffff16101561292b576000600a6000868463ffffffff168151811061285c5761285c613c0e565b602090810291909101810151825281810192909252604090810160009081208251808401845281546001600160a01b031680825260019092015481860152888401519183526007909452918120805493945091926128bb908490613f04565b9250508190555080600001516001600160a01b0316336001600160a01b03168e7fdbcecf0e7569a188428390e7b80fc6d093710bf642ae4f6b78fe2d74d7fd68be87604001518d604051612910929190613fb2565b60405180910390a4508061292381613baf565b91505061282a565b505b5050505050505050505050565b816001600160a01b0316836001600160a01b0316141561299c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109e3565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319101611a49565b611171828260405180602001604052806000815250612dc8565b612a268484846120fd565b612a3284848484612dfb565b6114325760405162461bcd60e51b81526004016109e390613fe4565b606081612a725750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612a9c5780612a8681613d0f565b9150612a959050600a83613f9e565b9150612a76565b60008167ffffffffffffffff811115612ab757612ab76139ed565b6040519080825280601f01601f191660200182016040528015612ae1576020820181803683370190505b5090505b8415611c7157612af6600183613caa565b9150612b03600a86614036565b612b0e906030613f04565b60f81b818381518110612b2357612b23613c0e565b60200101906001600160f81b031916908160001a905350612b45600a86613f9e565b9450612ae5565b6060612b5782612ef9565b612b6083612f7f565b612b6984613060565b612b7285613125565b604051602001612b85949392919061404a565b6040516020818303038152906040529050919050565b6060815160001415612bbb57505060408051602081019091526000815290565b60006040518060600160405280604081526020016156386040913990506000600384516002612bea9190613f04565b612bf49190613f9e565b612bff906004613f69565b67ffffffffffffffff811115612c1757612c176139ed565b6040519080825280601f01601f191660200182016040528015612c41576020820181803683370190505b509050600182016020820185865187015b80821015612cad576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845350600183019250612c52565b5050600386510660018114612cc95760028114612cdc57612ce4565b603d6001830353603d6002830353612ce4565b603d60018303535b509195945050505050565b6000612cff600c80546001019055565b50600c54612d0d8282612a01565b6000818152600b6020526040902080546bffffffffffffffffffffffff16600160601b426001600160a01b031602179055919050565b6000818152600b602052604090208054600160401b900463ffffffff16906008612d6c83613baf565b825463ffffffff9182166101009390930a9283029190920219909116179055506001600160a01b038216600090815260076020526040902054610b1957506001600160a01b031660009081526007602052604090206001905550565b612dd28383613337565b612ddf6000848484612dfb565b610b195760405162461bcd60e51b81526004016109e390613fe4565b60006001600160a01b0384163b15612eee57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612e3f903390899088908890600401614143565b6020604051808303816000875af1925050508015612e7a575060408051601f3d908101601f19168201909252612e7791810190614180565b60015b612ed4573d808015612ea8576040519150601f19603f3d011682016040523d82523d6000602084013e612ead565b606091505b508051612ecc5760405162461bcd60e51b81526004016109e390613fe4565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611c71565b506001949350505050565b60606000600a836000015163ffffffff1610612f345760405180604001604052806007815260200166119a189a1819a360c91b815250612f55565b604051806040016040528060078152602001662346334631454160c81b8152505b905080604051602001612f68919061419d565b604051602081830303815290604052915050919050565b60606000612fe2610100612f9e856000015163ffffffff166001613472565b856060015186604001516001600160a01b0316612fbb9190613f69565b612fc59190613f69565b612fd090600a613f69565b612fda9190614036565b60ff16612a4e565b613017610100856020015163ffffffff16866040015161300291906141ef565b61300d9060506141ef565b612fda919061421e565b61302c6101008660600151612fda9190614036565b60405160200161303e93929190614244565b604051602081830303815290604052905080604051602001612f6891906142bc565b606060006130b161010061307f856000015163ffffffff166001613472565b856060015186604001516001600160a01b031661309c9190613f69565b6130a69190613f69565b612fd0906014613f69565b6130dc610100856020015163ffffffff1686604001516130d191906141ef565b61300d9060286141ef565b6130f16101008660600151612fda9190614036565b60405160200161310393929190614244565b604051602081830303815290604052905080604051602001612f68919061497f565b60606000600a836000015163ffffffff16106131605760405180604001604052806007815260200166119a189a1819a360c91b815250613181565b604051806040016040528060078152602001662346334631454160c81b8152505b90506000600a846000015163ffffffff16106131b9576040518060400160405280600481526020016311b3333360e11b8152506131d7565b604051806040016040528060048152602001632333333360e01b8152505b90506131e161352c565b81826040516020016131f49291906151e8565b60408051808303601f190181529190528152845160009061321a9063ffffffff16612a4e565b6132396001886020015161322e9190613f1c565b63ffffffff16612a4e565b6132468860600151612a4e565b60405160200161325893929190615324565b60408051601f198184030181529190528051909150606060005b828110156132af578160405160200161328b91906153a7565b604051602081830303815290604052915080806132a790613d0f565b915050613272565b508585826040516020016132c5939291906153cc565b60408051808303601f19018152918152602080870192909252516132ed9187918691016154f5565b60408051808303601f190181529181528581018290528551602080880151925161331b9492939291016155f4565b6040516020818303038152906040529650505050505050919050565b6001600160a01b03821661338d5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109e3565b61339681611c79565b156133e35760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109e3565b6001600160a01b038216600090815260036020526040812080546001929061340c908490613f04565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461117160008383612d43565b6000818310156134825781611b57565b5090919050565b6040518060e00160405280600063ffffffff168152602001600063ffffffff168152602001600063ffffffff16815260200160006001600160a01b031681526020016000815260200160008152602001606081525090565b82805482825590600052602060002090810192821561351c579160200282015b8281111561351c578251825591602001919060010190613501565b50613528929150613553565b5090565b60405180606001604052806003905b606081526020019060019003908161353b5790505090565b5b808211156135285760008155600101613554565b6001600160e01b031981168114611aee57600080fd5b60006020828403121561359057600080fd5b8135611b5781613568565b6000806000604084860312156135b057600080fd5b83359250602084013567ffffffffffffffff808211156135cf57600080fd5b818601915086601f8301126135e357600080fd5b8135818111156135f257600080fd5b87602082850101111561360457600080fd5b6020830194508093505050509250925092565b60005b8381101561363257818101518382015260200161361a565b838111156114325750506000910152565b6000815180845261365b816020860160208601613617565b601f01601f19169290920160200192915050565b602081526000611b576020830184613643565b60006020828403121561369457600080fd5b5035919050565b80356001600160a01b03811681146136b257600080fd5b919050565b600080604083850312156136ca57600080fd5b6136d38361369b565b946020939093013593505050565b604080825283519082018190526000906020906060840190828701845b8281101561371a578151845292840192908401906001016136fe565b5050508381038285015284518082528583019183019060005b818110156137585783516001600160a01b031683529284019291840191600101613733565b5090979650505050505050565b60008060006060848603121561377a57600080fd5b6137838461369b565b92506137916020850161369b565b9150604084013590509250925092565b6000602082840312156137b357600080fd5b611b578261369b565b600080604083850312156137cf57600080fd5b50508035926020909101359150565b803563ffffffff811681146136b257600080fd5b6000806000806080858703121561380857600080fd5b84359350613818602086016137de565b92506138266040860161369b565b9396929550929360600135925050565b6000806040838503121561384957600080fd5b6138528361369b565b91506020830135801515811461386757600080fd5b809150509250929050565b60006020808352610100830163ffffffff808651168386015280838701511660408601528060408701511660608601525060018060a01b036060860151166080850152608085015160a085015260a085015160c085015260c085015160e080860152818151808452610120870191508483019350600092505b8083101561390b57835182529284019260019290920191908401906138eb565b509695505050505050565b6000806020838503121561392957600080fd5b823567ffffffffffffffff8082111561394157600080fd5b818501915085601f83011261395557600080fd5b81358181111561396457600080fd5b8660208260051b850101111561397957600080fd5b60209290920196919550909350505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156139e057603f198886030184526139ce858351613643565b945092850192908501906001016139b2565b5092979650505050505050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215613a1957600080fd5b613a228561369b565b9350613a306020860161369b565b925060408501359150606085013567ffffffffffffffff80821115613a5457600080fd5b818701915087601f830112613a6857600080fd5b813581811115613a7a57613a7a6139ed565b604051601f8201601f19908116603f01168101908382118183101715613aa257613aa26139ed565b816040528281528a6020848701011115613abb57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215613af257600080fd5b82359150613b02602084016137de565b90509250929050565b60008060408385031215613b1e57600080fd5b613b278361369b565b9150613b026020840161369b565b600080600060608486031215613b4a57600080fd5b833592506137916020850161369b565b8183823760009101908152919050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b600052601160045260246000fd5b600063ffffffff80831681811415613bc957613bc9613b99565b6001019392505050565b600181811c90821680613be757607f821691505b60208210811415613c0857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600082821015613cbc57613cbc613b99565b500390565b6000808335601e19843603018112613cd857600080fd5b83018035915067ffffffffffffffff821115613cf357600080fd5b602001915036819003821315613d0857600080fd5b9250929050565b6000600019821415613d2357613d23613b99565b5060010190565b60008151613d3c818560208601613617565b9290920192915050565b684c6f67626f6f6b202360b81b815260008251613d6a816009850160208701613617565b9190910160090192915050565b7f7b2274726169745f74797065223a20224c6f6773222c2276616c7565223a2200815260008251613daf81601f850160208701613617565b61227d60f01b601f939091019283015250602101919050565b693d913730b6b2911d101160b11b81528451600090613dee81600a850160208a01613617565b72111610113232b9b1b934b83a34b7b7111d101160691b600a918401918201528551613e2181601d840160208a01613617565b71222c202261747472696275746573223a205b60701b601d92909101918201528451613e5481602f840160208901613617565b7f5d2c2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b602f92909101918201526618985cd94d8d0b60ca1b604f8201528351613ea2816056840160208801613617565b61227d60f01b605692909101918201526058019695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251613ef781601d850160208701613617565b91909101601d0192915050565b60008219821115613f1757613f17613b99565b500190565b600063ffffffff83811690831681811015613f3957613f39613b99565b039392505050565b600063ffffffff808316818516808303821115613f6057613f60613b99565b01949350505050565b6000816000190483118215151615613f8357613f83613b99565b500290565b634e487b7160e01b600052601260045260246000fd5b600082613fad57613fad613f88565b500490565b8281526040810160028310613fd757634e487b7160e01b600052602160045260246000fd5b8260208301529392505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60008261404557614045613f88565b500690565b7f3c7376672077696474683d2238303022206865696768743d223830302220786d81527f6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f7376672260208201527f3e3c672066696c6c3d226e6f6e65222066696c6c2d72756c653d226576656e6f6040820152633232111f60e11b6060820152600085516140db816064850160208a01613617565b8551908301906140f2816064840160208a01613617565b8551910190614108816064840160208901613617565b845191019061411e816064840160208801613617565b691e17b39f1e17b9bb339f60b11b60649290910191820152606e019695505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061417690830184613643565b9695505050505050565b60006020828403121561419257600080fd5b8151611b5781613568565b7f3c7061746820643d224d302030683830307638303048307a222066696c6c3d228152600082516141d5816020850160208701613617565b6211179f60e91b6020939091019283015250602301919050565b60006001600160a01b038281168482168115158284048211161561421557614215613b99565b02949350505050565b60006001600160a01b038381168061423857614238613f88565b92169190910692915050565b630e4cec4560e31b815260008451614263816004850160208901613617565b8083019050600b60fa1b8060048301528551614286816005850160208a01613617565b600592019182015283516142a1816006840160208801613617565b602960f81b6006929091019182015260070195945050505050565b7f3c7061746820643d224d3637302e37203533352e37613330203330203020302081527f31203330203330563634386133302033302030203020312d3330203330682d3760208201527f396133302033302030203020312d33302d3330762d342e35613330203330203060408201527f203020312033302d33306831382e316133302033302030203020302033302d3360608201527f30762d31372e386133302033302030203020312033302d333068315a6d2d333860808201527f362e372e3461333020333020302030203120333020333056363438613330203360a08201527f302030203020312d3330203330682d316133302033302030203020312d33302d60c08201527f3330762d38326133302033302030203020312033302d33305a6d2d313530203760e08201527f372e3661333020333020302030203120333020333076332e36613330203330206101008201527f30203020312d3330203330682d352e386133302033302030203020312d33302d6101208201527f3330762d332e356133302033302030203020312033302d33305a4d35313920356101408201527f333661333020333020302030203120333020333076352e3461333020333020306101608201527f203020312d3330203330682d38312e386133302033302030203020312d33302d6101808201527f3330762d352e346133302033302030203020312033302d33305a6d2d322e352d6101a08201527f3135342e366133302033302030203020312033302033307638326133302033306101c08201527f2030203020312d3330203330682d2e396133302033302030203020312d33302d6101e08201527f3330762d38326133302033302030203020312033302d33305a6d2d37362d37366102008201527f2e376133302033302030203020312033302033307638326133302033302030206102208201527f3020312d3330203330682d38322e316133302033302030203020312d33302d336102408201527f30762d322e326133302033302030203020312033302d33306831372e376133306102608201527f2033302030203020302033302d3330762d31392e3861333020333020302030206102808201527f312033302d33305a4d32313020333831613330203330203020302031203330206102a08201527f333076332e366133302033302030203020312d3330203330682d352e386133306102c08201527f2033302030203020312d33302d333056343131613330203330203020302031206102e08201527f33302d333068352e385a6d37342e312d3135342e3761333020333020302030206103008201527f31203330203330563237346133302033302030203020302033302033306831386103208201527f2e3261333020333020302030203120333020333076342e3561333020333020306103408201527f203020312d3330203330682d37396133302033302030203020312d33302d333061036082018190527f762d38322e336133302033302030203020312033302d33305a6d3338362e36206103808301527f306133302033302030203020312033302033307638322e3361333020333020306103a08301526103c08201527f563333346133302033302030203020312033302d33306831382e3161333020336103e08201527f302030203020302033302d3330762d31372e38613330203330203020302031206104008201527f33302d333068315a4d3230372e322031343561333020333020302030203120336104208201527f302033307638322e336133302033302030203020312d3330203330682d2e39616104408201527f33302033302030203020312d33302d3330762d31372e386133302033302030206104608201527f3020302d33302d3330682d31382e316133302033302030203020312d33302d336104808201527f30563137356133302033302030203020312033302d33305a6d3338372e322e336104a08201527f61333020333020302030203120333020333076383261333020333020302030206104c08201527f312d3330203330682d2e396133302033302030203020312d33302d3330762d386104e08201527f326133302033302030203020312033302d33305a6d2d3135362e3520306133306105008201527f20333020302030203120333020333076372e326133302033302030203020312d6105208201527f3330203330682d2e396133302033302030203020312d33302d3330762d372e326105408201527f6133302033302030203020312033302d33305a222066696c6c2d6f70616369746105608201526c3c9e91171a91103334b6361e9160991b6105808201526000611b5761497061058d840185613d2a565b6211179f60e91b815260030190565b7f3c7061746820643d224d3335362e38203533352e37613330203330203020302081527f312033302033307631372e38613330203330203020302030203330203330483460208201527f333561333020333020302030203120333020333076342e35613330203330203060408201527f203020312d3330203330682d37396133302033302030203020312d33302d333060608201527f762d38322e336133302033302030203020312033302d33305a6d2d3134392e3860808201527f203061333020333020302030203120333020333056363438613330203330203060a08201527f203020312d3330203330682d2e396133302033302030203020312d33302d333060c08201527f762d31372e386133302033302030203020302d33302d3330483132386133302060e08201527f33302030203020312d33302d3330762d342e35613330203330203020302031206101008201527f33302d33305a6d3331322e3120373861333020333020302030203120333020336101208201527f3076332e366133302033302030203020312d3330203330682d352e38613330206101408201527f33302030203020312d33302d3330762d332e35613330203330203020302031206101608201527f33302d33305a6d37382d37372e336133302033302030203020312033302033306101808201527f76332e366133302033302030203020312d3330203330682d352e3961333020336101a08201527f302030203020312d33302d3330762d332e3661333020333020302030203120336101c08201527f302d333068352e395a6d2d342e352d31353461333020333020302030203120336101e08201527f30203330563433306133302033302030203020302033302033306831382e31616102008201527f333020333020302030203120333020333076342e3561333020333020302030206102208201527f312d3330203330682d37396133302033302030203020312d33302d3330762d386102408201527f322e336133302033302030203020312033302d33305a6d2d3330382e352030616102608201527f33302033302030203020312033302033305634333061333020333020302030206102808201527f302033302033306831382e3261333020333020302030203120333020333076346102a08201527f2e356133302033302030203020312d3330203330682d373961333020333020306102c08201527f203020312d33302d3330762d38322e336133302033302030203020312033302d6102e08201527f33305a4d313239203338316133302033302030203020312033302033307631376103008201527f2e386133302033302030203020302033302033304832303761333020333020306103208201527f2030203120333020333076342e356133302033302030203020312d33302033306103408201527f682d37396133302033302030203020312d33302d3330563431316133302033306103608201527f2030203020312033302d33305a6d3331312e36203738613330203330203020306103808201527f203120333020333076342e336133302033302030203020312d3330203330682d6103a08201527f2e396133302033302030203020312d33302d33305634383961333020333020306103c08201527f203020312033302d33305a6d3233302d373761333020333020302030203120336103e08201527f3020333076372e326133302033302030203020312d3330203330682d372e32616104008201527f33302033302030203020312d33302d33305634313261333020333020302030206104208201527f312033302d33305a6d2d3135342d3738613330203330203020302031203330206104408201527f333076372e326133302033302030203020312d3330203330682d2e39613330206104608201527f33302030203020312d33302d33305633333461333020333020302030203120336104808201527f302d33305a4d3230392e382033303761333020333020302030203120333020336104a08201527f3076316133302033302030203020312d333020333048313238613330203330206104c08201527f30203020312d33302d3330762d316133302033302030203020312033302d33306104e08201527f5a4d3336322e33203134356133302033302030203020312033302033307638326105008201527f2e336133302033302030203020312d3330203330682d316133302033302030206105208201527f3020312d33302d3330762d31372e386133302033302030203020302d33302d336105408201527f30682d31386133302033302030203020312d33302d33305631373561333020336105608201527f302030203020312033302d33305a6d3135362e382e33613330203330203020306105808201527f20312033302033307638326133302033302030203020312d33302033304834336105a08201527f376133302033302030203020312d33302d3330563235356133302033302030206105c08201527f3020312033302d33306831372e376133302033302030203020302033302d33306105e08201527f762d31392e386133302033302030203020312033302d33305a6d2d33383520386106008201527f31613330203330203020302031203330203330763161333020333020302030206106208201527f312d3330203330682d366133302033302030203020312d33302d3330762d31616106408201527f33302033302030203020312033302d333068365a6d3533362e332d38316133306106608201527f20333020302030203120333020333076372e326133302033302030203020312d6106808201527f3330203330682d2e396133302033302030203020312d33302d3330762d372e326106a08201527f6133302033302030203020312033302d33305a222066696c6c3d2200000000006106c08201526000611b576149706106db840185613d2a565b6b1e3a32bc3a103334b6361e9160a11b8152825160009061521081600c850160208801613617565b7f2220666f6e742d66616d696c793d22526f626f746f2c205461686f6d612d426f600c918401918201527f6c642c205461686f6d612220666f6e742d73697a653d2234382220666f6e742d602c8201527f7765696768743d22626f6c64223e3c747370616e20783d2239392e332220793d604c8201527f223130352e34223e4c4f47424f4f4b3c2f747370616e3e3c2f746578743e0000606c8201526d1e3830ba341039ba3937b5b29e9160911b608a82015283516152d6816098840160208801613617565b7f22207374726f6b652d77696474683d22382220643d224d333837203838683331609892909101918201526e1a269c9c901b989c341b181911179f60891b60b882015260c701949350505050565b644c6f67732f60d81b815260008451615344816005850160208901613617565b6d202020205472616e73666572732f60901b6005918401918201528451615372816013840160208901613617565b662020202049442f60c81b60139290910191820152835161539a81601a840160208801613617565b01601a0195945050505050565b600082516153b9818460208701613617565b606760f81b920191825250600101919050565b6d1e3a32bc3a1039ba3937b5b29e9160911b815283516000906153f681600e850160208901613617565b7f22207374726f6b652d77696474683d2232302220666f6e742d66616d696c793d600e918401918201527f22526f626f746f2c205461686f6d612d426f6c642c205461686f6d612220666f602e8201527f6e742d73697a653d2231382220666f6e742d7765696768743d22626f6c642220604e820152653334b6361e9160d11b606e820152845161548e816074840160208901613617565b7f223e3c747370616e20783d2239382220793d223732342e32223e0000000000006074929091019182015283516154cc81608e840160208801613617565b6e1e17ba39b830b71f1e17ba32bc3a1f60891b608e9290910191820152609d0195945050505050565b6b1e3a32bc3a103334b6361e9160a11b8152825160009061551d81600c850160208801613617565b7f2220666f6e742d66616d696c793d22526f626f746f2c205461686f6d612d426f600c918401918201527f6c642c205461686f6d612220666f6e742d73697a653d2231382220666f6e742d602c8201527f7765696768743d22626f6c642220786d6c3a73706163653d2270726573657276604c8201527f65223e3c747370616e20783d2239382220793d223732342e32223e0000000000606c82015283516155cc816087840160208801613617565b6e1e17ba39b830b71f1e17ba32bc3a1f60891b60879290910191820152609601949350505050565b60008451615606818460208901613617565b84519083019061561a818360208901613617565b845191019061562d818360208801613617565b019594505050505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f4120626f6f6b2074686174207265636f726473206f776e65727327206a6f75726e657920696e204d617474657276657273652ea2646970667358221220f39771466d98f9b5e5ba1f288c30741db370ce790e2f67b29c57e32515df54a364736f6c634300080b0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000074c6f67626f6f6b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054c4f475253000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name_ (string): Logbook
Arg [1] : symbol_ (string): LOGRS
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [3] : 4c6f67626f6f6b00000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [5] : 4c4f475253000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
58718:14167:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20799:305;;;;;;;;;;-1:-1:-1;20799:305:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;20799:305:0;;;;;;;;60888:577;;;;;;;;;;-1:-1:-1;60888:577:0;;;;;:::i;:::-;;:::i;:::-;;21744:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;23303:221::-;;;;;;;;;;-1:-1:-1;23303:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2379:32:1;;;2361:51;;2349:2;2334:18;23303:221:0;2215:203:1;22826:411:0;;;;;;;;;;-1:-1:-1;22826:411:0;;;;;:::i;:::-;;:::i;63957:497::-;;;;;;;;;;-1:-1:-1;63957:497:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;24053:339::-;;;;;;;;;;-1:-1:-1;24053:339:0;;;;;:::i;:::-;;:::i;60018:170::-;;;;;;;;;;-1:-1:-1;60018:170:0;;;;;:::i;:::-;;:::i;59044:44::-;;;;;;;;;;;;;;;;;;;4522:25:1;;;4510:2;4495:18;59044:44:0;4376:177:1;50161:419:0;;;;;;;;;;;;;:::i;24463:185::-;;;;;;;;;;-1:-1:-1;24463:185:0;;;;;:::i;:::-;;:::i;59834:146::-;;;;;;;;;;-1:-1:-1;59834:146:0;;;;;:::i;:::-;;:::i;21438:239::-;;;;;;;;;;-1:-1:-1;21438:239:0;;;;;:::i;:::-;;:::i;21168:208::-;;;;;;;;;;-1:-1:-1;21168:208:0;;;;;:::i;:::-;;:::i;36925:103::-;;;;;;;;;;;;;:::i;60226:195::-;;;;;;;;;;-1:-1:-1;60226:195:0;;;;;:::i;:::-;;:::i;65285:106::-;;;;;;;;;;-1:-1:-1;65285:106:0;;;;;:::i;:::-;;:::i;36274:87::-;;;;;;;;;;-1:-1:-1;36347:6:0;;-1:-1:-1;;;;;36347:6:0;36274:87;;21913:104;;;;;;;;;;;;;:::i;61955:642::-;;;;;;:::i;:::-;;:::i;59161:35::-;;;;;;;;;;-1:-1:-1;59161:35:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;59161:35:0;;;;;;;;;;-1:-1:-1;;;;;5947:32:1;;;5929:51;;6011:2;5996:18;;5989:34;;;;5902:18;59161:35:0;5755:274:1;59095:30:0;;;;;;;;;;;;;;;;23596:155;;;;;;;;;;-1:-1:-1;23596:155:0;;;;;:::i;:::-;;:::i;63798:121::-;;;;;;;;;;-1:-1:-1;63798:121:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;64492:254::-;;;;;;;;;;-1:-1:-1;64492:254:0;;;;;:::i;:::-;;:::i;60459:391::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;24719:328::-;;;;;;;;;;-1:-1:-1;24719:328:0;;;;;:::i;:::-;;:::i;65665:1609::-;;;;;;;;;;-1:-1:-1;65665:1609:0;;;;;:::i;:::-;;:::i;64784:463::-;;;:::i;61503:414::-;;;;;;:::i;:::-;;:::i;23822:164::-;;;;;;;;;;-1:-1:-1;23822:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;23943:25:0;;;23919:4;23943:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23822:164;63108:652;;;;;;:::i;:::-;;:::i;62635:435::-;;;;;;:::i;:::-;;:::i;37183:201::-;;;;;;;;;;-1:-1:-1;37183:201:0;;;;;:::i;:::-;;:::i;65429:94::-;;;;;;;;;;;;;:::i;50618:191::-;;;;;;;;;;-1:-1:-1;50618:191:0;;;;;:::i;:::-;;:::i;65561:96::-;;;;;;;;;;;;;:::i;20799:305::-;20901:4;-1:-1:-1;;;;;;20938:40:0;;-1:-1:-1;;;20938:40:0;;:105;;-1:-1:-1;;;;;;;20995:48:0;;-1:-1:-1;;;20995:48:0;20938:105;:158;;;-1:-1:-1;;;;;;;;;;19517:40:0;;;21060:36;20918:178;20799:305;-1:-1:-1;;20799:305:0:o;60888:577::-;60975:8;59624:40;59643:10;59655:8;59624:18;:40::i;:::-;59619:68;;59673:14;;-1:-1:-1;;;59673:14:0;;;;;;;;;;;59619:68;60996:19:::1;61045:8;;61028:26;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;61028:26:0;;::::1;::::0;;;;;;61018:37;;61028:26:::1;61018:37:::0;;::::1;::::0;61084:14:::1;61101:17:::0;;;:4:::1;:17:::0;;;;;61084:34;;::::1;::::0;;;;;-1:-1:-1;;;;;61084:34:0::1;::::0;;;;;;::::1;::::0;;;::::1;::::0;;;;61018:37;-1:-1:-1;61129:164:0::1;;61194:25;::::0;;;;::::1;::::0;;61198:10:::1;61194:25:::0;;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;61174:17:0;;;:4:::1;:17:::0;;;;;;;:45;;;;-1:-1:-1;;;;;;61174:45:0::1;-1:-1:-1::0;;;;;61174:45:0;;::::1;;::::0;;;-1:-1:-1;61174:45:0;;::::1;::::0;;;;61239:42;;61174:17;;61198:10;61239:42:::1;::::0;::::1;::::0;61272:8;;;;61239:42:::1;:::i;:::-;;;;;;;;61129:164;61325:16;::::0;;;:6:::1;:16;::::0;;;;:27;;-1:-1:-1;;;61325:27:0;::::1;;;::::0;:25:::1;:27;::::0;::::1;:::i;:::-;::::0;;::::1;::::0;;::::1;;::::0;;;::::1;::::0;;::::1;::::0;;;::::1;;::::0;;::::1;;::::0;;-1:-1:-1;;61363:16:0;;;:6:::1;:16;::::0;;;;;;;:30:::1;;:48:::0;;-1:-1:-1;61363:48:0;::::1;::::0;;;;;;;;;;::::1;::::0;;;61427:30;61399:11;;61370:8;;61427:30:::1;::::0;-1:-1:-1;61427:30:0::1;60985:480;;60888:577:::0;;;;:::o;21744:100::-;21798:13;21831:5;21824:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21744:100;:::o;23303:221::-;23379:7;23407:16;23415:7;23407;:16::i;:::-;23399:73;;;;-1:-1:-1;;;23399:73:0;;12728:2:1;23399:73:0;;;12710:21:1;12767:2;12747:18;;;12740:30;12806:34;12786:18;;;12779:62;-1:-1:-1;;;12857:18:1;;;12850:42;12909:19;;23399:73:0;;;;;;;;;-1:-1:-1;23492:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;23492:24:0;;23303:221::o;22826:411::-;22907:13;22923:23;22938:7;22923:14;:23::i;:::-;22907:39;;22971:5;-1:-1:-1;;;;;22965:11:0;:2;-1:-1:-1;;;;;22965:11:0;;;22957:57;;;;-1:-1:-1;;;22957:57:0;;13141:2:1;22957:57:0;;;13123:21:1;13180:2;13160:18;;;13153:30;13219:34;13199:18;;;13192:62;-1:-1:-1;;;13270:18:1;;;13263:31;13311:19;;22957:57:0;12939:397:1;22957:57:0;16458:10;-1:-1:-1;;;;;23049:21:0;;;;:62;;-1:-1:-1;23074:37:0;23091:5;16458:10;23822:164;:::i;23074:37::-;23027:168;;;;-1:-1:-1;;;23027:168:0;;13543:2:1;23027:168:0;;;13525:21:1;13582:2;13562:18;;;13555:30;13621:34;13601:18;;;13594:62;13692:26;13672:18;;;13665:54;13736:19;;23027:168:0;13341:420:1;23027:168:0;23208:21;23217:2;23221:7;23208:8;:21::i;:::-;22896:341;22826:411;;:::o;63957:497::-;64116:16;64135;;;:6;:16;;;;;;;;64116:35;;;;;;;;;;;;;;;-1:-1:-1;;;64116:35:0;;;;;;;;-1:-1:-1;;;64116:35:0;;;;;;;-1:-1:-1;;;64116:35:0;;-1:-1:-1;;;;;64116:35:0;64042:30;64116:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64042:30;;;;64116:16;;:35;;64135:16;64116:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64116:35:0;;;;-1:-1:-1;;;64180:13:0;;;;64116:35;;-1:-1:-1;64222:15:0;64228:8;64222:5;:15::i;:::-;64206:31;;64272:8;64258:23;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64258:23:0;;64248:33;;64297:8;64292:155;64315:8;64311:12;;:1;:12;;;64292:155;;;64345:19;64367:13;64381:1;64367:16;;;;;;;;;;:::i;:::-;;;;;;;;;;;;64411:17;;;;:4;:17;;;;;;;:24;64398:10;;64367:16;;-1:-1:-1;;;;;;64411:24:0;;64398:7;;:10;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;64398:37:0;;;:10;;;;;;;;;;;:37;-1:-1:-1;64325:3:0;;;;:::i;:::-;;;;64292:155;;;;64105:349;;63957:497;;;:::o;24053:339::-;24248:41;16458:10;24281:7;24248:18;:41::i;:::-;24240:103;;;;-1:-1:-1;;;24240:103:0;;;;;;;:::i;:::-;24356:28;24366:4;24372:2;24376:7;24356:9;:28::i;60018:170::-;60116:8;59624:40;59643:10;59655:8;59624:18;:40::i;:::-;59619:68;;59673:14;;-1:-1:-1;;;59673:14:0;;;;;;;;;;;59619:68;60157:8:::1;60142:38;60167:12;;60142:38;;;;;;;:::i;:::-;;;;;;;;60018:170:::0;;;;:::o;50161:419::-;50199:14;50216:22;50227:10;50216;:22::i;:::-;50199:39;-1:-1:-1;50255:11:0;50251:36;;50275:12;;-1:-1:-1;;;50275:12:0;;;;;;;;;;;50251:36;50326:6;50302:21;:30;50298:93;;;50341:50;;-1:-1:-1;;;50341:50:0;;50361:21;50341:50;;;14490:25:1;14531:18;;;14524:34;;;14463:18;;50341:50:0;14316:248:1;50298:93:0;50414:10;50404:21;;;;:9;:21;;;;;;50428:5;50404:29;;50465:34;50404:21;;50414:10;50488:6;;50404:21;50465:34;50404:21;50465:34;50488:6;50414:10;50465:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50446:53;;;50518:7;50510:16;;;;;;50544:28;;4522:25:1;;;50553:10:0;;50544:28;;4510:2:1;4495:18;50544:28:0;;;;;;;50188:392;;50161:419::o;24463:185::-;24601:39;24618:4;24624:2;24628:7;24601:39;;;;;;;;;;;;:16;:39::i;59834:146::-;59920:8;59624:40;59643:10;59655:8;59624:18;:40::i;:::-;59619:68;;59673:14;;-1:-1:-1;;;59673:14:0;;;;;;;;;;;59619:68;59955:8:::1;59946:26;59965:6;;59946:26;;;;;;;:::i;21438:239::-:0;21510:7;21546:16;;;:7;:16;;;;;;-1:-1:-1;;;;;21546:16:0;21581:19;21573:73;;;;-1:-1:-1;;;21573:73:0;;14981:2:1;21573:73:0;;;14963:21:1;15020:2;15000:18;;;14993:30;15059:34;15039:18;;;15032:62;-1:-1:-1;;;15110:18:1;;;15103:39;15159:19;;21573:73:0;14779:405:1;21168:208:0;21240:7;-1:-1:-1;;;;;21268:19:0;;21260:74;;;;-1:-1:-1;;;21260:74:0;;15391:2:1;21260:74:0;;;15373:21:1;15430:2;15410:18;;;15403:30;15469:34;15449:18;;;15442:62;-1:-1:-1;;;15520:18:1;;;15513:40;15570:19;;21260:74:0;15189:406:1;21260:74:0;-1:-1:-1;;;;;;21352:16:0;;;;;:9;:16;;;;;;;21168:208::o;36925:103::-;36347:6;;-1:-1:-1;;;;;36347:6:0;16458:10;36494:23;36486:68;;;;-1:-1:-1;;;36486:68:0;;;;;;;:::i;:::-;36990:30:::1;37017:1;36990:18;:30::i;:::-;36925:103::o:0;60226:195::-;60309:8;59624:40;59643:10;59655:8;59624:18;:40::i;:::-;59619:68;;59673:14;;-1:-1:-1;;;59673:14:0;;;;;;;;;;;59619:68;60330:16:::1;::::0;;;:6:::1;:16;::::0;;;;;;:26:::1;;:36:::0;;;60382:31;60337:8;;60382:31:::1;::::0;::::1;::::0;60359:7;4522:25:1;;4510:2;4495:18;;4376:177;60382:31:0::1;;;;;;;;60226:195:::0;;;:::o;65285:106::-;36347:6;;-1:-1:-1;;;;;36347:6:0;16458:10;36494:23;36486:68;;;;-1:-1:-1;;;36486:68:0;;;;;;;:::i;:::-;65359:15:::1;:24:::0;65285:106::o;21913:104::-;21969:13;22002:7;21995:14;;;;;:::i;61955:642::-;62130:15;58900:34;58834:4;58900:5;:34;:::i;:::-;62162:14;:44;62158:99;;;62226:1;58900:34;58834:4;58900:5;:34;:::i;:::-;62215:42;;-1:-1:-1;;;62215:42:0;;;;;14490:25:1;;;;14531:18;;;14524:34;14463:18;;62215:42:0;14316:248:1;62158:99:0;62271:16;62289:18;62311:23;62317:8;62327:6;62311:5;:23::i;:::-;62270:64;-1:-1:-1;62270:64:0;-1:-1:-1;62270:64:0;;-1:-1:-1;62382:9:0;:13;62378:212;;62412:20;62435:24;62450:8;62435:14;:24::i;:::-;62412:47;;62474:104;62488:8;62498:4;62504:12;62518:9;62529:19;62550:11;62563:14;62474:13;:104::i;:::-;62397:193;62378:212;62147:450;;61955:642;;;;;;:::o;23596:155::-;23691:52;16458:10;23724:8;23734;23691:18;:52::i;:::-;23596:155;;:::o;63798:121::-;63859:16;;:::i;:::-;63895;;;;:6;:16;;;;;;;;;63888:23;;;;;;;;;;;;;;;-1:-1:-1;;;63888:23:0;;;;;;;;-1:-1:-1;;;63888:23:0;;;;;;;-1:-1:-1;;;63888:23:0;;-1:-1:-1;;;;;63888:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63895:16;;63888:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63798:121;;;:::o;64492:254::-;36347:6;;-1:-1:-1;;;;;36347:6:0;16458:10;36494:23;36486:68;;;;-1:-1:-1;;;36486:68:0;;;;;;;:::i;:::-;64583:1:::1;64572:8;:12;:31;;;;64599:4;64588:8;:15;64572:31;64568:67;;;64612:23;::::0;-1:-1:-1;;;64612:23:0;;64627:1:::1;64612:23;::::0;::::1;14490:25:1::0;64630:4:0::1;14531:18:1::0;;;14524:34;14463:18;;64612:23:0::1;14316:248:1::0;64568:67:0::1;64648:24;64658:3;64663:8;64648:9;:24::i;:::-;64685:16;::::0;;;:6:::1;:16;::::0;;;;:53;;;::::1;-1:-1:-1::0;;;64722:15:0::1;-1:-1:-1::0;;;;;64685:53:0::1;;;::::0;;-1:-1:-1;64492:254:0:o;60459:391::-;60527:22;60584:4;60572:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60562:34;;60614:9;60609:207;60629:15;;;60609:207;;;60667:12;;60712:4;60731;;60736:1;60731:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;60704:35;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60666:73;;;;60762:7;60754:16;;;;;;60798:6;60785:7;60793:1;60785:10;;;;;;;;:::i;:::-;;;;;;:19;;;;60651:165;;60646:3;;;;;:::i;:::-;;;;60609:207;;;;60459:391;;;;:::o;24719:328::-;24894:41;16458:10;24927:7;24894:18;:41::i;:::-;24886:103;;;;-1:-1:-1;;;24886:103:0;;;;;;;:::i;:::-;25000:39;25014:4;25020:2;25024:7;25033:5;25000:13;:39::i;:::-;24719:328;;;;:::o;65665:1609::-;65731:13;65762:17;65770:8;65762:7;:17::i;:::-;65757:47;;65788:16;;-1:-1:-1;;;65788:16:0;;;;;;;;;;;65757:47;65817:16;65836;;;:6;:16;;;;;;;;65817:35;;;;;;;;;;;;;;;-1:-1:-1;;;65817:35:0;;;;;;;;-1:-1:-1;;;65817:35:0;;;;;;;-1:-1:-1;;;65817:35:0;;-1:-1:-1;;;;;65817:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65836:16;;65817:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65817:35:0;;;;-1:-1:-1;;;65881:13:0;;;;65817:35;;-1:-1:-1;65863:15:0;65970:26;65987:8;65970:16;:26::i;:::-;65940:57;;;;;;;;:::i;:::-;;;;-1:-1:-1;;65940:57:0;;;;;;66009:81;;;;;;;;;;65940:57;;-1:-1:-1;66009:25:0;;65940:57;66009:81;65940:57;66009:81;;;;;66101:27;66204:26;66221:8;66204:26;;:16;:26::i;:::-;66152:85;;;;;;;;:::i;:::-;;;;-1:-1:-1;;66152:85:0;;;;;;66297:182;;;;;;;;;;;66377:18;;;;66297:182;66152:85;66297:182;;;66421:14;;;;;-1:-1:-1;;;;;66297:182:0;;;;;;;;;;;;;;66152:85;-1:-1:-1;66261:33:0;66512:51;66532:29;66152:85;66532:18;:29::i;:::-;66512:13;:51::i;:::-;66490:73;;66576:18;66597:544;66760:9;66844:11;66929:13;67037:5;66678:418;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66597:13;:544::i;:::-;66576:565;;67154:20;67234:4;67184:55;;;;;;;;:::i;:::-;;;;-1:-1:-1;;67184:55:0;;;;;;;;;;65665:1609;-1:-1:-1;;;;;;;;;;;65665:1609:0:o;64784:463::-;64836:15;58984:1;64868:10;;:29;64864:64;;64906:22;;-1:-1:-1;;;64906:22:0;;;;;;;;;;;64864:64;64955:15;;64943:9;:27;64939:86;;;65009:15;;64979:46;;-1:-1:-1;;;64979:46:0;;64998:9;64979:46;;;14490:25:1;14531:18;;;14524:34;;;;14463:18;;64979:46:0;14316:248:1;64939:86:0;65064:16;65083:7;36347:6;;-1:-1:-1;;;;;36347:6:0;;36274:87;65083:7;65064:26;;65102:12;65120:8;-1:-1:-1;;;;;65120:13:0;65141:9;65120:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65101:54;;;65174:7;65166:16;;;;;;65222:17;65228:10;65222:5;:17::i;:::-;65212:27;;64853:394;;64784:463;:::o;61503:414::-;61576:15;61605:16;61623:18;61645:23;61651:8;61661:6;61645:5;:23::i;:::-;61604:64;-1:-1:-1;61604:64:0;-1:-1:-1;61604:64:0;;-1:-1:-1;61716:9:0;:13;61712:198;;61746:20;61769:24;61784:8;61769:14;:24::i;:::-;61746:47;;61808:90;61822:8;61832:4;61838:12;61852:9;61863:19;61892:1;61896;61808:13;:90::i;:::-;61731:179;61712:198;61593:324;;61503:414;;;;:::o;63108:652::-;63280:1;63267:9;:14;63263:39;;63290:12;;-1:-1:-1;;;63290:12:0;;;;;;;;;;;63263:39;63318:17;63326:8;63318:7;:17::i;:::-;63313:47;;63344:16;;-1:-1:-1;;;63344:16:0;;;;;;;;;;;63313:47;58900:34;58834:4;58900:5;:34;:::i;:::-;63375:14;:44;63371:99;;;63439:1;58900:34;58834:4;58900:5;:34;:::i;63371:99::-;63483:16;63502;;;:6;:16;;;;;;;;63483:35;;;;;;;;;;;;;;;-1:-1:-1;;;63483:35:0;;;;;;;;-1:-1:-1;;;63483:35:0;;;;;;;-1:-1:-1;;;63483:35:0;;-1:-1:-1;;;;;63483:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63502:16;;63483:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63529:20;63552:24;63567:8;63552:14;:24::i;:::-;63529:47;;63589:106;63603:8;63613:4;63619:12;63633:9;63644:21;63667:11;63680:14;63589:13;:106::i;:::-;63713:39;;63742:9;4522:25:1;;63730:10:0;;63720:8;;63713:39;;4510:2:1;4495:18;63713:39:0;;;;;;;63252:508;;63108:652;;;:::o;62635:435::-;62714:1;62701:9;:14;62697:39;;62724:12;;-1:-1:-1;;;62724:12:0;;;;;;;;;;;62697:39;62752:17;62760:8;62752:7;:17::i;:::-;62747:47;;62778:16;;-1:-1:-1;;;62778:16:0;;;;;;;;;;;62747:47;62807:16;62826;;;:6;:16;;;;;;;;62807:35;;;;;;;;;;;;;;;-1:-1:-1;;;62807:35:0;;;;;;;;-1:-1:-1;;;62807:35:0;;;;;;;-1:-1:-1;;;62807:35:0;;-1:-1:-1;;;;;62807:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62826:16;;62807:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62853:20;62876:24;62891:8;62876:14;:24::i;:::-;62853:47;;62913:92;62927:8;62937:4;62943:12;62957:9;62968:21;62999:1;63003;62913:13;:92::i;:::-;63023:39;;63052:9;4522:25:1;;63040:10:0;;63030:8;;63023:39;;4510:2:1;4495:18;63023:39:0;;;;;;;;62686:384;;62635:435;:::o;37183:201::-;36347:6;;-1:-1:-1;;;;;36347:6:0;16458:10;36494:23;36486:68;;;;-1:-1:-1;;;36486:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37272:22:0;::::1;37264:73;;;::::0;-1:-1:-1;;;37264:73:0;;21294:2:1;37264:73:0::1;::::0;::::1;21276:21:1::0;21333:2;21313:18;;;21306:30;21372:34;21352:18;;;21345:62;-1:-1:-1;;;21423:18:1;;;21416:36;21469:19;;37264:73:0::1;21092:402:1::0;37264:73:0::1;37348:28;37367:8;37348:18;:28::i;:::-;37183:201:::0;:::o;65429:94::-;36347:6;;-1:-1:-1;;;;;36347:6:0;16458:10;36494:23;36486:68;;;;-1:-1:-1;;;36486:68:0;;;;;;;:::i;:::-;58984:1:::1;65487:10;:28:::0;65429:94::o;50618:191::-;-1:-1:-1;;;;;50722:19:0;;50677:14;50722:19;;;:9;:19;;;;;;50774:5;50763:16;;;:38;;50786:15;50796:5;50786:7;:15;:::i;:::-;50763:38;;;50782:1;50763:38;50754:47;50618:191;-1:-1:-1;;;50618:191:0:o;65561:96::-;36347:6;;-1:-1:-1;;;;;36347:6:0;16458:10;36494:23;36486:68;;;;-1:-1:-1;;;36486:68:0;;;;;;;:::i;:::-;59036:1:::1;65620:10;:29:::0;65561:96::o;26851:348::-;26944:4;26969:16;26977:7;26969;:16::i;:::-;26961:73;;;;-1:-1:-1;;;26961:73:0;;21701:2:1;26961:73:0;;;21683:21:1;21740:2;21720:18;;;21713:30;21779:34;21759:18;;;21752:62;-1:-1:-1;;;21830:18:1;;;21823:42;21882:19;;26961:73:0;21499:408:1;26961:73:0;27045:13;27061:23;27076:7;27061:14;:23::i;:::-;27045:39;;27114:5;-1:-1:-1;;;;;27103:16:0;:7;-1:-1:-1;;;;;27103:16:0;;:51;;;;27147:7;-1:-1:-1;;;;;27123:31:0;:20;27135:7;27123:11;:20::i;:::-;-1:-1:-1;;;;;27123:31:0;;27103:51;:87;;;-1:-1:-1;;;;;;23943:25:0;;;23919:4;23943:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;27158:32;27095:96;26851:348;-1:-1:-1;;;;26851:348:0:o;26557:127::-;26622:4;26646:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26646:16:0;:30;;;26557:127::o;30703:174::-;30778:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;30778:29:0;-1:-1:-1;;;;;30778:29:0;;;;;;;;:24;;30832:23;30778:24;30832:14;:23::i;:::-;-1:-1:-1;;;;;30823:46:0;;;;;;;;;;;30703:174;;:::o;67376:1140::-;67475:16;67494;;;:6;:16;;;;;;;;67475:35;;;;;;;;;;;;;;;-1:-1:-1;;;67475:35:0;;;;;;;;-1:-1:-1;;;67475:35:0;;;;;;;-1:-1:-1;;;67475:35:0;;-1:-1:-1;;;;;67475:35:0;67432:30;67475:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67432:30;;67475:16;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67553:4;:13;;;67539:28;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;67539:28:0;-1:-1:-1;67665:11:0;;;;;67578:12;67658:19;;;:6;:19;;;;;;;;67637:40;;;;;;;;;;;;;;;-1:-1:-1;;;67637:40:0;;;;;;;;-1:-1:-1;;;67637:40:0;;;;;;;-1:-1:-1;;;67637:40:0;;-1:-1:-1;;;;;67637:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67523:44;;-1:-1:-1;67578:12:0;;;;67637:40;67658:19;;67637:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;67637:40:0;;;;-1:-1:-1;;67703:10:0;;67741:11;;;;67637:40;;-1:-1:-1;67703:10:0;67688:12;;-1:-1:-1;67741:16:0;:31;;67768:4;67741:31;;;67760:5;67741:31;67724:48;;67785:461;67792:9;67785:461;;;67857:20;;;;67818:36;67892:141;67915:5;67911:9;;:1;:9;;;67892:141;;;67969:19;67989:1;67969:22;;;;;;;;;;:::i;:::-;;;;;;;67946:13;67960:5;67946:20;;;;;;;;;;:::i;:::-;;;;;;;;;;:45;68010:7;;;;:::i;:::-;;;;67922:3;;;;;:::i;:::-;;;;67892:141;;;-1:-1:-1;68053:13:0;;;;68049:186;;68104:5;68092:17;;68049:186;;;68158:12;;68205:13;;;;;68158:12;68198:21;;;:6;:21;;;;;;;;;68189:30;;;;;;;;;;;;;;;-1:-1:-1;;;68189:30:0;;;;;;;;-1:-1:-1;;;68189:30:0;;;;;;;-1:-1:-1;;;68189:30:0;;-1:-1:-1;;;;;68189:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68158:12;;-1:-1:-1;68189:30:0;;68198:21;;68189:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68049:186;67803:443;67785:461;;;68328:18;;;;68288:37;68357:152;68380:20;:27;68376:1;:31;;;68357:152;;;68452:20;68473:1;68452:23;;;;;;;;;;:::i;:::-;;;;;;;68429:13;68443:5;68429:20;;;;;;;;;;:::i;:::-;;;;;;;;;;:46;68490:7;;;;:::i;:::-;;;;68409:3;;;;;:::i;:::-;;;;68357:152;;;;67464:1052;;;;;;67376:1140;;;:::o;29960:625::-;30119:4;-1:-1:-1;;;;;30092:31:0;:23;30107:7;30092:14;:23::i;:::-;-1:-1:-1;;;;;30092:31:0;;30084:81;;;;-1:-1:-1;;;30084:81:0;;22114:2:1;30084:81:0;;;22096:21:1;22153:2;22133:18;;;22126:30;22192:34;22172:18;;;22165:62;-1:-1:-1;;;22243:18:1;;;22236:35;22288:19;;30084:81:0;21912:401:1;30084:81:0;-1:-1:-1;;;;;30184:16:0;;30176:65;;;;-1:-1:-1;;;30176:65:0;;22520:2:1;30176:65:0;;;22502:21:1;22559:2;22539:18;;;22532:30;22598:34;22578:18;;;22571:62;-1:-1:-1;;;22649:18:1;;;22642:34;22693:19;;30176:65:0;22318:400:1;30176:65:0;30358:29;30375:1;30379:7;30358:8;:29::i;:::-;-1:-1:-1;;;;;30400:15:0;;;;;;:9;:15;;;;;:20;;30419:1;;30400:15;:20;;30419:1;;30400:20;:::i;:::-;;;;-1:-1:-1;;;;;;;30431:13:0;;;;;;:9;:13;;;;;:18;;30448:1;;30431:13;:18;;30448:1;;30431:18;:::i;:::-;;;;-1:-1:-1;;30460:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30460:21:0;-1:-1:-1;;;;;30460:21:0;;;;;;;;;30499:27;;30460:16;;30499:27;;;;;;;30539:38;30559:4;30565:2;30569:7;30539:19;:38::i;37544:191::-;37637:6;;;-1:-1:-1;;;;;37654:17:0;;;-1:-1:-1;;;;;;37654:17:0;;;;;;;37687:40;;37637:6;;;37654:17;37637:6;;37687:40;;37618:16;;37687:40;37607:128;37544:191;:::o;68784:1078::-;68850:19;;:::i;:::-;68871:18;68907:17;68915:8;68907:7;:17::i;:::-;68902:47;;68933:16;;-1:-1:-1;;;68933:16:0;;;;;;;;;;;68902:47;68962:16;68981;;;:6;:16;;;;;;;;68962:35;;;;;;;;;;;;;;;-1:-1:-1;;;68962:35:0;;;;;;;;-1:-1:-1;;;68962:35:0;;;;;;;-1:-1:-1;;;68962:35:0;;-1:-1:-1;;;;;68962:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68981:16;;68962:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;68962:35:0;;;;-1:-1:-1;;;69033:18:0;;;;:25;69088:13;;;;68962:35;;-1:-1:-1;69033:25:0;69118:13;;;;;:28;;-1:-1:-1;69135:11:0;;;;69118:28;:49;;;;69161:6;69150:17;;:8;:17;;;69118:49;69114:88;;;69176:26;;-1:-1:-1;;;69176:26:0;;23030:10:1;23018:23;;69176:26:0;;;23000:42:1;22973:18;;69176:26:0;22856:192:1;69114:88:0;69229:4;:14;;;69217:9;:26;69213:84;;;69282:14;;;;69252:45;;-1:-1:-1;;;69252:45:0;;69271:9;69252:45;;;14490:25:1;14531:18;;;14524:34;;;;14463:18;;69252:45:0;14316:248:1;69213:84:0;69352:17;69358:10;69352:5;:17::i;:::-;69415:16;;;69382:30;69415:16;;69452:286;;;;;;;;69415:16;;;69452:286;;;69339:30;;-1:-1:-1;69415:16:0;;69452:286;;69479:6;69510:19;69521:8;69510;:19;:::i;:::-;:28;;;;:::i;:::-;69452:286;;;;;;69568:1;69452:286;;;;;;69603:15;-1:-1:-1;;;;;69452:286:0;;;;;69642:8;69452:286;;;;69676:7;69452:286;;;;69713:13;69452:286;;;69442:296;;69772:7;69751:6;:18;69758:10;69751:18;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;69751:28:0;;;;;-1:-1:-1;;;;;69751:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;69797:57:0;;;23714:10:1;23702:23;;23684:42;;69844:9:0;23757:2:1;23742:18;;23735:34;69824:10:0;;-1:-1:-1;69812:10:0;;69802:8;;69797:57;;23657:18:1;69797:57:0;;;;;;;68891:971;;;;68784:1078;;;;;:::o;70333:2114::-;70611:14;;;;70593:15;70669;70675:8;70669:5;:15::i;:::-;70636:48;;70726:28;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;70726:28:0;70765:19;-1:-1:-1;;;;;70787:25:0;;;;:48;;-1:-1:-1;70816:19:0;;70787:48;70765:70;;70851:14;70846:100;;70929:5;70901:24;70911:14;70901:7;:24;:::i;:::-;70900:34;;;;:::i;:::-;70882:52;;70846:100;70974:1;70962:8;:13;;;70958:283;;71022:15;;71012:25;;:7;:25;:::i;:::-;70992:17;;;:45;70958:283;;;71131:5;71091:36;58834:4;71091:7;:36;:::i;:::-;71090:46;;;;:::i;:::-;71070:17;;;:66;;;71202:15;;71171:58;;;;71172:27;;:7;:27;:::i;:::-;:45;;;;:::i;:::-;71171:58;;;;:::i;:::-;71151:17;;;:78;70958:283;71336:4;:17;;;71308:9;:24;71318:13;-1:-1:-1;;;;;71308:24:0;-1:-1:-1;;;;;71308:24:0;;;;;;;;;;;;;:45;;;;;;;:::i;:::-;;;;;;;;71464:13;-1:-1:-1;;;;;71369:192:0;71428:10;-1:-1:-1;;;;;71369:192:0;71397:8;71369:192;71500:4;:17;;;71541:8;71369:192;;;;;;;:::i;:::-;;;;;;;;71605:14;71600:321;;71662:15;;-1:-1:-1;;;;;71636:22:0;;71662:15;71636:22;;;:9;:22;;;;;:41;;:22;;71662:15;71636:41;;71662:15;;71636:41;:::i;:::-;;;;-1:-1:-1;;71842:15:0;;71697:212;;-1:-1:-1;;;;;71697:212:0;;;71764:10;;71729:8;;71697:212;;;;71842:15;71885:8;;71697:212;:::i;:::-;;;;;;;;71600:321;71966:12;;;;71962:478;;72000:8;71995:434;72018:8;72014:12;;:1;:12;;;71995:434;;;72052:14;72069:4;:22;72074:13;72088:1;72074:16;;;;;;;;;;:::i;:::-;;;;;;;;;;;;72069:22;;;;;;;;;;;;;-1:-1:-1;72069:22:0;;;72052:39;;;;;;;;;-1:-1:-1;;;;;72052:39:0;;;;;;;;;;;;;72135:17;;;;72110:21;;;:9;:21;;;;;;:42;;72052:39;;-1:-1:-1;72135:17:0;;72110:42;;72135:17;;72110:42;:::i;:::-;;;;;;;;72295:3;:10;;;-1:-1:-1;;;;;72176:237:0;72251:10;-1:-1:-1;;;;;72176:237:0;72212:8;72176:237;72336:4;:17;;;72385:8;72176:237;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;72028:3:0;;;;:::i;:::-;;;;71995:434;;;;71962:478;70582:1865;;;;70333:2114;;;;;;;:::o;31019:315::-;31174:8;-1:-1:-1;;;;;31165:17:0;:5;-1:-1:-1;;;;;31165:17:0;;;31157:55;;;;-1:-1:-1;;;31157:55:0;;24835:2:1;31157:55:0;;;24817:21:1;24874:2;24854:18;;;24847:30;24913:27;24893:18;;;24886:55;24958:18;;31157:55:0;24633:349:1;31157:55:0;-1:-1:-1;;;;;31223:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;31223:46:0;;;;;;;;;;31285:41;;540::1;;;31285::0;;513:18:1;31285:41:0;400:187:1;27541:110:0;27617:26;27627:2;27631:7;27617:26;;;;;;;;;;;;:9;:26::i;25929:315::-;26086:28;26096:4;26102:2;26106:7;26086:9;:28::i;:::-;26133:48;26156:4;26162:2;26166:7;26175:5;26133:22;:48::i;:::-;26125:111;;;;-1:-1:-1;;;26125:111:0;;;;;;;:::i;16876:723::-;16932:13;17153:10;17149:53;;-1:-1:-1;;17180:10:0;;;;;;;;;;;;-1:-1:-1;;;17180:10:0;;;;;16876:723::o;17149:53::-;17227:5;17212:12;17268:78;17275:9;;17268:78;;17301:8;;;;:::i;:::-;;-1:-1:-1;17324:10:0;;-1:-1:-1;17332:2:0;17324:10;;:::i;:::-;;;17268:78;;;17356:19;17388:6;17378:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17378:17:0;;17356:39;;17406:154;17413:10;;17406:154;;17440:11;17450:1;17440:11;;:::i;:::-;;-1:-1:-1;17509:10:0;17517:2;17509:5;:10;:::i;:::-;17496:24;;:2;:24;:::i;:::-;17483:39;;17466:6;17473;17466:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;17466:56:0;;;;;;;;-1:-1:-1;17537:11:0;17546:2;17537:11;;:::i;:::-;;;17406:154;;50978:507;51047:17;51260:29;51282:6;51260:21;:29::i;:::-;51308:25;51326:6;51308:17;:25::i;:::-;51352;51370:6;51352:17;:25::i;:::-;51396:24;51413:6;51396:16;:24::i;:::-;51104:362;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51077:400;;50978:507;;;:::o;38100:3053::-;38158:13;38395:4;:11;38410:1;38395:16;38391:31;;;-1:-1:-1;;38413:9:0;;;;;;;;;-1:-1:-1;38413:9:0;;;38100:3053::o;38391:31::-;38475:19;38497:6;;;;;;;;;;;;;;;;;38475:28;;38914:20;38973:1;38954:4;:11;38968:1;38954:15;;;;:::i;:::-;38953:21;;;;:::i;:::-;38948:27;;:1;:27;:::i;:::-;38937:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38937:39:0;;38914:62;;39112:1;39105:5;39101:13;39216:2;39208:6;39204:15;39327:4;39379;39373:11;39367:4;39363:22;39289:1432;39413:6;39404:7;39401:19;39289:1432;;;39519:1;39510:7;39506:15;39495:26;;39558:7;39552:14;40211:4;40203:5;40199:2;40195:14;40191:25;40181:8;40177:40;40171:47;40160:9;40152:67;40265:1;40254:9;40250:17;40237:30;;40357:4;40349:5;40345:2;40341:14;40337:25;40327:8;40323:40;40317:47;40306:9;40298:67;40411:1;40400:9;40396:17;40383:30;;40502:4;40494:5;40491:1;40487:13;40483:24;40473:8;40469:39;40463:46;40452:9;40444:66;40556:1;40545:9;40541:17;40528:30;;40639:4;40632:5;40628:16;40618:8;40614:31;40608:38;40597:9;40589:58;;40693:1;40682:9;40678:17;40665:30;;39289:1432;;;39293:107;;40883:1;40876:4;40870:11;40866:19;40904:1;40899:123;;;;41041:1;41036:73;;;;40859:250;;40899:123;40952:4;40948:1;40937:9;40933:17;40925:32;41002:4;40998:1;40987:9;40983:17;40975:32;40899:123;;41036:73;41089:4;41085:1;41074:9;41070:17;41062:32;40859:250;-1:-1:-1;41139:6:0;;38100:3053;-1:-1:-1;;;;;38100:3053:0:o;68524:252::-;68569:15;68597:27;:15;34912:19;;34930:1;34912:19;;;34823:127;68597:27;-1:-1:-1;68645:15:0;34793:14;68681:22;68691:2;34793:14;68681:9;:22::i;:::-;68716:15;;;;:6;:15;;;;;:52;;;;-1:-1:-1;;;68752:15:0;-1:-1:-1;;;;;68716:52:0;;;;;:15;68723:7;-1:-1:-1;68524:252:0:o;72455:427::-;72681:16;;;;:6;:16;;;;;:32;;-1:-1:-1;;;72681:32:0;;;;;:30;:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;72805:14:0;;-1:-1:-1;72805:14:0;;;:9;:14;;;;;;72801:74;;-1:-1:-1;;;;;;72841:14:0;;;;;:9;:14;;;;;72858:5;72841:22;;-1:-1:-1;72455:427:0:o;27878:321::-;28008:18;28014:2;28018:7;28008:5;:18::i;:::-;28059:54;28090:1;28094:2;28098:7;28107:5;28059:22;:54::i;:::-;28037:154;;;;-1:-1:-1;;;28037:154:0;;;;;;;:::i;31899:799::-;32054:4;-1:-1:-1;;;;;32075:13:0;;8805:19;:23;32071:620;;32111:72;;-1:-1:-1;;;32111:72:0;;-1:-1:-1;;;;;32111:36:0;;;;;:72;;16458:10;;32162:4;;32168:7;;32177:5;;32111:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32111:72:0;;;;;;;;-1:-1:-1;;32111:72:0;;;;;;;;;;;;:::i;:::-;;;32107:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32353:13:0;;32349:272;;32396:60;;-1:-1:-1;;;32396:60:0;;;;;;;:::i;32349:272::-;32571:6;32565:13;32556:6;32552:2;32548:15;32541:38;32107:529;-1:-1:-1;;;;;;32234:51:0;-1:-1:-1;;;32234:51:0;;-1:-1:-1;32227:58:0;;32071:620;-1:-1:-1;32675:4:0;31899:799;;;;;;:::o;51493:296::-;51572:17;51602:29;51652:2;51634:6;:15;;;:20;;;:44;;;;;;;;;;;;;;;-1:-1:-1;;;51634:44:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51634:44:0;;;;51602:76;;51757:15;51704:76;;;;;;;;:::i;:::-;;;;;;;;;;;;;51691:90;;51591:198;51493:296;;;:::o;51797:2138::-;51872:17;51902:19;52005:98;52098:3;52065:24;52070:6;:15;;;52065:24;;52087:1;52065:4;:24::i;:::-;52048:6;:14;;;52029:6;:16;;;-1:-1:-1;;;;;52029:33:0;;;;;:::i;:::-;:60;;;;:::i;:::-;:65;;52092:2;52029:65;:::i;:::-;52028:73;;;;:::i;:::-;52005:98;;:16;:98::i;:::-;52144:77;52216:3;52187:6;:20;;;52168:39;;:6;:16;;;:39;;;;:::i;:::-;:44;;52210:2;52168:44;:::i;:::-;52167:52;;;;:::i;52144:77::-;52262:45;52302:3;52285:6;:14;;;:20;;;;:::i;52262:45::-;51945:399;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51902:453;;53872:5;52395:1521;;;;;;;;:::i;53943:2472::-;54018:17;54048:19;54151:98;54244:3;54211:24;54216:6;:15;;;54211:24;;54233:1;54211:4;:24::i;:::-;54194:6;:14;;;54175:6;:16;;;-1:-1:-1;;;;;54175:33:0;;;;;:::i;:::-;:60;;;;:::i;:::-;:65;;54238:2;54175:65;:::i;54151:98::-;54290:77;54362:3;54333:6;:20;;;54314:39;;:6;:16;;;:39;;;;:::i;:::-;:44;;54356:2;54314:44;:::i;54290:77::-;54408:45;54448:3;54431:6;:14;;;:20;;;;:::i;54408:45::-;54091:399;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54048:453;;56352:5;54541:1855;;;;;;;;:::i;56423:2174::-;56497:17;56527:29;56577:2;56559:6;:15;;;:20;;;:44;;;;;;;;;;;;;;;-1:-1:-1;;;56559:44:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;56559:44:0;;;;56527:76;;56614:23;56658:2;56640:6;:15;;;:20;;;:38;;;;;;;;;;;;;;;-1:-1:-1;;;56640:38:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;56640:38:0;;;;56614:64;;56691:22;;:::i;:::-;56844:9;57054;56776:370;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;56776:370:0;;;;;;56744:413;;57314:15;;56750:1;;57297:33;;;;:16;:33::i;:::-;57384:42;57424:1;57401:6;:20;;;:24;;;;:::i;:::-;57384:42;;:16;:42::i;:::-;57473:32;57490:6;:14;;;57473:16;:32::i;:::-;57236:284;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;57236:284:0;;;;;;;;;57558:21;;57236:284;;-1:-1:-1;57590:26:0;57544:11;57627:119;57651:3;57647:1;:7;57627:119;;;57715:12;57698:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;57676:58;;57656:3;;;;;:::i;:::-;;;;57627:119;;;;57858:15;58015:9;58090:12;57788:365;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;57788:365:0;;;;;;57756:8;;;;:408;;;;58207:298;;;58275:9;;58447:7;;58207:298;;:::i;:::-;;;;;;;-1:-1:-1;;58207:298:0;;;;;;58175:8;;;:341;;;58559:8;;58175;58569;;;;58542:46;;;;58559:8;;58569;58207:298;58542:46;;:::i;:::-;;;;;;;;;;;;;58529:60;;56516:2081;;;;;;56423:2174;;;:::o;28535:439::-;-1:-1:-1;;;;;28615:16:0;;28607:61;;;;-1:-1:-1;;;28607:61:0;;44883:2:1;28607:61:0;;;44865:21:1;;;44902:18;;;44895:30;44961:34;44941:18;;;44934:62;45013:18;;28607:61:0;44681:356:1;28607:61:0;28688:16;28696:7;28688;:16::i;:::-;28687:17;28679:58;;;;-1:-1:-1;;;28679:58:0;;45244:2:1;28679:58:0;;;45226:21:1;45283:2;45263:18;;;45256:30;45322;45302:18;;;45295:58;45370:18;;28679:58:0;45042:352:1;28679:58:0;-1:-1:-1;;;;;28808:13:0;;;;;;:9;:13;;;;;:18;;28825:1;;28808:13;:18;;28825:1;;28808:18;:::i;:::-;;;;-1:-1:-1;;28837:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;28837:21:0;-1:-1:-1;;;;;28837:21:0;;;;;;;;28876:33;;28837:16;;;28876:33;;28837:16;;28876:33;28922:44;28950:1;28954:2;28958:7;28922:19;:44::i;58605:108::-;58664:7;58696:1;58691;:6;;:14;;58704:1;58691:14;;;-1:-1:-1;58700:1:0;;58684:21;-1:-1:-1;58605:108:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;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;592:660::-;672:6;680;688;741:2;729:9;720:7;716:23;712:32;709:52;;;757:1;754;747:12;709:52;793:9;780:23;770:33;;854:2;843:9;839:18;826:32;877:18;918:2;910:6;907:14;904:34;;;934:1;931;924:12;904:34;972:6;961:9;957:22;947:32;;1017:7;1010:4;1006:2;1002:13;998:27;988:55;;1039:1;1036;1029:12;988:55;1079:2;1066:16;1105:2;1097:6;1094:14;1091:34;;;1121:1;1118;1111:12;1091:34;1166:7;1161:2;1152:6;1148:2;1144:15;1140:24;1137:37;1134:57;;;1187:1;1184;1177:12;1134:57;1218:2;1214;1210:11;1200:21;;1240:6;1230:16;;;;;592:660;;;;;:::o;1257:258::-;1329:1;1339:113;1353:6;1350:1;1347:13;1339:113;;;1429:11;;;1423:18;1410:11;;;1403:39;1375:2;1368:10;1339:113;;;1470:6;1467:1;1464:13;1461:48;;;-1:-1:-1;;1505:1:1;1487:16;;1480:27;1257:258::o;1520:269::-;1573:3;1611:5;1605:12;1638:6;1633:3;1626:19;1654:63;1710:6;1703:4;1698:3;1694:14;1687:4;1680:5;1676:16;1654:63;:::i;:::-;1771:2;1750:15;-1:-1:-1;;1746:29:1;1737:39;;;;1778:4;1733:50;;1520:269;-1:-1:-1;;1520:269:1:o;1794:231::-;1943:2;1932:9;1925:21;1906:4;1963:56;2015:2;2004:9;2000:18;1992:6;1963:56;:::i;2030:180::-;2089:6;2142:2;2130:9;2121:7;2117:23;2113:32;2110:52;;;2158:1;2155;2148:12;2110:52;-1:-1:-1;2181:23:1;;2030:180;-1:-1:-1;2030:180:1:o;2423:173::-;2491:20;;-1:-1:-1;;;;;2540:31:1;;2530:42;;2520:70;;2586:1;2583;2576:12;2520:70;2423:173;;;:::o;2601:254::-;2669:6;2677;2730:2;2718:9;2709:7;2705:23;2701:32;2698:52;;;2746:1;2743;2736:12;2698:52;2769:29;2788:9;2769:29;:::i;:::-;2759:39;2845:2;2830:18;;;;2817:32;;-1:-1:-1;;;2601:254:1:o;2860:1178::-;3128:2;3140:21;;;3210:13;;3113:18;;;3232:22;;;3080:4;;3307;;3285:2;3270:18;;;3334:15;;;3080:4;3377:169;3391:6;3388:1;3385:13;3377:169;;;3452:13;;3440:26;;3486:12;;;;3521:15;;;;3413:1;3406:9;3377:169;;;-1:-1:-1;;;3582:19:1;;;3562:18;;;3555:47;3652:13;;3674:21;;;3750:15;;;;3713:12;;;3785:1;3795:215;3811:8;3806:3;3803:17;3795:215;;;3884:15;;-1:-1:-1;;;;;3880:41:1;3866:56;;3983:17;;;;3944:14;;;;3918:1;3830:11;3795:215;;;-1:-1:-1;4027:5:1;;2860:1178;-1:-1:-1;;;;;;;2860:1178:1:o;4043:328::-;4120:6;4128;4136;4189:2;4177:9;4168:7;4164:23;4160:32;4157:52;;;4205:1;4202;4195:12;4157:52;4228:29;4247:9;4228:29;:::i;:::-;4218:39;;4276:38;4310:2;4299:9;4295:18;4276:38;:::i;:::-;4266:48;;4361:2;4350:9;4346:18;4333:32;4323:42;;4043:328;;;;;:::o;4558:186::-;4617:6;4670:2;4658:9;4649:7;4645:23;4641:32;4638:52;;;4686:1;4683;4676:12;4638:52;4709:29;4728:9;4709:29;:::i;4749:248::-;4817:6;4825;4878:2;4866:9;4857:7;4853:23;4849:32;4846:52;;;4894:1;4891;4884:12;4846:52;-1:-1:-1;;4917:23:1;;;4987:2;4972:18;;;4959:32;;-1:-1:-1;4749:248:1:o;5002:163::-;5069:20;;5129:10;5118:22;;5108:33;;5098:61;;5155:1;5152;5145:12;5170:395;5255:6;5263;5271;5279;5332:3;5320:9;5311:7;5307:23;5303:33;5300:53;;;5349:1;5346;5339:12;5300:53;5385:9;5372:23;5362:33;;5414:37;5447:2;5436:9;5432:18;5414:37;:::i;:::-;5404:47;;5470:38;5504:2;5493:9;5489:18;5470:38;:::i;:::-;5170:395;;;;-1:-1:-1;5460:48:1;;5555:2;5540:18;5527:32;;-1:-1:-1;;5170:395:1:o;6034:347::-;6099:6;6107;6160:2;6148:9;6139:7;6135:23;6131:32;6128:52;;;6176:1;6173;6166:12;6128:52;6199:29;6218:9;6199:29;:::i;:::-;6189:39;;6278:2;6267:9;6263:18;6250:32;6325:5;6318:13;6311:21;6304:5;6301:32;6291:60;;6347:1;6344;6337:12;6291:60;6370:5;6360:15;;;6034:347;;;;;:::o;6386:1167::-;6522:4;6551:2;6580;6569:9;6562:21;6621:3;6610:9;6606:19;6644:10;6709:2;6700:6;6694:13;6690:22;6685:2;6674:9;6670:18;6663:50;6777:2;6771;6763:6;6759:15;6753:22;6749:31;6744:2;6733:9;6729:18;6722:59;6845:2;6839;6831:6;6827:15;6821:22;6817:31;6812:2;6801:9;6797:18;6790:59;;6931:1;6927;6922:3;6918:11;6914:19;6908:2;6900:6;6896:15;6890:22;6886:48;6880:3;6869:9;6865:19;6858:77;6990:3;6982:6;6978:16;6972:23;6966:3;6955:9;6951:19;6944:52;7051:3;7043:6;7039:16;7033:23;7027:3;7016:9;7012:19;7005:52;7104:3;7096:6;7092:16;7086:23;7147:4;7140;7129:9;7125:20;7118:34;7172:6;7207:12;7201:19;7244:6;7236;7229:22;7282:3;7271:9;7267:19;7260:26;;7327:2;7313:12;7309:21;7295:35;;7348:1;7339:10;;7358:169;7372:6;7369:1;7366:13;7358:169;;;7433:13;;7421:26;;7502:15;;;;7394:1;7387:9;;;;;7467:12;;;;7358:169;;;-1:-1:-1;7544:3:1;6386:1167;-1:-1:-1;;;;;;6386:1167:1:o;7558:626::-;7655:6;7663;7716:2;7704:9;7695:7;7691:23;7687:32;7684:52;;;7732:1;7729;7722:12;7684:52;7772:9;7759:23;7801:18;7842:2;7834:6;7831:14;7828:34;;;7858:1;7855;7848:12;7828:34;7896:6;7885:9;7881:22;7871:32;;7941:7;7934:4;7930:2;7926:13;7922:27;7912:55;;7963:1;7960;7953:12;7912:55;8003:2;7990:16;8029:2;8021:6;8018:14;8015:34;;;8045:1;8042;8035:12;8015:34;8098:7;8093:2;8083:6;8080:1;8076:14;8072:2;8068:23;8064:32;8061:45;8058:65;;;8119:1;8116;8109:12;8058:65;8150:2;8142:11;;;;;8172:6;;-1:-1:-1;7558:626:1;;-1:-1:-1;;;;7558:626:1:o;8189:812::-;8349:4;8378:2;8418;8407:9;8403:18;8448:2;8437:9;8430:21;8471:6;8506;8500:13;8537:6;8529;8522:22;8575:2;8564:9;8560:18;8553:25;;8637:2;8627:6;8624:1;8620:14;8609:9;8605:30;8601:39;8587:53;;8675:2;8667:6;8663:15;8696:1;8706:266;8720:6;8717:1;8714:13;8706:266;;;8813:2;8809:7;8797:9;8789:6;8785:22;8781:36;8776:3;8769:49;8841:51;8885:6;8876;8870:13;8841:51;:::i;:::-;8831:61;-1:-1:-1;8950:12:1;;;;8915:15;;;;8742:1;8735:9;8706:266;;;-1:-1:-1;8989:6:1;;8189:812;-1:-1:-1;;;;;;;8189:812:1:o;9006:127::-;9067:10;9062:3;9058:20;9055:1;9048:31;9098:4;9095:1;9088:15;9122:4;9119:1;9112:15;9138:1138;9233:6;9241;9249;9257;9310:3;9298:9;9289:7;9285:23;9281:33;9278:53;;;9327:1;9324;9317:12;9278:53;9350:29;9369:9;9350:29;:::i;:::-;9340:39;;9398:38;9432:2;9421:9;9417:18;9398:38;:::i;:::-;9388:48;;9483:2;9472:9;9468:18;9455:32;9445:42;;9538:2;9527:9;9523:18;9510:32;9561:18;9602:2;9594:6;9591:14;9588:34;;;9618:1;9615;9608:12;9588:34;9656:6;9645:9;9641:22;9631:32;;9701:7;9694:4;9690:2;9686:13;9682:27;9672:55;;9723:1;9720;9713:12;9672:55;9759:2;9746:16;9781:2;9777;9774:10;9771:36;;;9787:18;;:::i;:::-;9862:2;9856:9;9830:2;9916:13;;-1:-1:-1;;9912:22:1;;;9936:2;9908:31;9904:40;9892:53;;;9960:18;;;9980:22;;;9957:46;9954:72;;;10006:18;;:::i;:::-;10046:10;10042:2;10035:22;10081:2;10073:6;10066:18;10121:7;10116:2;10111;10107;10103:11;10099:20;10096:33;10093:53;;;10142:1;10139;10132:12;10093:53;10198:2;10193;10189;10185:11;10180:2;10172:6;10168:15;10155:46;10243:1;10238:2;10233;10225:6;10221:15;10217:24;10210:35;10264:6;10254:16;;;;;;;9138:1138;;;;;;;:::o;10281:252::-;10348:6;10356;10409:2;10397:9;10388:7;10384:23;10380:32;10377:52;;;10425:1;10422;10415:12;10377:52;10461:9;10448:23;10438:33;;10490:37;10523:2;10512:9;10508:18;10490:37;:::i;:::-;10480:47;;10281:252;;;;;:::o;10538:260::-;10606:6;10614;10667:2;10655:9;10646:7;10642:23;10638:32;10635:52;;;10683:1;10680;10673:12;10635:52;10706:29;10725:9;10706:29;:::i;:::-;10696:39;;10754:38;10788:2;10777:9;10773:18;10754:38;:::i;10803:322::-;10880:6;10888;10896;10949:2;10937:9;10928:7;10924:23;10920:32;10917:52;;;10965:1;10962;10955:12;10917:52;11001:9;10988:23;10978:33;;11030:38;11064:2;11053:9;11049:18;11030:38;:::i;11130:273::-;11315:6;11307;11302:3;11289:33;11271:3;11341:16;;11366:13;;;11341:16;11130:273;-1:-1:-1;11130:273:1:o;11408:390::-;11567:2;11556:9;11549:21;11606:6;11601:2;11590:9;11586:18;11579:34;11663:6;11655;11650:2;11639:9;11635:18;11622:48;11719:1;11690:22;;;11714:2;11686:31;;;11679:42;;;;11782:2;11761:15;;;-1:-1:-1;;11757:29:1;11742:45;11738:54;;11408:390;-1:-1:-1;11408:390:1:o;11803:127::-;11864:10;11859:3;11855:20;11852:1;11845:31;11895:4;11892:1;11885:15;11919:4;11916:1;11909:15;11935:201;11973:3;12001:10;12046:2;12039:5;12035:14;12073:2;12064:7;12061:15;12058:41;;;12079:18;;:::i;:::-;12128:1;12115:15;;11935:201;-1:-1:-1;;;11935:201:1:o;12141:380::-;12220:1;12216:12;;;;12263;;;12284:61;;12338:4;12330:6;12326:17;12316:27;;12284:61;12391:2;12383:6;12380:14;12360:18;12357:38;12354:161;;;12437:10;12432:3;12428:20;12425:1;12418:31;12472:4;12469:1;12462:15;12500:4;12497:1;12490:15;12354:161;;12141:380;;;:::o;13766:127::-;13827:10;13822:3;13818:20;13815:1;13808:31;13858:4;13855:1;13848:15;13882:4;13879:1;13872:15;13898:413;14100:2;14082:21;;;14139:2;14119:18;;;14112:30;14178:34;14173:2;14158:18;;14151:62;-1:-1:-1;;;14244:2:1;14229:18;;14222:47;14301:3;14286:19;;13898:413::o;15600:356::-;15802:2;15784:21;;;15821:18;;;15814:30;15880:34;15875:2;15860:18;;15853:62;15947:2;15932:18;;15600:356::o;15961:125::-;16001:4;16029:1;16026;16023:8;16020:34;;;16034:18;;:::i;:::-;-1:-1:-1;16071:9:1;;15961:125::o;16624:521::-;16701:4;16707:6;16767:11;16754:25;16861:2;16857:7;16846:8;16830:14;16826:29;16822:43;16802:18;16798:68;16788:96;;16880:1;16877;16870:12;16788:96;16907:33;;16959:20;;;-1:-1:-1;17002:18:1;16991:30;;16988:50;;;17034:1;17031;17024:12;16988:50;17067:4;17055:17;;-1:-1:-1;17098:14:1;17094:27;;;17084:38;;17081:58;;;17135:1;17132;17125:12;17081:58;16624:521;;;;;:::o;17426:135::-;17465:3;-1:-1:-1;;17486:17:1;;17483:43;;;17506:18;;:::i;:::-;-1:-1:-1;17553:1:1;17542:13;;17426:135::o;17566:185::-;17608:3;17646:5;17640:12;17661:52;17706:6;17701:3;17694:4;17687:5;17683:16;17661:52;:::i;:::-;17729:16;;;;;17566:185;-1:-1:-1;;17566:185:1:o;17756:426::-;-1:-1:-1;;;18013:3:1;18006:24;17988:3;18059:6;18053:13;18075:61;18129:6;18125:1;18120:3;18116:11;18109:4;18101:6;18097:17;18075:61;:::i;:::-;18156:16;;;;18174:1;18152:24;;17756:426;-1:-1:-1;;17756:426:1:o;18187:649::-;18550:66;18545:3;18538:79;18520:3;18646:6;18640:13;18662:62;18717:6;18712:2;18707:3;18703:12;18696:4;18688:6;18684:17;18662:62;:::i;:::-;-1:-1:-1;;;18783:2:1;18743:16;;;;18775:11;;;18768:35;-1:-1:-1;18827:2:1;18819:11;;18187:649;-1:-1:-1;18187:649:1:o;18841:1793::-;-1:-1:-1;;;19639:45:1;;19707:13;;19621:3;;19729:62;19707:13;19779:2;19770:12;;19763:4;19751:17;;19729:62;:::i;:::-;-1:-1:-1;;;19850:2:1;19810:16;;;19842:11;;;19835:71;19931:13;;19953:63;19931:13;20002:2;19994:11;;19987:4;19975:17;;19953:63;:::i;:::-;-1:-1:-1;;;20076:2:1;20035:17;;;;20068:11;;;20061:69;20155:13;;20177:63;20155:13;20226:2;20218:11;;20211:4;20199:17;;20177:63;:::i;:::-;20305:66;20300:2;20259:17;;;;20292:11;;;20285:87;-1:-1:-1;;;20396:2:1;20388:11;;20381:30;20436:13;;20458:63;20436:13;20507:2;20499:11;;20492:4;20480:17;;20458:63;:::i;:::-;-1:-1:-1;;;20581:2:1;20540:17;;;;20573:11;;;20566:35;20625:2;20617:11;;18841:1793;-1:-1:-1;;;;;;18841:1793:1:o;20639:448::-;20901:31;20896:3;20889:44;20871:3;20962:6;20956:13;20978:62;21033:6;21028:2;21023:3;21019:12;21012:4;21004:6;21000:17;20978:62;:::i;:::-;21060:16;;;;21078:2;21056:25;;20639:448;-1:-1:-1;;20639:448:1:o;22723:128::-;22763:3;22794:1;22790:6;22787:1;22784:13;22781:39;;;22800:18;;:::i;:::-;-1:-1:-1;22836:9:1;;22723:128::o;23053:221::-;23092:4;23121:10;23181;;;;23151;;23203:12;;;23200:38;;;23218:18;;:::i;:::-;23255:13;;23053:221;-1:-1:-1;;;23053:221:1:o;23279:228::-;23318:3;23346:10;23383:2;23380:1;23376:10;23413:2;23410:1;23406:10;23444:3;23440:2;23436:12;23431:3;23428:21;23425:47;;;23452:18;;:::i;:::-;23488:13;;23279:228;-1:-1:-1;;;;23279:228:1:o;23780:168::-;23820:7;23886:1;23882;23878:6;23874:14;23871:1;23868:21;23863:1;23856:9;23849:17;23845:45;23842:71;;;23893:18;;:::i;:::-;-1:-1:-1;23933:9:1;;23780:168::o;23953:127::-;24014:10;24009:3;24005:20;24002:1;23995:31;24045:4;24042:1;24035:15;24069:4;24066:1;24059:15;24085:120;24125:1;24151;24141:35;;24156:18;;:::i;:::-;-1:-1:-1;24190:9:1;;24085:120::o;24210:418::-;24401:25;;;24389:2;24374:18;;24456:1;24445:13;;24435:144;;24501:10;24496:3;24492:20;24489:1;24482:31;24536:4;24533:1;24526:15;24564:4;24561:1;24554:15;24435:144;24615:6;24610:2;24599:9;24595:18;24588:34;24210:418;;;;;:::o;24987:414::-;25189:2;25171:21;;;25228:2;25208:18;;;25201:30;25267:34;25262:2;25247:18;;25240:62;-1:-1:-1;;;25333:2:1;25318:18;;25311:48;25391:3;25376:19;;24987:414::o;25406:112::-;25438:1;25464;25454:35;;25469:18;;:::i;:::-;-1:-1:-1;25503:9:1;;25406:112::o;25523:1472::-;26030:66;26025:3;26018:79;26127:66;26122:2;26117:3;26113:12;26106:88;26224:66;26219:2;26214:3;26210:12;26203:88;26330:10;26325:3;26321:20;26316:2;26311:3;26307:12;26300:42;26000:3;26371:6;26365:13;26387:61;26441:6;26435:3;26430;26426:13;26421:2;26413:6;26409:15;26387:61;:::i;:::-;26508:13;;26467:16;;;;26530:62;26508:13;26577:3;26569:12;;26564:2;26552:15;;26530:62;:::i;:::-;26653:13;;26611:17;;;26675:62;26653:13;26722:3;26714:12;;26709:2;26697:15;;26675:62;:::i;:::-;26798:13;;26756:17;;;26820:62;26798:13;26867:3;26859:12;;26854:2;26842:15;;26820:62;:::i;:::-;-1:-1:-1;;;26942:3:1;26901:17;;;;26934:12;;;26927:34;26985:3;26977:12;;25523:1472;-1:-1:-1;;;;;;25523:1472:1:o;27000:500::-;-1:-1:-1;;;;;27269:15:1;;;27251:34;;27321:15;;27316:2;27301:18;;27294:43;27368:2;27353:18;;27346:34;;;27416:3;27411:2;27396:18;;27389:31;;;27194:4;;27437:57;;27474:19;;27466:6;27437:57;:::i;:::-;27429:65;27000:500;-1:-1:-1;;;;;;27000:500:1:o;27505:249::-;27574:6;27627:2;27615:9;27606:7;27602:23;27598:32;27595:52;;;27643:1;27640;27633:12;27595:52;27675:9;27669:16;27694:30;27718:5;27694:30;:::i;27892:650::-;28255:66;28250:3;28243:79;28225:3;28351:6;28345:13;28367:60;28420:6;28415:2;28410:3;28406:12;28401:2;28393:6;28389:15;28367:60;:::i;:::-;-1:-1:-1;;;28486:2:1;28446:16;;;;28478:11;;;28471:38;-1:-1:-1;28533:2:1;28525:11;;27892:650;-1:-1:-1;27892:650:1:o;28547:272::-;28587:7;-1:-1:-1;;;;;28658:10:1;;;28688;;;28721:11;;28714:19;28743:12;;;28735:21;;28710:47;28707:73;;;28760:18;;:::i;:::-;28800:13;;28547:272;-1:-1:-1;;;;28547:272:1:o;28824:193::-;28856:1;-1:-1:-1;;;;;28921:10:1;;;;28940:37;;28957:18;;:::i;:::-;28995:10;;28991:20;;;;;28824:193;-1:-1:-1;;28824:193:1:o;29022:1247::-;-1:-1:-1;;;29678:3:1;29671:19;29653:3;29719:6;29713:13;29735:61;29789:6;29785:1;29780:3;29776:11;29769:4;29761:6;29757:17;29735:61;:::i;:::-;29824:6;29819:3;29815:16;29805:26;;-1:-1:-1;;;29881:2:1;29877:1;29873:2;29869:10;29862:22;29915:6;29909:13;29931:62;29984:8;29980:1;29976:2;29972:10;29965:4;29957:6;29953:17;29931:62;:::i;:::-;30053:1;30012:17;;30045:10;;;30038:22;30085:13;;30107:62;30085:13;30156:1;30148:10;;30141:4;30129:17;;30107:62;:::i;:::-;-1:-1:-1;;;30229:1:1;30188:17;;;;30221:10;;;30214:23;30261:1;30253:10;;29022:1247;-1:-1:-1;;;;;29022:1247:1:o;30274:3463::-;30637:66;30625:79;;30734:34;30729:2;30720:12;;30713:56;30799:34;30794:2;30785:12;;30778:56;30864:34;30859:2;30850:12;;30843:56;30930:34;30924:3;30915:13;;30908:57;30996:34;30990:3;30981:13;;30974:57;31062:34;31056:3;31047:13;;31040:57;31128:34;31122:3;31113:13;;31106:57;31194:34;31188:3;31179:13;;31172:57;31260:34;31254:3;31245:13;;31238:57;31326:34;31320:3;31311:13;;31304:57;31392:34;31386:3;31377:13;;31370:57;31458:34;31452:3;31443:13;;31436:57;31524:34;31518:3;31509:13;;31502:57;31590:34;31584:3;31575:13;;31568:57;31656:34;31650:3;31641:13;;31634:57;31722:34;31716:3;31707:13;;31700:57;31788:34;31782:3;31773:13;;31766:57;31854:34;31848:3;31839:13;;31832:57;31920:34;31914:3;31905:13;;31898:57;31986:34;31980:3;31971:13;;31964:57;32052:34;32046:3;32037:13;;32030:57;32118:34;32112:3;32103:13;;32096:57;32184:34;32178:3;32169:13;;32162:57;32250:34;32244:3;32235:13;;32228:57;32316:34;32310:3;32301:13;;32294:57;32382:34;32376:3;32367:13;;32360:57;32436:34;32495:3;32486:13;;32479:25;;;32535:34;32529:3;32520:13;;32513:57;32601:34;32595:3;32586:13;;32579:57;32661:3;32652:13;;32645:25;32701:34;32695:3;32686:13;;32679:57;32768:34;32761:4;32752:14;;32745:58;32835:34;32828:4;32819:14;;32812:58;32902:34;32895:4;32886:14;;32879:58;32969:34;32962:4;32953:14;;32946:58;33036:34;33029:4;33020:14;;33013:58;33103:34;33096:4;33087:14;;33080:58;33170:34;33163:4;33154:14;;33147:58;33237:34;33230:4;33221:14;;33214:58;33304:34;33297:4;33288:14;;33281:58;33371:34;33364:4;33355:14;;33348:58;33438:34;33431:4;33422:14;;33415:58;33505:66;33498:4;33489:14;;33482:90;-1:-1:-1;;;33597:4:1;33588:14;;33581:62;-1:-1:-1;33659:72:1;33689:41;33724:4;33715:14;;33707:6;33689:41;:::i;:::-;-1:-1:-1;;;27824:30:1;;27879:1;27870:11;;27759:128;33742:4140;34105:66;34100:3;34093:79;34202:34;34197:2;34192:3;34188:12;34181:56;34267:34;34262:2;34257:3;34253:12;34246:56;34332:34;34327:2;34322:3;34318:12;34311:56;34398:34;34392:3;34387;34383:13;34376:57;34464:34;34458:3;34453;34449:13;34442:57;34530:34;34524:3;34519;34515:13;34508:57;34596:34;34590:3;34585;34581:13;34574:57;34662:34;34656:3;34651;34647:13;34640:57;34728:34;34722:3;34717;34713:13;34706:57;34794:34;34788:3;34783;34779:13;34772:57;34860:34;34854:3;34849;34845:13;34838:57;34926:34;34920:3;34915;34911:13;34904:57;34992:34;34986:3;34981;34977:13;34970:57;35058:34;35052:3;35047;35043:13;35036:57;35124:34;35118:3;35113;35109:13;35102:57;35190:34;35184:3;35179;35175:13;35168:57;35256:34;35250:3;35245;35241:13;35234:57;35322:34;35316:3;35311;35307:13;35300:57;35388:34;35382:3;35377;35373:13;35366:57;35454:34;35448:3;35443;35439:13;35432:57;35520:34;35514:3;35509;35505:13;35498:57;35586:34;35580:3;35575;35571:13;35564:57;35652:34;35646:3;35641;35637:13;35630:57;35718:34;35712:3;35707;35703:13;35696:57;35784:34;35778:3;35773;35769:13;35762:57;35850:34;35844:3;35839;35835:13;35828:57;35916:34;35910:3;35905;35901:13;35894:57;35982:34;35976:3;35971;35967:13;35960:57;36048:34;36042:3;36037;36033:13;36026:57;36114:34;36108:3;36103;36099:13;36092:57;36180:34;36174:3;36169;36165:13;36158:57;36247:34;36240:4;36235:3;36231:14;36224:58;36314:34;36307:4;36302:3;36298:14;36291:58;36381:34;36374:4;36369:3;36365:14;36358:58;36448:34;36441:4;36436:3;36432:14;36425:58;36515:34;36508:4;36503:3;36499:14;36492:58;36582:34;36575:4;36570:3;36566:14;36559:58;36649:34;36642:4;36637:3;36633:14;36626:58;36716:34;36709:4;36704:3;36700:14;36693:58;36783:34;36776:4;36771:3;36767:14;36760:58;36850:34;36843:4;36838:3;36834:14;36827:58;36917:34;36910:4;36905:3;36901:14;36894:58;36984:34;36977:4;36972:3;36968:14;36961:58;37051:34;37044:4;37039:3;37035:14;37028:58;37118:34;37111:4;37106:3;37102:14;37095:58;37185:34;37178:4;37173:3;37169:14;37162:58;37252:34;37245:4;37240:3;37236:14;37229:58;37319:34;37312:4;37307:3;37303:14;37296:58;37386:34;37379:4;37374:3;37370:14;37363:58;37453:34;37446:4;37441:3;37437:14;37430:58;37520:34;37513:4;37508:3;37504:14;37497:58;37587:34;37580:4;37575:3;37571:14;37564:58;37654:34;37647:4;37642:3;37638:14;37631:58;37721:66;37714:4;37709:3;37705:14;37698:90;34075:3;37804:72;37834:41;37869:4;37864:3;37860:14;37852:6;37834:41;:::i;37887:1599::-;-1:-1:-1;;;38488:49:1;;38560:13;;38470:3;;38582:62;38560:13;38632:2;38623:12;;38616:4;38604:17;;38582:62;:::i;:::-;38708:66;38703:2;38663:16;;;38695:11;;;38688:87;38804:66;38799:2;38791:11;;38784:87;38900:66;38895:2;38887:11;;38880:87;38997:66;38991:3;38983:12;;38976:88;-1:-1:-1;;;39088:3:1;39080:12;;39073:62;39160:13;;39182:64;39160:13;39231:3;39223:12;;39216:4;39204:17;;39182:64;:::i;:::-;39312:66;39306:3;39265:17;;;;39298:12;;;39291:88;-1:-1:-1;;;39403:3:1;39395:12;;39388:64;39476:3;39468:12;;37887:1599;-1:-1:-1;;;;37887:1599:1:o;39491:1097::-;-1:-1:-1;;;40046:3:1;40039:20;40021:3;40088:6;40082:13;40104:61;40158:6;40154:1;40149:3;40145:11;40138:4;40130:6;40126:17;40104:61;:::i;:::-;-1:-1:-1;;;40224:1:1;40184:16;;;40216:10;;;40209:36;40270:13;;40292:63;40270:13;40341:2;40333:11;;40326:4;40314:17;;40292:63;:::i;:::-;-1:-1:-1;;;40415:2:1;40374:17;;;;40407:11;;;40400:30;40455:13;;40477:63;40455:13;40526:2;40518:11;;40511:4;40499:17;;40477:63;:::i;:::-;40560:17;40579:2;40556:26;;39491:1097;-1:-1:-1;;;;;39491:1097:1:o;40593:439::-;40825:3;40863:6;40857:13;40879:53;40925:6;40920:3;40913:4;40905:6;40901:17;40879:53;:::i;:::-;-1:-1:-1;;;40954:16:1;;40979:18;;;-1:-1:-1;41024:1:1;41013:13;;40593:439;-1:-1:-1;40593:439:1:o;41037:1660::-;-1:-1:-1;;;41686:53:1;;41762:13;;41668:3;;41784:62;41762:13;41834:2;41825:12;;41818:4;41806:17;;41784:62;:::i;:::-;41910:66;41905:2;41865:16;;;41897:11;;;41890:87;42006:66;42001:2;41993:11;;41986:87;42102:66;42097:2;42089:11;;42082:87;-1:-1:-1;;;42193:3:1;42185:12;;42178:46;42249:13;;42271:64;42249:13;42320:3;42312:12;;42305:4;42293:17;;42271:64;:::i;:::-;42401:66;42395:3;42354:17;;;;42387:12;;;42380:88;42493:13;;42515:64;42493:13;42564:3;42556:12;;42549:4;42537:17;;42515:64;:::i;:::-;-1:-1:-1;;;42639:3:1;42598:17;;;;42631:12;;;42624:39;42687:3;42679:12;;41037:1660;-1:-1:-1;;;;;41037:1660:1:o;42702:1305::-;-1:-1:-1;;;43202:49:1;;43274:13;;43184:3;;43296:62;43274:13;43346:2;43337:12;;43330:4;43318:17;;43296:62;:::i;:::-;43422:66;43417:2;43377:16;;;43409:11;;;43402:87;43518:66;43513:2;43505:11;;43498:87;43614:66;43609:2;43601:11;;43594:87;43711:66;43705:3;43697:12;;43690:88;43803:13;;43825:64;43803:13;43874:3;43866:12;;43859:4;43847:17;;43825:64;:::i;:::-;-1:-1:-1;;;43949:3:1;43908:17;;;;43941:12;;;43934:39;43997:3;43989:12;;42702:1305;-1:-1:-1;;;;42702:1305:1:o;44012:664::-;44239:3;44277:6;44271:13;44293:53;44339:6;44334:3;44327:4;44319:6;44315:17;44293:53;:::i;:::-;44409:13;;44368:16;;;;44431:57;44409:13;44368:16;44465:4;44453:17;;44431:57;:::i;:::-;44555:13;;44510:20;;;44577:57;44555:13;44510:20;44611:4;44599:17;;44577:57;:::i;:::-;44650:20;;44012:664;-1:-1:-1;;;;;44012:664:1:o
Swarm Source
ipfs://f39771466d98f9b5e5ba1f288c30741db370ce790e2f67b29c57e32515df54a3
Loading...
Loading
OVERVIEW
Logbook 2.0, the NFT that empowers collective collection beyond private ownership, issued by Matters Lab.Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.