Contract Overview
[ Download CSV Export ]
Latest 5 internal transactions
Parent Txn Hash | Block | From | To | Value | |||
---|---|---|---|---|---|---|---|
0x2d044738b32ddbcac19a8a81a521b18cd4caefd16882ad60831846fa9e5e1d7b | 34139414 | 372 days 6 hrs ago | 0xa9a4e753d744bd400b72b1dfd0a97760d7b46803 | 0x15f40a3d19320fde21ec7a132fb449985533597c | 1 FTM | ||
0x2d044738b32ddbcac19a8a81a521b18cd4caefd16882ad60831846fa9e5e1d7b | 34139414 | 372 days 6 hrs ago | 0xa9a4e753d744bd400b72b1dfd0a97760d7b46803 | Contract Creation | 0 FTM | ||
0xa182bb7cb4711365a12f196957f88201ad3c969318e5bb5fe17356145dde3598 | 34138101 | 372 days 6 hrs ago | 0xa9a4e753d744bd400b72b1dfd0a97760d7b46803 | Contract Creation | 0 FTM | ||
0x9a0d0e7361bca6b0a0a738918e5fa357769b31dee77bea7cd26c3b530494eecd | 34136994 | 372 days 7 hrs ago | 0xa9a4e753d744bd400b72b1dfd0a97760d7b46803 | Contract Creation | 0 FTM | ||
0x9a0d0e7361bca6b0a0a738918e5fa357769b31dee77bea7cd26c3b530494eecd | 34136994 | 372 days 7 hrs ago | 0xb1195d3b258e74cf8c1d591109c6f7e83f42e494 | Contract Creation | 0 FTM |
[ Download CSV Export ]
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:
Squaddies
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at FtmScan.com on 2022-03-22 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.10; // Sources flattened with hardhat v2.8.3 https://hardhat.org // File @openzeppelin/contracts/utils/introspection/IERC165.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); } // File @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer( address indexed from, address indexed to, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval( address indexed owner, address indexed approved, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll( address indexed owner, address indexed operator, bool approved ); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // 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); } // File @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // 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); } // File @openzeppelin/contracts/utils/Address.sol // 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); } } } } // File @openzeppelin/contracts/utils/Context.sol // 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; } } // File @openzeppelin/contracts/utils/Strings.sol // 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); } } // File @openzeppelin/contracts/utils/introspection/ERC165.sol // 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; } } // File @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol) /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string internal _name; // Token symbol string internal _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 overridden 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 {} } // File @openzeppelin/contracts/interfaces/IERC165.sol // OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol) // File @openzeppelin/contracts/interfaces/IERC2981.sol // OpenZeppelin Contracts v4.4.1 (interfaces/IERC2981.sol) /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be payed in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // File @openzeppelin/contracts/token/common/ERC2981.sol // OpenZeppelin Contracts v4.4.0 (token/common/ERC2981.sol) /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require( feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice" ); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `tokenId` must be already minted. * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) internal virtual { require( feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice" ); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } } // File @openzeppelin/contracts/token/ERC721/extensions/ERC721Royalty.sol // OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/ERC721Royalty.sol) /** * @dev Extension of ERC721 with the ERC2981 NFT Royalty Standard, a standardized way to retrieve royalty payment * information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC721Royalty is ERC2981, ERC721 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC2981) returns (bool) { return super.supportsInterface(interfaceId); } /** * @dev See {ERC721-_burn}. This override additionally clears the royalty information for the token. */ function _burn(uint256 tokenId) internal virtual override { super._burn(tokenId); _resetTokenRoyalty(tokenId); } } // File @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol) /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require( index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds" ); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require( index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds" ); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File @openzeppelin/contracts/security/Pausable.sol // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool internal _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Modifier to make a function override the current pause state */ modifier overridePause() { bool wasPaused = paused(); if (wasPaused) { _unpause(); } _; if (wasPaused) { _pause(); } } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File @openzeppelin/contracts/token/ERC721/extensions/ERC721Pausable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Pausable.sol) /** * @dev ERC721 token with pausable token transfers, minting and burning. * * Useful for scenarios such as preventing trades until the end of an evaluation * period, or having an emergency switch for freezing all token transfers in the * event of a large bug. */ abstract contract ERC721Pausable is ERC721, Pausable { /** * @dev See {ERC721-_beforeTokenTransfer}. * * Requirements: * * - the contract must not be paused. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); require(!paused(), "ERC721Pausable: token transfer while paused"); } } // File @openzeppelin/contracts/access/IOwnable.sol // OpenZeppelin Contracts v4.4.0 (access/Ownable.sol) interface IOwnable { function owner() external view returns (address); function pushOwnership(address newOwner) external; function pullOwnership() external; function renounceOwnership() external; function transferOwnership(address newOwner) external; } // File @openzeppelin/contracts/access/Ownable.sol // 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 IOwnable, Context { address private _owner; address private _newOwner; event OwnershipPushed( address indexed previousOwner, address indexed newOwner ); event OwnershipPulled( address indexed previousOwner, address indexed newOwner ); 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 override 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 Sets up a push of the ownership of the contract to the specified * address which must subsequently pull the ownership to accept it. */ function pushOwnership(address newOwner) public virtual override onlyOwner { require( newOwner != address(0), "Ownable: new owner is the zero address" ); emit OwnershipPushed(_owner, newOwner); _newOwner = newOwner; } /** * @dev Accepts the push of ownership of the contract. Must be called by * the new owner. */ function pullOwnership() public virtual override { require(msg.sender == _newOwner, "Ownable: must be new owner to pull"); emit OwnershipPulled(_owner, _newOwner); _owner = _newOwner; } /** * @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 override 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 override 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); } } // File @openzeppelin/contracts/proxy/Clones.sol // OpenZeppelin Contracts v4.4.1 (proxy/Clones.sol) /** * @dev https://eips.ethereum.org/EIPS/eip-1167[EIP 1167] is a standard for * deploying minimal proxy contracts, also known as "clones". * * > To simply and cheaply clone contract functionality in an immutable way, this standard specifies * > a minimal bytecode implementation that delegates all calls to a known, fixed address. * * The library includes functions to deploy a proxy using either `create` (traditional deployment) or `create2` * (salted deterministic deployment). It also includes functions to predict the addresses of clones deployed using the * deterministic method. * * _Available since v3.4._ */ library Clones { /** * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`. * * This function uses the create opcode, which should never revert. */ function clone(address implementation) internal returns (address instance) { assembly { let ptr := mload(0x40) mstore( ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000 ) mstore(add(ptr, 0x14), shl(0x60, implementation)) mstore( add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000 ) instance := create(0, ptr, 0x37) } require(instance != address(0), "ERC1167: create failed"); } /** * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`. * * This function uses the create2 opcode and a `salt` to deterministically deploy * the clone. Using the same `implementation` and `salt` multiple time will revert, since * the clones cannot be deployed twice at the same address. */ function cloneDeterministic(address implementation, bytes32 salt) internal returns (address instance) { assembly { let ptr := mload(0x40) mstore( ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000 ) mstore(add(ptr, 0x14), shl(0x60, implementation)) mstore( add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000 ) instance := create2(0, ptr, 0x37, salt) } require(instance != address(0), "ERC1167: create2 failed"); } /** * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}. */ function predictDeterministicAddress( address implementation, bytes32 salt, address deployer ) internal pure returns (address predicted) { assembly { let ptr := mload(0x40) mstore( ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000 ) mstore(add(ptr, 0x14), shl(0x60, implementation)) mstore( add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf3ff00000000000000000000000000000000 ) mstore(add(ptr, 0x38), shl(0x60, deployer)) mstore(add(ptr, 0x4c), salt) mstore(add(ptr, 0x6c), keccak256(ptr, 0x37)) predicted := keccak256(add(ptr, 0x37), 0x55) } } /** * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}. */ function predictDeterministicAddress(address implementation, bytes32 salt) internal view returns (address predicted) { return predictDeterministicAddress(implementation, salt, address(this)); } } // File contracts/interfaces/ISimpleRNG.sol interface ISimpleRNG { function getEntropy() external view returns (bytes32); function getRandom() external view returns (bytes32); function getRandom(uint256 seed) external view returns (bytes32); } // File contracts/interfaces/IPaymentSplitter.sol interface IPaymentSplitter { function initialize() external; function initialize(address[] memory payees, uint256[] memory shares_) external; function addPayee(address payee_, uint256 shares_) external; function count() external view returns (uint256); function totalShares() external view returns (uint256); function totalReleased() external view returns (uint256); function totalReleased(address token) external view returns (uint256); function shares(address account) external view returns (uint256); function released(address account) external view returns (uint256); function released(address token, address account) external view returns (uint256); function payee(uint256 index) external view returns (address); function pending(address account) external view returns (uint256); function pending(address token, address account) external view returns (uint256); function releaseAll() external; function releaseAll(address token) external; function release(address account) external; function release(address token, address account) external; function transferOwnership(address newOwner) external; function VERSION() external view returns (uint256); } // File contracts/interfaces/IERC721Snapshot.sol interface IERC721Snapshot { function initialize(IERC721Enumerable ERC721Contract) external; function holders(uint256 index) external view returns (address); function length() external view returns (uint256); function VERSION() external view returns (uint256); } // File contracts/Squaddies/Squaddies.sol contract Squaddies is ERC721Enumerable, ERC721Royalty, ERC721Pausable, Ownable { using Strings for uint256; using Address for address; using Clones for address; event SnapshotCompleted( address indexed _contract, uint256 indexed block, uint256 indexed _length ); event AirdropSent(uint256 _count); uint256 public MINTING_FEE = 3 ether; uint256 public MAX_SUPPLY = 3000; uint256 public MAX_TOKENS_PER_MINT = 5; // Snapshot information of PfP uint256 public currentSnapshotPosition = 0; IERC721Snapshot public SNAPSHOT; modifier onlySnapshotCompleted() { require( address(SNAPSHOT) != address(0), "Snapshot has not been completed" ); _; } modifier onlySnapshotNotCompleted() { require( address(SNAPSHOT) == address(0), "Snapshot has already been completed" ); _; } // URI settings string private BASE_URI; string private URI_EXTENSION = ".json"; // random seed for used in tokenURI generation uint256 private immutable RANDOM_SEED; // helpers IPaymentSplitter public royaltyReceiver; // service settings address private immutable deployer; address private immutable service = 0xe60E6506d73C15C10DF4fA90380BBc6291152c41; modifier onlyService() { require(_msgSender() == service, "Not service account"); _; } constructor() ERC721("Squaddies - Female", "SQUADF") { deployer = _msgSender(); // set up the royalty payment splitter royaltyReceiver = IPaymentSplitter( 0xd1c3Be3EA847c5B74aE1f91AaBDe8e227611CCcD.clone() ); royaltyReceiver.initialize(); // initialize royaltyReceiver.addPayee( 0x7308373D971eb4f328905893FEE68BDc6227a020, 95 ); // 95% royaltyReceiver.addPayee(deployer, 5); // 5% // all royalties of 7.5% go to the royalty receiver _setDefaultRoyalty(address(royaltyReceiver), 750); // 7.5% // set our "random" seed RANDOM_SEED = uint256( keccak256( abi.encodePacked( _msgSender(), block.timestamp, block.number, address(this), ISimpleRNG(0x2E3A7192E01baff2288D4127A3d42Ab86430Bf80) .getRandom() ) ) ); // pause the contract at launch _pause(); } /** * @dev Performs an airdrop to the holders found in the snapshot mechanism */ function airdrop(uint256 _count) public onlyOwner onlySnapshotCompleted overridePause { uint256 count = SNAPSHOT.length(); require( currentSnapshotPosition < count, "ERC721: airdrop fully completed" ); uint256 completed = 0; for ( currentSnapshotPosition; currentSnapshotPosition < count; currentSnapshotPosition++ ) { address owner = SNAPSHOT.holders(currentSnapshotPosition); if (!owner.isContract()) { // only airdrop if the current holder is not a contract _mintNFT(owner); completed += 1; } if (completed == _count) { break; // limit the batches to the count due to gas constraints } } if (completed != 0) { currentSnapshotPosition += 1; // if we minted, we need to move ahead one so our next round doesn't mess up emit AirdropSent(completed); } } /** * @dev Mints the specified number of NFTs if permitted */ function mint(uint256 count) public payable returns (uint256[] memory) { require(count != 0, "ERC721: must mint at least one"); require( count <= MAX_TOKENS_PER_MINT, "ERC721: max tokens per mint exceeded" ); require( msg.value == MINTING_FEE * count, "ERC721: caller did not supply correct value" ); uint256[] memory tokenIds = new uint256[](count); for (uint256 i = 0; i < count; i++) { tokenIds[i] = _mintNFT(_msgSender()); } return tokenIds; } /** * @dev Pauses the contract */ function pause() public onlyOwner { _pause(); } /** * @dev Updates the Base URI for the token URIs */ function setBaseURI(string memory _base_uri) public onlyOwner { BASE_URI = _base_uri; } /** * @dev Performs a snapshot of ERC721 holders of the PfP token contract */ function takeSnapshot() public onlyOwner onlySnapshotNotCompleted { // clone the ERC721 snapshot contract previously deployed SNAPSHOT = IERC721Snapshot( 0xeAe39b105192ddF1331C6F534875C4ca7Ff7C113.clone() ); SNAPSHOT.initialize( IERC721Enumerable(0xBF8F66B695481CE24d8E39B21A17E723208566c9) // take the snapshot ); emit SnapshotCompleted( address(SNAPSHOT), block.number, SNAPSHOT.length() ); } /** * @dev Returns the masked portion of the URI for the specified token ID */ function tokenMaskedURI(uint256 tokenId) public view onlyService returns (string memory) { return _generateTokenURI(tokenId); } /** * @dev Returns the URI for the specified token if it exists */ function tokenURI(uint256 tokenId) public view override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); return string( abi.encodePacked( BASE_URI, _generateTokenURI(tokenId), URI_EXTENSION ) ); } /** * @dev Unpauses the contract */ function unpause() public onlyOwner { _unpause(); } /** * @dev Withdraw the full balance of the contract to the current owner */ function withdraw() public onlyOwner { require(address(this).balance != 0, "contract has no balance"); // create a new instance of the payment splitter so that // the current `owner` of the contract is always used // as well as the negotiated rate is paid to the developer/deployer IPaymentSplitter splitter = IPaymentSplitter( 0xd1c3Be3EA847c5B74aE1f91AaBDe8e227611CCcD.clone() ); splitter.initialize(); // initialization of the clone if (owner() != deployer) { splitter.addPayee(owner(), 95); // 95% } splitter.addPayee(deployer, 5); // 5% payable(address(splitter)).transfer(address(this).balance); // pay the splitter splitter.releaseAll(); // pay all parties in the splitter } receive() external payable {} //****** INTERNAL METHODS ******/ function _generateTokenURI(uint256 tokenId) internal view returns (string memory) { return uint256( keccak256( abi.encodePacked(RANDOM_SEED.toString(), tokenId.toString()) ) ).toHexString(32); } function _mintNFT(address _to) internal returns (uint256) { uint256 supply = totalSupply(); require(supply + 1 <= MAX_SUPPLY, "ERC721: Mint complete"); uint256 tokenId = supply + 1; _safeMint(_to, tokenId); return tokenId; } function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal override(ERC721, ERC721Enumerable, ERC721Pausable) { super._beforeTokenTransfer(from, to, tokenId); } function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal override { royaltyReceiver.releaseAll(); super._afterTokenTransfer(from, to, tokenId); } function _burn(uint256 tokenId) internal override(ERC721, ERC721Royalty) { super._burn(tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable, ERC721Royalty) returns (bool) { return super.supportsInterface(interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_count","type":"uint256"}],"name":"AirdropSent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipPulled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipPushed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_contract","type":"address"},{"indexed":true,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_length","type":"uint256"}],"name":"SnapshotCompleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKENS_PER_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTING_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SNAPSHOT","outputs":[{"internalType":"contract IERC721Snapshot","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentSnapshotPosition","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"mint","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pullOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"pushOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyReceiver","outputs":[{"internalType":"contract IPaymentSplitter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_base_uri","type":"string"}],"name":"setBaseURI","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":[],"name":"takeSnapshot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenMaskedURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6729a2241af62c0000600e55610bb8600f5560056010819055600060115561012060405260e081905264173539b7b760d91b61010090815262000046916014919062000628565b5073e60e6506d73c15c10df4fa90380bbc6291152c4160c0523480156200006c57600080fd5b506040805180820182526012815271537175616464696573202d2046656d616c6560701b60208083019182528351808501909452600684526529a8aaa0a22360d11b908401528151919291620000c59160029162000628565b508051620000db90600390602084019062000628565b5050600c805460ff1916905550620000f3336200037f565b336001600160a01b031660a0526200012b73d1c3be3ea847c5b74ae1f91aabde8e227611cccd620003d9602090811b62001e2f17901c565b601580546001600160a01b0319166001600160a01b039290921691821790556040805163204a7f0760e21b81529051638129fc1c9160048082019260009290919082900301818387803b1580156200018257600080fd5b505af115801562000197573d6000803e3d6000fd5b50506015546040516318f9b02360e01b8152737308373d971eb4f328905893fee68bdc6227a0206004820152605f60248201526001600160a01b0390911692506318f9b0239150604401600060405180830381600087803b158015620001fc57600080fd5b505af115801562000211573d6000803e3d6000fd5b505060155460a0516040516318f9b02360e01b81526001600160a01b03918216600482015260056024820152911692506318f9b0239150604401600060405180830381600087803b1580156200026657600080fd5b505af11580156200027b573d6000803e3d6000fd5b50506015546200029a92506001600160a01b031690506102ee6200048c565b33424330732e3a7192e01baff2288d4127a3d42ab86430bf806001600160a01b031663aacc5a176040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003179190620006ce565b6040516001600160601b0319606096871b8116602083015260348201959095526054810193909352931b9091166074820152608881019190915260a80160408051601f198184030181529190528051602090910120608052620003796200058d565b62000724565b600c80546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f09150506001600160a01b038116620004875760405162461bcd60e51b815260206004820152601660248201527f455243313136373a20637265617465206661696c65640000000000000000000060448201526064015b60405180910390fd5b919050565b6127106001600160601b0382161115620004fc5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084016200047e565b6001600160a01b038216620005545760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c69642072656365697665720000000000000060448201526064016200047e565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600055565b600c5460ff1615620005d55760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016200047e565b600c805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586200060b3390565b6040516001600160a01b03909116815260200160405180910390a1565b8280546200063690620006e8565b90600052602060002090601f0160209004810192826200065a5760008555620006a5565b82601f106200067557805160ff1916838001178555620006a5565b82800160010185558215620006a5579182015b82811115620006a557825182559160200191906001019062000688565b50620006b3929150620006b7565b5090565b5b80821115620006b35760008155600101620006b8565b600060208284031215620006e157600080fd5b5051919050565b600181811c90821680620006fd57607f821691505b6020821081036200071e57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c0516137666200075b6000396000610f1e015260008181610c960152610d9c015260006122db01526137666000f3fe60806040526004361061026e5760003560e01c80636352211e116101535780639fbc8713116100cb578063c87b56dd1161007f578063d642b4b111610064578063d642b4b114610699578063e985e9c5146106af578063f2fde38b146106f857600080fd5b8063c87b56dd14610659578063d39ce77c1461067957600080fd5b8063a22cb465116100b0578063a22cb46514610604578063b3d3d37e14610624578063b88d4fde1461063957600080fd5b80639fbc8713146105c4578063a0712d68146105e457600080fd5b80638456cb591161012257806395d89b411161010757806395d89b411461057957806397dc4a131461058e5780639ba21876146105ae57600080fd5b80638456cb59146105415780638da5cb5b1461055657600080fd5b80636352211e146104d757806370a08231146104f7578063715018a6146105175780637ff28d3a1461052c57600080fd5b806332cb6b0c116101e657806342842e0e116101b55780634f6ccce71161019a5780634f6ccce71461047f57806355f804b31461049f5780635c975abb146104bf57600080fd5b806342842e0e1461043f578063487458511461045f57600080fd5b806332cb6b0c146103e95780633377cd66146103ff5780633ccfd60b146104155780633f4ba83a1461042a57600080fd5b806318160ddd1161023d5780632a55205a116102225780632a55205a1461036a5780632f745c59146103a9578063311729e8146103c957600080fd5b806318160ddd1461032b57806323b872dd1461034a57600080fd5b806301ffc9a71461027a57806306fdde03146102af578063081812fc146102d1578063095ea7b31461030957600080fd5b3661027557005b600080fd5b34801561028657600080fd5b5061029a610295366004613107565b610718565b60405190151581526020015b60405180910390f35b3480156102bb57600080fd5b506102c4610729565b6040516102a6919061317c565b3480156102dd57600080fd5b506102f16102ec36600461318f565b6107bb565b6040516001600160a01b0390911681526020016102a6565b34801561031557600080fd5b506103296103243660046131bd565b610855565b005b34801561033757600080fd5b50600a545b6040519081526020016102a6565b34801561035657600080fd5b506103296103653660046131e9565b610986565b34801561037657600080fd5b5061038a61038536600461322a565b610a0d565b604080516001600160a01b0390931683526020830191909152016102a6565b3480156103b557600080fd5b5061033c6103c43660046131bd565b610ac8565b3480156103d557600080fd5b506012546102f1906001600160a01b031681565b3480156103f557600080fd5b5061033c600f5481565b34801561040b57600080fd5b5061033c60105481565b34801561042157600080fd5b50610329610b70565b34801561043657600080fd5b50610329610e94565b34801561044b57600080fd5b5061032961045a3660046131e9565b610efe565b34801561046b57600080fd5b506102c461047a36600461318f565b610f19565b34801561048b57600080fd5b5061033c61049a36600461318f565b610fa1565b3480156104ab57600080fd5b506103296104ba3660046132d8565b611045565b3480156104cb57600080fd5b50600c5460ff1661029a565b3480156104e357600080fd5b506102f16104f236600461318f565b6110bc565b34801561050357600080fd5b5061033c610512366004613321565b611147565b34801561052357600080fd5b506103296111e1565b34801561053857600080fd5b5061032961124b565b34801561054d57600080fd5b50610329611348565b34801561056257600080fd5b50600c5461010090046001600160a01b03166102f1565b34801561058557600080fd5b506102c46113b0565b34801561059a57600080fd5b506103296105a936600461318f565b6113bf565b3480156105ba57600080fd5b5061033c60115481565b3480156105d057600080fd5b506015546102f1906001600160a01b031681565b6105f76105f236600461318f565b6116ba565b6040516102a6919061333e565b34801561061057600080fd5b5061032961061f366004613382565b611896565b34801561063057600080fd5b506103296118a1565b34801561064557600080fd5b506103296106543660046133c0565b611ae8565b34801561066557600080fd5b506102c461067436600461318f565b611b76565b34801561068557600080fd5b50610329610694366004613321565b611c38565b3480156106a557600080fd5b5061033c600e5481565b3480156106bb57600080fd5b5061029a6106ca366004613440565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561070457600080fd5b50610329610713366004613321565b611d5e565b600061072382611ee5565b92915050565b6060600280546107389061346e565b80601f01602080910402602001604051908101604052809291908181526020018280546107649061346e565b80156107b15780601f10610786576101008083540402835291602001916107b1565b820191906000526020600020905b81548152906001019060200180831161079457829003601f168201915b5050505050905090565b6000818152600460205260408120546001600160a01b03166108395760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610860826110bc565b9050806001600160a01b0316836001600160a01b0316036108e95760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610830565b336001600160a01b0382161480610905575061090581336106ca565b6109775760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610830565b6109818383611ef0565b505050565b6109903382611f5e565b610a025760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610830565b610981838383612055565b60008281526001602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046bffffffffffffffffffffffff16928201929092528291610a8c5750604080518082019091526000546001600160a01b0381168252600160a01b90046bffffffffffffffffffffffff1660208201525b602081015160009061271090610ab0906bffffffffffffffffffffffff16876134be565b610aba91906134f3565b915196919550909350505050565b6000610ad383611147565b8210610b475760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610830565b506001600160a01b03919091166000908152600860209081526040808320938352929052205490565b600c546001600160a01b03610100909104163314610bd05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610830565b47600003610c205760405162461bcd60e51b815260206004820152601760248201527f636f6e747261637420686173206e6f2062616c616e63650000000000000000006044820152606401610830565b6000610c3f73d1c3be3ea847c5b74ae1f91aabde8e227611cccd611e2f565b9050806001600160a01b0316638129fc1c6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610c7c57600080fd5b505af1158015610c90573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610cd6600c546001600160a01b036101009091041690565b6001600160a01b031614610d6c57806001600160a01b03166318f9b023610d0b600c546001600160a01b036101009091041690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152605f6024820152604401600060405180830381600087803b158015610d5357600080fd5b505af1158015610d67573d6000803e3d6000fd5b505050505b6040517f18f9b0230000000000000000000000000000000000000000000000000000000081526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152600560248301528216906318f9b02390604401600060405180830381600087803b158015610def57600080fd5b505af1158015610e03573d6000803e3d6000fd5b50506040516001600160a01b03841692504780156108fc029250906000818181858888f19350505050158015610e3d573d6000803e3d6000fd5b50806001600160a01b0316635be7fde86040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610e7957600080fd5b505af1158015610e8d573d6000803e3d6000fd5b5050505050565b600c546001600160a01b03610100909104163314610ef45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610830565b610efc612233565b565b61098183838360405180602001604052806000815250611ae8565b6060337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610f935760405162461bcd60e51b815260206004820152601360248201527f4e6f742073657276696365206163636f756e74000000000000000000000000006044820152606401610830565b610723826122cf565b919050565b6000610fac600a5490565b82106110205760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610830565b600a828154811061103357611033613507565b90600052602060002001549050919050565b600c546001600160a01b036101009091041633146110a55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610830565b80516110b8906013906020840190613058565b5050565b6000818152600460205260408120546001600160a01b0316806107235760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610830565b60006001600160a01b0382166111c55760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610830565b506001600160a01b031660009081526005602052604090205490565b600c546001600160a01b036101009091041633146112415760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610830565b610efc6000612337565b600d546001600160a01b031633146112cb5760405162461bcd60e51b815260206004820152602260248201527f4f776e61626c653a206d757374206265206e6577206f776e657220746f20707560448201527f6c6c0000000000000000000000000000000000000000000000000000000000006064820152608401610830565b600d54600c546040516001600160a01b0392831692610100909204909116907faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d90600090a3600d54600c80546001600160a01b039092166101000274ffffffffffffffffffffffffffffffffffffffff0019909216919091179055565b600c546001600160a01b036101009091041633146113a85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610830565b610efc61239e565b6060600380546107389061346e565b600c546001600160a01b0361010090910416331461141f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610830565b6012546001600160a01b03166114775760405162461bcd60e51b815260206004820152601f60248201527f536e617073686f7420686173206e6f74206265656e20636f6d706c65746564006044820152606401610830565b6000611485600c5460ff1690565b9050801561149557611495612233565b601254604080517f1f7b6d3200000000000000000000000000000000000000000000000000000000815290516000926001600160a01b031691631f7b6d329160048083019260209291908290030181865afa1580156114f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151c919061351d565b9050806011541061156f5760405162461bcd60e51b815260206004820152601f60248201527f4552433732313a2061697264726f702066756c6c7920636f6d706c65746564006044820152606401610830565b60005b816011541015611658576012546011546040517f2a11ced000000000000000000000000000000000000000000000000000000000815260048101919091526000916001600160a01b031690632a11ced090602401602060405180830381865afa1580156115e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116079190613536565b90506001600160a01b0381163b6116305761162181612426565b5061162d600183613553565b91505b84820361163d5750611658565b506011805490600061164e8361356b565b9190505550611572565b80156116aa576001601160008282546116719190613553565b90915550506040518181527fd2cdffe9bbf70e401e40463c2a814df41590a33d34303f1f7f765008e629789f9060200160405180910390a15b505080156110b8576110b861239e565b60608160000361170c5760405162461bcd60e51b815260206004820152601e60248201527f4552433732313a206d757374206d696e74206174206c65617374206f6e6500006044820152606401610830565b6010548211156117835760405162461bcd60e51b8152602060048201526024808201527f4552433732313a206d617820746f6b656e7320706572206d696e74206578636560448201527f65646564000000000000000000000000000000000000000000000000000000006064820152608401610830565b81600e5461179191906134be565b34146118055760405162461bcd60e51b815260206004820152602b60248201527f4552433732313a2063616c6c657220646964206e6f7420737570706c7920636f60448201527f72726563742076616c75650000000000000000000000000000000000000000006064820152608401610830565b60008267ffffffffffffffff8111156118205761182061324c565b604051908082528060200260200182016040528015611849578160200160208202803683370190505b50905060005b8381101561188f5761186033612426565b82828151811061187257611872613507565b6020908102919091010152806118878161356b565b91505061184f565b5092915050565b6110b83383836124b1565b600c546001600160a01b036101009091041633146119015760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610830565b6012546001600160a01b0316156119805760405162461bcd60e51b815260206004820152602360248201527f536e617073686f742068617320616c7265616479206265656e20636f6d706c6560448201527f74656400000000000000000000000000000000000000000000000000000000006064820152608401610830565b61199d73eae39b105192ddf1331c6f534875c4ca7ff7c113611e2f565b601280546001600160a01b0319166001600160a01b039290921691821790556040517fc4d66de800000000000000000000000000000000000000000000000000000000815273bf8f66b695481ce24d8e39b21a17e723208566c9600482015263c4d66de890602401600060405180830381600087803b158015611a1f57600080fd5b505af1158015611a33573d6000803e3d6000fd5b50505050601260009054906101000a90046001600160a01b03166001600160a01b0316631f7b6d326040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aae919061351d565b60125460405143916001600160a01b0316907f5d405e51a16c16bccf13943249fa148b3c57990d01b065192b893e9294f4dbff90600090a4565b611af23383611f5e565b611b645760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610830565b611b708484848461257f565b50505050565b6000818152600460205260409020546060906001600160a01b0316611c035760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610830565b6013611c0e836122cf565b6014604051602001611c229392919061361d565b6040516020818303038152906040529050919050565b600c546001600160a01b03610100909104163314611c985760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610830565b6001600160a01b038116611cfd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610830565b600c546040516001600160a01b0380841692610100900416907fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba90600090a3600d80546001600160a01b0319166001600160a01b0392909216919091179055565b600c546001600160a01b03610100909104163314611dbe5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610830565b6001600160a01b038116611e235760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610830565b611e2c81612337565b50565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f09150506001600160a01b038116610f9c5760405162461bcd60e51b815260206004820152601660248201527f455243313136373a20637265617465206661696c6564000000000000000000006044820152606401610830565b6000610723826125fd565b600081815260066020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611f25826110bc565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600460205260408120546001600160a01b0316611fd75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610830565b6000611fe2836110bc565b9050806001600160a01b0316846001600160a01b0316148061201d5750836001600160a01b0316612012846107bb565b6001600160a01b0316145b8061204d57506001600160a01b0380821660009081526007602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316612068826110bc565b6001600160a01b0316146120e45760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610830565b6001600160a01b03821661215f5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610830565b61216a83838361263b565b612175600082611ef0565b6001600160a01b038316600090815260056020526040812080546001929061219e908490613650565b90915550506001600160a01b03821660009081526005602052604081208054600192906121cc908490613553565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4610981838383612646565b600c5460ff166122855760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610830565b600c805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b606061072360206122ff7f00000000000000000000000000000000000000000000000000000000000000006126b3565b612308856126b3565b604051602001612319929190613667565b60408051601f198184030181529190528051602090910120906127b4565b600c80546001600160a01b0383811661010081810274ffffffffffffffffffffffffffffffffffffffff001985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600c5460ff16156123f15760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610830565b600c805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586122b23390565b600080612432600a5490565b600f54909150612443826001613553565b11156124915760405162461bcd60e51b815260206004820152601560248201527f4552433732313a204d696e7420636f6d706c65746500000000000000000000006044820152606401610830565b600061249e826001613553565b90506124aa8482612979565b9392505050565b816001600160a01b0316836001600160a01b0316036125125760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610830565b6001600160a01b03838116600081815260076020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61258a848484612055565b61259684848484612993565b611b705760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610830565b60006001600160e01b031982167f780e9d63000000000000000000000000000000000000000000000000000000001480610723575061072382612adf565b610981838383612b51565b601560009054906101000a90046001600160a01b03166001600160a01b0316635be7fde86040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561269657600080fd5b505af11580156126aa573d6000803e3d6000fd5b50505050505050565b6060816000036126da5750506040805180820190915260018152600360fc1b602082015290565b8160005b811561270457806126ee8161356b565b91506126fd9050600a836134f3565b91506126de565b60008167ffffffffffffffff81111561271f5761271f61324c565b6040519080825280601f01601f191660200182016040528015612749576020820181803683370190505b5090505b841561204d5761275e600183613650565b915061276b600a86613696565b612776906030613553565b60f81b81838151811061278b5761278b613507565b60200101906001600160f81b031916908160001a9053506127ad600a866134f3565b945061274d565b606060006127c38360026134be565b6127ce906002613553565b67ffffffffffffffff8111156127e6576127e661324c565b6040519080825280601f01601f191660200182016040528015612810576020820181803683370190505b509050600360fc1b8160008151811061282b5761282b613507565b60200101906001600160f81b031916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061287657612876613507565b60200101906001600160f81b031916908160001a905350600061289a8460026134be565b6128a5906001613553565b90505b600181111561292a577f303132333435363738396162636465660000000000000000000000000000000085600f16601081106128e6576128e6613507565b1a60f81b8282815181106128fc576128fc613507565b60200101906001600160f81b031916908160001a90535060049490941c93612923816136aa565b90506128a8565b5083156124aa5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610830565b6110b8828260405180602001604052806000815250612bd5565b60006001600160a01b0384163b15612ad457604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906129d79033908990889088906004016136c1565b6020604051808303816000875af1925050508015612a12575060408051601f3d908101601f19168201909252612a0f918101906136fd565b60015b612aba573d808015612a40576040519150601f19603f3d011682016040523d82523d6000602084013e612a45565b606091505b508051600003612ab25760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610830565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061204d565b506001949350505050565b60006001600160e01b031982167f80ac58cd000000000000000000000000000000000000000000000000000000001480612b4257506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610723575061072382612c53565b612b5c838383612cba565b600c5460ff16156109815760405162461bcd60e51b815260206004820152602b60248201527f4552433732315061757361626c653a20746f6b656e207472616e73666572207760448201527f68696c65207061757365640000000000000000000000000000000000000000006064820152608401610830565b612bdf8383612d72565b612bec6000848484612993565b6109815760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610830565b60006001600160e01b031982167f2a55205a00000000000000000000000000000000000000000000000000000000148061072357507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614610723565b6001600160a01b038316612d1557612d1081600a80546000838152600b60205260408120829055600182018355919091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80155565b612d38565b816001600160a01b0316836001600160a01b031614612d3857612d388382612ec8565b6001600160a01b038216612d4f5761098181612f65565b826001600160a01b0316826001600160a01b031614610981576109818282613014565b6001600160a01b038216612dc85760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610830565b6000818152600460205260409020546001600160a01b031615612e2d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610830565b612e396000838361263b565b6001600160a01b0382166000908152600560205260408120805460019290612e62908490613553565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46110b860008383612646565b60006001612ed584611147565b612edf9190613650565b600083815260096020526040902054909150808214612f32576001600160a01b03841660009081526008602090815260408083208584528252808320548484528184208190558352600990915290208190555b5060009182526009602090815260408084208490556001600160a01b039094168352600881528383209183525290812055565b600a54600090612f7790600190613650565b6000838152600b6020526040812054600a8054939450909284908110612f9f57612f9f613507565b9060005260206000200154905080600a8381548110612fc057612fc0613507565b6000918252602080832090910192909255828152600b9091526040808220849055858252812055600a805480612ff857612ff861371a565b6001900381819060005260206000200160009055905550505050565b600061301f83611147565b6001600160a01b039093166000908152600860209081526040808320868452825280832085905593825260099052919091209190915550565b8280546130649061346e565b90600052602060002090601f01602090048101928261308657600085556130cc565b82601f1061309f57805160ff19168380011785556130cc565b828001600101855582156130cc579182015b828111156130cc5782518255916020019190600101906130b1565b506130d89291506130dc565b5090565b5b808211156130d857600081556001016130dd565b6001600160e01b031981168114611e2c57600080fd5b60006020828403121561311957600080fd5b81356124aa816130f1565b60005b8381101561313f578181015183820152602001613127565b83811115611b705750506000910152565b60008151808452613168816020860160208601613124565b601f01601f19169290920160200192915050565b6020815260006124aa6020830184613150565b6000602082840312156131a157600080fd5b5035919050565b6001600160a01b0381168114611e2c57600080fd5b600080604083850312156131d057600080fd5b82356131db816131a8565b946020939093013593505050565b6000806000606084860312156131fe57600080fd5b8335613209816131a8565b92506020840135613219816131a8565b929592945050506040919091013590565b6000806040838503121561323d57600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561327d5761327d61324c565b604051601f8501601f19908116603f011681019082821181831017156132a5576132a561324c565b816040528093508581528686860111156132be57600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156132ea57600080fd5b813567ffffffffffffffff81111561330157600080fd5b8201601f8101841361331257600080fd5b61204d84823560208401613262565b60006020828403121561333357600080fd5b81356124aa816131a8565b6020808252825182820181905260009190848201906040850190845b818110156133765783518352928401929184019160010161335a565b50909695505050505050565b6000806040838503121561339557600080fd5b82356133a0816131a8565b9150602083013580151581146133b557600080fd5b809150509250929050565b600080600080608085870312156133d657600080fd5b84356133e1816131a8565b935060208501356133f1816131a8565b925060408501359150606085013567ffffffffffffffff81111561341457600080fd5b8501601f8101871361342557600080fd5b61343487823560208401613262565b91505092959194509250565b6000806040838503121561345357600080fd5b823561345e816131a8565b915060208301356133b5816131a8565b600181811c9082168061348257607f821691505b6020821081036134a257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156134d8576134d86134a8565b500290565b634e487b7160e01b600052601260045260246000fd5b600082613502576135026134dd565b500490565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561352f57600080fd5b5051919050565b60006020828403121561354857600080fd5b81516124aa816131a8565b60008219821115613566576135666134a8565b500190565b60006001820161357d5761357d6134a8565b5060010190565b8054600090600181811c908083168061359e57607f831692505b602080841082036135bf57634e487b7160e01b600052602260045260246000fd5b8180156135d357600181146135e457613611565b60ff19861689528489019650613611565b60008881526020902060005b868110156136095781548b8201529085019083016135f0565b505084890196505b50505050505092915050565b60006136298286613584565b8451613639818360208901613124565b61364581830186613584565b979650505050505050565b600082821015613662576136626134a8565b500390565b60008351613679818460208801613124565b83519083019061368d818360208801613124565b01949350505050565b6000826136a5576136a56134dd565b500690565b6000816136b9576136b96134a8565b506000190190565b60006001600160a01b038087168352808616602084015250836040830152608060608301526136f36080830184613150565b9695505050505050565b60006020828403121561370f57600080fd5b81516124aa816130f1565b634e487b7160e01b600052603160045260246000fdfea264697066735822122014666a1f5336033937bf5cecffadb191760db9400959ce8fbe867236ab665ce864736f6c634300080d0033
Deployed ByteCode Sourcemap
65111:8927:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73808:227;;;;;;;;;;-1:-1:-1;73808:227:0;;;;;:::i;:::-;;:::i;:::-;;;611:14:1;;604:22;586:41;;574:2;559:18;73808:227:0;;;;;;;;23260:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;24954:308::-;;;;;;;;;;-1:-1:-1;24954:308:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1738:55:1;;;1720:74;;1708:2;1693:18;24954:308:0;1574:226:1;24477:411:0;;;;;;;;;;-1:-1:-1;24477:411:0;;;;;:::i;:::-;;:::i;:::-;;45870:113;;;;;;;;;;-1:-1:-1;45958:10:0;:17;45870:113;;;2430:25:1;;;2418:2;2403:18;45870:113:0;2284:177:1;25873:376:0;;;;;;;;;;-1:-1:-1;25873:376:0;;;;;:::i;:::-;;:::i;38820:507::-;;;;;;;;;;-1:-1:-1;38820:507:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3372:55:1;;;3354:74;;3459:2;3444:18;;3437:34;;;;3327:18;38820:507:0;3180:297:1;45451:343:0;;;;;;;;;;-1:-1:-1;45451:343:0;;;;;:::i;:::-;;:::i;65689:31::-;;;;;;;;;;-1:-1:-1;65689:31:0;;;;-1:-1:-1;;;;;65689:31:0;;;65518:32;;;;;;;;;;;;;;;;65557:38;;;;;;;;;;;;;;;;71686:824;;;;;;;;;;;;;:::i;71519:65::-;;;;;;;;;;;;;:::i;26320:185::-;;;;;;;;;;-1:-1:-1;26320:185:0;;;;;:::i;:::-;;:::i;70707:182::-;;;;;;;;;;-1:-1:-1;70707:182:0;;;;;:::i;:::-;;:::i;46060:320::-;;;;;;;;;;-1:-1:-1;46060:320:0;;;;;:::i;:::-;;:::i;69870:101::-;;;;;;;;;;-1:-1:-1;69870:101:0;;;;;:::i;:::-;;:::i;52580:86::-;;;;;;;;;;-1:-1:-1;52651:7:0;;;;52580:86;;22867:326;;;;;;;;;;-1:-1:-1;22867:326:0;;;;;:::i;:::-;;:::i;22510:295::-;;;;;;;;;;-1:-1:-1;22510:295:0;;;;;:::i;:::-;;:::i;58179:112::-;;;;;;;;;;;;;:::i;57611:217::-;;;;;;;;;;;;;:::i;69730:61::-;;;;;;;;;;;;;:::i;56714:96::-;;;;;;;;;;-1:-1:-1;56796:6:0;;;;;-1:-1:-1;;;;;56796:6:0;56714:96;;23429:104;;;;;;;;;;;;;:::i;67867:1113::-;;;;;;;;;;-1:-1:-1;67867:1113:0;;;;;:::i;:::-;;:::i;65640:42::-;;;;;;;;;;;;;;;;66312:39;;;;;;;;;;-1:-1:-1;66312:39:0;;;;-1:-1:-1;;;;;66312:39:0;;;69067:604;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;25334:187::-;;;;;;;;;;-1:-1:-1;25334:187:0;;;;;:::i;:::-;;:::i;70074:529::-;;;;;;;;;;;;;:::i;26576:365::-;;;;;;;;;;-1:-1:-1;26576:365:0;;;;;:::i;:::-;;:::i;70981:477::-;;;;;;;;;;-1:-1:-1;70981:477:0;;;;;:::i;:::-;;:::i;57200:284::-;;;;;;;;;;-1:-1:-1;57200:284:0;;;;;:::i;:::-;;:::i;65475:36::-;;;;;;;;;;;;;;;;25592:214;;;;;;;;;;-1:-1:-1;25592:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;25763:25:0;;;25734:4;25763:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;25592:214;58446:288;;;;;;;;;;-1:-1:-1;58446:288:0;;;;;:::i;:::-;;:::i;73808:227::-;73962:4;73991:36;74015:11;73991:23;:36::i;:::-;73984:43;73808:227;-1:-1:-1;;73808:227:0:o;23260:100::-;23314:13;23347:5;23340:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23260:100;:::o;24954:308::-;25075:7;28577:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28577:16:0;25100:110;;;;-1:-1:-1;;;25100:110:0;;8422:2:1;25100:110:0;;;8404:21:1;8461:2;8441:18;;;8434:30;8500:34;8480:18;;;8473:62;-1:-1:-1;;;8551:18:1;;;8544:42;8603:19;;25100:110:0;;;;;;;;;-1:-1:-1;25230:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;25230:24:0;;24954:308::o;24477:411::-;24558:13;24574:23;24589:7;24574:14;:23::i;:::-;24558:39;;24622:5;-1:-1:-1;;;;;24616:11:0;:2;-1:-1:-1;;;;;24616:11:0;;24608:57;;;;-1:-1:-1;;;24608:57:0;;8835:2:1;24608:57:0;;;8817:21:1;8874:2;8854:18;;;8847:30;8913:34;8893:18;;;8886:62;8984:3;8964:18;;;8957:31;9005:19;;24608:57:0;8633:397:1;24608:57:0;17434:10;-1:-1:-1;;;;;24700:21:0;;;;:62;;-1:-1:-1;24725:37:0;24742:5;17434:10;25592:214;:::i;24725:37::-;24678:168;;;;-1:-1:-1;;;24678:168:0;;9237:2:1;24678:168:0;;;9219:21:1;9276:2;9256:18;;;9249:30;9315:34;9295:18;;;9288:62;9386:26;9366:18;;;9359:54;9430:19;;24678:168:0;9035:420:1;24678:168:0;24859:21;24868:2;24872:7;24859:8;:21::i;:::-;24547:341;24477:411;;:::o;25873:376::-;26082:41;17434:10;26115:7;26082:18;:41::i;:::-;26060:140;;;;-1:-1:-1;;;26060:140:0;;9662:2:1;26060:140:0;;;9644:21:1;9701:2;9681:18;;;9674:30;9740:34;9720:18;;;9713:62;9811:19;9791:18;;;9784:47;9848:19;;26060:140:0;9460:413:1;26060:140:0;26213:28;26223:4;26229:2;26233:7;26213:9;:28::i;38820:507::-;38964:7;39027:27;;;:17;:27;;;;;;;;38998:56;;;;;;;;;-1:-1:-1;;;;;38998:56:0;;;;;-1:-1:-1;;;38998:56:0;;;;;;;;;;;;38964:7;;39067:92;;-1:-1:-1;39118:29:0;;;;;;;;;-1:-1:-1;39118:29:0;-1:-1:-1;;;;;39118:29:0;;;;-1:-1:-1;;;39118:29:0;;;;;;;;39067:92;39209:23;;;;39171:21;;39693:5;;39196:36;;39195:71;39196:36;:10;:36;:::i;:::-;39195:71;;;;:::i;:::-;39287:16;;;;;-1:-1:-1;38820:507:0;;-1:-1:-1;;;;38820:507:0:o;45451:343::-;45593:7;45648:23;45665:5;45648:16;:23::i;:::-;45640:5;:31;45618:124;;;;-1:-1:-1;;;45618:124:0;;10756:2:1;45618:124:0;;;10738:21:1;10795:2;10775:18;;;10768:30;10834:34;10814:18;;;10807:62;10905:13;10885:18;;;10878:41;10936:19;;45618:124:0;10554:407:1;45618:124:0;-1:-1:-1;;;;;;45760:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;45451:343::o;71686:824::-;56796:6;;-1:-1:-1;;;;;56796:6:0;;;;;17434:10;56943:23;56935:68;;;;-1:-1:-1;;;56935:68:0;;11168:2:1;56935:68:0;;;11150:21:1;;;11187:18;;;11180:30;11246:34;11226:18;;;11219:62;11298:18;;56935:68:0;10966:356:1;56935:68:0;71742:21:::1;71767:1;71742:26:::0;71734:62:::1;;;::::0;-1:-1:-1;;;71734:62:0;;11529:2:1;71734:62:0::1;::::0;::::1;11511:21:1::0;11568:2;11548:18;;;11541:30;11607:25;11587:18;;;11580:53;11650:18;;71734:62:0::1;11327:347:1::0;71734:62:0::1;72015:25;72074:50;:42;:48;:50::i;:::-;72015:120;;72146:8;-1:-1:-1::0;;;;;72146:19:0::1;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;72224:8;-1:-1:-1::0;;;;;72213:19:0::1;:7;56796:6:::0;;-1:-1:-1;;;;;56796:6:0;;;;;;56714:96;72213:7:::1;-1:-1:-1::0;;;;;72213:19:0::1;;72209:89;;72249:8;-1:-1:-1::0;;;;;72249:17:0::1;;72267:7;56796:6:::0;;-1:-1:-1;;;;;56796:6:0;;;;;;56714:96;72267:7:::1;72249:30;::::0;-1:-1:-1;;;;;;72249:30:0::1;::::0;;;;;;-1:-1:-1;;;;;3372:55:1;;;72249:30:0::1;::::0;::::1;3354:74:1::0;72276:2:0::1;3444:18:1::0;;;3437:34;3327:18;;72249:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;72209:89;72308:30;::::0;;;;-1:-1:-1;;;;;72326:8:0::1;3372:55:1::0;;72308:30:0::1;::::0;::::1;3354:74:1::0;72336:1:0::1;3444:18:1::0;;;3437:34;72308:17:0;::::1;::::0;::::1;::::0;3327:18:1;;72308:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;72357:58:0::1;::::0;-1:-1:-1;;;;;72357:35:0;::::1;::::0;-1:-1:-1;72393:21:0::1;72357:58:::0;::::1;;;::::0;-1:-1:-1;72393:21:0;72357:58:::1;::::0;;;72393:21;72357:35;:58;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;72446:8;-1:-1:-1::0;;;;;72446:19:0::1;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;71723:787;71686:824::o:0;71519:65::-;56796:6;;-1:-1:-1;;;;;56796:6:0;;;;;17434:10;56943:23;56935:68;;;;-1:-1:-1;;;56935:68:0;;11168:2:1;56935:68:0;;;11150:21:1;;;11187:18;;;11180:30;11246:34;11226:18;;;11219:62;11298:18;;56935:68:0;10966:356:1;56935:68:0;71566:10:::1;:8;:10::i;:::-;71519:65::o:0;26320:185::-;26458:39;26475:4;26481:2;26485:7;26458:39;;;;;;;;;;;;:16;:39::i;70707:182::-;70817:13;17434:10;66578:7;-1:-1:-1;;;;;66562:23:0;;66554:55;;;;-1:-1:-1;;;66554:55:0;;12502:2:1;66554:55:0;;;12484:21:1;12541:2;12521:18;;;12514:30;12580:21;12560:18;;;12553:49;12619:18;;66554:55:0;12300:343:1;66554:55:0;70855:26:::1;70873:7;70855:17;:26::i;66620:1::-;70707:182:::0;;;:::o;46060:320::-;46180:7;46235:30;45958:10;:17;;45870:113;46235:30;46227:5;:38;46205:132;;;;-1:-1:-1;;;46205:132:0;;12850:2:1;46205:132:0;;;12832:21:1;12889:2;12869:18;;;12862:30;12928:34;12908:18;;;12901:62;12999:14;12979:18;;;12972:42;13031:19;;46205:132:0;12648:408:1;46205:132:0;46355:10;46366:5;46355:17;;;;;;;;:::i;:::-;;;;;;;;;46348:24;;46060:320;;;:::o;69870:101::-;56796:6;;-1:-1:-1;;;;;56796:6:0;;;;;17434:10;56943:23;56935:68;;;;-1:-1:-1;;;56935:68:0;;11168:2:1;56935:68:0;;;11150:21:1;;;11187:18;;;11180:30;11246:34;11226:18;;;11219:62;11298:18;;56935:68:0;10966:356:1;56935:68:0;69943:20;;::::1;::::0;:8:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;:::-;;69870:101:::0;:::o;22867:326::-;22984:7;23025:16;;;:7;:16;;;;;;-1:-1:-1;;;;;23025:16:0;;23052:110;;;;-1:-1:-1;;;23052:110:0;;13452:2:1;23052:110:0;;;13434:21:1;13491:2;13471:18;;;13464:30;13530:34;13510:18;;;13503:62;13601:11;13581:18;;;13574:39;13630:19;;23052:110:0;13250:405:1;22510:295:0;22627:7;-1:-1:-1;;;;;22674:19:0;;22652:111;;;;-1:-1:-1;;;22652:111:0;;13862:2:1;22652:111:0;;;13844:21:1;13901:2;13881:18;;;13874:30;13940:34;13920:18;;;13913:62;14011:12;13991:18;;;13984:40;14041:19;;22652:111:0;13660:406:1;22652:111:0;-1:-1:-1;;;;;;22781:16:0;;;;;:9;:16;;;;;;;22510:295::o;58179:112::-;56796:6;;-1:-1:-1;;;;;56796:6:0;;;;;17434:10;56943:23;56935:68;;;;-1:-1:-1;;;56935:68:0;;11168:2:1;56935:68:0;;;11150:21:1;;;11187:18;;;11180:30;11246:34;11226:18;;;11219:62;11298:18;;56935:68:0;10966:356:1;56935:68:0;58253:30:::1;58280:1;58253:18;:30::i;57611:217::-:0;57693:9;;-1:-1:-1;;;;;57693:9:0;57679:10;:23;57671:70;;;;-1:-1:-1;;;57671:70:0;;14273:2:1;57671:70:0;;;14255:21:1;14312:2;14292:18;;;14285:30;14351:34;14331:18;;;14324:62;14422:4;14402:18;;;14395:32;14444:19;;57671:70:0;14071:398:1;57671:70:0;57781:9;;57773:6;;57757:34;;-1:-1:-1;;;;;57781:9:0;;;;;57773:6;;;;;;;57757:34;;57781:9;;57757:34;57811:9;;57802:6;:18;;-1:-1:-1;;;;;57811:9:0;;;;57802:18;-1:-1:-1;;57802:18:0;;;;;;;;;57611:217::o;69730:61::-;56796:6;;-1:-1:-1;;;;;56796:6:0;;;;;17434:10;56943:23;56935:68;;;;-1:-1:-1;;;56935:68:0;;11168:2:1;56935:68:0;;;11150:21:1;;;11187:18;;;11180:30;11246:34;11226:18;;;11219:62;11298:18;;56935:68:0;10966:356:1;56935:68:0;69775:8:::1;:6;:8::i;23429:104::-:0;23485:13;23518:7;23511:14;;;;;:::i;67867:1113::-;56796:6;;-1:-1:-1;;;;;56796:6:0;;;;;17434:10;56943:23;56935:68;;;;-1:-1:-1;;;56935:68:0;;11168:2:1;56935:68:0;;;11150:21:1;;;11187:18;;;11180:30;11246:34;11226:18;;;11219:62;11298:18;;56935:68:0;10966:356:1;56935:68:0;65801:8:::1;::::0;-1:-1:-1;;;;;65801:8:0::1;65771:112;;;::::0;-1:-1:-1;;;65771:112:0;;14676:2:1;65771:112:0::1;::::0;::::1;14658:21:1::0;14715:2;14695:18;;;14688:30;14754:33;14734:18;;;14727:61;14805:18;;65771:112:0::1;14474:355:1::0;65771:112:0::1;53372:14:::2;53389:8;52651:7:::0;;;;;52580:86;53389:8:::2;53372:25;;53412:9;53408:52;;;53438:10;:8;:10::i;:::-;68021:8:::3;::::0;:17:::3;::::0;;;;;;;68005:13:::3;::::0;-1:-1:-1;;;;;68021:8:0::3;::::0;:15:::3;::::0;:17:::3;::::0;;::::3;::::0;::::3;::::0;;;;;;;;:8;:17:::3;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68005:33;;68097:5;68071:23;;:31;68049:112;;;::::0;-1:-1:-1;;;68049:112:0;;15225:2:1;68049:112:0::3;::::0;::::3;15207:21:1::0;15264:2;15244:18;;;15237:30;15303:33;15283:18;;;15276:61;15354:18;;68049:112:0::3;15023:355:1::0;68049:112:0::3;68174:17;68206:559;68289:5;68263:23;;:31;68206:559;;;68377:8;::::0;68394:23:::3;::::0;68377:41:::3;::::0;;;;::::3;::::0;::::3;2430:25:1::0;;;;68361:13:0::3;::::0;-1:-1:-1;;;;;68377:8:0::3;::::0;:16:::3;::::0;2403:18:1;;68377:41:0::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68361:57:::0;-1:-1:-1;;;;;;68440:16:0;::::3;9263:19:::0;68435:181:::3;;68552:15;68561:5;68552:8;:15::i;:::-;-1:-1:-1::0;68586:14:0::3;68599:1;68586:14:::0;::::3;:::i;:::-;;;68435:181;68649:6;68636:9;:19:::0;68632:122:::3;;68676:5;;;68632:122;-1:-1:-1::0;68309:23:0::3;:25:::0;;;:23:::3;:25;::::0;::::3;:::i;:::-;;;;;;68206:559;;;68781:14:::0;;68777:196:::3;;68839:1;68812:23;;:28;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;68939:22:0::3;::::0;2430:25:1;;;68939:22:0::3;::::0;2418:2:1;2403:18;68939:22:0::3;;;;;;;68777:196;67994:986;;53486:9:::2;53482:50;;;53512:8;:6;:8::i;69067:604::-:0;69120:16;69157:5;69166:1;69157:10;69149:53;;;;-1:-1:-1;;;69149:53:0;;16114:2:1;69149:53:0;;;16096:21:1;16153:2;16133:18;;;16126:30;16192:32;16172:18;;;16165:60;16242:18;;69149:53:0;15912:354:1;69149:53:0;69244:19;;69235:5;:28;;69213:114;;;;-1:-1:-1;;;69213:114:0;;16473:2:1;69213:114:0;;;16455:21:1;16512:2;16492:18;;;16485:30;16551:34;16531:18;;;16524:62;16622:6;16602:18;;;16595:34;16646:19;;69213:114:0;16271:400:1;69213:114:0;69387:5;69373:11;;:19;;;;:::i;:::-;69360:9;:32;69338:125;;;;-1:-1:-1;;;69338:125:0;;16878:2:1;69338:125:0;;;16860:21:1;16917:2;16897:18;;;16890:30;16956:34;16936:18;;;16929:62;17027:13;17007:18;;;17000:41;17058:19;;69338:125:0;16676:407:1;69338:125:0;69476:25;69518:5;69504:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;69504:20:0;;69476:48;;69542:9;69537:99;69561:5;69557:1;:9;69537:99;;;69602:22;17434:10;69602:8;:22::i;:::-;69588:8;69597:1;69588:11;;;;;;;;:::i;:::-;;;;;;;;;;:36;69568:3;;;;:::i;:::-;;;;69537:99;;;-1:-1:-1;69655:8:0;69067:604;-1:-1:-1;;69067:604:0:o;25334:187::-;25461:52;17434:10;25494:8;25504;25461:18;:52::i;70074:529::-;56796:6;;-1:-1:-1;;;;;56796:6:0;;;;;17434:10;56943:23;56935:68;;;;-1:-1:-1;;;56935:68:0;;11168:2:1;56935:68:0;;;11150:21:1;;;11187:18;;;11180:30;11246:34;11226:18;;;11219:62;11298:18;;56935:68:0;10966:356:1;56935:68:0;65986:8:::1;::::0;-1:-1:-1;;;;;65986:8:0::1;65978:31:::0;65956:116:::1;;;::::0;-1:-1:-1;;;65956:116:0;;17290:2:1;65956:116:0::1;::::0;::::1;17272:21:1::0;17329:2;17309:18;;;17302:30;17368:34;17348:18;;;17341:62;17439:5;17419:18;;;17412:33;17462:19;;65956:116:0::1;17088:399:1::0;65956:116:0::1;70259:50:::2;:42;:48;:50::i;:::-;70218:8;:102:::0;;-1:-1:-1;;;;;;70218:102:0::2;-1:-1:-1::0;;;;;70218:102:0;;;::::2;::::0;;::::2;::::0;;70331:127:::2;::::0;;;;70383:42:::2;70331:127;::::0;::::2;1720:74:1::0;70331:19:0::2;::::0;1693:18:1;;70331:127:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;70567:8;;;;;;;;;-1:-1:-1::0;;;;;70567:8:0::2;-1:-1:-1::0;;;;;70567:15:0::2;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70516:8;::::0;70476:119:::2;::::0;70540:12:::2;::::0;-1:-1:-1;;;;;70516:8:0::2;::::0;70476:119:::2;::::0;70516:8:::2;::::0;70476:119:::2;70074:529::o:0;26576:365::-;26765:41;17434:10;26798:7;26765:18;:41::i;:::-;26743:140;;;;-1:-1:-1;;;26743:140:0;;9662:2:1;26743:140:0;;;9644:21:1;9701:2;9681:18;;;9674:30;9740:34;9720:18;;;9713:62;9811:19;9791:18;;;9784:47;9848:19;;26743:140:0;9460:413:1;26743:140:0;26894:39;26908:4;26914:2;26918:7;26927:5;26894:13;:39::i;:::-;26576:365;;;;:::o;70981:477::-;28553:4;28577:16;;;:7;:16;;;;;;71082:13;;-1:-1:-1;;;;;28577:16:0;71113:113;;;;-1:-1:-1;;;71113:113:0;;17951:2:1;71113:113:0;;;17933:21:1;17990:2;17970:18;;;17963:30;18029:34;18009:18;;;18002:62;18100:17;18080:18;;;18073:45;18135:19;;71113:113:0;17749:411:1;71113:113:0;71323:8;71354:26;71372:7;71354:17;:26::i;:::-;71403:13;71284:151;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;71239:211;;70981:477;;;:::o;57200:284::-;56796:6;;-1:-1:-1;;;;;56796:6:0;;;;;17434:10;56943:23;56935:68;;;;-1:-1:-1;;;56935:68:0;;11168:2:1;56935:68:0;;;11150:21:1;;;11187:18;;;11180:30;11246:34;11226:18;;;11219:62;11298:18;;56935:68:0;10966:356:1;56935:68:0;-1:-1:-1;;;;;57308:22:0;::::1;57286:110;;;::::0;-1:-1:-1;;;57286:110:0;;19989:2:1;57286:110:0::1;::::0;::::1;19971:21:1::0;20028:2;20008:18;;;20001:30;20067:34;20047:18;;;20040:62;-1:-1:-1;;;20118:18:1;;;20111:36;20164:19;;57286:110:0::1;19787:402:1::0;57286:110:0::1;57428:6;::::0;57412:33:::1;::::0;-1:-1:-1;;;;;57412:33:0;;::::1;::::0;57428:6:::1;::::0;::::1;;::::0;57412:33:::1;::::0;;;::::1;57456:9;:20:::0;;-1:-1:-1;;;;;;57456:20:0::1;-1:-1:-1::0;;;;;57456:20:0;;;::::1;::::0;;;::::1;::::0;;57200:284::o;58446:288::-;56796:6;;-1:-1:-1;;;;;56796:6:0;;;;;17434:10;56943:23;56935:68;;;;-1:-1:-1;;;56935:68:0;;11168:2:1;56935:68:0;;;11150:21:1;;;11187:18;;;11180:30;11246:34;11226:18;;;11219:62;11298:18;;56935:68:0;10966:356:1;56935:68:0;-1:-1:-1;;;;;58599:22:0;::::1;58577:110;;;::::0;-1:-1:-1;;;58577:110:0;;19989:2:1;58577:110:0::1;::::0;::::1;19971:21:1::0;20028:2;20008:18;;;20001:30;20067:34;20047:18;;;20040:62;-1:-1:-1;;;20118:18:1;;;20111:36;20164:19;;58577:110:0::1;19787:402:1::0;58577:110:0::1;58698:28;58717:8;58698:18;:28::i;:::-;58446:288:::0;:::o;60066:622::-;60123:16;60193:4;60187:11;60259:66;60237:3;60212:128;60387:14;60381:4;60377:25;60370:4;60365:3;60361:14;60354:49;60475:66;60451:4;60446:3;60442:14;60417:139;60597:4;60592:3;60589:1;60582:20;60570:32;-1:-1:-1;;;;;;;60631:22:0;;60623:57;;;;-1:-1:-1;;;60623:57:0;;20396:2:1;60623:57:0;;;20378:21:1;20435:2;20415:18;;;20408:30;20474:24;20454:18;;;20447:52;20516:18;;60623:57:0;20194:346:1;42536:220:0;42683:4;42712:36;42736:11;42712:23;:36::i;32775:174::-;32850:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;32850:29:0;-1:-1:-1;;;;;32850:29:0;;;;;;;;:24;;32904:23;32850:24;32904:14;:23::i;:::-;-1:-1:-1;;;;;32895:46:0;;;;;;;;;;;32775:174;;:::o;28782:452::-;28911:4;28577:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28577:16:0;28933:110;;;;-1:-1:-1;;;28933:110:0;;20747:2:1;28933:110:0;;;20729:21:1;20786:2;20766:18;;;20759:30;20825:34;20805:18;;;20798:62;-1:-1:-1;;;20876:18:1;;;20869:42;20928:19;;28933:110:0;20545:408:1;28933:110:0;29054:13;29070:23;29085:7;29070:14;:23::i;:::-;29054:39;;29123:5;-1:-1:-1;;;;;29112:16:0;:7;-1:-1:-1;;;;;29112:16:0;;:64;;;;29169:7;-1:-1:-1;;;;;29145:31:0;:20;29157:7;29145:11;:20::i;:::-;-1:-1:-1;;;;;29145:31:0;;29112:64;:113;;;-1:-1:-1;;;;;;25763:25:0;;;25734:4;25763:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;29193:32;29104:122;28782:452;-1:-1:-1;;;;28782:452:0:o;31995:662::-;32168:4;-1:-1:-1;;;;;32141:31:0;:23;32156:7;32141:14;:23::i;:::-;-1:-1:-1;;;;;32141:31:0;;32119:118;;;;-1:-1:-1;;;32119:118:0;;21160:2:1;32119:118:0;;;21142:21:1;21199:2;21179:18;;;21172:30;21238:34;21218:18;;;21211:62;21309:7;21289:18;;;21282:35;21334:19;;32119:118:0;20958:401:1;32119:118:0;-1:-1:-1;;;;;32256:16:0;;32248:65;;;;-1:-1:-1;;;32248:65:0;;21566:2:1;32248:65:0;;;21548:21:1;21605:2;21585:18;;;21578:30;21644:34;21624:18;;;21617:62;21715:6;21695:18;;;21688:34;21739:19;;32248:65:0;21364:400:1;32248:65:0;32326:39;32347:4;32353:2;32357:7;32326:20;:39::i;:::-;32430:29;32447:1;32451:7;32430:8;:29::i;:::-;-1:-1:-1;;;;;32472:15:0;;;;;;:9;:15;;;;;:20;;32491:1;;32472:15;:20;;32491:1;;32472:20;:::i;:::-;;;;-1:-1:-1;;;;;;;32503:13:0;;;;;;:9;:13;;;;;:18;;32520:1;;32503:13;:18;;32520:1;;32503:18;:::i;:::-;;;;-1:-1:-1;;32532:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32532:21:0;-1:-1:-1;;;;;32532:21:0;;;;;;;;;32571:27;;32532:16;;32571:27;;;;;;;32611:38;32631:4;32637:2;32641:7;32611:19;:38::i;53942:120::-;52651:7;;;;53175:41;;;;-1:-1:-1;;;53175:41:0;;22101:2:1;53175:41:0;;;22083:21:1;22140:2;22120:18;;;22113:30;22179:22;22159:18;;;22152:50;22219:18;;53175:41:0;21899:344:1;53175:41:0;54001:7:::1;:15:::0;;-1:-1:-1;;54001:15:0::1;::::0;;54032:22:::1;17434:10:::0;54041:12:::1;54032:22;::::0;-1:-1:-1;;;;;1738:55:1;;;1720:74;;1708:2;1693:18;54032:22:0::1;;;;;;;53942:120::o:0;72596:321::-;72690:13;72741:168;72906:2;72816:22;:11;:20;:22::i;:::-;72840:18;:7;:16;:18::i;:::-;72799:60;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;72799:60:0;;;;;;;;;72767:111;;72799:60;72767:111;;;;;72741:164;:168::i;58894:191::-;58987:6;;;-1:-1:-1;;;;;59004:17:0;;;58987:6;59004:17;;;-1:-1:-1;;59004:17:0;;;;;;59037:40;;58987:6;;;;;;;;59037:40;;58968:16;;59037:40;58957:128;58894:191;:::o;53683:118::-;52651:7;;;;52905:9;52897:38;;;;-1:-1:-1;;;52897:38:0;;22925:2:1;52897:38:0;;;22907:21:1;22964:2;22944:18;;;22937:30;23003:18;22983;;;22976:46;23039:18;;52897:38:0;22723:340:1;52897:38:0;53743:7:::1;:14:::0;;-1:-1:-1;;53743:14:0::1;53753:4;53743:14;::::0;;53773:20:::1;53780:12;17434:10:::0;;17354:98;72925:280;72974:7;72994:14;73011:13;45958:10;:17;;45870:113;73011:13;73057:10;;72994:30;;-1:-1:-1;73043:10:0;72994:30;73052:1;73043:10;:::i;:::-;:24;;73035:58;;;;-1:-1:-1;;;73035:58:0;;23270:2:1;73035:58:0;;;23252:21:1;23309:2;23289:18;;;23282:30;23348:23;23328:18;;;23321:51;23389:18;;73035:58:0;23068:345:1;73035:58:0;73106:15;73124:10;:6;73133:1;73124:10;:::i;:::-;73106:28;;73147:23;73157:3;73162:7;73147:9;:23::i;:::-;73190:7;72925:280;-1:-1:-1;;;72925:280:0:o;33091:315::-;33246:8;-1:-1:-1;;;;;33237:17:0;:5;-1:-1:-1;;;;;33237:17:0;;33229:55;;;;-1:-1:-1;;;33229:55:0;;23620:2:1;33229:55:0;;;23602:21:1;23659:2;23639:18;;;23632:30;23698:27;23678:18;;;23671:55;23743:18;;33229:55:0;23418:349:1;33229:55:0;-1:-1:-1;;;;;33295:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;33295:46:0;;;;;;;;;;33357:41;;586::1;;;33357::0;;559:18:1;33357:41:0;;;;;;;33091:315;;;:::o;27823:352::-;27980:28;27990:4;27996:2;28000:7;27980:9;:28::i;:::-;28041:48;28064:4;28070:2;28074:7;28083:5;28041:22;:48::i;:::-;28019:148;;;;-1:-1:-1;;;28019:148:0;;23974:2:1;28019:148:0;;;23956:21:1;24013:2;23993:18;;;23986:30;24052:34;24032:18;;;24025:62;-1:-1:-1;;;24103:18:1;;;24096:48;24161:19;;28019:148:0;23772:414:1;45067:300:0;45214:4;-1:-1:-1;;;;;;45256:50:0;;45271:35;45256:50;;:103;;;45323:36;45347:11;45323:23;:36::i;73213:231::-;73391:45;73418:4;73424:2;73428:7;73391:26;:45::i;73452:228::-;73587:15;;;;;;;;;-1:-1:-1;;;;;73587:15:0;-1:-1:-1;;;;;73587:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24547:341;24477:411;;:::o;17903:723::-;17959:13;18180:5;18189:1;18180:10;18176:53;;-1:-1:-1;;18207:10:0;;;;;;;;;;;;-1:-1:-1;;;18207:10:0;;;;;17903:723::o;18176:53::-;18254:5;18239:12;18295:78;18302:9;;18295:78;;18328:8;;;;:::i;:::-;;-1:-1:-1;18351:10:0;;-1:-1:-1;18359:2:0;18351:10;;:::i;:::-;;;18295:78;;;18383:19;18415:6;18405:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18405:17:0;;18383:39;;18433:154;18440:10;;18433:154;;18467:11;18477:1;18467:11;;:::i;:::-;;-1:-1:-1;18536:10:0;18544:2;18536:5;:10;:::i;:::-;18523:24;;:2;:24;:::i;:::-;18510:39;;18493:6;18500;18493:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;18493:56:0;;;;;;;;-1:-1:-1;18564:11:0;18573:2;18564:11;;:::i;:::-;;;18433:154;;19204:483;19306:13;19337:19;19369:10;19373:6;19369:1;:10;:::i;:::-;:14;;19382:1;19369:14;:::i;:::-;19359:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19359:25:0;;19337:47;;-1:-1:-1;;;19395:6:0;19402:1;19395:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;19395:15:0;;;;;;;;;19421;:6;19428:1;19421:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;19421:15:0;;;;;;;;-1:-1:-1;19452:9:0;19464:10;19468:6;19464:1;:10;:::i;:::-;:14;;19477:1;19464:14;:::i;:::-;19452:26;;19447:135;19484:1;19480;:5;19447:135;;;19519:12;19532:5;19540:3;19532:11;19519:25;;;;;;;:::i;:::-;;;;19507:6;19514:1;19507:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;19507:37:0;;;;;;;;-1:-1:-1;19569:1:0;19559:11;;;;;19487:3;;;:::i;:::-;;;19447:135;;;-1:-1:-1;19600:10:0;;19592:55;;;;-1:-1:-1;;;19592:55:0;;24651:2:1;19592:55:0;;;24633:21:1;;;24670:18;;;24663:30;24729:34;24709:18;;;24702:62;24781:18;;19592:55:0;24449:356:1;29576:110:0;29652:26;29662:2;29666:7;29652:26;;;;;;;;;;;;:9;:26::i;33971:980::-;34126:4;-1:-1:-1;;;;;34147:13:0;;9263:19;:23;34143:801;;34200:175;;-1:-1:-1;;;34200:175:0;;-1:-1:-1;;;;;34200:36:0;;;;;:175;;17434:10;;34294:4;;34321:7;;34351:5;;34200:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34200:175:0;;;;;;;;-1:-1:-1;;34200:175:0;;;;;;;;;;;;:::i;:::-;;;34179:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34558:6;:13;34575:1;34558:18;34554:320;;34601:108;;-1:-1:-1;;;34601:108:0;;23974:2:1;34601:108:0;;;23956:21:1;24013:2;23993:18;;;23986:30;24052:34;24032:18;;;24025:62;-1:-1:-1;;;24103:18:1;;;24096:48;24161:19;;34601:108:0;23772:414:1;34554:320:0;34824:6;34818:13;34809:6;34805:2;34801:15;34794:38;34179:710;-1:-1:-1;;;;;;34439:51:0;-1:-1:-1;;;34439:51:0;;-1:-1:-1;34432:58:0;;34143:801;-1:-1:-1;34928:4:0;33971:980;;;;;;:::o;22091:355::-;22238:4;-1:-1:-1;;;;;;22280:40:0;;22295:25;22280:40;;:105;;-1:-1:-1;;;;;;;22337:48:0;;22352:33;22337:48;22280:105;:158;;;;22402:36;22426:11;22402:23;:36::i;54713:275::-;54857:45;54884:4;54890:2;54894:7;54857:26;:45::i;:::-;52651:7;;;;54923:9;54915:65;;;;-1:-1:-1;;;54915:65:0;;25783:2:1;54915:65:0;;;25765:21:1;25822:2;25802:18;;;25795:30;25861:34;25841:18;;;25834:62;25932:13;25912:18;;;25905:41;25963:19;;54915:65:0;25581:407:1;29913:321:0;30043:18;30049:2;30053:7;30043:5;:18::i;:::-;30094:54;30125:1;30129:2;30133:7;30142:5;30094:22;:54::i;:::-;30072:154;;;;-1:-1:-1;;;30072:154:0;;23974:2:1;30072:154:0;;;23956:21:1;24013:2;23993:18;;;23986:30;24052:34;24032:18;;;24025:62;-1:-1:-1;;;24103:18:1;;;24096:48;24161:19;;30072:154:0;23772:414:1;38474:291:0;38621:4;-1:-1:-1;;;;;;38663:41:0;;38678:26;38663:41;;:94;;-1:-1:-1;20701:25:0;-1:-1:-1;;;;;;20686:40:0;;;38721:36;20527:207;46993:589;-1:-1:-1;;;;;47199:18:0;;47195:187;;47234:40;47266:7;48409:10;:17;;48382:24;;;;:15;:24;;;;;:44;;;48437:24;;;;;;;;;;;;48305:164;47234:40;47195:187;;;47304:2;-1:-1:-1;;;;;47296:10:0;:4;-1:-1:-1;;;;;47296:10:0;;47292:90;;47323:47;47356:4;47362:7;47323:32;:47::i;:::-;-1:-1:-1;;;;;47396:16:0;;47392:183;;47429:45;47466:7;47429:36;:45::i;47392:183::-;47502:4;-1:-1:-1;;;;;47496:10:0;:2;-1:-1:-1;;;;;47496:10:0;;47492:83;;47523:40;47551:2;47555:7;47523:27;:40::i;30570:439::-;-1:-1:-1;;;;;30650:16:0;;30642:61;;;;-1:-1:-1;;;30642:61:0;;26195:2:1;30642:61:0;;;26177:21:1;;;26214:18;;;26207:30;26273:34;26253:18;;;26246:62;26325:18;;30642:61:0;25993:356:1;30642:61:0;28553:4;28577:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28577:16:0;:30;30714:58;;;;-1:-1:-1;;;30714:58:0;;26556:2:1;30714:58:0;;;26538:21:1;26595:2;26575:18;;;26568:30;26634;26614:18;;;26607:58;26682:18;;30714:58:0;26354:352:1;30714:58:0;30785:45;30814:1;30818:2;30822:7;30785:20;:45::i;:::-;-1:-1:-1;;;;;30843:13:0;;;;;;:9;:13;;;;;:18;;30860:1;;30843:13;:18;;30860:1;;30843:18;:::i;:::-;;;;-1:-1:-1;;30872:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30872:21:0;-1:-1:-1;;;;;30872:21:0;;;;;;;;30911:33;;30872:16;;;30911:33;;30872:16;;30911:33;30957:44;30985:1;30989:2;30993:7;30957:19;:44::i;49096:1002::-;49376:22;49426:1;49401:22;49418:4;49401:16;:22::i;:::-;:26;;;;:::i;:::-;49438:18;49459:26;;;:17;:26;;;;;;49376:51;;-1:-1:-1;49592:28:0;;;49588:328;;-1:-1:-1;;;;;49659:18:0;;49637:19;49659:18;;;:12;:18;;;;;;;;:34;;;;;;;;;49710:30;;;;;;:44;;;49827:30;;:17;:30;;;;;:43;;;49588:328;-1:-1:-1;50012:26:0;;;;:17;:26;;;;;;;;50005:33;;;-1:-1:-1;;;;;50056:18:0;;;;;:12;:18;;;;;:34;;;;;;;50049:41;49096:1002::o;50393:1079::-;50671:10;:17;50646:22;;50671:21;;50691:1;;50671:21;:::i;:::-;50703:18;50724:24;;;:15;:24;;;;;;51097:10;:26;;50646:46;;-1:-1:-1;50724:24:0;;50646:46;;51097:26;;;;;;:::i;:::-;;;;;;;;;51075:48;;51161:11;51136:10;51147;51136:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;51241:28;;;:15;:28;;;;;;;:41;;;51413:24;;;;;51406:31;51448:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;50464:1008;;;50393:1079;:::o;47883:221::-;47968:14;47985:20;48002:2;47985:16;:20::i;:::-;-1:-1:-1;;;;;48016:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;48061:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;47883:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:177:1;-1:-1:-1;;;;;;92:5:1;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;638:258::-;710:1;720:113;734:6;731:1;728:13;720:113;;;810:11;;;804:18;791:11;;;784:39;756:2;749:10;720:113;;;851:6;848:1;845:13;842:48;;;-1:-1:-1;;886:1:1;868:16;;861:27;638:258::o;901:::-;943:3;981:5;975:12;1008:6;1003:3;996:19;1024:63;1080:6;1073:4;1068:3;1064:14;1057:4;1050:5;1046:16;1024:63;:::i;:::-;1141:2;1120:15;-1:-1:-1;;1116:29:1;1107:39;;;;1148:4;1103:50;;901:258;-1:-1:-1;;901:258:1:o;1164:220::-;1313:2;1302:9;1295:21;1276:4;1333:45;1374:2;1363:9;1359:18;1351:6;1333:45;:::i;1389:180::-;1448:6;1501:2;1489:9;1480:7;1476:23;1472:32;1469:52;;;1517:1;1514;1507:12;1469:52;-1:-1:-1;1540:23:1;;1389:180;-1:-1:-1;1389:180:1:o;1805:154::-;-1:-1:-1;;;;;1884:5:1;1880:54;1873:5;1870:65;1860:93;;1949:1;1946;1939:12;1964:315;2032:6;2040;2093:2;2081:9;2072:7;2068:23;2064:32;2061:52;;;2109:1;2106;2099:12;2061:52;2148:9;2135:23;2167:31;2192:5;2167:31;:::i;:::-;2217:5;2269:2;2254:18;;;;2241:32;;-1:-1:-1;;;1964:315:1:o;2466:456::-;2543:6;2551;2559;2612:2;2600:9;2591:7;2587:23;2583:32;2580:52;;;2628:1;2625;2618:12;2580:52;2667:9;2654:23;2686:31;2711:5;2686:31;:::i;:::-;2736:5;-1:-1:-1;2793:2:1;2778:18;;2765:32;2806:33;2765:32;2806:33;:::i;:::-;2466:456;;2858:7;;-1:-1:-1;;;2912:2:1;2897:18;;;;2884:32;;2466:456::o;2927:248::-;2995:6;3003;3056:2;3044:9;3035:7;3031:23;3027:32;3024:52;;;3072:1;3069;3062:12;3024:52;-1:-1:-1;;3095:23:1;;;3165:2;3150:18;;;3137:32;;-1:-1:-1;2927:248:1:o;3737:184::-;-1:-1:-1;;;3786:1:1;3779:88;3886:4;3883:1;3876:15;3910:4;3907:1;3900:15;3926:632;3991:5;4021:18;4062:2;4054:6;4051:14;4048:40;;;4068:18;;:::i;:::-;4143:2;4137:9;4111:2;4197:15;;-1:-1:-1;;4193:24:1;;;4219:2;4189:33;4185:42;4173:55;;;4243:18;;;4263:22;;;4240:46;4237:72;;;4289:18;;:::i;:::-;4329:10;4325:2;4318:22;4358:6;4349:15;;4388:6;4380;4373:22;4428:3;4419:6;4414:3;4410:16;4407:25;4404:45;;;4445:1;4442;4435:12;4404:45;4495:6;4490:3;4483:4;4475:6;4471:17;4458:44;4550:1;4543:4;4534:6;4526;4522:19;4518:30;4511:41;;;;3926:632;;;;;:::o;4563:451::-;4632:6;4685:2;4673:9;4664:7;4660:23;4656:32;4653:52;;;4701:1;4698;4691:12;4653:52;4741:9;4728:23;4774:18;4766:6;4763:30;4760:50;;;4806:1;4803;4796:12;4760:50;4829:22;;4882:4;4874:13;;4870:27;-1:-1:-1;4860:55:1;;4911:1;4908;4901:12;4860:55;4934:74;5000:7;4995:2;4982:16;4977:2;4973;4969:11;4934:74;:::i;5019:247::-;5078:6;5131:2;5119:9;5110:7;5106:23;5102:32;5099:52;;;5147:1;5144;5137:12;5099:52;5186:9;5173:23;5205:31;5230:5;5205:31;:::i;5527:632::-;5698:2;5750:21;;;5820:13;;5723:18;;;5842:22;;;5669:4;;5698:2;5921:15;;;;5895:2;5880:18;;;5669:4;5964:169;5978:6;5975:1;5972:13;5964:169;;;6039:13;;6027:26;;6108:15;;;;6073:12;;;;6000:1;5993:9;5964:169;;;-1:-1:-1;6150:3:1;;5527:632;-1:-1:-1;;;;;;5527:632:1:o;6164:416::-;6229:6;6237;6290:2;6278:9;6269:7;6265:23;6261:32;6258:52;;;6306:1;6303;6296:12;6258:52;6345:9;6332:23;6364:31;6389:5;6364:31;:::i;:::-;6414:5;-1:-1:-1;6471:2:1;6456:18;;6443:32;6513:15;;6506:23;6494:36;;6484:64;;6544:1;6541;6534:12;6484:64;6567:7;6557:17;;;6164:416;;;;;:::o;6585:795::-;6680:6;6688;6696;6704;6757:3;6745:9;6736:7;6732:23;6728:33;6725:53;;;6774:1;6771;6764:12;6725:53;6813:9;6800:23;6832:31;6857:5;6832:31;:::i;:::-;6882:5;-1:-1:-1;6939:2:1;6924:18;;6911:32;6952:33;6911:32;6952:33;:::i;:::-;7004:7;-1:-1:-1;7058:2:1;7043:18;;7030:32;;-1:-1:-1;7113:2:1;7098:18;;7085:32;7140:18;7129:30;;7126:50;;;7172:1;7169;7162:12;7126:50;7195:22;;7248:4;7240:13;;7236:27;-1:-1:-1;7226:55:1;;7277:1;7274;7267:12;7226:55;7300:74;7366:7;7361:2;7348:16;7343:2;7339;7335:11;7300:74;:::i;:::-;7290:84;;;6585:795;;;;;;;:::o;7385:388::-;7453:6;7461;7514:2;7502:9;7493:7;7489:23;7485:32;7482:52;;;7530:1;7527;7520:12;7482:52;7569:9;7556:23;7588:31;7613:5;7588:31;:::i;:::-;7638:5;-1:-1:-1;7695:2:1;7680:18;;7667:32;7708:33;7667:32;7708:33;:::i;7778:437::-;7857:1;7853:12;;;;7900;;;7921:61;;7975:4;7967:6;7963:17;7953:27;;7921:61;8028:2;8020:6;8017:14;7997:18;7994:38;7991:218;;-1:-1:-1;;;8062:1:1;8055:88;8166:4;8163:1;8156:15;8194:4;8191:1;8184:15;7991:218;;7778:437;;;:::o;9878:184::-;-1:-1:-1;;;9927:1:1;9920:88;10027:4;10024:1;10017:15;10051:4;10048:1;10041:15;10067:168;10107:7;10173:1;10169;10165:6;10161:14;10158:1;10155:21;10150:1;10143:9;10136:17;10132:45;10129:71;;;10180:18;;:::i;:::-;-1:-1:-1;10220:9:1;;10067:168::o;10240:184::-;-1:-1:-1;;;10289:1:1;10282:88;10389:4;10386:1;10379:15;10413:4;10410:1;10403:15;10429:120;10469:1;10495;10485:35;;10500:18;;:::i;:::-;-1:-1:-1;10534:9:1;;10429:120::o;13061:184::-;-1:-1:-1;;;13110:1:1;13103:88;13210:4;13207:1;13200:15;13234:4;13231:1;13224:15;14834:184;14904:6;14957:2;14945:9;14936:7;14932:23;14928:32;14925:52;;;14973:1;14970;14963:12;14925:52;-1:-1:-1;14996:16:1;;14834:184;-1:-1:-1;14834:184:1:o;15383:251::-;15453:6;15506:2;15494:9;15485:7;15481:23;15477:32;15474:52;;;15522:1;15519;15512:12;15474:52;15554:9;15548:16;15573:31;15598:5;15573:31;:::i;15639:128::-;15679:3;15710:1;15706:6;15703:1;15700:13;15697:39;;;15716:18;;:::i;:::-;-1:-1:-1;15752:9:1;;15639:128::o;15772:135::-;15811:3;15832:17;;;15829:43;;15852:18;;:::i;:::-;-1:-1:-1;15899:1:1;15888:13;;15772:135::o;18291:1030::-;18376:12;;18341:3;;18431:1;18451:18;;;;18504;;;;18531:61;;18585:4;18577:6;18573:17;18563:27;;18531:61;18611:2;18659;18651:6;18648:14;18628:18;18625:38;18622:218;;-1:-1:-1;;;18693:1:1;18686:88;18797:4;18794:1;18787:15;18825:4;18822:1;18815:15;18622:218;18856:18;18883:104;;;;19001:1;18996:319;;;;18849:466;;18883:104;-1:-1:-1;;18916:24:1;;18904:37;;18961:16;;;;-1:-1:-1;18883:104:1;;18996:319;18238:1;18231:14;;;18275:4;18262:18;;19090:1;19104:165;19118:6;19115:1;19112:13;19104:165;;;19196:14;;19183:11;;;19176:35;19239:16;;;;19133:10;;19104:165;;;19108:3;;19298:6;19293:3;19289:16;19282:23;;18849:466;;;;;;;18291:1030;;;;:::o;19326:456::-;19547:3;19575:38;19609:3;19601:6;19575:38;:::i;:::-;19642:6;19636:13;19658:52;19703:6;19699:2;19692:4;19684:6;19680:17;19658:52;:::i;:::-;19726:50;19768:6;19764:2;19760:15;19752:6;19726:50;:::i;:::-;19719:57;19326:456;-1:-1:-1;;;;;;;19326:456:1:o;21769:125::-;21809:4;21837:1;21834;21831:8;21828:34;;;21842:18;;:::i;:::-;-1:-1:-1;21879:9:1;;21769:125::o;22248:470::-;22427:3;22465:6;22459:13;22481:53;22527:6;22522:3;22515:4;22507:6;22503:17;22481:53;:::i;:::-;22597:13;;22556:16;;;;22619:57;22597:13;22556:16;22653:4;22641:17;;22619:57;:::i;:::-;22692:20;;22248:470;-1:-1:-1;;;;22248:470:1:o;24191:112::-;24223:1;24249;24239:35;;24254:18;;:::i;:::-;-1:-1:-1;24288:9:1;;24191:112::o;24308:136::-;24347:3;24375:5;24365:39;;24384:18;;:::i;:::-;-1:-1:-1;;;24420:18:1;;24308:136::o;24810:512::-;25004:4;-1:-1:-1;;;;;25114:2:1;25106:6;25102:15;25091:9;25084:34;25166:2;25158:6;25154:15;25149:2;25138:9;25134:18;25127:43;;25206:6;25201:2;25190:9;25186:18;25179:34;25249:3;25244:2;25233:9;25229:18;25222:31;25270:46;25311:3;25300:9;25296:19;25288:6;25270:46;:::i;:::-;25262:54;24810:512;-1:-1:-1;;;;;;24810:512:1:o;25327:249::-;25396:6;25449:2;25437:9;25428:7;25424:23;25420:32;25417:52;;;25465:1;25462;25455:12;25417:52;25497:9;25491:16;25516:30;25540:5;25516:30;:::i;26711:184::-;-1:-1:-1;;;26760:1:1;26753:88;26860:4;26857:1;26850:15;26884:4;26881:1;26874:15
Swarm Source
ipfs://14666a1f5336033937bf5cecffadb191760db9400959ce8fbe867236ab665ce8
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Validator ID :
0 FTM
Amount Staked
0
Amount Delegated
0
Staking Total
0
Staking Start Epoch
0
Staking Start Time
0
Proof of Importance
0
Origination Score
0
Validation Score
0
Active
0
Online
0
Downtime
0 s
Address | Amount | claimed Rewards | Created On Epoch | Created On |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.