Source Code
Latest 25 from a total of 863 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Registration | 22651501 | 28 hrs ago | IN | 0 ETH | 0.00008164 | ||||
Unregistration | 22625297 | 4 days ago | IN | 0 ETH | 0.00081408 | ||||
Unregistration | 22624572 | 4 days ago | IN | 0 ETH | 0.00040941 | ||||
Unregistration | 22623953 | 5 days ago | IN | 0 ETH | 0.0002131 | ||||
Unregistration | 22623931 | 5 days ago | IN | 0 ETH | 0.00024628 | ||||
Unregistration | 22623912 | 5 days ago | IN | 0 ETH | 0.00019815 | ||||
Unregistration | 22623422 | 5 days ago | IN | 0 ETH | 0.00021906 | ||||
Registration | 22607679 | 7 days ago | IN | 0 ETH | 0.00007785 | ||||
Unregistration | 22577353 | 11 days ago | IN | 0 ETH | 0.00022295 | ||||
Unregistration | 22577337 | 11 days ago | IN | 0 ETH | 0.00022201 | ||||
Unregistration | 22576066 | 11 days ago | IN | 0 ETH | 0.00059926 | ||||
Registration | 22573690 | 12 days ago | IN | 0 ETH | 0.0001302 | ||||
Unregistration | 22573669 | 12 days ago | IN | 0 ETH | 0.00013654 | ||||
Unregistration | 22573645 | 12 days ago | IN | 0 ETH | 0.00009874 | ||||
Unregistration | 22573580 | 12 days ago | IN | 0 ETH | 0.00014771 | ||||
Registration | 22565701 | 13 days ago | IN | 0 ETH | 0.00012585 | ||||
Registration | 22545946 | 15 days ago | IN | 0 ETH | 0.0003528 | ||||
Registration | 22545264 | 16 days ago | IN | 0 ETH | 0.00015656 | ||||
Registration | 22542409 | 16 days ago | IN | 0 ETH | 0.00012421 | ||||
Registration | 22525814 | 18 days ago | IN | 0 ETH | 0.00028363 | ||||
Unregistration | 22525793 | 18 days ago | IN | 0 ETH | 0.00036222 | ||||
Unregistration | 22523982 | 19 days ago | IN | 0 ETH | 0.00016261 | ||||
Unregistration | 22523743 | 19 days ago | IN | 0 ETH | 0.00012604 | ||||
Unregistration | 22523738 | 19 days ago | IN | 0 ETH | 0.00012717 | ||||
Registration | 22510839 | 20 days ago | IN | 0 ETH | 0.00012614 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Registry
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2025-03-03 */ // File: solmate/src/tokens/ERC20.sol pragma solidity >=0.8.0; /// @notice Modern and gas efficient ERC20 + EIP-2612 implementation. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol) /// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol) /// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it. abstract contract ERC20 { /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event Transfer(address indexed from, address indexed to, uint256 amount); event Approval(address indexed owner, address indexed spender, uint256 amount); /*////////////////////////////////////////////////////////////// METADATA STORAGE //////////////////////////////////////////////////////////////*/ string public name; string public symbol; uint8 public immutable decimals; /*////////////////////////////////////////////////////////////// ERC20 STORAGE //////////////////////////////////////////////////////////////*/ uint256 public totalSupply; mapping(address => uint256) public balanceOf; mapping(address => mapping(address => uint256)) public allowance; /*////////////////////////////////////////////////////////////// EIP-2612 STORAGE //////////////////////////////////////////////////////////////*/ uint256 internal immutable INITIAL_CHAIN_ID; bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR; mapping(address => uint256) public nonces; /*////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ constructor( string memory _name, string memory _symbol, uint8 _decimals ) { name = _name; symbol = _symbol; decimals = _decimals; INITIAL_CHAIN_ID = block.chainid; INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); } /*////////////////////////////////////////////////////////////// ERC20 LOGIC //////////////////////////////////////////////////////////////*/ function approve(address spender, uint256 amount) public virtual returns (bool) { allowance[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function transfer(address to, uint256 amount) public virtual returns (bool) { balanceOf[msg.sender] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(msg.sender, to, amount); return true; } function transferFrom( address from, address to, uint256 amount ) public virtual returns (bool) { uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals. if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount; balanceOf[from] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(from, to, amount); return true; } /*////////////////////////////////////////////////////////////// EIP-2612 LOGIC //////////////////////////////////////////////////////////////*/ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public virtual { require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED"); // Unchecked because the only math done is incrementing // the owner's nonce which cannot realistically overflow. unchecked { address recoveredAddress = ecrecover( keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR(), keccak256( abi.encode( keccak256( "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" ), owner, spender, value, nonces[owner]++, deadline ) ) ) ), v, r, s ); require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER"); allowance[recoveredAddress][spender] = value; } emit Approval(owner, spender, value); } function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator(); } function computeDomainSeparator() internal view virtual returns (bytes32) { return keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(name)), keccak256("1"), block.chainid, address(this) ) ); } /*////////////////////////////////////////////////////////////// INTERNAL MINT/BURN LOGIC //////////////////////////////////////////////////////////////*/ function _mint(address to, uint256 amount) internal virtual { totalSupply += amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(address(0), to, amount); } function _burn(address from, uint256 amount) internal virtual { balanceOf[from] -= amount; // Cannot underflow because a user's balance // will never be larger than the total supply. unchecked { totalSupply -= amount; } emit Transfer(from, address(0), amount); } } // File: solmate/src/utils/SafeTransferLib.sol pragma solidity >=0.8.0; /// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SafeTransferLib.sol) /// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer. library SafeTransferLib { /*////////////////////////////////////////////////////////////// ETH OPERATIONS //////////////////////////////////////////////////////////////*/ function safeTransferETH(address to, uint256 amount) internal { bool success; /// @solidity memory-safe-assembly assembly { // Transfer the ETH and store if it succeeded or not. success := call(gas(), to, amount, 0, 0, 0, 0) } require(success, "ETH_TRANSFER_FAILED"); } /*////////////////////////////////////////////////////////////// ERC20 OPERATIONS //////////////////////////////////////////////////////////////*/ function safeTransferFrom( ERC20 token, address from, address to, uint256 amount ) internal { bool success; /// @solidity memory-safe-assembly assembly { // Get a pointer to some free memory. let freeMemoryPointer := mload(0x40) // Write the abi-encoded calldata into memory, beginning with the function selector. mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000) mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "from" argument. mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "to" argument. mstore(add(freeMemoryPointer, 68), amount) // Append the "amount" argument. Masking not required as it's a full 32 byte type. // We use 100 because the length of our calldata totals up like so: 4 + 32 * 3. // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space. success := call(gas(), token, 0, freeMemoryPointer, 100, 0, 32) // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data and token has code. if and(iszero(and(eq(mload(0), 1), gt(returndatasize(), 31))), success) { success := iszero(or(iszero(extcodesize(token)), returndatasize())) } } require(success, "TRANSFER_FROM_FAILED"); } function safeTransfer( ERC20 token, address to, uint256 amount ) internal { bool success; /// @solidity memory-safe-assembly assembly { // Get a pointer to some free memory. let freeMemoryPointer := mload(0x40) // Write the abi-encoded calldata into memory, beginning with the function selector. mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000) mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "to" argument. mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument. Masking not required as it's a full 32 byte type. // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2. // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space. success := call(gas(), token, 0, freeMemoryPointer, 68, 0, 32) // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data and token has code. if and(iszero(and(eq(mload(0), 1), gt(returndatasize(), 31))), success) { success := iszero(or(iszero(extcodesize(token)), returndatasize())) } } require(success, "TRANSFER_FAILED"); } function safeApprove( ERC20 token, address to, uint256 amount ) internal { bool success; /// @solidity memory-safe-assembly assembly { // Get a pointer to some free memory. let freeMemoryPointer := mload(0x40) // Write the abi-encoded calldata into memory, beginning with the function selector. mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000) mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "to" argument. mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument. Masking not required as it's a full 32 byte type. // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2. // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space. success := call(gas(), token, 0, freeMemoryPointer, 68, 0, 32) // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data and token has code. if and(iszero(and(eq(mload(0), 1), gt(returndatasize(), 31))), success) { success := iszero(or(iszero(extcodesize(token)), returndatasize())) } } require(success, "APPROVE_FAILED"); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts (last updated v4.9.4) (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; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.9.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. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling 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/access/Ownable2Step.sol // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable2Step.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides 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} and {acceptOwnership}. * * This module is used through inheritance. It will make available all functions * from parent (Ownable). */ abstract contract Ownable2Step is Ownable { address private _pendingOwner; event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner); /** * @dev Returns the address of the pending owner. */ function pendingOwner() public view virtual returns (address) { return _pendingOwner; } /** * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one. * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual override onlyOwner { _pendingOwner = newOwner; emit OwnershipTransferStarted(owner(), newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner. * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual override { delete _pendingOwner; super._transferOwnership(newOwner); } /** * @dev The new owner accepts the ownership transfer. */ function acceptOwnership() public virtual { address sender = _msgSender(); require(pendingOwner() == sender, "Ownable2Step: caller is not the new owner"); _transferOwnership(sender); } } // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.9.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) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 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 256, 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 << 3) < value ? 1 : 0); } } } // File: @openzeppelin/contracts/utils/math/SignedMath.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.0; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.9.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 `int256` to its ASCII `string` decimal representation. */ function toString(int256 value) internal pure returns (string memory) { return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value)))); } /** * @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); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } } // File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV // Deprecated in v4.8 } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 message) { // 32 is the length in bytes of hash, // enforced by the type signature above /// @solidity memory-safe-assembly assembly { mstore(0x00, "\x19Ethereum Signed Message:\n32") mstore(0x1c, hash) message := keccak256(0x00, 0x3c) } } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 data) { /// @solidity memory-safe-assembly assembly { let ptr := mload(0x40) mstore(ptr, "\x19\x01") mstore(add(ptr, 0x02), domainSeparator) mstore(add(ptr, 0x22), structHash) data := keccak256(ptr, 0x42) } } /** * @dev Returns an Ethereum Signed Data with intended validator, created from a * `validator` and `data` according to the version 0 of EIP-191. * * See {recover}. */ function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x00", validator, data)); } } // File: contracts/OIK_stake.sol pragma solidity 0.8.19; contract Registry is Ownable2Step { using ECDSA for bytes32; address public token; bool public unregisswitch; uint8 public decimals; mapping(address => mapping(uint64 => address)) public pendingaddress; mapping(address => bool) private signers; mapping(uint64 => mapping(address => uint64)) public nonces; mapping(address => bool) public isBlackListed; mapping(uint64 => mapping(address => uint64)) public registered; error UnregisterEnds(); error InvalidSignature(); error ClosedFuncs(); error InvalidAmount(); error InvalidAddress(); event Register( address token, address register, uint64 types, uint64 amount ); event Unregister( address token, address unregister, address receiver, uint64 types, uint64 amount, uint64 nonce, bool allunregister, bytes signature ); constructor( address[] memory _signers, address _token, uint8 _decimals ) { require(_token != address(0)); address signer; uint256 len = _signers.length; unchecked { for (uint256 i = 0; i < len; ++i) { signer = _signers[i]; require(signer != address(0)); signers[signer] = true; } } token = _token; decimals = _decimals; } function registration( uint64 types, uint64 amount, bytes memory sig ) external { bytes32 hash = regishash(); matchSigner(hash, sig); address from = _msgSender(); _transfer(from, address(this), amount); registered[types][from] += amount; emit Register(token, from, types, amount); } function regishash() private view returns (bytes32) { bytes32 hash = keccak256( abi.encodePacked(_chainID(), _msgSender(), address(this)) ); return hash; } function unregistration( uint64 types, uint64 amount, uint64 endstime, bytes memory sig ) external { address sender = _msgSender(); bytes32 hash = unregishash(sender, types, amount, endstime); matchSigner(hash, sig); registered[types][sender] -= amount; uint64 nonce = nonces[types][sender]; ++nonces[types][sender]; _transfer(address(this), sender, amount); bool allunregister; if (registered[types][sender] == 0) { allunregister = true; } emit Unregister( token, sender, sender, types, amount, nonce, allunregister, sig ); } function unregishash( address sender, uint64 types, uint64 amount, uint64 endstime ) private view returns (bytes32) { if (block.timestamp > endstime) { revert UnregisterEnds(); } bytes32 hash = keccak256( abi.encodePacked( types, amount, endstime, nonces[types][sender], _chainID(), token, sender, address(this) ) ); return hash; } function unregistrationto( address receiver, uint64 types, bytes memory sig ) public { bytes32 hash = unregistohash(receiver, types); matchSigner(hash, sig); pendingaddress[_msgSender()][types] = receiver; } function unregistohash(address receiver, uint64 types) private view returns (bytes32) { bytes32 hash = keccak256( abi.encodePacked( types, _chainID(), token, _msgSender(), receiver, address(this) ) ); return hash; } function claimpending( address approver, uint64 types, uint64 endstime, bytes memory sig ) external { address claimer = _msgSender(); require(pendingaddress[approver][types] == claimer); bytes32 hash = claimhash(approver, types, endstime); matchSigner(hash, sig); uint64 amount = registered[types][approver]; uint64 nonce = nonces[types][approver]; delete registered[types][approver]; delete pendingaddress[approver][types]; ++nonces[types][approver]; _transfer(address(this), claimer, amount); emit Unregister( token, approver, claimer, types, amount, nonce, true, sig ); } function claimhash( address approver, uint64 types, uint64 endstime ) private view returns (bytes32) { if (block.timestamp > endstime) { revert UnregisterEnds(); } bytes32 hash = keccak256( abi.encodePacked( types, endstime, _chainID(), token, _msgSender(), approver, address(this) ) ); return hash; } function openunregistration(uint64 types) external { if (!unregisswitch) { revert ClosedFuncs(); } require(!isBlackListed[_msgSender()]); address sender = _msgSender(); uint64 amount = registered[types][sender]; delete registered[types][sender]; _transfer(address(this), sender, amount); emit Unregister( token, sender, sender, types, amount, type(uint64).max, true, "0x" ); } function _transfer( address from, address to, uint64 amount ) private { if (amount == 0) { revert InvalidAmount(); } if (to == address(0)) { revert InvalidAddress(); } if (from == address(this)) { SafeTransferLib.safeTransfer( ERC20(token), to, amount * 10**decimals ); } else { SafeTransferLib.safeTransferFrom( ERC20(token), from, to, amount * 10**decimals ); } } function _chainID() private view returns (uint64) { uint64 chainID; assembly { chainID := chainid() } return chainID; } function matchSigner(bytes32 hash, bytes memory signature) private view { require(!isBlackListed[_msgSender()]); address _signer = hash.toEthSignedMessageHash().recover(signature); if (!signers[_signer]) { revert InvalidSignature(); } } /** * @notice Only the contract owner can add addresses to the blacklist. * @param _evilUsers. Token address. */ function addBlackList(address[] calldata _evilUsers) external onlyOwner { uint256 len = _evilUsers.length; address evilUser; unchecked { for (uint256 i = 0; i < len; ++i) { evilUser = _evilUsers[i]; isBlackListed[evilUser] = true; } } } /** * @notice Only the contract owner can remove addresses from the blacklist. * @param _clearedUsers. Token address. */ function removeBlackList(address[] calldata _clearedUsers) external onlyOwner { uint256 len = _clearedUsers.length; address clearUser; unchecked { for (uint256 i = 0; i < len; ++i) { clearUser = _clearedUsers[i]; isBlackListed[clearUser] = false; } } } /** * @notice Only the contract owner can increment a batch of users' nonce values to invalidate old signatures. * @param addrs. Player's addresses. */ function invalidateUnusedNonce( address[] calldata addrs, uint64[] calldata types ) external onlyOwner { uint256 len = addrs.length; address addr; uint64 _type; unchecked { for (uint256 i = 0; i < len; ++i) { addr = addrs[i]; _type = types[i]; ++nonces[_type][addr]; } } } function setToken(address _token, uint8 _decimals) external onlyOwner { require(_token != address(0)); require(_decimals < 19); token = _token; decimals = _decimals; } function setSigner(address _signer, bool flag) external onlyOwner { signers[_signer] = flag; } function configUnregisSwitch(bool flag) external onlyOwner { unregisswitch = flag; } function withdrawsToken(address to) external onlyOwner { uint256 balance = ERC20(token).balanceOf(address(this)); SafeTransferLib.safeTransfer(ERC20(token), to, balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address[]","name":"_signers","type":"address[]"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint8","name":"_decimals","type":"uint8"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ClosedFuncs","type":"error"},{"inputs":[],"name":"InvalidAddress","type":"error"},{"inputs":[],"name":"InvalidAmount","type":"error"},{"inputs":[],"name":"InvalidSignature","type":"error"},{"inputs":[],"name":"UnregisterEnds","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"register","type":"address"},{"indexed":false,"internalType":"uint64","name":"types","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"amount","type":"uint64"}],"name":"Register","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"unregister","type":"address"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint64","name":"types","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"amount","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"nonce","type":"uint64"},{"indexed":false,"internalType":"bool","name":"allunregister","type":"bool"},{"indexed":false,"internalType":"bytes","name":"signature","type":"bytes"}],"name":"Unregister","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_evilUsers","type":"address[]"}],"name":"addBlackList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"approver","type":"address"},{"internalType":"uint64","name":"types","type":"uint64"},{"internalType":"uint64","name":"endstime","type":"uint64"},{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"claimpending","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"flag","type":"bool"}],"name":"configUnregisSwitch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"},{"internalType":"uint64[]","name":"types","type":"uint64[]"}],"name":"invalidateUnusedNonce","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBlackListed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"","type":"uint64"},{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"types","type":"uint64"}],"name":"openunregistration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"pendingaddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"","type":"uint64"},{"internalType":"address","name":"","type":"address"}],"name":"registered","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"types","type":"uint64"},{"internalType":"uint64","name":"amount","type":"uint64"},{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"registration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_clearedUsers","type":"address[]"}],"name":"removeBlackList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signer","type":"address"},{"internalType":"bool","name":"flag","type":"bool"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint8","name":"_decimals","type":"uint8"}],"name":"setToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unregisswitch","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"types","type":"uint64"},{"internalType":"uint64","name":"amount","type":"uint64"},{"internalType":"uint64","name":"endstime","type":"uint64"},{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"unregistration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint64","name":"types","type":"uint64"},{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"unregistrationto","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"withdrawsToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162003b6538038062003b658339818101604052810190620000379190620004fb565b620000576200004b620001ca60201b60201c565b620001d260201b60201c565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200009157600080fd5b6000808451905060005b818110156200016257858181518110620000ba57620000b962000576565b5b60200260200101519250600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603620000fe57600080fd5b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508060010190506200009b565b5083600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600260156101000a81548160ff021916908360ff1602179055505050505050620005a5565b600033905090565b600160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905562000208816200020b60201b60201c565b50565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200033382620002e8565b810181811067ffffffffffffffff82111715620003555762000354620002f9565b5b80604052505050565b60006200036a620002cf565b905062000378828262000328565b919050565b600067ffffffffffffffff8211156200039b576200039a620002f9565b5b602082029050602081019050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620003de82620003b1565b9050919050565b620003f081620003d1565b8114620003fc57600080fd5b50565b6000815190506200041081620003e5565b92915050565b60006200042d62000427846200037d565b6200035e565b90508083825260208201905060208402830185811115620004535762000452620003ac565b5b835b818110156200048057806200046b8882620003ff565b84526020840193505060208101905062000455565b5050509392505050565b600082601f830112620004a257620004a1620002e3565b5b8151620004b484826020860162000416565b91505092915050565b600060ff82169050919050565b620004d581620004bd565b8114620004e157600080fd5b50565b600081519050620004f581620004ca565b92915050565b600080600060608486031215620005175762000516620002d9565b5b600084015167ffffffffffffffff811115620005385762000537620002de565b5b62000546868287016200048a565b93505060206200055986828701620003ff565b92505060406200056c86828701620004e4565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6135b080620005b56000396000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c80639bf41135116100c3578063e30c39781161007c578063e30c397814610373578063e47d606014610391578063f2fde38b146103c1578063f9cc2aa2146103dd578063fc0c546a146103f9578063fd564d601461041757610158565b80639bf41135146102b7578063be451dcb146102d3578063c4767b95146102ef578063d338faf31461030b578063d8f5bbae14610327578063de4d40271461034357610158565b80636803ee81116101155780636803ee811461022f578063715018a61461024b57806379502b0b1461025557806379ba5097146102735780637f56a03e1461027d5780638da5cb5b1461029957610158565b80630891c1001461015d5780632207aec11461018d578063313ce567146101a957806331cb6105146101c757806338a6d67e146101e35780636418825514610213575b600080fd5b610177600480360381019061017291906122cf565b610433565b604051610184919061231e565b60405180910390f35b6101a760048036038101906101a2919061247f565b610469565b005b6101b16105a9565b6040516101be919061250a565b60405180910390f35b6101e160048036038101906101dc919061255d565b6105bc565b005b6101fd60048036038101906101f891906122cf565b61061f565b60405161020a919061231e565b60405180910390f35b61022d6004803603810190610228919061259d565b610655565b005b61024960048036038101906102449190612620565b61095b565b005b610253610d5f565b005b61025d610d73565b60405161026a91906126b2565b60405180910390f35b61027b610d86565b005b610297600480360381019061029291906126cd565b610e13565b005b6102a1611039565b6040516102ae9190612709565b60405180910390f35b6102d160048036038101906102cc9190612784565b611062565b005b6102ed60048036038101906102e891906127d1565b611116565b005b6103096004803603810190610304919061286c565b6111de565b005b61032560048036038101906103209190612784565b61128f565b005b610341600480360381019061033c91906128ac565b611343565b005b61035d600480360381019061035891906128d9565b61141c565b60405161036a9190612709565b60405180910390f35b61037b61145e565b6040516103889190612709565b60405180910390f35b6103ab60048036038101906103a691906128ac565b611488565b6040516103b891906126b2565b60405180910390f35b6103db60048036038101906103d691906128ac565b6114a8565b005b6103f760048036038101906103f29190612919565b611555565b005b61040161157a565b60405161040e9190612709565b60405180910390f35b610431600480360381019061042c919061299c565b6115a0565b005b60076020528160005260406000206020528060005260406000206000915091509054906101000a900467ffffffffffffffff1681565b60006104736116cb565b905061047f8183611710565b6000610489611815565b905061049681308661181d565b83600760008767ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900467ffffffffffffffff1661051d9190612a4c565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f80c031e937bcb2a3ff4482461fa37fd0caa24ee26cdc05e20746cd7eccc8d9ef600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682878760405161059a9493929190612a88565b60405180910390a15050505050565b600260159054906101000a900460ff1681565b6105c46119c0565b80600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60056020528160005260406000206020528060005260406000206000915091509054906101000a900467ffffffffffffffff1681565b600061065f611815565b9050600061066f82878787611a3e565b905061067b8184611710565b84600760008867ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900467ffffffffffffffff166107029190612acd565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008867ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900467ffffffffffffffff169050600560008867ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081819054906101000a900467ffffffffffffffff1661082990612b09565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555061085a30848861181d565b600080600760008a67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900467ffffffffffffffff1667ffffffffffffffff16036108ea57600190505b7f62fd95d0cc60f28a40386de0165f1d958b7a652abdaa5f06f9df29d227bd8b79600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685868b8b87878c604051610949989796959493929190612bb8565b60405180910390a15050505050505050565b6000610965611815565b90508073ffffffffffffffffffffffffffffffffffffffff16600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a2357600080fd5b6000610a30868686611b6a565b9050610a3c8184611710565b6000600760008767ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900467ffffffffffffffff1690506000600560008867ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900467ffffffffffffffff169050600760008867ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549067ffffffffffffffff0219169055600360008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008867ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008867ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081819054906101000a900467ffffffffffffffff16610cbc90612b09565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550610ced30858461181d565b7f62fd95d0cc60f28a40386de0165f1d958b7a652abdaa5f06f9df29d227bd8b79600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1689868a868660018c604051610d4d989796959493929190612bb8565b60405180910390a15050505050505050565b610d676119c0565b610d716000611c22565b565b600260149054906101000a900460ff1681565b6000610d90611815565b90508073ffffffffffffffffffffffffffffffffffffffff16610db161145e565b73ffffffffffffffffffffffffffffffffffffffff1614610e07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfe90612cc0565b60405180910390fd5b610e1081611c22565b50565b600260149054906101000a900460ff16610e59576040517ff8f3e48500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60066000610e65611815565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610eb757600080fd5b6000610ec1611815565b90506000600760008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900467ffffffffffffffff169050600760008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549067ffffffffffffffff0219169055610fc630838361181d565b7f62fd95d0cc60f28a40386de0165f1d958b7a652abdaa5f06f9df29d227bd8b79600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168384868567ffffffffffffffff600160405161102c9796959493929190612d2c565b60405180910390a1505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61106a6119c0565b6000828290509050600080600090505b8281101561110f5784848281811061109557611094612daf565b5b90506020020160208101906110aa91906128ac565b91506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080600101905061107a565b5050505050565b60006111228484611c53565b905061112e8183611710565b836003600061113b611815565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b6111e66119c0565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361121f57600080fd5b60138160ff161061122f57600080fd5b81600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260156101000a81548160ff021916908360ff1602179055505050565b6112976119c0565b6000828290509050600080600090505b8281101561133c578484828181106112c2576112c1612daf565b5b90506020020160208101906112d791906128ac565b91506001600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508060010190506112a7565b5050505050565b61134b6119c0565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016113a89190612709565b602060405180830381865afa1580156113c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e99190612e14565b9050611418600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168383611cc3565b5050565b60036020528160005260406000206020528060005260406000206000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60066020528060005260406000206000915054906101000a900460ff1681565b6114b06119c0565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16611510611039565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b61155d6119c0565b80600260146101000a81548160ff02191690831515021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6115a86119c0565b600084849050905060008060005b838110156116c1578787828181106115d1576115d0612daf565b5b90506020020160208101906115e691906128ac565b92508585828181106115fb576115fa612daf565b5b905060200201602081019061161091906126cd565b9150600560008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081819054906101000a900467ffffffffffffffff1660010191906101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508060010190506115b6565b5050505050505050565b6000806116d6611d7e565b6116de611815565b306040516020016116f193929190612ebf565b6040516020818303038152906040528051906020012090508091505090565b6006600061171c611815565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561176e57600080fd5b600061178b8261177d85611d8b565b611dc190919063ffffffff16565b9050600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611810576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b600033905090565b60008167ffffffffffffffff1603611861576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036118c7576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361195c57611957600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683600260159054906101000a900460ff16600a61193d919061302f565b8467ffffffffffffffff16611952919061307a565b611cc3565b6119bb565b6119ba600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168484600260159054906101000a900460ff16600a6119a0919061302f565b8567ffffffffffffffff166119b5919061307a565b611de8565b5b505050565b6119c8611815565b73ffffffffffffffffffffffffffffffffffffffff166119e6611039565b73ffffffffffffffffffffffffffffffffffffffff1614611a3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3390613108565b60405180910390fd5b565b60008167ffffffffffffffff16421115611a84576040517f72e2986e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000848484600560008967ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900467ffffffffffffffff16611b0a611d7e565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168b30604051602001611b46989796959493929190613128565b60405160208183030381529060405280519060200120905080915050949350505050565b60008167ffffffffffffffff16421115611bb0576040517f72e2986e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008383611bbc611d7e565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611be7611815565b8930604051602001611bff97969594939291906131ba565b604051602081830303815290604052805190602001209050809150509392505050565b600160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055611c5081611ec0565b50565b60008082611c5f611d7e565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611c8a611815565b8730604051602001611ca19695949392919061323b565b6040516020818303038152906040528051906020012090508091505092915050565b60006040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152826024820152602060006044836000895af1915081601f3d1160016000511416151615611d37573d853b15171591505b5080611d78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6f906132f7565b60405180910390fd5b50505050565b6000804690508091505090565b60007f19457468657265756d205369676e6564204d6573736167653a0a33320000000060005281601c52603c6000209050919050565b6000806000611dd08585611f84565b91509150611ddd81611fd5565b819250505092915050565b60006040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015273ffffffffffffffffffffffffffffffffffffffff841660248201528260448201526020600060648360008a5af1915081601f3d1160016000511416151615611e78573d863b15171591505b5080611eb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb090613363565b60405180910390fd5b5050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000806041835103611fc55760008060006020860151925060408601519150606086015160001a9050611fb98782858561213b565b94509450505050611fce565b60006002915091505b9250929050565b60006004811115611fe957611fe8613383565b5b816004811115611ffc57611ffb613383565b5b0315612138576001600481111561201657612015613383565b5b81600481111561202957612028613383565b5b03612069576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612060906133fe565b60405180910390fd5b6002600481111561207d5761207c613383565b5b8160048111156120905761208f613383565b5b036120d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c79061346a565b60405180910390fd5b600360048111156120e4576120e3613383565b5b8160048111156120f7576120f6613383565b5b03612137576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212e906134fc565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115612176576000600391509150612214565b60006001878787876040516000815260200160405260405161219b9493929190613535565b6020604051602081039080840390855afa1580156121bd573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361220b57600060019250925050612214565b80600092509250505b94509492505050565b6000604051905090565b600080fd5b600080fd5b600067ffffffffffffffff82169050919050565b61224e81612231565b811461225957600080fd5b50565b60008135905061226b81612245565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061229c82612271565b9050919050565b6122ac81612291565b81146122b757600080fd5b50565b6000813590506122c9816122a3565b92915050565b600080604083850312156122e6576122e5612227565b5b60006122f48582860161225c565b9250506020612305858286016122ba565b9150509250929050565b61231881612231565b82525050565b6000602082019050612333600083018461230f565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61238c82612343565b810181811067ffffffffffffffff821117156123ab576123aa612354565b5b80604052505050565b60006123be61221d565b90506123ca8282612383565b919050565b600067ffffffffffffffff8211156123ea576123e9612354565b5b6123f382612343565b9050602081019050919050565b82818337600083830152505050565b600061242261241d846123cf565b6123b4565b90508281526020810184848401111561243e5761243d61233e565b5b612449848285612400565b509392505050565b600082601f83011261246657612465612339565b5b813561247684826020860161240f565b91505092915050565b60008060006060848603121561249857612497612227565b5b60006124a68682870161225c565b93505060206124b78682870161225c565b925050604084013567ffffffffffffffff8111156124d8576124d761222c565b5b6124e486828701612451565b9150509250925092565b600060ff82169050919050565b612504816124ee565b82525050565b600060208201905061251f60008301846124fb565b92915050565b60008115159050919050565b61253a81612525565b811461254557600080fd5b50565b60008135905061255781612531565b92915050565b6000806040838503121561257457612573612227565b5b6000612582858286016122ba565b925050602061259385828601612548565b9150509250929050565b600080600080608085870312156125b7576125b6612227565b5b60006125c58782880161225c565b94505060206125d68782880161225c565b93505060406125e78782880161225c565b925050606085013567ffffffffffffffff8111156126085761260761222c565b5b61261487828801612451565b91505092959194509250565b6000806000806080858703121561263a57612639612227565b5b6000612648878288016122ba565b94505060206126598782880161225c565b935050604061266a8782880161225c565b925050606085013567ffffffffffffffff81111561268b5761268a61222c565b5b61269787828801612451565b91505092959194509250565b6126ac81612525565b82525050565b60006020820190506126c760008301846126a3565b92915050565b6000602082840312156126e3576126e2612227565b5b60006126f18482850161225c565b91505092915050565b61270381612291565b82525050565b600060208201905061271e60008301846126fa565b92915050565b600080fd5b600080fd5b60008083601f84011261274457612743612339565b5b8235905067ffffffffffffffff81111561276157612760612724565b5b60208301915083602082028301111561277d5761277c612729565b5b9250929050565b6000806020838503121561279b5761279a612227565b5b600083013567ffffffffffffffff8111156127b9576127b861222c565b5b6127c58582860161272e565b92509250509250929050565b6000806000606084860312156127ea576127e9612227565b5b60006127f8868287016122ba565b93505060206128098682870161225c565b925050604084013567ffffffffffffffff81111561282a5761282961222c565b5b61283686828701612451565b9150509250925092565b612849816124ee565b811461285457600080fd5b50565b60008135905061286681612840565b92915050565b6000806040838503121561288357612882612227565b5b6000612891858286016122ba565b92505060206128a285828601612857565b9150509250929050565b6000602082840312156128c2576128c1612227565b5b60006128d0848285016122ba565b91505092915050565b600080604083850312156128f0576128ef612227565b5b60006128fe858286016122ba565b925050602061290f8582860161225c565b9150509250929050565b60006020828403121561292f5761292e612227565b5b600061293d84828501612548565b91505092915050565b60008083601f84011261295c5761295b612339565b5b8235905067ffffffffffffffff81111561297957612978612724565b5b60208301915083602082028301111561299557612994612729565b5b9250929050565b600080600080604085870312156129b6576129b5612227565b5b600085013567ffffffffffffffff8111156129d4576129d361222c565b5b6129e08782880161272e565b9450945050602085013567ffffffffffffffff811115612a0357612a0261222c565b5b612a0f87828801612946565b925092505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612a5782612231565b9150612a6283612231565b9250828201905067ffffffffffffffff811115612a8257612a81612a1d565b5b92915050565b6000608082019050612a9d60008301876126fa565b612aaa60208301866126fa565b612ab7604083018561230f565b612ac4606083018461230f565b95945050505050565b6000612ad882612231565b9150612ae383612231565b9250828203905067ffffffffffffffff811115612b0357612b02612a1d565b5b92915050565b6000612b1482612231565b915067ffffffffffffffff8203612b2e57612b2d612a1d565b5b600182019050919050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612b73578082015181840152602081019050612b58565b60008484015250505050565b6000612b8a82612b39565b612b948185612b44565b9350612ba4818560208601612b55565b612bad81612343565b840191505092915050565b600061010082019050612bce600083018b6126fa565b612bdb602083018a6126fa565b612be860408301896126fa565b612bf5606083018861230f565b612c02608083018761230f565b612c0f60a083018661230f565b612c1c60c08301856126a3565b81810360e0830152612c2e8184612b7f565b90509998505050505050505050565b600082825260208201905092915050565b7f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060008201527f6e6577206f776e65720000000000000000000000000000000000000000000000602082015250565b6000612caa602983612c3d565b9150612cb582612c4e565b604082019050919050565b60006020820190508181036000830152612cd981612c9d565b9050919050565b7f3078000000000000000000000000000000000000000000000000000000000000600082015250565b6000612d16600283612b44565b9150612d2182612ce0565b602082019050919050565b600061010082019050612d42600083018a6126fa565b612d4f60208301896126fa565b612d5c60408301886126fa565b612d69606083018761230f565b612d76608083018661230f565b612d8360a083018561230f565b612d9060c08301846126a3565b81810360e0830152612da181612d09565b905098975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b612df181612dde565b8114612dfc57600080fd5b50565b600081519050612e0e81612de8565b92915050565b600060208284031215612e2a57612e29612227565b5b6000612e3884828501612dff565b91505092915050565b60008160c01b9050919050565b6000612e5982612e41565b9050919050565b612e71612e6c82612231565b612e4e565b82525050565b60008160601b9050919050565b6000612e8f82612e77565b9050919050565b6000612ea182612e84565b9050919050565b612eb9612eb482612291565b612e96565b82525050565b6000612ecb8286612e60565b600882019150612edb8285612ea8565b601482019150612eeb8284612ea8565b601482019150819050949350505050565b60008160011c9050919050565b6000808291508390505b6001851115612f5357808604811115612f2f57612f2e612a1d565b5b6001851615612f3e5780820291505b8081029050612f4c85612efc565b9450612f13565b94509492505050565b600082612f6c5760019050613028565b81612f7a5760009050613028565b8160018114612f905760028114612f9a57612fc9565b6001915050613028565b60ff841115612fac57612fab612a1d565b5b8360020a915084821115612fc357612fc2612a1d565b5b50613028565b5060208310610133831016604e8410600b8410161715612ffe5782820a905083811115612ff957612ff8612a1d565b5b613028565b61300b8484846001612f09565b9250905081840481111561302257613021612a1d565b5b81810290505b9392505050565b600061303a82612dde565b9150613045836124ee565b92506130727fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484612f5c565b905092915050565b600061308582612dde565b915061309083612dde565b925082820261309e81612dde565b915082820484148315176130b5576130b4612a1d565b5b5092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006130f2602083612c3d565b91506130fd826130bc565b602082019050919050565b60006020820190508181036000830152613121816130e5565b9050919050565b6000613134828b612e60565b600882019150613144828a612e60565b6008820191506131548289612e60565b6008820191506131648288612e60565b6008820191506131748287612e60565b6008820191506131848286612ea8565b6014820191506131948285612ea8565b6014820191506131a48284612ea8565b6014820191508190509998505050505050505050565b60006131c6828a612e60565b6008820191506131d68289612e60565b6008820191506131e68288612e60565b6008820191506131f68287612ea8565b6014820191506132068286612ea8565b6014820191506132168285612ea8565b6014820191506132268284612ea8565b60148201915081905098975050505050505050565b60006132478289612e60565b6008820191506132578288612e60565b6008820191506132678287612ea8565b6014820191506132778286612ea8565b6014820191506132878285612ea8565b6014820191506132978284612ea8565b601482019150819050979650505050505050565b7f5452414e534645525f4641494c45440000000000000000000000000000000000600082015250565b60006132e1600f83612c3d565b91506132ec826132ab565b602082019050919050565b60006020820190508181036000830152613310816132d4565b9050919050565b7f5452414e534645525f46524f4d5f4641494c4544000000000000000000000000600082015250565b600061334d601483612c3d565b915061335882613317565b602082019050919050565b6000602082019050818103600083015261337c81613340565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006133e8601883612c3d565b91506133f3826133b2565b602082019050919050565b60006020820190508181036000830152613417816133db565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000613454601f83612c3d565b915061345f8261341e565b602082019050919050565b6000602082019050818103600083015261348381613447565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006134e6602283612c3d565b91506134f18261348a565b604082019050919050565b60006020820190508181036000830152613515816134d9565b9050919050565b6000819050919050565b61352f8161351c565b82525050565b600060808201905061354a6000830187613526565b61355760208301866124fb565b6135646040830185613526565b6135716060830184613526565b9594505050505056fea2646970667358221220c87436d4200235ef4a2a5f08f4b2babbf6cd3852eb1e5cef074ccf22ca6b6fb364736f6c6343000813003300000000000000000000000000000000000000000000000000000000000000600000000000000000000000006e7f11641c1ec71591828e531334192d622703f7000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000b13c54ed9e421526b95ef947fa485c370ce7f3f3
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101585760003560e01c80639bf41135116100c3578063e30c39781161007c578063e30c397814610373578063e47d606014610391578063f2fde38b146103c1578063f9cc2aa2146103dd578063fc0c546a146103f9578063fd564d601461041757610158565b80639bf41135146102b7578063be451dcb146102d3578063c4767b95146102ef578063d338faf31461030b578063d8f5bbae14610327578063de4d40271461034357610158565b80636803ee81116101155780636803ee811461022f578063715018a61461024b57806379502b0b1461025557806379ba5097146102735780637f56a03e1461027d5780638da5cb5b1461029957610158565b80630891c1001461015d5780632207aec11461018d578063313ce567146101a957806331cb6105146101c757806338a6d67e146101e35780636418825514610213575b600080fd5b610177600480360381019061017291906122cf565b610433565b604051610184919061231e565b60405180910390f35b6101a760048036038101906101a2919061247f565b610469565b005b6101b16105a9565b6040516101be919061250a565b60405180910390f35b6101e160048036038101906101dc919061255d565b6105bc565b005b6101fd60048036038101906101f891906122cf565b61061f565b60405161020a919061231e565b60405180910390f35b61022d6004803603810190610228919061259d565b610655565b005b61024960048036038101906102449190612620565b61095b565b005b610253610d5f565b005b61025d610d73565b60405161026a91906126b2565b60405180910390f35b61027b610d86565b005b610297600480360381019061029291906126cd565b610e13565b005b6102a1611039565b6040516102ae9190612709565b60405180910390f35b6102d160048036038101906102cc9190612784565b611062565b005b6102ed60048036038101906102e891906127d1565b611116565b005b6103096004803603810190610304919061286c565b6111de565b005b61032560048036038101906103209190612784565b61128f565b005b610341600480360381019061033c91906128ac565b611343565b005b61035d600480360381019061035891906128d9565b61141c565b60405161036a9190612709565b60405180910390f35b61037b61145e565b6040516103889190612709565b60405180910390f35b6103ab60048036038101906103a691906128ac565b611488565b6040516103b891906126b2565b60405180910390f35b6103db60048036038101906103d691906128ac565b6114a8565b005b6103f760048036038101906103f29190612919565b611555565b005b61040161157a565b60405161040e9190612709565b60405180910390f35b610431600480360381019061042c919061299c565b6115a0565b005b60076020528160005260406000206020528060005260406000206000915091509054906101000a900467ffffffffffffffff1681565b60006104736116cb565b905061047f8183611710565b6000610489611815565b905061049681308661181d565b83600760008767ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900467ffffffffffffffff1661051d9190612a4c565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f80c031e937bcb2a3ff4482461fa37fd0caa24ee26cdc05e20746cd7eccc8d9ef600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682878760405161059a9493929190612a88565b60405180910390a15050505050565b600260159054906101000a900460ff1681565b6105c46119c0565b80600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60056020528160005260406000206020528060005260406000206000915091509054906101000a900467ffffffffffffffff1681565b600061065f611815565b9050600061066f82878787611a3e565b905061067b8184611710565b84600760008867ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900467ffffffffffffffff166107029190612acd565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008867ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900467ffffffffffffffff169050600560008867ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081819054906101000a900467ffffffffffffffff1661082990612b09565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555061085a30848861181d565b600080600760008a67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900467ffffffffffffffff1667ffffffffffffffff16036108ea57600190505b7f62fd95d0cc60f28a40386de0165f1d958b7a652abdaa5f06f9df29d227bd8b79600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685868b8b87878c604051610949989796959493929190612bb8565b60405180910390a15050505050505050565b6000610965611815565b90508073ffffffffffffffffffffffffffffffffffffffff16600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a2357600080fd5b6000610a30868686611b6a565b9050610a3c8184611710565b6000600760008767ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900467ffffffffffffffff1690506000600560008867ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900467ffffffffffffffff169050600760008867ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549067ffffffffffffffff0219169055600360008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008867ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008867ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081819054906101000a900467ffffffffffffffff16610cbc90612b09565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550610ced30858461181d565b7f62fd95d0cc60f28a40386de0165f1d958b7a652abdaa5f06f9df29d227bd8b79600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1689868a868660018c604051610d4d989796959493929190612bb8565b60405180910390a15050505050505050565b610d676119c0565b610d716000611c22565b565b600260149054906101000a900460ff1681565b6000610d90611815565b90508073ffffffffffffffffffffffffffffffffffffffff16610db161145e565b73ffffffffffffffffffffffffffffffffffffffff1614610e07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfe90612cc0565b60405180910390fd5b610e1081611c22565b50565b600260149054906101000a900460ff16610e59576040517ff8f3e48500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60066000610e65611815565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610eb757600080fd5b6000610ec1611815565b90506000600760008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900467ffffffffffffffff169050600760008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549067ffffffffffffffff0219169055610fc630838361181d565b7f62fd95d0cc60f28a40386de0165f1d958b7a652abdaa5f06f9df29d227bd8b79600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168384868567ffffffffffffffff600160405161102c9796959493929190612d2c565b60405180910390a1505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61106a6119c0565b6000828290509050600080600090505b8281101561110f5784848281811061109557611094612daf565b5b90506020020160208101906110aa91906128ac565b91506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080600101905061107a565b5050505050565b60006111228484611c53565b905061112e8183611710565b836003600061113b611815565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b6111e66119c0565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361121f57600080fd5b60138160ff161061122f57600080fd5b81600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260156101000a81548160ff021916908360ff1602179055505050565b6112976119c0565b6000828290509050600080600090505b8281101561133c578484828181106112c2576112c1612daf565b5b90506020020160208101906112d791906128ac565b91506001600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508060010190506112a7565b5050505050565b61134b6119c0565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016113a89190612709565b602060405180830381865afa1580156113c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e99190612e14565b9050611418600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168383611cc3565b5050565b60036020528160005260406000206020528060005260406000206000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60066020528060005260406000206000915054906101000a900460ff1681565b6114b06119c0565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16611510611039565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b61155d6119c0565b80600260146101000a81548160ff02191690831515021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6115a86119c0565b600084849050905060008060005b838110156116c1578787828181106115d1576115d0612daf565b5b90506020020160208101906115e691906128ac565b92508585828181106115fb576115fa612daf565b5b905060200201602081019061161091906126cd565b9150600560008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081819054906101000a900467ffffffffffffffff1660010191906101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508060010190506115b6565b5050505050505050565b6000806116d6611d7e565b6116de611815565b306040516020016116f193929190612ebf565b6040516020818303038152906040528051906020012090508091505090565b6006600061171c611815565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561176e57600080fd5b600061178b8261177d85611d8b565b611dc190919063ffffffff16565b9050600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611810576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b600033905090565b60008167ffffffffffffffff1603611861576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036118c7576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361195c57611957600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683600260159054906101000a900460ff16600a61193d919061302f565b8467ffffffffffffffff16611952919061307a565b611cc3565b6119bb565b6119ba600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168484600260159054906101000a900460ff16600a6119a0919061302f565b8567ffffffffffffffff166119b5919061307a565b611de8565b5b505050565b6119c8611815565b73ffffffffffffffffffffffffffffffffffffffff166119e6611039565b73ffffffffffffffffffffffffffffffffffffffff1614611a3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3390613108565b60405180910390fd5b565b60008167ffffffffffffffff16421115611a84576040517f72e2986e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000848484600560008967ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900467ffffffffffffffff16611b0a611d7e565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168b30604051602001611b46989796959493929190613128565b60405160208183030381529060405280519060200120905080915050949350505050565b60008167ffffffffffffffff16421115611bb0576040517f72e2986e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008383611bbc611d7e565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611be7611815565b8930604051602001611bff97969594939291906131ba565b604051602081830303815290604052805190602001209050809150509392505050565b600160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055611c5081611ec0565b50565b60008082611c5f611d7e565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611c8a611815565b8730604051602001611ca19695949392919061323b565b6040516020818303038152906040528051906020012090508091505092915050565b60006040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152826024820152602060006044836000895af1915081601f3d1160016000511416151615611d37573d853b15171591505b5080611d78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6f906132f7565b60405180910390fd5b50505050565b6000804690508091505090565b60007f19457468657265756d205369676e6564204d6573736167653a0a33320000000060005281601c52603c6000209050919050565b6000806000611dd08585611f84565b91509150611ddd81611fd5565b819250505092915050565b60006040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015273ffffffffffffffffffffffffffffffffffffffff841660248201528260448201526020600060648360008a5af1915081601f3d1160016000511416151615611e78573d863b15171591505b5080611eb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb090613363565b60405180910390fd5b5050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000806041835103611fc55760008060006020860151925060408601519150606086015160001a9050611fb98782858561213b565b94509450505050611fce565b60006002915091505b9250929050565b60006004811115611fe957611fe8613383565b5b816004811115611ffc57611ffb613383565b5b0315612138576001600481111561201657612015613383565b5b81600481111561202957612028613383565b5b03612069576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612060906133fe565b60405180910390fd5b6002600481111561207d5761207c613383565b5b8160048111156120905761208f613383565b5b036120d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c79061346a565b60405180910390fd5b600360048111156120e4576120e3613383565b5b8160048111156120f7576120f6613383565b5b03612137576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212e906134fc565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115612176576000600391509150612214565b60006001878787876040516000815260200160405260405161219b9493929190613535565b6020604051602081039080840390855afa1580156121bd573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361220b57600060019250925050612214565b80600092509250505b94509492505050565b6000604051905090565b600080fd5b600080fd5b600067ffffffffffffffff82169050919050565b61224e81612231565b811461225957600080fd5b50565b60008135905061226b81612245565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061229c82612271565b9050919050565b6122ac81612291565b81146122b757600080fd5b50565b6000813590506122c9816122a3565b92915050565b600080604083850312156122e6576122e5612227565b5b60006122f48582860161225c565b9250506020612305858286016122ba565b9150509250929050565b61231881612231565b82525050565b6000602082019050612333600083018461230f565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61238c82612343565b810181811067ffffffffffffffff821117156123ab576123aa612354565b5b80604052505050565b60006123be61221d565b90506123ca8282612383565b919050565b600067ffffffffffffffff8211156123ea576123e9612354565b5b6123f382612343565b9050602081019050919050565b82818337600083830152505050565b600061242261241d846123cf565b6123b4565b90508281526020810184848401111561243e5761243d61233e565b5b612449848285612400565b509392505050565b600082601f83011261246657612465612339565b5b813561247684826020860161240f565b91505092915050565b60008060006060848603121561249857612497612227565b5b60006124a68682870161225c565b93505060206124b78682870161225c565b925050604084013567ffffffffffffffff8111156124d8576124d761222c565b5b6124e486828701612451565b9150509250925092565b600060ff82169050919050565b612504816124ee565b82525050565b600060208201905061251f60008301846124fb565b92915050565b60008115159050919050565b61253a81612525565b811461254557600080fd5b50565b60008135905061255781612531565b92915050565b6000806040838503121561257457612573612227565b5b6000612582858286016122ba565b925050602061259385828601612548565b9150509250929050565b600080600080608085870312156125b7576125b6612227565b5b60006125c58782880161225c565b94505060206125d68782880161225c565b93505060406125e78782880161225c565b925050606085013567ffffffffffffffff8111156126085761260761222c565b5b61261487828801612451565b91505092959194509250565b6000806000806080858703121561263a57612639612227565b5b6000612648878288016122ba565b94505060206126598782880161225c565b935050604061266a8782880161225c565b925050606085013567ffffffffffffffff81111561268b5761268a61222c565b5b61269787828801612451565b91505092959194509250565b6126ac81612525565b82525050565b60006020820190506126c760008301846126a3565b92915050565b6000602082840312156126e3576126e2612227565b5b60006126f18482850161225c565b91505092915050565b61270381612291565b82525050565b600060208201905061271e60008301846126fa565b92915050565b600080fd5b600080fd5b60008083601f84011261274457612743612339565b5b8235905067ffffffffffffffff81111561276157612760612724565b5b60208301915083602082028301111561277d5761277c612729565b5b9250929050565b6000806020838503121561279b5761279a612227565b5b600083013567ffffffffffffffff8111156127b9576127b861222c565b5b6127c58582860161272e565b92509250509250929050565b6000806000606084860312156127ea576127e9612227565b5b60006127f8868287016122ba565b93505060206128098682870161225c565b925050604084013567ffffffffffffffff81111561282a5761282961222c565b5b61283686828701612451565b9150509250925092565b612849816124ee565b811461285457600080fd5b50565b60008135905061286681612840565b92915050565b6000806040838503121561288357612882612227565b5b6000612891858286016122ba565b92505060206128a285828601612857565b9150509250929050565b6000602082840312156128c2576128c1612227565b5b60006128d0848285016122ba565b91505092915050565b600080604083850312156128f0576128ef612227565b5b60006128fe858286016122ba565b925050602061290f8582860161225c565b9150509250929050565b60006020828403121561292f5761292e612227565b5b600061293d84828501612548565b91505092915050565b60008083601f84011261295c5761295b612339565b5b8235905067ffffffffffffffff81111561297957612978612724565b5b60208301915083602082028301111561299557612994612729565b5b9250929050565b600080600080604085870312156129b6576129b5612227565b5b600085013567ffffffffffffffff8111156129d4576129d361222c565b5b6129e08782880161272e565b9450945050602085013567ffffffffffffffff811115612a0357612a0261222c565b5b612a0f87828801612946565b925092505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612a5782612231565b9150612a6283612231565b9250828201905067ffffffffffffffff811115612a8257612a81612a1d565b5b92915050565b6000608082019050612a9d60008301876126fa565b612aaa60208301866126fa565b612ab7604083018561230f565b612ac4606083018461230f565b95945050505050565b6000612ad882612231565b9150612ae383612231565b9250828203905067ffffffffffffffff811115612b0357612b02612a1d565b5b92915050565b6000612b1482612231565b915067ffffffffffffffff8203612b2e57612b2d612a1d565b5b600182019050919050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612b73578082015181840152602081019050612b58565b60008484015250505050565b6000612b8a82612b39565b612b948185612b44565b9350612ba4818560208601612b55565b612bad81612343565b840191505092915050565b600061010082019050612bce600083018b6126fa565b612bdb602083018a6126fa565b612be860408301896126fa565b612bf5606083018861230f565b612c02608083018761230f565b612c0f60a083018661230f565b612c1c60c08301856126a3565b81810360e0830152612c2e8184612b7f565b90509998505050505050505050565b600082825260208201905092915050565b7f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060008201527f6e6577206f776e65720000000000000000000000000000000000000000000000602082015250565b6000612caa602983612c3d565b9150612cb582612c4e565b604082019050919050565b60006020820190508181036000830152612cd981612c9d565b9050919050565b7f3078000000000000000000000000000000000000000000000000000000000000600082015250565b6000612d16600283612b44565b9150612d2182612ce0565b602082019050919050565b600061010082019050612d42600083018a6126fa565b612d4f60208301896126fa565b612d5c60408301886126fa565b612d69606083018761230f565b612d76608083018661230f565b612d8360a083018561230f565b612d9060c08301846126a3565b81810360e0830152612da181612d09565b905098975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b612df181612dde565b8114612dfc57600080fd5b50565b600081519050612e0e81612de8565b92915050565b600060208284031215612e2a57612e29612227565b5b6000612e3884828501612dff565b91505092915050565b60008160c01b9050919050565b6000612e5982612e41565b9050919050565b612e71612e6c82612231565b612e4e565b82525050565b60008160601b9050919050565b6000612e8f82612e77565b9050919050565b6000612ea182612e84565b9050919050565b612eb9612eb482612291565b612e96565b82525050565b6000612ecb8286612e60565b600882019150612edb8285612ea8565b601482019150612eeb8284612ea8565b601482019150819050949350505050565b60008160011c9050919050565b6000808291508390505b6001851115612f5357808604811115612f2f57612f2e612a1d565b5b6001851615612f3e5780820291505b8081029050612f4c85612efc565b9450612f13565b94509492505050565b600082612f6c5760019050613028565b81612f7a5760009050613028565b8160018114612f905760028114612f9a57612fc9565b6001915050613028565b60ff841115612fac57612fab612a1d565b5b8360020a915084821115612fc357612fc2612a1d565b5b50613028565b5060208310610133831016604e8410600b8410161715612ffe5782820a905083811115612ff957612ff8612a1d565b5b613028565b61300b8484846001612f09565b9250905081840481111561302257613021612a1d565b5b81810290505b9392505050565b600061303a82612dde565b9150613045836124ee565b92506130727fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484612f5c565b905092915050565b600061308582612dde565b915061309083612dde565b925082820261309e81612dde565b915082820484148315176130b5576130b4612a1d565b5b5092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006130f2602083612c3d565b91506130fd826130bc565b602082019050919050565b60006020820190508181036000830152613121816130e5565b9050919050565b6000613134828b612e60565b600882019150613144828a612e60565b6008820191506131548289612e60565b6008820191506131648288612e60565b6008820191506131748287612e60565b6008820191506131848286612ea8565b6014820191506131948285612ea8565b6014820191506131a48284612ea8565b6014820191508190509998505050505050505050565b60006131c6828a612e60565b6008820191506131d68289612e60565b6008820191506131e68288612e60565b6008820191506131f68287612ea8565b6014820191506132068286612ea8565b6014820191506132168285612ea8565b6014820191506132268284612ea8565b60148201915081905098975050505050505050565b60006132478289612e60565b6008820191506132578288612e60565b6008820191506132678287612ea8565b6014820191506132778286612ea8565b6014820191506132878285612ea8565b6014820191506132978284612ea8565b601482019150819050979650505050505050565b7f5452414e534645525f4641494c45440000000000000000000000000000000000600082015250565b60006132e1600f83612c3d565b91506132ec826132ab565b602082019050919050565b60006020820190508181036000830152613310816132d4565b9050919050565b7f5452414e534645525f46524f4d5f4641494c4544000000000000000000000000600082015250565b600061334d601483612c3d565b915061335882613317565b602082019050919050565b6000602082019050818103600083015261337c81613340565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006133e8601883612c3d565b91506133f3826133b2565b602082019050919050565b60006020820190508181036000830152613417816133db565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000613454601f83612c3d565b915061345f8261341e565b602082019050919050565b6000602082019050818103600083015261348381613447565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006134e6602283612c3d565b91506134f18261348a565b604082019050919050565b60006020820190508181036000830152613515816134d9565b9050919050565b6000819050919050565b61352f8161351c565b82525050565b600060808201905061354a6000830187613526565b61355760208301866124fb565b6135646040830185613526565b6135716060830184613526565b9594505050505056fea2646970667358221220c87436d4200235ef4a2a5f08f4b2babbf6cd3852eb1e5cef074ccf22ca6b6fb364736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000600000000000000000000000006e7f11641c1ec71591828e531334192d622703f7000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000b13c54ed9e421526b95ef947fa485c370ce7f3f3
-----Decoded View---------------
Arg [0] : _signers (address[]): 0xb13C54eD9e421526b95eF947Fa485c370Ce7F3F3
Arg [1] : _token (address): 0x6E7F11641c1EC71591828E531334192d622703F7
Arg [2] : _decimals (uint8): 14
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 0000000000000000000000006e7f11641c1ec71591828e531334192d622703f7
Arg [2] : 000000000000000000000000000000000000000000000000000000000000000e
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [4] : 000000000000000000000000b13c54ed9e421526b95ef947fa485c370ce7f3f3
Deployed Bytecode Sourcemap
45351:9595:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45753:63;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46842:375;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45483:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54526:108;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45635:59;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47433:801;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49547:838;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15769:103;;;:::i;:::-;;45451:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18375:216;;;:::i;:::-;;50946:581;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15128:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53319:378;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48851:271;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54310:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52827:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54748:195;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45513:68;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17463:101;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45701:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17763:181;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54642:98;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45424:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53880:422;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45753:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;46842:375::-;46965:12;46980:11;:9;:11::i;:::-;46965:26;;47002:22;47014:4;47020:3;47002:11;:22::i;:::-;47037:12;47052;:10;:12::i;:::-;47037:27;;47075:38;47085:4;47099;47106:6;47075:9;:38::i;:::-;47151:6;47124:10;:17;47135:5;47124:17;;;;;;;;;;;;;;;:23;47142:4;47124:23;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;47173:36;47182:5;;;;;;;;;;;47189:4;47195:5;47202:6;47173:36;;;;;;;;;:::i;:::-;;;;;;;;46954:263;;46842:375;;;:::o;45483:21::-;;;;;;;;;;;;;:::o;54526:108::-;15014:13;:11;:13::i;:::-;54622:4:::1;54603:7;:16;54611:7;54603:16;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;54526:108:::0;;:::o;45635:59::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47433:801::-;47584:14;47601:12;:10;:12::i;:::-;47584:29;;47624:12;47639:44;47651:6;47659:5;47666:6;47674:8;47639:11;:44::i;:::-;47624:59;;47694:22;47706:4;47712:3;47694:11;:22::i;:::-;47758:6;47729:10;:17;47740:5;47729:17;;;;;;;;;;;;;;;:25;47747:6;47729:25;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;47775:12;47790:6;:13;47797:5;47790:13;;;;;;;;;;;;;;;:21;47804:6;47790:21;;;;;;;;;;;;;;;;;;;;;;;;;47775:36;;47824:6;:13;47831:5;47824:13;;;;;;;;;;;;;;;:21;47838:6;47824:21;;;;;;;;;;;;;;;;47822:23;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;47856:40;47874:4;47881:6;47889;47856:9;:40::i;:::-;47909:18;47971:1;47942:10;:17;47953:5;47942:17;;;;;;;;;;;;;;;:25;47960:6;47942:25;;;;;;;;;;;;;;;;;;;;;;;;;:30;;;47938:83;;48005:4;47989:20;;47938:83;48036:190;48061:5;;;;;;;;;;;48081:6;48102;48123:5;48143:6;48164:5;48184:13;48212:3;48036:190;;;;;;;;;;;;;:::i;:::-;;;;;;;;47573:661;;;;47433:801;;;;:::o;49547:838::-;49699:15;49717:12;:10;:12::i;:::-;49699:30;;49783:7;49748:42;;:14;:24;49763:8;49748:24;;;;;;;;;;;;;;;:31;49773:5;49748:31;;;;;;;;;;;;;;;;;;;;;;;;;:42;;;49740:51;;;;;;49804:12;49819:36;49829:8;49839:5;49846:8;49819:9;:36::i;:::-;49804:51;;49866:22;49878:4;49884:3;49866:11;:22::i;:::-;49901:13;49917:10;:17;49928:5;49917:17;;;;;;;;;;;;;;;:27;49935:8;49917:27;;;;;;;;;;;;;;;;;;;;;;;;;49901:43;;49955:12;49970:6;:13;49977:5;49970:13;;;;;;;;;;;;;;;:23;49984:8;49970:23;;;;;;;;;;;;;;;;;;;;;;;;;49955:38;;50011:10;:17;50022:5;50011:17;;;;;;;;;;;;;;;:27;50029:8;50011:27;;;;;;;;;;;;;;;;50004:34;;;;;;;;;;;50056:14;:24;50071:8;50056:24;;;;;;;;;;;;;;;:31;50081:5;50056:31;;;;;;;;;;;;;;;;50049:38;;;;;;;;;;;50100:6;:13;50107:5;50100:13;;;;;;;;;;;;;;;:23;50114:8;50100:23;;;;;;;;;;;;;;;;50098:25;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;50136:41;50154:4;50161:7;50170:6;50136:9;:41::i;:::-;50193:184;50218:5;;;;;;;;;;;50238:8;50261:7;50283:5;50303:6;50324:5;50344:4;50363:3;50193:184;;;;;;;;;;;;;:::i;:::-;;;;;;;;49688:697;;;;49547:838;;;;:::o;15769:103::-;15014:13;:11;:13::i;:::-;15834:30:::1;15861:1;15834:18;:30::i;:::-;15769:103::o:0;45451:25::-;;;;;;;;;;;;;:::o;18375:216::-;18428:14;18445:12;:10;:12::i;:::-;18428:29;;18494:6;18476:24;;:14;:12;:14::i;:::-;:24;;;18468:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;18557:26;18576:6;18557:18;:26::i;:::-;18417:174;18375:216::o;50946:581::-;51013:13;;;;;;;;;;;51008:67;;51050:13;;;;;;;;;;;;;;51008:67;51094:13;:27;51108:12;:10;:12::i;:::-;51094:27;;;;;;;;;;;;;;;;;;;;;;;;;51093:28;51085:37;;;;;;51133:14;51150:12;:10;:12::i;:::-;51133:29;;51173:13;51189:10;:17;51200:5;51189:17;;;;;;;;;;;;;;;:25;51207:6;51189:25;;;;;;;;;;;;;;;;;;;;;;;;;51173:41;;51232:10;:17;51243:5;51232:17;;;;;;;;;;;;;;;:25;51250:6;51232:25;;;;;;;;;;;;;;;;51225:32;;;;;;;;;;;51268:40;51286:4;51293:6;51301;51268:9;:40::i;:::-;51326:193;51351:5;;;;;;;;;;;51371:6;51392;51413:5;51433:6;51454:16;51485:4;51326:193;;;;;;;;;;;;:::i;:::-;;;;;;;;50997:530;;50946:581;:::o;15128:87::-;15174:7;15201:6;;;;;;;;;;;15194:13;;15128:87;:::o;53319:378::-;15014:13;:11;:13::i;:::-;53431:11:::1;53445:13;;:20;;53431:34;;53476:17;53536:9:::0;53548:1:::1;53536:13;;53531:148;53555:3;53551:1;:7;53531:148;;;53596:13;;53610:1;53596:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;53584:28;;53658:5;53631:13;:24;53645:9;53631:24;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;53560:3;;;;;53531:148;;;;53420:277;;53319:378:::0;;:::o;48851:271::-;48979:12;48994:30;49008:8;49018:5;48994:13;:30::i;:::-;48979:45;;49035:22;49047:4;49053:3;49035:11;:22::i;:::-;49106:8;49068:14;:28;49083:12;:10;:12::i;:::-;49068:28;;;;;;;;;;;;;;;:35;49097:5;49068:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;48968:154;48851:271;;;:::o;54310:208::-;15014:13;:11;:13::i;:::-;54417:1:::1;54399:20;;:6;:20;;::::0;54391:29:::1;;;::::0;::::1;;54451:2;54439:9;:14;;;54431:23;;;::::0;::::1;;54473:6;54465:5;;:14;;;;;;;;;;;;;;;;;;54501:9;54490:8;;:20;;;;;;;;;;;;;;;;;;54310:208:::0;;:::o;52827:339::-;15014:13;:11;:13::i;:::-;52910:11:::1;52924:10;;:17;;52910:31;;52952:16;53011:9:::0;53023:1:::1;53011:13;;53006:142;53030:3;53026:1;:7;53006:142;;;53070:10;;53081:1;53070:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;53059:24;;53128:4;53102:13;:23;53116:8;53102:23;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;53035:3;;;;;53006:142;;;;52899:267;;52827:339:::0;;:::o;54748:195::-;15014:13;:11;:13::i;:::-;54814:15:::1;54838:5;;;;;;;;;;;54832:22;;;54863:4;54832:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54814:55;;54880;54915:5;;;;;;;;;;;54923:2;54927:7;54880:28;:55::i;:::-;54803:140;54748:195:::0;:::o;45513:68::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;17463:101::-;17516:7;17543:13;;;;;;;;;;;17536:20;;17463:101;:::o;45701:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;17763:181::-;15014:13;:11;:13::i;:::-;17869:8:::1;17853:13;;:24;;;;;;;;;;;;;;;;;;17927:8;17893:43;;17918:7;:5;:7::i;:::-;17893:43;;;;;;;;;;;;17763:181:::0;:::o;54642:98::-;15014:13;:11;:13::i;:::-;54728:4:::1;54712:13;;:20;;;;;;;;;;;;;;;;;;54642:98:::0;:::o;45424:20::-;;;;;;;;;;;;;:::o;53880:422::-;15014:13;:11;:13::i;:::-;54017:11:::1;54031:5;;:12;;54017:26;;54054:12;54077::::0;54130:9:::1;54125:159;54149:3;54145:1;:7;54125:159;;;54185:5;;54191:1;54185:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;54178:15;;54220:5;;54226:1;54220:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;54212:16;;54249:6;:13;54256:5;54249:13;;;;;;;;;;;;;;;:19;54263:4;54249:19;;;;;;;;;;;;;;;;54247:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54154:3;;;;;54125:159;;;;54006:296;;;53880:422:::0;;;;:::o;47225:200::-;47268:7;47288:12;47344:10;:8;:10::i;:::-;47356:12;:10;:12::i;:::-;47378:4;47327:57;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47303:92;;;;;;47288:107;;47413:4;47406:11;;;47225:200;:::o;52390:292::-;52482:13;:27;52496:12;:10;:12::i;:::-;52482:27;;;;;;;;;;;;;;;;;;;;;;;;;52481:28;52473:37;;;;;;52521:15;52539:48;52577:9;52539:29;:4;:27;:29::i;:::-;:37;;:48;;;;:::i;:::-;52521:66;;52605:7;:16;52613:7;52605:16;;;;;;;;;;;;;;;;;;;;;;;;;52600:75;;52645:18;;;;;;;;;;;;;;52600:75;52462:220;52390:292;;:::o;13572:98::-;13625:7;13652:10;13645:17;;13572:98;:::o;51535:666::-;51662:1;51652:6;:11;;;51648:66;;51687:15;;;;;;;;;;;;;;51648:66;51744:1;51730:16;;:2;:16;;;51726:72;;51770:16;;;;;;;;;;;;;;51726:72;51830:4;51814:21;;:4;:21;;;51810:384;;51852:135;51905:5;;;;;;;;;;;51930:2;51964:8;;;;;;;;;;;51960:2;:12;;;;:::i;:::-;51951:6;:21;;;;;;:::i;:::-;51852:28;:135::i;:::-;51810:384;;;52020:162;52077:5;;;;;;;;;;;52102:4;52125:2;52159:8;;;;;;;;;;;52155:2;:12;;;;:::i;:::-;52146:6;:21;;;;;;:::i;:::-;52020:32;:162::i;:::-;51810:384;51535:666;;;:::o;15293:132::-;15368:12;:10;:12::i;:::-;15357:23;;:7;:5;:7::i;:::-;:23;;;15349:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15293:132::o;48242:601::-;48390:7;48432:8;48414:26;;:15;:26;48410:82;;;48464:16;;;;;;;;;;;;;;48410:82;48504:12;48578:5;48602:6;48627:8;48654:6;:13;48661:5;48654:13;;;;;;;;;;;;;;;:21;48668:6;48654:21;;;;;;;;;;;;;;;;;;;;;;;;;48694:10;:8;:10::i;:::-;48723:5;;;;;;;;;;;48747:6;48780:4;48543:257;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48519:292;;;;;;48504:307;;48831:4;48824:11;;;48242:601;;;;;;:::o;50393:545::-;50517:7;50559:8;50541:26;;:15;:26;50537:82;;;50591:16;;;;;;;;;;;;;;50537:82;50631:12;50705:5;50729:8;50756:10;:8;:10::i;:::-;50785:5;;;;;;;;;;;50809:12;:10;:12::i;:::-;50840:8;50875:4;50670:225;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50646:260;;;;;;50631:275;;50926:4;50919:11;;;50393:545;;;;;:::o;18134:156::-;18224:13;;18217:20;;;;;;;;;;;18248:34;18273:8;18248:24;:34::i;:::-;18134:156;:::o;49130:409::-;49234:7;49259:12;49333:5;49357:10;:8;:10::i;:::-;49386:5;;;;;;;;;;;49410:12;:10;:12::i;:::-;49441:8;49476:4;49298:198;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49274:233;;;;;;49259:248;;49527:4;49520:11;;;49130:409;;;;:::o;9879:1493::-;9996:12;10171:4;10165:11;10316:66;10297:17;10290:93;10439:42;10435:2;10431:51;10427:1;10408:17;10404:25;10397:86;10570:6;10565:2;10546:17;10542:26;10535:42;10921:2;10918:1;10914:2;10895:17;10892:1;10885:5;10878;10873:51;10862:62;;11195:7;11188:2;11170:16;11167:24;11163:1;11159;11153:8;11150:15;11146:46;11139:54;11135:68;11132:174;;;11272:16;11263:5;11251:18;11244:26;11241:48;11234:56;11223:67;;11132:174;10074:1243;11337:7;11329:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;9985:1387;9879:1493;;;:::o;52209:173::-;52251:6;52270:14;52330:9;52319:20;;52367:7;52360:14;;;52209:173;:::o;43212:405::-;43281:15;43486:34;43480:4;43473:48;43548:4;43542;43535:18;43594:4;43588;43578:21;43567:32;;43212:405;;;:::o;39676:231::-;39754:7;39775:17;39794:18;39816:27;39827:4;39833:9;39816:10;:27::i;:::-;39774:69;;;;39854:18;39866:5;39854:11;:18::i;:::-;39890:9;39883:16;;;;39676:231;;;;:::o;8201:1670::-;8345:12;8520:4;8514:11;8665:66;8646:17;8639:93;8790:42;8784:4;8780:53;8776:1;8757:17;8753:25;8746:88;8931:42;8927:2;8923:51;8918:2;8899:17;8895:26;8888:87;9062:6;9057:2;9038:17;9034:26;9027:42;9415:2;9412:1;9407:3;9388:17;9385:1;9378:5;9371;9366:52;9355:63;;9689:7;9682:2;9664:16;9661:24;9657:1;9653;9647:8;9644:15;9640:46;9633:54;9629:68;9626:174;;;9766:16;9757:5;9745:18;9738:26;9735:48;9728:56;9717:67;;9626:174;8423:1388;9831:7;9823:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;8334:1537;8201:1670;;;;:::o;16388:191::-;16462:16;16481:6;;;;;;;;;;;16462:25;;16507:8;16498:6;;:17;;;;;;;;;;;;;;;;;;16562:8;16531:40;;16552:8;16531:40;;;;;;;;;;;;16451:128;16388:191;:::o;38127:747::-;38208:7;38217:12;38266:2;38246:9;:16;:22;38242:625;;38285:9;38309;38333:7;38590:4;38579:9;38575:20;38569:27;38564:32;;38640:4;38629:9;38625:20;38619:27;38614:32;;38698:4;38687:9;38683:20;38677:27;38674:1;38669:36;38664:41;;38741:25;38752:4;38758:1;38761;38764;38741:10;:25::i;:::-;38734:32;;;;;;;;;38242:625;38815:1;38819:35;38799:56;;;;38127:747;;;;;;:::o;36520:521::-;36598:20;36589:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;36585:449;36635:7;36585:449;36696:29;36687:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;36683:351;;36742:34;;;;;;;;;;:::i;:::-;;;;;;;;36683:351;36807:35;36798:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;36794:240;;36859:41;;;;;;;;;;:::i;:::-;;;;;;;;36794:240;36931:30;36922:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;36918:116;;36978:44;;;;;;;;;;:::i;:::-;;;;;;;;36918:116;36520:521;;:::o;41060:1477::-;41148:7;41157:12;42082:66;42077:1;42069:10;;:79;42065:163;;;42181:1;42185:30;42165:51;;;;;;42065:163;42325:14;42342:24;42352:4;42358:1;42361;42364;42342:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42325:41;;42399:1;42381:20;;:6;:20;;;42377:103;;42434:1;42438:29;42418:50;;;;;;;42377:103;42500:6;42508:20;42492:37;;;;;41060:1477;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:101;370:7;410:18;403:5;399:30;388:41;;334:101;;;:::o;441:120::-;513:23;530:5;513:23;:::i;:::-;506:5;503:34;493:62;;551:1;548;541:12;493:62;441:120;:::o;567:137::-;612:5;650:6;637:20;628:29;;666:32;692:5;666:32;:::i;:::-;567:137;;;;:::o;710:126::-;747:7;787:42;780:5;776:54;765:65;;710:126;;;:::o;842:96::-;879:7;908:24;926:5;908:24;:::i;:::-;897:35;;842:96;;;:::o;944:122::-;1017:24;1035:5;1017:24;:::i;:::-;1010:5;1007:35;997:63;;1056:1;1053;1046:12;997:63;944:122;:::o;1072:139::-;1118:5;1156:6;1143:20;1134:29;;1172:33;1199:5;1172:33;:::i;:::-;1072:139;;;;:::o;1217:472::-;1284:6;1292;1341:2;1329:9;1320:7;1316:23;1312:32;1309:119;;;1347:79;;:::i;:::-;1309:119;1467:1;1492:52;1536:7;1527:6;1516:9;1512:22;1492:52;:::i;:::-;1482:62;;1438:116;1593:2;1619:53;1664:7;1655:6;1644:9;1640:22;1619:53;:::i;:::-;1609:63;;1564:118;1217:472;;;;;:::o;1695:115::-;1780:23;1797:5;1780:23;:::i;:::-;1775:3;1768:36;1695:115;;:::o;1816:218::-;1907:4;1945:2;1934:9;1930:18;1922:26;;1958:69;2024:1;2013:9;2009:17;2000:6;1958:69;:::i;:::-;1816:218;;;;:::o;2040:117::-;2149:1;2146;2139:12;2163:117;2272:1;2269;2262:12;2286:102;2327:6;2378:2;2374:7;2369:2;2362:5;2358:14;2354:28;2344:38;;2286:102;;;:::o;2394:180::-;2442:77;2439:1;2432:88;2539:4;2536:1;2529:15;2563:4;2560:1;2553:15;2580:281;2663:27;2685:4;2663:27;:::i;:::-;2655:6;2651:40;2793:6;2781:10;2778:22;2757:18;2745:10;2742:34;2739:62;2736:88;;;2804:18;;:::i;:::-;2736:88;2844:10;2840:2;2833:22;2623:238;2580:281;;:::o;2867:129::-;2901:6;2928:20;;:::i;:::-;2918:30;;2957:33;2985:4;2977:6;2957:33;:::i;:::-;2867:129;;;:::o;3002:307::-;3063:4;3153:18;3145:6;3142:30;3139:56;;;3175:18;;:::i;:::-;3139:56;3213:29;3235:6;3213:29;:::i;:::-;3205:37;;3297:4;3291;3287:15;3279:23;;3002:307;;;:::o;3315:146::-;3412:6;3407:3;3402;3389:30;3453:1;3444:6;3439:3;3435:16;3428:27;3315:146;;;:::o;3467:423::-;3544:5;3569:65;3585:48;3626:6;3585:48;:::i;:::-;3569:65;:::i;:::-;3560:74;;3657:6;3650:5;3643:21;3695:4;3688:5;3684:16;3733:3;3724:6;3719:3;3715:16;3712:25;3709:112;;;3740:79;;:::i;:::-;3709:112;3830:54;3877:6;3872:3;3867;3830:54;:::i;:::-;3550:340;3467:423;;;;;:::o;3909:338::-;3964:5;4013:3;4006:4;3998:6;3994:17;3990:27;3980:122;;4021:79;;:::i;:::-;3980:122;4138:6;4125:20;4163:78;4237:3;4229:6;4222:4;4214:6;4210:17;4163:78;:::i;:::-;4154:87;;3970:277;3909:338;;;;:::o;4253:793::-;4337:6;4345;4353;4402:2;4390:9;4381:7;4377:23;4373:32;4370:119;;;4408:79;;:::i;:::-;4370:119;4528:1;4553:52;4597:7;4588:6;4577:9;4573:22;4553:52;:::i;:::-;4543:62;;4499:116;4654:2;4680:52;4724:7;4715:6;4704:9;4700:22;4680:52;:::i;:::-;4670:62;;4625:117;4809:2;4798:9;4794:18;4781:32;4840:18;4832:6;4829:30;4826:117;;;4862:79;;:::i;:::-;4826:117;4967:62;5021:7;5012:6;5001:9;4997:22;4967:62;:::i;:::-;4957:72;;4752:287;4253:793;;;;;:::o;5052:86::-;5087:7;5127:4;5120:5;5116:16;5105:27;;5052:86;;;:::o;5144:112::-;5227:22;5243:5;5227:22;:::i;:::-;5222:3;5215:35;5144:112;;:::o;5262:214::-;5351:4;5389:2;5378:9;5374:18;5366:26;;5402:67;5466:1;5455:9;5451:17;5442:6;5402:67;:::i;:::-;5262:214;;;;:::o;5482:90::-;5516:7;5559:5;5552:13;5545:21;5534:32;;5482:90;;;:::o;5578:116::-;5648:21;5663:5;5648:21;:::i;:::-;5641:5;5638:32;5628:60;;5684:1;5681;5674:12;5628:60;5578:116;:::o;5700:133::-;5743:5;5781:6;5768:20;5759:29;;5797:30;5821:5;5797:30;:::i;:::-;5700:133;;;;:::o;5839:468::-;5904:6;5912;5961:2;5949:9;5940:7;5936:23;5932:32;5929:119;;;5967:79;;:::i;:::-;5929:119;6087:1;6112:53;6157:7;6148:6;6137:9;6133:22;6112:53;:::i;:::-;6102:63;;6058:117;6214:2;6240:50;6282:7;6273:6;6262:9;6258:22;6240:50;:::i;:::-;6230:60;;6185:115;5839:468;;;;;:::o;6313:937::-;6405:6;6413;6421;6429;6478:3;6466:9;6457:7;6453:23;6449:33;6446:120;;;6485:79;;:::i;:::-;6446:120;6605:1;6630:52;6674:7;6665:6;6654:9;6650:22;6630:52;:::i;:::-;6620:62;;6576:116;6731:2;6757:52;6801:7;6792:6;6781:9;6777:22;6757:52;:::i;:::-;6747:62;;6702:117;6858:2;6884:52;6928:7;6919:6;6908:9;6904:22;6884:52;:::i;:::-;6874:62;;6829:117;7013:2;7002:9;6998:18;6985:32;7044:18;7036:6;7033:30;7030:117;;;7066:79;;:::i;:::-;7030:117;7171:62;7225:7;7216:6;7205:9;7201:22;7171:62;:::i;:::-;7161:72;;6956:287;6313:937;;;;;;;:::o;7256:939::-;7349:6;7357;7365;7373;7422:3;7410:9;7401:7;7397:23;7393:33;7390:120;;;7429:79;;:::i;:::-;7390:120;7549:1;7574:53;7619:7;7610:6;7599:9;7595:22;7574:53;:::i;:::-;7564:63;;7520:117;7676:2;7702:52;7746:7;7737:6;7726:9;7722:22;7702:52;:::i;:::-;7692:62;;7647:117;7803:2;7829:52;7873:7;7864:6;7853:9;7849:22;7829:52;:::i;:::-;7819:62;;7774:117;7958:2;7947:9;7943:18;7930:32;7989:18;7981:6;7978:30;7975:117;;;8011:79;;:::i;:::-;7975:117;8116:62;8170:7;8161:6;8150:9;8146:22;8116:62;:::i;:::-;8106:72;;7901:287;7256:939;;;;;;;:::o;8201:109::-;8282:21;8297:5;8282:21;:::i;:::-;8277:3;8270:34;8201:109;;:::o;8316:210::-;8403:4;8441:2;8430:9;8426:18;8418:26;;8454:65;8516:1;8505:9;8501:17;8492:6;8454:65;:::i;:::-;8316:210;;;;:::o;8532:327::-;8590:6;8639:2;8627:9;8618:7;8614:23;8610:32;8607:119;;;8645:79;;:::i;:::-;8607:119;8765:1;8790:52;8834:7;8825:6;8814:9;8810:22;8790:52;:::i;:::-;8780:62;;8736:116;8532:327;;;;:::o;8865:118::-;8952:24;8970:5;8952:24;:::i;:::-;8947:3;8940:37;8865:118;;:::o;8989:222::-;9082:4;9120:2;9109:9;9105:18;9097:26;;9133:71;9201:1;9190:9;9186:17;9177:6;9133:71;:::i;:::-;8989:222;;;;:::o;9217:117::-;9326:1;9323;9316:12;9340:117;9449:1;9446;9439:12;9480:568;9553:8;9563:6;9613:3;9606:4;9598:6;9594:17;9590:27;9580:122;;9621:79;;:::i;:::-;9580:122;9734:6;9721:20;9711:30;;9764:18;9756:6;9753:30;9750:117;;;9786:79;;:::i;:::-;9750:117;9900:4;9892:6;9888:17;9876:29;;9954:3;9946:4;9938:6;9934:17;9924:8;9920:32;9917:41;9914:128;;;9961:79;;:::i;:::-;9914:128;9480:568;;;;;:::o;10054:559::-;10140:6;10148;10197:2;10185:9;10176:7;10172:23;10168:32;10165:119;;;10203:79;;:::i;:::-;10165:119;10351:1;10340:9;10336:17;10323:31;10381:18;10373:6;10370:30;10367:117;;;10403:79;;:::i;:::-;10367:117;10516:80;10588:7;10579:6;10568:9;10564:22;10516:80;:::i;:::-;10498:98;;;;10294:312;10054:559;;;;;:::o;10619:795::-;10704:6;10712;10720;10769:2;10757:9;10748:7;10744:23;10740:32;10737:119;;;10775:79;;:::i;:::-;10737:119;10895:1;10920:53;10965:7;10956:6;10945:9;10941:22;10920:53;:::i;:::-;10910:63;;10866:117;11022:2;11048:52;11092:7;11083:6;11072:9;11068:22;11048:52;:::i;:::-;11038:62;;10993:117;11177:2;11166:9;11162:18;11149:32;11208:18;11200:6;11197:30;11194:117;;;11230:79;;:::i;:::-;11194:117;11335:62;11389:7;11380:6;11369:9;11365:22;11335:62;:::i;:::-;11325:72;;11120:287;10619:795;;;;;:::o;11420:118::-;11491:22;11507:5;11491:22;:::i;:::-;11484:5;11481:33;11471:61;;11528:1;11525;11518:12;11471:61;11420:118;:::o;11544:135::-;11588:5;11626:6;11613:20;11604:29;;11642:31;11667:5;11642:31;:::i;:::-;11544:135;;;;:::o;11685:470::-;11751:6;11759;11808:2;11796:9;11787:7;11783:23;11779:32;11776:119;;;11814:79;;:::i;:::-;11776:119;11934:1;11959:53;12004:7;11995:6;11984:9;11980:22;11959:53;:::i;:::-;11949:63;;11905:117;12061:2;12087:51;12130:7;12121:6;12110:9;12106:22;12087:51;:::i;:::-;12077:61;;12032:116;11685:470;;;;;:::o;12161:329::-;12220:6;12269:2;12257:9;12248:7;12244:23;12240:32;12237:119;;;12275:79;;:::i;:::-;12237:119;12395:1;12420:53;12465:7;12456:6;12445:9;12441:22;12420:53;:::i;:::-;12410:63;;12366:117;12161:329;;;;:::o;12496:472::-;12563:6;12571;12620:2;12608:9;12599:7;12595:23;12591:32;12588:119;;;12626:79;;:::i;:::-;12588:119;12746:1;12771:53;12816:7;12807:6;12796:9;12792:22;12771:53;:::i;:::-;12761:63;;12717:117;12873:2;12899:52;12943:7;12934:6;12923:9;12919:22;12899:52;:::i;:::-;12889:62;;12844:117;12496:472;;;;;:::o;12974:323::-;13030:6;13079:2;13067:9;13058:7;13054:23;13050:32;13047:119;;;13085:79;;:::i;:::-;13047:119;13205:1;13230:50;13272:7;13263:6;13252:9;13248:22;13230:50;:::i;:::-;13220:60;;13176:114;12974:323;;;;:::o;13319:567::-;13391:8;13401:6;13451:3;13444:4;13436:6;13432:17;13428:27;13418:122;;13459:79;;:::i;:::-;13418:122;13572:6;13559:20;13549:30;;13602:18;13594:6;13591:30;13588:117;;;13624:79;;:::i;:::-;13588:117;13738:4;13730:6;13726:17;13714:29;;13792:3;13784:4;13776:6;13772:17;13762:8;13758:32;13755:41;13752:128;;;13799:79;;:::i;:::-;13752:128;13319:567;;;;;:::o;13892:932::-;14013:6;14021;14029;14037;14086:2;14074:9;14065:7;14061:23;14057:32;14054:119;;;14092:79;;:::i;:::-;14054:119;14240:1;14229:9;14225:17;14212:31;14270:18;14262:6;14259:30;14256:117;;;14292:79;;:::i;:::-;14256:117;14405:80;14477:7;14468:6;14457:9;14453:22;14405:80;:::i;:::-;14387:98;;;;14183:312;14562:2;14551:9;14547:18;14534:32;14593:18;14585:6;14582:30;14579:117;;;14615:79;;:::i;:::-;14579:117;14728:79;14799:7;14790:6;14779:9;14775:22;14728:79;:::i;:::-;14710:97;;;;14505:312;13892:932;;;;;;;:::o;14830:180::-;14878:77;14875:1;14868:88;14975:4;14972:1;14965:15;14999:4;14996:1;14989:15;15016:205;15055:3;15074:19;15091:1;15074:19;:::i;:::-;15069:24;;15107:19;15124:1;15107:19;:::i;:::-;15102:24;;15149:1;15146;15142:9;15135:16;;15172:18;15167:3;15164:27;15161:53;;;15194:18;;:::i;:::-;15161:53;15016:205;;;;:::o;15227:545::-;15400:4;15438:3;15427:9;15423:19;15415:27;;15452:71;15520:1;15509:9;15505:17;15496:6;15452:71;:::i;:::-;15533:72;15601:2;15590:9;15586:18;15577:6;15533:72;:::i;:::-;15615:70;15681:2;15670:9;15666:18;15657:6;15615:70;:::i;:::-;15695;15761:2;15750:9;15746:18;15737:6;15695:70;:::i;:::-;15227:545;;;;;;;:::o;15778:208::-;15817:4;15837:19;15854:1;15837:19;:::i;:::-;15832:24;;15870:19;15887:1;15870:19;:::i;:::-;15865:24;;15913:1;15910;15906:9;15898:17;;15937:18;15931:4;15928:28;15925:54;;;15959:18;;:::i;:::-;15925:54;15778:208;;;;:::o;15992:183::-;16030:3;16053:23;16070:5;16053:23;:::i;:::-;16044:32;;16098:18;16091:5;16088:29;16085:55;;16120:18;;:::i;:::-;16085:55;16167:1;16160:5;16156:13;16149:20;;15992:183;;;:::o;16181:98::-;16232:6;16266:5;16260:12;16250:22;;16181:98;;;:::o;16285:168::-;16368:11;16402:6;16397:3;16390:19;16442:4;16437:3;16433:14;16418:29;;16285:168;;;;:::o;16459:246::-;16540:1;16550:113;16564:6;16561:1;16558:13;16550:113;;;16649:1;16644:3;16640:11;16634:18;16630:1;16625:3;16621:11;16614:39;16586:2;16583:1;16579:10;16574:15;;16550:113;;;16697:1;16688:6;16683:3;16679:16;16672:27;16521:184;16459:246;;;:::o;16711:373::-;16797:3;16825:38;16857:5;16825:38;:::i;:::-;16879:70;16942:6;16937:3;16879:70;:::i;:::-;16872:77;;16958:65;17016:6;17011:3;17004:4;16997:5;16993:16;16958:65;:::i;:::-;17048:29;17070:6;17048:29;:::i;:::-;17043:3;17039:39;17032:46;;16801:283;16711:373;;;;:::o;17090:1060::-;17385:4;17423:3;17412:9;17408:19;17400:27;;17437:71;17505:1;17494:9;17490:17;17481:6;17437:71;:::i;:::-;17518:72;17586:2;17575:9;17571:18;17562:6;17518:72;:::i;:::-;17600;17668:2;17657:9;17653:18;17644:6;17600:72;:::i;:::-;17682:70;17748:2;17737:9;17733:18;17724:6;17682:70;:::i;:::-;17762:71;17828:3;17817:9;17813:19;17804:6;17762:71;:::i;:::-;17843;17909:3;17898:9;17894:19;17885:6;17843:71;:::i;:::-;17924:67;17986:3;17975:9;17971:19;17962:6;17924:67;:::i;:::-;18039:9;18033:4;18029:20;18023:3;18012:9;18008:19;18001:49;18067:76;18138:4;18129:6;18067:76;:::i;:::-;18059:84;;17090:1060;;;;;;;;;;;:::o;18156:169::-;18240:11;18274:6;18269:3;18262:19;18314:4;18309:3;18305:14;18290:29;;18156:169;;;;:::o;18331:228::-;18471:34;18467:1;18459:6;18455:14;18448:58;18540:11;18535:2;18527:6;18523:15;18516:36;18331:228;:::o;18565:366::-;18707:3;18728:67;18792:2;18787:3;18728:67;:::i;:::-;18721:74;;18804:93;18893:3;18804:93;:::i;:::-;18922:2;18917:3;18913:12;18906:19;;18565:366;;;:::o;18937:419::-;19103:4;19141:2;19130:9;19126:18;19118:26;;19190:9;19184:4;19180:20;19176:1;19165:9;19161:17;19154:47;19218:131;19344:4;19218:131;:::i;:::-;19210:139;;18937:419;;;:::o;19362:152::-;19502:4;19498:1;19490:6;19486:14;19479:28;19362:152;:::o;19520:363::-;19661:3;19682:65;19745:1;19740:3;19682:65;:::i;:::-;19675:72;;19756:93;19845:3;19756:93;:::i;:::-;19874:2;19869:3;19865:12;19858:19;;19520:363;;;:::o;19889:1168::-;20238:4;20276:3;20265:9;20261:19;20253:27;;20290:71;20358:1;20347:9;20343:17;20334:6;20290:71;:::i;:::-;20371:72;20439:2;20428:9;20424:18;20415:6;20371:72;:::i;:::-;20453;20521:2;20510:9;20506:18;20497:6;20453:72;:::i;:::-;20535:70;20601:2;20590:9;20586:18;20577:6;20535:70;:::i;:::-;20615:71;20681:3;20670:9;20666:19;20657:6;20615:71;:::i;:::-;20696;20762:3;20751:9;20747:19;20738:6;20696:71;:::i;:::-;20777:67;20839:3;20828:9;20824:19;20815:6;20777:67;:::i;:::-;20892:9;20886:4;20882:20;20876:3;20865:9;20861:19;20854:49;20920:130;21045:4;20920:130;:::i;:::-;20912:138;;19889:1168;;;;;;;;;;:::o;21063:180::-;21111:77;21108:1;21101:88;21208:4;21205:1;21198:15;21232:4;21229:1;21222:15;21249:77;21286:7;21315:5;21304:16;;21249:77;;;:::o;21332:122::-;21405:24;21423:5;21405:24;:::i;:::-;21398:5;21395:35;21385:63;;21444:1;21441;21434:12;21385:63;21332:122;:::o;21460:143::-;21517:5;21548:6;21542:13;21533:22;;21564:33;21591:5;21564:33;:::i;:::-;21460:143;;;;:::o;21609:351::-;21679:6;21728:2;21716:9;21707:7;21703:23;21699:32;21696:119;;;21734:79;;:::i;:::-;21696:119;21854:1;21879:64;21935:7;21926:6;21915:9;21911:22;21879:64;:::i;:::-;21869:74;;21825:128;21609:351;;;;:::o;21966:96::-;22000:8;22049:5;22044:3;22040:15;22019:36;;21966:96;;;:::o;22068:94::-;22106:7;22135:21;22150:5;22135:21;:::i;:::-;22124:32;;22068:94;;;:::o;22168:153::-;22271:43;22290:23;22307:5;22290:23;:::i;:::-;22271:43;:::i;:::-;22266:3;22259:56;22168:153;;:::o;22327:94::-;22360:8;22408:5;22404:2;22400:14;22379:35;;22327:94;;;:::o;22427:::-;22466:7;22495:20;22509:5;22495:20;:::i;:::-;22484:31;;22427:94;;;:::o;22527:100::-;22566:7;22595:26;22615:5;22595:26;:::i;:::-;22584:37;;22527:100;;;:::o;22633:157::-;22738:45;22758:24;22776:5;22758:24;:::i;:::-;22738:45;:::i;:::-;22733:3;22726:58;22633:157;;:::o;22796:533::-;22962:3;22977:73;23046:3;23037:6;22977:73;:::i;:::-;23075:1;23070:3;23066:11;23059:18;;23087:75;23158:3;23149:6;23087:75;:::i;:::-;23187:2;23182:3;23178:12;23171:19;;23200:75;23271:3;23262:6;23200:75;:::i;:::-;23300:2;23295:3;23291:12;23284:19;;23320:3;23313:10;;22796:533;;;;;;:::o;23335:102::-;23377:8;23424:5;23421:1;23417:13;23396:34;;23335:102;;;:::o;23443:848::-;23504:5;23511:4;23535:6;23526:15;;23559:5;23550:14;;23573:712;23594:1;23584:8;23581:15;23573:712;;;23689:4;23684:3;23680:14;23674:4;23671:24;23668:50;;;23698:18;;:::i;:::-;23668:50;23748:1;23738:8;23734:16;23731:451;;;24163:4;24156:5;24152:16;24143:25;;23731:451;24213:4;24207;24203:15;24195:23;;24243:32;24266:8;24243:32;:::i;:::-;24231:44;;23573:712;;;23443:848;;;;;;;:::o;24297:1073::-;24351:5;24542:8;24532:40;;24563:1;24554:10;;24565:5;;24532:40;24591:4;24581:36;;24608:1;24599:10;;24610:5;;24581:36;24677:4;24725:1;24720:27;;;;24761:1;24756:191;;;;24670:277;;24720:27;24738:1;24729:10;;24740:5;;;24756:191;24801:3;24791:8;24788:17;24785:43;;;24808:18;;:::i;:::-;24785:43;24857:8;24854:1;24850:16;24841:25;;24892:3;24885:5;24882:14;24879:40;;;24899:18;;:::i;:::-;24879:40;24932:5;;;24670:277;;25056:2;25046:8;25043:16;25037:3;25031:4;25028:13;25024:36;25006:2;24996:8;24993:16;24988:2;24982:4;24979:12;24975:35;24959:111;24956:246;;;25112:8;25106:4;25102:19;25093:28;;25147:3;25140:5;25137:14;25134:40;;;25154:18;;:::i;:::-;25134:40;25187:5;;24956:246;25227:42;25265:3;25255:8;25249:4;25246:1;25227:42;:::i;:::-;25212:57;;;;25301:4;25296:3;25292:14;25285:5;25282:25;25279:51;;;25310:18;;:::i;:::-;25279:51;25359:4;25352:5;25348:16;25339:25;;24297:1073;;;;;;:::o;25376:281::-;25434:5;25458:23;25476:4;25458:23;:::i;:::-;25450:31;;25502:25;25518:8;25502:25;:::i;:::-;25490:37;;25546:104;25583:66;25573:8;25567:4;25546:104;:::i;:::-;25537:113;;25376:281;;;;:::o;25663:410::-;25703:7;25726:20;25744:1;25726:20;:::i;:::-;25721:25;;25760:20;25778:1;25760:20;:::i;:::-;25755:25;;25815:1;25812;25808:9;25837:30;25855:11;25837:30;:::i;:::-;25826:41;;26016:1;26007:7;26003:15;26000:1;25997:22;25977:1;25970:9;25950:83;25927:139;;26046:18;;:::i;:::-;25927:139;25711:362;25663:410;;;;:::o;26079:182::-;26219:34;26215:1;26207:6;26203:14;26196:58;26079:182;:::o;26267:366::-;26409:3;26430:67;26494:2;26489:3;26430:67;:::i;:::-;26423:74;;26506:93;26595:3;26506:93;:::i;:::-;26624:2;26619:3;26615:12;26608:19;;26267:366;;;:::o;26639:419::-;26805:4;26843:2;26832:9;26828:18;26820:26;;26892:9;26886:4;26882:20;26878:1;26867:9;26863:17;26856:47;26920:131;27046:4;26920:131;:::i;:::-;26912:139;;26639:419;;;:::o;27064:1218::-;27362:3;27377:73;27446:3;27437:6;27377:73;:::i;:::-;27475:1;27470:3;27466:11;27459:18;;27487:73;27556:3;27547:6;27487:73;:::i;:::-;27585:1;27580:3;27576:11;27569:18;;27597:73;27666:3;27657:6;27597:73;:::i;:::-;27695:1;27690:3;27686:11;27679:18;;27707:73;27776:3;27767:6;27707:73;:::i;:::-;27805:1;27800:3;27796:11;27789:18;;27817:73;27886:3;27877:6;27817:73;:::i;:::-;27915:1;27910:3;27906:11;27899:18;;27927:75;27998:3;27989:6;27927:75;:::i;:::-;28027:2;28022:3;28018:12;28011:19;;28040:75;28111:3;28102:6;28040:75;:::i;:::-;28140:2;28135:3;28131:12;28124:19;;28153:75;28224:3;28215:6;28153:75;:::i;:::-;28253:2;28248:3;28244:12;28237:19;;28273:3;28266:10;;27064:1218;;;;;;;;;;;:::o;28288:1087::-;28562:3;28577:73;28646:3;28637:6;28577:73;:::i;:::-;28675:1;28670:3;28666:11;28659:18;;28687:73;28756:3;28747:6;28687:73;:::i;:::-;28785:1;28780:3;28776:11;28769:18;;28797:73;28866:3;28857:6;28797:73;:::i;:::-;28895:1;28890:3;28886:11;28879:18;;28907:75;28978:3;28969:6;28907:75;:::i;:::-;29007:2;29002:3;28998:12;28991:19;;29020:75;29091:3;29082:6;29020:75;:::i;:::-;29120:2;29115:3;29111:12;29104:19;;29133:75;29204:3;29195:6;29133:75;:::i;:::-;29233:2;29228:3;29224:12;29217:19;;29246:75;29317:3;29308:6;29246:75;:::i;:::-;29346:2;29341:3;29337:12;29330:19;;29366:3;29359:10;;28288:1087;;;;;;;;;;:::o;29381:951::-;29629:3;29644:73;29713:3;29704:6;29644:73;:::i;:::-;29742:1;29737:3;29733:11;29726:18;;29754:73;29823:3;29814:6;29754:73;:::i;:::-;29852:1;29847:3;29843:11;29836:18;;29864:75;29935:3;29926:6;29864:75;:::i;:::-;29964:2;29959:3;29955:12;29948:19;;29977:75;30048:3;30039:6;29977:75;:::i;:::-;30077:2;30072:3;30068:12;30061:19;;30090:75;30161:3;30152:6;30090:75;:::i;:::-;30190:2;30185:3;30181:12;30174:19;;30203:75;30274:3;30265:6;30203:75;:::i;:::-;30303:2;30298:3;30294:12;30287:19;;30323:3;30316:10;;29381:951;;;;;;;;;:::o;30338:165::-;30478:17;30474:1;30466:6;30462:14;30455:41;30338:165;:::o;30509:366::-;30651:3;30672:67;30736:2;30731:3;30672:67;:::i;:::-;30665:74;;30748:93;30837:3;30748:93;:::i;:::-;30866:2;30861:3;30857:12;30850:19;;30509:366;;;:::o;30881:419::-;31047:4;31085:2;31074:9;31070:18;31062:26;;31134:9;31128:4;31124:20;31120:1;31109:9;31105:17;31098:47;31162:131;31288:4;31162:131;:::i;:::-;31154:139;;30881:419;;;:::o;31306:170::-;31446:22;31442:1;31434:6;31430:14;31423:46;31306:170;:::o;31482:366::-;31624:3;31645:67;31709:2;31704:3;31645:67;:::i;:::-;31638:74;;31721:93;31810:3;31721:93;:::i;:::-;31839:2;31834:3;31830:12;31823:19;;31482:366;;;:::o;31854:419::-;32020:4;32058:2;32047:9;32043:18;32035:26;;32107:9;32101:4;32097:20;32093:1;32082:9;32078:17;32071:47;32135:131;32261:4;32135:131;:::i;:::-;32127:139;;31854:419;;;:::o;32279:180::-;32327:77;32324:1;32317:88;32424:4;32421:1;32414:15;32448:4;32445:1;32438:15;32465:174;32605:26;32601:1;32593:6;32589:14;32582:50;32465:174;:::o;32645:366::-;32787:3;32808:67;32872:2;32867:3;32808:67;:::i;:::-;32801:74;;32884:93;32973:3;32884:93;:::i;:::-;33002:2;32997:3;32993:12;32986:19;;32645:366;;;:::o;33017:419::-;33183:4;33221:2;33210:9;33206:18;33198:26;;33270:9;33264:4;33260:20;33256:1;33245:9;33241:17;33234:47;33298:131;33424:4;33298:131;:::i;:::-;33290:139;;33017:419;;;:::o;33442:181::-;33582:33;33578:1;33570:6;33566:14;33559:57;33442:181;:::o;33629:366::-;33771:3;33792:67;33856:2;33851:3;33792:67;:::i;:::-;33785:74;;33868:93;33957:3;33868:93;:::i;:::-;33986:2;33981:3;33977:12;33970:19;;33629:366;;;:::o;34001:419::-;34167:4;34205:2;34194:9;34190:18;34182:26;;34254:9;34248:4;34244:20;34240:1;34229:9;34225:17;34218:47;34282:131;34408:4;34282:131;:::i;:::-;34274:139;;34001:419;;;:::o;34426:221::-;34566:34;34562:1;34554:6;34550:14;34543:58;34635:4;34630:2;34622:6;34618:15;34611:29;34426:221;:::o;34653:366::-;34795:3;34816:67;34880:2;34875:3;34816:67;:::i;:::-;34809:74;;34892:93;34981:3;34892:93;:::i;:::-;35010:2;35005:3;35001:12;34994:19;;34653:366;;;:::o;35025:419::-;35191:4;35229:2;35218:9;35214:18;35206:26;;35278:9;35272:4;35268:20;35264:1;35253:9;35249:17;35242:47;35306:131;35432:4;35306:131;:::i;:::-;35298:139;;35025:419;;;:::o;35450:77::-;35487:7;35516:5;35505:16;;35450:77;;;:::o;35533:118::-;35620:24;35638:5;35620:24;:::i;:::-;35615:3;35608:37;35533:118;;:::o;35657:545::-;35830:4;35868:3;35857:9;35853:19;35845:27;;35882:71;35950:1;35939:9;35935:17;35926:6;35882:71;:::i;:::-;35963:68;36027:2;36016:9;36012:18;36003:6;35963:68;:::i;:::-;36041:72;36109:2;36098:9;36094:18;36085:6;36041:72;:::i;:::-;36123;36191:2;36180:9;36176:18;36167:6;36123:72;:::i;:::-;35657:545;;;;;;;:::o
Swarm Source
ipfs://c87436d4200235ef4a2a5f08f4b2babbf6cd3852eb1e5cef074ccf22ca6b6fb3
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 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.