Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 1 from a total of 1 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Set Base URI | 16029954 | 1218 days ago | IN | 0 ETH | 0.00132691 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
ModernArtTheory
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2022-11-23
*/
// SPDX-License-Identifier: MIT
// File: contracts/IOperatorFilterRegistry.sol
pragma solidity ^0.8.13;
interface IOperatorFilterRegistry {
function isOperatorAllowed(address registrant, address operator) external view returns (bool);
function register(address registrant) external;
function registerAndSubscribe(address registrant, address subscription) external;
function registerAndCopyEntries(address registrant, address registrantToCopy) external;
function unregister(address addr) external;
function updateOperator(address registrant, address operator, bool filtered) external;
function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
function subscribe(address registrant, address registrantToSubscribe) external;
function unsubscribe(address registrant, bool copyExistingEntries) external;
function subscriptionOf(address addr) external returns (address registrant);
function subscribers(address registrant) external returns (address[] memory);
function subscriberAt(address registrant, uint256 index) external returns (address);
function copyEntriesOf(address registrant, address registrantToCopy) external;
function isOperatorFiltered(address registrant, address operator) external returns (bool);
function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
function filteredOperators(address addr) external returns (address[] memory);
function filteredCodeHashes(address addr) external returns (bytes32[] memory);
function filteredOperatorAt(address registrant, uint256 index) external returns (address);
function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
function isRegistered(address addr) external returns (bool);
function codeHashOf(address addr) external returns (bytes32);
}
// File: contracts/OperatorFilterer.sol
pragma solidity ^0.8.13;
/**
* @title OperatorFilterer
* @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
* registrant's entries in the OperatorFilterRegistry.
* @dev This smart contract is meant to be inherited by token contracts so they can use the following:
* - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
* - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
*/
abstract contract OperatorFilterer {
error OperatorNotAllowed(address operator);
IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);
constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
// If an inheriting token contract is deployed to a network without the registry deployed, the modifier
// will not revert, but the contract will need to be registered with the registry once it is deployed in
// order for the modifier to filter addresses.
if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
if (subscribe) {
OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
} else {
if (subscriptionOrRegistrantToCopy != address(0)) {
OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
} else {
OPERATOR_FILTER_REGISTRY.register(address(this));
}
}
}
}
modifier onlyAllowedOperator(address from) virtual {
// Allow spending tokens from addresses with balance
// Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
// from an EOA.
if (from != msg.sender) {
_checkFilterOperator(msg.sender);
}
_;
}
modifier onlyAllowedOperatorApproval(address operator) virtual {
_checkFilterOperator(operator);
_;
}
function _checkFilterOperator(address operator) internal view virtual {
// Check registry code length to facilitate testing in environments without a deployed registry.
if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
revert OperatorNotAllowed(operator);
}
}
}
}
// File: contracts/DefaultOperatorFilterer.sol
pragma solidity ^0.8.13;
/**
* @title DefaultOperatorFilterer
* @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
*/
abstract contract DefaultOperatorFilterer is OperatorFilterer {
address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);
constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}
// File: @openzeppelin/contracts/utils/Counters.sol
// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)
pragma solidity ^0.8.0;
/**
* @title Counters
* @author Matt Condon (@shrugs)
* @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
* of elements in a mapping, issuing ERC721 ids, or counting request ids.
*
* Include with `using Counters for Counters.Counter;`
*/
library Counters {
struct Counter {
// This variable should never be directly accessed by users of the library: interactions must be restricted to
// the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
// this feature: see https://github.com/ethereum/solidity/issues/4637
uint256 _value; // default: 0
}
function current(Counter storage counter) internal view returns (uint256) {
return counter._value;
}
function increment(Counter storage counter) internal {
unchecked {
counter._value += 1;
}
}
function decrement(Counter storage counter) internal {
uint256 value = counter._value;
require(value > 0, "Counter: decrement overflow");
unchecked {
counter._value = value - 1;
}
}
function reset(Counter storage counter) internal {
counter._value = 0;
}
}
// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol
// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol)
pragma solidity ^0.8.0;
/**
* @dev These functions deal with verification of Merkle Tree proofs.
*
* The tree and the proofs can be generated using our
* https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
* You will find a quickstart guide in the readme.
*
* WARNING: You should avoid using leaf values that are 64 bytes long prior to
* hashing, or use a hash function other than keccak256 for hashing leaves.
* This is because the concatenation of a sorted pair of internal nodes in
* the merkle tree could be reinterpreted as a leaf value.
* OpenZeppelin's JavaScript library generates merkle trees that are safe
* against this attack out of the box.
*/
library MerkleProof {
/**
* @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
* defined by `root`. For this, a `proof` must be provided, containing
* sibling hashes on the branch from the leaf to the root of the tree. Each
* pair of leaves and each pair of pre-images are assumed to be sorted.
*/
function verify(
bytes32[] memory proof,
bytes32 root,
bytes32 leaf
) internal pure returns (bool) {
return processProof(proof, leaf) == root;
}
/**
* @dev Calldata version of {verify}
*
* _Available since v4.7._
*/
function verifyCalldata(
bytes32[] calldata proof,
bytes32 root,
bytes32 leaf
) internal pure returns (bool) {
return processProofCalldata(proof, leaf) == root;
}
/**
* @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
* from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
* hash matches the root of the tree. When processing the proof, the pairs
* of leafs & pre-images are assumed to be sorted.
*
* _Available since v4.4._
*/
function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
computedHash = _hashPair(computedHash, proof[i]);
}
return computedHash;
}
/**
* @dev Calldata version of {processProof}
*
* _Available since v4.7._
*/
function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
computedHash = _hashPair(computedHash, proof[i]);
}
return computedHash;
}
/**
* @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by
* `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
*
* CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
*
* _Available since v4.7._
*/
function multiProofVerify(
bytes32[] memory proof,
bool[] memory proofFlags,
bytes32 root,
bytes32[] memory leaves
) internal pure returns (bool) {
return processMultiProof(proof, proofFlags, leaves) == root;
}
/**
* @dev Calldata version of {multiProofVerify}
*
* CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
*
* _Available since v4.7._
*/
function multiProofVerifyCalldata(
bytes32[] calldata proof,
bool[] calldata proofFlags,
bytes32 root,
bytes32[] memory leaves
) internal pure returns (bool) {
return processMultiProofCalldata(proof, proofFlags, leaves) == root;
}
/**
* @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
* proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
* leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
* respectively.
*
* CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
* is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
* tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
*
* _Available since v4.7._
*/
function processMultiProof(
bytes32[] memory proof,
bool[] memory proofFlags,
bytes32[] memory leaves
) internal pure returns (bytes32 merkleRoot) {
// This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
// consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
// `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
// the merkle tree.
uint256 leavesLen = leaves.length;
uint256 totalHashes = proofFlags.length;
// Check proof validity.
require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");
// The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
// `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
bytes32[] memory hashes = new bytes32[](totalHashes);
uint256 leafPos = 0;
uint256 hashPos = 0;
uint256 proofPos = 0;
// At each step, we compute the next hash using two values:
// - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
// get the next hash.
// - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
// `proof` array.
for (uint256 i = 0; i < totalHashes; i++) {
bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
hashes[i] = _hashPair(a, b);
}
if (totalHashes > 0) {
return hashes[totalHashes - 1];
} else if (leavesLen > 0) {
return leaves[0];
} else {
return proof[0];
}
}
/**
* @dev Calldata version of {processMultiProof}.
*
* CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
*
* _Available since v4.7._
*/
function processMultiProofCalldata(
bytes32[] calldata proof,
bool[] calldata proofFlags,
bytes32[] memory leaves
) internal pure returns (bytes32 merkleRoot) {
// This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
// consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
// `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
// the merkle tree.
uint256 leavesLen = leaves.length;
uint256 totalHashes = proofFlags.length;
// Check proof validity.
require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");
// The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
// `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
bytes32[] memory hashes = new bytes32[](totalHashes);
uint256 leafPos = 0;
uint256 hashPos = 0;
uint256 proofPos = 0;
// At each step, we compute the next hash using two values:
// - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
// get the next hash.
// - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
// `proof` array.
for (uint256 i = 0; i < totalHashes; i++) {
bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
hashes[i] = _hashPair(a, b);
}
if (totalHashes > 0) {
return hashes[totalHashes - 1];
} else if (leavesLen > 0) {
return leaves[0];
} else {
return proof[0];
}
}
function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
}
function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
/// @solidity memory-safe-assembly
assembly {
mstore(0x00, a)
mstore(0x20, b)
value := keccak256(0x00, 0x40)
}
}
}
// File: @openzeppelin/contracts/security/ReentrancyGuard.sol
// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be _NOT_ENTERED
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
}
function _nonReentrantAfter() private {
// 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/math/Math.sol
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)
pragma solidity ^0.8.0;
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
enum Rounding {
Down, // Toward negative infinity
Up, // Toward infinity
Zero // Toward zero
}
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two numbers. The result is rounded towards
* zero.
*/
function average(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b) / 2 can overflow.
return (a & b) + (a ^ b) / 2;
}
/**
* @dev Returns the ceiling of the division of two numbers.
*
* This differs from standard division with `/` in that it rounds up instead
* of rounding down.
*/
function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b - 1) / b can overflow on addition, so we distribute.
return a == 0 ? 0 : (a - 1) / b + 1;
}
/**
* @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
* @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
* with further edits by Uniswap Labs also under MIT license.
*/
function mulDiv(
uint256 x,
uint256 y,
uint256 denominator
) internal pure returns (uint256 result) {
unchecked {
// 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
// use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
// variables such that product = prod1 * 2^256 + prod0.
uint256 prod0; // Least significant 256 bits of the product
uint256 prod1; // Most significant 256 bits of the product
assembly {
let mm := mulmod(x, y, not(0))
prod0 := mul(x, y)
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
// Handle non-overflow cases, 256 by 256 division.
if (prod1 == 0) {
return prod0 / denominator;
}
// Make sure the result is less than 2^256. Also prevents denominator == 0.
require(denominator > prod1);
///////////////////////////////////////////////
// 512 by 256 division.
///////////////////////////////////////////////
// Make division exact by subtracting the remainder from [prod1 prod0].
uint256 remainder;
assembly {
// Compute remainder using mulmod.
remainder := mulmod(x, y, denominator)
// Subtract 256 bit number from 512 bit number.
prod1 := sub(prod1, gt(remainder, prod0))
prod0 := sub(prod0, remainder)
}
// Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
// See https://cs.stackexchange.com/q/138556/92363.
// Does not overflow because the denominator cannot be zero at this stage in the function.
uint256 twos = denominator & (~denominator + 1);
assembly {
// Divide denominator by twos.
denominator := div(denominator, twos)
// Divide [prod1 prod0] by twos.
prod0 := div(prod0, twos)
// Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
twos := add(div(sub(0, twos), twos), 1)
}
// Shift in bits from prod1 into prod0.
prod0 |= prod1 * twos;
// Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
// that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
// four bits. That is, denominator * inv = 1 mod 2^4.
uint256 inverse = (3 * denominator) ^ 2;
// Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
// in modular arithmetic, doubling the correct bits in each step.
inverse *= 2 - denominator * inverse; // inverse mod 2^8
inverse *= 2 - denominator * inverse; // inverse mod 2^16
inverse *= 2 - denominator * inverse; // inverse mod 2^32
inverse *= 2 - denominator * inverse; // inverse mod 2^64
inverse *= 2 - denominator * inverse; // inverse mod 2^128
inverse *= 2 - denominator * inverse; // inverse mod 2^256
// Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
// This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
// less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
// is no longer required.
result = prod0 * inverse;
return result;
}
}
/**
* @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
*/
function mulDiv(
uint256 x,
uint256 y,
uint256 denominator,
Rounding rounding
) internal pure returns (uint256) {
uint256 result = mulDiv(x, y, denominator);
if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
result += 1;
}
return result;
}
/**
* @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
*
* Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
*/
function sqrt(uint256 a) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
// For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
//
// We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
// `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
//
// This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
// → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
// → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
//
// Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
uint256 result = 1 << (log2(a) >> 1);
// At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
// since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
// every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
// into the expected uint128 result.
unchecked {
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
return min(result, a / result);
}
}
/**
* @notice Calculates sqrt(a), following the selected rounding direction.
*/
function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = sqrt(a);
return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
}
}
/**
* @dev Return the log in base 2, rounded down, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 128;
}
if (value >> 64 > 0) {
value >>= 64;
result += 64;
}
if (value >> 32 > 0) {
value >>= 32;
result += 32;
}
if (value >> 16 > 0) {
value >>= 16;
result += 16;
}
if (value >> 8 > 0) {
value >>= 8;
result += 8;
}
if (value >> 4 > 0) {
value >>= 4;
result += 4;
}
if (value >> 2 > 0) {
value >>= 2;
result += 2;
}
if (value >> 1 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 2, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log2(value);
return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 10, rounded down, of a positive value.
* Returns 0 if given 0.
*/
function log10(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >= 10**64) {
value /= 10**64;
result += 64;
}
if (value >= 10**32) {
value /= 10**32;
result += 32;
}
if (value >= 10**16) {
value /= 10**16;
result += 16;
}
if (value >= 10**8) {
value /= 10**8;
result += 8;
}
if (value >= 10**4) {
value /= 10**4;
result += 4;
}
if (value >= 10**2) {
value /= 10**2;
result += 2;
}
if (value >= 10**1) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 10, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log10(value);
return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 256, rounded down, of a positive value.
* Returns 0 if given 0.
*
* Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
*/
function log256(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 16;
}
if (value >> 64 > 0) {
value >>= 64;
result += 8;
}
if (value >> 32 > 0) {
value >>= 32;
result += 4;
}
if (value >> 16 > 0) {
value >>= 16;
result += 2;
}
if (value >> 8 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 10, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log256(value);
return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
}
}
}
// File: @openzeppelin/contracts/utils/Strings.sol
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _SYMBOLS = "0123456789abcdef";
uint8 private constant _ADDRESS_LENGTH = 20;
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
unchecked {
uint256 length = Math.log10(value) + 1;
string memory buffer = new string(length);
uint256 ptr;
/// @solidity memory-safe-assembly
assembly {
ptr := add(buffer, add(32, length))
}
while (true) {
ptr--;
/// @solidity memory-safe-assembly
assembly {
mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
}
value /= 10;
if (value == 0) break;
}
return buffer;
}
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
unchecked {
return toHexString(value, Math.log256(value) + 1);
}
}
/**
* @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] = _SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
/**
* @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
*/
function toHexString(address addr) internal pure returns (string memory) {
return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
}
}
// 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 (last updated v4.7.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
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.8.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 functionCallWithValue(target, data, 0, "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");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, 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) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, 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) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
* the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
*
* _Available since v4.8._
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
// only check isContract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
/**
* @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason or 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 {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
// 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
/// @solidity memory-safe-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 (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)
pragma solidity ^0.8.0;
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721Receiver {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
*
* The selector can be obtained in Solidity with `IERC721Receiver.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 (last updated v4.8.0) (token/ERC721/IERC721.sol)
pragma solidity ^0.8.0;
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* 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;
/**
* @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 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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
* or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
* understand this adds an external call which potentially creates a reentrancy vulnerability.
*
* 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 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 the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @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);
}
// 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: @openzeppelin/contracts/token/ERC721/ERC721.sol
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/ERC721.sol)
pragma solidity ^0.8.0;
/**
* @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
* the Metadata extension, but not including the Enumerable extension, which is available separately as
* {ERC721Enumerable}.
*/
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
using Address for address;
using Strings for uint256;
// Token name
string private _name;
// Token symbol
string private _symbol;
// Mapping from token ID to owner address
mapping(uint256 => address) private _owners;
// Mapping owner address to token count
mapping(address => uint256) private _balances;
// Mapping from token ID to approved address
mapping(uint256 => address) private _tokenApprovals;
// Mapping from owner to operator approvals
mapping(address => mapping(address => bool)) private _operatorApprovals;
/**
* @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return
interfaceId == type(IERC721).interfaceId ||
interfaceId == type(IERC721Metadata).interfaceId ||
super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721-balanceOf}.
*/
function balanceOf(address owner) public view virtual override returns (uint256) {
require(owner != address(0), "ERC721: address zero is not a valid owner");
return _balances[owner];
}
/**
* @dev See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId) public view virtual override returns (address) {
address owner = _ownerOf(tokenId);
require(owner != address(0), "ERC721: invalid token ID");
return owner;
}
/**
* @dev See {IERC721Metadata-name}.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev See {IERC721Metadata-symbol}.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
_requireMinted(tokenId);
string memory baseURI = _baseURI();
return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
}
/**
* @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
* token will be the concatenation of the `baseURI` and the `tokenId`. Empty
* by default, can be overridden in child contracts.
*/
function _baseURI() internal view virtual returns (string memory) {
return "";
}
/**
* @dev See {IERC721-approve}.
*/
function approve(address to, uint256 tokenId) public virtual override {
address owner = ERC721.ownerOf(tokenId);
require(to != owner, "ERC721: approval to current owner");
require(
_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
"ERC721: approve caller is not token owner or approved for all"
);
_approve(to, tokenId);
}
/**
* @dev See {IERC721-getApproved}.
*/
function getApproved(uint256 tokenId) public view virtual override returns (address) {
_requireMinted(tokenId);
return _tokenApprovals[tokenId];
}
/**
* @dev See {IERC721-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual override {
_setApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC721-isApprovedForAll}.
*/
function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
return _operatorApprovals[owner][operator];
}
/**
* @dev See {IERC721-transferFrom}.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
//solhint-disable-next-line max-line-length
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");
_transfer(from, to, tokenId);
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
safeTransferFrom(from, to, tokenId, "");
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes memory data
) public virtual override {
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");
_safeTransfer(from, to, tokenId, data);
}
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* `data` is additional data, it has no specified format and it is sent in call to `to`.
*
* This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
* implement alternative mechanisms to perform token transfer, such as signature-based.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeTransfer(
address from,
address to,
uint256 tokenId,
bytes memory data
) internal virtual {
_transfer(from, to, tokenId);
require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer");
}
/**
* @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist
*/
function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
return _owners[tokenId];
}
/**
* @dev Returns whether `tokenId` exists.
*
* Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
*
* Tokens start existing when they are minted (`_mint`),
* and stop existing when they are burned (`_burn`).
*/
function _exists(uint256 tokenId) internal view virtual returns (bool) {
return _ownerOf(tokenId) != address(0);
}
/**
* @dev Returns whether `spender` is allowed to manage `tokenId`.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
address owner = ERC721.ownerOf(tokenId);
return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
}
/**
* @dev Safely mints `tokenId` and transfers it to `to`.
*
* Requirements:
*
* - `tokenId` must not exist.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeMint(address to, uint256 tokenId) internal virtual {
_safeMint(to, tokenId, "");
}
/**
* @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
* forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
*/
function _safeMint(
address to,
uint256 tokenId,
bytes memory data
) internal virtual {
_mint(to, tokenId);
require(
_checkOnERC721Received(address(0), to, tokenId, data),
"ERC721: transfer to non ERC721Receiver implementer"
);
}
/**
* @dev Mints `tokenId` and transfers it to `to`.
*
* WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
*
* Requirements:
*
* - `tokenId` must not exist.
* - `to` cannot be the zero address.
*
* Emits a {Transfer} event.
*/
function _mint(address to, uint256 tokenId) internal virtual {
require(to != address(0), "ERC721: mint to the zero address");
require(!_exists(tokenId), "ERC721: token already minted");
_beforeTokenTransfer(address(0), to, tokenId, 1);
// Check that tokenId was not minted by `_beforeTokenTransfer` hook
require(!_exists(tokenId), "ERC721: token already minted");
unchecked {
// Will not overflow unless all 2**256 token ids are minted to the same owner.
// Given that tokens are minted one by one, it is impossible in practice that
// this ever happens. Might change if we allow batch minting.
// The ERC fails to describe this case.
_balances[to] += 1;
}
_owners[tokenId] = to;
emit Transfer(address(0), to, tokenId);
_afterTokenTransfer(address(0), to, tokenId, 1);
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
* This is an internal function that does not check if the sender is authorized to operate on the token.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId) internal virtual {
address owner = ERC721.ownerOf(tokenId);
_beforeTokenTransfer(owner, address(0), tokenId, 1);
// Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook
owner = ERC721.ownerOf(tokenId);
// Clear approvals
delete _tokenApprovals[tokenId];
unchecked {
// Cannot overflow, as that would require more tokens to be burned/transferred
// out than the owner initially received through minting and transferring in.
_balances[owner] -= 1;
}
delete _owners[tokenId];
emit Transfer(owner, address(0), tokenId);
_afterTokenTransfer(owner, address(0), tokenId, 1);
}
/**
* @dev Transfers `tokenId` from `from` to `to`.
* As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
*
* Emits a {Transfer} event.
*/
function _transfer(
address from,
address to,
uint256 tokenId
) internal virtual {
require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
require(to != address(0), "ERC721: transfer to the zero address");
_beforeTokenTransfer(from, to, tokenId, 1);
// Check that tokenId was not transferred by `_beforeTokenTransfer` hook
require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
// Clear approvals from the previous owner
delete _tokenApprovals[tokenId];
unchecked {
// `_balances[from]` cannot overflow for the same reason as described in `_burn`:
// `from`'s balance is the number of token held, which is at least one before the current
// transfer.
// `_balances[to]` could overflow in the conditions described in `_mint`. That would require
// all 2**256 token ids to be minted, which in practice is impossible.
_balances[from] -= 1;
_balances[to] += 1;
}
_owners[tokenId] = to;
emit Transfer(from, to, tokenId);
_afterTokenTransfer(from, to, tokenId, 1);
}
/**
* @dev Approve `to` to operate on `tokenId`
*
* Emits an {Approval} event.
*/
function _approve(address to, uint256 tokenId) internal virtual {
_tokenApprovals[tokenId] = to;
emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
}
/**
* @dev Approve `operator` to operate on all of `owner` tokens
*
* Emits an {ApprovalForAll} event.
*/
function _setApprovalForAll(
address owner,
address operator,
bool approved
) internal virtual {
require(owner != operator, "ERC721: approve to caller");
_operatorApprovals[owner][operator] = approved;
emit ApprovalForAll(owner, operator, approved);
}
/**
* @dev Reverts if the `tokenId` has not been minted yet.
*/
function _requireMinted(uint256 tokenId) internal view virtual {
require(_exists(tokenId), "ERC721: invalid token ID");
}
/**
* @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
* The call is not executed if the target address is not a contract.
*
* @param from address representing the previous owner of the given token ID
* @param to target address that will receive the tokens
* @param tokenId uint256 ID of the token to be transferred
* @param data bytes optional data to send along with the call
* @return bool whether the call correctly returned the expected magic value
*/
function _checkOnERC721Received(
address from,
address to,
uint256 tokenId,
bytes memory data
) private returns (bool) {
if (to.isContract()) {
try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {
return retval == IERC721Receiver.onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert("ERC721: transfer to non ERC721Receiver implementer");
} else {
/// @solidity memory-safe-assembly
assembly {
revert(add(32, reason), mload(reason))
}
}
}
} else {
return true;
}
}
/**
* @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is
* used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.
* - When `from` is zero, the tokens will be minted for `to`.
* - When `to` is zero, ``from``'s tokens will be burned.
* - `from` and `to` are never both zero.
* - `batchSize` is non-zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256, /* firstTokenId */
uint256 batchSize
) internal virtual {
if (batchSize > 1) {
if (from != address(0)) {
_balances[from] -= batchSize;
}
if (to != address(0)) {
_balances[to] += batchSize;
}
}
}
/**
* @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is
* used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.
* - When `from` is zero, the tokens were minted for `to`.
* - When `to` is zero, ``from``'s tokens were burned.
* - `from` and `to` are never both zero.
* - `batchSize` is non-zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _afterTokenTransfer(
address from,
address to,
uint256 firstTokenId,
uint256 batchSize
) internal virtual {}
}
// File: contracts/MAT_MAIN_CONTRACT.sol
pragma solidity ^0.8.9;
// @author codingwithdidem
// @contact codingwithdidem@gmail.com
contract ModernArtTheory is ERC721, Ownable, ReentrancyGuard, DefaultOperatorFilterer {
using Strings for uint256;
using Counters for Counters.Counter;
uint256 public maxSupply = 250;
string public baseURI;
string public notRevealedUri =
"ipfs://QmQT4w8MsbhMjVmoms8gzVHcFdXXUX5hMhVySeBiDpR4No/HiddenMAT.gif";
string public baseExtension = ".json";
bool public paused = false;
bool public revealed = false;
bool public publicM = false;
uint256 public _price = 0.001 ether; // 0.001 ETH
Counters.Counter private _tokenIds;
constructor()
ERC721("ModernArtTheory", "MAT")
ReentrancyGuard() // A modifier that can prevent reentrancy during certain functions
{
}
function setBaseURI(string memory _tokenBaseURI) public onlyOwner {
baseURI = _tokenBaseURI;
}
function _baseURI() internal view override returns (string memory) {
return baseURI;
}
function reveal() public onlyOwner {
revealed = true;
}
modifier onlyAccounts() {
require(msg.sender == tx.origin, "Not allowed origin");
_;
}
function togglePause() public onlyOwner {
paused = !paused;
}
function togglePublicSale() public onlyOwner {
publicM = !publicM;
}
function publicSaleMint(uint256 _amount) external payable onlyAccounts {
require(publicM, "Modern Art Theory: PublicSale is OFF");
require(!paused, "Modern Art Theory: Contract is paused");
require(_amount > 0, "Modern Art Theory: zero amount");
uint256 current = _tokenIds.current();
require(
current + _amount <= maxSupply,
"Modern Art Theory: Max supply exceeded"
);
require(
_price * _amount <= msg.value,
"Modern Art Theory: Not enough ethers sent"
);
for (uint256 i = 0; i < _amount; i++) {
mintInternal();
}
}
function mintInternal() internal nonReentrant {
_tokenIds.increment();
uint256 tokenId = _tokenIds.current();
_safeMint(msg.sender, tokenId);
}
function tokenURI(uint256 tokenId)
public
view
virtual
override
returns (string memory)
{
require(
_exists(tokenId),
"ERC721Metadata: URI query for nonexistent token"
);
if (revealed == false) {
return notRevealedUri;
}
string memory currentBaseURI = _baseURI();
return
bytes(currentBaseURI).length > 0
? string(
abi.encodePacked(
currentBaseURI,
tokenId.toString(),
baseExtension
)
)
: "";
}
function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
super.transferFrom(from, to, tokenId);
}
function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
super.safeTransferFrom(from, to, tokenId);
}
function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
public
override
onlyAllowedOperator(from)
{
super.safeTransferFrom(from, to, tokenId, data);
}
function setBaseExtension(string memory _newBaseExtension)
public
onlyOwner
{
baseExtension = _newBaseExtension;
}
function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
notRevealedUri = _notRevealedURI;
}
function totalSupply() public view returns (uint256) {
return _tokenIds.current();
}
///sends a percentage to each address
function withdraw() public onlyOwner {
///original balance before percent is deducted
uint256 initialBalance = address(this).balance;
(bool t1, ) = payable(0x28f4dF239872b9587345C88A8Ed676a7D2754ecC).call{value: initialBalance * 80 / 100}("");
require(t1);
(bool t2, ) = payable(0x85a5D9347fF88D03FFcD01aD9393Cf7d42acfA92).call{value: initialBalance * 5 / 100}("");
require(t2);
(bool t3, ) = payable(0x241926E653De1deb3Ba170B23128f683F8C2016F).call{value: initialBalance * 15 / 100}("");
require(t3);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"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":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_price","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":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicM","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"publicSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60fa60085561010060405260436080818152906200275360a039600a906200002890826200035f565b50604080518082019091526005815264173539b7b760d91b6020820152600b906200005490826200035f565b50600c805462ffffff1916905566038d7ea4c68000600d553480156200007957600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600f81526020016e4d6f6465726e4172745468656f727960881b8152506040518060400160405280600381526020016213505560ea1b8152508160009081620000e691906200035f565b506001620000f582826200035f565b505050620001126200010c6200026460201b60201c565b62000268565b60016007556daaeb6d7670e522a718067333cd4e3b156200025c578015620001aa57604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b1580156200018b57600080fd5b505af1158015620001a0573d6000803e3d6000fd5b505050506200025c565b6001600160a01b03821615620001fb5760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af29039060440162000170565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b1580156200024257600080fd5b505af115801562000257573d6000803e3d6000fd5b505050505b50506200042b565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620002e557607f821691505b6020821081036200030657634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200035a57600081815260208120601f850160051c81016020861015620003355750805b601f850160051c820191505b81811015620003565782815560010162000341565b5050505b505050565b81516001600160401b038111156200037b576200037b620002ba565b62000393816200038c8454620002d0565b846200030c565b602080601f831160018114620003cb5760008415620003b25750858301515b600019600386901b1c1916600185901b17855562000356565b600085815260208120601f198616915b82811015620003fc57888601518255948401946001909101908401620003db565b50858210156200041b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612318806200043b6000396000f3fe6080604052600436106101f95760003560e01c8063715018a61161010d578063c4ae3168116100a0578063da3ef23f1161006f578063da3ef23f14610552578063e222c7f914610572578063e985e9c514610587578063f2c4ce1e146105a7578063f2fde38b146105c757600080fd5b8063c4ae3168146104f2578063c668286214610507578063c87b56dd1461051c578063d5abeb011461053c57600080fd5b8063a45063c0116100dc578063a45063c01461048a578063a475b5dd146104aa578063b3ab66b0146104bf578063b88d4fde146104d257600080fd5b8063715018a6146104225780638da5cb5b1461043757806395d89b4114610455578063a22cb4651461046a57600080fd5b80633ccfd60b1161019057806355f804b31161015f57806355f804b3146103935780635c975abb146103b35780636352211e146103cd5780636c0360eb146103ed57806370a082311461040257600080fd5b80633ccfd60b1461031d57806341f434341461033257806342842e0e14610354578063518302271461037457600080fd5b8063095ea7b3116101cc578063095ea7b3146102a257806318160ddd146102c4578063235b6ea1146102e757806323b872dd146102fd57600080fd5b806301ffc9a7146101fe57806306fdde0314610233578063081812fc14610255578063081c8c441461028d575b600080fd5b34801561020a57600080fd5b5061021e610219366004611c12565b6105e7565b60405190151581526020015b60405180910390f35b34801561023f57600080fd5b50610248610639565b60405161022a9190611c7f565b34801561026157600080fd5b50610275610270366004611c92565b6106cb565b6040516001600160a01b03909116815260200161022a565b34801561029957600080fd5b506102486106f2565b3480156102ae57600080fd5b506102c26102bd366004611cc7565b610780565b005b3480156102d057600080fd5b506102d961089a565b60405190815260200161022a565b3480156102f357600080fd5b506102d9600d5481565b34801561030957600080fd5b506102c2610318366004611cf1565b6108aa565b34801561032957600080fd5b506102c26108d5565b34801561033e57600080fd5b506102756daaeb6d7670e522a718067333cd4e81565b34801561036057600080fd5b506102c261036f366004611cf1565b610a55565b34801561038057600080fd5b50600c5461021e90610100900460ff1681565b34801561039f57600080fd5b506102c26103ae366004611db9565b610a7a565b3480156103bf57600080fd5b50600c5461021e9060ff1681565b3480156103d957600080fd5b506102756103e8366004611c92565b610a92565b3480156103f957600080fd5b50610248610af2565b34801561040e57600080fd5b506102d961041d366004611e02565b610aff565b34801561042e57600080fd5b506102c2610b85565b34801561044357600080fd5b506006546001600160a01b0316610275565b34801561046157600080fd5b50610248610b99565b34801561047657600080fd5b506102c2610485366004611e2b565b610ba8565b34801561049657600080fd5b50600c5461021e9062010000900460ff1681565b3480156104b657600080fd5b506102c2610bb3565b6102c26104cd366004611c92565b610bcc565b3480156104de57600080fd5b506102c26104ed366004611e62565b610e31565b3480156104fe57600080fd5b506102c2610e5e565b34801561051357600080fd5b50610248610e7a565b34801561052857600080fd5b50610248610537366004611c92565b610e87565b34801561054857600080fd5b506102d960085481565b34801561055e57600080fd5b506102c261056d366004611db9565b61100b565b34801561057e57600080fd5b506102c261101f565b34801561059357600080fd5b5061021e6105a2366004611ede565b611046565b3480156105b357600080fd5b506102c26105c2366004611db9565b611074565b3480156105d357600080fd5b506102c26105e2366004611e02565b611088565b60006001600160e01b031982166380ac58cd60e01b148061061857506001600160e01b03198216635b5e139f60e01b145b8061063357506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461064890611f11565b80601f016020809104026020016040519081016040528092919081815260200182805461067490611f11565b80156106c15780601f10610696576101008083540402835291602001916106c1565b820191906000526020600020905b8154815290600101906020018083116106a457829003601f168201915b5050505050905090565b60006106d682611101565b506000908152600460205260409020546001600160a01b031690565b600a80546106ff90611f11565b80601f016020809104026020016040519081016040528092919081815260200182805461072b90611f11565b80156107785780601f1061074d57610100808354040283529160200191610778565b820191906000526020600020905b81548152906001019060200180831161075b57829003601f168201915b505050505081565b600061078b82610a92565b9050806001600160a01b0316836001600160a01b0316036107fd5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b038216148061081957506108198133611046565b61088b5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c00000060648201526084016107f4565b6108958383611160565b505050565b60006108a5600e5490565b905090565b826001600160a01b03811633146108c4576108c4336111ce565b6108cf848484611287565b50505050565b6108dd6112b8565b4760007328f4df239872b9587345c88a8ed676a7d2754ecc6064610902846050611f61565b61090c9190611f78565b604051600081818185875af1925050503d8060008114610948576040519150601f19603f3d011682016040523d82523d6000602084013e61094d565b606091505b505090508061095b57600080fd5b60007385a5d9347ff88d03ffcd01ad9393cf7d42acfa92606461097f856005611f61565b6109899190611f78565b604051600081818185875af1925050503d80600081146109c5576040519150601f19603f3d011682016040523d82523d6000602084013e6109ca565b606091505b50509050806109d857600080fd5b600073241926e653de1deb3ba170b23128f683f8c2016f60646109fc86600f611f61565b610a069190611f78565b604051600081818185875af1925050503d8060008114610a42576040519150601f19603f3d011682016040523d82523d6000602084013e610a47565b606091505b50509050806108cf57600080fd5b826001600160a01b0381163314610a6f57610a6f336111ce565b6108cf848484611312565b610a826112b8565b6009610a8e8282611fe8565b5050565b6000818152600260205260408120546001600160a01b0316806106335760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016107f4565b600980546106ff90611f11565b60006001600160a01b038216610b695760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016107f4565b506001600160a01b031660009081526003602052604090205490565b610b8d6112b8565b610b97600061132d565b565b60606001805461064890611f11565b610a8e33838361137f565b610bbb6112b8565b600c805461ff001916610100179055565b333214610c105760405162461bcd60e51b81526020600482015260126024820152712737ba1030b63637bbb2b21037b934b3b4b760711b60448201526064016107f4565b600c5462010000900460ff16610c745760405162461bcd60e51b8152602060048201526024808201527f4d6f6465726e20417274205468656f72793a205075626c696353616c652069736044820152631027a32360e11b60648201526084016107f4565b600c5460ff1615610cd55760405162461bcd60e51b815260206004820152602560248201527f4d6f6465726e20417274205468656f72793a20436f6e74726163742069732070604482015264185d5cd95960da1b60648201526084016107f4565b60008111610d255760405162461bcd60e51b815260206004820152601e60248201527f4d6f6465726e20417274205468656f72793a207a65726f20616d6f756e74000060448201526064016107f4565b6000610d30600e5490565b600854909150610d4083836120a8565b1115610d9d5760405162461bcd60e51b815260206004820152602660248201527f4d6f6465726e20417274205468656f72793a204d617820737570706c7920657860448201526518d95959195960d21b60648201526084016107f4565b3482600d54610dac9190611f61565b1115610e0c5760405162461bcd60e51b815260206004820152602960248201527f4d6f6465726e20417274205468656f72793a204e6f7420656e6f7567682065746044820152681a195c9cc81cd95b9d60ba1b60648201526084016107f4565b60005b8281101561089557610e1f61144d565b80610e29816120bb565b915050610e0f565b836001600160a01b0381163314610e4b57610e4b336111ce565b610e5785858585611485565b5050505050565b610e666112b8565b600c805460ff19811660ff90911615179055565b600b80546106ff90611f11565b6000818152600260205260409020546060906001600160a01b0316610f065760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016107f4565b600c54610100900460ff161515600003610fac57600a8054610f2790611f11565b80601f0160208091040260200160405190810160405280929190818152602001828054610f5390611f11565b8015610fa05780601f10610f7557610100808354040283529160200191610fa0565b820191906000526020600020905b815481529060010190602001808311610f8357829003601f168201915b50505050509050919050565b6000610fb66114b7565b90506000815111610fd65760405180602001604052806000815250611004565b80610fe0846114c6565b600b604051602001610ff4939291906120d4565b6040516020818303038152906040525b9392505050565b6110136112b8565b600b610a8e8282611fe8565b6110276112b8565b600c805462ff0000198116620100009182900460ff1615909102179055565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b61107c6112b8565b600a610a8e8282611fe8565b6110906112b8565b6001600160a01b0381166110f55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107f4565b6110fe8161132d565b50565b6000818152600260205260409020546001600160a01b03166110fe5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016107f4565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061119582610a92565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6daaeb6d7670e522a718067333cd4e3b156110fe57604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa15801561123b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125f9190612174565b6110fe57604051633b79c77360e21b81526001600160a01b03821660048201526024016107f4565b6112913382611559565b6112ad5760405162461bcd60e51b81526004016107f490612191565b6108958383836115b8565b6006546001600160a01b03163314610b975760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107f4565b61089583838360405180602001604052806000815250610e31565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316036113e05760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107f4565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611455611729565b611463600e80546001019055565b600061146e600e5490565b905061147a3382611782565b50610b976001600755565b61148f3383611559565b6114ab5760405162461bcd60e51b81526004016107f490612191565b6108cf8484848461179c565b60606009805461064890611f11565b606060006114d3836117cf565b600101905060008167ffffffffffffffff8111156114f3576114f3611d2d565b6040519080825280601f01601f19166020018201604052801561151d576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461152757509392505050565b60008061156583610a92565b9050806001600160a01b0316846001600160a01b0316148061158c575061158c8185611046565b806115b05750836001600160a01b03166115a5846106cb565b6001600160a01b0316145b949350505050565b826001600160a01b03166115cb82610a92565b6001600160a01b0316146115f15760405162461bcd60e51b81526004016107f4906121de565b6001600160a01b0382166116535760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016107f4565b61166083838360016118a7565b826001600160a01b031661167382610a92565b6001600160a01b0316146116995760405162461bcd60e51b81526004016107f4906121de565b600081815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260038552838620805460001901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60026007540361177b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107f4565b6002600755565b610a8e82826040518060200160405280600081525061192f565b6117a78484846115b8565b6117b384848484611962565b6108cf5760405162461bcd60e51b81526004016107f490612223565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b831061180e5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef8100000000831061183a576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061185857662386f26fc10000830492506010015b6305f5e1008310611870576305f5e100830492506008015b612710831061188457612710830492506004015b60648310611896576064830492506002015b600a83106106335760010192915050565b60018111156108cf576001600160a01b038416156118ed576001600160a01b038416600090815260036020526040812080548392906118e7908490612275565b90915550505b6001600160a01b038316156108cf576001600160a01b038316600090815260036020526040812080548392906119249084906120a8565b909155505050505050565b6119398383611a63565b6119466000848484611962565b6108955760405162461bcd60e51b81526004016107f490612223565b60006001600160a01b0384163b15611a5857604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906119a6903390899088908890600401612288565b6020604051808303816000875af19250505080156119e1575060408051601f3d908101601f191682019092526119de918101906122c5565b60015b611a3e573d808015611a0f576040519150601f19603f3d011682016040523d82523d6000602084013e611a14565b606091505b508051600003611a365760405162461bcd60e51b81526004016107f490612223565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506115b0565b506001949350505050565b6001600160a01b038216611ab95760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107f4565b6000818152600260205260409020546001600160a01b031615611b1e5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107f4565b611b2c6000838360016118a7565b6000818152600260205260409020546001600160a01b031615611b915760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107f4565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160e01b0319811681146110fe57600080fd5b600060208284031215611c2457600080fd5b813561100481611bfc565b60005b83811015611c4a578181015183820152602001611c32565b50506000910152565b60008151808452611c6b816020860160208601611c2f565b601f01601f19169290920160200192915050565b6020815260006110046020830184611c53565b600060208284031215611ca457600080fd5b5035919050565b80356001600160a01b0381168114611cc257600080fd5b919050565b60008060408385031215611cda57600080fd5b611ce383611cab565b946020939093013593505050565b600080600060608486031215611d0657600080fd5b611d0f84611cab565b9250611d1d60208501611cab565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611d5e57611d5e611d2d565b604051601f8501601f19908116603f01168101908282118183101715611d8657611d86611d2d565b81604052809350858152868686011115611d9f57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611dcb57600080fd5b813567ffffffffffffffff811115611de257600080fd5b8201601f81018413611df357600080fd5b6115b084823560208401611d43565b600060208284031215611e1457600080fd5b61100482611cab565b80151581146110fe57600080fd5b60008060408385031215611e3e57600080fd5b611e4783611cab565b91506020830135611e5781611e1d565b809150509250929050565b60008060008060808587031215611e7857600080fd5b611e8185611cab565b9350611e8f60208601611cab565b925060408501359150606085013567ffffffffffffffff811115611eb257600080fd5b8501601f81018713611ec357600080fd5b611ed287823560208401611d43565b91505092959194509250565b60008060408385031215611ef157600080fd5b611efa83611cab565b9150611f0860208401611cab565b90509250929050565b600181811c90821680611f2557607f821691505b602082108103611f4557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761063357610633611f4b565b600082611f9557634e487b7160e01b600052601260045260246000fd5b500490565b601f82111561089557600081815260208120601f850160051c81016020861015611fc15750805b601f850160051c820191505b81811015611fe057828155600101611fcd565b505050505050565b815167ffffffffffffffff81111561200257612002611d2d565b612016816120108454611f11565b84611f9a565b602080601f83116001811461204b57600084156120335750858301515b600019600386901b1c1916600185901b178555611fe0565b600085815260208120601f198616915b8281101561207a5788860151825594840194600190910190840161205b565b50858210156120985787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8082018082111561063357610633611f4b565b6000600182016120cd576120cd611f4b565b5060010190565b6000845160206120e78285838a01611c2f565b8551918401916120fa8184848a01611c2f565b855492019160009061210b81611f11565b60018281168015612123576001811461213857612164565b60ff1984168752821515830287019450612164565b896000528560002060005b8481101561215c57815489820152908301908701612143565b505082870194505b50929a9950505050505050505050565b60006020828403121561218657600080fd5b815161100481611e1d565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b8181038181111561063357610633611f4b565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906122bb90830184611c53565b9695505050505050565b6000602082840312156122d757600080fd5b815161100481611bfc56fea2646970667358221220362d9bfca8567e731ec85953d81fcbe418e77825ad7af4e0b59bba8824185e7164736f6c63430008110033697066733a2f2f516d51543477384d7362684d6a566d6f6d7338677a56486346645858555835684d68567953654269447052344e6f2f48696464656e4d41542e676966
Deployed Bytecode
0x6080604052600436106101f95760003560e01c8063715018a61161010d578063c4ae3168116100a0578063da3ef23f1161006f578063da3ef23f14610552578063e222c7f914610572578063e985e9c514610587578063f2c4ce1e146105a7578063f2fde38b146105c757600080fd5b8063c4ae3168146104f2578063c668286214610507578063c87b56dd1461051c578063d5abeb011461053c57600080fd5b8063a45063c0116100dc578063a45063c01461048a578063a475b5dd146104aa578063b3ab66b0146104bf578063b88d4fde146104d257600080fd5b8063715018a6146104225780638da5cb5b1461043757806395d89b4114610455578063a22cb4651461046a57600080fd5b80633ccfd60b1161019057806355f804b31161015f57806355f804b3146103935780635c975abb146103b35780636352211e146103cd5780636c0360eb146103ed57806370a082311461040257600080fd5b80633ccfd60b1461031d57806341f434341461033257806342842e0e14610354578063518302271461037457600080fd5b8063095ea7b3116101cc578063095ea7b3146102a257806318160ddd146102c4578063235b6ea1146102e757806323b872dd146102fd57600080fd5b806301ffc9a7146101fe57806306fdde0314610233578063081812fc14610255578063081c8c441461028d575b600080fd5b34801561020a57600080fd5b5061021e610219366004611c12565b6105e7565b60405190151581526020015b60405180910390f35b34801561023f57600080fd5b50610248610639565b60405161022a9190611c7f565b34801561026157600080fd5b50610275610270366004611c92565b6106cb565b6040516001600160a01b03909116815260200161022a565b34801561029957600080fd5b506102486106f2565b3480156102ae57600080fd5b506102c26102bd366004611cc7565b610780565b005b3480156102d057600080fd5b506102d961089a565b60405190815260200161022a565b3480156102f357600080fd5b506102d9600d5481565b34801561030957600080fd5b506102c2610318366004611cf1565b6108aa565b34801561032957600080fd5b506102c26108d5565b34801561033e57600080fd5b506102756daaeb6d7670e522a718067333cd4e81565b34801561036057600080fd5b506102c261036f366004611cf1565b610a55565b34801561038057600080fd5b50600c5461021e90610100900460ff1681565b34801561039f57600080fd5b506102c26103ae366004611db9565b610a7a565b3480156103bf57600080fd5b50600c5461021e9060ff1681565b3480156103d957600080fd5b506102756103e8366004611c92565b610a92565b3480156103f957600080fd5b50610248610af2565b34801561040e57600080fd5b506102d961041d366004611e02565b610aff565b34801561042e57600080fd5b506102c2610b85565b34801561044357600080fd5b506006546001600160a01b0316610275565b34801561046157600080fd5b50610248610b99565b34801561047657600080fd5b506102c2610485366004611e2b565b610ba8565b34801561049657600080fd5b50600c5461021e9062010000900460ff1681565b3480156104b657600080fd5b506102c2610bb3565b6102c26104cd366004611c92565b610bcc565b3480156104de57600080fd5b506102c26104ed366004611e62565b610e31565b3480156104fe57600080fd5b506102c2610e5e565b34801561051357600080fd5b50610248610e7a565b34801561052857600080fd5b50610248610537366004611c92565b610e87565b34801561054857600080fd5b506102d960085481565b34801561055e57600080fd5b506102c261056d366004611db9565b61100b565b34801561057e57600080fd5b506102c261101f565b34801561059357600080fd5b5061021e6105a2366004611ede565b611046565b3480156105b357600080fd5b506102c26105c2366004611db9565b611074565b3480156105d357600080fd5b506102c26105e2366004611e02565b611088565b60006001600160e01b031982166380ac58cd60e01b148061061857506001600160e01b03198216635b5e139f60e01b145b8061063357506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461064890611f11565b80601f016020809104026020016040519081016040528092919081815260200182805461067490611f11565b80156106c15780601f10610696576101008083540402835291602001916106c1565b820191906000526020600020905b8154815290600101906020018083116106a457829003601f168201915b5050505050905090565b60006106d682611101565b506000908152600460205260409020546001600160a01b031690565b600a80546106ff90611f11565b80601f016020809104026020016040519081016040528092919081815260200182805461072b90611f11565b80156107785780601f1061074d57610100808354040283529160200191610778565b820191906000526020600020905b81548152906001019060200180831161075b57829003601f168201915b505050505081565b600061078b82610a92565b9050806001600160a01b0316836001600160a01b0316036107fd5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b038216148061081957506108198133611046565b61088b5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c00000060648201526084016107f4565b6108958383611160565b505050565b60006108a5600e5490565b905090565b826001600160a01b03811633146108c4576108c4336111ce565b6108cf848484611287565b50505050565b6108dd6112b8565b4760007328f4df239872b9587345c88a8ed676a7d2754ecc6064610902846050611f61565b61090c9190611f78565b604051600081818185875af1925050503d8060008114610948576040519150601f19603f3d011682016040523d82523d6000602084013e61094d565b606091505b505090508061095b57600080fd5b60007385a5d9347ff88d03ffcd01ad9393cf7d42acfa92606461097f856005611f61565b6109899190611f78565b604051600081818185875af1925050503d80600081146109c5576040519150601f19603f3d011682016040523d82523d6000602084013e6109ca565b606091505b50509050806109d857600080fd5b600073241926e653de1deb3ba170b23128f683f8c2016f60646109fc86600f611f61565b610a069190611f78565b604051600081818185875af1925050503d8060008114610a42576040519150601f19603f3d011682016040523d82523d6000602084013e610a47565b606091505b50509050806108cf57600080fd5b826001600160a01b0381163314610a6f57610a6f336111ce565b6108cf848484611312565b610a826112b8565b6009610a8e8282611fe8565b5050565b6000818152600260205260408120546001600160a01b0316806106335760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016107f4565b600980546106ff90611f11565b60006001600160a01b038216610b695760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016107f4565b506001600160a01b031660009081526003602052604090205490565b610b8d6112b8565b610b97600061132d565b565b60606001805461064890611f11565b610a8e33838361137f565b610bbb6112b8565b600c805461ff001916610100179055565b333214610c105760405162461bcd60e51b81526020600482015260126024820152712737ba1030b63637bbb2b21037b934b3b4b760711b60448201526064016107f4565b600c5462010000900460ff16610c745760405162461bcd60e51b8152602060048201526024808201527f4d6f6465726e20417274205468656f72793a205075626c696353616c652069736044820152631027a32360e11b60648201526084016107f4565b600c5460ff1615610cd55760405162461bcd60e51b815260206004820152602560248201527f4d6f6465726e20417274205468656f72793a20436f6e74726163742069732070604482015264185d5cd95960da1b60648201526084016107f4565b60008111610d255760405162461bcd60e51b815260206004820152601e60248201527f4d6f6465726e20417274205468656f72793a207a65726f20616d6f756e74000060448201526064016107f4565b6000610d30600e5490565b600854909150610d4083836120a8565b1115610d9d5760405162461bcd60e51b815260206004820152602660248201527f4d6f6465726e20417274205468656f72793a204d617820737570706c7920657860448201526518d95959195960d21b60648201526084016107f4565b3482600d54610dac9190611f61565b1115610e0c5760405162461bcd60e51b815260206004820152602960248201527f4d6f6465726e20417274205468656f72793a204e6f7420656e6f7567682065746044820152681a195c9cc81cd95b9d60ba1b60648201526084016107f4565b60005b8281101561089557610e1f61144d565b80610e29816120bb565b915050610e0f565b836001600160a01b0381163314610e4b57610e4b336111ce565b610e5785858585611485565b5050505050565b610e666112b8565b600c805460ff19811660ff90911615179055565b600b80546106ff90611f11565b6000818152600260205260409020546060906001600160a01b0316610f065760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016107f4565b600c54610100900460ff161515600003610fac57600a8054610f2790611f11565b80601f0160208091040260200160405190810160405280929190818152602001828054610f5390611f11565b8015610fa05780601f10610f7557610100808354040283529160200191610fa0565b820191906000526020600020905b815481529060010190602001808311610f8357829003601f168201915b50505050509050919050565b6000610fb66114b7565b90506000815111610fd65760405180602001604052806000815250611004565b80610fe0846114c6565b600b604051602001610ff4939291906120d4565b6040516020818303038152906040525b9392505050565b6110136112b8565b600b610a8e8282611fe8565b6110276112b8565b600c805462ff0000198116620100009182900460ff1615909102179055565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b61107c6112b8565b600a610a8e8282611fe8565b6110906112b8565b6001600160a01b0381166110f55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107f4565b6110fe8161132d565b50565b6000818152600260205260409020546001600160a01b03166110fe5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016107f4565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061119582610a92565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6daaeb6d7670e522a718067333cd4e3b156110fe57604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa15801561123b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125f9190612174565b6110fe57604051633b79c77360e21b81526001600160a01b03821660048201526024016107f4565b6112913382611559565b6112ad5760405162461bcd60e51b81526004016107f490612191565b6108958383836115b8565b6006546001600160a01b03163314610b975760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107f4565b61089583838360405180602001604052806000815250610e31565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316036113e05760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107f4565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611455611729565b611463600e80546001019055565b600061146e600e5490565b905061147a3382611782565b50610b976001600755565b61148f3383611559565b6114ab5760405162461bcd60e51b81526004016107f490612191565b6108cf8484848461179c565b60606009805461064890611f11565b606060006114d3836117cf565b600101905060008167ffffffffffffffff8111156114f3576114f3611d2d565b6040519080825280601f01601f19166020018201604052801561151d576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461152757509392505050565b60008061156583610a92565b9050806001600160a01b0316846001600160a01b0316148061158c575061158c8185611046565b806115b05750836001600160a01b03166115a5846106cb565b6001600160a01b0316145b949350505050565b826001600160a01b03166115cb82610a92565b6001600160a01b0316146115f15760405162461bcd60e51b81526004016107f4906121de565b6001600160a01b0382166116535760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016107f4565b61166083838360016118a7565b826001600160a01b031661167382610a92565b6001600160a01b0316146116995760405162461bcd60e51b81526004016107f4906121de565b600081815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260038552838620805460001901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60026007540361177b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107f4565b6002600755565b610a8e82826040518060200160405280600081525061192f565b6117a78484846115b8565b6117b384848484611962565b6108cf5760405162461bcd60e51b81526004016107f490612223565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b831061180e5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef8100000000831061183a576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061185857662386f26fc10000830492506010015b6305f5e1008310611870576305f5e100830492506008015b612710831061188457612710830492506004015b60648310611896576064830492506002015b600a83106106335760010192915050565b60018111156108cf576001600160a01b038416156118ed576001600160a01b038416600090815260036020526040812080548392906118e7908490612275565b90915550505b6001600160a01b038316156108cf576001600160a01b038316600090815260036020526040812080548392906119249084906120a8565b909155505050505050565b6119398383611a63565b6119466000848484611962565b6108955760405162461bcd60e51b81526004016107f490612223565b60006001600160a01b0384163b15611a5857604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906119a6903390899088908890600401612288565b6020604051808303816000875af19250505080156119e1575060408051601f3d908101601f191682019092526119de918101906122c5565b60015b611a3e573d808015611a0f576040519150601f19603f3d011682016040523d82523d6000602084013e611a14565b606091505b508051600003611a365760405162461bcd60e51b81526004016107f490612223565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506115b0565b506001949350505050565b6001600160a01b038216611ab95760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107f4565b6000818152600260205260409020546001600160a01b031615611b1e5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107f4565b611b2c6000838360016118a7565b6000818152600260205260409020546001600160a01b031615611b915760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107f4565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160e01b0319811681146110fe57600080fd5b600060208284031215611c2457600080fd5b813561100481611bfc565b60005b83811015611c4a578181015183820152602001611c32565b50506000910152565b60008151808452611c6b816020860160208601611c2f565b601f01601f19169290920160200192915050565b6020815260006110046020830184611c53565b600060208284031215611ca457600080fd5b5035919050565b80356001600160a01b0381168114611cc257600080fd5b919050565b60008060408385031215611cda57600080fd5b611ce383611cab565b946020939093013593505050565b600080600060608486031215611d0657600080fd5b611d0f84611cab565b9250611d1d60208501611cab565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611d5e57611d5e611d2d565b604051601f8501601f19908116603f01168101908282118183101715611d8657611d86611d2d565b81604052809350858152868686011115611d9f57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611dcb57600080fd5b813567ffffffffffffffff811115611de257600080fd5b8201601f81018413611df357600080fd5b6115b084823560208401611d43565b600060208284031215611e1457600080fd5b61100482611cab565b80151581146110fe57600080fd5b60008060408385031215611e3e57600080fd5b611e4783611cab565b91506020830135611e5781611e1d565b809150509250929050565b60008060008060808587031215611e7857600080fd5b611e8185611cab565b9350611e8f60208601611cab565b925060408501359150606085013567ffffffffffffffff811115611eb257600080fd5b8501601f81018713611ec357600080fd5b611ed287823560208401611d43565b91505092959194509250565b60008060408385031215611ef157600080fd5b611efa83611cab565b9150611f0860208401611cab565b90509250929050565b600181811c90821680611f2557607f821691505b602082108103611f4557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761063357610633611f4b565b600082611f9557634e487b7160e01b600052601260045260246000fd5b500490565b601f82111561089557600081815260208120601f850160051c81016020861015611fc15750805b601f850160051c820191505b81811015611fe057828155600101611fcd565b505050505050565b815167ffffffffffffffff81111561200257612002611d2d565b612016816120108454611f11565b84611f9a565b602080601f83116001811461204b57600084156120335750858301515b600019600386901b1c1916600185901b178555611fe0565b600085815260208120601f198616915b8281101561207a5788860151825594840194600190910190840161205b565b50858210156120985787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8082018082111561063357610633611f4b565b6000600182016120cd576120cd611f4b565b5060010190565b6000845160206120e78285838a01611c2f565b8551918401916120fa8184848a01611c2f565b855492019160009061210b81611f11565b60018281168015612123576001811461213857612164565b60ff1984168752821515830287019450612164565b896000528560002060005b8481101561215c57815489820152908301908701612143565b505082870194505b50929a9950505050505050505050565b60006020828403121561218657600080fd5b815161100481611e1d565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b8181038181111561063357610633611f4b565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906122bb90830184611c53565b9695505050505050565b6000602082840312156122d757600080fd5b815161100481611bfc56fea2646970667358221220362d9bfca8567e731ec85953d81fcbe418e77825ad7af4e0b59bba8824185e7164736f6c63430008110033
Deployed Bytecode Sourcemap
73929:4906:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57921:305;;;;;;;;;;-1:-1:-1;57921:305:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;57921:305:0;;;;;;;;58849:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;60361:171::-;;;;;;;;;;-1:-1:-1;60361:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;60361:171:0;1533:203:1;74179:111:0;;;;;;;;;;;;;:::i;59879:416::-;;;;;;;;;;-1:-1:-1;59879:416:0;;;;;:::i;:::-;;:::i;:::-;;78053:102;;;;;;;;;;;;;:::i;:::-;;;2324:25:1;;;2312:2;2297:18;78053:102:0;2178:177:1;74461:35:0;;;;;;;;;;;;;;;;77120:167;;;;;;;;;;-1:-1:-1;77120:167:0;;;;;:::i;:::-;;:::i;78212:618::-;;;;;;;;;;;;;:::i;2922:143::-;;;;;;;;;;;;3022:42;2922:143;;77299:175;;;;;;;;;;-1:-1:-1;77299:175:0;;;;;:::i;:::-;;:::i;74384:28::-;;;;;;;;;;-1:-1:-1;74384:28:0;;;;;;;;;;;74757:112;;;;;;;;;;-1:-1:-1;74757:112:0;;;;;:::i;:::-;;:::i;74349:26::-;;;;;;;;;;-1:-1:-1;74349:26:0;;;;;;;;58559:223;;;;;;;;;;-1:-1:-1;58559:223:0;;;;;:::i;:::-;;:::i;74149:21::-;;;;;;;;;;;;;:::i;58290:207::-;;;;;;;;;;-1:-1:-1;58290:207:0;;;;;:::i;:::-;;:::i;37352:103::-;;;;;;;;;;;;;:::i;36704:87::-;;;;;;;;;;-1:-1:-1;36777:6:0;;-1:-1:-1;;;;;36777:6:0;36704:87;;59018:104;;;;;;;;;;;;;:::i;60604:155::-;;;;;;;;;;-1:-1:-1;60604:155:0;;;;;:::i;:::-;;:::i;74421:27::-;;;;;;;;;;-1:-1:-1;74421:27:0;;;;;;;;;;;74997:73;;;;;;;;;;;;;:::i;75398:720::-;;;;;;:::i;:::-;;:::i;77486:240::-;;;;;;;;;;-1:-1:-1;77486:240:0;;;;;:::i;:::-;;:::i;75209:79::-;;;;;;;;;;;;;:::i;74299:37::-;;;;;;;;;;;;;:::i;76329:779::-;;;;;;;;;;-1:-1:-1;76329:779:0;;;;;:::i;:::-;;:::i;74106:30::-;;;;;;;;;;;;;;;;77738:161;;;;;;;;;;-1:-1:-1;77738:161:0;;;;;:::i;:::-;;:::i;75300:86::-;;;;;;;;;;;;;:::i;60830:164::-;;;;;;;;;;-1:-1:-1;60830:164:0;;;;;:::i;:::-;;:::i;77911:130::-;;;;;;;;;;-1:-1:-1;77911:130:0;;;;;:::i;:::-;;:::i;37610:201::-;;;;;;;;;;-1:-1:-1;37610:201:0;;;;;:::i;:::-;;:::i;57921:305::-;58023:4;-1:-1:-1;;;;;;58060:40:0;;-1:-1:-1;;;58060:40:0;;:105;;-1:-1:-1;;;;;;;58117:48:0;;-1:-1:-1;;;58117:48:0;58060:105;:158;;;-1:-1:-1;;;;;;;;;;50542:40:0;;;58182:36;58040:178;57921:305;-1:-1:-1;;57921:305:0:o;58849:100::-;58903:13;58936:5;58929:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58849:100;:::o;60361:171::-;60437:7;60457:23;60472:7;60457:14;:23::i;:::-;-1:-1:-1;60500:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;60500:24:0;;60361:171::o;74179:111::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;59879:416::-;59960:13;59976:23;59991:7;59976:14;:23::i;:::-;59960:39;;60024:5;-1:-1:-1;;;;;60018:11:0;:2;-1:-1:-1;;;;;60018:11:0;;60010:57;;;;-1:-1:-1;;;60010:57:0;;6315:2:1;60010:57:0;;;6297:21:1;6354:2;6334:18;;;6327:30;6393:34;6373:18;;;6366:62;-1:-1:-1;;;6444:18:1;;;6437:31;6485:19;;60010:57:0;;;;;;;;;35335:10;-1:-1:-1;;;;;60102:21:0;;;;:62;;-1:-1:-1;60127:37:0;60144:5;35335:10;60830:164;:::i;60127:37::-;60080:173;;;;-1:-1:-1;;;60080:173:0;;6717:2:1;60080:173:0;;;6699:21:1;6756:2;6736:18;;;6729:30;6795:34;6775:18;;;6768:62;6866:31;6846:18;;;6839:59;6915:19;;60080:173:0;6515:425:1;60080:173:0;60266:21;60275:2;60279:7;60266:8;:21::i;:::-;59949:346;59879:416;;:::o;78053:102::-;78097:7;78126:19;:9;6369:14;;6277:114;78126:19;78119:26;;78053:102;:::o;77120:167::-;77221:4;-1:-1:-1;;;;;4263:18:0;;4271:10;4263:18;4259:83;;4298:32;4319:10;4298:20;:32::i;:::-;77240:37:::1;77259:4;77265:2;77269:7;77240:18;:37::i;:::-;77120:167:::0;;;;:::o;78212:618::-;36590:13;:11;:13::i;:::-;78345:21:::1;78320:22;78405:42;78483:3;78461:19;78345:21:::0;78478:2:::1;78461:19;:::i;:::-;:25;;;;:::i;:::-;78397:94;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78383:108;;;78512:2;78504:11;;;::::0;::::1;;78541:7;78562:42;78639:3;78618:18;:14:::0;78635:1:::1;78618:18;:::i;:::-;:24;;;;:::i;:::-;78554:93;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78540:107;;;78668:2;78660:11;;;::::0;::::1;;78689:7;78710:42;78788:3;78766:19;:14:::0;78783:2:::1;78766:19;:::i;:::-;:25;;;;:::i;:::-;78702:94;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78688:108;;;78817:2;78809:11;;;::::0;::::1;77299:175:::0;77404:4;-1:-1:-1;;;;;4263:18:0;;4271:10;4263:18;4259:83;;4298:32;4319:10;4298:20;:32::i;:::-;77423:41:::1;77446:4;77452:2;77456:7;77423:22;:41::i;74757:112::-:0;36590:13;:11;:13::i;:::-;74836:7:::1;:23;74846:13:::0;74836:7;:23:::1;:::i;:::-;;74757:112:::0;:::o;58559:223::-;58631:7;63446:16;;;:7;:16;;;;;;-1:-1:-1;;;;;63446:16:0;;58695:56;;;;-1:-1:-1;;;58695:56:0;;10220:2:1;58695:56:0;;;10202:21:1;10259:2;10239:18;;;10232:30;-1:-1:-1;;;10278:18:1;;;10271:54;10342:18;;58695:56:0;10018:348:1;74149:21:0;;;;;;;:::i;58290:207::-;58362:7;-1:-1:-1;;;;;58390:19:0;;58382:73;;;;-1:-1:-1;;;58382:73:0;;10573:2:1;58382:73:0;;;10555:21:1;10612:2;10592:18;;;10585:30;10651:34;10631:18;;;10624:62;-1:-1:-1;;;10702:18:1;;;10695:39;10751:19;;58382:73:0;10371:405:1;58382:73:0;-1:-1:-1;;;;;;58473:16:0;;;;;:9;:16;;;;;;;58290:207::o;37352:103::-;36590:13;:11;:13::i;:::-;37417:30:::1;37444:1;37417:18;:30::i;:::-;37352:103::o:0;59018:104::-;59074:13;59107:7;59100:14;;;;;:::i;60604:155::-;60699:52;35335:10;60732:8;60742;60699:18;:52::i;74997:73::-;36590:13;:11;:13::i;:::-;75045:8:::1;:15:::0;;-1:-1:-1;;75045:15:0::1;;;::::0;;74997:73::o;75398:720::-;75127:10;75141:9;75127:23;75119:54;;;;-1:-1:-1;;;75119:54:0;;10983:2:1;75119:54:0;;;10965:21:1;11022:2;11002:18;;;10995:30;-1:-1:-1;;;11041:18:1;;;11034:48;11099:18;;75119:54:0;10781:342:1;75119:54:0;75490:7:::1;::::0;;;::::1;;;75482:56;;;::::0;-1:-1:-1;;;75482:56:0;;11330:2:1;75482:56:0::1;::::0;::::1;11312:21:1::0;11369:2;11349:18;;;11342:30;11408:34;11388:18;;;11381:62;-1:-1:-1;;;11459:18:1;;;11452:34;11503:19;;75482:56:0::1;11128:400:1::0;75482:56:0::1;75560:6;::::0;::::1;;75559:7;75551:57;;;::::0;-1:-1:-1;;;75551:57:0;;11735:2:1;75551:57:0::1;::::0;::::1;11717:21:1::0;11774:2;11754:18;;;11747:30;11813:34;11793:18;;;11786:62;-1:-1:-1;;;11864:18:1;;;11857:35;11909:19;;75551:57:0::1;11533:401:1::0;75551:57:0::1;75639:1;75629:7;:11;75621:54;;;::::0;-1:-1:-1;;;75621:54:0;;12141:2:1;75621:54:0::1;::::0;::::1;12123:21:1::0;12180:2;12160:18;;;12153:30;12219:32;12199:18;;;12192:60;12269:18;;75621:54:0::1;11939:354:1::0;75621:54:0::1;75692:15;75710:19;:9;6369:14:::0;;6277:114;75710:19:::1;75791:9;::::0;75692:37;;-1:-1:-1;75770:17:0::1;75780:7:::0;75692:37;75770:17:::1;:::i;:::-;:30;;75746:124;;;::::0;-1:-1:-1;;;75746:124:0;;12630:2:1;75746:124:0::1;::::0;::::1;12612:21:1::0;12669:2;12649:18;;;12642:30;12708:34;12688:18;;;12681:62;-1:-1:-1;;;12759:18:1;;;12752:36;12805:19;;75746:124:0::1;12428:402:1::0;75746:124:0::1;75927:9;75916:7;75907:6;;:16;;;;:::i;:::-;:29;;75883:126;;;::::0;-1:-1:-1;;;75883:126:0;;13037:2:1;75883:126:0::1;::::0;::::1;13019:21:1::0;13076:2;13056:18;;;13049:30;13115:34;13095:18;;;13088:62;-1:-1:-1;;;13166:18:1;;;13159:39;13215:19;;75883:126:0::1;12835:405:1::0;75883:126:0::1;76031:9;76026:83;76050:7;76046:1;:11;76026:83;;;76081:14;:12;:14::i;:::-;76059:3:::0;::::1;::::0;::::1;:::i;:::-;;;;76026:83;;77486:240:::0;77643:4;-1:-1:-1;;;;;4263:18:0;;4271:10;4263:18;4259:83;;4298:32;4319:10;4298:20;:32::i;:::-;77669:47:::1;77692:4;77698:2;77702:7;77711:4;77669:22;:47::i;:::-;77486:240:::0;;;;;:::o;75209:79::-;36590:13;:11;:13::i;:::-;75272:6:::1;::::0;;-1:-1:-1;;75262:16:0;::::1;75272:6;::::0;;::::1;75271:7;75262:16;::::0;;75209:79::o;74299:37::-;;;;;;;:::i;76329:779::-;63848:4;63446:16;;;:7;:16;;;;;;76457:13;;-1:-1:-1;;;;;63446:16:0;76492:119;;;;-1:-1:-1;;;76492:119:0;;13587:2:1;76492:119:0;;;13569:21:1;13626:2;13606:18;;;13599:30;13665:34;13645:18;;;13638:62;-1:-1:-1;;;13716:18:1;;;13709:45;13771:19;;76492:119:0;13385:411:1;76492:119:0;76628:8;;;;;;;:17;;76640:5;76628:17;76624:75;;76671:14;76664:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76329:779;;;:::o;76624:75::-;76715:28;76746:10;:8;:10::i;:::-;76715:41;;76826:1;76801:14;76795:28;:32;:303;;;;;;;;;;;;;;;;;76925:14;76968:18;:7;:16;:18::i;:::-;77015:13;76880:173;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;76795:303;76773:325;76329:779;-1:-1:-1;;;76329:779:0:o;77738:161::-;36590:13;:11;:13::i;:::-;77856::::1;:33;77872:17:::0;77856:13;:33:::1;:::i;75300:86::-:0;36590:13;:11;:13::i;:::-;75369:7:::1;::::0;;-1:-1:-1;;75358:18:0;::::1;75369:7:::0;;;;::::1;;;75368:8;75358:18:::0;;::::1;;::::0;;75300:86::o;60830:164::-;-1:-1:-1;;;;;60951:25:0;;;60927:4;60951:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;60830:164::o;77911:130::-;36590:13;:11;:13::i;:::-;77999:14:::1;:32;78016:15:::0;77999:14;:32:::1;:::i;37610:201::-:0;36590:13;:11;:13::i;:::-;-1:-1:-1;;;;;37699:22:0;::::1;37691:73;;;::::0;-1:-1:-1;;;37691:73:0;;15264:2:1;37691:73:0::1;::::0;::::1;15246:21:1::0;15303:2;15283:18;;;15276:30;15342:34;15322:18;;;15315:62;-1:-1:-1;;;15393:18:1;;;15386:36;15439:19;;37691:73:0::1;15062:402:1::0;37691:73:0::1;37775:28;37794:8;37775:18;:28::i;:::-;37610:201:::0;:::o;70180:135::-;63848:4;63446:16;;;:7;:16;;;;;;-1:-1:-1;;;;;63446:16:0;70254:53;;;;-1:-1:-1;;;70254:53:0;;10220:2:1;70254:53:0;;;10202:21:1;10259:2;10239:18;;;10232:30;-1:-1:-1;;;10278:18:1;;;10271:54;10342:18;;70254:53:0;10018:348:1;69459:174:0;69534:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;69534:29:0;-1:-1:-1;;;;;69534:29:0;;;;;;;;:24;;69588:23;69534:24;69588:14;:23::i;:::-;-1:-1:-1;;;;;69579:46:0;;;;;;;;;;;69459:174;;:::o;4505:419::-;3022:42;4696:45;:49;4692:225;;4767:67;;-1:-1:-1;;;4767:67:0;;4818:4;4767:67;;;15681:34:1;-1:-1:-1;;;;;15751:15:1;;15731:18;;;15724:43;3022:42:0;;4767;;15616:18:1;;4767:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4762:144;;4862:28;;-1:-1:-1;;;4862:28:0;;-1:-1:-1;;;;;1697:32:1;;4862:28:0;;;1679:51:1;1652:18;;4862:28:0;1533:203:1;61061:335:0;61256:41;35335:10;61289:7;61256:18;:41::i;:::-;61248:99;;;;-1:-1:-1;;;61248:99:0;;;;;;;:::i;:::-;61360:28;61370:4;61376:2;61380:7;61360:9;:28::i;36869:132::-;36777:6;;-1:-1:-1;;;;;36777:6:0;35335:10;36933:23;36925:68;;;;-1:-1:-1;;;36925:68:0;;16644:2:1;36925:68:0;;;16626:21:1;;;16663:18;;;16656:30;16722:34;16702:18;;;16695:62;16774:18;;36925:68:0;16442:356:1;61467:185:0;61605:39;61622:4;61628:2;61632:7;61605:39;;;;;;;;;;;;:16;:39::i;37971:191::-;38064:6;;;-1:-1:-1;;;;;38081:17:0;;;-1:-1:-1;;;;;;38081:17:0;;;;;;;38114:40;;38064:6;;;38081:17;38064:6;;38114:40;;38045:16;;38114:40;38034:128;37971:191;:::o;69776:315::-;69931:8;-1:-1:-1;;;;;69922:17:0;:5;-1:-1:-1;;;;;69922:17:0;;69914:55;;;;-1:-1:-1;;;69914:55:0;;17005:2:1;69914:55:0;;;16987:21:1;17044:2;17024:18;;;17017:30;17083:27;17063:18;;;17056:55;17128:18;;69914:55:0;16803:349:1;69914:55:0;-1:-1:-1;;;;;69980:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;69980:46:0;;;;;;;;;;70042:41;;540::1;;;70042::0;;513:18:1;70042:41:0;;;;;;;69776:315;;;:::o;76130:187::-;18776:21;:19;:21::i;:::-;76189::::1;:9;6488:19:::0;;6506:1;6488:19;;;6399:127;76189:21:::1;76227:15;76245:19;:9;6369:14:::0;;6277:114;76245:19:::1;76227:37;;76277:30;76287:10;76299:7;76277:9;:30::i;:::-;76176:141;18820:20:::0;18214:1;19340:7;:22;19157:213;61723:322;61897:41;35335:10;61930:7;61897:18;:41::i;:::-;61889:99;;;;-1:-1:-1;;;61889:99:0;;;;;;;:::i;:::-;61999:38;62013:4;62019:2;62023:7;62032:4;61999:13;:38::i;74881:104::-;74933:13;74968:7;74961:14;;;;;:::i;32682:716::-;32738:13;32789:14;32806:17;32817:5;32806:10;:17::i;:::-;32826:1;32806:21;32789:38;;32842:20;32876:6;32865:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32865:18:0;-1:-1:-1;32842:41:0;-1:-1:-1;33007:28:0;;;33023:2;33007:28;33064:288;-1:-1:-1;;33096:5:0;-1:-1:-1;;;33233:2:0;33222:14;;33217:30;33096:5;33204:44;33294:2;33285:11;;;-1:-1:-1;33315:21:0;33064:288;33315:21;-1:-1:-1;33373:6:0;32682:716;-1:-1:-1;;;32682:716:0:o;64078:264::-;64171:4;64188:13;64204:23;64219:7;64204:14;:23::i;:::-;64188:39;;64257:5;-1:-1:-1;;;;;64246:16:0;:7;-1:-1:-1;;;;;64246:16:0;;:52;;;;64266:32;64283:5;64290:7;64266:16;:32::i;:::-;64246:87;;;;64326:7;-1:-1:-1;;;;;64302:31:0;:20;64314:7;64302:11;:20::i;:::-;-1:-1:-1;;;;;64302:31:0;;64246:87;64238:96;64078:264;-1:-1:-1;;;;64078:264:0:o;68077:1263::-;68236:4;-1:-1:-1;;;;;68209:31:0;:23;68224:7;68209:14;:23::i;:::-;-1:-1:-1;;;;;68209:31:0;;68201:81;;;;-1:-1:-1;;;68201:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;68301:16:0;;68293:65;;;;-1:-1:-1;;;68293:65:0;;17765:2:1;68293:65:0;;;17747:21:1;17804:2;17784:18;;;17777:30;17843:34;17823:18;;;17816:62;-1:-1:-1;;;17894:18:1;;;17887:34;17938:19;;68293:65:0;17563:400:1;68293:65:0;68371:42;68392:4;68398:2;68402:7;68411:1;68371:20;:42::i;:::-;68543:4;-1:-1:-1;;;;;68516:31:0;:23;68531:7;68516:14;:23::i;:::-;-1:-1:-1;;;;;68516:31:0;;68508:81;;;;-1:-1:-1;;;68508:81:0;;;;;;;:::i;:::-;68661:24;;;;:15;:24;;;;;;;;68654:31;;-1:-1:-1;;;;;;68654:31:0;;;;;;-1:-1:-1;;;;;69137:15:0;;;;;;:9;:15;;;;;:20;;-1:-1:-1;;69137:20:0;;;69172:13;;;;;;;;;:18;;68654:31;69172:18;;;69212:16;;;:7;:16;;;;;;:21;;;;;;;;;;69251:27;;68677:7;;69251:27;;;59949:346;59879:416;;:::o;18856:293::-;18258:1;18990:7;;:19;18982:63;;;;-1:-1:-1;;;18982:63:0;;18170:2:1;18982:63:0;;;18152:21:1;18209:2;18189:18;;;18182:30;18248:33;18228:18;;;18221:61;18299:18;;18982:63:0;17968:355:1;18982:63:0;18258:1;19123:7;:18;18856:293::o;64684:110::-;64760:26;64770:2;64774:7;64760:26;;;;;;;;;;;;:9;:26::i;62926:313::-;63082:28;63092:4;63098:2;63102:7;63082:9;:28::i;:::-;63129:47;63152:4;63158:2;63162:7;63171:4;63129:22;:47::i;:::-;63121:110;;;;-1:-1:-1;;;63121:110:0;;;;;;;:::i;29548:922::-;29601:7;;-1:-1:-1;;;29679:15:0;;29675:102;;-1:-1:-1;;;29715:15:0;;;-1:-1:-1;29759:2:0;29749:12;29675:102;29804:6;29795:5;:15;29791:102;;29840:6;29831:15;;;-1:-1:-1;29875:2:0;29865:12;29791:102;29920:6;29911:5;:15;29907:102;;29956:6;29947:15;;;-1:-1:-1;29991:2:0;29981:12;29907:102;30036:5;30027;:14;30023:99;;30071:5;30062:14;;;-1:-1:-1;30105:1:0;30095:11;30023:99;30149:5;30140;:14;30136:99;;30184:5;30175:14;;;-1:-1:-1;30218:1:0;30208:11;30136:99;30262:5;30253;:14;30249:99;;30297:5;30288:14;;;-1:-1:-1;30331:1:0;30321:11;30249:99;30375:5;30366;:14;30362:66;;30411:1;30401:11;30456:6;29548:922;-1:-1:-1;;29548:922:0:o;72464:410::-;72654:1;72642:9;:13;72638:229;;;-1:-1:-1;;;;;72676:18:0;;;72672:87;;-1:-1:-1;;;;;72715:15:0;;;;;;:9;:15;;;;;:28;;72734:9;;72715:15;:28;;72734:9;;72715:28;:::i;:::-;;;;-1:-1:-1;;72672:87:0;-1:-1:-1;;;;;72777:16:0;;;72773:83;;-1:-1:-1;;;;;72814:13:0;;;;;;:9;:13;;;;;:26;;72831:9;;72814:13;:26;;72831:9;;72814:26;:::i;:::-;;;;-1:-1:-1;;72464:410:0;;;;:::o;65021:319::-;65150:18;65156:2;65160:7;65150:5;:18::i;:::-;65201:53;65232:1;65236:2;65240:7;65249:4;65201:22;:53::i;:::-;65179:153;;;;-1:-1:-1;;;65179:153:0;;;;;;;:::i;70879:853::-;71033:4;-1:-1:-1;;;;;71054:13:0;;39697:19;:23;71050:675;;71090:71;;-1:-1:-1;;;71090:71:0;;-1:-1:-1;;;;;71090:36:0;;;;;:71;;35335:10;;71141:4;;71147:7;;71156:4;;71090:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;71090:71:0;;;;;;;;-1:-1:-1;;71090:71:0;;;;;;;;;;;;:::i;:::-;;;71086:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71331:6;:13;71348:1;71331:18;71327:328;;71374:60;;-1:-1:-1;;;71374:60:0;;;;;;;:::i;71327:328::-;71605:6;71599:13;71590:6;71586:2;71582:15;71575:38;71086:584;-1:-1:-1;;;;;;71212:51:0;-1:-1:-1;;;71212:51:0;;-1:-1:-1;71205:58:0;;71050:675;-1:-1:-1;71709:4:0;70879:853;;;;;;:::o;65676:942::-;-1:-1:-1;;;;;65756:16:0;;65748:61;;;;-1:-1:-1;;;65748:61:0;;19830:2:1;65748:61:0;;;19812:21:1;;;19849:18;;;19842:30;19908:34;19888:18;;;19881:62;19960:18;;65748:61:0;19628:356:1;65748:61:0;63848:4;63446:16;;;:7;:16;;;;;;-1:-1:-1;;;;;63446:16:0;63872:31;65820:58;;;;-1:-1:-1;;;65820:58:0;;20191:2:1;65820:58:0;;;20173:21:1;20230:2;20210:18;;;20203:30;20269;20249:18;;;20242:58;20317:18;;65820:58:0;19989:352:1;65820:58:0;65891:48;65920:1;65924:2;65928:7;65937:1;65891:20;:48::i;:::-;63848:4;63446:16;;;:7;:16;;;;;;-1:-1:-1;;;;;63446:16:0;63872:31;66029:58;;;;-1:-1:-1;;;66029:58:0;;20191:2:1;66029:58:0;;;20173:21:1;20230:2;20210:18;;;20203:30;20269;20249:18;;;20242:58;20317:18;;66029:58:0;19989:352:1;66029:58:0;-1:-1:-1;;;;;66436:13:0;;;;;;:9;:13;;;;;;;;:18;;66453:1;66436:18;;;66478:16;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;66478:21:0;;;;;66517:33;66486:7;;66436:13;;66517:33;;66436:13;;66517:33;74836:23:::1;74757:112:::0;:::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:1;;1348:180;-1:-1:-1;1348:180:1:o;1741:173::-;1809:20;;-1:-1:-1;;;;;1858:31:1;;1848:42;;1838:70;;1904:1;1901;1894:12;1838:70;1741:173;;;:::o;1919:254::-;1987:6;1995;2048:2;2036:9;2027:7;2023:23;2019:32;2016:52;;;2064:1;2061;2054:12;2016:52;2087:29;2106:9;2087:29;:::i;:::-;2077:39;2163:2;2148:18;;;;2135:32;;-1:-1:-1;;;1919:254:1:o;2360:328::-;2437:6;2445;2453;2506:2;2494:9;2485:7;2481:23;2477:32;2474:52;;;2522:1;2519;2512:12;2474:52;2545:29;2564:9;2545:29;:::i;:::-;2535:39;;2593:38;2627:2;2616:9;2612:18;2593:38;:::i;:::-;2583:48;;2678:2;2667:9;2663:18;2650:32;2640:42;;2360:328;;;;;:::o;2932:127::-;2993:10;2988:3;2984:20;2981:1;2974:31;3024:4;3021:1;3014:15;3048:4;3045:1;3038:15;3064:632;3129:5;3159:18;3200:2;3192:6;3189:14;3186:40;;;3206:18;;:::i;:::-;3281:2;3275:9;3249:2;3335:15;;-1:-1:-1;;3331:24:1;;;3357:2;3327:33;3323:42;3311:55;;;3381:18;;;3401:22;;;3378:46;3375:72;;;3427:18;;:::i;:::-;3467:10;3463:2;3456:22;3496:6;3487:15;;3526:6;3518;3511:22;3566:3;3557:6;3552:3;3548:16;3545:25;3542:45;;;3583:1;3580;3573:12;3542:45;3633:6;3628:3;3621:4;3613:6;3609:17;3596:44;3688:1;3681:4;3672:6;3664;3660:19;3656:30;3649:41;;;;3064:632;;;;;:::o;3701:451::-;3770:6;3823:2;3811:9;3802:7;3798:23;3794:32;3791:52;;;3839:1;3836;3829:12;3791:52;3879:9;3866:23;3912:18;3904:6;3901:30;3898:50;;;3944:1;3941;3934:12;3898:50;3967:22;;4020:4;4012:13;;4008:27;-1:-1:-1;3998:55:1;;4049:1;4046;4039:12;3998:55;4072:74;4138:7;4133:2;4120:16;4115:2;4111;4107:11;4072:74;:::i;4157:186::-;4216:6;4269:2;4257:9;4248:7;4244:23;4240:32;4237:52;;;4285:1;4282;4275:12;4237:52;4308:29;4327:9;4308:29;:::i;4348:118::-;4434:5;4427:13;4420:21;4413:5;4410:32;4400:60;;4456:1;4453;4446:12;4471:315;4536:6;4544;4597:2;4585:9;4576:7;4572:23;4568:32;4565:52;;;4613:1;4610;4603:12;4565:52;4636:29;4655:9;4636:29;:::i;:::-;4626:39;;4715:2;4704:9;4700:18;4687:32;4728:28;4750:5;4728:28;:::i;:::-;4775:5;4765:15;;;4471:315;;;;;:::o;4791:667::-;4886:6;4894;4902;4910;4963:3;4951:9;4942:7;4938:23;4934:33;4931:53;;;4980:1;4977;4970:12;4931:53;5003:29;5022:9;5003:29;:::i;:::-;4993:39;;5051:38;5085:2;5074:9;5070:18;5051:38;:::i;:::-;5041:48;;5136:2;5125:9;5121:18;5108:32;5098:42;;5191:2;5180:9;5176:18;5163:32;5218:18;5210:6;5207:30;5204:50;;;5250:1;5247;5240:12;5204:50;5273:22;;5326:4;5318:13;;5314:27;-1:-1:-1;5304:55:1;;5355:1;5352;5345:12;5304:55;5378:74;5444:7;5439:2;5426:16;5421:2;5417;5413:11;5378:74;:::i;:::-;5368:84;;;4791:667;;;;;;;:::o;5463:260::-;5531:6;5539;5592:2;5580:9;5571:7;5567:23;5563:32;5560:52;;;5608:1;5605;5598:12;5560:52;5631:29;5650:9;5631:29;:::i;:::-;5621:39;;5679:38;5713:2;5702:9;5698:18;5679:38;:::i;:::-;5669:48;;5463:260;;;;;:::o;5728:380::-;5807:1;5803:12;;;;5850;;;5871:61;;5925:4;5917:6;5913:17;5903:27;;5871:61;5978:2;5970:6;5967:14;5947:18;5944:38;5941:161;;6024:10;6019:3;6015:20;6012:1;6005:31;6059:4;6056:1;6049:15;6087:4;6084:1;6077:15;5941:161;;5728:380;;;:::o;6945:127::-;7006:10;7001:3;6997:20;6994:1;6987:31;7037:4;7034:1;7027:15;7061:4;7058:1;7051:15;7077:168;7150:9;;;7181;;7198:15;;;7192:22;;7178:37;7168:71;;7219:18;;:::i;7382:217::-;7422:1;7448;7438:132;;7492:10;7487:3;7483:20;7480:1;7473:31;7527:4;7524:1;7517:15;7555:4;7552:1;7545:15;7438:132;-1:-1:-1;7584:9:1;;7382:217::o;7940:545::-;8042:2;8037:3;8034:11;8031:448;;;8078:1;8103:5;8099:2;8092:17;8148:4;8144:2;8134:19;8218:2;8206:10;8202:19;8199:1;8195:27;8189:4;8185:38;8254:4;8242:10;8239:20;8236:47;;;-1:-1:-1;8277:4:1;8236:47;8332:2;8327:3;8323:12;8320:1;8316:20;8310:4;8306:31;8296:41;;8387:82;8405:2;8398:5;8395:13;8387:82;;;8450:17;;;8431:1;8420:13;8387:82;;;8391:3;;;7940:545;;;:::o;8661:1352::-;8787:3;8781:10;8814:18;8806:6;8803:30;8800:56;;;8836:18;;:::i;:::-;8865:97;8955:6;8915:38;8947:4;8941:11;8915:38;:::i;:::-;8909:4;8865:97;:::i;:::-;9017:4;;9081:2;9070:14;;9098:1;9093:663;;;;9800:1;9817:6;9814:89;;;-1:-1:-1;9869:19:1;;;9863:26;9814:89;-1:-1:-1;;8618:1:1;8614:11;;;8610:24;8606:29;8596:40;8642:1;8638:11;;;8593:57;9916:81;;9063:944;;9093:663;7887:1;7880:14;;;7924:4;7911:18;;-1:-1:-1;;9129:20:1;;;9247:236;9261:7;9258:1;9255:14;9247:236;;;9350:19;;;9344:26;9329:42;;9442:27;;;;9410:1;9398:14;;;;9277:19;;9247:236;;;9251:3;9511:6;9502:7;9499:19;9496:201;;;9572:19;;;9566:26;-1:-1:-1;;9655:1:1;9651:14;;;9667:3;9647:24;9643:37;9639:42;9624:58;9609:74;;9496:201;-1:-1:-1;;;;;9743:1:1;9727:14;;;9723:22;9710:36;;-1:-1:-1;8661:1352:1:o;12298:125::-;12363:9;;;12384:10;;;12381:36;;;12397:18;;:::i;13245:135::-;13284:3;13305:17;;;13302:43;;13325:18;;:::i;:::-;-1:-1:-1;13372:1:1;13361:13;;13245:135::o;13801:1256::-;14025:3;14063:6;14057:13;14089:4;14102:64;14159:6;14154:3;14149:2;14141:6;14137:15;14102:64;:::i;:::-;14229:13;;14188:16;;;;14251:68;14229:13;14188:16;14286:15;;;14251:68;:::i;:::-;14408:13;;14341:20;;;14381:1;;14446:36;14408:13;14446:36;:::i;:::-;14501:1;14518:18;;;14545:141;;;;14700:1;14695:337;;;;14511:521;;14545:141;-1:-1:-1;;14580:24:1;;14566:39;;14657:16;;14650:24;14636:39;;14625:51;;;-1:-1:-1;14545:141:1;;14695:337;14726:6;14723:1;14716:17;14774:2;14771:1;14761:16;14799:1;14813:169;14827:8;14824:1;14821:15;14813:169;;;14909:14;;14894:13;;;14887:37;14952:16;;;;14844:10;;14813:169;;;14817:3;;15013:8;15006:5;15002:20;14995:27;;14511:521;-1:-1:-1;15048:3:1;;13801:1256;-1:-1:-1;;;;;;;;;;13801:1256:1:o;15778:245::-;15845:6;15898:2;15886:9;15877:7;15873:23;15869:32;15866:52;;;15914:1;15911;15904:12;15866:52;15946:9;15940:16;15965:28;15987:5;15965:28;:::i;16028:409::-;16230:2;16212:21;;;16269:2;16249:18;;;16242:30;16308:34;16303:2;16288:18;;16281:62;-1:-1:-1;;;16374:2:1;16359:18;;16352:43;16427:3;16412:19;;16028:409::o;17157:401::-;17359:2;17341:21;;;17398:2;17378:18;;;17371:30;17437:34;17432:2;17417:18;;17410:62;-1:-1:-1;;;17503:2:1;17488:18;;17481:35;17548:3;17533:19;;17157:401::o;18328:414::-;18530:2;18512:21;;;18569:2;18549:18;;;18542:30;18608:34;18603:2;18588:18;;18581:62;-1:-1:-1;;;18674:2:1;18659:18;;18652:48;18732:3;18717:19;;18328:414::o;18747:128::-;18814:9;;;18835:11;;;18832:37;;;18849:18;;:::i;18880:489::-;-1:-1:-1;;;;;19149:15:1;;;19131:34;;19201:15;;19196:2;19181:18;;19174:43;19248:2;19233:18;;19226:34;;;19296:3;19291:2;19276:18;;19269:31;;;19074:4;;19317:46;;19343:19;;19335:6;19317:46;:::i;:::-;19309:54;18880:489;-1:-1:-1;;;;;;18880:489:1:o;19374:249::-;19443:6;19496:2;19484:9;19475:7;19471:23;19467:32;19464:52;;;19512:1;19509;19502:12;19464:52;19544:9;19538:16;19563:30;19587:5;19563:30;:::i
Swarm Source
ipfs://362d9bfca8567e731ec85953d81fcbe418e77825ad7af4e0b59bba8824185e71
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 ]
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.