Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
2,800 CAT
Holders
1,696
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
4 CATLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
AncientCatsClub
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-11-27 */ // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.0 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts v4.4.0 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.0 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.0 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.0 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.0 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts v4.4.0 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts v4.4.0 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: @openzeppelin/contracts/finance/PaymentSplitter.sol // OpenZeppelin Contracts v4.4.0 (finance/PaymentSplitter.sol) pragma solidity ^0.8.0; /** * @title PaymentSplitter * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware * that the Ether will be split in this way, since it is handled transparently by the contract. * * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim * an amount proportional to the percentage of total shares they were assigned. * * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release} * function. * * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you * to run tests before sending real value to this contract. */ contract PaymentSplitter is Context { event PayeeAdded(address account, uint256 shares); event PaymentReleased(address to, uint256 amount); event ERC20PaymentReleased(IERC20 indexed token, address to, uint256 amount); event PaymentReceived(address from, uint256 amount); uint256 private _totalShares; uint256 private _totalReleased; mapping(address => uint256) private _shares; mapping(address => uint256) private _released; address[] private _payees; mapping(IERC20 => uint256) private _erc20TotalReleased; mapping(IERC20 => mapping(address => uint256)) private _erc20Released; /** * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at * the matching position in the `shares` array. * * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no * duplicates in `payees`. */ constructor(address[] memory payees, uint256[] memory shares_) payable { require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch"); require(payees.length > 0, "PaymentSplitter: no payees"); for (uint256 i = 0; i < payees.length; i++) { _addPayee(payees[i], shares_[i]); } } /** * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the * reliability of the events, and not the actual splitting of Ether. * * To learn more about this see the Solidity documentation for * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback * functions]. */ receive() external payable virtual { emit PaymentReceived(_msgSender(), msg.value); } /** * @dev Getter for the total shares held by payees. */ function totalShares() public view returns (uint256) { return _totalShares; } /** * @dev Getter for the total amount of Ether already released. */ function totalReleased() public view returns (uint256) { return _totalReleased; } /** * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20 * contract. */ function totalReleased(IERC20 token) public view returns (uint256) { return _erc20TotalReleased[token]; } /** * @dev Getter for the amount of shares held by an account. */ function shares(address account) public view returns (uint256) { return _shares[account]; } /** * @dev Getter for the amount of Ether already released to a payee. */ function released(address account) public view returns (uint256) { return _released[account]; } /** * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an * IERC20 contract. */ function released(IERC20 token, address account) public view returns (uint256) { return _erc20Released[token][account]; } /** * @dev Getter for the address of the payee number `index`. */ function payee(uint256 index) public view returns (address) { return _payees[index]; } /** * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the * total shares and their previous withdrawals. */ function release(address payable account) public virtual { require(_shares[account] > 0, "PaymentSplitter: account has no shares"); uint256 totalReceived = address(this).balance + totalReleased(); uint256 payment = _pendingPayment(account, totalReceived, released(account)); require(payment != 0, "PaymentSplitter: account is not due payment"); _released[account] += payment; _totalReleased += payment; Address.sendValue(account, payment); emit PaymentReleased(account, payment); } /** * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20 * contract. */ function release(IERC20 token, address account) public virtual { require(_shares[account] > 0, "PaymentSplitter: account has no shares"); uint256 totalReceived = token.balanceOf(address(this)) + totalReleased(token); uint256 payment = _pendingPayment(account, totalReceived, released(token, account)); require(payment != 0, "PaymentSplitter: account is not due payment"); _erc20Released[token][account] += payment; _erc20TotalReleased[token] += payment; SafeERC20.safeTransfer(token, account, payment); emit ERC20PaymentReleased(token, account, payment); } /** * @dev internal logic for computing the pending payment of an `account` given the token historical balances and * already released amounts. */ function _pendingPayment( address account, uint256 totalReceived, uint256 alreadyReleased ) private view returns (uint256) { return (totalReceived * _shares[account]) / _totalShares - alreadyReleased; } /** * @dev Add a new payee to the contract. * @param account The address of the payee to add. * @param shares_ The number of shares owned by the payee. */ function _addPayee(address account, uint256 shares_) private { require(account != address(0), "PaymentSplitter: account is the zero address"); require(shares_ > 0, "PaymentSplitter: shares are 0"); require(_shares[account] == 0, "PaymentSplitter: account already has shares"); _payees.push(account); _shares[account] = shares_; _totalShares = _totalShares + shares_; emit PayeeAdded(account, shares_); } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.0 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.0 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @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/IERC721.sol // OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @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/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @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/token/ERC721/ERC721.sol // OpenZeppelin Contracts v4.4.0 (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev 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 {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @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: contracts/NFT.sol pragma solidity ^0.8.4; contract AncientCatsClub is ERC721Enumerable, Ownable, ReentrancyGuard, PaymentSplitter { using Strings for uint256; using Counters for Counters.Counter; struct PresaleConfig { uint256 startTime; uint256 duration; uint256 maxCount; } struct SaleConfig { uint256 startTime; uint256 maxCount; } uint256 public maxSupply = 8222; uint256 public maxSaleSupply = 7999; uint256 public maxPresaleSupply = 1000; uint256 public maxGiftSupply = 223; uint256 public giftCount; uint256 public presaleCount; uint256 public totalNFT; string public baseURI; string public notRevealedUri; string public baseExtension = ".json"; bool public isBurnEnabled; bool public paused = false; bool public revealed = false; PresaleConfig public presaleConfig; SaleConfig public saleConfig; Counters.Counter private _tokenIds; uint256[] private _teamShares = [2501, 1566, 1566, 1566, 150, 150, 2501]; address[] private _team = [ 0xC983f037a25D98e85E3094160cf98aE43e22681e, 0x3EA8477588f821408dc791CCD189C6A3a69fbD52, 0xBf9Be42E5a381d95bD38b0a091F194C43DA43e93, 0xe6653e9592967C515030b277606b25D1d5F449b0, 0x039F0812360ebe580aa61a2593C52527Ba638D90, 0x528257067be5638A871daE9314A052caB2953D8b, 0xb918B3d2bfaF0affa9fecFe7e8FC70468a144252 ]; mapping(address => bool) private _presaleList; mapping(address => uint256) public _presaleClaimed; mapping(address => uint256) public _giftClaimed; mapping(address => uint256) public _saleClaimed; mapping(address => uint256) public _totalClaimed; enum WorkflowStatus { CheckOnPresale, Presale, Sale, SoldOut } WorkflowStatus public workflow; event ChangePresaleConfig( uint256 _startTime, uint256 _duration, uint256 _maxCount ); event ChangeSaleConfig(uint256 _startTime, uint256 _maxCount); event ChangeIsBurnEnabled(bool _isBurnEnabled); event ChangeBaseURI(string _baseURI); event GiftMint(address indexed _recipient, uint256 _amount); event PresaleMint(address indexed _minter, uint256 _amount, uint256 _price); event SaleMint(address indexed _minter, uint256 _amount, uint256 _price); event WorkflowStatusChange( WorkflowStatus previousStatus, WorkflowStatus newStatus ); constructor() ERC721("Ancient Cats Club", "CAT") PaymentSplitter(_team, _teamShares) ReentrancyGuard() {} function changePauseState() public onlyOwner { paused = !paused; } function setBaseURI(string calldata _tokenBaseURI) external onlyOwner { baseURI = _tokenBaseURI; emit ChangeBaseURI(_tokenBaseURI); } function _baseURI() internal view override returns (string memory) { return baseURI; } function reveal() public onlyOwner { revealed = true; } function addToPresaleList(address[] calldata _addresses) external onlyOwner { for (uint256 ind = 0; ind < _addresses.length; ind++) { require( _addresses[ind] != address(0), "Ancient Cats Club: Can't add a zero address" ); if (_presaleList[_addresses[ind]] == false) { _presaleList[_addresses[ind]] = true; } } } function isOnPresaleList(address _address) external view returns (bool) { return _presaleList[_address]; } function removeFromPresaleList(address[] calldata _addresses) external onlyOwner { for (uint256 ind = 0; ind < _addresses.length; ind++) { require( _addresses[ind] != address(0), "Ancient Cats Club: Can't remove a zero address" ); if (_presaleList[_addresses[ind]] == true) { _presaleList[_addresses[ind]] = false; } } } function setUpPresale(uint256 _duration) external onlyOwner { require( workflow == WorkflowStatus.CheckOnPresale, "Ancient Cats Club: Unauthorized Transaction" ); uint256 _startTime = block.timestamp; uint256 _maxCount = 3; presaleConfig = PresaleConfig(_startTime, _duration, _maxCount); emit ChangePresaleConfig(_startTime, _duration, _maxCount); workflow = WorkflowStatus.Presale; emit WorkflowStatusChange( WorkflowStatus.CheckOnPresale, WorkflowStatus.Presale ); } function setUpSale() external onlyOwner { require( workflow == WorkflowStatus.Presale, "Ancient Cats Club: Unauthorized Transaction" ); PresaleConfig memory _presaleConfig = presaleConfig; uint256 _presaleEndTime = _presaleConfig.startTime + _presaleConfig.duration; require( block.timestamp > _presaleEndTime, "Ancient Cats Club: Sale not started" ); uint256 _startTime = block.timestamp; uint256 _maxCount = 10; saleConfig = SaleConfig(_startTime, _maxCount); emit ChangeSaleConfig(_startTime, _maxCount); workflow = WorkflowStatus.Sale; emit WorkflowStatusChange(WorkflowStatus.Presale, WorkflowStatus.Sale); } function setIsBurnEnabled(bool _isBurnEnabled) external onlyOwner { isBurnEnabled = _isBurnEnabled; emit ChangeIsBurnEnabled(_isBurnEnabled); } function giftMint(address[] calldata _addresses) external onlyOwner { require( totalNFT + _addresses.length <= maxSupply, "Ancient Cats Club: max total supply exceeded" ); require( giftCount + _addresses.length <= maxGiftSupply, "Ancient Cats Club: max gift supply exceeded" ); uint256 _newItemId; for (uint256 ind = 0; ind < _addresses.length; ind++) { require( _addresses[ind] != address(0), "Ancient Cats Club: recepient is the null address" ); _tokenIds.increment(); _newItemId = _tokenIds.current(); _safeMint(_addresses[ind], _newItemId); _giftClaimed[_addresses[ind]] = _giftClaimed[_addresses[ind]] + 1; _totalClaimed[_addresses[ind]] = _totalClaimed[_addresses[ind]] + 1; totalNFT = totalNFT + 1; giftCount = giftCount + 1; } } function presaleMint(uint256 _amount) external payable nonReentrant { PresaleConfig memory _presaleConfig = presaleConfig; uint256 presaleAmountLimit; if (block.timestamp <= _presaleConfig.startTime + 6 hours) { presaleAmountLimit = 1; } else { presaleAmountLimit = 3; } require( _amount <= presaleAmountLimit, "Ancient Cats Club: You can't mint so much tokens" ); require( _presaleClaimed[msg.sender] + _amount <= presaleAmountLimit, "Ancient Cats Club: You can't mint so much tokens" ); require( _presaleList[msg.sender] == true, " Caller is not on the presale list" ); require( _presaleConfig.startTime > 0, "Ancient Cats Club: Presale must be active to mint Ancient Cats" ); require( block.timestamp >= _presaleConfig.startTime, "Ancient Cats Club: Presale not started" ); require( block.timestamp <= _presaleConfig.startTime + _presaleConfig.duration, "Ancient Cats Club: Presale is ended" ); require( totalNFT + _amount <= maxPresaleSupply, "Ancient Cats Club: max presale supply exceeded" ); require( totalNFT + _amount <= maxSupply, "Ancient Cats Club: max supply exceeded" ); uint256 _price = 100000000000000000; // 0.1 ETH require( _price <= msg.value, "Ancient Cats Club: Ether value sent is not correct" ); require(!paused, "Ancient Cats Club: contract is paused"); uint256 _newItemId; for (uint256 ind = 0; ind < _amount; ind++) { _tokenIds.increment(); _newItemId = _tokenIds.current(); _safeMint(msg.sender, _newItemId); _presaleClaimed[msg.sender] = _presaleClaimed[msg.sender] + 1; _totalClaimed[msg.sender] = _totalClaimed[msg.sender] + 1; totalNFT = totalNFT + 1; presaleCount = presaleCount + 1; } emit PresaleMint(msg.sender, _amount, _price); } function saleMint(uint256 _amount) external payable nonReentrant { uint256 _price; SaleConfig memory _saleConfig = saleConfig; if (block.timestamp <= _saleConfig.startTime + 6 hours) { _price = 200000000000000000; //0.2 ETH } else { _price = 150000000000000000; //0.15 ETH } require(_amount > 0, "Ancient Cats Club: zero amount"); require( _saleConfig.startTime > 0, "Ancient Cats Club: sale is not active" ); require( block.timestamp >= _saleConfig.startTime, "Ancient Cats Club: sale not started" ); require( _amount <= _saleConfig.maxCount, "Ancient Cats Club: Can only mint 10 tokens at a time" ); require( totalNFT + _amount <= maxSupply, "Ancient Cats Club: max supply exceeded" ); require( totalNFT + _amount <= maxSaleSupply, "Ancient Cats Club: max supply exceeded" ); require( _price * _amount <= msg.value, "Ancient Cats Club: Ether value sent is not correct" ); require(!paused, "Ancient Cats Club: contract is paused"); uint256 _newItemId; for (uint256 ind = 0; ind < _amount; ind++) { _tokenIds.increment(); _newItemId = _tokenIds.current(); _safeMint(msg.sender, _newItemId); _saleClaimed[msg.sender] = _saleClaimed[msg.sender] + 1; _totalClaimed[msg.sender] = _totalClaimed[msg.sender] + 1; totalNFT = totalNFT + 1; } emit SaleMint(msg.sender, _amount, _price); if (totalNFT + _amount == maxSupply) { workflow = WorkflowStatus.SoldOut; emit WorkflowStatusChange( WorkflowStatus.Sale, WorkflowStatus.SoldOut ); } } function getWorkflowStatus() public view returns (uint256) { uint256 _status; if (workflow == WorkflowStatus.CheckOnPresale) { _status = 1; } if (workflow == WorkflowStatus.Presale) { _status = 2; } if (workflow == WorkflowStatus.Sale) { _status = 3; } if (workflow == WorkflowStatus.SoldOut) { _status = 4; } return _status; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); if (revealed == false) { return notRevealedUri; } string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string( abi.encodePacked( currentBaseURI, tokenId.toString(), baseExtension ) ) : ""; } function setBaseExtension(string memory _newBaseExtension) public onlyOwner { baseExtension = _newBaseExtension; } function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner { notRevealedUri = _notRevealedURI; } function changeTotalSupply(uint256 _newSupply) public onlyOwner { maxSupply = _newSupply; } function changeSaleSupply(uint256 _newSaleSupply) public onlyOwner { maxSaleSupply = _newSaleSupply; } function burn(uint256 tokenId) external { require(isBurnEnabled, "Ancient Cats Club: burning disabled"); require( _isApprovedOrOwner(msg.sender, tokenId), "Ancient Cats Club: burn caller is not owner nor approved" ); _burn(tokenId); totalNFT = totalNFT - 1; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_baseURI","type":"string"}],"name":"ChangeBaseURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_isBurnEnabled","type":"bool"}],"name":"ChangeIsBurnEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_startTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_duration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_maxCount","type":"uint256"}],"name":"ChangePresaleConfig","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_startTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_maxCount","type":"uint256"}],"name":"ChangeSaleConfig","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"GiftMint","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"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_price","type":"uint256"}],"name":"PresaleMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_price","type":"uint256"}],"name":"SaleMint","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":"enum AncientCatsClub.WorkflowStatus","name":"previousStatus","type":"uint8"},{"indexed":false,"internalType":"enum AncientCatsClub.WorkflowStatus","name":"newStatus","type":"uint8"}],"name":"WorkflowStatusChange","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_giftClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_presaleClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_saleClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_totalClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"addToPresaleList","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":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"changePauseState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newSaleSupply","type":"uint256"}],"name":"changeSaleSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newSupply","type":"uint256"}],"name":"changeTotalSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWorkflowStatus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"giftCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"giftMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isBurnEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isOnPresaleList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxGiftSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPresaleSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSaleSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","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":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleConfig","outputs":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"maxCount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"removeFromPresaleList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"saleConfig","outputs":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"maxCount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"saleMint","outputs":[],"stateMutability":"payable","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":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isBurnEnabled","type":"bool"}],"name":"setIsBurnEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"setUpPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setUpSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"totalNFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"workflow","outputs":[{"internalType":"enum AncientCatsClub.WorkflowStatus","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
61201e601355611f3f6014556103e860155560df60165560c06040526005608081905264173539b7b760d91b60a09081526200003f91601c91906200064d565b50601d805462ffff00191690556040805160e0810182526109c580825261061e60208301819052928201839052606082019290925260966080820181905260a082015260c08101919091526200009a906024906007620006dc565b506040805160e08101825273c983f037a25d98e85e3094160cf98ae43e22681e8152733ea8477588f821408dc791ccd189c6a3a69fbd52602082015273bf9be42e5a381d95bd38b0a091f194c43da43e939181019190915273e6653e9592967c515030b277606b25d1d5f449b0606082015273039f0812360ebe580aa61a2593c52527ba638d90608082015273528257067be5638a871dae9314a052cab2953d8b60a082015273b918b3d2bfaf0affa9fecfe7e8fc70468a14425260c08201526200016a90602590600762000720565b503480156200017857600080fd5b506025805480602002602001604051908101604052809291908181526020018280548015620001d157602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311620001b2575b505050505060248054806020026020016040519081016040528092919081815260200182805480156200022457602002820191906000526020600020905b8154815260200190600101908083116200020f575b5050604080518082018252601181527020b731b4b2b73a1021b0ba399021b63ab160791b60208083019182528351808501909452600384526210d05560ea1b9084015281519195509193506200027f9250600091906200064d565b508051620002959060019060208401906200064d565b505050620002b2620002ac6200040960201b60201c565b6200040d565b6001600b558051825114620003295760405162461bcd60e51b815260206004820152603260248201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726044820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b60648201526084015b60405180910390fd5b60008251116200037c5760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f20706179656573000000000000604482015260640162000320565b60005b82518110156200040057620003eb838281518110620003ae57634e487b7160e01b600052603260045260246000fd5b6020026020010151838381518110620003d757634e487b7160e01b600052603260045260246000fd5b60200260200101516200045f60201b60201c565b80620003f781620007e7565b9150506200037f565b5050506200081b565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620004cc5760405162461bcd60e51b815260206004820152602c60248201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060448201526b7a65726f206164647265737360a01b606482015260840162000320565b600081116200051e5760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a20736861726573206172652030000000604482015260640162000320565b6001600160a01b0382166000908152600e6020526040902054156200059a5760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960448201526a206861732073686172657360a81b606482015260840162000320565b60108054600181019091557f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6720180546001600160a01b0319166001600160a01b0384169081179091556000908152600e60205260409020819055600c54620006049082906200078f565b600c55604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac910160405180910390a15050565b8280546200065b90620007aa565b90600052602060002090601f0160209004810192826200067f5760008555620006ca565b82601f106200069a57805160ff1916838001178555620006ca565b82800160010185558215620006ca579182015b82811115620006ca578251825591602001919060010190620006ad565b50620006d892915062000778565b5090565b828054828255906000526020600020908101928215620006ca579160200282015b82811115620006ca578251829061ffff16905591602001919060010190620006fd565b828054828255906000526020600020908101928215620006ca579160200282015b82811115620006ca57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000741565b5b80821115620006d8576000815560010162000779565b60008219821115620007a557620007a562000805565b500190565b600181811c90821680620007bf57607f821691505b60208210811415620007e157634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415620007fe57620007fe62000805565b5060010190565b634e487b7160e01b600052601160045260246000fd5b614973806200082b6000396000f3fe6080604052600436106103dc5760003560e01c80637204a3c9116101fd578063b88d4fde11610118578063da3ef23f116100ab578063ed7003741161007a578063ed70037414610c26578063f2c4ce1e14610c3c578063f2fde38b14610c5c578063f75d64a614610c7c578063fd88fa6914610c9157600080fd5b8063da3ef23f14610b6f578063de00a68b14610b8f578063e33b7de314610bc8578063e985e9c514610bdd57600080fd5b8063cde27a35116100e7578063cde27a3514610ad7578063ce7c2ac214610aed578063d5abeb0114610b23578063d79779b214610b3957600080fd5b8063b88d4fde14610a6f578063c668286214610a8f578063c87b56dd14610aa4578063c9b298f114610ac457600080fd5b806395d89b4111610190578063a475b5dd1161015f578063a475b5dd14610a04578063a5fd7bec14610a19578063b179e06014610a39578063b29418d514610a5957600080fd5b806395d89b41146109725780639852595c14610987578063a22cb465146109bd578063a3344125146109dd57600080fd5b80638ca887ca116101cc5780638ca887ca146108e45780638cc4de19146108f75780638da5cb5b1461092457806390aa0b0f1461094257600080fd5b80637204a3c9146108575780637bbab636146108775780637f674f48146108975780638b83209b146108c457600080fd5b806342842e0e116102f857806355f804b31161028b5780636c0360eb1161025a5780636c0360eb146107cd5780636e0e5b19146107e257806370a0823114610802578063710e132d14610822578063715018a61461084257600080fd5b806355f804b3146107585780635c975abb146107785780635edbc28c146107975780636352211e146107ad57600080fd5b80634f6ccce7116102c75780634f6ccce7146106cb57806351830227146106eb57806352d728d91461070b57806352e973261461073857600080fd5b806342842e0e1461065657806342966c681461067657806346e79ffc1461069657806348b75044146106ab57600080fd5b806318160ddd1161037057806323b872dd1161033f57806323b872dd146105bb5780632f745c59146105db5780633a98ef39146105fb578063406072a91461061057600080fd5b806318160ddd1461055b57806319165587146105705780631f2898c31461059057806321bdb26e146105a557600080fd5b8063081812fc116103ac578063081812fc146104bf578063081c8c44146104f7578063095ea7b31461050c57806309c3fbb71461052e57600080fd5b80624563791461042a57806301ffc9a71461045357806306fdde031461048357806307ebec27146104a557600080fd5b36610425577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561043657600080fd5b5061044060195481565b6040519081526020015b60405180910390f35b34801561045f57600080fd5b5061047361046e3660046141fa565b610ccb565b604051901515815260200161044a565b34801561048f57600080fd5b50610498610cf6565b60405161044a91906144d6565b3480156104b157600080fd5b50601d546104739060ff1681565b3480156104cb57600080fd5b506104df6104da3660046142e5565b610d88565b6040516001600160a01b03909116815260200161044a565b34801561050357600080fd5b50610498610e22565b34801561051857600080fd5b5061052c610527366004614127565b610eb0565b005b34801561053a57600080fd5b50610440610549366004613fe9565b60296020526000908152604090205481565b34801561056757600080fd5b50600854610440565b34801561057c57600080fd5b5061052c61058b366004613fe9565b610fc6565b34801561059c57600080fd5b5061052c6110f5565b3480156105b157600080fd5b5061044060155481565b3480156105c757600080fd5b5061052c6105d636600461403d565b61129d565b3480156105e757600080fd5b506104406105f6366004614127565b6112ce565b34801561060757600080fd5b50600c54610440565b34801561061c57600080fd5b5061044061062b366004614232565b6001600160a01b03918216600090815260126020908152604080832093909416825291909152205490565b34801561066257600080fd5b5061052c61067136600461403d565b611364565b34801561068257600080fd5b5061052c6106913660046142e5565b61137f565b3480156106a257600080fd5b5061052c611477565b3480156106b757600080fd5b5061052c6106c6366004614232565b6114be565b3480156106d757600080fd5b506104406106e63660046142e5565b6116a6565b3480156106f757600080fd5b50601d546104739062010000900460ff1681565b34801561071757600080fd5b50610440610726366004613fe9565b60286020526000908152604090205481565b34801561074457600080fd5b5061052c6107533660046142e5565b611747565b34801561076457600080fd5b5061052c610773366004614244565b611776565b34801561078457600080fd5b50601d5461047390610100900460ff1681565b3480156107a357600080fd5b5061044060165481565b3480156107b957600080fd5b506104df6107c83660046142e5565b6117ea565b3480156107d957600080fd5b50610498611861565b3480156107ee57600080fd5b5061052c6107fd3660046141c2565b61186e565b34801561080e57600080fd5b5061044061081d366004613fe9565b6118df565b34801561082e57600080fd5b5061052c61083d3660046142e5565b611966565b34801561084e57600080fd5b5061052c611a7f565b34801561086357600080fd5b5061052c610872366004614152565b611ab5565b34801561088357600080fd5b5061052c6108923660046142e5565b611c5c565b3480156108a357600080fd5b506104406108b2366004613fe9565b602a6020526000908152604090205481565b3480156108d057600080fd5b506104df6108df3660046142e5565b611c8b565b61052c6108f23660046142e5565b611cc9565b34801561090357600080fd5b50610440610912366004613fe9565b60276020526000908152604090205481565b34801561093057600080fd5b50600a546001600160a01b03166104df565b34801561094e57600080fd5b5060215460225461095d919082565b6040805192835260208301919091520161044a565b34801561097e57600080fd5b506104986120dc565b34801561099357600080fd5b506104406109a2366004613fe9565b6001600160a01b03166000908152600f602052604090205490565b3480156109c957600080fd5b5061052c6109d83660046140fa565b6120eb565b3480156109e957600080fd5b50602b546109f79060ff1681565b60405161044a919061447e565b348015610a1057600080fd5b5061052c6120fa565b348015610a2557600080fd5b5061052c610a34366004614152565b612137565b348015610a4557600080fd5b5061052c610a54366004614152565b6124f2565b348015610a6557600080fd5b5061044060145481565b348015610a7b57600080fd5b5061052c610a8a36600461407d565b6126a2565b348015610a9b57600080fd5b506104986126d4565b348015610ab057600080fd5b50610498610abf3660046142e5565b6126e1565b61052c610ad23660046142e5565b612861565b348015610ae357600080fd5b5061044060185481565b348015610af957600080fd5b50610440610b08366004613fe9565b6001600160a01b03166000908152600e602052604090205490565b348015610b2f57600080fd5b5061044060135481565b348015610b4557600080fd5b50610440610b54366004613fe9565b6001600160a01b031660009081526011602052604090205490565b348015610b7b57600080fd5b5061052c610b8a36600461429f565b612cf6565b348015610b9b57600080fd5b50610473610baa366004613fe9565b6001600160a01b031660009081526026602052604090205460ff1690565b348015610bd457600080fd5b50600d54610440565b348015610be957600080fd5b50610473610bf8366004614005565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610c3257600080fd5b5061044060175481565b348015610c4857600080fd5b5061052c610c5736600461429f565b612d33565b348015610c6857600080fd5b5061052c610c77366004613fe9565b612d70565b348015610c8857600080fd5b50610440612e0b565b348015610c9d57600080fd5b50601e54601f54602054610cb092919083565b6040805193845260208401929092529082015260600161044a565b60006001600160e01b0319821663780e9d6360e01b1480610cf05750610cf082612ed6565b92915050565b606060008054610d0590614858565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3190614858565b8015610d7e5780601f10610d5357610100808354040283529160200191610d7e565b820191906000526020600020905b815481529060010190602001808311610d6157829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610e065760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b601b8054610e2f90614858565b80601f0160208091040260200160405190810160405280929190818152602001828054610e5b90614858565b8015610ea85780601f10610e7d57610100808354040283529160200191610ea8565b820191906000526020600020905b815481529060010190602001808311610e8b57829003601f168201915b505050505081565b6000610ebb826117ea565b9050806001600160a01b0316836001600160a01b03161415610f295760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610dfd565b336001600160a01b0382161480610f455750610f458133610bf8565b610fb75760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610dfd565b610fc18383612f26565b505050565b6001600160a01b0381166000908152600e6020526040902054610ffb5760405162461bcd60e51b8152600401610dfd90614581565b6000611006600d5490565b61101090476147ca565b9050600061103d8383611038866001600160a01b03166000908152600f602052604090205490565b612f94565b90508061105c5760405162461bcd60e51b8152600401610dfd9061465c565b6001600160a01b0383166000908152600f6020526040812080548392906110849084906147ca565b9250508190555080600d600082825461109d91906147ca565b909155506110ad90508382612fda565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b05691015b60405180910390a1505050565b600a546001600160a01b0316331461111f5760405162461bcd60e51b8152600401610dfd90614744565b6001602b5460ff16600381111561114657634e487b7160e01b600052602160045260246000fd5b146111635760405162461bcd60e51b8152600401610dfd906146a7565b60408051606081018252601e54808252601f5460208084018290525493830193909352909160009161119591906147ca565b90508042116111f25760405162461bcd60e51b815260206004820152602360248201527f416e6369656e74204361747320436c75623a2053616c65206e6f7420737461726044820152621d195960ea1b6064820152608401610dfd565b60408051808201825242808252600a6020928301819052602182905560228190558351828152928301819052909290917f07a1cedf4c1c75b37d60d4517d84a69a3d2ec0534f3a5093c93a94dde3a6a554910160405180910390a1602b805460ff191660029081179091556040517f0a97a4ee45751e2abf3e4fc8946939630b11b371ea8ae39ccdc3056e98f5cc3f9161128f916001919061448c565b60405180910390a150505050565b6112a733826130f3565b6112c35760405162461bcd60e51b8152600401610dfd90614779565b610fc18383836131e9565b60006112d9836118df565b821061133b5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610dfd565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610fc1838383604051806020016040528060008152506126a2565b601d5460ff166113dd5760405162461bcd60e51b815260206004820152602360248201527f416e6369656e74204361747320436c75623a206275726e696e672064697361626044820152621b195960ea1b6064820152608401610dfd565b6113e733826130f3565b6114595760405162461bcd60e51b815260206004820152603860248201527f416e6369656e74204361747320436c75623a206275726e2063616c6c6572206960448201527f73206e6f74206f776e6572206e6f7220617070726f76656400000000000000006064820152608401610dfd565b61146281613394565b60016019546114719190614815565b60195550565b600a546001600160a01b031633146114a15760405162461bcd60e51b8152600401610dfd90614744565b601d805461ff001981166101009182900460ff1615909102179055565b6001600160a01b0381166000908152600e60205260409020546114f35760405162461bcd60e51b8152600401610dfd90614581565b6001600160a01b0382166000908152601160205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a082319060240160206040518083038186803b15801561154b57600080fd5b505afa15801561155f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158391906142fd565b61158d91906147ca565b905060006115c6838361103887876001600160a01b03918216600090815260126020908152604080832093909416825291909152205490565b9050806115e55760405162461bcd60e51b8152600401610dfd9061465c565b6001600160a01b0380851660009081526012602090815260408083209387168352929052908120805483929061161c9084906147ca565b90915550506001600160a01b038416600090815260116020526040812080548392906116499084906147ca565b9091555061165a905084848361343b565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b60006116b160085490565b82106117145760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610dfd565b6008828154811061173557634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b600a546001600160a01b031633146117715760405162461bcd60e51b8152600401610dfd90614744565b601355565b600a546001600160a01b031633146117a05760405162461bcd60e51b8152600401610dfd90614744565b6117ac601a8383613e66565b507f8a274cdd629b9aae599b13d8bfee3ee4a15350b0386a9b64087a393db009376782826040516117de9291906144a7565b60405180910390a15050565b6000818152600260205260408120546001600160a01b031680610cf05760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610dfd565b601a8054610e2f90614858565b600a546001600160a01b031633146118985760405162461bcd60e51b8152600401610dfd90614744565b601d805460ff19168215159081179091556040519081527f0343da01ca2a51743bc3a245ccf8007e27e6b919fb27b0f83cb5d60c2e8634f39060200160405180910390a150565b60006001600160a01b03821661194a5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610dfd565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146119905760405162461bcd60e51b8152600401610dfd90614744565b6000602b5460ff1660038111156119b757634e487b7160e01b600052602160045260246000fd5b146119d45760405162461bcd60e51b8152600401610dfd906146a7565b60408051606080820183524280835260208084018690526003938501849052601e829055601f8690558381558451828152908101869052938401839052927f65fee6c7896ea03117fe27f91b636793950b4d6bfeab9389f1e96602f131bd6e910160405180910390a1602b805460ff191660019081179091556040517f0a97a4ee45751e2abf3e4fc8946939630b11b371ea8ae39ccdc3056e98f5cc3f916110e8916000919061448c565b600a546001600160a01b03163314611aa95760405162461bcd60e51b8152600401610dfd90614744565b611ab3600061348d565b565b600a546001600160a01b03163314611adf5760405162461bcd60e51b8152600401610dfd90614744565b60005b81811015610fc1576000838383818110611b0c57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611b219190613fe9565b6001600160a01b03161415611b8c5760405162461bcd60e51b815260206004820152602b60248201527f416e6369656e74204361747320436c75623a2043616e2774206164642061207a60448201526a65726f206164647265737360a81b6064820152608401610dfd565b60266000848484818110611bb057634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611bc59190613fe9565b6001600160a01b0316815260208101919091526040016000205460ff16611c4a57600160266000858585818110611c0c57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611c219190613fe9565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790555b80611c5481614893565b915050611ae2565b600a546001600160a01b03163314611c865760405162461bcd60e51b8152600401610dfd90614744565b601455565b600060108281548110611cae57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031692915050565b6002600b541415611d1c5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610dfd565b6002600b5560408051808201909152602154808252602254602083015260009190611d49906154606147ca565b4211611d5f576702c68af0bb1400009150611d6b565b670214e8348c4f000091505b60008311611dbb5760405162461bcd60e51b815260206004820152601e60248201527f416e6369656e74204361747320436c75623a207a65726f20616d6f756e7400006044820152606401610dfd565b8051611e175760405162461bcd60e51b815260206004820152602560248201527f416e6369656e74204361747320436c75623a2073616c65206973206e6f742061604482015264637469766560d81b6064820152608401610dfd565b8051421015611e745760405162461bcd60e51b815260206004820152602360248201527f416e6369656e74204361747320436c75623a2073616c65206e6f7420737461726044820152621d195960ea1b6064820152608401610dfd565b8060200151831115611ee65760405162461bcd60e51b815260206004820152603560248201527f416e6369656e74204361747320436c75623a202043616e206f6e6c79206d696e6044820152747420313020746f6b656e7320617420612074696d6560581b6064820152608401610dfd565b60135483601954611ef791906147ca565b1115611f155760405162461bcd60e51b8152600401610dfd906144e9565b60145483601954611f2691906147ca565b1115611f445760405162461bcd60e51b8152600401610dfd906144e9565b34611f4f84846147f6565b1115611f6d5760405162461bcd60e51b8152600401610dfd906146f2565b601d54610100900460ff1615611f955760405162461bcd60e51b8152600401610dfd906145c7565b6000805b8481101561203357611faf602380546001019055565b6023549150611fbe33836134df565b33600090815260296020526040902054611fd99060016147ca565b33600090815260296020908152604080832093909355602a905220546120009060016147ca565b336000908152602a602052604090205560195461201e9060016147ca565b6019558061202b81614893565b915050611f99565b50604080518581526020810185905233917f0d905a2e95960c2ad9e627d829fae00e7f3b9794c3b62a5c376cf5deee8f2a20910160405180910390a26013548460195461208091906147ca565b14156120d157602b805460ff191660039081179091556040517f0a97a4ee45751e2abf3e4fc8946939630b11b371ea8ae39ccdc3056e98f5cc3f916120c8916002919061448c565b60405180910390a15b50506001600b555050565b606060018054610d0590614858565b6120f63383836134f9565b5050565b600a546001600160a01b031633146121245760405162461bcd60e51b8152600401610dfd90614744565b601d805462ff0000191662010000179055565b600a546001600160a01b031633146121615760405162461bcd60e51b8152600401610dfd90614744565b6013546019546121729083906147ca565b11156121d55760405162461bcd60e51b815260206004820152602c60248201527f416e6369656e74204361747320436c75623a206d617820746f74616c2073757060448201526b1c1b1e48195e18d95959195960a21b6064820152608401610dfd565b6016546017546121e69083906147ca565b11156122485760405162461bcd60e51b815260206004820152602b60248201527f416e6369656e74204361747320436c75623a206d61782067696674207375707060448201526a1b1e48195e18d95959195960aa1b6064820152608401610dfd565b6000805b828110156124ec57600084848381811061227657634e487b7160e01b600052603260045260246000fd5b905060200201602081019061228b9190613fe9565b6001600160a01b031614156122fb5760405162461bcd60e51b815260206004820152603060248201527f416e6369656e74204361747320436c75623a20726563657069656e742069732060448201526f746865206e756c6c206164647265737360801b6064820152608401610dfd565b612309602380546001019055565b602354915061234c84848381811061233157634e487b7160e01b600052603260045260246000fd5b90506020020160208101906123469190613fe9565b836134df565b6028600085858481811061237057634e487b7160e01b600052603260045260246000fd5b90506020020160208101906123859190613fe9565b6001600160a01b031681526020810191909152604001600020546123aa9060016147ca565b602860008686858181106123ce57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906123e39190613fe9565b6001600160a01b03166001600160a01b0316815260200190815260200160002081905550602a600085858481811061242b57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906124409190613fe9565b6001600160a01b031681526020810191909152604001600020546124659060016147ca565b602a600086868581811061248957634e487b7160e01b600052603260045260246000fd5b905060200201602081019061249e9190613fe9565b6001600160a01b031681526020810191909152604001600020556019546124c69060016147ca565b6019556017546124d79060016147ca565b601755806124e481614893565b91505061224c565b50505050565b600a546001600160a01b0316331461251c5760405162461bcd60e51b8152600401610dfd90614744565b60005b81811015610fc157600083838381811061254957634e487b7160e01b600052603260045260246000fd5b905060200201602081019061255e9190613fe9565b6001600160a01b031614156125cc5760405162461bcd60e51b815260206004820152602e60248201527f416e6369656e74204361747320436c75623a2043616e27742072656d6f76652060448201526d61207a65726f206164647265737360901b6064820152608401610dfd565b602660008484848181106125f057634e487b7160e01b600052603260045260246000fd5b90506020020160208101906126059190613fe9565b6001600160a01b0316815260208101919091526040016000205460ff161515600114156126905760006026600085858581811061265257634e487b7160e01b600052603260045260246000fd5b90506020020160208101906126679190613fe9565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790555b8061269a81614893565b91505061251f565b6126ac33836130f3565b6126c85760405162461bcd60e51b8152600401610dfd90614779565b6124ec848484846135c8565b601c8054610e2f90614858565b6000818152600260205260409020546060906001600160a01b03166127605760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610dfd565b601d5462010000900460ff1661280257601b805461277d90614858565b80601f01602080910402602001604051908101604052809291908181526020018280546127a990614858565b80156127f65780601f106127cb576101008083540402835291602001916127f6565b820191906000526020600020905b8154815290600101906020018083116127d957829003601f168201915b50505050509050919050565b600061280c6135fb565b9050600081511161282c576040518060200160405280600081525061285a565b806128368461360a565b601c60405160200161284a9392919061437f565b6040516020818303038152906040525b9392505050565b6002600b5414156128b45760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610dfd565b6002600b5560408051606081018252601e54808252601f546020808401919091525492820192909252906000906128ed906154606147ca565b42116128fb575060016128ff565b5060035b8083111561291f5760405162461bcd60e51b8152600401610dfd9061460c565b33600090815260276020526040902054819061293c9085906147ca565b111561295a5760405162461bcd60e51b8152600401610dfd9061460c565b3360009081526026602052604090205460ff1615156001146129c95760405162461bcd60e51b815260206004820152602260248201527f2043616c6c6572206973206e6f74206f6e207468652070726573616c65206c696044820152611cdd60f21b6064820152608401610dfd565b8151612a3d5760405162461bcd60e51b815260206004820152603e60248201527f416e6369656e74204361747320436c75623a2050726573616c65206d7573742060448201527f62652061637469766520746f206d696e7420416e6369656e74204361747300006064820152608401610dfd565b8151421015612a9d5760405162461bcd60e51b815260206004820152602660248201527f416e6369656e74204361747320436c75623a2050726573616c65206e6f7420736044820152651d185c9d195960d21b6064820152608401610dfd565b60208201518251612aae91906147ca565b421115612b095760405162461bcd60e51b815260206004820152602360248201527f416e6369656e74204361747320436c75623a2050726573616c6520697320656e60448201526219195960ea1b6064820152608401610dfd565b60155483601954612b1a91906147ca565b1115612b7f5760405162461bcd60e51b815260206004820152602e60248201527f416e6369656e74204361747320436c75623a206d61782070726573616c65207360448201526d1d5c1c1b1e48195e18d95959195960921b6064820152608401610dfd565b60135483601954612b9091906147ca565b1115612bae5760405162461bcd60e51b8152600401610dfd906144e9565b67016345785d8a000034811115612bd75760405162461bcd60e51b8152600401610dfd906146f2565b601d54610100900460ff1615612bff5760405162461bcd60e51b8152600401610dfd906145c7565b6000805b85811015612cae57612c19602380546001019055565b6023549150612c2833836134df565b33600090815260276020526040902054612c439060016147ca565b33600090815260276020908152604080832093909355602a90522054612c6a9060016147ca565b336000908152602a6020526040902055601954612c889060016147ca565b601955601854612c999060016147ca565b60185580612ca681614893565b915050612c03565b50604080518681526020810184905233917f40038d437ff4cece80b344923544b3c8527d7f6aa2f9202a9734d5d9c7ffa0e0910160405180910390a250506001600b55505050565b600a546001600160a01b03163314612d205760405162461bcd60e51b8152600401610dfd90614744565b80516120f690601c906020840190613eea565b600a546001600160a01b03163314612d5d5760405162461bcd60e51b8152600401610dfd90614744565b80516120f690601b906020840190613eea565b600a546001600160a01b03163314612d9a5760405162461bcd60e51b8152600401610dfd90614744565b6001600160a01b038116612dff5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610dfd565b612e088161348d565b50565b60008080602b5460ff166003811115612e3457634e487b7160e01b600052602160045260246000fd5b1415612e3e575060015b6001602b5460ff166003811115612e6557634e487b7160e01b600052602160045260246000fd5b1415612e6f575060025b6002602b5460ff166003811115612e9657634e487b7160e01b600052602160045260246000fd5b1415612ea0575060035b6003602b5460ff166003811115612ec757634e487b7160e01b600052602160045260246000fd5b1415612ed1575060045b919050565b60006001600160e01b031982166380ac58cd60e01b1480612f0757506001600160e01b03198216635b5e139f60e01b145b80610cf057506301ffc9a760e01b6001600160e01b0319831614610cf0565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612f5b826117ea565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600c546001600160a01b0384166000908152600e602052604081205490918391612fbe90866147f6565b612fc891906147e2565b612fd29190614815565b949350505050565b8047101561302a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610dfd565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613077576040519150601f19603f3d011682016040523d82523d6000602084013e61307c565b606091505b5050905080610fc15760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610dfd565b6000818152600260205260408120546001600160a01b031661316c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610dfd565b6000613177836117ea565b9050806001600160a01b0316846001600160a01b031614806131b25750836001600160a01b03166131a784610d88565b6001600160a01b0316145b80612fd257506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16949350505050565b826001600160a01b03166131fc826117ea565b6001600160a01b0316146132645760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610dfd565b6001600160a01b0382166132c65760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610dfd565b6132d1838383613724565b6132dc600082612f26565b6001600160a01b0383166000908152600360205260408120805460019290613305908490614815565b90915550506001600160a01b03821660009081526003602052604081208054600192906133339084906147ca565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600061339f826117ea565b90506133ad81600084613724565b6133b8600083612f26565b6001600160a01b03811660009081526003602052604081208054600192906133e1908490614815565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610fc19084906137dc565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6120f68282604051806020016040528060008152506138ae565b816001600160a01b0316836001600160a01b0316141561355b5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610dfd565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6135d38484846131e9565b6135df848484846138e1565b6124ec5760405162461bcd60e51b8152600401610dfd9061452f565b6060601a8054610d0590614858565b60608161362e5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613658578061364281614893565b91506136519050600a836147e2565b9150613632565b60008167ffffffffffffffff81111561368157634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156136ab576020820181803683370190505b5090505b8415612fd2576136c0600183614815565b91506136cd600a866148ae565b6136d89060306147ca565b60f81b8183815181106136fb57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061371d600a866147e2565b94506136af565b6001600160a01b03831661377f5761377a81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6137a2565b816001600160a01b0316836001600160a01b0316146137a2576137a283826139ee565b6001600160a01b0382166137b957610fc181613a8b565b826001600160a01b0316826001600160a01b031614610fc157610fc18282613b64565b6000613831826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613ba89092919063ffffffff16565b805190915015610fc1578080602001905181019061384f91906141de565b610fc15760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610dfd565b6138b88383613bb7565b6138c560008484846138e1565b610fc15760405162461bcd60e51b8152600401610dfd9061452f565b60006001600160a01b0384163b156139e357604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613925903390899088908890600401614441565b602060405180830381600087803b15801561393f57600080fd5b505af192505050801561396f575060408051601f3d908101601f1916820190925261396c91810190614216565b60015b6139c9573d80801561399d576040519150601f19603f3d011682016040523d82523d6000602084013e6139a2565b606091505b5080516139c15760405162461bcd60e51b8152600401610dfd9061452f565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612fd2565b506001949350505050565b600060016139fb846118df565b613a059190614815565b600083815260076020526040902054909150808214613a58576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090613a9d90600190614815565b60008381526009602052604081205460088054939450909284908110613ad357634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060088381548110613b0257634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480613b4857634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613b6f836118df565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6060612fd28484600085613d05565b6001600160a01b038216613c0d5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610dfd565b6000818152600260205260409020546001600160a01b031615613c725760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610dfd565b613c7e60008383613724565b6001600160a01b0382166000908152600360205260408120805460019290613ca79084906147ca565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b606082471015613d665760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610dfd565b843b613db45760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610dfd565b600080866001600160a01b03168587604051613dd09190614363565b60006040518083038185875af1925050503d8060008114613e0d576040519150601f19603f3d011682016040523d82523d6000602084013e613e12565b606091505b5091509150613e22828286613e2d565b979650505050505050565b60608315613e3c57508161285a565b825115613e4c5782518084602001fd5b8160405162461bcd60e51b8152600401610dfd91906144d6565b828054613e7290614858565b90600052602060002090601f016020900481019282613e945760008555613eda565b82601f10613ead5782800160ff19823516178555613eda565b82800160010185558215613eda579182015b82811115613eda578235825591602001919060010190613ebf565b50613ee6929150613f5e565b5090565b828054613ef690614858565b90600052602060002090601f016020900481019282613f185760008555613eda565b82601f10613f3157805160ff1916838001178555613eda565b82800160010185558215613eda579182015b82811115613eda578251825591602001919060010190613f43565b5b80821115613ee65760008155600101613f5f565b600067ffffffffffffffff80841115613f8e57613f8e6148ee565b604051601f8501601f19908116603f01168101908282118183101715613fb657613fb66148ee565b81604052809350858152868686011115613fcf57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215613ffa578081fd5b813561285a81614904565b60008060408385031215614017578081fd5b823561402281614904565b9150602083013561403281614904565b809150509250929050565b600080600060608486031215614051578081fd5b833561405c81614904565b9250602084013561406c81614904565b929592945050506040919091013590565b60008060008060808587031215614092578081fd5b843561409d81614904565b935060208501356140ad81614904565b925060408501359150606085013567ffffffffffffffff8111156140cf578182fd5b8501601f810187136140df578182fd5b6140ee87823560208401613f73565b91505092959194509250565b6000806040838503121561410c578182fd5b823561411781614904565b9150602083013561403281614919565b60008060408385031215614139578182fd5b823561414481614904565b946020939093013593505050565b60008060208385031215614164578182fd5b823567ffffffffffffffff8082111561417b578384fd5b818501915085601f83011261418e578384fd5b81358181111561419c578485fd5b8660208260051b85010111156141b0578485fd5b60209290920196919550909350505050565b6000602082840312156141d3578081fd5b813561285a81614919565b6000602082840312156141ef578081fd5b815161285a81614919565b60006020828403121561420b578081fd5b813561285a81614927565b600060208284031215614227578081fd5b815161285a81614927565b60008060408385031215614017578182fd5b60008060208385031215614256578182fd5b823567ffffffffffffffff8082111561426d578384fd5b818501915085601f830112614280578384fd5b81358181111561428e578485fd5b8660208285010111156141b0578485fd5b6000602082840312156142b0578081fd5b813567ffffffffffffffff8111156142c6578182fd5b8201601f810184136142d6578182fd5b612fd284823560208401613f73565b6000602082840312156142f6578081fd5b5035919050565b60006020828403121561430e578081fd5b5051919050565b6000815180845261432d81602086016020860161482c565b601f01601f19169290920160200192915050565b6004811061435f57634e487b7160e01b600052602160045260246000fd5b9052565b6000825161437581846020870161482c565b9190910192915050565b6000845160206143928285838a0161482c565b8551918401916143a58184848a0161482c565b85549201918390600181811c90808316806143c157607f831692505b8583108114156143df57634e487b7160e01b88526022600452602488fd5b8080156143f3576001811461440457614430565b60ff19851688528388019550614430565b60008b815260209020895b858110156144285781548a82015290840190880161440f565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061447490830184614315565b9695505050505050565b60208101610cf08284614341565b6040810161449a8285614341565b61285a6020830184614341565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b60208152600061285a6020830184614315565b60208082526026908201527f416e6369656e74204361747320436c75623a206d617820737570706c7920657860408201526518d95959195960d21b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b60208082526025908201527f416e6369656e74204361747320436c75623a20636f6e74726163742069732070604082015264185d5cd95960da1b606082015260800190565b60208082526030908201527f416e6369656e74204361747320436c75623a20596f752063616e2774206d696e60408201526f7420736f206d75636820746f6b656e7360801b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b6020808252602b908201527f416e6369656e74204361747320436c75623a20556e617574686f72697a65642060408201526a2a3930b739b0b1ba34b7b760a91b606082015260800190565b60208082526032908201527f416e6369656e74204361747320436c75623a2045746865722076616c75652073604082015271195b9d081a5cc81b9bdd0818dbdc9c9958dd60721b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600082198211156147dd576147dd6148c2565b500190565b6000826147f1576147f16148d8565b500490565b6000816000190483118215151615614810576148106148c2565b500290565b600082821015614827576148276148c2565b500390565b60005b8381101561484757818101518382015260200161482f565b838111156124ec5750506000910152565b600181811c9082168061486c57607f821691505b6020821081141561488d57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156148a7576148a76148c2565b5060010190565b6000826148bd576148bd6148d8565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114612e0857600080fd5b8015158114612e0857600080fd5b6001600160e01b031981168114612e0857600080fdfea26469706673582212209c6c15ecf867581070ea4c81df2496d65888a6674d206fb209a206d3b8ab1b4c64736f6c63430008040033
Deployed Bytecode
0x6080604052600436106103dc5760003560e01c80637204a3c9116101fd578063b88d4fde11610118578063da3ef23f116100ab578063ed7003741161007a578063ed70037414610c26578063f2c4ce1e14610c3c578063f2fde38b14610c5c578063f75d64a614610c7c578063fd88fa6914610c9157600080fd5b8063da3ef23f14610b6f578063de00a68b14610b8f578063e33b7de314610bc8578063e985e9c514610bdd57600080fd5b8063cde27a35116100e7578063cde27a3514610ad7578063ce7c2ac214610aed578063d5abeb0114610b23578063d79779b214610b3957600080fd5b8063b88d4fde14610a6f578063c668286214610a8f578063c87b56dd14610aa4578063c9b298f114610ac457600080fd5b806395d89b4111610190578063a475b5dd1161015f578063a475b5dd14610a04578063a5fd7bec14610a19578063b179e06014610a39578063b29418d514610a5957600080fd5b806395d89b41146109725780639852595c14610987578063a22cb465146109bd578063a3344125146109dd57600080fd5b80638ca887ca116101cc5780638ca887ca146108e45780638cc4de19146108f75780638da5cb5b1461092457806390aa0b0f1461094257600080fd5b80637204a3c9146108575780637bbab636146108775780637f674f48146108975780638b83209b146108c457600080fd5b806342842e0e116102f857806355f804b31161028b5780636c0360eb1161025a5780636c0360eb146107cd5780636e0e5b19146107e257806370a0823114610802578063710e132d14610822578063715018a61461084257600080fd5b806355f804b3146107585780635c975abb146107785780635edbc28c146107975780636352211e146107ad57600080fd5b80634f6ccce7116102c75780634f6ccce7146106cb57806351830227146106eb57806352d728d91461070b57806352e973261461073857600080fd5b806342842e0e1461065657806342966c681461067657806346e79ffc1461069657806348b75044146106ab57600080fd5b806318160ddd1161037057806323b872dd1161033f57806323b872dd146105bb5780632f745c59146105db5780633a98ef39146105fb578063406072a91461061057600080fd5b806318160ddd1461055b57806319165587146105705780631f2898c31461059057806321bdb26e146105a557600080fd5b8063081812fc116103ac578063081812fc146104bf578063081c8c44146104f7578063095ea7b31461050c57806309c3fbb71461052e57600080fd5b80624563791461042a57806301ffc9a71461045357806306fdde031461048357806307ebec27146104a557600080fd5b36610425577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561043657600080fd5b5061044060195481565b6040519081526020015b60405180910390f35b34801561045f57600080fd5b5061047361046e3660046141fa565b610ccb565b604051901515815260200161044a565b34801561048f57600080fd5b50610498610cf6565b60405161044a91906144d6565b3480156104b157600080fd5b50601d546104739060ff1681565b3480156104cb57600080fd5b506104df6104da3660046142e5565b610d88565b6040516001600160a01b03909116815260200161044a565b34801561050357600080fd5b50610498610e22565b34801561051857600080fd5b5061052c610527366004614127565b610eb0565b005b34801561053a57600080fd5b50610440610549366004613fe9565b60296020526000908152604090205481565b34801561056757600080fd5b50600854610440565b34801561057c57600080fd5b5061052c61058b366004613fe9565b610fc6565b34801561059c57600080fd5b5061052c6110f5565b3480156105b157600080fd5b5061044060155481565b3480156105c757600080fd5b5061052c6105d636600461403d565b61129d565b3480156105e757600080fd5b506104406105f6366004614127565b6112ce565b34801561060757600080fd5b50600c54610440565b34801561061c57600080fd5b5061044061062b366004614232565b6001600160a01b03918216600090815260126020908152604080832093909416825291909152205490565b34801561066257600080fd5b5061052c61067136600461403d565b611364565b34801561068257600080fd5b5061052c6106913660046142e5565b61137f565b3480156106a257600080fd5b5061052c611477565b3480156106b757600080fd5b5061052c6106c6366004614232565b6114be565b3480156106d757600080fd5b506104406106e63660046142e5565b6116a6565b3480156106f757600080fd5b50601d546104739062010000900460ff1681565b34801561071757600080fd5b50610440610726366004613fe9565b60286020526000908152604090205481565b34801561074457600080fd5b5061052c6107533660046142e5565b611747565b34801561076457600080fd5b5061052c610773366004614244565b611776565b34801561078457600080fd5b50601d5461047390610100900460ff1681565b3480156107a357600080fd5b5061044060165481565b3480156107b957600080fd5b506104df6107c83660046142e5565b6117ea565b3480156107d957600080fd5b50610498611861565b3480156107ee57600080fd5b5061052c6107fd3660046141c2565b61186e565b34801561080e57600080fd5b5061044061081d366004613fe9565b6118df565b34801561082e57600080fd5b5061052c61083d3660046142e5565b611966565b34801561084e57600080fd5b5061052c611a7f565b34801561086357600080fd5b5061052c610872366004614152565b611ab5565b34801561088357600080fd5b5061052c6108923660046142e5565b611c5c565b3480156108a357600080fd5b506104406108b2366004613fe9565b602a6020526000908152604090205481565b3480156108d057600080fd5b506104df6108df3660046142e5565b611c8b565b61052c6108f23660046142e5565b611cc9565b34801561090357600080fd5b50610440610912366004613fe9565b60276020526000908152604090205481565b34801561093057600080fd5b50600a546001600160a01b03166104df565b34801561094e57600080fd5b5060215460225461095d919082565b6040805192835260208301919091520161044a565b34801561097e57600080fd5b506104986120dc565b34801561099357600080fd5b506104406109a2366004613fe9565b6001600160a01b03166000908152600f602052604090205490565b3480156109c957600080fd5b5061052c6109d83660046140fa565b6120eb565b3480156109e957600080fd5b50602b546109f79060ff1681565b60405161044a919061447e565b348015610a1057600080fd5b5061052c6120fa565b348015610a2557600080fd5b5061052c610a34366004614152565b612137565b348015610a4557600080fd5b5061052c610a54366004614152565b6124f2565b348015610a6557600080fd5b5061044060145481565b348015610a7b57600080fd5b5061052c610a8a36600461407d565b6126a2565b348015610a9b57600080fd5b506104986126d4565b348015610ab057600080fd5b50610498610abf3660046142e5565b6126e1565b61052c610ad23660046142e5565b612861565b348015610ae357600080fd5b5061044060185481565b348015610af957600080fd5b50610440610b08366004613fe9565b6001600160a01b03166000908152600e602052604090205490565b348015610b2f57600080fd5b5061044060135481565b348015610b4557600080fd5b50610440610b54366004613fe9565b6001600160a01b031660009081526011602052604090205490565b348015610b7b57600080fd5b5061052c610b8a36600461429f565b612cf6565b348015610b9b57600080fd5b50610473610baa366004613fe9565b6001600160a01b031660009081526026602052604090205460ff1690565b348015610bd457600080fd5b50600d54610440565b348015610be957600080fd5b50610473610bf8366004614005565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610c3257600080fd5b5061044060175481565b348015610c4857600080fd5b5061052c610c5736600461429f565b612d33565b348015610c6857600080fd5b5061052c610c77366004613fe9565b612d70565b348015610c8857600080fd5b50610440612e0b565b348015610c9d57600080fd5b50601e54601f54602054610cb092919083565b6040805193845260208401929092529082015260600161044a565b60006001600160e01b0319821663780e9d6360e01b1480610cf05750610cf082612ed6565b92915050565b606060008054610d0590614858565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3190614858565b8015610d7e5780601f10610d5357610100808354040283529160200191610d7e565b820191906000526020600020905b815481529060010190602001808311610d6157829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610e065760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b601b8054610e2f90614858565b80601f0160208091040260200160405190810160405280929190818152602001828054610e5b90614858565b8015610ea85780601f10610e7d57610100808354040283529160200191610ea8565b820191906000526020600020905b815481529060010190602001808311610e8b57829003601f168201915b505050505081565b6000610ebb826117ea565b9050806001600160a01b0316836001600160a01b03161415610f295760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610dfd565b336001600160a01b0382161480610f455750610f458133610bf8565b610fb75760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610dfd565b610fc18383612f26565b505050565b6001600160a01b0381166000908152600e6020526040902054610ffb5760405162461bcd60e51b8152600401610dfd90614581565b6000611006600d5490565b61101090476147ca565b9050600061103d8383611038866001600160a01b03166000908152600f602052604090205490565b612f94565b90508061105c5760405162461bcd60e51b8152600401610dfd9061465c565b6001600160a01b0383166000908152600f6020526040812080548392906110849084906147ca565b9250508190555080600d600082825461109d91906147ca565b909155506110ad90508382612fda565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b05691015b60405180910390a1505050565b600a546001600160a01b0316331461111f5760405162461bcd60e51b8152600401610dfd90614744565b6001602b5460ff16600381111561114657634e487b7160e01b600052602160045260246000fd5b146111635760405162461bcd60e51b8152600401610dfd906146a7565b60408051606081018252601e54808252601f5460208084018290525493830193909352909160009161119591906147ca565b90508042116111f25760405162461bcd60e51b815260206004820152602360248201527f416e6369656e74204361747320436c75623a2053616c65206e6f7420737461726044820152621d195960ea1b6064820152608401610dfd565b60408051808201825242808252600a6020928301819052602182905560228190558351828152928301819052909290917f07a1cedf4c1c75b37d60d4517d84a69a3d2ec0534f3a5093c93a94dde3a6a554910160405180910390a1602b805460ff191660029081179091556040517f0a97a4ee45751e2abf3e4fc8946939630b11b371ea8ae39ccdc3056e98f5cc3f9161128f916001919061448c565b60405180910390a150505050565b6112a733826130f3565b6112c35760405162461bcd60e51b8152600401610dfd90614779565b610fc18383836131e9565b60006112d9836118df565b821061133b5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610dfd565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610fc1838383604051806020016040528060008152506126a2565b601d5460ff166113dd5760405162461bcd60e51b815260206004820152602360248201527f416e6369656e74204361747320436c75623a206275726e696e672064697361626044820152621b195960ea1b6064820152608401610dfd565b6113e733826130f3565b6114595760405162461bcd60e51b815260206004820152603860248201527f416e6369656e74204361747320436c75623a206275726e2063616c6c6572206960448201527f73206e6f74206f776e6572206e6f7220617070726f76656400000000000000006064820152608401610dfd565b61146281613394565b60016019546114719190614815565b60195550565b600a546001600160a01b031633146114a15760405162461bcd60e51b8152600401610dfd90614744565b601d805461ff001981166101009182900460ff1615909102179055565b6001600160a01b0381166000908152600e60205260409020546114f35760405162461bcd60e51b8152600401610dfd90614581565b6001600160a01b0382166000908152601160205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a082319060240160206040518083038186803b15801561154b57600080fd5b505afa15801561155f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158391906142fd565b61158d91906147ca565b905060006115c6838361103887876001600160a01b03918216600090815260126020908152604080832093909416825291909152205490565b9050806115e55760405162461bcd60e51b8152600401610dfd9061465c565b6001600160a01b0380851660009081526012602090815260408083209387168352929052908120805483929061161c9084906147ca565b90915550506001600160a01b038416600090815260116020526040812080548392906116499084906147ca565b9091555061165a905084848361343b565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b60006116b160085490565b82106117145760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610dfd565b6008828154811061173557634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b600a546001600160a01b031633146117715760405162461bcd60e51b8152600401610dfd90614744565b601355565b600a546001600160a01b031633146117a05760405162461bcd60e51b8152600401610dfd90614744565b6117ac601a8383613e66565b507f8a274cdd629b9aae599b13d8bfee3ee4a15350b0386a9b64087a393db009376782826040516117de9291906144a7565b60405180910390a15050565b6000818152600260205260408120546001600160a01b031680610cf05760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610dfd565b601a8054610e2f90614858565b600a546001600160a01b031633146118985760405162461bcd60e51b8152600401610dfd90614744565b601d805460ff19168215159081179091556040519081527f0343da01ca2a51743bc3a245ccf8007e27e6b919fb27b0f83cb5d60c2e8634f39060200160405180910390a150565b60006001600160a01b03821661194a5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610dfd565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146119905760405162461bcd60e51b8152600401610dfd90614744565b6000602b5460ff1660038111156119b757634e487b7160e01b600052602160045260246000fd5b146119d45760405162461bcd60e51b8152600401610dfd906146a7565b60408051606080820183524280835260208084018690526003938501849052601e829055601f8690558381558451828152908101869052938401839052927f65fee6c7896ea03117fe27f91b636793950b4d6bfeab9389f1e96602f131bd6e910160405180910390a1602b805460ff191660019081179091556040517f0a97a4ee45751e2abf3e4fc8946939630b11b371ea8ae39ccdc3056e98f5cc3f916110e8916000919061448c565b600a546001600160a01b03163314611aa95760405162461bcd60e51b8152600401610dfd90614744565b611ab3600061348d565b565b600a546001600160a01b03163314611adf5760405162461bcd60e51b8152600401610dfd90614744565b60005b81811015610fc1576000838383818110611b0c57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611b219190613fe9565b6001600160a01b03161415611b8c5760405162461bcd60e51b815260206004820152602b60248201527f416e6369656e74204361747320436c75623a2043616e2774206164642061207a60448201526a65726f206164647265737360a81b6064820152608401610dfd565b60266000848484818110611bb057634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611bc59190613fe9565b6001600160a01b0316815260208101919091526040016000205460ff16611c4a57600160266000858585818110611c0c57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611c219190613fe9565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790555b80611c5481614893565b915050611ae2565b600a546001600160a01b03163314611c865760405162461bcd60e51b8152600401610dfd90614744565b601455565b600060108281548110611cae57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031692915050565b6002600b541415611d1c5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610dfd565b6002600b5560408051808201909152602154808252602254602083015260009190611d49906154606147ca565b4211611d5f576702c68af0bb1400009150611d6b565b670214e8348c4f000091505b60008311611dbb5760405162461bcd60e51b815260206004820152601e60248201527f416e6369656e74204361747320436c75623a207a65726f20616d6f756e7400006044820152606401610dfd565b8051611e175760405162461bcd60e51b815260206004820152602560248201527f416e6369656e74204361747320436c75623a2073616c65206973206e6f742061604482015264637469766560d81b6064820152608401610dfd565b8051421015611e745760405162461bcd60e51b815260206004820152602360248201527f416e6369656e74204361747320436c75623a2073616c65206e6f7420737461726044820152621d195960ea1b6064820152608401610dfd565b8060200151831115611ee65760405162461bcd60e51b815260206004820152603560248201527f416e6369656e74204361747320436c75623a202043616e206f6e6c79206d696e6044820152747420313020746f6b656e7320617420612074696d6560581b6064820152608401610dfd565b60135483601954611ef791906147ca565b1115611f155760405162461bcd60e51b8152600401610dfd906144e9565b60145483601954611f2691906147ca565b1115611f445760405162461bcd60e51b8152600401610dfd906144e9565b34611f4f84846147f6565b1115611f6d5760405162461bcd60e51b8152600401610dfd906146f2565b601d54610100900460ff1615611f955760405162461bcd60e51b8152600401610dfd906145c7565b6000805b8481101561203357611faf602380546001019055565b6023549150611fbe33836134df565b33600090815260296020526040902054611fd99060016147ca565b33600090815260296020908152604080832093909355602a905220546120009060016147ca565b336000908152602a602052604090205560195461201e9060016147ca565b6019558061202b81614893565b915050611f99565b50604080518581526020810185905233917f0d905a2e95960c2ad9e627d829fae00e7f3b9794c3b62a5c376cf5deee8f2a20910160405180910390a26013548460195461208091906147ca565b14156120d157602b805460ff191660039081179091556040517f0a97a4ee45751e2abf3e4fc8946939630b11b371ea8ae39ccdc3056e98f5cc3f916120c8916002919061448c565b60405180910390a15b50506001600b555050565b606060018054610d0590614858565b6120f63383836134f9565b5050565b600a546001600160a01b031633146121245760405162461bcd60e51b8152600401610dfd90614744565b601d805462ff0000191662010000179055565b600a546001600160a01b031633146121615760405162461bcd60e51b8152600401610dfd90614744565b6013546019546121729083906147ca565b11156121d55760405162461bcd60e51b815260206004820152602c60248201527f416e6369656e74204361747320436c75623a206d617820746f74616c2073757060448201526b1c1b1e48195e18d95959195960a21b6064820152608401610dfd565b6016546017546121e69083906147ca565b11156122485760405162461bcd60e51b815260206004820152602b60248201527f416e6369656e74204361747320436c75623a206d61782067696674207375707060448201526a1b1e48195e18d95959195960aa1b6064820152608401610dfd565b6000805b828110156124ec57600084848381811061227657634e487b7160e01b600052603260045260246000fd5b905060200201602081019061228b9190613fe9565b6001600160a01b031614156122fb5760405162461bcd60e51b815260206004820152603060248201527f416e6369656e74204361747320436c75623a20726563657069656e742069732060448201526f746865206e756c6c206164647265737360801b6064820152608401610dfd565b612309602380546001019055565b602354915061234c84848381811061233157634e487b7160e01b600052603260045260246000fd5b90506020020160208101906123469190613fe9565b836134df565b6028600085858481811061237057634e487b7160e01b600052603260045260246000fd5b90506020020160208101906123859190613fe9565b6001600160a01b031681526020810191909152604001600020546123aa9060016147ca565b602860008686858181106123ce57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906123e39190613fe9565b6001600160a01b03166001600160a01b0316815260200190815260200160002081905550602a600085858481811061242b57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906124409190613fe9565b6001600160a01b031681526020810191909152604001600020546124659060016147ca565b602a600086868581811061248957634e487b7160e01b600052603260045260246000fd5b905060200201602081019061249e9190613fe9565b6001600160a01b031681526020810191909152604001600020556019546124c69060016147ca565b6019556017546124d79060016147ca565b601755806124e481614893565b91505061224c565b50505050565b600a546001600160a01b0316331461251c5760405162461bcd60e51b8152600401610dfd90614744565b60005b81811015610fc157600083838381811061254957634e487b7160e01b600052603260045260246000fd5b905060200201602081019061255e9190613fe9565b6001600160a01b031614156125cc5760405162461bcd60e51b815260206004820152602e60248201527f416e6369656e74204361747320436c75623a2043616e27742072656d6f76652060448201526d61207a65726f206164647265737360901b6064820152608401610dfd565b602660008484848181106125f057634e487b7160e01b600052603260045260246000fd5b90506020020160208101906126059190613fe9565b6001600160a01b0316815260208101919091526040016000205460ff161515600114156126905760006026600085858581811061265257634e487b7160e01b600052603260045260246000fd5b90506020020160208101906126679190613fe9565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790555b8061269a81614893565b91505061251f565b6126ac33836130f3565b6126c85760405162461bcd60e51b8152600401610dfd90614779565b6124ec848484846135c8565b601c8054610e2f90614858565b6000818152600260205260409020546060906001600160a01b03166127605760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610dfd565b601d5462010000900460ff1661280257601b805461277d90614858565b80601f01602080910402602001604051908101604052809291908181526020018280546127a990614858565b80156127f65780601f106127cb576101008083540402835291602001916127f6565b820191906000526020600020905b8154815290600101906020018083116127d957829003601f168201915b50505050509050919050565b600061280c6135fb565b9050600081511161282c576040518060200160405280600081525061285a565b806128368461360a565b601c60405160200161284a9392919061437f565b6040516020818303038152906040525b9392505050565b6002600b5414156128b45760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610dfd565b6002600b5560408051606081018252601e54808252601f546020808401919091525492820192909252906000906128ed906154606147ca565b42116128fb575060016128ff565b5060035b8083111561291f5760405162461bcd60e51b8152600401610dfd9061460c565b33600090815260276020526040902054819061293c9085906147ca565b111561295a5760405162461bcd60e51b8152600401610dfd9061460c565b3360009081526026602052604090205460ff1615156001146129c95760405162461bcd60e51b815260206004820152602260248201527f2043616c6c6572206973206e6f74206f6e207468652070726573616c65206c696044820152611cdd60f21b6064820152608401610dfd565b8151612a3d5760405162461bcd60e51b815260206004820152603e60248201527f416e6369656e74204361747320436c75623a2050726573616c65206d7573742060448201527f62652061637469766520746f206d696e7420416e6369656e74204361747300006064820152608401610dfd565b8151421015612a9d5760405162461bcd60e51b815260206004820152602660248201527f416e6369656e74204361747320436c75623a2050726573616c65206e6f7420736044820152651d185c9d195960d21b6064820152608401610dfd565b60208201518251612aae91906147ca565b421115612b095760405162461bcd60e51b815260206004820152602360248201527f416e6369656e74204361747320436c75623a2050726573616c6520697320656e60448201526219195960ea1b6064820152608401610dfd565b60155483601954612b1a91906147ca565b1115612b7f5760405162461bcd60e51b815260206004820152602e60248201527f416e6369656e74204361747320436c75623a206d61782070726573616c65207360448201526d1d5c1c1b1e48195e18d95959195960921b6064820152608401610dfd565b60135483601954612b9091906147ca565b1115612bae5760405162461bcd60e51b8152600401610dfd906144e9565b67016345785d8a000034811115612bd75760405162461bcd60e51b8152600401610dfd906146f2565b601d54610100900460ff1615612bff5760405162461bcd60e51b8152600401610dfd906145c7565b6000805b85811015612cae57612c19602380546001019055565b6023549150612c2833836134df565b33600090815260276020526040902054612c439060016147ca565b33600090815260276020908152604080832093909355602a90522054612c6a9060016147ca565b336000908152602a6020526040902055601954612c889060016147ca565b601955601854612c999060016147ca565b60185580612ca681614893565b915050612c03565b50604080518681526020810184905233917f40038d437ff4cece80b344923544b3c8527d7f6aa2f9202a9734d5d9c7ffa0e0910160405180910390a250506001600b55505050565b600a546001600160a01b03163314612d205760405162461bcd60e51b8152600401610dfd90614744565b80516120f690601c906020840190613eea565b600a546001600160a01b03163314612d5d5760405162461bcd60e51b8152600401610dfd90614744565b80516120f690601b906020840190613eea565b600a546001600160a01b03163314612d9a5760405162461bcd60e51b8152600401610dfd90614744565b6001600160a01b038116612dff5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610dfd565b612e088161348d565b50565b60008080602b5460ff166003811115612e3457634e487b7160e01b600052602160045260246000fd5b1415612e3e575060015b6001602b5460ff166003811115612e6557634e487b7160e01b600052602160045260246000fd5b1415612e6f575060025b6002602b5460ff166003811115612e9657634e487b7160e01b600052602160045260246000fd5b1415612ea0575060035b6003602b5460ff166003811115612ec757634e487b7160e01b600052602160045260246000fd5b1415612ed1575060045b919050565b60006001600160e01b031982166380ac58cd60e01b1480612f0757506001600160e01b03198216635b5e139f60e01b145b80610cf057506301ffc9a760e01b6001600160e01b0319831614610cf0565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612f5b826117ea565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600c546001600160a01b0384166000908152600e602052604081205490918391612fbe90866147f6565b612fc891906147e2565b612fd29190614815565b949350505050565b8047101561302a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610dfd565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613077576040519150601f19603f3d011682016040523d82523d6000602084013e61307c565b606091505b5050905080610fc15760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610dfd565b6000818152600260205260408120546001600160a01b031661316c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610dfd565b6000613177836117ea565b9050806001600160a01b0316846001600160a01b031614806131b25750836001600160a01b03166131a784610d88565b6001600160a01b0316145b80612fd257506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16949350505050565b826001600160a01b03166131fc826117ea565b6001600160a01b0316146132645760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610dfd565b6001600160a01b0382166132c65760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610dfd565b6132d1838383613724565b6132dc600082612f26565b6001600160a01b0383166000908152600360205260408120805460019290613305908490614815565b90915550506001600160a01b03821660009081526003602052604081208054600192906133339084906147ca565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600061339f826117ea565b90506133ad81600084613724565b6133b8600083612f26565b6001600160a01b03811660009081526003602052604081208054600192906133e1908490614815565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610fc19084906137dc565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6120f68282604051806020016040528060008152506138ae565b816001600160a01b0316836001600160a01b0316141561355b5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610dfd565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6135d38484846131e9565b6135df848484846138e1565b6124ec5760405162461bcd60e51b8152600401610dfd9061452f565b6060601a8054610d0590614858565b60608161362e5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613658578061364281614893565b91506136519050600a836147e2565b9150613632565b60008167ffffffffffffffff81111561368157634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156136ab576020820181803683370190505b5090505b8415612fd2576136c0600183614815565b91506136cd600a866148ae565b6136d89060306147ca565b60f81b8183815181106136fb57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061371d600a866147e2565b94506136af565b6001600160a01b03831661377f5761377a81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6137a2565b816001600160a01b0316836001600160a01b0316146137a2576137a283826139ee565b6001600160a01b0382166137b957610fc181613a8b565b826001600160a01b0316826001600160a01b031614610fc157610fc18282613b64565b6000613831826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613ba89092919063ffffffff16565b805190915015610fc1578080602001905181019061384f91906141de565b610fc15760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610dfd565b6138b88383613bb7565b6138c560008484846138e1565b610fc15760405162461bcd60e51b8152600401610dfd9061452f565b60006001600160a01b0384163b156139e357604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613925903390899088908890600401614441565b602060405180830381600087803b15801561393f57600080fd5b505af192505050801561396f575060408051601f3d908101601f1916820190925261396c91810190614216565b60015b6139c9573d80801561399d576040519150601f19603f3d011682016040523d82523d6000602084013e6139a2565b606091505b5080516139c15760405162461bcd60e51b8152600401610dfd9061452f565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612fd2565b506001949350505050565b600060016139fb846118df565b613a059190614815565b600083815260076020526040902054909150808214613a58576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090613a9d90600190614815565b60008381526009602052604081205460088054939450909284908110613ad357634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060088381548110613b0257634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480613b4857634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613b6f836118df565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6060612fd28484600085613d05565b6001600160a01b038216613c0d5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610dfd565b6000818152600260205260409020546001600160a01b031615613c725760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610dfd565b613c7e60008383613724565b6001600160a01b0382166000908152600360205260408120805460019290613ca79084906147ca565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b606082471015613d665760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610dfd565b843b613db45760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610dfd565b600080866001600160a01b03168587604051613dd09190614363565b60006040518083038185875af1925050503d8060008114613e0d576040519150601f19603f3d011682016040523d82523d6000602084013e613e12565b606091505b5091509150613e22828286613e2d565b979650505050505050565b60608315613e3c57508161285a565b825115613e4c5782518084602001fd5b8160405162461bcd60e51b8152600401610dfd91906144d6565b828054613e7290614858565b90600052602060002090601f016020900481019282613e945760008555613eda565b82601f10613ead5782800160ff19823516178555613eda565b82800160010185558215613eda579182015b82811115613eda578235825591602001919060010190613ebf565b50613ee6929150613f5e565b5090565b828054613ef690614858565b90600052602060002090601f016020900481019282613f185760008555613eda565b82601f10613f3157805160ff1916838001178555613eda565b82800160010185558215613eda579182015b82811115613eda578251825591602001919060010190613f43565b5b80821115613ee65760008155600101613f5f565b600067ffffffffffffffff80841115613f8e57613f8e6148ee565b604051601f8501601f19908116603f01168101908282118183101715613fb657613fb66148ee565b81604052809350858152868686011115613fcf57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215613ffa578081fd5b813561285a81614904565b60008060408385031215614017578081fd5b823561402281614904565b9150602083013561403281614904565b809150509250929050565b600080600060608486031215614051578081fd5b833561405c81614904565b9250602084013561406c81614904565b929592945050506040919091013590565b60008060008060808587031215614092578081fd5b843561409d81614904565b935060208501356140ad81614904565b925060408501359150606085013567ffffffffffffffff8111156140cf578182fd5b8501601f810187136140df578182fd5b6140ee87823560208401613f73565b91505092959194509250565b6000806040838503121561410c578182fd5b823561411781614904565b9150602083013561403281614919565b60008060408385031215614139578182fd5b823561414481614904565b946020939093013593505050565b60008060208385031215614164578182fd5b823567ffffffffffffffff8082111561417b578384fd5b818501915085601f83011261418e578384fd5b81358181111561419c578485fd5b8660208260051b85010111156141b0578485fd5b60209290920196919550909350505050565b6000602082840312156141d3578081fd5b813561285a81614919565b6000602082840312156141ef578081fd5b815161285a81614919565b60006020828403121561420b578081fd5b813561285a81614927565b600060208284031215614227578081fd5b815161285a81614927565b60008060408385031215614017578182fd5b60008060208385031215614256578182fd5b823567ffffffffffffffff8082111561426d578384fd5b818501915085601f830112614280578384fd5b81358181111561428e578485fd5b8660208285010111156141b0578485fd5b6000602082840312156142b0578081fd5b813567ffffffffffffffff8111156142c6578182fd5b8201601f810184136142d6578182fd5b612fd284823560208401613f73565b6000602082840312156142f6578081fd5b5035919050565b60006020828403121561430e578081fd5b5051919050565b6000815180845261432d81602086016020860161482c565b601f01601f19169290920160200192915050565b6004811061435f57634e487b7160e01b600052602160045260246000fd5b9052565b6000825161437581846020870161482c565b9190910192915050565b6000845160206143928285838a0161482c565b8551918401916143a58184848a0161482c565b85549201918390600181811c90808316806143c157607f831692505b8583108114156143df57634e487b7160e01b88526022600452602488fd5b8080156143f3576001811461440457614430565b60ff19851688528388019550614430565b60008b815260209020895b858110156144285781548a82015290840190880161440f565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061447490830184614315565b9695505050505050565b60208101610cf08284614341565b6040810161449a8285614341565b61285a6020830184614341565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b60208152600061285a6020830184614315565b60208082526026908201527f416e6369656e74204361747320436c75623a206d617820737570706c7920657860408201526518d95959195960d21b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b60208082526025908201527f416e6369656e74204361747320436c75623a20636f6e74726163742069732070604082015264185d5cd95960da1b606082015260800190565b60208082526030908201527f416e6369656e74204361747320436c75623a20596f752063616e2774206d696e60408201526f7420736f206d75636820746f6b656e7360801b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b6020808252602b908201527f416e6369656e74204361747320436c75623a20556e617574686f72697a65642060408201526a2a3930b739b0b1ba34b7b760a91b606082015260800190565b60208082526032908201527f416e6369656e74204361747320436c75623a2045746865722076616c75652073604082015271195b9d081a5cc81b9bdd0818dbdc9c9958dd60721b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600082198211156147dd576147dd6148c2565b500190565b6000826147f1576147f16148d8565b500490565b6000816000190483118215151615614810576148106148c2565b500290565b600082821015614827576148276148c2565b500390565b60005b8381101561484757818101518382015260200161482f565b838111156124ec5750506000910152565b600181811c9082168061486c57607f821691505b6020821081141561488d57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156148a7576148a76148c2565b5060010190565b6000826148bd576148bd6148d8565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114612e0857600080fd5b8015158114612e0857600080fd5b6001600160e01b031981168114612e0857600080fdfea26469706673582212209c6c15ecf867581070ea4c81df2496d65888a6674d206fb209a206d3b8ab1b4c64736f6c63430008040033
Deployed Bytecode Sourcemap
63201:13184:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28055:40;10003:10;28055:40;;;-1:-1:-1;;;;;10483:32:1;;;10465:51;;28085:9:0;10547:2:1;10532:18;;10525:34;10438:18;28055:40:0;;;;;;;63201:13184;;;;;63830:23;;;;;;;;;;;;;;;;;;;32221:25:1;;;32209:2;32194:18;63830:23:0;;;;;;;;56982:224;;;;;;;;;;-1:-1:-1;56982:224:0;;;;;:::i;:::-;;:::i;:::-;;;11507:14:1;;11500:22;11482:41;;11470:2;11455:18;56982:224:0;11437:92:1;44476:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;63967:25::-;;;;;;;;;;-1:-1:-1;63967:25:0;;;;;;;;46035:221;;;;;;;;;;-1:-1:-1;46035:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;10239:32:1;;;10221:51;;10209:2;10194:18;46035:221:0;10176:102:1;63888:28:0;;;;;;;;;;;;;:::i;45558:411::-;;;;;;;;;;-1:-1:-1;45558:411:0;;;;;:::i;:::-;;:::i;:::-;;64841:47;;;;;;;;;;-1:-1:-1;64841:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;57622:113;;;;;;;;;;-1:-1:-1;57710:10:0;:17;57622:113;;29841:566;;;;;;;;;;-1:-1:-1;29841:566:0;;;;;:::i;:::-;;:::i;68003:791::-;;;;;;;;;;;;;:::i;63679:38::-;;;;;;;;;;;;;;;;46785:339;;;;;;;;;;-1:-1:-1;46785:339:0;;;;;:::i;:::-;;:::i;57290:256::-;;;;;;;;;;-1:-1:-1;57290:256:0;;;;;:::i;:::-;;:::i;28186:91::-;;;;;;;;;;-1:-1:-1;28257:12:0;;28186:91;;29315:135;;;;;;;;;;-1:-1:-1;29315:135:0;;;;;:::i;:::-;-1:-1:-1;;;;;29412:21:0;;;29385:7;29412:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;29315:135;47195:185;;;;;;;;;;-1:-1:-1;47195:185:0;;;;;:::i;:::-;;:::i;76047:335::-;;;;;;;;;;-1:-1:-1;76047:335:0;;;;;:::i;:::-;;:::i;65877:80::-;;;;;;;;;;;;;:::i;30675:641::-;;;;;;;;;;-1:-1:-1;30675:641:0;;;;;:::i;:::-;;:::i;57812:233::-;;;;;;;;;;-1:-1:-1;57812:233:0;;;;;:::i;:::-;;:::i;64032:28::-;;;;;;;;;;-1:-1:-1;64032:28:0;;;;;;;;;;;64787:47;;;;;;;;;;-1:-1:-1;64787:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;75810:105;;;;;;;;;;-1:-1:-1;75810:105:0;;;;;:::i;:::-;;:::i;65965:156::-;;;;;;;;;;-1:-1:-1;65965:156:0;;;;;:::i;:::-;;:::i;63999:26::-;;;;;;;;;;-1:-1:-1;63999:26:0;;;;;;;;;;;63724:34;;;;;;;;;;;;;;;;44170:239;;;;;;;;;;-1:-1:-1;44170:239:0;;;;;:::i;:::-;;:::i;63860:21::-;;;;;;;;;;;;;:::i;68802:166::-;;;;;;;;;;-1:-1:-1;68802:166:0;;;;;:::i;:::-;;:::i;43900:208::-;;;;;;;;;;-1:-1:-1;43900:208:0;;;;;:::i;:::-;;:::i;67388:607::-;;;;;;;;;;-1:-1:-1;67388:607:0;;;;;:::i;:::-;;:::i;11850:103::-;;;;;;;;;;;;;:::i;66314:461::-;;;;;;;;;;-1:-1:-1;66314:461:0;;;;;:::i;:::-;;:::i;75923:116::-;;;;;;;;;;-1:-1:-1;75923:116:0;;;;;:::i;:::-;;:::i;64895:48::-;;;;;;;;;;-1:-1:-1;64895:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;29541:100;;;;;;;;;;-1:-1:-1;29541:100:0;;;;;:::i;:::-;;:::i;72303:1993::-;;;;;;:::i;:::-;;:::i;64730:50::-;;;;;;;;;;-1:-1:-1;64730:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;11199:87;;;;;;;;;;-1:-1:-1;11272:6:0;;-1:-1:-1;;;;;11272:6:0;11199:87;;64108:28;;;;;;;;;;-1:-1:-1;64108:28:0;;;;;;;;;;;;;32431:25:1;;;32487:2;32472:18;;32465:34;;;;32404:18;64108:28:0;32386:119:1;44645:104:0;;;;;;;;;;;;;:::i;29037:109::-;;;;;;;;;;-1:-1:-1;29037:109:0;;;;;:::i;:::-;-1:-1:-1;;;;;29120:18:0;29093:7;29120:18;;;:9;:18;;;;;;;29037:109;46328:155;;;;;;;;;;-1:-1:-1;46328:155:0;;;;;:::i;:::-;;:::i;65061:30::-;;;;;;;;;;-1:-1:-1;65061:30:0;;;;;;;;;;;;;;;:::i;66237:69::-;;;;;;;;;;;;;:::i;68976:1011::-;;;;;;;;;;-1:-1:-1;68976:1011:0;;;;;:::i;:::-;;:::i;66911:469::-;;;;;;;;;;-1:-1:-1;66911:469:0;;;;;:::i;:::-;;:::i;63637:35::-;;;;;;;;;;;;;;;;47451:328;;;;;;;;;;-1:-1:-1;47451:328:0;;;;;:::i;:::-;;:::i;63923:37::-;;;;;;;;;;;;;:::i;74786:723::-;;;;;;;;;;-1:-1:-1;74786:723:0;;;;;:::i;:::-;;:::i;69995:2300::-;;;;;;:::i;:::-;;:::i;63796:27::-;;;;;;;;;;;;;;;;28833:105;;;;;;;;;;-1:-1:-1;28833:105:0;;;;;:::i;:::-;-1:-1:-1;;;;;28914:16:0;28887:7;28914:16;;;:7;:16;;;;;;;28833:105;63599:31;;;;;;;;;;;;;;;;28623:119;;;;;;;;;;-1:-1:-1;28623:119:0;;;;;:::i;:::-;-1:-1:-1;;;;;28708:26:0;28681:7;28708:26;;;:19;:26;;;;;;;28623:119;75517:151;;;;;;;;;;-1:-1:-1;75517:151:0;;;;;:::i;:::-;;:::i;66783:120::-;;;;;;;;;;-1:-1:-1;66783:120:0;;;;;:::i;:::-;-1:-1:-1;;;;;66873:22:0;66849:4;66873:22;;;:12;:22;;;;;;;;;66783:120;28371:95;;;;;;;;;;-1:-1:-1;28444:14:0;;28371:95;;46554:164;;;;;;;;;;-1:-1:-1;46554:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;46675:25:0;;;46651:4;46675:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;46554:164;63765:24;;;;;;;;;;;;;;;;75676:126;;;;;;;;;;-1:-1:-1;75676:126:0;;;;;:::i;:::-;;:::i;12108:201::-;;;;;;;;;;-1:-1:-1;12108:201:0;;;;;:::i;:::-;;:::i;74304:474::-;;;;;;;;;;;;;:::i;64067:34::-;;;;;;;;;;-1:-1:-1;64067:34:0;;;;;;;;;;;;;;;;32712:25:1;;;32768:2;32753:18;;32746:34;;;;32796:18;;;32789:34;32700:2;32685:18;64067:34:0;32667:162:1;56982:224:0;57084:4;-1:-1:-1;;;;;;57108:50:0;;-1:-1:-1;;;57108:50:0;;:90;;;57162:36;57186:11;57162:23;:36::i;:::-;57101:97;56982:224;-1:-1:-1;;56982:224:0:o;44476:100::-;44530:13;44563:5;44556:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44476:100;:::o;46035:221::-;46111:7;49378:16;;;:7;:16;;;;;;-1:-1:-1;;;;;49378:16:0;46131:73;;;;-1:-1:-1;;;46131:73:0;;24601:2:1;46131:73:0;;;24583:21:1;24640:2;24620:18;;;24613:30;24679:34;24659:18;;;24652:62;-1:-1:-1;;;24730:18:1;;;24723:42;24782:19;;46131:73:0;;;;;;;;;-1:-1:-1;46224:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;46224:24:0;;46035:221::o;63888:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;45558:411::-;45639:13;45655:23;45670:7;45655:14;:23::i;:::-;45639:39;;45703:5;-1:-1:-1;;;;;45697:11:0;:2;-1:-1:-1;;;;;45697:11:0;;;45689:57;;;;-1:-1:-1;;;45689:57:0;;27442:2:1;45689:57:0;;;27424:21:1;27481:2;27461:18;;;27454:30;27520:34;27500:18;;;27493:62;-1:-1:-1;;;27571:18:1;;;27564:31;27612:19;;45689:57:0;27414:223:1;45689:57:0;10003:10;-1:-1:-1;;;;;45781:21:0;;;;:62;;-1:-1:-1;45806:37:0;45823:5;10003:10;46554:164;:::i;45806:37::-;45759:168;;;;-1:-1:-1;;;45759:168:0;;20917:2:1;45759:168:0;;;20899:21:1;20956:2;20936:18;;;20929:30;20995:34;20975:18;;;20968:62;21066:26;21046:18;;;21039:54;21110:19;;45759:168:0;20889:246:1;45759:168:0;45940:21;45949:2;45953:7;45940:8;:21::i;:::-;45558:411;;;:::o;29841:566::-;-1:-1:-1;;;;;29917:16:0;;29936:1;29917:16;;;:7;:16;;;;;;29909:71;;;;-1:-1:-1;;;29909:71:0;;;;;;;:::i;:::-;29993:21;30041:15;28444:14;;;28371:95;30041:15;30017:39;;:21;:39;:::i;:::-;29993:63;;30067:15;30085:58;30101:7;30110:13;30125:17;30134:7;-1:-1:-1;;;;;29120:18:0;29093:7;29120:18;;;:9;:18;;;;;;;29037:109;30125:17;30085:15;:58::i;:::-;30067:76;-1:-1:-1;30164:12:0;30156:68;;;;-1:-1:-1;;;30156:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30237:18:0;;;;;;:9;:18;;;;;:29;;30259:7;;30237:18;:29;;30259:7;;30237:29;:::i;:::-;;;;;;;;30295:7;30277:14;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;30315:35:0;;-1:-1:-1;30333:7:0;30342;30315:17;:35::i;:::-;30366:33;;;-1:-1:-1;;;;;10483:32:1;;10465:51;;10547:2;10532:18;;10525:34;;;30366:33:0;;10438:18:1;30366:33:0;;;;;;;;29841:566;;;:::o;68003:791::-;11272:6;;-1:-1:-1;;;;;11272:6:0;10003:10;11419:23;11411:68;;;;-1:-1:-1;;;11411:68:0;;;;;;;:::i;:::-;68088:22:::1;68076:8;::::0;::::1;;:34;::::0;::::1;;;;-1:-1:-1::0;;;68076:34:0::1;;;;;;;;;;68054:127;;;;-1:-1:-1::0;;;68054:127:0::1;;;;;;;:::i;:::-;68192:51;::::0;;::::1;::::0;::::1;::::0;;68230:13:::1;68192:51:::0;;;;;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;:35:::1;::::0;68280:63:::1;::::0;68192:51;68280:63:::1;:::i;:::-;68254:89;;68394:15;68376;:33;68354:118;;;::::0;-1:-1:-1;;;68354:118:0;;25375:2:1;68354:118:0::1;::::0;::::1;25357:21:1::0;25414:2;25394:18;;;25387:30;25453:34;25433:18;;;25426:62;-1:-1:-1;;;25504:18:1;;;25497:33;25547:19;;68354:118:0::1;25347:225:1::0;68354:118:0::1;68576:33;::::0;;;;::::1;::::0;;68504:15:::1;68576:33:::0;;;68550:2:::1;68576:33;::::0;;::::1;::::0;;;68563:10:::1;:46:::0;;;;;;;68625:39;;32431:25:1;;;32472:18;;;32465:34;;;68504:15:0;;68550:2;;68625:39:::1;::::0;32404:18:1;68625:39:0::1;;;;;;;68675:8;:30:::0;;-1:-1:-1;;68675:30:0::1;68686:19;68675:30:::0;;::::1;::::0;;;68721:65:::1;::::0;::::1;::::0;::::1;::::0;68675:30;;68686:19;68721:65:::1;:::i;:::-;;;;;;;;11490:1;;;;68003:791::o:0;46785:339::-;46980:41;10003:10;47013:7;46980:18;:41::i;:::-;46972:103;;;;-1:-1:-1;;;46972:103:0;;;;;;;:::i;:::-;47088:28;47098:4;47104:2;47108:7;47088:9;:28::i;57290:256::-;57387:7;57423:23;57440:5;57423:16;:23::i;:::-;57415:5;:31;57407:87;;;;-1:-1:-1;;;57407:87:0;;13323:2:1;57407:87:0;;;13305:21:1;13362:2;13342:18;;;13335:30;13401:34;13381:18;;;13374:62;-1:-1:-1;;;13452:18:1;;;13445:41;13503:19;;57407:87:0;13295:233:1;57407:87:0;-1:-1:-1;;;;;;57512:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;57290:256::o;47195:185::-;47333:39;47350:4;47356:2;47360:7;47333:39;;;;;;;;;;;;:16;:39::i;76047:335::-;76106:13;;;;76098:61;;;;-1:-1:-1;;;76098:61:0;;31036:2:1;76098:61:0;;;31018:21:1;31075:2;31055:18;;;31048:30;31114:34;31094:18;;;31087:62;-1:-1:-1;;;31165:18:1;;;31158:33;31208:19;;76098:61:0;31008:225:1;76098:61:0;76192:39;76211:10;76223:7;76192:18;:39::i;:::-;76170:145;;;;-1:-1:-1;;;76170:145:0;;26189:2:1;76170:145:0;;;26171:21:1;26228:2;26208:18;;;26201:30;26267:34;26247:18;;;26240:62;26338:26;26318:18;;;26311:54;26382:19;;76170:145:0;26161:246:1;76170:145:0;76326:14;76332:7;76326:5;:14::i;:::-;76373:1;76362:8;;:12;;;;:::i;:::-;76351:8;:23;-1:-1:-1;76047:335:0:o;65877:80::-;11272:6;;-1:-1:-1;;;;;11272:6:0;10003:10;11419:23;11411:68;;;;-1:-1:-1;;;11411:68:0;;;;;;;:::i;:::-;65943:6:::1;::::0;;-1:-1:-1;;65933:16:0;::::1;65943:6;::::0;;;::::1;;;65942:7;65933:16:::0;;::::1;;::::0;;65877:80::o;30675:641::-;-1:-1:-1;;;;;30757:16:0;;30776:1;30757:16;;;:7;:16;;;;;;30749:71;;;;-1:-1:-1;;;30749:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28708:26:0;;30833:21;28708:26;;;:19;:26;;;;;;30857:30;;-1:-1:-1;;;30857:30:0;;30881:4;30857:30;;;10221:51:1;-1:-1:-1;;;;;30857:15:0;;;;;10194:18:1;;30857:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;30833:77;;30921:15;30939:65;30955:7;30964:13;30979:24;30988:5;30995:7;-1:-1:-1;;;;;29412:21:0;;;29385:7;29412:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;29315:135;30939:65;30921:83;-1:-1:-1;31025:12:0;31017:68;;;;-1:-1:-1;;;31017:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31098:21:0;;;;;;;:14;:21;;;;;;;;:30;;;;;;;;;;;:41;;31132:7;;31098:21;:41;;31132:7;;31098:41;:::i;:::-;;;;-1:-1:-1;;;;;;;31150:26:0;;;;;;:19;:26;;;;;:37;;31180:7;;31150:26;:37;;31180:7;;31150:37;:::i;:::-;;;;-1:-1:-1;31200:47:0;;-1:-1:-1;31223:5:0;31230:7;31239;31200:22;:47::i;:::-;31263:45;;;-1:-1:-1;;;;;10483:32:1;;;10465:51;;10547:2;10532:18;;10525:34;;;31263:45:0;;;;;10438:18:1;31263:45:0;;;;;;;30675:641;;;;:::o;57812:233::-;57887:7;57923:30;57710:10;:17;;57622:113;57923:30;57915:5;:38;57907:95;;;;-1:-1:-1;;;57907:95:0;;28620:2:1;57907:95:0;;;28602:21:1;28659:2;28639:18;;;28632:30;28698:34;28678:18;;;28671:62;-1:-1:-1;;;28749:18:1;;;28742:42;28801:19;;57907:95:0;28592:234:1;57907:95:0;58020:10;58031:5;58020:17;;;;;;-1:-1:-1;;;58020:17:0;;;;;;;;;;;;;;;;;58013:24;;57812:233;;;:::o;75810:105::-;11272:6;;-1:-1:-1;;;;;11272:6:0;10003:10;11419:23;11411:68;;;;-1:-1:-1;;;11411:68:0;;;;;;;:::i;:::-;75885:9:::1;:22:::0;75810:105::o;65965:156::-;11272:6;;-1:-1:-1;;;;;11272:6:0;10003:10;11419:23;11411:68;;;;-1:-1:-1;;;11411:68:0;;;;;;;:::i;:::-;66046:23:::1;:7;66056:13:::0;;66046:23:::1;:::i;:::-;;66085:28;66099:13;;66085:28;;;;;;;:::i;:::-;;;;;;;;65965:156:::0;;:::o;44170:239::-;44242:7;44278:16;;;:7;:16;;;;;;-1:-1:-1;;;;;44278:16:0;44313:19;44305:73;;;;-1:-1:-1;;;44305:73:0;;21753:2:1;44305:73:0;;;21735:21:1;21792:2;21772:18;;;21765:30;21831:34;21811:18;;;21804:62;-1:-1:-1;;;21882:18:1;;;21875:39;21931:19;;44305:73:0;21725:231:1;63860:21:0;;;;;;;:::i;68802:166::-;11272:6;;-1:-1:-1;;;;;11272:6:0;10003:10;11419:23;11411:68;;;;-1:-1:-1;;;11411:68:0;;;;;;;:::i;:::-;68879:13:::1;:30:::0;;-1:-1:-1;;68879:30:0::1;::::0;::::1;;::::0;;::::1;::::0;;;68925:35:::1;::::0;11482:41:1;;;68925:35:0::1;::::0;11470:2:1;11455:18;68925:35:0::1;;;;;;;68802:166:::0;:::o;43900:208::-;43972:7;-1:-1:-1;;;;;44000:19:0;;43992:74;;;;-1:-1:-1;;;43992:74:0;;21342:2:1;43992:74:0;;;21324:21:1;21381:2;21361:18;;;21354:30;21420:34;21400:18;;;21393:62;-1:-1:-1;;;21471:18:1;;;21464:40;21521:19;;43992:74:0;21314:232:1;43992:74:0;-1:-1:-1;;;;;;44084:16:0;;;;;:9;:16;;;;;;;43900:208::o;67388:607::-;11272:6;;-1:-1:-1;;;;;11272:6:0;10003:10;11419:23;11411:68;;;;-1:-1:-1;;;11411:68:0;;;;;;;:::i;:::-;67493:29:::1;67481:8;::::0;::::1;;:41;::::0;::::1;;;;-1:-1:-1::0;;;67481:41:0::1;;;;;;;;;;67459:134;;;;-1:-1:-1::0;;;67459:134:0::1;;;;;;;:::i;:::-;67699:47;::::0;;::::1;::::0;;::::1;::::0;;67625:15:::1;67699:47:::0;;;::::1;::::0;;::::1;::::0;;;67671:1:::1;67699:47:::0;;;;;;67683:13:::1;:63:::0;;;;;;;;;;67762:53;;32712:25:1;;;32753:18;;;32746:34;;;32796:18;;;32789:34;;;67625:15:0;67762:53:::1;::::0;32685:18:1;67762:53:0::1;;;;;;;67826:8;:33:::0;;-1:-1:-1;;67826:33:0::1;67837:22;67826:33:::0;;::::1;::::0;;;67875:112:::1;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;67837:22:0;67875:112:::1;:::i;11850:103::-:0;11272:6;;-1:-1:-1;;;;;11272:6:0;10003:10;11419:23;11411:68;;;;-1:-1:-1;;;11411:68:0;;;;;;;:::i;:::-;11915:30:::1;11942:1;11915:18;:30::i;:::-;11850:103::o:0;66314:461::-;11272:6;;-1:-1:-1;;;;;11272:6:0;10003:10;11419:23;11411:68;;;;-1:-1:-1;;;11411:68:0;;;;;;;:::i;:::-;66429:11:::1;66424:344;66446:23:::0;;::::1;66424:344;;;66546:1;66519:10:::0;;66530:3;66519:15;;::::1;;;-1:-1:-1::0;;;66519:15:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;66519:29:0::1;;;66493:134;;;::::0;-1:-1:-1;;;66493:134:0;;29033:2:1;66493:134:0::1;::::0;::::1;29015:21:1::0;29072:2;29052:18;;;29045:30;29111:34;29091:18;;;29084:62;-1:-1:-1;;;29162:18:1;;;29155:41;29213:19;;66493:134:0::1;29005:233:1::0;66493:134:0::1;66646:12;:29;66659:10;;66670:3;66659:15;;;;;-1:-1:-1::0;;;66659:15:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;66646:29:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;66646:29:0;;::::1;;66642:115;;66737:4;66705:12;:29;66718:10;;66729:3;66718:15;;;;;-1:-1:-1::0;;;66718:15:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;66705:29:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;66705:29:0;:36;;-1:-1:-1;;66705:36:0::1;::::0;::::1;;::::0;;;::::1;::::0;;66642:115:::1;66471:5:::0;::::1;::::0;::::1;:::i;:::-;;;;66424:344;;75923:116:::0;11272:6;;-1:-1:-1;;;;;11272:6:0;10003:10;11419:23;11411:68;;;;-1:-1:-1;;;11411:68:0;;;;;;;:::i;:::-;76001:13:::1;:30:::0;75923:116::o;29541:100::-;29592:7;29619;29627:5;29619:14;;;;;;-1:-1:-1;;;29619:14:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29619:14:0;;29541:100;-1:-1:-1;;29541:100:0:o;72303:1993::-;1812:1;2410:7;;:19;;2402:63;;;;-1:-1:-1;;;2402:63:0;;30676:2:1;2402:63:0;;;30658:21:1;30715:2;30695:18;;;30688:30;30754:33;30734:18;;;30727:61;30805:18;;2402:63:0;30648:181:1;2402:63:0;1812:1;2543:7;:18;72404:42:::1;::::0;;;;::::1;::::0;;;72436:10:::1;72404:42:::0;;;;;;::::1;::::0;::::1;::::0;72379:14:::1;::::0;72404:42;72480:31:::1;::::0;72504:7:::1;72480:31;:::i;:::-;72461:15;:50;72457:191;;72537:18;72528:27;;72457:191;;;72607:18;72598:27;;72457:191;72676:1;72666:7;:11;72658:54;;;::::0;-1:-1:-1;;;72658:54:0;;16893:2:1;72658:54:0::1;::::0;::::1;16875:21:1::0;16932:2;16912:18;;;16905:30;16971:32;16951:18;;;16944:60;17021:18;;72658:54:0::1;16865:180:1::0;72658:54:0::1;72745:21:::0;;72723:112:::1;;;::::0;-1:-1:-1;;;72723:112:0;;22163:2:1;72723:112:0::1;::::0;::::1;22145:21:1::0;22202:2;22182:18;;;22175:30;22241:34;22221:18;;;22214:62;-1:-1:-1;;;22292:18:1;;;22285:35;22337:19;;72723:112:0::1;22135:227:1::0;72723:112:0::1;72887:21:::0;;72868:15:::1;:40;;72846:125;;;::::0;-1:-1:-1;;;72846:125:0;;17252:2:1;72846:125:0::1;::::0;::::1;17234:21:1::0;17291:2;17271:18;;;17264:30;17330:34;17310:18;;;17303:62;-1:-1:-1;;;17381:18:1;;;17374:33;17424:19;;72846:125:0::1;17224:225:1::0;72846:125:0::1;73015:11;:20;;;73004:7;:31;;72982:134;;;::::0;-1:-1:-1;;;72982:134:0;;31855:2:1;72982:134:0::1;::::0;::::1;31837:21:1::0;31894:2;31874:18;;;31867:30;31933:34;31913:18;;;31906:62;-1:-1:-1;;;31984:18:1;;;31977:51;32045:19;;72982:134:0::1;31827:243:1::0;72982:134:0::1;73171:9;;73160:7;73149:8;;:18;;;;:::i;:::-;:31;;73127:119;;;;-1:-1:-1::0;;;73127:119:0::1;;;;;;;:::i;:::-;73301:13;;73290:7;73279:8;;:18;;;;:::i;:::-;:35;;73257:123;;;;-1:-1:-1::0;;;73257:123:0::1;;;;;;;:::i;:::-;73433:9;73413:16;73422:7:::0;73413:6;:16:::1;:::i;:::-;:29;;73391:129;;;;-1:-1:-1::0;;;73391:129:0::1;;;;;;;:::i;:::-;73540:6;::::0;::::1;::::0;::::1;;;73539:7;73531:57;;;;-1:-1:-1::0;;;73531:57:0::1;;;;;;;:::i;:::-;73599:18;::::0;73628:367:::1;73656:7;73650:3;:13;73628:367;;;73687:21;:9;6738:19:::0;;6756:1;6738:19;;;6649:127;73687:21:::1;73736:9;6619:14:::0;73723:32:::1;;73770:33;73780:10;73792;73770:9;:33::i;:::-;73858:10;73845:24;::::0;;;:12:::1;:24;::::0;;;;;:28:::1;::::0;73872:1:::1;73845:28;:::i;:::-;73831:10;73818:24;::::0;;;:12:::1;:24;::::0;;;;;;;:55;;;;73916:13:::1;:25:::0;;;;:29:::1;::::0;73944:1:::1;73916:29;:::i;:::-;73902:10;73888:25;::::0;;;:13:::1;:25;::::0;;;;:57;73971:8:::1;::::0;:12:::1;::::0;73982:1:::1;73971:12;:::i;:::-;73960:8;:23:::0;73665:5;::::1;::::0;::::1;:::i;:::-;;;;73628:367;;;-1:-1:-1::0;74010:37:0::1;::::0;;32431:25:1;;;32487:2;32472:18;;32465:34;;;74019:10:0::1;::::0;74010:37:::1;::::0;32404:18:1;74010:37:0::1;;;;;;;74084:9;;74073:7;74062:8;;:18;;;;:::i;:::-;:31;74058:231;;;74110:8;:33:::0;;-1:-1:-1;;74110:33:0::1;74121:22;74110:33:::0;;::::1;::::0;;;74163:114:::1;::::0;::::1;::::0;::::1;::::0;74202:19:::1;::::0;74121:22;74163:114:::1;:::i;:::-;;;;;;;;74058:231;-1:-1:-1::0;;1768:1:0;2722:7;:22;-1:-1:-1;;72303:1993:0:o;44645:104::-;44701:13;44734:7;44727:14;;;;;:::i;46328:155::-;46423:52;10003:10;46456:8;46466;46423:18;:52::i;:::-;46328:155;;:::o;66237:69::-;11272:6;;-1:-1:-1;;;;;11272:6:0;10003:10;11419:23;11411:68;;;;-1:-1:-1;;;11411:68:0;;;;;;;:::i;:::-;66283:8:::1;:15:::0;;-1:-1:-1;;66283:15:0::1;::::0;::::1;::::0;;66237:69::o;68976:1011::-;11272:6;;-1:-1:-1;;;;;11272:6:0;10003:10;11419:23;11411:68;;;;-1:-1:-1;;;11411:68:0;;;;;;;:::i;:::-;69109:9:::1;::::0;69077:8:::1;::::0;:28:::1;::::0;69088:10;;69077:28:::1;:::i;:::-;:41;;69055:135;;;::::0;-1:-1:-1;;;69055:135:0;;30263:2:1;69055:135:0::1;::::0;::::1;30245:21:1::0;30302:2;30282:18;;;30275:30;30341:34;30321:18;;;30314:62;-1:-1:-1;;;30392:18:1;;;30385:42;30444:19;;69055:135:0::1;30235:234:1::0;69055:135:0::1;69258:13;::::0;69225:9:::1;::::0;:29:::1;::::0;69237:10;;69225:29:::1;:::i;:::-;:46;;69203:139;;;::::0;-1:-1:-1;;;69203:139:0;;27030:2:1;69203:139:0::1;::::0;::::1;27012:21:1::0;27069:2;27049:18;;;27042:30;27108:34;27088:18;;;27081:62;-1:-1:-1;;;27159:18:1;;;27152:41;27210:19;;69203:139:0::1;27002:233:1::0;69203:139:0::1;69355:18;::::0;69384:596:::1;69406:23:::0;;::::1;69384:596;;;69506:1;69479:10:::0;;69490:3;69479:15;;::::1;;;-1:-1:-1::0;;;69479:15:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;69479:29:0::1;;;69453:139;;;::::0;-1:-1:-1;;;69453:139:0;;23404:2:1;69453:139:0::1;::::0;::::1;23386:21:1::0;23443:2;23423:18;;;23416:30;23482:34;23462:18;;;23455:62;-1:-1:-1;;;23533:18:1;;;23526:46;23589:19;;69453:139:0::1;23376:238:1::0;69453:139:0::1;69607:21;:9;6738:19:::0;;6756:1;6738:19;;;6649:127;69607:21:::1;69656:9;6619:14:::0;69643:32:::1;;69690:38;69700:10;;69711:3;69700:15;;;;;-1:-1:-1::0;;;69700:15:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69717:10;69690:9;:38::i;:::-;69775:12;:29;69788:10;;69799:3;69788:15;;;;;-1:-1:-1::0;;;69788:15:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;69775:29:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;69775:29:0;;:33:::1;::::0;69807:1:::1;69775:33;:::i;:::-;69743:12;:29;69756:10;;69767:3;69756:15;;;;;-1:-1:-1::0;;;69756:15:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;69743:29:0::1;-1:-1:-1::0;;;;;69743:29:0::1;;;;;;;;;;;;:65;;;;69856:13;:30;69870:10;;69881:3;69870:15;;;;;-1:-1:-1::0;;;69870:15:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;69856:30:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;69856:30:0;;:34:::1;::::0;69889:1:::1;69856:34;:::i;:::-;69823:13;:30;69837:10;;69848:3;69837:15;;;;;-1:-1:-1::0;;;69837:15:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;69823:30:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;69823:30:0;:67;69916:8:::1;::::0;:12:::1;::::0;69927:1:::1;69916:12;:::i;:::-;69905:8;:23:::0;69955:9:::1;::::0;:13:::1;::::0;69967:1:::1;69955:13;:::i;:::-;69943:9;:25:::0;69431:5;::::1;::::0;::::1;:::i;:::-;;;;69384:596;;;;11490:1;68976:1011:::0;;:::o;66911:469::-;11272:6;;-1:-1:-1;;;;;11272:6:0;10003:10;11419:23;11411:68;;;;-1:-1:-1;;;11411:68:0;;;;;;;:::i;:::-;67031:11:::1;67026:347;67048:23:::0;;::::1;67026:347;;;67148:1;67121:10:::0;;67132:3;67121:15;;::::1;;;-1:-1:-1::0;;;67121:15:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;67121:29:0::1;;;67095:137;;;::::0;-1:-1:-1;;;67095:137:0;;20090:2:1;67095:137:0::1;::::0;::::1;20072:21:1::0;20129:2;20109:18;;;20102:30;20168:34;20148:18;;;20141:62;-1:-1:-1;;;20219:18:1;;;20212:44;20273:19;;67095:137:0::1;20062:236:1::0;67095:137:0::1;67251:12;:29;67264:10;;67275:3;67264:15;;;;;-1:-1:-1::0;;;67264:15:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;67251:29:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;67251:29:0;;::::1;;:37;;:29:::0;:37:::1;67247:115;;;67341:5;67309:12;:29;67322:10;;67333:3;67322:15;;;;;-1:-1:-1::0;;;67322:15:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;67309:29:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;67309:29:0;:37;;-1:-1:-1;;67309:37:0::1;::::0;::::1;;::::0;;;::::1;::::0;;67247:115:::1;67073:5:::0;::::1;::::0;::::1;:::i;:::-;;;;67026:347;;47451:328:::0;47626:41;10003:10;47659:7;47626:18;:41::i;:::-;47618:103;;;;-1:-1:-1;;;47618:103:0;;;;;;;:::i;:::-;47732:39;47746:4;47752:2;47756:7;47765:5;47732:13;:39::i;63923:37::-;;;;;;;:::i;74786:723::-;49354:4;49378:16;;;:7;:16;;;;;;74904:13;;-1:-1:-1;;;;;49378:16:0;74935:113;;;;-1:-1:-1;;;74935:113:0;;26614:2:1;74935:113:0;;;26596:21:1;26653:2;26633:18;;;26626:30;26692:34;26672:18;;;26665:62;-1:-1:-1;;;26743:18:1;;;26736:45;26798:19;;74935:113:0;26586:237:1;74935:113:0;75063:8;;;;;;;75059:71;;75104:14;75097:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74786:723;;;:::o;75059:71::-;75142:28;75173:10;:8;:10::i;:::-;75142:41;;75245:1;75220:14;75214:28;:32;:287;;;;;;;;;;;;;;;;;75338:14;75379:18;:7;:16;:18::i;:::-;75424:13;75295:165;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;75214:287;75194:307;74786:723;-1:-1:-1;;;74786:723:0:o;69995:2300::-;1812:1;2410:7;;:19;;2402:63;;;;-1:-1:-1;;;2402:63:0;;30676:2:1;2402:63:0;;;30658:21:1;30715:2;30695:18;;;30688:30;30754:33;30734:18;;;30727:61;30805:18;;2402:63:0;30648:181:1;2402:63:0;1812:1;2543:7;:18;70074:51:::1;::::0;;::::1;::::0;::::1;::::0;;70112:13:::1;70074:51:::0;;;;;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;:35:::1;::::0;70196:34:::1;::::0;70223:7:::1;70196:34;:::i;:::-;70177:15;:53;70173:163;;-1:-1:-1::0;70268:1:0::1;70173:163;;;-1:-1:-1::0;70323:1:0::1;70173:163;70379:18;70368:7;:29;;70346:127;;;;-1:-1:-1::0;;;70346:127:0::1;;;;;;;:::i;:::-;70522:10;70506:27;::::0;;;:15:::1;:27;::::0;;;;;70547:18;;70506:37:::1;::::0;70536:7;;70506:37:::1;:::i;:::-;:59;;70484:157;;;;-1:-1:-1::0;;;70484:157:0::1;;;;;;;:::i;:::-;70687:10;70674:24;::::0;;;:12:::1;:24;::::0;;;;;::::1;;:32;;:24:::0;:32:::1;70652:116;;;::::0;-1:-1:-1;;;70652:116:0;;15325:2:1;70652:116:0::1;::::0;::::1;15307:21:1::0;15364:2;15344:18;;;15337:30;15403:34;15383:18;;;15376:62;-1:-1:-1;;;15454:18:1;;;15447:32;15496:19;;70652:116:0::1;15297:224:1::0;70652:116:0::1;70801:24:::0;;70779:140:::1;;;::::0;-1:-1:-1;;;70779:140:0;;22973:2:1;70779:140:0::1;::::0;::::1;22955:21:1::0;23012:2;22992:18;;;22985:30;23051:34;23031:18;;;23024:62;23122:32;23102:18;;;23095:60;23172:19;;70779:140:0::1;22945:252:1::0;70779:140:0::1;70971:24:::0;;70952:15:::1;:43;;70930:131;;;::::0;-1:-1:-1;;;70930:131:0;;29445:2:1;70930:131:0::1;::::0;::::1;29427:21:1::0;29484:2;29464:18;;;29457:30;29523:34;29503:18;;;29496:62;-1:-1:-1;;;29574:18:1;;;29567:36;29620:19;;70930:131:0::1;29417:228:1::0;70930:131:0::1;71157:23;::::0;::::1;::::0;71130:24;;:50:::1;::::0;71157:23;71130:50:::1;:::i;:::-;71094:15;:86;;71072:171;;;::::0;-1:-1:-1;;;71072:171:0;;22569:2:1;71072:171:0::1;::::0;::::1;22551:21:1::0;22608:2;22588:18;;;22581:30;22647:34;22627:18;;;22620:62;-1:-1:-1;;;22698:18:1;;;22691:33;22741:19;;71072:171:0::1;22541:225:1::0;71072:171:0::1;71298:16;;71287:7;71276:8;;:18;;;;:::i;:::-;:38;;71254:134;;;::::0;-1:-1:-1;;;71254:134:0;;31440:2:1;71254:134:0::1;::::0;::::1;31422:21:1::0;31479:2;31459:18;;;31452:30;31518:34;31498:18;;;31491:62;-1:-1:-1;;;31569:18:1;;;31562:44;31623:19;;71254:134:0::1;31412:236:1::0;71254:134:0::1;71443:9;;71432:7;71421:8;;:18;;;;:::i;:::-;:31;;71399:119;;;;-1:-1:-1::0;;;71399:119:0::1;;;;;;;:::i;:::-;71546:18;71618:9;71608:19:::0;::::1;;71586:119;;;;-1:-1:-1::0;;;71586:119:0::1;;;;;;;:::i;:::-;71725:6;::::0;::::1;::::0;::::1;;;71724:7;71716:57;;;;-1:-1:-1::0;;;71716:57:0::1;;;;;;;:::i;:::-;71784:18;::::0;71813:419:::1;71841:7;71835:3;:13;71813:419;;;71872:21;:9;6738:19:::0;;6756:1;6738:19;;;6649:127;71872:21:::1;71921:9;6619:14:::0;71908:32:::1;;71955:33;71965:10;71977;71955:9;:33::i;:::-;72049:10;72033:27;::::0;;;:15:::1;:27;::::0;;;;;:31:::1;::::0;72063:1:::1;72033:31;:::i;:::-;72019:10;72003:27;::::0;;;:15:::1;:27;::::0;;;;;;;:61;;;;72107:13:::1;:25:::0;;;;:29:::1;::::0;72135:1:::1;72107:29;:::i;:::-;72093:10;72079:25;::::0;;;:13:::1;:25;::::0;;;;:57;72162:8:::1;::::0;:12:::1;::::0;72173:1:::1;72162:12;:::i;:::-;72151:8;:23:::0;72204:12:::1;::::0;:16:::1;::::0;72219:1:::1;72204:16;:::i;:::-;72189:12;:31:::0;71850:5;::::1;::::0;::::1;:::i;:::-;;;;71813:419;;;-1:-1:-1::0;72247:40:0::1;::::0;;32431:25:1;;;32487:2;32472:18;;32465:34;;;72259:10:0::1;::::0;72247:40:::1;::::0;32404:18:1;72247:40:0::1;;;;;;;-1:-1:-1::0;;1768:1:0;2722:7;:22;-1:-1:-1;;;69995:2300:0:o;75517:151::-;11272:6;;-1:-1:-1;;;;;11272:6:0;10003:10;11419:23;11411:68;;;;-1:-1:-1;;;11411:68:0;;;;;;;:::i;:::-;75627:33;;::::1;::::0;:13:::1;::::0;:33:::1;::::0;::::1;::::0;::::1;:::i;75676:126::-:0;11272:6;;-1:-1:-1;;;;;11272:6:0;10003:10;11419:23;11411:68;;;;-1:-1:-1;;;11411:68:0;;;;;;;:::i;:::-;75762:32;;::::1;::::0;:14:::1;::::0;:32:::1;::::0;::::1;::::0;::::1;:::i;12108:201::-:0;11272:6;;-1:-1:-1;;;;;11272:6:0;10003:10;11419:23;11411:68;;;;-1:-1:-1;;;11411:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;12197:22:0;::::1;12189:73;;;::::0;-1:-1:-1;;;12189:73:0;;14154:2:1;12189:73:0::1;::::0;::::1;14136:21:1::0;14193:2;14173:18;;;14166:30;14232:34;14212:18;;;14205:62;-1:-1:-1;;;14283:18:1;;;14276:36;14329:19;;12189:73:0::1;14126:228:1::0;12189:73:0::1;12273:28;12292:8;12273:18;:28::i;:::-;12108:201:::0;:::o;74304:474::-;74354:7;;;74404:8;;;;:41;;;;;;-1:-1:-1;;;74404:41:0;;;;;;;;;;74400:85;;;-1:-1:-1;74472:1:0;74400:85;74511:22;74499:8;;;;:34;;;;;;-1:-1:-1;;;74499:34:0;;;;;;;;;;74495:78;;;-1:-1:-1;74560:1:0;74495:78;74599:19;74587:8;;;;:31;;;;;;-1:-1:-1;;;74587:31:0;;;;;;;;;;74583:75;;;-1:-1:-1;74645:1:0;74583:75;74684:22;74672:8;;;;:34;;;;;;-1:-1:-1;;;74672:34:0;;;;;;;;;;74668:78;;;-1:-1:-1;74733:1:0;74668:78;74763:7;74304:474;-1:-1:-1;74304:474:0:o;43531:305::-;43633:4;-1:-1:-1;;;;;;43670:40:0;;-1:-1:-1;;;43670:40:0;;:105;;-1:-1:-1;;;;;;;43727:48:0;;-1:-1:-1;;;43727:48:0;43670:105;:158;;;-1:-1:-1;;;;;;;;;;35336:40:0;;;43792:36;35227:157;53271:174;53346:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;53346:29:0;-1:-1:-1;;;;;53346:29:0;;;;;;;;:24;;53400:23;53346:24;53400:14;:23::i;:::-;-1:-1:-1;;;;;53391:46:0;;;;;;;;;;;53271:174;;:::o;31494:248::-;31704:12;;-1:-1:-1;;;;;31684:16:0;;31640:7;31684:16;;;:7;:16;;;;;;31640:7;;31719:15;;31668:32;;:13;:32;:::i;:::-;31667:49;;;;:::i;:::-;:67;;;;:::i;:::-;31660:74;31494:248;-1:-1:-1;;;;31494:248:0:o;14809:317::-;14924:6;14899:21;:31;;14891:73;;;;-1:-1:-1;;;14891:73:0;;18500:2:1;14891:73:0;;;18482:21:1;18539:2;18519:18;;;18512:30;18578:31;18558:18;;;18551:59;18627:18;;14891:73:0;18472:179:1;14891:73:0;14978:12;14996:9;-1:-1:-1;;;;;14996:14:0;15018:6;14996:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14977:52;;;15048:7;15040:78;;;;-1:-1:-1;;;15040:78:0;;17656:2:1;15040:78:0;;;17638:21:1;17695:2;17675:18;;;17668:30;17734:34;17714:18;;;17707:62;17805:28;17785:18;;;17778:56;17851:19;;15040:78:0;17628:248:1;49583:348:0;49676:4;49378:16;;;:7;:16;;;;;;-1:-1:-1;;;;;49378:16:0;49693:73;;;;-1:-1:-1;;;49693:73:0;;19265:2:1;49693:73:0;;;19247:21:1;19304:2;19284:18;;;19277:30;19343:34;19323:18;;;19316:62;-1:-1:-1;;;19394:18:1;;;19387:42;19446:19;;49693:73:0;19237:234:1;49693:73:0;49777:13;49793:23;49808:7;49793:14;:23::i;:::-;49777:39;;49846:5;-1:-1:-1;;;;;49835:16:0;:7;-1:-1:-1;;;;;49835:16:0;;:51;;;;49879:7;-1:-1:-1;;;;;49855:31:0;:20;49867:7;49855:11;:20::i;:::-;-1:-1:-1;;;;;49855:31:0;;49835:51;:87;;;-1:-1:-1;;;;;;46675:25:0;;;46651:4;46675:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;49827:96;49583:348;-1:-1:-1;;;;49583:348:0:o;52575:578::-;52734:4;-1:-1:-1;;;;;52707:31:0;:23;52722:7;52707:14;:23::i;:::-;-1:-1:-1;;;;;52707:31:0;;52699:85;;;;-1:-1:-1;;;52699:85:0;;25779:2:1;52699:85:0;;;25761:21:1;25818:2;25798:18;;;25791:30;25857:34;25837:18;;;25830:62;-1:-1:-1;;;25908:18:1;;;25901:39;25957:19;;52699:85:0;25751:231:1;52699:85:0;-1:-1:-1;;;;;52803:16:0;;52795:65;;;;-1:-1:-1;;;52795:65:0;;15728:2:1;52795:65:0;;;15710:21:1;15767:2;15747:18;;;15740:30;15806:34;15786:18;;;15779:62;-1:-1:-1;;;15857:18:1;;;15850:34;15901:19;;52795:65:0;15700:226:1;52795:65:0;52873:39;52894:4;52900:2;52904:7;52873:20;:39::i;:::-;52977:29;52994:1;52998:7;52977:8;:29::i;:::-;-1:-1:-1;;;;;53019:15:0;;;;;;:9;:15;;;;;:20;;53038:1;;53019:15;:20;;53038:1;;53019:20;:::i;:::-;;;;-1:-1:-1;;;;;;;53050:13:0;;;;;;:9;:13;;;;;:18;;53067:1;;53050:13;:18;;53067:1;;53050:18;:::i;:::-;;;;-1:-1:-1;;53079:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;53079:21:0;-1:-1:-1;;;;;53079:21:0;;;;;;;;;53118:27;;53079:16;;53118:27;;;;;;;52575:578;;;:::o;51878:360::-;51938:13;51954:23;51969:7;51954:14;:23::i;:::-;51938:39;;51990:48;52011:5;52026:1;52030:7;51990:20;:48::i;:::-;52079:29;52096:1;52100:7;52079:8;:29::i;:::-;-1:-1:-1;;;;;52121:16:0;;;;;;:9;:16;;;;;:21;;52141:1;;52121:16;:21;;52141:1;;52121:21;:::i;:::-;;;;-1:-1:-1;;52160:16:0;;;;:7;:16;;;;;;52153:23;;-1:-1:-1;;;;;;52153:23:0;;;52194:36;52168:7;;52160:16;-1:-1:-1;;;;;52194:36:0;;;;;52160:16;;52194:36;51878:360;;:::o;21515:211::-;21659:58;;;-1:-1:-1;;;;;10483:32:1;;21659:58:0;;;10465:51:1;10532:18;;;;10525:34;;;21659:58:0;;;;;;;;;;10438:18:1;;;;21659:58:0;;;;;;;;-1:-1:-1;;;;;21659:58:0;-1:-1:-1;;;21659:58:0;;;21632:86;;21652:5;;21632:19;:86::i;12469:191::-;12562:6;;;-1:-1:-1;;;;;12579:17:0;;;-1:-1:-1;;;;;;12579:17:0;;;;;;;12612:40;;12562:6;;;12579:17;12562:6;;12612:40;;12543:16;;12612:40;12469:191;;:::o;50273:110::-;50349:26;50359:2;50363:7;50349:26;;;;;;;;;;;;:9;:26::i;53587:315::-;53742:8;-1:-1:-1;;;;;53733:17:0;:5;-1:-1:-1;;;;;53733:17:0;;;53725:55;;;;-1:-1:-1;;;53725:55:0;;16133:2:1;53725:55:0;;;16115:21:1;16172:2;16152:18;;;16145:30;16211:27;16191:18;;;16184:55;16256:18;;53725:55:0;16105:175:1;53725:55:0;-1:-1:-1;;;;;53791:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;53791:46:0;;;;;;;;;;53853:41;;11482::1;;;53853::0;;11455:18:1;53853:41:0;;;;;;;53587:315;;;:::o;48661:::-;48818:28;48828:4;48834:2;48838:7;48818:9;:28::i;:::-;48865:48;48888:4;48894:2;48898:7;48907:5;48865:22;:48::i;:::-;48857:111;;;;-1:-1:-1;;;48857:111:0;;;;;;;:::i;66129:100::-;66181:13;66214:7;66207:14;;;;;:::i;7485:723::-;7541:13;7762:10;7758:53;;-1:-1:-1;;7789:10:0;;;;;;;;;;;;-1:-1:-1;;;7789:10:0;;;;;7485:723::o;7758:53::-;7836:5;7821:12;7877:78;7884:9;;7877:78;;7910:8;;;;:::i;:::-;;-1:-1:-1;7933:10:0;;-1:-1:-1;7941:2:0;7933:10;;:::i;:::-;;;7877:78;;;7965:19;7997:6;7987:17;;;;;;-1:-1:-1;;;7987:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7987:17:0;;7965:39;;8015:154;8022:10;;8015:154;;8049:11;8059:1;8049:11;;:::i;:::-;;-1:-1:-1;8118:10:0;8126:2;8118:5;:10;:::i;:::-;8105:24;;:2;:24;:::i;:::-;8092:39;;8075:6;8082;8075:14;;;;;;-1:-1:-1;;;8075:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;8075:56:0;;;;;;;;-1:-1:-1;8146:11:0;8155:2;8146:11;;:::i;:::-;;;8015:154;;58658:589;-1:-1:-1;;;;;58864:18:0;;58860:187;;58899:40;58931:7;60074:10;:17;;60047:24;;;;:15;:24;;;;;:44;;;60102:24;;;;;;;;;;;;59970:164;58899:40;58860:187;;;58969:2;-1:-1:-1;;;;;58961:10:0;:4;-1:-1:-1;;;;;58961:10:0;;58957:90;;58988:47;59021:4;59027:7;58988:32;:47::i;:::-;-1:-1:-1;;;;;59061:16:0;;59057:183;;59094:45;59131:7;59094:36;:45::i;59057:183::-;59167:4;-1:-1:-1;;;;;59161:10:0;:2;-1:-1:-1;;;;;59161:10:0;;59157:83;;59188:40;59216:2;59220:7;59188:27;:40::i;24088:716::-;24512:23;24538:69;24566:4;24538:69;;;;;;;;;;;;;;;;;24546:5;-1:-1:-1;;;;;24538:27:0;;;:69;;;;;:::i;:::-;24622:17;;24512:95;;-1:-1:-1;24622:21:0;24618:179;;24719:10;24708:30;;;;;;;;;;;;:::i;:::-;24700:85;;;;-1:-1:-1;;;24700:85:0;;29852:2:1;24700:85:0;;;29834:21:1;29891:2;29871:18;;;29864:30;29930:34;29910:18;;;29903:62;-1:-1:-1;;;29981:18:1;;;29974:40;30031:19;;24700:85:0;29824:232:1;50610:321:0;50740:18;50746:2;50750:7;50740:5;:18::i;:::-;50791:54;50822:1;50826:2;50830:7;50839:5;50791:22;:54::i;:::-;50769:154;;;;-1:-1:-1;;;50769:154:0;;;;;;;:::i;54467:799::-;54622:4;-1:-1:-1;;;;;54643:13:0;;13810:20;13858:8;54639:620;;54679:72;;-1:-1:-1;;;54679:72:0;;-1:-1:-1;;;;;54679:36:0;;;;;:72;;10003:10;;54730:4;;54736:7;;54745:5;;54679:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54679:72:0;;;;;;;;-1:-1:-1;;54679:72:0;;;;;;;;;;;;:::i;:::-;;;54675:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54921:13:0;;54917:272;;54964:60;;-1:-1:-1;;;54964:60:0;;;;;;;:::i;54917:272::-;55139:6;55133:13;55124:6;55120:2;55116:15;55109:38;54675:529;-1:-1:-1;;;;;;54802:51:0;-1:-1:-1;;;54802:51:0;;-1:-1:-1;54795:58:0;;54639:620;-1:-1:-1;55243:4:0;54467:799;;;;;;:::o;60761:988::-;61027:22;61077:1;61052:22;61069:4;61052:16;:22::i;:::-;:26;;;;:::i;:::-;61089:18;61110:26;;;:17;:26;;;;;;61027:51;;-1:-1:-1;61243:28:0;;;61239:328;;-1:-1:-1;;;;;61310:18:0;;61288:19;61310:18;;;:12;:18;;;;;;;;:34;;;;;;;;;61361:30;;;;;;:44;;;61478:30;;:17;:30;;;;;:43;;;61239:328;-1:-1:-1;61663:26:0;;;;:17;:26;;;;;;;;61656:33;;;-1:-1:-1;;;;;61707:18:0;;;;;:12;:18;;;;;:34;;;;;;;61700:41;60761:988::o;62044:1079::-;62322:10;:17;62297:22;;62322:21;;62342:1;;62322:21;:::i;:::-;62354:18;62375:24;;;:15;:24;;;;;;62748:10;:26;;62297:46;;-1:-1:-1;62375:24:0;;62297:46;;62748:26;;;;-1:-1:-1;;;62748:26:0;;;;;;;;;;;;;;;;;62726:48;;62812:11;62787:10;62798;62787:22;;;;;;-1:-1:-1;;;62787:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;62892:28;;;:15;:28;;;;;;;:41;;;63064:24;;;;;63057:31;63099:10;:16;;;;;-1:-1:-1;;;63099:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;62044:1079;;;;:::o;59548:221::-;59633:14;59650:20;59667:2;59650:16;:20::i;:::-;-1:-1:-1;;;;;59681:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;59726:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;59548:221:0:o;16293:229::-;16430:12;16462:52;16484:6;16492:4;16498:1;16501:12;16462:21;:52::i;51267:382::-;-1:-1:-1;;;;;51347:16:0;;51339:61;;;;-1:-1:-1;;;51339:61:0;;23821:2:1;51339:61:0;;;23803:21:1;;;23840:18;;;23833:30;23899:34;23879:18;;;23872:62;23951:18;;51339:61:0;23793:182:1;51339:61:0;49354:4;49378:16;;;:7;:16;;;;;;-1:-1:-1;;;;;49378:16:0;:30;51411:58;;;;-1:-1:-1;;;51411:58:0;;14561:2:1;51411:58:0;;;14543:21:1;14600:2;14580:18;;;14573:30;14639;14619:18;;;14612:58;14687:18;;51411:58:0;14533:178:1;51411:58:0;51482:45;51511:1;51515:2;51519:7;51482:20;:45::i;:::-;-1:-1:-1;;;;;51540:13:0;;;;;;:9;:13;;;;;:18;;51557:1;;51540:13;:18;;51557:1;;51540:18;:::i;:::-;;;;-1:-1:-1;;51569:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;51569:21:0;-1:-1:-1;;;;;51569:21:0;;;;;;;;51608:33;;51569:16;;;51608:33;;51569:16;;51608:33;51267:382;;:::o;17413:510::-;17583:12;17641:5;17616:21;:30;;17608:81;;;;-1:-1:-1;;;17608:81:0;;18858:2:1;17608:81:0;;;18840:21:1;18897:2;18877:18;;;18870:30;18936:34;18916:18;;;18909:62;-1:-1:-1;;;18987:18:1;;;18980:36;19033:19;;17608:81:0;18830:228:1;17608:81:0;13810:20;;17700:60;;;;-1:-1:-1;;;17700:60:0;;28262:2:1;17700:60:0;;;28244:21:1;28301:2;28281:18;;;28274:30;28340:31;28320:18;;;28313:59;28389:18;;17700:60:0;28234:179:1;17700:60:0;17774:12;17788:23;17815:6;-1:-1:-1;;;;;17815:11:0;17834:5;17841:4;17815:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17773:73;;;;17864:51;17881:7;17890:10;17902:12;17864:16;:51::i;:::-;17857:58;17413:510;-1:-1:-1;;;;;;;17413:510:0:o;20099:712::-;20249:12;20278:7;20274:530;;;-1:-1:-1;20309:10:0;20302:17;;20274:530;20423:17;;:21;20419:374;;20621:10;20615:17;20682:15;20669:10;20665:2;20661:19;20654:44;20569:148;20764:12;20757:20;;-1:-1:-1;;;20757:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:2;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:2;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:2;;;532:1;529;522:12;491:2;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;88:557;;;;;:::o;650:257::-;709:6;762:2;750:9;741:7;737:23;733:32;730:2;;;783:6;775;768:22;730:2;827:9;814:23;846:31;871:5;846:31;:::i;1182:398::-;1250:6;1258;1311:2;1299:9;1290:7;1286:23;1282:32;1279:2;;;1332:6;1324;1317:22;1279:2;1376:9;1363:23;1395:31;1420:5;1395:31;:::i;:::-;1445:5;-1:-1:-1;1502:2:1;1487:18;;1474:32;1515:33;1474:32;1515:33;:::i;:::-;1567:7;1557:17;;;1269:311;;;;;:::o;1585:466::-;1662:6;1670;1678;1731:2;1719:9;1710:7;1706:23;1702:32;1699:2;;;1752:6;1744;1737:22;1699:2;1796:9;1783:23;1815:31;1840:5;1815:31;:::i;:::-;1865:5;-1:-1:-1;1922:2:1;1907:18;;1894:32;1935:33;1894:32;1935:33;:::i;:::-;1689:362;;1987:7;;-1:-1:-1;;;2041:2:1;2026:18;;;;2013:32;;1689:362::o;2056:824::-;2151:6;2159;2167;2175;2228:3;2216:9;2207:7;2203:23;2199:33;2196:2;;;2250:6;2242;2235:22;2196:2;2294:9;2281:23;2313:31;2338:5;2313:31;:::i;:::-;2363:5;-1:-1:-1;2420:2:1;2405:18;;2392:32;2433:33;2392:32;2433:33;:::i;:::-;2485:7;-1:-1:-1;2539:2:1;2524:18;;2511:32;;-1:-1:-1;2594:2:1;2579:18;;2566:32;2621:18;2610:30;;2607:2;;;2658:6;2650;2643:22;2607:2;2686:22;;2739:4;2731:13;;2727:27;-1:-1:-1;2717:2:1;;2773:6;2765;2758:22;2717:2;2801:73;2866:7;2861:2;2848:16;2843:2;2839;2835:11;2801:73;:::i;:::-;2791:83;;;2186:694;;;;;;;:::o;2885:392::-;2950:6;2958;3011:2;2999:9;2990:7;2986:23;2982:32;2979:2;;;3032:6;3024;3017:22;2979:2;3076:9;3063:23;3095:31;3120:5;3095:31;:::i;:::-;3145:5;-1:-1:-1;3202:2:1;3187:18;;3174:32;3215:30;3174:32;3215:30;:::i;3282:325::-;3350:6;3358;3411:2;3399:9;3390:7;3386:23;3382:32;3379:2;;;3432:6;3424;3417:22;3379:2;3476:9;3463:23;3495:31;3520:5;3495:31;:::i;:::-;3545:5;3597:2;3582:18;;;;3569:32;;-1:-1:-1;;;3369:238:1:o;3612:665::-;3698:6;3706;3759:2;3747:9;3738:7;3734:23;3730:32;3727:2;;;3780:6;3772;3765:22;3727:2;3825:9;3812:23;3854:18;3895:2;3887:6;3884:14;3881:2;;;3916:6;3908;3901:22;3881:2;3959:6;3948:9;3944:22;3934:32;;4004:7;3997:4;3993:2;3989:13;3985:27;3975:2;;4031:6;4023;4016:22;3975:2;4076;4063:16;4102:2;4094:6;4091:14;4088:2;;;4123:6;4115;4108:22;4088:2;4181:7;4176:2;4166:6;4163:1;4159:14;4155:2;4151:23;4147:32;4144:45;4141:2;;;4207:6;4199;4192:22;4141:2;4243;4235:11;;;;;4265:6;;-1:-1:-1;3717:560:1;;-1:-1:-1;;;;3717:560:1:o;4282:251::-;4338:6;4391:2;4379:9;4370:7;4366:23;4362:32;4359:2;;;4412:6;4404;4397:22;4359:2;4456:9;4443:23;4475:28;4497:5;4475:28;:::i;4538:255::-;4605:6;4658:2;4646:9;4637:7;4633:23;4629:32;4626:2;;;4679:6;4671;4664:22;4626:2;4716:9;4710:16;4735:28;4757:5;4735:28;:::i;4798:255::-;4856:6;4909:2;4897:9;4888:7;4884:23;4880:32;4877:2;;;4930:6;4922;4915:22;4877:2;4974:9;4961:23;4993:30;5017:5;4993:30;:::i;5058:259::-;5127:6;5180:2;5168:9;5159:7;5155:23;5151:32;5148:2;;;5201:6;5193;5186:22;5148:2;5238:9;5232:16;5257:30;5281:5;5257:30;:::i;5598:412::-;5680:6;5688;5741:2;5729:9;5720:7;5716:23;5712:32;5709:2;;;5762:6;5754;5747:22;6015:642;6086:6;6094;6147:2;6135:9;6126:7;6122:23;6118:32;6115:2;;;6168:6;6160;6153:22;6115:2;6213:9;6200:23;6242:18;6283:2;6275:6;6272:14;6269:2;;;6304:6;6296;6289:22;6269:2;6347:6;6336:9;6332:22;6322:32;;6392:7;6385:4;6381:2;6377:13;6373:27;6363:2;;6419:6;6411;6404:22;6363:2;6464;6451:16;6490:2;6482:6;6479:14;6476:2;;;6511:6;6503;6496:22;6476:2;6561:7;6556:2;6547:6;6543:2;6539:15;6535:24;6532:37;6529:2;;;6587:6;6579;6572:22;6662:480;6731:6;6784:2;6772:9;6763:7;6759:23;6755:32;6752:2;;;6805:6;6797;6790:22;6752:2;6850:9;6837:23;6883:18;6875:6;6872:30;6869:2;;;6920:6;6912;6905:22;6869:2;6948:22;;7001:4;6993:13;;6989:27;-1:-1:-1;6979:2:1;;7035:6;7027;7020:22;6979:2;7063:73;7128:7;7123:2;7110:16;7105:2;7101;7097:11;7063:73;:::i;7147:190::-;7206:6;7259:2;7247:9;7238:7;7234:23;7230:32;7227:2;;;7280:6;7272;7265:22;7227:2;-1:-1:-1;7308:23:1;;7217:120;-1:-1:-1;7217:120:1:o;7342:194::-;7412:6;7465:2;7453:9;7444:7;7440:23;7436:32;7433:2;;;7486:6;7478;7471:22;7433:2;-1:-1:-1;7514:16:1;;7423:113;-1:-1:-1;7423:113:1:o;7541:257::-;7582:3;7620:5;7614:12;7647:6;7642:3;7635:19;7663:63;7719:6;7712:4;7707:3;7703:14;7696:4;7689:5;7685:16;7663:63;:::i;:::-;7780:2;7759:15;-1:-1:-1;;7755:29:1;7746:39;;;;7787:4;7742:50;;7590:208;-1:-1:-1;;7590:208:1:o;7803:242::-;7889:1;7882:5;7879:12;7869:2;;7934:10;7929:3;7925:20;7922:1;7915:31;7969:4;7966:1;7959:15;7997:4;7994:1;7987:15;7869:2;8021:18;;7859:186::o;8050:274::-;8179:3;8217:6;8211:13;8233:53;8279:6;8274:3;8267:4;8259:6;8255:17;8233:53;:::i;:::-;8302:16;;;;;8187:137;-1:-1:-1;;8187:137:1:o;8329:1531::-;8553:3;8591:6;8585:13;8617:4;8630:51;8674:6;8669:3;8664:2;8656:6;8652:15;8630:51;:::i;:::-;8744:13;;8703:16;;;;8766:55;8744:13;8703:16;8788:15;;;8766:55;:::i;:::-;8912:13;;8843:20;;;8883:3;;8972:1;8994:18;;;;9047;;;;9074:2;;9152:4;9142:8;9138:19;9126:31;;9074:2;9215;9205:8;9202:16;9182:18;9179:40;9176:2;;;-1:-1:-1;;;9242:33:1;;9298:4;9295:1;9288:15;9328:4;9249:3;9316:17;9176:2;9359:18;9386:110;;;;9510:1;9505:330;;;;9352:483;;9386:110;-1:-1:-1;;9421:24:1;;9407:39;;9466:20;;;;-1:-1:-1;9386:110:1;;9505:330;32881:4;32900:17;;;32950:4;32934:21;;9600:3;9616:169;9630:8;9627:1;9624:15;9616:169;;;9712:14;;9697:13;;;9690:37;9755:16;;;;9647:10;;9616:169;;;9620:3;;9816:8;9809:5;9805:20;9798:27;;9352:483;-1:-1:-1;9851:3:1;;8561:1299;-1:-1:-1;;;;;;;;;;;8561:1299:1:o;10570:488::-;-1:-1:-1;;;;;10839:15:1;;;10821:34;;10891:15;;10886:2;10871:18;;10864:43;10938:2;10923:18;;10916:34;;;10986:3;10981:2;10966:18;;10959:31;;;10764:4;;11007:45;;11032:19;;11024:6;11007:45;:::i;:::-;10999:53;10773:285;-1:-1:-1;;;;;;10773:285:1:o;11534:218::-;11685:2;11670:18;;11697:49;11674:9;11728:6;11697:49;:::i;11757:330::-;11953:2;11938:18;;11965:49;11942:9;11996:6;11965:49;:::i;:::-;12023:58;12077:2;12066:9;12062:18;12054:6;12023:58;:::i;12092:393::-;12251:2;12240:9;12233:21;12290:6;12285:2;12274:9;12270:18;12263:34;12347:6;12339;12334:2;12323:9;12319:18;12306:48;12214:4;12374:22;;;12398:2;12370:31;;;12363:45;;;;12469:2;12448:15;;;-1:-1:-1;;12444:29:1;12429:45;12425:54;;12223:262;-1:-1:-1;12223:262:1:o;12490:219::-;12639:2;12628:9;12621:21;12602:4;12659:44;12699:2;12688:9;12684:18;12676:6;12659:44;:::i;12714:402::-;12916:2;12898:21;;;12955:2;12935:18;;;12928:30;12994:34;12989:2;12974:18;;12967:62;-1:-1:-1;;;13060:2:1;13045:18;;13038:36;13106:3;13091:19;;12888:228::o;13533:414::-;13735:2;13717:21;;;13774:2;13754:18;;;13747:30;13813:34;13808:2;13793:18;;13786:62;-1:-1:-1;;;13879:2:1;13864:18;;13857:48;13937:3;13922:19;;13707:240::o;14716:402::-;14918:2;14900:21;;;14957:2;14937:18;;;14930:30;14996:34;14991:2;14976:18;;14969:62;-1:-1:-1;;;15062:2:1;15047:18;;15040:36;15108:3;15093:19;;14890:228::o;16285:401::-;16487:2;16469:21;;;16526:2;16506:18;;;16499:30;16565:34;16560:2;16545:18;;16538:62;-1:-1:-1;;;16631:2:1;16616:18;;16609:35;16676:3;16661:19;;16459:227::o;17881:412::-;18083:2;18065:21;;;18122:2;18102:18;;;18095:30;18161:34;18156:2;18141:18;;18134:62;-1:-1:-1;;;18227:2:1;18212:18;;18205:46;18283:3;18268:19;;18055:238::o;19476:407::-;19678:2;19660:21;;;19717:2;19697:18;;;19690:30;19756:34;19751:2;19736:18;;19729:62;-1:-1:-1;;;19822:2:1;19807:18;;19800:41;19873:3;19858:19;;19650:233::o;20303:407::-;20505:2;20487:21;;;20544:2;20524:18;;;20517:30;20583:34;20578:2;20563:18;;20556:62;-1:-1:-1;;;20649:2:1;20634:18;;20627:41;20700:3;20685:19;;20477:233::o;23980:414::-;24182:2;24164:21;;;24221:2;24201:18;;;24194:30;24260:34;24255:2;24240:18;;24233:62;-1:-1:-1;;;24326:2:1;24311:18;;24304:48;24384:3;24369:19;;24154:240::o;24812:356::-;25014:2;24996:21;;;25033:18;;;25026:30;25092:34;25087:2;25072:18;;25065:62;25159:2;25144:18;;24986:182::o;27642:413::-;27844:2;27826:21;;;27883:2;27863:18;;;27856:30;27922:34;27917:2;27902:18;;27895:62;-1:-1:-1;;;27988:2:1;27973:18;;27966:47;28045:3;28030:19;;27816:239::o;32966:128::-;33006:3;33037:1;33033:6;33030:1;33027:13;33024:2;;;33043:18;;:::i;:::-;-1:-1:-1;33079:9:1;;33014:80::o;33099:120::-;33139:1;33165;33155:2;;33170:18;;:::i;:::-;-1:-1:-1;33204:9:1;;33145:74::o;33224:168::-;33264:7;33330:1;33326;33322:6;33318:14;33315:1;33312:21;33307:1;33300:9;33293:17;33289:45;33286:2;;;33337:18;;:::i;:::-;-1:-1:-1;33377:9:1;;33276:116::o;33397:125::-;33437:4;33465:1;33462;33459:8;33456:2;;;33470:18;;:::i;:::-;-1:-1:-1;33507:9:1;;33446:76::o;33527:258::-;33599:1;33609:113;33623:6;33620:1;33617:13;33609:113;;;33699:11;;;33693:18;33680:11;;;33673:39;33645:2;33638:10;33609:113;;;33740:6;33737:1;33734:13;33731:2;;;-1:-1:-1;;33775:1:1;33757:16;;33750:27;33580:205::o;33790:380::-;33869:1;33865:12;;;;33912;;;33933:2;;33987:4;33979:6;33975:17;33965:27;;33933:2;34040;34032:6;34029:14;34009:18;34006:38;34003:2;;;34086:10;34081:3;34077:20;34074:1;34067:31;34121:4;34118:1;34111:15;34149:4;34146:1;34139:15;34003:2;;33845:325;;;:::o;34175:135::-;34214:3;-1:-1:-1;;34235:17:1;;34232:2;;;34255:18;;:::i;:::-;-1:-1:-1;34302:1:1;34291:13;;34222:88::o;34315:112::-;34347:1;34373;34363:2;;34378:18;;:::i;:::-;-1:-1:-1;34412:9:1;;34353:74::o;34432:127::-;34493:10;34488:3;34484:20;34481:1;34474:31;34524:4;34521:1;34514:15;34548:4;34545:1;34538:15;34564:127;34625:10;34620:3;34616:20;34613:1;34606:31;34656:4;34653:1;34646:15;34680:4;34677:1;34670:15;34696:127;34757:10;34752:3;34748:20;34745:1;34738:31;34788:4;34785:1;34778:15;34812:4;34809:1;34802:15;34828:131;-1:-1:-1;;;;;34903:31:1;;34893:42;;34883:2;;34949:1;34946;34939:12;34964:118;35050:5;35043:13;35036:21;35029:5;35026:32;35016:2;;35072:1;35069;35062:12;35087:131;-1:-1:-1;;;;;;35161:32:1;;35151:43;;35141:2;;35208:1;35205;35198:12
Swarm Source
ipfs://9c6c15ecf867581070ea4c81df2496d65888a6674d206fb209a206d3b8ab1b4c
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.