Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 59 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Set Approval For... | 16126269 | 1196 days ago | IN | 0 ETH | 0.00163634 | ||||
| Transfer From | 15112815 | 1346 days ago | IN | 0 ETH | 0.0004763 | ||||
| Transfer From | 15112814 | 1346 days ago | IN | 0 ETH | 0.0006776 | ||||
| Transfer From | 15112811 | 1346 days ago | IN | 0 ETH | 0.0005669 | ||||
| Transfer From | 15112810 | 1346 days ago | IN | 0 ETH | 0.00052332 | ||||
| Transfer From | 15112810 | 1346 days ago | IN | 0 ETH | 0.00065162 | ||||
| Set Approval For... | 14568781 | 1435 days ago | IN | 0 ETH | 0.00173043 | ||||
| Set Unrevealed U... | 14559995 | 1436 days ago | IN | 0 ETH | 0.00208855 | ||||
| Set Unrevealed U... | 14559994 | 1436 days ago | IN | 0 ETH | 0.00293556 | ||||
| Safe Transfer Fr... | 14403220 | 1461 days ago | IN | 0 ETH | 0.00112039 | ||||
| Safe Transfer Fr... | 14403191 | 1461 days ago | IN | 0 ETH | 0.00156848 | ||||
| Safe Transfer Fr... | 14403184 | 1461 days ago | IN | 0 ETH | 0.00166595 | ||||
| Safe Transfer Fr... | 14403184 | 1461 days ago | IN | 0 ETH | 0.00166595 | ||||
| Safe Transfer Fr... | 14403184 | 1461 days ago | IN | 0 ETH | 0.00166595 | ||||
| Transfer From | 14403167 | 1461 days ago | IN | 0 ETH | 0.00111649 | ||||
| Transfer From | 14403166 | 1461 days ago | IN | 0 ETH | 0.00207725 | ||||
| Transfer From | 14403165 | 1461 days ago | IN | 0 ETH | 0.00154942 | ||||
| Withdraw | 14395922 | 1462 days ago | IN | 0 ETH | 0.00292795 | ||||
| Set Investor Amo... | 14395917 | 1462 days ago | IN | 0 ETH | 0.00393618 | ||||
| Transfer From | 14393814 | 1462 days ago | IN | 0 ETH | 0.00638754 | ||||
| End WL Sale | 14393808 | 1462 days ago | IN | 0 ETH | 0.00165388 | ||||
| Mint WL1 | 14393797 | 1462 days ago | IN | 0.5 ETH | 0.01058561 | ||||
| Mint WL1 | 14393796 | 1462 days ago | IN | 0.5 ETH | 0.00843962 | ||||
| Mint WL1 | 14393762 | 1462 days ago | IN | 0.3 ETH | 0.00608783 | ||||
| Mint WL1 | 14393738 | 1462 days ago | IN | 0.5 ETH | 0.00848019 |
Latest 12 internal transactions
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| - | 14395922 | 1462 days ago | 6.65 ETH | ||||
| - | 14395922 | 1462 days ago | 6.65 ETH | ||||
| - | 14393762 | 1462 days ago | 40 wei | ||||
| - | 14393667 | 1462 days ago | 40 wei | ||||
| - | 14393665 | 1462 days ago | 40 wei | ||||
| - | 14393654 | 1462 days ago | 40 wei | ||||
| - | 14393640 | 1462 days ago | 40 wei | ||||
| - | 14393624 | 1462 days ago | 40 wei | ||||
| - | 14393615 | 1462 days ago | 40 wei | ||||
| - | 14393612 | 1462 days ago | 40 wei | ||||
| - | 14393611 | 1462 days ago | 40 wei | ||||
| - | 14393602 | 1462 days ago | 40 wei |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
DopeHeadsNFT
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2022-03-15
*/
// File: @openzeppelin/contracts/security/ReentrancyGuard.sol
// OpenZeppelin Contracts v4.4.1 (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/utils/Strings.sol
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
}
// File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol
// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/ECDSA.sol)
pragma solidity ^0.8.0;
/**
* @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
*
* These functions can be used to verify that a message was signed by the holder
* of the private keys of a given address.
*/
library ECDSA {
enum RecoverError {
NoError,
InvalidSignature,
InvalidSignatureLength,
InvalidSignatureS,
InvalidSignatureV
}
function _throwError(RecoverError error) private pure {
if (error == RecoverError.NoError) {
return; // no error: do nothing
} else if (error == RecoverError.InvalidSignature) {
revert("ECDSA: invalid signature");
} else if (error == RecoverError.InvalidSignatureLength) {
revert("ECDSA: invalid signature length");
} else if (error == RecoverError.InvalidSignatureS) {
revert("ECDSA: invalid signature 's' value");
} else if (error == RecoverError.InvalidSignatureV) {
revert("ECDSA: invalid signature 'v' value");
}
}
/**
* @dev Returns the address that signed a hashed message (`hash`) with
* `signature` or error string. This address can then be used for verification purposes.
*
* The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
* this function rejects them by requiring the `s` value to be in the lower
* half order, and the `v` value to be either 27 or 28.
*
* IMPORTANT: `hash` _must_ be the result of a hash operation for the
* verification to be secure: it is possible to craft signatures that
* recover to arbitrary addresses for non-hashed data. A safe way to ensure
* this is by receiving a hash of the original message (which may otherwise
* be too long), and then calling {toEthSignedMessageHash} on it.
*
* Documentation for signature generation:
* - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
* - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
*
* _Available since v4.3._
*/
function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
// Check the signature length
// - case 65: r,s,v signature (standard)
// - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
if (signature.length == 65) {
bytes32 r;
bytes32 s;
uint8 v;
// ecrecover takes the signature parameters, and the only way to get them
// currently is to use assembly.
assembly {
r := mload(add(signature, 0x20))
s := mload(add(signature, 0x40))
v := byte(0, mload(add(signature, 0x60)))
}
return tryRecover(hash, v, r, s);
} else if (signature.length == 64) {
bytes32 r;
bytes32 vs;
// ecrecover takes the signature parameters, and the only way to get them
// currently is to use assembly.
assembly {
r := mload(add(signature, 0x20))
vs := mload(add(signature, 0x40))
}
return tryRecover(hash, r, vs);
} else {
return (address(0), RecoverError.InvalidSignatureLength);
}
}
/**
* @dev Returns the address that signed a hashed message (`hash`) with
* `signature`. This address can then be used for verification purposes.
*
* The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
* this function rejects them by requiring the `s` value to be in the lower
* half order, and the `v` value to be either 27 or 28.
*
* IMPORTANT: `hash` _must_ be the result of a hash operation for the
* verification to be secure: it is possible to craft signatures that
* recover to arbitrary addresses for non-hashed data. A safe way to ensure
* this is by receiving a hash of the original message (which may otherwise
* be too long), and then calling {toEthSignedMessageHash} on it.
*/
function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
(address recovered, RecoverError error) = tryRecover(hash, signature);
_throwError(error);
return recovered;
}
/**
* @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
*
* See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
*
* _Available since v4.3._
*/
function tryRecover(
bytes32 hash,
bytes32 r,
bytes32 vs
) internal pure returns (address, RecoverError) {
bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
uint8 v = uint8((uint256(vs) >> 255) + 27);
return tryRecover(hash, v, r, s);
}
/**
* @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
*
* _Available since v4.2._
*/
function recover(
bytes32 hash,
bytes32 r,
bytes32 vs
) internal pure returns (address) {
(address recovered, RecoverError error) = tryRecover(hash, r, vs);
_throwError(error);
return recovered;
}
/**
* @dev Overload of {ECDSA-tryRecover} that receives the `v`,
* `r` and `s` signature fields separately.
*
* _Available since v4.3._
*/
function tryRecover(
bytes32 hash,
uint8 v,
bytes32 r,
bytes32 s
) internal pure returns (address, RecoverError) {
// EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
// unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
// the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
// signatures from current libraries generate a unique signature with an s-value in the lower half order.
//
// If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
// with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
// vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
// these malleable signatures as well.
if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
return (address(0), RecoverError.InvalidSignatureS);
}
if (v != 27 && v != 28) {
return (address(0), RecoverError.InvalidSignatureV);
}
// If the signature is valid (and not malleable), return the signer address
address signer = ecrecover(hash, v, r, s);
if (signer == address(0)) {
return (address(0), RecoverError.InvalidSignature);
}
return (signer, RecoverError.NoError);
}
/**
* @dev Overload of {ECDSA-recover} that receives the `v`,
* `r` and `s` signature fields separately.
*/
function recover(
bytes32 hash,
uint8 v,
bytes32 r,
bytes32 s
) internal pure returns (address) {
(address recovered, RecoverError error) = tryRecover(hash, v, r, s);
_throwError(error);
return recovered;
}
/**
* @dev Returns an Ethereum Signed Message, created from a `hash`. This
* produces hash corresponding to the one signed with the
* https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
* JSON-RPC method as part of EIP-191.
*
* See {recover}.
*/
function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
// 32 is the length in bytes of hash,
// enforced by the type signature above
return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
}
/**
* @dev Returns an Ethereum Signed Message, created from `s`. This
* produces hash corresponding to the one signed with the
* https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
* JSON-RPC method as part of EIP-191.
*
* See {recover}.
*/
function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
}
/**
* @dev Returns an Ethereum Signed Typed Data, created from a
* `domainSeparator` and a `structHash`. This produces hash corresponding
* to the one signed with the
* https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
* JSON-RPC method as part of EIP-712.
*
* See {recover}.
*/
function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
}
}
// File: @openzeppelin/contracts/utils/Context.sol
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
// File: @openzeppelin/contracts/access/Ownable.sol
// OpenZeppelin Contracts v4.4.1 (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 (last updated v4.5.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)
pragma solidity ^0.8.0;
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721Receiver {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
*
* The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
// File: @openzeppelin/contracts/utils/introspection/IERC165.sol
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// File: @openzeppelin/contracts/utils/introspection/ERC165.sol
// OpenZeppelin Contracts v4.4.1 (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.1 (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 (last updated v4.5.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);
/**
* @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.1 (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: erc721a/contracts/ERC721A.sol
// Creator: Chiru Labs
pragma solidity ^0.8.4;
error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintedQueryForZeroAddress();
error BurnedQueryForZeroAddress();
error AuxQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerIndexOutOfBounds();
error OwnerQueryForNonexistentToken();
error TokenIndexOutOfBounds();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();
/**
* @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
* the Metadata extension. Built to optimize for lower gas during batch mints.
*
* Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
*
* Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
*
* Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
*/
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
using Address for address;
using Strings for uint256;
// Compiler will pack this into a single 256bit word.
struct TokenOwnership {
// The address of the owner.
address addr;
// Keeps track of the start time of ownership with minimal overhead for tokenomics.
uint64 startTimestamp;
// Whether the token has been burned.
bool burned;
}
// Compiler will pack this into a single 256bit word.
struct AddressData {
// Realistically, 2**64-1 is more than enough.
uint64 balance;
// Keeps track of mint count with minimal overhead for tokenomics.
uint64 numberMinted;
// Keeps track of burn count with minimal overhead for tokenomics.
uint64 numberBurned;
// For miscellaneous variable(s) pertaining to the address
// (e.g. number of whitelist mint slots used).
// If there are multiple variables, please pack them into a uint64.
uint64 aux;
}
// The tokenId of the next token to be minted.
uint256 internal _currentIndex;
// The number of tokens burned.
uint256 internal _burnCounter;
// Token name
string private _name;
// Token symbol
string private _symbol;
// Mapping from token ID to ownership details
// An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
mapping(uint256 => TokenOwnership) internal _ownerships;
// Mapping owner address to address data
mapping(address => AddressData) private _addressData;
// 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;
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
_currentIndex = _startTokenId();
}
/**
* To change the starting tokenId, please override this function.
*/
function _startTokenId() internal view virtual returns (uint256) {
return 0;
}
/**
* @dev See {IERC721Enumerable-totalSupply}.
* @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
*/
function totalSupply() public view returns (uint256) {
// Counter underflow is impossible as _burnCounter cannot be incremented
// more than _currentIndex - _startTokenId() times
unchecked {
return _currentIndex - _burnCounter - _startTokenId();
}
}
/**
* Returns the total amount of tokens minted in the contract.
*/
function _totalMinted() internal view returns (uint256) {
// Counter underflow is impossible as _currentIndex does not decrement,
// and it is initialized to _startTokenId()
unchecked {
return _currentIndex - _startTokenId();
}
}
/**
* @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 override returns (uint256) {
if (owner == address(0)) revert BalanceQueryForZeroAddress();
return uint256(_addressData[owner].balance);
}
/**
* Returns the number of tokens minted by `owner`.
*/
function _numberMinted(address owner) internal view returns (uint256) {
if (owner == address(0)) revert MintedQueryForZeroAddress();
return uint256(_addressData[owner].numberMinted);
}
/**
* Returns the number of tokens burned by or on behalf of `owner`.
*/
function _numberBurned(address owner) internal view returns (uint256) {
if (owner == address(0)) revert BurnedQueryForZeroAddress();
return uint256(_addressData[owner].numberBurned);
}
/**
* Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
*/
function _getAux(address owner) internal view returns (uint64) {
if (owner == address(0)) revert AuxQueryForZeroAddress();
return _addressData[owner].aux;
}
/**
* Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
* If there are multiple variables, please pack them into a uint64.
*/
function _setAux(address owner, uint64 aux) internal {
if (owner == address(0)) revert AuxQueryForZeroAddress();
_addressData[owner].aux = aux;
}
/**
* Gas spent here starts off proportional to the maximum mint batch size.
* It gradually moves to O(1) as tokens get transferred around in the collection over time.
*/
function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
uint256 curr = tokenId;
unchecked {
if (_startTokenId() <= curr && curr < _currentIndex) {
TokenOwnership memory ownership = _ownerships[curr];
if (!ownership.burned) {
if (ownership.addr != address(0)) {
return ownership;
}
// Invariant:
// There will always be an ownership that has an address and is not burned
// before an ownership that does not have an address and is not burned.
// Hence, curr will not underflow.
while (true) {
curr--;
ownership = _ownerships[curr];
if (ownership.addr != address(0)) {
return ownership;
}
}
}
}
}
revert OwnerQueryForNonexistentToken();
}
/**
* @dev See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId) public view override returns (address) {
return ownershipOf(tokenId).addr;
}
/**
* @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) {
if (!_exists(tokenId)) revert URIQueryForNonexistentToken();
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 override {
address owner = ERC721A.ownerOf(tokenId);
if (to == owner) revert ApprovalToCurrentOwner();
if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
revert ApprovalCallerNotOwnerNorApproved();
}
_approve(to, tokenId, owner);
}
/**
* @dev See {IERC721-getApproved}.
*/
function getApproved(uint256 tokenId) public view override returns (address) {
if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();
return _tokenApprovals[tokenId];
}
/**
* @dev See {IERC721-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public override {
if (operator == _msgSender()) revert ApproveToCaller();
_operatorApprovals[_msgSender()][operator] = approved;
emit ApprovalForAll(_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 {
_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 {
_transfer(from, to, tokenId);
if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
revert TransferToNonERC721ReceiverImplementer();
}
}
/**
* @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`),
*/
function _exists(uint256 tokenId) internal view returns (bool) {
return _startTokenId() <= tokenId && tokenId < _currentIndex &&
!_ownerships[tokenId].burned;
}
function _safeMint(address to, uint256 quantity) internal {
_safeMint(to, quantity, '');
}
/**
* @dev Safely mints `quantity` tokens and transfers them to `to`.
*
* Requirements:
*
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
* - `quantity` must be greater than 0.
*
* Emits a {Transfer} event.
*/
function _safeMint(
address to,
uint256 quantity,
bytes memory _data
) internal {
_mint(to, quantity, _data, true);
}
/**
* @dev Mints `quantity` tokens and transfers them to `to`.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `quantity` must be greater than 0.
*
* Emits a {Transfer} event.
*/
function _mint(
address to,
uint256 quantity,
bytes memory _data,
bool safe
) internal {
uint256 startTokenId = _currentIndex;
if (to == address(0)) revert MintToZeroAddress();
if (quantity == 0) revert MintZeroQuantity();
_beforeTokenTransfers(address(0), to, startTokenId, quantity);
// Overflows are incredibly unrealistic.
// balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
// updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
unchecked {
_addressData[to].balance += uint64(quantity);
_addressData[to].numberMinted += uint64(quantity);
_ownerships[startTokenId].addr = to;
_ownerships[startTokenId].startTimestamp = uint64(block.timestamp);
uint256 updatedIndex = startTokenId;
uint256 end = updatedIndex + quantity;
if (safe && to.isContract()) {
do {
emit Transfer(address(0), to, updatedIndex);
if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
revert TransferToNonERC721ReceiverImplementer();
}
} while (updatedIndex != end);
// Reentrancy protection
if (_currentIndex != startTokenId) revert();
} else {
do {
emit Transfer(address(0), to, updatedIndex++);
} while (updatedIndex != end);
}
_currentIndex = updatedIndex;
}
_afterTokenTransfers(address(0), to, startTokenId, quantity);
}
/**
* @dev Transfers `tokenId` from `from` to `to`.
*
* 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
) private {
TokenOwnership memory prevOwnership = ownershipOf(tokenId);
bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
isApprovedForAll(prevOwnership.addr, _msgSender()) ||
getApproved(tokenId) == _msgSender());
if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
if (to == address(0)) revert TransferToZeroAddress();
_beforeTokenTransfers(from, to, tokenId, 1);
// Clear approvals from the previous owner
_approve(address(0), tokenId, prevOwnership.addr);
// Underflow of the sender's balance is impossible because we check for
// ownership above and the recipient's balance can't realistically overflow.
// Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
unchecked {
_addressData[from].balance -= 1;
_addressData[to].balance += 1;
_ownerships[tokenId].addr = to;
_ownerships[tokenId].startTimestamp = uint64(block.timestamp);
// If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
// Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
uint256 nextTokenId = tokenId + 1;
if (_ownerships[nextTokenId].addr == address(0)) {
// This will suffice for checking _exists(nextTokenId),
// as a burned slot cannot contain the zero address.
if (nextTokenId < _currentIndex) {
_ownerships[nextTokenId].addr = prevOwnership.addr;
_ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
}
}
}
emit Transfer(from, to, tokenId);
_afterTokenTransfers(from, to, tokenId, 1);
}
/**
* @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 {
TokenOwnership memory prevOwnership = ownershipOf(tokenId);
_beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);
// Clear approvals from the previous owner
_approve(address(0), tokenId, prevOwnership.addr);
// Underflow of the sender's balance is impossible because we check for
// ownership above and the recipient's balance can't realistically overflow.
// Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
unchecked {
_addressData[prevOwnership.addr].balance -= 1;
_addressData[prevOwnership.addr].numberBurned += 1;
// Keep track of who burned the token, and the timestamp of burning.
_ownerships[tokenId].addr = prevOwnership.addr;
_ownerships[tokenId].startTimestamp = uint64(block.timestamp);
_ownerships[tokenId].burned = true;
// If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
// Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
uint256 nextTokenId = tokenId + 1;
if (_ownerships[nextTokenId].addr == address(0)) {
// This will suffice for checking _exists(nextTokenId),
// as a burned slot cannot contain the zero address.
if (nextTokenId < _currentIndex) {
_ownerships[nextTokenId].addr = prevOwnership.addr;
_ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
}
}
}
emit Transfer(prevOwnership.addr, address(0), tokenId);
_afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);
// Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
unchecked {
_burnCounter++;
}
}
/**
* @dev Approve `to` to operate on `tokenId`
*
* Emits a {Approval} event.
*/
function _approve(
address to,
uint256 tokenId,
address owner
) private {
_tokenApprovals[tokenId] = to;
emit Approval(owner, to, tokenId);
}
/**
* @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
address from,
address to,
uint256 tokenId,
bytes memory _data
) private returns (bool) {
try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
return retval == IERC721Receiver(to).onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert TransferToNonERC721ReceiverImplementer();
} else {
assembly {
revert(add(32, reason), mload(reason))
}
}
}
}
/**
* @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
* And also called before burning one token.
*
* startTokenId - the first token id to be transferred
* quantity - the amount to be transferred
*
* 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, `tokenId` will be burned by `from`.
* - `from` and `to` are never both zero.
*/
function _beforeTokenTransfers(
address from,
address to,
uint256 startTokenId,
uint256 quantity
) internal virtual {}
/**
* @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
* minting.
* And also called after one token has been burned.
*
* startTokenId - the first token id to be transferred
* quantity - the amount to be transferred
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
* transferred to `to`.
* - When `from` is zero, `tokenId` has been minted for `to`.
* - When `to` is zero, `tokenId` has been burned by `from`.
* - `from` and `to` are never both zero.
*/
function _afterTokenTransfers(
address from,
address to,
uint256 startTokenId,
uint256 quantity
) internal virtual {}
}
// File: contracts/DopeHeadsNFT.sol
pragma solidity ^0.8.4;
contract RewardDistributor is Ownable {
address[] public investors;
uint256[] public investorAmounts;
receive() external payable {}
function setInvestors(address[] calldata _investors) external onlyOwner {
delete investors;
investors = _investors;
}
function setInvestorAmounts(uint32[] calldata _amounts) external onlyOwner {
require(
_amounts.length == investors.length,
"The numbers doesn't match with the investors"
);
uint256 sum = 0;
for (uint256 i = 0; i < _amounts.length; i++) {
sum += _amounts[i];
}
require(sum == 10000, "The sum of the numbers must be 10000");
delete investorAmounts;
investorAmounts = _amounts;
}
function withdraw() public onlyOwner {
require(investorAmounts.length > 0, "No investors specified");
uint256 bal = address(this).balance;
for (uint256 i = 0; i < investors.length; i++) {
if (investorAmounts[i] > 0) {
Address.sendValue(
payable(investors[i]),
(bal * investorAmounts[i]) / 10000
);
}
}
}
}
contract Whitelist is Ownable {
using ECDSA for bytes32;
address signer1;
address signer2;
function setSigners(address _signer1, address _signer2) external onlyOwner {
signer1 = _signer1;
signer2 = _signer2;
}
function getRecoverAddress(bytes calldata signature)
internal
view
returns (address)
{
bytes32 hash = keccak256(abi.encodePacked(this, msg.sender));
hash = keccak256(
abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)
);
return hash.recover(signature);
}
modifier onlyWhitelist1(bytes calldata signature) {
require(signer1 != address(0), "Signer 1 Not Set");
require(getRecoverAddress(signature) == signer1, "Not Whitelisted 1");
_;
}
modifier onlyWhitelist2(bytes calldata signature) {
require(signer2 != address(0), "Signer 2 Not Set");
require(getRecoverAddress(signature) == signer2, "Not Whitelisted 2");
_;
}
}
contract DopeHeadsNFT is
ERC721A("DopeHeadsNFT", "DH4L"),
Whitelist,
RewardDistributor
{
uint256 public price = 0.15 ether;
uint256 public priceWL1 = 0.1 ether;
uint256 public priceWL2 = 0.125 ether;
uint256 public limitPerAddress = 5;
uint256 private _currentId = 0;
uint256 public immutable LOCK_7d = 7 days;
uint256 public immutable LOCK_6mo = 183 days;
uint256 public immutable LOCK_12mo = 365 days;
uint256 public maxSupply = 10000;
mapping(uint256 => uint256) private _tokenUnlockTime;
mapping(uint256 => uint256) private tokenToArt;
string public unrevealedURI;
string public baseURI;
string public baseExtension;
bool public saleOpen;
bool public saleWLOpen;
function setPrices(
uint256 _price,
uint256 _priceWL1,
uint256 _priceWL2
) external onlyOwner {
price = _price;
priceWL1 = _priceWL1;
priceWL2 = _priceWL2;
}
function setUnrevealedURI(string memory _uri) external onlyOwner {
unrevealedURI = _uri;
}
function setBaseURI(string memory _uri) external onlyOwner {
baseURI = _uri;
}
function setBaseExtension(string memory _ext) external onlyOwner {
baseExtension = _ext;
}
function startSale() external onlyOwner {
saleOpen = true;
}
function endSale() external onlyOwner {
saleOpen = false;
}
function startWLSale() external onlyOwner {
saleWLOpen = true;
}
function endWLSale() external onlyOwner {
saleWLOpen = false;
}
function _startTokenId() internal pure override returns (uint256) {
return 1;
}
function tokenUnlockTime(uint256 tokenId) public view returns (uint256) {
require(_exists(tokenId), "Nonexistent token ID");
uint256 id = tokenId;
while (_tokenUnlockTime[id] == 0 && id < _currentId) {
id++;
}
return _tokenUnlockTime[id];
}
function _mint(
uint256 amount1,
uint256 amount2,
uint256 amount3
) internal {
uint256 totalMint = amount1 + amount2 + amount3;
require(totalMint >= 3 && totalMint <= 5, "Invalid mint amount");
require(
balanceOf(msg.sender) <= limitPerAddress,
"You can't have more than 33"
);
require(
_currentId + totalMint <= maxSupply,
"You cannot mint any more"
);
_safeMint(msg.sender, totalMint);
_currentId += amount1;
_tokenUnlockTime[_currentId] = block.timestamp + LOCK_7d;
_currentId += amount2;
_tokenUnlockTime[_currentId] = block.timestamp + LOCK_6mo;
_currentId += amount3;
_tokenUnlockTime[_currentId] = block.timestamp + LOCK_12mo;
}
function mint(
uint256 amount1,
uint256 amount2,
uint256 amount3
) external payable {
uint256 totalCost = (amount1 + amount2 + amount3) * price;
require(msg.value >= totalCost, "Insufficient payment");
require(saleOpen, "Sale is not open");
_mint(amount1, amount2, amount3);
if (msg.value > totalCost) {
Address.sendValue(payable(msg.sender), msg.value - totalCost);
}
}
function mintWL1(
uint256 amount1,
uint256 amount2,
uint256 amount3,
bytes calldata sign
) external payable onlyWhitelist1(sign) {
uint256 totalCost = (amount1 + amount2 + amount3) * priceWL1;
require(msg.value >= totalCost, "Insufficient payment");
require(saleWLOpen, "Whitelist sale is not open");
_mint(amount1, amount2, amount3);
if (msg.value > totalCost) {
Address.sendValue(payable(msg.sender), msg.value - totalCost);
}
}
function mintWL2(
uint256 amount1,
uint256 amount2,
uint256 amount3,
bytes calldata sign
) external payable onlyWhitelist2(sign) {
uint256 totalCost = (amount1 + amount2 + amount3) * priceWL2;
require(msg.value >= totalCost, "Insufficient payment");
require(saleWLOpen, "Whitelist sale is not open");
_mint(amount1, amount2, amount3);
if (msg.value > totalCost) {
Address.sendValue(payable(msg.sender), msg.value - totalCost);
}
}
function mintAirdrop(uint256 amount, address to) external onlyOwner {
_safeMint(to, amount);
_currentId += amount;
}
function tokenURI(uint256 tokenId)
public
view
override
returns (string memory)
{
require(_exists(tokenId), "Nonexistent token ID");
if (block.timestamp < tokenUnlockTime(tokenId)) {
return unrevealedURI;
}
return
string(
abi.encodePacked(baseURI, tokenToArt[tokenId], baseExtension)
);
}
function burn(uint256 tokenId) external {
require(ownerOf(tokenId) == msg.sender, "You are not the token owner");
_burn(tokenId);
}
function walletOfOwner(address _owner)
public
view
returns (uint256[] memory)
{
uint256 ownerTokenCount = balanceOf(_owner);
uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
uint256 currentTokenId = _startTokenId();
uint256 ownedTokenIndex = 0;
address latestOwnerAddress;
while (
ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply
) {
TokenOwnership memory ownership = _ownerships[currentTokenId];
if (!ownership.burned && ownership.addr != address(0)) {
latestOwnerAddress = ownership.addr;
}
if (latestOwnerAddress == _owner) {
ownedTokenIds[ownedTokenIndex] = currentTokenId;
ownedTokenIndex++;
}
currentTokenId++;
}
return ownedTokenIds;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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"},{"inputs":[],"name":"LOCK_12mo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LOCK_6mo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LOCK_7d","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"endSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endWLSale","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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"investorAmounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"investors","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount1","type":"uint256"},{"internalType":"uint256","name":"amount2","type":"uint256"},{"internalType":"uint256","name":"amount3","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"mintAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount1","type":"uint256"},{"internalType":"uint256","name":"amount2","type":"uint256"},{"internalType":"uint256","name":"amount3","type":"uint256"},{"internalType":"bytes","name":"sign","type":"bytes"}],"name":"mintWL1","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount1","type":"uint256"},{"internalType":"uint256","name":"amount2","type":"uint256"},{"internalType":"uint256","name":"amount3","type":"uint256"},{"internalType":"bytes","name":"sign","type":"bytes"}],"name":"mintWL2","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceWL1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceWL2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleWLOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"_ext","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32[]","name":"_amounts","type":"uint32[]"}],"name":"setInvestorAmounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_investors","type":"address[]"}],"name":"setInvestors","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_priceWL1","type":"uint256"},{"internalType":"uint256","name":"_priceWL2","type":"uint256"}],"name":"setPrices","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signer1","type":"address"},{"internalType":"address","name":"_signer2","type":"address"}],"name":"setSigners","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setUnrevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startWLSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenUnlockTime","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":"unrevealedURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60e0604052670214e8348c4f0000600d5567016345785d8a0000600e556701bc16d674ec8000600f556005601055600060115562093a8060805262f1428060a0526301e1338060c0526127106012553480156200005b57600080fd5b50604080518082018252600c81526b111bdc19521958591cd3919560a21b60208083019182528351808501909452600484526311120d1360e21b908401528151919291620000ac916002916200012d565b508051620000c29060039060208401906200012d565b5050600160005550620000d533620000db565b62000210565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200013b90620001d3565b90600052602060002090601f0160209004810192826200015f5760008555620001aa565b82601f106200017a57805160ff1916838001178555620001aa565b82800160010185558215620001aa579182015b82811115620001aa5782518255916020019190600101906200018d565b50620001b8929150620001bc565b5090565b5b80821115620001b85760008155600101620001bd565b600181811c90821680620001e857607f821691505b602082108114156200020a57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05161331362000255600039600081816103ca0152611c670152600081816107480152611c1101526000818161063e0152611bbb01526133136000f3fe6080604052600436106102e85760003560e01c806370a0823111610190578063b88d4fde116100dc578063e0dc850d11610095578063f3272d491161006f578063f3272d49146108b2578063fb017fde146108d2578063fdf969fc146108f2578063fe2c7fee1461091257600080fd5b8063e0dc850d14610829578063e985e9c514610849578063f2fde38b1461089257600080fd5b8063b88d4fde1461077f578063c19490721461079f578063c6682862146107be578063c87b56dd146107d3578063d5abeb01146107f3578063da3ef23f1461080957600080fd5b806399288dbb11610149578063a88c37ef11610123578063a88c37ef14610703578063a88fe42d14610716578063ad8fc4d814610736578063b66a0e5d1461076a57600080fd5b806399288dbb146106b3578063a035b1fe146106cd578063a22cb465146106e357600080fd5b806370a08231146105f7578063715018a6146106175780637fcb94e41461062c5780638da5cb5b1461066057806391130aea1461067e57806395d89b411461069e57600080fd5b80632db7b8951161024f57806342966c68116102085780636352211e116101e25780636352211e14610597578063674bf7c3146105b75780636c0360eb146105cd5780637035bf18146105e257600080fd5b806342966c681461052a578063438b63001461054a57806355f804b31461057757600080fd5b80632db7b895146104955780633336913b146104aa578063380d831b146104c05780633ccfd60b146104d55780633feb5f2b146104ea57806342842e0e1461050a57600080fd5b806318160ddd116102a157806318160ddd146103fa5780631eb4cce8146104175780632045b1be1461042a57806323b872dd1461043f578063286720c51461045f5780632a484ad41461047f57600080fd5b806301ffc9a7146102f457806302acc94b1461032957806306fdde031461033e578063081812fc14610360578063095ea7b31461039857806309f0a076146103b857600080fd5b366102ef57005b600080fd5b34801561030057600080fd5b5061031461030f366004612e62565b610932565b60405190151581526020015b60405180910390f35b61033c610337366004612f19565b610984565b005b34801561034a57600080fd5b50610353610a68565b604051610320919061316f565b34801561036c57600080fd5b5061038061037b366004612edf565b610afa565b6040516001600160a01b039091168152602001610320565b3480156103a457600080fd5b5061033c6103b3366004612dfa565b610b3e565b3480156103c457600080fd5b506103ec7f000000000000000000000000000000000000000000000000000000000000000081565b604051908152602001610320565b34801561040657600080fd5b5060015460005403600019016103ec565b61033c610425366004612f44565b610bcc565b34801561043657600080fd5b5061033c610d6b565b34801561044b57600080fd5b5061033c61045a366004612d0d565b610da6565b34801561046b57600080fd5b506103ec61047a366004612edf565b610db1565b34801561048b57600080fd5b506103ec60105481565b3480156104a157600080fd5b5061033c610dd2565b3480156104b657600080fd5b506103ec600f5481565b3480156104cc57600080fd5b5061033c610e09565b3480156104e157600080fd5b5061033c610e3f565b3480156104f657600080fd5b50610380610505366004612edf565b610f8f565b34801561051657600080fd5b5061033c610525366004612d0d565b610fb9565b34801561053657600080fd5b5061033c610545366004612edf565b610fd4565b34801561055657600080fd5b5061056a610565366004612cba565b611040565b604051610320919061312b565b34801561058357600080fd5b5061033c610592366004612e9a565b6111a3565b3480156105a357600080fd5b506103806105b2366004612edf565b6111e0565b3480156105c357600080fd5b506103ec600e5481565b3480156105d957600080fd5b506103536111f2565b3480156105ee57600080fd5b50610353611280565b34801561060357600080fd5b506103ec610612366004612cba565b61128d565b34801561062357600080fd5b5061033c6112db565b34801561063857600080fd5b506103ec7f000000000000000000000000000000000000000000000000000000000000000081565b34801561066c57600080fd5b506008546001600160a01b0316610380565b34801561068a57600080fd5b5061033c610699366004612cdb565b611311565b3480156106aa57600080fd5b50610353611369565b3480156106bf57600080fd5b506018546103149060ff1681565b3480156106d957600080fd5b506103ec600d5481565b3480156106ef57600080fd5b5061033c6106fe366004612dc0565b611378565b61033c610711366004612f44565b61140e565b34801561072257600080fd5b5061033c610731366004612f19565b6114ce565b34801561074257600080fd5b506103ec7f000000000000000000000000000000000000000000000000000000000000000081565b34801561077657600080fd5b5061033c611506565b34801561078b57600080fd5b5061033c61079a366004612d48565b61153f565b3480156107ab57600080fd5b5060185461031490610100900460ff1681565b3480156107ca57600080fd5b5061035361158a565b3480156107df57600080fd5b506103536107ee366004612edf565b611597565b3480156107ff57600080fd5b506103ec60125481565b34801561081557600080fd5b5061033c610824366004612e9a565b6116c7565b34801561083557600080fd5b5061033c610844366004612e23565b611704565b34801561085557600080fd5b50610314610864366004612cdb565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561089e57600080fd5b5061033c6108ad366004612cba565b61186f565b3480156108be57600080fd5b5061033c6108cd366004612ef7565b611907565b3480156108de57600080fd5b5061033c6108ed366004612e23565b611956565b3480156108fe57600080fd5b506103ec61090d366004612edf565b611998565b34801561091e57600080fd5b5061033c61092d366004612e9a565b611a31565b60006001600160e01b031982166380ac58cd60e01b148061096357506001600160e01b03198216635b5e139f60e01b145b8061097e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b600d546000908261099585876131b7565b61099f91906131b7565b6109a991906131ef565b9050803410156109f75760405162461bcd60e51b8152602060048201526014602482015273125b9cdd59999a58da595b9d081c185e5b595b9d60621b60448201526064015b60405180910390fd5b60185460ff16610a3c5760405162461bcd60e51b815260206004820152601060248201526f29b0b6329034b9903737ba1037b832b760811b60448201526064016109ee565b610a47848484611a6e565b80341115610a6257610a6233610a5d833461320e565b611ca4565b50505050565b606060028054610a7790613225565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa390613225565b8015610af05780601f10610ac557610100808354040283529160200191610af0565b820191906000526020600020905b815481529060010190602001808311610ad357829003601f168201915b5050505050905090565b6000610b0582611dbd565b610b22576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610b49826111e0565b9050806001600160a01b0316836001600160a01b03161415610b7e5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610b9e5750610b9c8133610864565b155b15610bbc576040516367d9dca160e11b815260040160405180910390fd5b610bc7838383611df6565b505050565b600954829082906001600160a01b0316610c1b5760405162461bcd60e51b815260206004820152601060248201526f14da59db995c880c48139bdd0814d95d60821b60448201526064016109ee565b6009546001600160a01b0316610c318383611e52565b6001600160a01b031614610c7b5760405162461bcd60e51b81526020600482015260116024820152704e6f742057686974656c6973746564203160781b60448201526064016109ee565b600e5460009086610c8c898b6131b7565b610c9691906131b7565b610ca091906131ef565b905080341015610ce95760405162461bcd60e51b8152602060048201526014602482015273125b9cdd59999a58da595b9d081c185e5b595b9d60621b60448201526064016109ee565b601854610100900460ff16610d405760405162461bcd60e51b815260206004820152601a60248201527f57686974656c6973742073616c65206973206e6f74206f70656e00000000000060448201526064016109ee565b610d4b888888611a6e565b80341115610d6157610d6133610a5d833461320e565b5050505050505050565b6008546001600160a01b03163314610d955760405162461bcd60e51b81526004016109ee90613182565b6018805461ff001916610100179055565b610bc7838383611f30565b600c8181548110610dc157600080fd5b600091825260209091200154905081565b6008546001600160a01b03163314610dfc5760405162461bcd60e51b81526004016109ee90613182565b6018805461ff0019169055565b6008546001600160a01b03163314610e335760405162461bcd60e51b81526004016109ee90613182565b6018805460ff19169055565b6008546001600160a01b03163314610e695760405162461bcd60e51b81526004016109ee90613182565b600c54610eb15760405162461bcd60e51b8152602060048201526016602482015275139bc81a5b9d995cdd1bdc9cc81cdc1958da599a595960521b60448201526064016109ee565b4760005b600b54811015610f8b576000600c8281548110610ee257634e487b7160e01b600052603260045260246000fd5b90600052602060002001541115610f7957610f79600b8281548110610f1757634e487b7160e01b600052603260045260246000fd5b9060005260206000200160009054906101000a90046001600160a01b0316612710600c8481548110610f5957634e487b7160e01b600052603260045260246000fd5b906000526020600020015485610f6f91906131ef565b610a5d91906131cf565b80610f8381613260565b915050610eb5565b5050565b600b8181548110610f9f57600080fd5b6000918252602090912001546001600160a01b0316905081565b610bc78383836040518060200160405280600081525061153f565b33610fde826111e0565b6001600160a01b0316146110345760405162461bcd60e51b815260206004820152601b60248201527f596f7520617265206e6f742074686520746f6b656e206f776e6572000000000060448201526064016109ee565b61103d81612132565b50565b6060600061104d8361128d565b90506000816001600160401b0381111561107757634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156110a0578160200160208202803683370190505b50905060016000805b84821080156110ba57506012548311155b1561119857600083815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161580159282018390529091611127575080516001600160a01b031615155b1561113157805191505b876001600160a01b0316826001600160a01b03161415611185578385848151811061116c57634e487b7160e01b600052603260045260246000fd5b60209081029190910101528261118181613260565b9350505b8361118f81613260565b945050506110a9565b509195945050505050565b6008546001600160a01b031633146111cd5760405162461bcd60e51b81526004016109ee90613182565b8051610f8b906016906020840190612a9a565b60006111eb8261229c565b5192915050565b601680546111ff90613225565b80601f016020809104026020016040519081016040528092919081815260200182805461122b90613225565b80156112785780601f1061124d57610100808354040283529160200191611278565b820191906000526020600020905b81548152906001019060200180831161125b57829003601f168201915b505050505081565b601580546111ff90613225565b60006001600160a01b0382166112b6576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b031633146113055760405162461bcd60e51b81526004016109ee90613182565b61130f60006123c3565b565b6008546001600160a01b0316331461133b5760405162461bcd60e51b81526004016109ee90613182565b600980546001600160a01b039384166001600160a01b031991821617909155600a8054929093169116179055565b606060038054610a7790613225565b6001600160a01b0382163314156113a25760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a54829082906001600160a01b031661145d5760405162461bcd60e51b815260206004820152601060248201526f14da59db995c880c88139bdd0814d95d60821b60448201526064016109ee565b600a546001600160a01b03166114738383611e52565b6001600160a01b0316146114bd5760405162461bcd60e51b81526020600482015260116024820152702737ba102bb434ba32b634b9ba32b2101960791b60448201526064016109ee565b600f5460009086610c8c898b6131b7565b6008546001600160a01b031633146114f85760405162461bcd60e51b81526004016109ee90613182565b600d92909255600e55600f55565b6008546001600160a01b031633146115305760405162461bcd60e51b81526004016109ee90613182565b6018805460ff19166001179055565b61154a848484611f30565b6001600160a01b0383163b1515801561156c575061156a84848484612415565b155b15610a62576040516368d2bf6b60e11b815260040160405180910390fd5b601780546111ff90613225565b60606115a282611dbd565b6115e55760405162461bcd60e51b8152602060048201526014602482015273139bdb995e1a5cdd195b9d081d1bdad95b88125160621b60448201526064016109ee565b6115ee82611998565b421015611687576015805461160290613225565b80601f016020809104026020016040519081016040528092919081815260200182805461162e90613225565b801561167b5780601f106116505761010080835404028352916020019161167b565b820191906000526020600020905b81548152906001019060200180831161165e57829003601f168201915b50505050509050919050565b6016601460008481526020019081526020016000205460176040516020016116b1939291906130d2565b6040516020818303038152906040529050919050565b6008546001600160a01b031633146116f15760405162461bcd60e51b81526004016109ee90613182565b8051610f8b906017906020840190612a9a565b6008546001600160a01b0316331461172e5760405162461bcd60e51b81526004016109ee90613182565b600b5481146117945760405162461bcd60e51b815260206004820152602c60248201527f546865206e756d6265727320646f65736e2774206d617463682077697468207460448201526b686520696e766573746f727360a01b60648201526084016109ee565b6000805b828110156117f9578383828181106117c057634e487b7160e01b600052603260045260246000fd5b90506020020160208101906117d59190612fcb565b6117e59063ffffffff16836131b7565b9150806117f181613260565b915050611798565b5080612710146118575760405162461bcd60e51b8152602060048201526024808201527f5468652073756d206f6620746865206e756d62657273206d75737420626520316044820152630303030360e41b60648201526084016109ee565b611863600c6000612b1e565b610a62600c8484612b3c565b6008546001600160a01b031633146118995760405162461bcd60e51b81526004016109ee90613182565b6001600160a01b0381166118fe5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109ee565b61103d816123c3565b6008546001600160a01b031633146119315760405162461bcd60e51b81526004016109ee90613182565b61193b818361250c565b816011600082825461194d91906131b7565b90915550505050565b6008546001600160a01b031633146119805760405162461bcd60e51b81526004016109ee90613182565b61198c600b6000612b1e565b610bc7600b8383612b7f565b60006119a382611dbd565b6119e65760405162461bcd60e51b8152602060048201526014602482015273139bdb995e1a5cdd195b9d081d1bdad95b88125160621b60448201526064016109ee565b815b600081815260136020526040902054158015611a05575060115481105b15611a1c5780611a1481613260565b9150506119e8565b60009081526013602052604090205492915050565b6008546001600160a01b03163314611a5b5760405162461bcd60e51b81526004016109ee90613182565b8051610f8b906015906020840190612a9a565b600081611a7b84866131b7565b611a8591906131b7565b905060038110158015611a99575060058111155b611adb5760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a59081b5a5b9d08185b5bdd5b9d606a1b60448201526064016109ee565b601054611ae73361128d565b1115611b355760405162461bcd60e51b815260206004820152601b60248201527f596f752063616e27742068617665206d6f7265207468616e203333000000000060448201526064016109ee565b60125481601154611b4691906131b7565b1115611b945760405162461bcd60e51b815260206004820152601860248201527f596f752063616e6e6f74206d696e7420616e79206d6f7265000000000000000060448201526064016109ee565b611b9e338261250c565b8360116000828254611bb091906131b7565b90915550611be090507f0000000000000000000000000000000000000000000000000000000000000000426131b7565b601180546000908152601360205260408120929092558054859290611c069084906131b7565b90915550611c3690507f0000000000000000000000000000000000000000000000000000000000000000426131b7565b601180546000908152601360205260408120929092558054849290611c5c9084906131b7565b90915550611c8c90507f0000000000000000000000000000000000000000000000000000000000000000426131b7565b60115460009081526013602052604090205550505050565b80471015611cf45760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016109ee565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611d41576040519150601f19603f3d011682016040523d82523d6000602084013e611d46565b606091505b5050905080610bc75760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016109ee565b600081600111158015611dd1575060005482105b801561097e575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6040516bffffffffffffffffffffffff1930606090811b8216602084015233901b166034820152600090819060480160408051601f198184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c82018190529150605c01604051602081830303815290604052805190602001209050611f2884848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525085939250506125269050565b949350505050565b6000611f3b8261229c565b80519091506000906001600160a01b0316336001600160a01b03161480611f6957508151611f699033610864565b80611f84575033611f7984610afa565b6001600160a01b0316145b905080611fa457604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b031614611fd95760405162a1148160e81b815260040160405180910390fd5b6001600160a01b03841661200057604051633a954ecd60e21b815260040160405180910390fd5b6120106000848460000151611df6565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b4290921691909102179092559086018083529120549091166120fa576000548110156120fa57825160008281526004602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03166000805160206132be83398151915260405160405180910390a45b5050505050565b600061213d8261229c565b905061214f6000838360000151611df6565b80516001600160a01b039081166000908152600560209081526040808320805467ffffffffffffffff1981166001600160401b0391821660001901821617909155855185168452818420805467ffffffffffffffff60801b198116600160801b9182900484166001908101851690920217909155865188865260049094528285208054600160e01b9588166001600160e01b031990911617600160a01b42909416939093029290921760ff60e01b19169390931790559085018083529120549091166122665760005481101561226657815160008281526004602090815260409091208054918501516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b50805160405183916000916001600160a01b03909116906000805160206132be833981519152908390a450506001805481019055565b604080516060810182526000808252602082018190529181019190915281806001111580156122cc575060005481105b156123aa57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906123a85780516001600160a01b03161561233f579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff16151592810192909252156123a3579392505050565b61233f565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029061244a9033908990889088906004016130f8565b602060405180830381600087803b15801561246457600080fd5b505af1925050508015612494575060408051601f3d908101601f1916820190925261249191810190612e7e565b60015b6124ef573d8080156124c2576040519150601f19603f3d011682016040523d82523d6000602084013e6124c7565b606091505b5080516124e7576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b610f8b82826040518060200160405280600081525061254a565b60008060006125358585612557565b91509150612542816125c7565b509392505050565b610bc783838360016127c8565b60008082516041141561258e5760208301516040840151606085015160001a61258287828585612974565b945094505050506125c0565b8251604014156125b857602083015160408401516125ad868383612a61565b9350935050506125c0565b506000905060025b9250929050565b60008160048111156125e957634e487b7160e01b600052602160045260246000fd5b14156125f25750565b600181600481111561261457634e487b7160e01b600052602160045260246000fd5b14156126625760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016109ee565b600281600481111561268457634e487b7160e01b600052602160045260246000fd5b14156126d25760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016109ee565b60038160048111156126f457634e487b7160e01b600052602160045260246000fd5b141561274d5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016109ee565b600481600481111561276f57634e487b7160e01b600052602160045260246000fd5b141561103d5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016109ee565b6000546001600160a01b0385166127f157604051622e076360e81b815260040160405180910390fd5b8361280f5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b4290921691909102179055808085018380156128c057506001600160a01b0387163b15155b15612937575b60405182906001600160a01b038916906000906000805160206132be833981519152908290a46128ff6000888480600101955088612415565b61291c576040516368d2bf6b60e11b815260040160405180910390fd5b808214156128c657826000541461293257600080fd5b61296b565b5b6040516001830192906001600160a01b038916906000906000805160206132be833981519152908290a480821415612938575b5060005561212b565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156129ab5750600090506003612a58565b8460ff16601b141580156129c357508460ff16601c14155b156129d45750600090506004612a58565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612a28573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612a5157600060019250925050612a58565b9150600090505b94509492505050565b6000806001600160ff1b03831681612a7e60ff86901c601b6131b7565b9050612a8c87828885612974565b935093505050935093915050565b828054612aa690613225565b90600052602060002090601f016020900481019282612ac85760008555612b0e565b82601f10612ae157805160ff1916838001178555612b0e565b82800160010185558215612b0e579182015b82811115612b0e578251825591602001919060010190612af3565b50612b1a929150612bd2565b5090565b508054600082559060005260206000209081019061103d9190612bd2565b828054828255906000526020600020908101928215612b0e579160200282015b82811115612b0e5763ffffffff8335168255602090920191600190910190612b5c565b828054828255906000526020600020908101928215612b0e579160200282015b82811115612b0e5781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190612b9f565b5b80821115612b1a5760008155600101612bd3565b60006001600160401b0380841115612c0157612c01613291565b604051601f8501601f19908116603f01168101908282118183101715612c2957612c29613291565b81604052809350858152868686011115612c4257600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114612c7357600080fd5b919050565b60008083601f840112612c89578081fd5b5081356001600160401b03811115612c9f578182fd5b6020830191508360208260051b85010111156125c057600080fd5b600060208284031215612ccb578081fd5b612cd482612c5c565b9392505050565b60008060408385031215612ced578081fd5b612cf683612c5c565b9150612d0460208401612c5c565b90509250929050565b600080600060608486031215612d21578081fd5b612d2a84612c5c565b9250612d3860208501612c5c565b9150604084013590509250925092565b60008060008060808587031215612d5d578081fd5b612d6685612c5c565b9350612d7460208601612c5c565b92506040850135915060608501356001600160401b03811115612d95578182fd5b8501601f81018713612da5578182fd5b612db487823560208401612be7565b91505092959194509250565b60008060408385031215612dd2578182fd5b612ddb83612c5c565b915060208301358015158114612def578182fd5b809150509250929050565b60008060408385031215612e0c578182fd5b612e1583612c5c565b946020939093013593505050565b60008060208385031215612e35578182fd5b82356001600160401b03811115612e4a578283fd5b612e5685828601612c78565b90969095509350505050565b600060208284031215612e73578081fd5b8135612cd4816132a7565b600060208284031215612e8f578081fd5b8151612cd4816132a7565b600060208284031215612eab578081fd5b81356001600160401b03811115612ec0578182fd5b8201601f81018413612ed0578182fd5b611f2884823560208401612be7565b600060208284031215612ef0578081fd5b5035919050565b60008060408385031215612f09578182fd5b82359150612d0460208401612c5c565b600080600060608486031215612f2d578081fd5b505081359360208301359350604090920135919050565b600080600080600060808688031215612f5b578283fd5b85359450602086013593506040860135925060608601356001600160401b0380821115612f86578283fd5b818801915088601f830112612f99578283fd5b813581811115612fa7578384fd5b896020828501011115612fb8578384fd5b9699959850939650602001949392505050565b600060208284031215612fdc578081fd5b813563ffffffff81168114612cd4578182fd5b60008151808452815b8181101561301457602081850181015186830182015201612ff8565b818111156130255782602083870101525b50601f01601f19169290920160200192915050565b8054600090600181811c908083168061305457607f831692505b602080841082141561307457634e487b7160e01b86526022600452602486fd5b8180156130885760018114613099576130c6565b60ff198616895284890196506130c6565b60008881526020902060005b868110156130be5781548b8201529085019083016130a5565b505084890196505b50505050505092915050565b60006130de828661303a565b8481526130ee602082018561303a565b9695505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906130ee90830184612fef565b6020808252825182820181905260009190848201906040850190845b8181101561316357835183529284019291840191600101613147565b50909695505050505050565b602081526000612cd46020830184612fef565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600082198211156131ca576131ca61327b565b500190565b6000826131ea57634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156132095761320961327b565b500290565b6000828210156132205761322061327b565b500390565b600181811c9082168061323957607f821691505b6020821081141561325a57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156132745761327461327b565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461103d57600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212204bb3ef41ce1b38c5ce3018a1469487611061f8d917d3515eba7c98f31c20994f64736f6c63430008040033
Deployed Bytecode
0x6080604052600436106102e85760003560e01c806370a0823111610190578063b88d4fde116100dc578063e0dc850d11610095578063f3272d491161006f578063f3272d49146108b2578063fb017fde146108d2578063fdf969fc146108f2578063fe2c7fee1461091257600080fd5b8063e0dc850d14610829578063e985e9c514610849578063f2fde38b1461089257600080fd5b8063b88d4fde1461077f578063c19490721461079f578063c6682862146107be578063c87b56dd146107d3578063d5abeb01146107f3578063da3ef23f1461080957600080fd5b806399288dbb11610149578063a88c37ef11610123578063a88c37ef14610703578063a88fe42d14610716578063ad8fc4d814610736578063b66a0e5d1461076a57600080fd5b806399288dbb146106b3578063a035b1fe146106cd578063a22cb465146106e357600080fd5b806370a08231146105f7578063715018a6146106175780637fcb94e41461062c5780638da5cb5b1461066057806391130aea1461067e57806395d89b411461069e57600080fd5b80632db7b8951161024f57806342966c68116102085780636352211e116101e25780636352211e14610597578063674bf7c3146105b75780636c0360eb146105cd5780637035bf18146105e257600080fd5b806342966c681461052a578063438b63001461054a57806355f804b31461057757600080fd5b80632db7b895146104955780633336913b146104aa578063380d831b146104c05780633ccfd60b146104d55780633feb5f2b146104ea57806342842e0e1461050a57600080fd5b806318160ddd116102a157806318160ddd146103fa5780631eb4cce8146104175780632045b1be1461042a57806323b872dd1461043f578063286720c51461045f5780632a484ad41461047f57600080fd5b806301ffc9a7146102f457806302acc94b1461032957806306fdde031461033e578063081812fc14610360578063095ea7b31461039857806309f0a076146103b857600080fd5b366102ef57005b600080fd5b34801561030057600080fd5b5061031461030f366004612e62565b610932565b60405190151581526020015b60405180910390f35b61033c610337366004612f19565b610984565b005b34801561034a57600080fd5b50610353610a68565b604051610320919061316f565b34801561036c57600080fd5b5061038061037b366004612edf565b610afa565b6040516001600160a01b039091168152602001610320565b3480156103a457600080fd5b5061033c6103b3366004612dfa565b610b3e565b3480156103c457600080fd5b506103ec7f0000000000000000000000000000000000000000000000000000000001e1338081565b604051908152602001610320565b34801561040657600080fd5b5060015460005403600019016103ec565b61033c610425366004612f44565b610bcc565b34801561043657600080fd5b5061033c610d6b565b34801561044b57600080fd5b5061033c61045a366004612d0d565b610da6565b34801561046b57600080fd5b506103ec61047a366004612edf565b610db1565b34801561048b57600080fd5b506103ec60105481565b3480156104a157600080fd5b5061033c610dd2565b3480156104b657600080fd5b506103ec600f5481565b3480156104cc57600080fd5b5061033c610e09565b3480156104e157600080fd5b5061033c610e3f565b3480156104f657600080fd5b50610380610505366004612edf565b610f8f565b34801561051657600080fd5b5061033c610525366004612d0d565b610fb9565b34801561053657600080fd5b5061033c610545366004612edf565b610fd4565b34801561055657600080fd5b5061056a610565366004612cba565b611040565b604051610320919061312b565b34801561058357600080fd5b5061033c610592366004612e9a565b6111a3565b3480156105a357600080fd5b506103806105b2366004612edf565b6111e0565b3480156105c357600080fd5b506103ec600e5481565b3480156105d957600080fd5b506103536111f2565b3480156105ee57600080fd5b50610353611280565b34801561060357600080fd5b506103ec610612366004612cba565b61128d565b34801561062357600080fd5b5061033c6112db565b34801561063857600080fd5b506103ec7f0000000000000000000000000000000000000000000000000000000000093a8081565b34801561066c57600080fd5b506008546001600160a01b0316610380565b34801561068a57600080fd5b5061033c610699366004612cdb565b611311565b3480156106aa57600080fd5b50610353611369565b3480156106bf57600080fd5b506018546103149060ff1681565b3480156106d957600080fd5b506103ec600d5481565b3480156106ef57600080fd5b5061033c6106fe366004612dc0565b611378565b61033c610711366004612f44565b61140e565b34801561072257600080fd5b5061033c610731366004612f19565b6114ce565b34801561074257600080fd5b506103ec7f0000000000000000000000000000000000000000000000000000000000f1428081565b34801561077657600080fd5b5061033c611506565b34801561078b57600080fd5b5061033c61079a366004612d48565b61153f565b3480156107ab57600080fd5b5060185461031490610100900460ff1681565b3480156107ca57600080fd5b5061035361158a565b3480156107df57600080fd5b506103536107ee366004612edf565b611597565b3480156107ff57600080fd5b506103ec60125481565b34801561081557600080fd5b5061033c610824366004612e9a565b6116c7565b34801561083557600080fd5b5061033c610844366004612e23565b611704565b34801561085557600080fd5b50610314610864366004612cdb565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561089e57600080fd5b5061033c6108ad366004612cba565b61186f565b3480156108be57600080fd5b5061033c6108cd366004612ef7565b611907565b3480156108de57600080fd5b5061033c6108ed366004612e23565b611956565b3480156108fe57600080fd5b506103ec61090d366004612edf565b611998565b34801561091e57600080fd5b5061033c61092d366004612e9a565b611a31565b60006001600160e01b031982166380ac58cd60e01b148061096357506001600160e01b03198216635b5e139f60e01b145b8061097e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b600d546000908261099585876131b7565b61099f91906131b7565b6109a991906131ef565b9050803410156109f75760405162461bcd60e51b8152602060048201526014602482015273125b9cdd59999a58da595b9d081c185e5b595b9d60621b60448201526064015b60405180910390fd5b60185460ff16610a3c5760405162461bcd60e51b815260206004820152601060248201526f29b0b6329034b9903737ba1037b832b760811b60448201526064016109ee565b610a47848484611a6e565b80341115610a6257610a6233610a5d833461320e565b611ca4565b50505050565b606060028054610a7790613225565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa390613225565b8015610af05780601f10610ac557610100808354040283529160200191610af0565b820191906000526020600020905b815481529060010190602001808311610ad357829003601f168201915b5050505050905090565b6000610b0582611dbd565b610b22576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610b49826111e0565b9050806001600160a01b0316836001600160a01b03161415610b7e5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610b9e5750610b9c8133610864565b155b15610bbc576040516367d9dca160e11b815260040160405180910390fd5b610bc7838383611df6565b505050565b600954829082906001600160a01b0316610c1b5760405162461bcd60e51b815260206004820152601060248201526f14da59db995c880c48139bdd0814d95d60821b60448201526064016109ee565b6009546001600160a01b0316610c318383611e52565b6001600160a01b031614610c7b5760405162461bcd60e51b81526020600482015260116024820152704e6f742057686974656c6973746564203160781b60448201526064016109ee565b600e5460009086610c8c898b6131b7565b610c9691906131b7565b610ca091906131ef565b905080341015610ce95760405162461bcd60e51b8152602060048201526014602482015273125b9cdd59999a58da595b9d081c185e5b595b9d60621b60448201526064016109ee565b601854610100900460ff16610d405760405162461bcd60e51b815260206004820152601a60248201527f57686974656c6973742073616c65206973206e6f74206f70656e00000000000060448201526064016109ee565b610d4b888888611a6e565b80341115610d6157610d6133610a5d833461320e565b5050505050505050565b6008546001600160a01b03163314610d955760405162461bcd60e51b81526004016109ee90613182565b6018805461ff001916610100179055565b610bc7838383611f30565b600c8181548110610dc157600080fd5b600091825260209091200154905081565b6008546001600160a01b03163314610dfc5760405162461bcd60e51b81526004016109ee90613182565b6018805461ff0019169055565b6008546001600160a01b03163314610e335760405162461bcd60e51b81526004016109ee90613182565b6018805460ff19169055565b6008546001600160a01b03163314610e695760405162461bcd60e51b81526004016109ee90613182565b600c54610eb15760405162461bcd60e51b8152602060048201526016602482015275139bc81a5b9d995cdd1bdc9cc81cdc1958da599a595960521b60448201526064016109ee565b4760005b600b54811015610f8b576000600c8281548110610ee257634e487b7160e01b600052603260045260246000fd5b90600052602060002001541115610f7957610f79600b8281548110610f1757634e487b7160e01b600052603260045260246000fd5b9060005260206000200160009054906101000a90046001600160a01b0316612710600c8481548110610f5957634e487b7160e01b600052603260045260246000fd5b906000526020600020015485610f6f91906131ef565b610a5d91906131cf565b80610f8381613260565b915050610eb5565b5050565b600b8181548110610f9f57600080fd5b6000918252602090912001546001600160a01b0316905081565b610bc78383836040518060200160405280600081525061153f565b33610fde826111e0565b6001600160a01b0316146110345760405162461bcd60e51b815260206004820152601b60248201527f596f7520617265206e6f742074686520746f6b656e206f776e6572000000000060448201526064016109ee565b61103d81612132565b50565b6060600061104d8361128d565b90506000816001600160401b0381111561107757634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156110a0578160200160208202803683370190505b50905060016000805b84821080156110ba57506012548311155b1561119857600083815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161580159282018390529091611127575080516001600160a01b031615155b1561113157805191505b876001600160a01b0316826001600160a01b03161415611185578385848151811061116c57634e487b7160e01b600052603260045260246000fd5b60209081029190910101528261118181613260565b9350505b8361118f81613260565b945050506110a9565b509195945050505050565b6008546001600160a01b031633146111cd5760405162461bcd60e51b81526004016109ee90613182565b8051610f8b906016906020840190612a9a565b60006111eb8261229c565b5192915050565b601680546111ff90613225565b80601f016020809104026020016040519081016040528092919081815260200182805461122b90613225565b80156112785780601f1061124d57610100808354040283529160200191611278565b820191906000526020600020905b81548152906001019060200180831161125b57829003601f168201915b505050505081565b601580546111ff90613225565b60006001600160a01b0382166112b6576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b031633146113055760405162461bcd60e51b81526004016109ee90613182565b61130f60006123c3565b565b6008546001600160a01b0316331461133b5760405162461bcd60e51b81526004016109ee90613182565b600980546001600160a01b039384166001600160a01b031991821617909155600a8054929093169116179055565b606060038054610a7790613225565b6001600160a01b0382163314156113a25760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a54829082906001600160a01b031661145d5760405162461bcd60e51b815260206004820152601060248201526f14da59db995c880c88139bdd0814d95d60821b60448201526064016109ee565b600a546001600160a01b03166114738383611e52565b6001600160a01b0316146114bd5760405162461bcd60e51b81526020600482015260116024820152702737ba102bb434ba32b634b9ba32b2101960791b60448201526064016109ee565b600f5460009086610c8c898b6131b7565b6008546001600160a01b031633146114f85760405162461bcd60e51b81526004016109ee90613182565b600d92909255600e55600f55565b6008546001600160a01b031633146115305760405162461bcd60e51b81526004016109ee90613182565b6018805460ff19166001179055565b61154a848484611f30565b6001600160a01b0383163b1515801561156c575061156a84848484612415565b155b15610a62576040516368d2bf6b60e11b815260040160405180910390fd5b601780546111ff90613225565b60606115a282611dbd565b6115e55760405162461bcd60e51b8152602060048201526014602482015273139bdb995e1a5cdd195b9d081d1bdad95b88125160621b60448201526064016109ee565b6115ee82611998565b421015611687576015805461160290613225565b80601f016020809104026020016040519081016040528092919081815260200182805461162e90613225565b801561167b5780601f106116505761010080835404028352916020019161167b565b820191906000526020600020905b81548152906001019060200180831161165e57829003601f168201915b50505050509050919050565b6016601460008481526020019081526020016000205460176040516020016116b1939291906130d2565b6040516020818303038152906040529050919050565b6008546001600160a01b031633146116f15760405162461bcd60e51b81526004016109ee90613182565b8051610f8b906017906020840190612a9a565b6008546001600160a01b0316331461172e5760405162461bcd60e51b81526004016109ee90613182565b600b5481146117945760405162461bcd60e51b815260206004820152602c60248201527f546865206e756d6265727320646f65736e2774206d617463682077697468207460448201526b686520696e766573746f727360a01b60648201526084016109ee565b6000805b828110156117f9578383828181106117c057634e487b7160e01b600052603260045260246000fd5b90506020020160208101906117d59190612fcb565b6117e59063ffffffff16836131b7565b9150806117f181613260565b915050611798565b5080612710146118575760405162461bcd60e51b8152602060048201526024808201527f5468652073756d206f6620746865206e756d62657273206d75737420626520316044820152630303030360e41b60648201526084016109ee565b611863600c6000612b1e565b610a62600c8484612b3c565b6008546001600160a01b031633146118995760405162461bcd60e51b81526004016109ee90613182565b6001600160a01b0381166118fe5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109ee565b61103d816123c3565b6008546001600160a01b031633146119315760405162461bcd60e51b81526004016109ee90613182565b61193b818361250c565b816011600082825461194d91906131b7565b90915550505050565b6008546001600160a01b031633146119805760405162461bcd60e51b81526004016109ee90613182565b61198c600b6000612b1e565b610bc7600b8383612b7f565b60006119a382611dbd565b6119e65760405162461bcd60e51b8152602060048201526014602482015273139bdb995e1a5cdd195b9d081d1bdad95b88125160621b60448201526064016109ee565b815b600081815260136020526040902054158015611a05575060115481105b15611a1c5780611a1481613260565b9150506119e8565b60009081526013602052604090205492915050565b6008546001600160a01b03163314611a5b5760405162461bcd60e51b81526004016109ee90613182565b8051610f8b906015906020840190612a9a565b600081611a7b84866131b7565b611a8591906131b7565b905060038110158015611a99575060058111155b611adb5760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a59081b5a5b9d08185b5bdd5b9d606a1b60448201526064016109ee565b601054611ae73361128d565b1115611b355760405162461bcd60e51b815260206004820152601b60248201527f596f752063616e27742068617665206d6f7265207468616e203333000000000060448201526064016109ee565b60125481601154611b4691906131b7565b1115611b945760405162461bcd60e51b815260206004820152601860248201527f596f752063616e6e6f74206d696e7420616e79206d6f7265000000000000000060448201526064016109ee565b611b9e338261250c565b8360116000828254611bb091906131b7565b90915550611be090507f0000000000000000000000000000000000000000000000000000000000093a80426131b7565b601180546000908152601360205260408120929092558054859290611c069084906131b7565b90915550611c3690507f0000000000000000000000000000000000000000000000000000000000f14280426131b7565b601180546000908152601360205260408120929092558054849290611c5c9084906131b7565b90915550611c8c90507f0000000000000000000000000000000000000000000000000000000001e13380426131b7565b60115460009081526013602052604090205550505050565b80471015611cf45760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016109ee565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611d41576040519150601f19603f3d011682016040523d82523d6000602084013e611d46565b606091505b5050905080610bc75760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016109ee565b600081600111158015611dd1575060005482105b801561097e575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6040516bffffffffffffffffffffffff1930606090811b8216602084015233901b166034820152600090819060480160408051601f198184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c82018190529150605c01604051602081830303815290604052805190602001209050611f2884848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525085939250506125269050565b949350505050565b6000611f3b8261229c565b80519091506000906001600160a01b0316336001600160a01b03161480611f6957508151611f699033610864565b80611f84575033611f7984610afa565b6001600160a01b0316145b905080611fa457604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b031614611fd95760405162a1148160e81b815260040160405180910390fd5b6001600160a01b03841661200057604051633a954ecd60e21b815260040160405180910390fd5b6120106000848460000151611df6565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b4290921691909102179092559086018083529120549091166120fa576000548110156120fa57825160008281526004602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03166000805160206132be83398151915260405160405180910390a45b5050505050565b600061213d8261229c565b905061214f6000838360000151611df6565b80516001600160a01b039081166000908152600560209081526040808320805467ffffffffffffffff1981166001600160401b0391821660001901821617909155855185168452818420805467ffffffffffffffff60801b198116600160801b9182900484166001908101851690920217909155865188865260049094528285208054600160e01b9588166001600160e01b031990911617600160a01b42909416939093029290921760ff60e01b19169390931790559085018083529120549091166122665760005481101561226657815160008281526004602090815260409091208054918501516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b50805160405183916000916001600160a01b03909116906000805160206132be833981519152908390a450506001805481019055565b604080516060810182526000808252602082018190529181019190915281806001111580156122cc575060005481105b156123aa57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906123a85780516001600160a01b03161561233f579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff16151592810192909252156123a3579392505050565b61233f565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029061244a9033908990889088906004016130f8565b602060405180830381600087803b15801561246457600080fd5b505af1925050508015612494575060408051601f3d908101601f1916820190925261249191810190612e7e565b60015b6124ef573d8080156124c2576040519150601f19603f3d011682016040523d82523d6000602084013e6124c7565b606091505b5080516124e7576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b610f8b82826040518060200160405280600081525061254a565b60008060006125358585612557565b91509150612542816125c7565b509392505050565b610bc783838360016127c8565b60008082516041141561258e5760208301516040840151606085015160001a61258287828585612974565b945094505050506125c0565b8251604014156125b857602083015160408401516125ad868383612a61565b9350935050506125c0565b506000905060025b9250929050565b60008160048111156125e957634e487b7160e01b600052602160045260246000fd5b14156125f25750565b600181600481111561261457634e487b7160e01b600052602160045260246000fd5b14156126625760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016109ee565b600281600481111561268457634e487b7160e01b600052602160045260246000fd5b14156126d25760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016109ee565b60038160048111156126f457634e487b7160e01b600052602160045260246000fd5b141561274d5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016109ee565b600481600481111561276f57634e487b7160e01b600052602160045260246000fd5b141561103d5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016109ee565b6000546001600160a01b0385166127f157604051622e076360e81b815260040160405180910390fd5b8361280f5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b4290921691909102179055808085018380156128c057506001600160a01b0387163b15155b15612937575b60405182906001600160a01b038916906000906000805160206132be833981519152908290a46128ff6000888480600101955088612415565b61291c576040516368d2bf6b60e11b815260040160405180910390fd5b808214156128c657826000541461293257600080fd5b61296b565b5b6040516001830192906001600160a01b038916906000906000805160206132be833981519152908290a480821415612938575b5060005561212b565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156129ab5750600090506003612a58565b8460ff16601b141580156129c357508460ff16601c14155b156129d45750600090506004612a58565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612a28573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612a5157600060019250925050612a58565b9150600090505b94509492505050565b6000806001600160ff1b03831681612a7e60ff86901c601b6131b7565b9050612a8c87828885612974565b935093505050935093915050565b828054612aa690613225565b90600052602060002090601f016020900481019282612ac85760008555612b0e565b82601f10612ae157805160ff1916838001178555612b0e565b82800160010185558215612b0e579182015b82811115612b0e578251825591602001919060010190612af3565b50612b1a929150612bd2565b5090565b508054600082559060005260206000209081019061103d9190612bd2565b828054828255906000526020600020908101928215612b0e579160200282015b82811115612b0e5763ffffffff8335168255602090920191600190910190612b5c565b828054828255906000526020600020908101928215612b0e579160200282015b82811115612b0e5781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190612b9f565b5b80821115612b1a5760008155600101612bd3565b60006001600160401b0380841115612c0157612c01613291565b604051601f8501601f19908116603f01168101908282118183101715612c2957612c29613291565b81604052809350858152868686011115612c4257600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114612c7357600080fd5b919050565b60008083601f840112612c89578081fd5b5081356001600160401b03811115612c9f578182fd5b6020830191508360208260051b85010111156125c057600080fd5b600060208284031215612ccb578081fd5b612cd482612c5c565b9392505050565b60008060408385031215612ced578081fd5b612cf683612c5c565b9150612d0460208401612c5c565b90509250929050565b600080600060608486031215612d21578081fd5b612d2a84612c5c565b9250612d3860208501612c5c565b9150604084013590509250925092565b60008060008060808587031215612d5d578081fd5b612d6685612c5c565b9350612d7460208601612c5c565b92506040850135915060608501356001600160401b03811115612d95578182fd5b8501601f81018713612da5578182fd5b612db487823560208401612be7565b91505092959194509250565b60008060408385031215612dd2578182fd5b612ddb83612c5c565b915060208301358015158114612def578182fd5b809150509250929050565b60008060408385031215612e0c578182fd5b612e1583612c5c565b946020939093013593505050565b60008060208385031215612e35578182fd5b82356001600160401b03811115612e4a578283fd5b612e5685828601612c78565b90969095509350505050565b600060208284031215612e73578081fd5b8135612cd4816132a7565b600060208284031215612e8f578081fd5b8151612cd4816132a7565b600060208284031215612eab578081fd5b81356001600160401b03811115612ec0578182fd5b8201601f81018413612ed0578182fd5b611f2884823560208401612be7565b600060208284031215612ef0578081fd5b5035919050565b60008060408385031215612f09578182fd5b82359150612d0460208401612c5c565b600080600060608486031215612f2d578081fd5b505081359360208301359350604090920135919050565b600080600080600060808688031215612f5b578283fd5b85359450602086013593506040860135925060608601356001600160401b0380821115612f86578283fd5b818801915088601f830112612f99578283fd5b813581811115612fa7578384fd5b896020828501011115612fb8578384fd5b9699959850939650602001949392505050565b600060208284031215612fdc578081fd5b813563ffffffff81168114612cd4578182fd5b60008151808452815b8181101561301457602081850181015186830182015201612ff8565b818111156130255782602083870101525b50601f01601f19169290920160200192915050565b8054600090600181811c908083168061305457607f831692505b602080841082141561307457634e487b7160e01b86526022600452602486fd5b8180156130885760018114613099576130c6565b60ff198616895284890196506130c6565b60008881526020902060005b868110156130be5781548b8201529085019083016130a5565b505084890196505b50505050505092915050565b60006130de828661303a565b8481526130ee602082018561303a565b9695505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906130ee90830184612fef565b6020808252825182820181905260009190848201906040850190845b8181101561316357835183529284019291840191600101613147565b50909695505050505050565b602081526000612cd46020830184612fef565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600082198211156131ca576131ca61327b565b500190565b6000826131ea57634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156132095761320961327b565b500290565b6000828210156132205761322061327b565b500390565b600181811c9082168061323957607f821691505b6020821081141561325a57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156132745761327461327b565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461103d57600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212204bb3ef41ce1b38c5ce3018a1469487611061f8d917d3515eba7c98f31c20994f64736f6c63430008040033
Deployed Bytecode Sourcemap
60426:6242:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40565:305;;;;;;;;;;-1:-1:-1;40565:305:0;;;;;:::i;:::-;;:::i;:::-;;;11561:14:1;;11554:22;11536:41;;11524:2;11509:18;40565:305:0;;;;;;;;63374:478;;;;;;:::i;:::-;;:::i;:::-;;43950:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;45453:204::-;;;;;;;;;;-1:-1:-1;45453:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;10219:32:1;;;10201:51;;10189:2;10174:18;45453:204:0;10156:102:1;45016:371:0;;;;;;;;;;-1:-1:-1;45016:371:0;;;;;:::i;:::-;;:::i;60845:45::-;;;;;;;;;;;;;;;;;;20795:25:1;;;20783:2;20768:18;60845:45:0;20750:76:1;39814:303:0;;;;;;;;;;-1:-1:-1;62181:1:0;40068:12;39858:7;40052:13;:28;-1:-1:-1;;40052:46:0;39814:303;;63860:547;;;;;;:::i;:::-;;:::i;61926:78::-;;;;;;;;;;;;;:::i;46310:170::-;;;;;;;;;;-1:-1:-1;46310:170:0;;;;;:::i;:::-;;:::i;58184:32::-;;;;;;;;;;-1:-1:-1;58184:32:0;;;;;:::i;:::-;;:::i;60664:34::-;;;;;;;;;;;;;;;;62012:77;;;;;;;;;;;;;:::i;60618:37::-;;;;;;;;;;;;;;;;61845:73;;;;;;;;;;;;;:::i;58914:450::-;;;;;;;;;;;;;:::i;58151:26::-;;;;;;;;;;-1:-1:-1;58151:26:0;;;;;:::i;:::-;;:::i;46551:185::-;;;;;;;;;;-1:-1:-1;46551:185:0;;;;;:::i;:::-;;:::i;65555:156::-;;;;;;;;;;-1:-1:-1;65555:156:0;;;;;:::i;:::-;;:::i;65719:946::-;;;;;;;;;;-1:-1:-1;65719:946:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;61551:92::-;;;;;;;;;;-1:-1:-1;61551:92:0;;;;;:::i;:::-;;:::i;43759:124::-;;;;;;;;;;-1:-1:-1;43759:124:0;;;;;:::i;:::-;;:::i;60576:35::-;;;;;;;;;;;;;;;;61088:21;;;;;;;;;;;;;:::i;61054:27::-;;;;;;;;;;;;;:::i;40934:206::-;;;;;;;;;;-1:-1:-1;40934:206:0;;;;;:::i;:::-;;:::i;17023:103::-;;;;;;;;;;;;;:::i;60746:41::-;;;;;;;;;;;;;;;16372:87;;;;;;;;;;-1:-1:-1;16445:6:0;;-1:-1:-1;;;;;16445:6:0;16372:87;;59484:141;;;;;;;;;;-1:-1:-1;59484:141:0;;;;;:::i;:::-;;:::i;44119:104::-;;;;;;;;;;;;;:::i;61152:20::-;;;;;;;;;;-1:-1:-1;61152:20:0;;;;;;;;60536:33;;;;;;;;;;;;;;;;45729:279;;;;;;;;;;-1:-1:-1;45729:279:0;;;;;:::i;:::-;;:::i;64415:547::-;;;;;;:::i;:::-;;:::i;61210:221::-;;;;;;;;;;-1:-1:-1;61210:221:0;;;;;:::i;:::-;;:::i;60794:44::-;;;;;;;;;;;;;;;61763:74;;;;;;;;;;;;;:::i;46807:369::-;;;;;;;;;;-1:-1:-1;46807:369:0;;;;;:::i;:::-;;:::i;61179:22::-;;;;;;;;;;-1:-1:-1;61179:22:0;;;;;;;;;;;61116:27;;;;;;;;;;;;;:::i;65117:430::-;;;;;;;;;;-1:-1:-1;65117:430:0;;;;;:::i;:::-;;:::i;60899:32::-;;;;;;;;;;;;;;;;61651:104;;;;;;;;;;-1:-1:-1;61651:104:0;;;;;:::i;:::-;;:::i;58410:496::-;;;;;;;;;;-1:-1:-1;58410:496:0;;;;;:::i;:::-;;:::i;46079:164::-;;;;;;;;;;-1:-1:-1;46079:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;46200:25:0;;;46176:4;46200:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;46079:164;17281:201;;;;;;;;;;-1:-1:-1;17281:201:0;;;;;:::i;:::-;;:::i;64970:139::-;;;;;;;;;;-1:-1:-1;64970:139:0;;;;;:::i;:::-;;:::i;58262:140::-;;;;;;;;;;-1:-1:-1;58262:140:0;;;;;:::i;:::-;;:::i;62198:307::-;;;;;;;;;;-1:-1:-1;62198:307:0;;;;;:::i;:::-;;:::i;61439:104::-;;;;;;;;;;-1:-1:-1;61439:104:0;;;;;:::i;:::-;;:::i;40565:305::-;40667:4;-1:-1:-1;;;;;;40704:40:0;;-1:-1:-1;;;40704:40:0;;:105;;-1:-1:-1;;;;;;;40761:48:0;;-1:-1:-1;;;40761:48:0;40704:105;:158;;;-1:-1:-1;;;;;;;;;;29265:40:0;;;40826:36;40684:178;40565:305;-1:-1:-1;;40565:305:0:o;63374:478::-;63553:5;;63501:17;;63542:7;63522:17;63532:7;63522;:17;:::i;:::-;:27;;;;:::i;:::-;63521:37;;;;:::i;:::-;63501:57;;63590:9;63577;:22;;63569:55;;;;-1:-1:-1;;;63569:55:0;;18043:2:1;63569:55:0;;;18025:21:1;18082:2;18062:18;;;18055:30;-1:-1:-1;;;18101:18:1;;;18094:50;18161:18;;63569:55:0;;;;;;;;;63643:8;;;;63635:37;;;;-1:-1:-1;;;63635:37:0;;19109:2:1;63635:37:0;;;19091:21:1;19148:2;19128:18;;;19121:30;-1:-1:-1;;;19167:18:1;;;19160:46;19223:18;;63635:37:0;19081:166:1;63635:37:0;63685:32;63691:7;63700;63709;63685:5;:32::i;:::-;63746:9;63734;:21;63730:115;;;63772:61;63798:10;63811:21;63823:9;63811;:21;:::i;:::-;63772:17;:61::i;:::-;63374:478;;;;:::o;43950:100::-;44004:13;44037:5;44030:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43950:100;:::o;45453:204::-;45521:7;45546:16;45554:7;45546;:16::i;:::-;45541:64;;45571:34;;-1:-1:-1;;;45571:34:0;;;;;;;;;;;45541:64;-1:-1:-1;45625:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;45625:24:0;;45453:204::o;45016:371::-;45089:13;45105:24;45121:7;45105:15;:24::i;:::-;45089:40;;45150:5;-1:-1:-1;;;;;45144:11:0;:2;-1:-1:-1;;;;;45144:11:0;;45140:48;;;45164:24;;-1:-1:-1;;;45164:24:0;;;;;;;;;;;45140:48;15176:10;-1:-1:-1;;;;;45205:21:0;;;;;;:63;;-1:-1:-1;45231:37:0;45248:5;15176:10;46079:164;:::i;45231:37::-;45230:38;45205:63;45201:138;;;45292:35;;-1:-1:-1;;;45292:35:0;;;;;;;;;;;45201:138;45351:28;45360:2;45364:7;45373:5;45351:8;:28::i;:::-;45016:371;;;:::o;63860:547::-;60058:7;;64024:4;;;;-1:-1:-1;;;;;60058:7:0;60050:50;;;;-1:-1:-1;;;60050:50:0;;19802:2:1;60050:50:0;;;19784:21:1;19841:2;19821:18;;;19814:30;-1:-1:-1;;;19860:18:1;;;19853:46;19916:18;;60050:50:0;19774:166:1;60050:50:0;60151:7;;-1:-1:-1;;;;;60151:7:0;60119:28;60137:9;;60119:17;:28::i;:::-;-1:-1:-1;;;;;60119:39:0;;60111:69;;;;-1:-1:-1;;;60111:69:0;;13175:2:1;60111:69:0;;;13157:21:1;13214:2;13194:18;;;13187:30;-1:-1:-1;;;13233:18:1;;;13226:47;13290:18;;60111:69:0;13147:167:1;60111:69:0;64093:8:::1;::::0;64041:17:::1;::::0;64082:7;64062:17:::1;64072:7:::0;64062;:17:::1;:::i;:::-;:27;;;;:::i;:::-;64061:40;;;;:::i;:::-;64041:60;;64133:9;64120;:22;;64112:55;;;::::0;-1:-1:-1;;;64112:55:0;;18043:2:1;64112:55:0::1;::::0;::::1;18025:21:1::0;18082:2;18062:18;;;18055:30;-1:-1:-1;;;18101:18:1;;;18094:50;18161:18;;64112:55:0::1;18015:170:1::0;64112:55:0::1;64186:10;::::0;::::1;::::0;::::1;;;64178:49;;;::::0;-1:-1:-1;;;64178:49:0;;17688:2:1;64178:49:0::1;::::0;::::1;17670:21:1::0;17727:2;17707:18;;;17700:30;17766:28;17746:18;;;17739:56;17812:18;;64178:49:0::1;17660:176:1::0;64178:49:0::1;64240:32;64246:7;64255;64264;64240:5;:32::i;:::-;64301:9;64289;:21;64285:115;;;64327:61;64353:10;64366:21;64378:9:::0;64366::::1;:21;:::i;64327:61::-;60191:1;63860:547:::0;;;;;;;:::o;61926:78::-;16445:6;;-1:-1:-1;;;;;16445:6:0;15176:10;16592:23;16584:68;;;;-1:-1:-1;;;16584:68:0;;;;;;;:::i;:::-;61979:10:::1;:17:::0;;-1:-1:-1;;61979:17:0::1;;;::::0;;61926:78::o;46310:170::-;46444:28;46454:4;46460:2;46464:7;46444:9;:28::i;58184:32::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58184:32:0;:::o;62012:77::-;16445:6;;-1:-1:-1;;;;;16445:6:0;15176:10;16592:23;16584:68;;;;-1:-1:-1;;;16584:68:0;;;;;;;:::i;:::-;62063:10:::1;:18:::0;;-1:-1:-1;;62063:18:0::1;::::0;;62012:77::o;61845:73::-;16445:6;;-1:-1:-1;;;;;16445:6:0;15176:10;16592:23;16584:68;;;;-1:-1:-1;;;16584:68:0;;;;;;;:::i;:::-;61894:8:::1;:16:::0;;-1:-1:-1;;61894:16:0::1;::::0;;61845:73::o;58914:450::-;16445:6;;-1:-1:-1;;;;;16445:6:0;15176:10;16592:23;16584:68;;;;-1:-1:-1;;;16584:68:0;;;;;;;:::i;:::-;58970:15:::1;:22:::0;58962:61:::1;;;::::0;-1:-1:-1;;;58962:61:0;;20500:2:1;58962:61:0::1;::::0;::::1;20482:21:1::0;20539:2;20519:18;;;20512:30;-1:-1:-1;;;20558:18:1;;;20551:52;20620:18;;58962:61:0::1;20472:172:1::0;58962:61:0::1;59050:21;59036:11;59084:273;59108:9;:16:::0;59104:20;::::1;59084:273;;;59171:1;59150:15;59166:1;59150:18;;;;;;-1:-1:-1::0;;;59150:18:0::1;;;;;;;;;;;;;;;;;:22;59146:200;;;59193:137;59241:9;59251:1;59241:12;;;;;;-1:-1:-1::0;;;59241:12:0::1;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;59241:12:0::1;59306:5;59284:15;59300:1;59284:18;;;;;;-1:-1:-1::0;;;59284:18:0::1;;;;;;;;;;;;;;;;;59278:3;:24;;;;:::i;:::-;59277:34;;;;:::i;59193:137::-;59126:3:::0;::::1;::::0;::::1;:::i;:::-;;;;59084:273;;;;16663:1;58914:450::o:0;58151:26::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;58151:26:0;;-1:-1:-1;58151:26:0;:::o;46551:185::-;46689:39;46706:4;46712:2;46716:7;46689:39;;;;;;;;;;;;:16;:39::i;65555:156::-;65634:10;65614:16;65622:7;65614;:16::i;:::-;-1:-1:-1;;;;;65614:30:0;;65606:70;;;;-1:-1:-1;;;65606:70:0;;18392:2:1;65606:70:0;;;18374:21:1;18431:2;18411:18;;;18404:30;18470:29;18450:18;;;18443:57;18517:18;;65606:70:0;18364:177:1;65606:70:0;65689:14;65695:7;65689:5;:14::i;:::-;65555:156;:::o;65719:946::-;65806:16;65840:23;65866:17;65876:6;65866:9;:17::i;:::-;65840:43;;65894:30;65941:15;-1:-1:-1;;;;;65927:30:0;;;;;-1:-1:-1;;;65927:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65927:30:0;-1:-1:-1;65894:63:0;-1:-1:-1;62181:1:0;65968:22;;66096:529;66135:15;66117;:33;:64;;;;;66172:9;;66154:14;:27;;66117:64;66096:529;;;66208:31;66242:27;;;:11;:27;;;;;;;;;66208:61;;;;;;;;;-1:-1:-1;;;;;66208:61:0;;;;-1:-1:-1;;;66208:61:0;;-1:-1:-1;;;;;66208:61:0;;;;;;;;-1:-1:-1;;;66208:61:0;;;;;;;;;;;;;;;;66290:49;;-1:-1:-1;66311:14:0;;-1:-1:-1;;;;;66311:28:0;;;66290:49;66286:125;;;66381:14;;;-1:-1:-1;66286:125:0;66453:6;-1:-1:-1;;;;;66431:28:0;:18;-1:-1:-1;;;;;66431:28:0;;66427:154;;;66513:14;66480:13;66494:15;66480:30;;;;;;-1:-1:-1;;;66480:30:0;;;;;;;;;;;;;;;;;;:47;66548:17;;;;:::i;:::-;;;;66427:154;66597:16;;;;:::i;:::-;;;;66096:529;;;;-1:-1:-1;66644:13:0;;65719:946;-1:-1:-1;;;;;65719:946:0:o;61551:92::-;16445:6;;-1:-1:-1;;;;;16445:6:0;15176:10;16592:23;16584:68;;;;-1:-1:-1;;;16584:68:0;;;;;;;:::i;:::-;61621:14;;::::1;::::0;:7:::1;::::0;:14:::1;::::0;::::1;::::0;::::1;:::i;43759:124::-:0;43823:7;43850:20;43862:7;43850:11;:20::i;:::-;:25;;43759:124;-1:-1:-1;;43759:124:0:o;61088:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;61054:27::-;;;;;;;:::i;40934:206::-;40998:7;-1:-1:-1;;;;;41022:19:0;;41018:60;;41050:28;;-1:-1:-1;;;41050:28:0;;;;;;;;;;;41018:60;-1:-1:-1;;;;;;41104:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;41104:27:0;;40934:206::o;17023:103::-;16445:6;;-1:-1:-1;;;;;16445:6:0;15176:10;16592:23;16584:68;;;;-1:-1:-1;;;16584:68:0;;;;;;;:::i;:::-;17088:30:::1;17115:1;17088:18;:30::i;:::-;17023:103::o:0;59484:141::-;16445:6;;-1:-1:-1;;;;;16445:6:0;15176:10;16592:23;16584:68;;;;-1:-1:-1;;;16584:68:0;;;;;;;:::i;:::-;59570:7:::1;:18:::0;;-1:-1:-1;;;;;59570:18:0;;::::1;-1:-1:-1::0;;;;;;59570:18:0;;::::1;;::::0;;;59599:7:::1;:18:::0;;;;;::::1;::::0;::::1;;::::0;;59484:141::o;44119:104::-;44175:13;44208:7;44201:14;;;;;:::i;45729:279::-;-1:-1:-1;;;;;45820:24:0;;15176:10;45820:24;45816:54;;;45853:17;;-1:-1:-1;;;45853:17:0;;;;;;;;;;;45816:54;15176:10;45883:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;45883:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;45883:53:0;;;;;;;;;;45952:48;;11536:41:1;;;45883:42:0;;15176:10;45952:48;;11509:18:1;45952:48:0;;;;;;;45729:279;;:::o;64415:547::-;60277:7;;64579:4;;;;-1:-1:-1;;;;;60277:7:0;60269:50;;;;-1:-1:-1;;;60269:50:0;;14701:2:1;60269:50:0;;;14683:21:1;14740:2;14720:18;;;14713:30;-1:-1:-1;;;14759:18:1;;;14752:46;14815:18;;60269:50:0;14673:166:1;60269:50:0;60370:7;;-1:-1:-1;;;;;60370:7:0;60338:28;60356:9;;60338:17;:28::i;:::-;-1:-1:-1;;;;;60338:39:0;;60330:69;;;;-1:-1:-1;;;60330:69:0;;16939:2:1;60330:69:0;;;16921:21:1;16978:2;16958:18;;;16951:30;-1:-1:-1;;;16997:18:1;;;16990:47;17054:18;;60330:69:0;16911:167:1;60330:69:0;64648:8:::1;::::0;64596:17:::1;::::0;64637:7;64617:17:::1;64627:7:::0;64617;:17:::1;:::i;61210:221::-:0;16445:6;;-1:-1:-1;;;;;16445:6:0;15176:10;16592:23;16584:68;;;;-1:-1:-1;;;16584:68:0;;;;;;;:::i;:::-;61347:5:::1;:14:::0;;;;61372:8:::1;:20:::0;61403:8:::1;:20:::0;61210:221::o;61763:74::-;16445:6;;-1:-1:-1;;;;;16445:6:0;15176:10;16592:23;16584:68;;;;-1:-1:-1;;;16584:68:0;;;;;;;:::i;:::-;61814:8:::1;:15:::0;;-1:-1:-1;;61814:15:0::1;61825:4;61814:15;::::0;;61763:74::o;46807:369::-;46974:28;46984:4;46990:2;46994:7;46974:9;:28::i;:::-;-1:-1:-1;;;;;47017:13:0;;19368:19;:23;;47017:76;;;;;47037:56;47068:4;47074:2;47078:7;47087:5;47037:30;:56::i;:::-;47036:57;47017:76;47013:156;;;47117:40;;-1:-1:-1;;;47117:40:0;;;;;;;;;;;61116:27;;;;;;;:::i;65117:430::-;65218:13;65257:16;65265:7;65257;:16::i;:::-;65249:49;;;;-1:-1:-1;;;65249:49:0;;15046:2:1;65249:49:0;;;15028:21:1;15085:2;15065:18;;;15058:30;-1:-1:-1;;;15104:18:1;;;15097:50;15164:18;;65249:49:0;15018:170:1;65249:49:0;65333:24;65349:7;65333:15;:24::i;:::-;65315:15;:42;65311:95;;;65381:13;65374:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65117:430;;;:::o;65311:95::-;65480:7;65489:10;:19;65500:7;65489:19;;;;;;;;;;;;65510:13;65463:61;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65418:121;;65117:430;;;:::o;61651:104::-;16445:6;;-1:-1:-1;;;;;16445:6:0;15176:10;16592:23;16584:68;;;;-1:-1:-1;;;16584:68:0;;;;;;;:::i;:::-;61727:20;;::::1;::::0;:13:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;58410:496::-:0;16445:6;;-1:-1:-1;;;;;16445:6:0;15176:10;16592:23;16584:68;;;;-1:-1:-1;;;16584:68:0;;;;;;;:::i;:::-;58537:9:::1;:16:::0;58518:35;::::1;58496:129;;;::::0;-1:-1:-1;;;58496:129:0;;13881:2:1;58496:129:0::1;::::0;::::1;13863:21:1::0;13920:2;13900:18;;;13893:30;13959:34;13939:18;;;13932:62;-1:-1:-1;;;14010:18:1;;;14003:42;14062:19;;58496:129:0::1;13853:234:1::0;58496:129:0::1;58638:11;58669:9:::0;58664:91:::1;58684:19:::0;;::::1;58664:91;;;58732:8;;58741:1;58732:11;;;;;-1:-1:-1::0;;;58732:11:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58725:18;::::0;::::1;;::::0;::::1;:::i;:::-;::::0;-1:-1:-1;58705:3:0;::::1;::::0;::::1;:::i;:::-;;;;58664:91;;;;58773:3;58780:5;58773:12;58765:61;;;::::0;-1:-1:-1;;;58765:61:0;;12770:2:1;58765:61:0::1;::::0;::::1;12752:21:1::0;12809:2;12789:18;;;12782:30;12848:34;12828:18;;;12821:62;-1:-1:-1;;;12899:18:1;;;12892:34;12943:19;;58765:61:0::1;12742:226:1::0;58765:61:0::1;58839:22;58846:15;;58839:22;:::i;:::-;58872:26;:15;58890:8:::0;;58872:26:::1;:::i;17281:201::-:0;16445:6;;-1:-1:-1;;;;;16445:6:0;15176:10;16592:23;16584:68;;;;-1:-1:-1;;;16584:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;17370:22:0;::::1;17362:73;;;::::0;-1:-1:-1;;;17362:73:0;;14294:2:1;17362:73:0::1;::::0;::::1;14276:21:1::0;14333:2;14313:18;;;14306:30;14372:34;14352:18;;;14345:62;-1:-1:-1;;;14423:18:1;;;14416:36;14469:19;;17362:73:0::1;14266:228:1::0;17362:73:0::1;17446:28;17465:8;17446:18;:28::i;64970:139::-:0;16445:6;;-1:-1:-1;;;;;16445:6:0;15176:10;16592:23;16584:68;;;;-1:-1:-1;;;16584:68:0;;;;;;;:::i;:::-;65049:21:::1;65059:2;65063:6;65049:9;:21::i;:::-;65095:6;65081:10;;:20;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;64970:139:0:o;58262:140::-;16445:6;;-1:-1:-1;;;;;16445:6:0;15176:10;16592:23;16584:68;;;;-1:-1:-1;;;16584:68:0;;;;;;;:::i;:::-;58345:16:::1;58352:9;;58345:16;:::i;:::-;58372:22;:9;58384:10:::0;;58372:22:::1;:::i;62198:307::-:0;62261:7;62289:16;62297:7;62289;:16::i;:::-;62281:49;;;;-1:-1:-1;;;62281:49:0;;15046:2:1;62281:49:0;;;15028:21:1;15085:2;15065:18;;;15058:30;-1:-1:-1;;;15104:18:1;;;15097:50;15164:18;;62281:49:0;15018:170:1;62281:49:0;62356:7;62374:84;62381:20;;;;:16;:20;;;;;;:25;:44;;;;;62415:10;;62410:2;:15;62381:44;62374:84;;;62442:4;;;;:::i;:::-;;;;62374:84;;;62477:20;;;;:16;:20;;;;;;;62198:307;-1:-1:-1;;62198:307:0:o;61439:104::-;16445:6;;-1:-1:-1;;;;;16445:6:0;15176:10;16592:23;16584:68;;;;-1:-1:-1;;;16584:68:0;;;;;;;:::i;:::-;61515:20;;::::1;::::0;:13:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;62513:853::-:0;62633:17;62673:7;62653:17;62663:7;62653;:17;:::i;:::-;:27;;;;:::i;:::-;62633:47;;62714:1;62701:9;:14;;:32;;;;;62732:1;62719:9;:14;;62701:32;62693:64;;;;-1:-1:-1;;;62693:64:0;;19454:2:1;62693:64:0;;;19436:21:1;19493:2;19473:18;;;19466:30;-1:-1:-1;;;19512:18:1;;;19505:49;19571:18;;62693:64:0;19426:169:1;62693:64:0;62815:15;;62790:21;62800:10;62790:9;:21::i;:::-;:40;;62768:117;;;;-1:-1:-1;;;62768:117:0;;16583:2:1;62768:117:0;;;16565:21:1;16622:2;16602:18;;;16595:30;16661:29;16641:18;;;16634:57;16708:18;;62768:117:0;16555:177:1;62768:117:0;62946:9;;62933;62920:10;;:22;;;;:::i;:::-;:35;;62898:109;;;;-1:-1:-1;;;62898:109:0;;20147:2:1;62898:109:0;;;20129:21:1;20186:2;20166:18;;;20159:30;20225:26;20205:18;;;20198:54;20269:18;;62898:109:0;20119:174:1;62898:109:0;63020:32;63030:10;63042:9;63020;:32::i;:::-;63079:7;63065:10;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;63128:25:0;;-1:-1:-1;63146:7:0;63128:15;:25;:::i;:::-;63114:10;;;63097:28;;;;:16;:28;;;;;:56;;;;63166:21;;63180:7;;63097:28;63166:21;;63180:7;;63166:21;:::i;:::-;;;;-1:-1:-1;63229:26:0;;-1:-1:-1;63247:8:0;63229:15;:26;:::i;:::-;63215:10;;;63198:28;;;;:16;:28;;;;;:57;;;;63268:21;;63282:7;;63198:28;63268:21;;63282:7;;63268:21;:::i;:::-;;;;-1:-1:-1;63331:27:0;;-1:-1:-1;63349:9:0;63331:15;:27;:::i;:::-;63317:10;;63300:28;;;;:16;:28;;;;;:58;-1:-1:-1;;;;62513:853:0:o;20334:317::-;20449:6;20424:21;:31;;20416:73;;;;-1:-1:-1;;;20416:73:0;;16225:2:1;20416:73:0;;;16207:21:1;16264:2;16244:18;;;16237:30;16303:31;16283:18;;;16276:59;16352:18;;20416:73:0;16197:179:1;20416:73:0;20503:12;20521:9;-1:-1:-1;;;;;20521:14:0;20543:6;20521:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20502:52;;;20573:7;20565:78;;;;-1:-1:-1;;;20565:78:0;;15395:2:1;20565:78:0;;;15377:21:1;15434:2;15414:18;;;15407:30;15473:34;15453:18;;;15446:62;15544:28;15524:18;;;15517:56;15590:19;;20565:78:0;15367:248:1;47431:187:0;47488:4;47531:7;62181:1;47512:26;;:53;;;;;47552:13;;47542:7;:23;47512:53;:98;;;;-1:-1:-1;;47583:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;47583:27:0;;;;47582:28;;47431:187::o;55042:196::-;55157:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;55157:29:0;-1:-1:-1;;;;;55157:29:0;;;;;;;;;55202:28;;55157:24;;55202:28;;;;;;;55042:196;;;:::o;59633:348::-;59786:34;;-1:-1:-1;;59803:4:0;8973:2:1;8969:15;;;8965:24;;59786:34:0;;;8953:37:1;59809:10:0;9024:15:1;;9020:24;9006:12;;;8999:46;59736:7:0;;;;9061:12:1;;59786:34:0;;;-1:-1:-1;;59786:34:0;;;;;;;;;;59776:45;;59786:34;59776:45;;;;9702:66:1;59863:58:0;;;9690:79:1;;;;9785:12;;;9778:28;;;59776:45:0;-1:-1:-1;9822:12:1;;59863:58:0;;;;;;;;;;;;59839:93;;;;;;59832:100;;59950:23;59963:9;;59950:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59950:4:0;;:23;-1:-1:-1;;59950:12:0;:23;-1:-1:-1;59950:23:0:i;:::-;59943:30;59633:348;-1:-1:-1;;;;59633:348:0:o;50544:2112::-;50659:35;50697:20;50709:7;50697:11;:20::i;:::-;50772:18;;50659:58;;-1:-1:-1;50730:22:0;;-1:-1:-1;;;;;50756:34:0;15176:10;-1:-1:-1;;;;;50756:34:0;;:101;;;-1:-1:-1;50824:18:0;;50807:50;;15176:10;46079:164;:::i;50807:50::-;50756:154;;;-1:-1:-1;15176:10:0;50874:20;50886:7;50874:11;:20::i;:::-;-1:-1:-1;;;;;50874:36:0;;50756:154;50730:181;;50929:17;50924:66;;50955:35;;-1:-1:-1;;;50955:35:0;;;;;;;;;;;50924:66;51027:4;-1:-1:-1;;;;;51005:26:0;:13;:18;;;-1:-1:-1;;;;;51005:26:0;;51001:67;;51040:28;;-1:-1:-1;;;51040:28:0;;;;;;;;;;;51001:67;-1:-1:-1;;;;;51083:16:0;;51079:52;;51108:23;;-1:-1:-1;;;51108:23:0;;;;;;;;;;;51079:52;51252:49;51269:1;51273:7;51282:13;:18;;;51252:8;:49::i;:::-;-1:-1:-1;;;;;51597:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;51597:31:0;;;-1:-1:-1;;;;;51597:31:0;;;-1:-1:-1;;51597:31:0;;;;;;;51643:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;51643:29:0;;;;;;;;;;;51689:20;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;51734:61:0;;;;-1:-1:-1;;;51779:15:0;51734:61;;;;;;;;;;;52069:11;;;52099:24;;;;;:29;52069:11;;52099:29;52095:445;;52324:13;;52310:11;:27;52306:219;;;52394:18;;;52362:24;;;:11;:24;;;;;;;;:50;;52477:28;;;;-1:-1:-1;;;;;52435:70:0;-1:-1:-1;;;52435:70:0;-1:-1:-1;;;;;;52435:70:0;;;-1:-1:-1;;;;;52362:50:0;;;52435:70;;;;;;;52306:219;50544:2112;52587:7;52583:2;-1:-1:-1;;;;;52568:27:0;52577:4;-1:-1:-1;;;;;52568:27:0;-1:-1:-1;;;;;;;;;;;52568:27:0;;;;;;;;;52606:42;50544:2112;;;;;:::o;52885:2039::-;52945:35;52983:20;52995:7;52983:11;:20::i;:::-;52945:58;-1:-1:-1;53146:49:0;53163:1;53167:7;53176:13;:18;;;53146:8;:49::i;:::-;53504:18;;-1:-1:-1;;;;;53491:32:0;;;;;;;:12;:32;;;;;;;;:45;;-1:-1:-1;;53491:45:0;;-1:-1:-1;;;;;53491:45:0;;;-1:-1:-1;;53491:45:0;;;;;;;53564:18;;53551:32;;;;;;;:50;;-1:-1:-1;;;;53551:50:0;;-1:-1:-1;;;53551:50:0;;;;;;-1:-1:-1;53551:50:0;;;;;;;;;;;;53728:18;;53700:20;;;:11;:20;;;;;;:46;;-1:-1:-1;;;53700:46:0;;;-1:-1:-1;;;;;;53761:61:0;;;;-1:-1:-1;;;53806:15:0;53761:61;;;;;;;;;;;-1:-1:-1;;;;53837:34:0;;;;;;;54141:11;;;54171:24;;;;;:29;54141:11;;54171:29;54167:445;;54396:13;;54382:11;:27;54378:219;;;54466:18;;;54434:24;;;:11;:24;;;;;;;;:50;;54549:28;;;;-1:-1:-1;;;;;54507:70:0;-1:-1:-1;;;54507:70:0;-1:-1:-1;;;;;;54507:70:0;;;-1:-1:-1;;;;;54434:50:0;;;54507:70;;;;;;;54378:219;-1:-1:-1;54649:18:0;;54640:49;;54681:7;;54677:1;;-1:-1:-1;;;;;54640:49:0;;;;-1:-1:-1;;;;;;;;;;;54640:49:0;54677:1;;54640:49;-1:-1:-1;;54891:12:0;:14;;;;;;52885:2039::o;42589:1108::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;42699:7:0;;62181:1;42748:23;;:47;;;;;42782:13;;42775:4;:20;42748:47;42744:886;;;42816:31;42850:17;;;:11;:17;;;;;;;;;42816:51;;;;;;;;;-1:-1:-1;;;;;42816:51:0;;;;-1:-1:-1;;;42816:51:0;;-1:-1:-1;;;;;42816:51:0;;;;;;;;-1:-1:-1;;;42816:51:0;;;;;;;;;;;;;;42886:729;;42936:14;;-1:-1:-1;;;;;42936:28:0;;42932:101;;43000:9;42589:1108;-1:-1:-1;;;42589:1108:0:o;42932:101::-;-1:-1:-1;;;43375:6:0;43420:17;;;;:11;:17;;;;;;;;;43408:29;;;;;;;;;-1:-1:-1;;;;;43408:29:0;;;;;-1:-1:-1;;;43408:29:0;;-1:-1:-1;;;;;43408:29:0;;;;;;;;-1:-1:-1;;;43408:29:0;;;;;;;;;;;;;43468:28;43464:109;;43536:9;42589:1108;-1:-1:-1;;;42589:1108:0:o;43464:109::-;43335:261;;;42744:886;;43658:31;;-1:-1:-1;;;43658:31:0;;;;;;;;;;;17642:191;17735:6;;;-1:-1:-1;;;;;17752:17:0;;;-1:-1:-1;;;;;;17752:17:0;;;;;;;17785:40;;17735:6;;;17752:17;17735:6;;17785:40;;17716:16;;17785:40;17642:191;;:::o;55730:667::-;55914:72;;-1:-1:-1;;;55914:72:0;;55893:4;;-1:-1:-1;;;;;55914:36:0;;;;;:72;;15176:10;;55965:4;;55971:7;;55980:5;;55914:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55914:72:0;;;;;;;;-1:-1:-1;;55914:72:0;;;;;;;;;;;;:::i;:::-;;;55910:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56148:13:0;;56144:235;;56194:40;;-1:-1:-1;;;56194:40:0;;;;;;;;;;;56144:235;56337:6;56331:13;56322:6;56318:2;56314:15;56307:38;55910:480;-1:-1:-1;;;;;;56033:55:0;-1:-1:-1;;;56033:55:0;;-1:-1:-1;55730:667:0;;;;;;:::o;47626:104::-;47695:27;47705:2;47709:8;47695:27;;;;;;;;;;;;:9;:27::i;9300:231::-;9378:7;9399:17;9418:18;9440:27;9451:4;9457:9;9440:10;:27::i;:::-;9398:69;;;;9478:18;9490:5;9478:11;:18::i;:::-;-1:-1:-1;9514:9:0;9300:231;-1:-1:-1;;;9300:231:0:o;48093:163::-;48216:32;48222:2;48226:8;48236:5;48243:4;48216:5;:32::i;7190:1308::-;7271:7;7280:12;7505:9;:16;7525:2;7505:22;7501:990;;;7801:4;7786:20;;7780:27;7851:4;7836:20;;7830:27;7909:4;7894:20;;7888:27;7544:9;7880:36;7952:25;7963:4;7880:36;7780:27;7830;7952:10;:25::i;:::-;7945:32;;;;;;;;;7501:990;7999:9;:16;8019:2;7999:22;7995:496;;;8274:4;8259:20;;8253:27;8325:4;8310:20;;8304:27;8367:23;8378:4;8253:27;8304;8367:10;:23::i;:::-;8360:30;;;;;;;;7995:496;-1:-1:-1;8439:1:0;;-1:-1:-1;8443:35:0;7995:496;7190:1308;;;;;:::o;5461:643::-;5539:20;5530:5;:29;;;;;;-1:-1:-1;;;5530:29:0;;;;;;;;;;5526:571;;;5461:643;:::o;5526:571::-;5637:29;5628:5;:38;;;;;;-1:-1:-1;;;5628:38:0;;;;;;;;;;5624:473;;;5683:34;;-1:-1:-1;;;5683:34:0;;12417:2:1;5683:34:0;;;12399:21:1;12456:2;12436:18;;;12429:30;12495:26;12475:18;;;12468:54;12539:18;;5683:34:0;12389:174:1;5624:473:0;5748:35;5739:5;:44;;;;;;-1:-1:-1;;;5739:44:0;;;;;;;;;;5735:362;;;5800:41;;-1:-1:-1;;;5800:41:0;;13521:2:1;5800:41:0;;;13503:21:1;13560:2;13540:18;;;13533:30;13599:33;13579:18;;;13572:61;13650:18;;5800:41:0;13493:181:1;5735:362:0;5872:30;5863:5;:39;;;;;;-1:-1:-1;;;5863:39:0;;;;;;;;;;5859:238;;;5919:44;;-1:-1:-1;;;5919:44:0;;15822:2:1;5919:44:0;;;15804:21:1;15861:2;15841:18;;;15834:30;15900:34;15880:18;;;15873:62;-1:-1:-1;;;15951:18:1;;;15944:32;15993:19;;5919:44:0;15794:224:1;5859:238:0;5994:30;5985:5;:39;;;;;;-1:-1:-1;;;5985:39:0;;;;;;;;;;5981:116;;;6041:44;;-1:-1:-1;;;6041:44:0;;17285:2:1;6041:44:0;;;17267:21:1;17324:2;17304:18;;;17297:30;17363:34;17343:18;;;17336:62;-1:-1:-1;;;17414:18:1;;;17407:32;17456:19;;6041:44:0;17257:224:1;48515:1775:0;48654:20;48677:13;-1:-1:-1;;;;;48705:16:0;;48701:48;;48730:19;;-1:-1:-1;;;48730:19:0;;;;;;;;;;;48701:48;48764:13;48760:44;;48786:18;;-1:-1:-1;;;48786:18:0;;;;;;;;;;;48760:44;-1:-1:-1;;;;;49155:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;49214:49:0;;-1:-1:-1;;;;;49155:44:0;;;;;;;49214:49;;;;-1:-1:-1;;49155:44:0;;;;;;49214:49;;;;;;;;;;;;;;;;49280:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;49330:66:0;;;;-1:-1:-1;;;49380:15:0;49330:66;;;;;;;;;;49280:25;49477:23;;;49521:4;:23;;;;-1:-1:-1;;;;;;49529:13:0;;19368:19;:23;;49529:15;49517:641;;;49565:314;49596:38;;49621:12;;-1:-1:-1;;;;;49596:38:0;;;49613:1;;-1:-1:-1;;;;;;;;;;;49596:38:0;49613:1;;49596:38;49662:69;49701:1;49705:2;49709:14;;;;;;49725:5;49662:30;:69::i;:::-;49657:174;;49767:40;;-1:-1:-1;;;49767:40:0;;;;;;;;;;;49657:174;49874:3;49858:12;:19;;49565:314;;49960:12;49943:13;;:29;49939:43;;49974:8;;;49939:43;49517:641;;;50023:120;50054:40;;50079:14;;;;;-1:-1:-1;;;;;50054:40:0;;;50071:1;;-1:-1:-1;;;;;;;;;;;50054:40:0;50071:1;;50054:40;50138:3;50122:12;:19;;50023:120;;49517:641;-1:-1:-1;50172:13:0;:28;50222:60;63374:478;10752:1632;10883:7;;11817:66;11804:79;;11800:163;;;-1:-1:-1;11916:1:0;;-1:-1:-1;11920:30:0;11900:51;;11800:163;11977:1;:7;;11982:2;11977:7;;:18;;;;;11988:1;:7;;11993:2;11988:7;;11977:18;11973:102;;;-1:-1:-1;12028:1:0;;-1:-1:-1;12032:30:0;12012:51;;11973:102;12189:24;;;12172:14;12189:24;;;;;;;;;11815:25:1;;;11888:4;11876:17;;11856:18;;;11849:45;;;;11910:18;;;11903:34;;;11953:18;;;11946:34;;;12189:24:0;;11787:19:1;;12189:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;12189:24:0;;-1:-1:-1;;12189:24:0;;;-1:-1:-1;;;;;;;12228:20:0;;12224:103;;12281:1;12285:29;12265:50;;;;;;;12224:103;12347:6;-1:-1:-1;12355:20:0;;-1:-1:-1;10752:1632:0;;;;;;;;:::o;9794:344::-;9908:7;;-1:-1:-1;;;;;9954:80:0;;9908:7;10061:25;10077:3;10062:18;;;10084:2;10061:25;:::i;:::-;10045:42;;10105:25;10116:4;10122:1;10125;10128;10105:10;:25::i;:::-;10098:32;;;;;;9794:344;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:631:1;78:5;-1:-1:-1;;;;;149:2:1;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:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:2;;813:1;810;803:12;747:2;699:124;;;:::o;828:391::-;891:8;901:6;955:3;948:4;940:6;936:17;932:27;922:2;;978:6;970;963:22;922:2;-1:-1:-1;1006:20:1;;-1:-1:-1;;;;;1038:30:1;;1035:2;;;1088:8;1078;1071:26;1035:2;1132:4;1124:6;1120:17;1108:29;;1192:3;1185:4;1175:6;1172:1;1168:14;1160:6;1156:27;1152:38;1149:47;1146:2;;;1209:1;1206;1199:12;1224:196;1283:6;1336:2;1324:9;1315:7;1311:23;1307:32;1304:2;;;1357:6;1349;1342:22;1304:2;1385:29;1404:9;1385:29;:::i;:::-;1375:39;1294:126;-1:-1:-1;;;1294:126:1:o;1425:270::-;1493:6;1501;1554:2;1542:9;1533:7;1529:23;1525:32;1522:2;;;1575:6;1567;1560:22;1522:2;1603:29;1622:9;1603:29;:::i;:::-;1593:39;;1651:38;1685:2;1674:9;1670:18;1651:38;:::i;:::-;1641:48;;1512:183;;;;;:::o;1700:338::-;1777:6;1785;1793;1846:2;1834:9;1825:7;1821:23;1817:32;1814:2;;;1867:6;1859;1852:22;1814:2;1895:29;1914:9;1895:29;:::i;:::-;1885:39;;1943:38;1977:2;1966:9;1962:18;1943:38;:::i;:::-;1933:48;;2028:2;2017:9;2013:18;2000:32;1990:42;;1804:234;;;;;:::o;2043:696::-;2138:6;2146;2154;2162;2215:3;2203:9;2194:7;2190:23;2186:33;2183:2;;;2237:6;2229;2222:22;2183:2;2265:29;2284:9;2265:29;:::i;:::-;2255:39;;2313:38;2347:2;2336:9;2332:18;2313:38;:::i;:::-;2303:48;;2398:2;2387:9;2383:18;2370:32;2360:42;;2453:2;2442:9;2438:18;2425:32;-1:-1:-1;;;;;2472:6:1;2469:30;2466:2;;;2517:6;2509;2502:22;2466:2;2545:22;;2598:4;2590:13;;2586:27;-1:-1:-1;2576:2:1;;2632:6;2624;2617:22;2576:2;2660:73;2725:7;2720:2;2707:16;2702:2;2698;2694:11;2660:73;:::i;:::-;2650:83;;;2173:566;;;;;;;:::o;2744:367::-;2809:6;2817;2870:2;2858:9;2849:7;2845:23;2841:32;2838:2;;;2891:6;2883;2876:22;2838:2;2919:29;2938:9;2919:29;:::i;:::-;2909:39;;2998:2;2987:9;2983:18;2970:32;3045:5;3038:13;3031:21;3024:5;3021:32;3011:2;;3072:6;3064;3057:22;3011:2;3100:5;3090:15;;;2828:283;;;;;:::o;3116:264::-;3184:6;3192;3245:2;3233:9;3224:7;3220:23;3216:32;3213:2;;;3266:6;3258;3251:22;3213:2;3294:29;3313:9;3294:29;:::i;:::-;3284:39;3370:2;3355:18;;;;3342:32;;-1:-1:-1;;;3203:177:1:o;3385:457::-;3471:6;3479;3532:2;3520:9;3511:7;3507:23;3503:32;3500:2;;;3553:6;3545;3538:22;3500:2;3598:9;3585:23;-1:-1:-1;;;;;3623:6:1;3620:30;3617:2;;;3668:6;3660;3653:22;3617:2;3712:70;3774:7;3765:6;3754:9;3750:22;3712:70;:::i;:::-;3801:8;;3686:96;;-1:-1:-1;3490:352:1;-1:-1:-1;;;;3490:352:1:o;4308:255::-;4366:6;4419:2;4407:9;4398:7;4394:23;4390:32;4387:2;;;4440:6;4432;4425:22;4387:2;4484:9;4471:23;4503:30;4527:5;4503:30;:::i;4568:259::-;4637:6;4690:2;4678:9;4669:7;4665:23;4661:32;4658:2;;;4711:6;4703;4696:22;4658:2;4748:9;4742:16;4767:30;4791:5;4767:30;:::i;4832:480::-;4901:6;4954:2;4942:9;4933:7;4929:23;4925:32;4922:2;;;4975:6;4967;4960:22;4922:2;5020:9;5007:23;-1:-1:-1;;;;;5045:6:1;5042:30;5039:2;;;5090:6;5082;5075:22;5039:2;5118:22;;5171:4;5163:13;;5159:27;-1:-1:-1;5149:2:1;;5205:6;5197;5190:22;5149:2;5233:73;5298:7;5293:2;5280:16;5275:2;5271;5267:11;5233:73;:::i;5317:190::-;5376:6;5429:2;5417:9;5408:7;5404:23;5400:32;5397:2;;;5450:6;5442;5435:22;5397:2;-1:-1:-1;5478:23:1;;5387:120;-1:-1:-1;5387:120:1:o;5512:264::-;5580:6;5588;5641:2;5629:9;5620:7;5616:23;5612:32;5609:2;;;5662:6;5654;5647:22;5609:2;5703:9;5690:23;5680:33;;5732:38;5766:2;5755:9;5751:18;5732:38;:::i;5781:326::-;5858:6;5866;5874;5927:2;5915:9;5906:7;5902:23;5898:32;5895:2;;;5948:6;5940;5933:22;5895:2;-1:-1:-1;;5976:23:1;;;6046:2;6031:18;;6018:32;;-1:-1:-1;6097:2:1;6082:18;;;6069:32;;5885:222;-1:-1:-1;5885:222:1:o;6112:846::-;6209:6;6217;6225;6233;6241;6294:3;6282:9;6273:7;6269:23;6265:33;6262:2;;;6316:6;6308;6301:22;6262:2;6357:9;6344:23;6334:33;;6414:2;6403:9;6399:18;6386:32;6376:42;;6465:2;6454:9;6450:18;6437:32;6427:42;;6520:2;6509:9;6505:18;6492:32;-1:-1:-1;;;;;6584:2:1;6576:6;6573:14;6570:2;;;6605:6;6597;6590:22;6570:2;6648:6;6637:9;6633:22;6623:32;;6693:7;6686:4;6682:2;6678:13;6674:27;6664:2;;6720:6;6712;6705:22;6664:2;6765;6752:16;6791:2;6783:6;6780:14;6777:2;;;6812:6;6804;6797:22;6777:2;6862:7;6857:2;6848:6;6844:2;6840:15;6836:24;6833:37;6830:2;;;6888:6;6880;6873:22;6830:2;6252:706;;;;-1:-1:-1;6252:706:1;;-1:-1:-1;6924:2:1;6916:11;;6946:6;6252:706;-1:-1:-1;;;6252:706:1:o;6963:296::-;7021:6;7074:2;7062:9;7053:7;7049:23;7045:32;7042:2;;;7095:6;7087;7080:22;7042:2;7139:9;7126:23;7189:10;7182:5;7178:22;7171:5;7168:33;7158:2;;7220:6;7212;7205:22;7264:475;7305:3;7343:5;7337:12;7370:6;7365:3;7358:19;7395:3;7407:162;7421:6;7418:1;7415:13;7407:162;;;7483:4;7539:13;;;7535:22;;7529:29;7511:11;;;7507:20;;7500:59;7436:12;7407:162;;;7587:6;7584:1;7581:13;7578:2;;;7653:3;7646:4;7637:6;7632:3;7628:16;7624:27;7617:40;7578:2;-1:-1:-1;7721:2:1;7700:15;-1:-1:-1;;7696:29:1;7687:39;;;;7728:4;7683:50;;7313:426;-1:-1:-1;;7313:426:1:o;7744:979::-;7829:12;;7794:3;;7886:1;7906:18;;;;7959;;;;7986:2;;8040:4;8032:6;8028:17;8018:27;;7986:2;8066;8114;8106:6;8103:14;8083:18;8080:38;8077:2;;;-1:-1:-1;;;8141:33:1;;8197:4;8194:1;8187:15;8227:4;8148:3;8215:17;8077:2;8258:18;8285:104;;;;8403:1;8398:319;;;;8251:466;;8285:104;-1:-1:-1;;8318:24:1;;8306:37;;8363:16;;;;-1:-1:-1;8285:104:1;;8398:319;20878:4;20897:17;;;20947:4;20931:21;;8492:1;8506:165;8520:6;8517:1;8514:13;8506:165;;;8598:14;;8585:11;;;8578:35;8641:16;;;;8535:10;;8506:165;;;8510:3;;8700:6;8695:3;8691:16;8684:23;;8251:466;;;;;;;7802:921;;;;:::o;9084:371::-;9285:3;9316:38;9350:3;9342:6;9316:38;:::i;:::-;9377:6;9370:5;9363:21;9400:49;9445:2;9438:5;9434:14;9426:6;9400:49;:::i;:::-;9393:56;9293:162;-1:-1:-1;;;;;;9293:162:1:o;10263:488::-;-1:-1:-1;;;;;10532:15:1;;;10514:34;;10584:15;;10579:2;10564:18;;10557:43;10631:2;10616:18;;10609:34;;;10679:3;10674:2;10659:18;;10652:31;;;10457:4;;10700:45;;10725:19;;10717:6;10700:45;:::i;10756:635::-;10927:2;10979:21;;;11049:13;;10952:18;;;11071:22;;;10898:4;;10927:2;11150:15;;;;11124:2;11109:18;;;10898:4;11196:169;11210:6;11207:1;11204:13;11196:169;;;11271:13;;11259:26;;11340:15;;;;11305:12;;;;11232:1;11225:9;11196:169;;;-1:-1:-1;11382:3:1;;10907:484;-1:-1:-1;;;;;;10907:484:1:o;11991:219::-;12140:2;12129:9;12122:21;12103:4;12160:44;12200:2;12189:9;12185:18;12177:6;12160:44;:::i;18546:356::-;18748:2;18730:21;;;18767:18;;;18760:30;18826:34;18821:2;18806:18;;18799:62;18893:2;18878:18;;18720:182::o;20963:128::-;21003:3;21034:1;21030:6;21027:1;21024:13;21021:2;;;21040:18;;:::i;:::-;-1:-1:-1;21076:9:1;;21011:80::o;21096:217::-;21136:1;21162;21152:2;;-1:-1:-1;;;21187:31:1;;21241:4;21238:1;21231:15;21269:4;21194:1;21259:15;21152:2;-1:-1:-1;21298:9:1;;21142:171::o;21318:168::-;21358:7;21424:1;21420;21416:6;21412:14;21409:1;21406:21;21401:1;21394:9;21387:17;21383:45;21380:2;;;21431:18;;:::i;:::-;-1:-1:-1;21471:9:1;;21370:116::o;21491:125::-;21531:4;21559:1;21556;21553:8;21550:2;;;21564:18;;:::i;:::-;-1:-1:-1;21601:9:1;;21540:76::o;21621:380::-;21700:1;21696:12;;;;21743;;;21764:2;;21818:4;21810:6;21806:17;21796:27;;21764:2;21871;21863:6;21860:14;21840:18;21837:38;21834:2;;;21917:10;21912:3;21908:20;21905:1;21898:31;21952:4;21949:1;21942:15;21980:4;21977:1;21970:15;21834:2;;21676:325;;;:::o;22006:135::-;22045:3;-1:-1:-1;;22066:17:1;;22063:2;;;22086:18;;:::i;:::-;-1:-1:-1;22133:1:1;22122:13;;22053:88::o;22146:127::-;22207:10;22202:3;22198:20;22195:1;22188:31;22238:4;22235:1;22228:15;22262:4;22259:1;22252:15;22278:127;22339:10;22334:3;22330:20;22327:1;22320:31;22370:4;22367:1;22360:15;22394:4;22391:1;22384:15;22410:131;-1:-1:-1;;;;;;22484:32:1;;22474:43;;22464:2;;22531:1;22528;22521:12
Swarm Source
ipfs://4bb3ef41ce1b38c5ce3018a1469487611061f8d917d3515eba7c98f31c20994f
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.