ERC-20
Trading
Overview
Max Total Supply
1,000,000 PRO
Holders
607 (0.00%)
Market
Price
$0.27 @ 0.000107 ETH (+1.87%)
Onchain Market Cap
$270,617.00
Circulating Supply Market Cap
$0.00
Other Info
Token Contract (WITH 18 Decimals)
Balance
0.209981344105483824 PROValue
$0.06 ( ~2.3760832098617E-05 Eth) [0.0000%]Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
ProdigyBot
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-07-31 */ /** * This is the utility token for the Prodigy Bot, a Telegram multichain trading tool suite. * * https://prodigybot.io/ * https://t.me/ProdigySniper/ * https://t.me/ProdigySniperBot/ * * $$$$$$$\ $$\ $$\ $$\ $$\ * $$ __$$\ $$ |\__| $$ | $$ | * $$ | $$ | $$$$$$\ $$$$$$\ $$$$$$$ |$$\ $$$$$$\ $$\ $$\ $$$$$$$\ $$$$$$\ $$$$$$\ * $$$$$$$ |$$ __$$\ $$ __$$\ $$ __$$ |$$ |$$ __$$\ $$ | $$ |$$ __$$\ $$ __$$\\_$$ _| * $$ ____/ $$ | \__|$$ / $$ |$$ / $$ |$$ |$$ / $$ |$$ | $$ |$$ | $$ |$$ / $$ | $$ | * $$ | $$ | $$ | $$ |$$ | $$ |$$ |$$ | $$ |$$ | $$ |$$ | $$ |$$ | $$ | $$ |$$\ * $$ | $$ | \$$$$$$ |\$$$$$$$ |$$ |\$$$$$$$ |\$$$$$$$ |$$$$$$$ |\$$$$$$ | \$$$$ | * \__| \__| \______/ \_______|\__| \____$$ | \____$$ |\_______/ \______/ \____/ * $$\ $$ |$$\ $$ | * \$$$$$$ |\$$$$$$ | * \______/ \______/ */ // SPDX-License-Identifier: MIT pragma solidity >=0.7.0 <0.9.0; /** * @notice Simple ERC20 implementation from Solady. * @author Solady (https://github.com/vectorized/solady/blob/main/src/tokens/ERC20.sol) * @notice EIP-2612 has been removed due to concerns of userbase not being familiar with the security risks of signatures. * @notice Hooks removed since they could be called twice during tax events. * @notice Burn is removed as there is no intended use. */ abstract contract ERC20 { /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* CUSTOM ERRORS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev The total supply has overflowed. error TotalSupplyOverflow(); /// @dev The allowance has overflowed. error AllowanceOverflow(); /// @dev The allowance has underflowed. error AllowanceUnderflow(); /// @dev Insufficient balance. error InsufficientBalance(); /// @dev Insufficient allowance. error InsufficientAllowance(); /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* EVENTS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Emitted when `amount` tokens is transferred from `from` to `to`. event Transfer(address indexed from, address indexed to, uint256 amount); /// @dev Emitted when `amount` tokens is approved by `owner` to be used by `spender`. event Approval(address indexed owner, address indexed spender, uint256 amount); /// @dev `keccak256(bytes("Transfer(address,address,uint256)"))`. uint256 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; /// @dev `keccak256(bytes("Approval(address,address,uint256)"))`. uint256 private constant _APPROVAL_EVENT_SIGNATURE = 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925; /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* STORAGE */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev The storage slot for the total supply. uint256 private constant _TOTAL_SUPPLY_SLOT = 0x05345cdf77eb68f44c; /// @dev The balance slot of `owner` is given by: /// ``` /// mstore(0x0c, _BALANCE_SLOT_SEED) /// mstore(0x00, owner) /// let balanceSlot := keccak256(0x0c, 0x20) /// ``` uint256 private constant _BALANCE_SLOT_SEED = 0x87a211a2; /// @dev The allowance slot of (`owner`, `spender`) is given by: /// ``` /// mstore(0x20, spender) /// mstore(0x0c, _ALLOWANCE_SLOT_SEED) /// mstore(0x00, owner) /// let allowanceSlot := keccak256(0x0c, 0x34) /// ``` uint256 private constant _ALLOWANCE_SLOT_SEED = 0x7f5e9f20; /// @dev The nonce slot of `owner` is given by: /// ``` /// mstore(0x0c, _NONCES_SLOT_SEED) /// mstore(0x00, owner) /// let nonceSlot := keccak256(0x0c, 0x20) /// ``` uint256 private constant _NONCES_SLOT_SEED = 0x38377508; /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* ERC20 METADATA */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Returns the name of the token. function name() public view virtual returns (string memory); /// @dev Returns the symbol of the token. function symbol() public view virtual returns (string memory); /// @dev Returns the decimals places of the token. function decimals() public view virtual returns (uint8) { return 18; } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* ERC20 */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Returns the amount of tokens in existence. function totalSupply() public view virtual returns (uint256 result) { /// @solidity memory-safe-assembly assembly { result := sload(_TOTAL_SUPPLY_SLOT) } } /// @dev Returns the amount of tokens owned by `owner`. function balanceOf(address owner) public view virtual returns (uint256 result) { /// @solidity memory-safe-assembly assembly { mstore(0x0c, _BALANCE_SLOT_SEED) mstore(0x00, owner) result := sload(keccak256(0x0c, 0x20)) } } /// @dev Returns the amount of tokens that `spender` can spend on behalf of `owner`. function allowance(address owner, address spender) public view virtual returns (uint256 result) { /// @solidity memory-safe-assembly assembly { mstore(0x20, spender) mstore(0x0c, _ALLOWANCE_SLOT_SEED) mstore(0x00, owner) result := sload(keccak256(0x0c, 0x34)) } } /// @dev Sets `amount` as the allowance of `spender` over the caller's tokens. /// /// Emits a {Approval} event. function approve(address spender, uint256 amount) public virtual returns (bool) { /// @solidity memory-safe-assembly assembly { // Compute the allowance slot and store the amount. mstore(0x20, spender) mstore(0x0c, _ALLOWANCE_SLOT_SEED) mstore(0x00, caller()) sstore(keccak256(0x0c, 0x34), amount) // Emit the {Approval} event. mstore(0x00, amount) log3(0x00, 0x20, _APPROVAL_EVENT_SIGNATURE, caller(), shr(96, mload(0x2c))) } return true; } /// @dev Atomically increases the allowance granted to `spender` by the caller. /// /// Emits a {Approval} event. function increaseAllowance(address spender, uint256 difference) public virtual returns (bool) { /// @solidity memory-safe-assembly assembly { // Compute the allowance slot and load its value. mstore(0x20, spender) mstore(0x0c, _ALLOWANCE_SLOT_SEED) mstore(0x00, caller()) let allowanceSlot := keccak256(0x0c, 0x34) let allowanceBefore := sload(allowanceSlot) // Add to the allowance. let allowanceAfter := add(allowanceBefore, difference) // Revert upon overflow. if lt(allowanceAfter, allowanceBefore) { mstore(0x00, 0xf9067066) // `AllowanceOverflow()`. revert(0x1c, 0x04) } // Store the updated allowance. sstore(allowanceSlot, allowanceAfter) // Emit the {Approval} event. mstore(0x00, allowanceAfter) log3(0x00, 0x20, _APPROVAL_EVENT_SIGNATURE, caller(), shr(96, mload(0x2c))) } return true; } /// @dev Atomically decreases the allowance granted to `spender` by the caller. /// /// Emits a {Approval} event. function decreaseAllowance(address spender, uint256 difference) public virtual returns (bool) { /// @solidity memory-safe-assembly assembly { // Compute the allowance slot and load its value. mstore(0x20, spender) mstore(0x0c, _ALLOWANCE_SLOT_SEED) mstore(0x00, caller()) let allowanceSlot := keccak256(0x0c, 0x34) let allowanceBefore := sload(allowanceSlot) // Revert if will underflow. if lt(allowanceBefore, difference) { mstore(0x00, 0x8301ab38) // `AllowanceUnderflow()`. revert(0x1c, 0x04) } // Subtract and store the updated allowance. let allowanceAfter := sub(allowanceBefore, difference) sstore(allowanceSlot, allowanceAfter) // Emit the {Approval} event. mstore(0x00, allowanceAfter) log3(0x00, 0x20, _APPROVAL_EVENT_SIGNATURE, caller(), shr(96, mload(0x2c))) } return true; } /// @dev Transfer `amount` tokens from the caller to `to`. /// /// Requirements: /// - `from` must at least have `amount`. /// /// Emits a {Transfer} event. function transfer(address to, uint256 amount) public virtual returns (bool) { /// @solidity memory-safe-assembly assembly { // Compute the balance slot and load its value. mstore(0x0c, _BALANCE_SLOT_SEED) mstore(0x00, caller()) let fromBalanceSlot := keccak256(0x0c, 0x20) let fromBalance := sload(fromBalanceSlot) // Revert if insufficient balance. if gt(amount, fromBalance) { mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`. revert(0x1c, 0x04) } // Subtract and store the updated balance. sstore(fromBalanceSlot, sub(fromBalance, amount)) // Compute the balance slot of `to`. mstore(0x00, to) let toBalanceSlot := keccak256(0x0c, 0x20) // Add and store the updated balance of `to`. // Will not overflow because the sum of all user balances // cannot exceed the maximum uint256 value. sstore(toBalanceSlot, add(sload(toBalanceSlot), amount)) // Emit the {Transfer} event. mstore(0x20, amount) log3(0x20, 0x20, _TRANSFER_EVENT_SIGNATURE, caller(), shr(96, mload(0x0c))) } return true; } /// @dev Transfers `amount` tokens from `from` to `to`. /// /// Note: Does not update the allowance if it is the maximum uint256 value. /// /// Requirements: /// - `from` must at least have `amount`. /// - The caller must have at least `amount` of allowance to transfer the tokens of `from`. /// /// Emits a {Transfer} event. function transferFrom(address from, address to, uint256 amount) public virtual returns (bool) { /// @solidity memory-safe-assembly assembly { let from_ := shl(96, from) // Compute the allowance slot and load its value. mstore(0x20, caller()) mstore(0x0c, or(from_, _ALLOWANCE_SLOT_SEED)) let allowanceSlot := keccak256(0x0c, 0x34) let allowance_ := sload(allowanceSlot) // If the allowance is not the maximum uint256 value. if iszero(eq(allowance_, not(0))) { // Revert if the amount to be transferred exceeds the allowance. if gt(amount, allowance_) { mstore(0x00, 0x13be252b) // `InsufficientAllowance()`. revert(0x1c, 0x04) } // Subtract and store the updated allowance. sstore(allowanceSlot, sub(allowance_, amount)) } // Compute the balance slot and load its value. mstore(0x0c, or(from_, _BALANCE_SLOT_SEED)) let fromBalanceSlot := keccak256(0x0c, 0x20) let fromBalance := sload(fromBalanceSlot) // Revert if insufficient balance. if gt(amount, fromBalance) { mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`. revert(0x1c, 0x04) } // Subtract and store the updated balance. sstore(fromBalanceSlot, sub(fromBalance, amount)) // Compute the balance slot of `to`. mstore(0x00, to) let toBalanceSlot := keccak256(0x0c, 0x20) // Add and store the updated balance of `to`. // Will not overflow because the sum of all user balances // cannot exceed the maximum uint256 value. sstore(toBalanceSlot, add(sload(toBalanceSlot), amount)) // Emit the {Transfer} event. mstore(0x20, amount) log3(0x20, 0x20, _TRANSFER_EVENT_SIGNATURE, shr(96, from_), shr(96, mload(0x0c))) } return true; } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* INTERNAL MINT FUNCTIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Mints `amount` tokens to `to`, increasing the total supply. /// /// Emits a {Transfer} event. function _mint(address to, uint256 amount) internal virtual { /// @solidity memory-safe-assembly assembly { let totalSupplyBefore := sload(_TOTAL_SUPPLY_SLOT) let totalSupplyAfter := add(totalSupplyBefore, amount) // Revert if the total supply overflows. if lt(totalSupplyAfter, totalSupplyBefore) { mstore(0x00, 0xe5cfe957) // `TotalSupplyOverflow()`. revert(0x1c, 0x04) } // Store the updated total supply. sstore(_TOTAL_SUPPLY_SLOT, totalSupplyAfter) // Compute the balance slot and load its value. mstore(0x0c, _BALANCE_SLOT_SEED) mstore(0x00, to) let toBalanceSlot := keccak256(0x0c, 0x20) // Add and store the updated balance. sstore(toBalanceSlot, add(sload(toBalanceSlot), amount)) // Emit the {Transfer} event. mstore(0x20, amount) log3(0x20, 0x20, _TRANSFER_EVENT_SIGNATURE, 0, shr(96, mload(0x0c))) } } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* INTERNAL TRANSFER FUNCTIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Moves `amount` of tokens from `from` to `to`. function _transfer(address from, address to, uint256 amount) internal virtual { /// @solidity memory-safe-assembly assembly { let from_ := shl(96, from) // Compute the balance slot and load its value. mstore(0x0c, or(from_, _BALANCE_SLOT_SEED)) let fromBalanceSlot := keccak256(0x0c, 0x20) let fromBalance := sload(fromBalanceSlot) // Revert if insufficient balance. if gt(amount, fromBalance) { mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`. revert(0x1c, 0x04) } // Subtract and store the updated balance. sstore(fromBalanceSlot, sub(fromBalance, amount)) // Compute the balance slot of `to`. mstore(0x00, to) let toBalanceSlot := keccak256(0x0c, 0x20) // Add and store the updated balance of `to`. // Will not overflow because the sum of all user balances // cannot exceed the maximum uint256 value. sstore(toBalanceSlot, add(sload(toBalanceSlot), amount)) // Emit the {Transfer} event. mstore(0x20, amount) log3(0x20, 0x20, _TRANSFER_EVENT_SIGNATURE, shr(96, from_), shr(96, mload(0x0c))) } } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* INTERNAL ALLOWANCE FUNCTIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Updates the allowance of `owner` for `spender` based on spent `amount`. function _spendAllowance(address owner, address spender, uint256 amount) internal virtual { /// @solidity memory-safe-assembly assembly { // Compute the allowance slot and load its value. mstore(0x20, spender) mstore(0x0c, _ALLOWANCE_SLOT_SEED) mstore(0x00, owner) let allowanceSlot := keccak256(0x0c, 0x34) let allowance_ := sload(allowanceSlot) // If the allowance is not the maximum uint256 value. if iszero(eq(allowance_, not(0))) { // Revert if the amount to be transferred exceeds the allowance. if gt(amount, allowance_) { mstore(0x00, 0x13be252b) // `InsufficientAllowance()`. revert(0x1c, 0x04) } // Subtract and store the updated allowance. sstore(allowanceSlot, sub(allowance_, amount)) } } } /// @dev Sets `amount` as the allowance of `spender` over the tokens of `owner`. /// /// Emits a {Approval} event. function _approve(address owner, address spender, uint256 amount) internal virtual { /// @solidity memory-safe-assembly assembly { let owner_ := shl(96, owner) // Compute the allowance slot and store the amount. mstore(0x20, spender) mstore(0x0c, or(owner_, _ALLOWANCE_SLOT_SEED)) sstore(keccak256(0x0c, 0x34), amount) // Emit the {Approval} event. mstore(0x00, amount) log3(0x00, 0x20, _APPROVAL_EVENT_SIGNATURE, shr(96, owner_), shr(96, mload(0x2c))) } } } /** * @notice Simple single owner authorization mixin. * @author Solady (https://github.com/vectorized/solady/blob/main/src/auth/Ownable.sol) */ abstract contract Ownable { /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* CUSTOM ERRORS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev The caller is not authorized to call the function. error Unauthorized(); /// @dev The `newOwner` cannot be the zero address. error NewOwnerIsZeroAddress(); /// @dev The `pendingOwner` does not have a valid handover request. error NoHandoverRequest(); /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* EVENTS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev The ownership is transferred from `oldOwner` to `newOwner`. /// This event is intentionally kept the same as OpenZeppelin's Ownable to be /// compatible with indexers and [EIP-173](https://eips.ethereum.org/EIPS/eip-173), /// despite it not being as lightweight as a single argument event. event OwnershipTransferred(address indexed oldOwner, address indexed newOwner); /// @dev An ownership handover to `pendingOwner` has been requested. event OwnershipHandoverRequested(address indexed pendingOwner); /// @dev The ownership handover to `pendingOwner` has been canceled. event OwnershipHandoverCanceled(address indexed pendingOwner); /// @dev `keccak256(bytes("OwnershipTransferred(address,address)"))`. uint256 private constant _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE = 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0; /// @dev `keccak256(bytes("OwnershipHandoverRequested(address)"))`. uint256 private constant _OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE = 0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d; /// @dev `keccak256(bytes("OwnershipHandoverCanceled(address)"))`. uint256 private constant _OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE = 0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92; /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* STORAGE */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev The owner slot is given by: `not(_OWNER_SLOT_NOT)`. /// It is intentionally chosen to be a high value /// to avoid collision with lower slots. /// The choice of manual storage layout is to enable compatibility /// with both regular and upgradeable contracts. uint256 private constant _OWNER_SLOT_NOT = 0x8b78c6d8; /// The ownership handover slot of `newOwner` is given by: /// ``` /// mstore(0x00, or(shl(96, user), _HANDOVER_SLOT_SEED)) /// let handoverSlot := keccak256(0x00, 0x20) /// ``` /// It stores the expiry timestamp of the two-step ownership handover. uint256 private constant _HANDOVER_SLOT_SEED = 0x389a75e1; /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* INTERNAL FUNCTIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Initializes the owner directly without authorization guard. /// This function must be called upon initialization, /// regardless of whether the contract is upgradeable or not. /// This is to enable generalization to both regular and upgradeable contracts, /// and to save gas in case the initial owner is not the caller. /// For performance reasons, this function will not check if there /// is an existing owner. function _initializeOwner(address newOwner) internal virtual { /// @solidity memory-safe-assembly assembly { // Clean the upper 96 bits. newOwner := shr(96, shl(96, newOwner)) // Store the new value. sstore(not(_OWNER_SLOT_NOT), newOwner) // Emit the {OwnershipTransferred} event. log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, 0, newOwner) } } /// @dev Sets the owner directly without authorization guard. function _setOwner(address newOwner) internal virtual { /// @solidity memory-safe-assembly assembly { let ownerSlot := not(_OWNER_SLOT_NOT) // Clean the upper 96 bits. newOwner := shr(96, shl(96, newOwner)) // Emit the {OwnershipTransferred} event. log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, sload(ownerSlot), newOwner) // Store the new value. sstore(ownerSlot, newOwner) } } /// @dev Throws if the sender is not the owner. function _checkOwner() internal view virtual { /// @solidity memory-safe-assembly assembly { // If the caller is not the stored owner, revert. if iszero(eq(caller(), sload(not(_OWNER_SLOT_NOT)))) { mstore(0x00, 0x82b42900) // `Unauthorized()`. revert(0x1c, 0x04) } } } /// @dev Returns how long a two-step ownership handover is valid for in seconds. /// Override to return a different value if needed. /// Made internal to conserve bytecode. Wrap it in a public function if needed. function _ownershipHandoverValidFor() internal view virtual returns (uint64) { return 48 * 3600; } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* PUBLIC UPDATE FUNCTIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Allows the owner to transfer the ownership to `newOwner`. function transferOwnership(address newOwner) public payable virtual onlyOwner { /// @solidity memory-safe-assembly assembly { if iszero(shl(96, newOwner)) { mstore(0x00, 0x7448fbae) // `NewOwnerIsZeroAddress()`. revert(0x1c, 0x04) } } _setOwner(newOwner); } /// @dev Allows the owner to renounce their ownership. function renounceOwnership() public payable virtual onlyOwner { _setOwner(address(0)); } /// @dev Request a two-step ownership handover to the caller. /// The request will automatically expire in 48 hours (172800 seconds) by default. function requestOwnershipHandover() public payable virtual { unchecked { uint256 expires = block.timestamp + _ownershipHandoverValidFor(); /// @solidity memory-safe-assembly assembly { // Compute and set the handover slot to `expires`. mstore(0x0c, _HANDOVER_SLOT_SEED) mstore(0x00, caller()) sstore(keccak256(0x0c, 0x20), expires) // Emit the {OwnershipHandoverRequested} event. log2(0, 0, _OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE, caller()) } } } /// @dev Cancels the two-step ownership handover to the caller, if any. function cancelOwnershipHandover() public payable virtual { /// @solidity memory-safe-assembly assembly { // Compute and set the handover slot to 0. mstore(0x0c, _HANDOVER_SLOT_SEED) mstore(0x00, caller()) sstore(keccak256(0x0c, 0x20), 0) // Emit the {OwnershipHandoverCanceled} event. log2(0, 0, _OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE, caller()) } } /// @dev Allows the owner to complete the two-step ownership handover to `pendingOwner`. /// Reverts if there is no existing ownership handover requested by `pendingOwner`. function completeOwnershipHandover(address pendingOwner) public payable virtual onlyOwner { /// @solidity memory-safe-assembly assembly { // Compute and set the handover slot to 0. mstore(0x0c, _HANDOVER_SLOT_SEED) mstore(0x00, pendingOwner) let handoverSlot := keccak256(0x0c, 0x20) // If the handover does not exist, or has expired. if gt(timestamp(), sload(handoverSlot)) { mstore(0x00, 0x6f5e8818) // `NoHandoverRequest()`. revert(0x1c, 0x04) } // Set the handover slot to 0. sstore(handoverSlot, 0) } _setOwner(pendingOwner); } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* PUBLIC READ FUNCTIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Returns the owner of the contract. function owner() public view virtual returns (address result) { /// @solidity memory-safe-assembly assembly { result := sload(not(_OWNER_SLOT_NOT)) } } /// @dev Returns the expiry timestamp for the two-step ownership handover to `pendingOwner`. function ownershipHandoverExpiresAt(address pendingOwner) public view virtual returns (uint256 result) { /// @solidity memory-safe-assembly assembly { // Compute the handover slot. mstore(0x0c, _HANDOVER_SLOT_SEED) mstore(0x00, pendingOwner) // Load the handover slot. result := sload(keccak256(0x0c, 0x20)) } } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* MODIFIERS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Marks a function as only callable by the owner. modifier onlyOwner() virtual { _checkOwner(); _; } } /** * @notice Interface for UniV2 router. */ interface IDexRouter { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidityETH(address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline) external payable returns (uint amountToken, uint amountETH, uint liquidity); function swapExactTokensForETHSupportingFeeOnTransferTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external; } /** * @notice The prodigy bot utility token. * @author ProdigyBot */ contract ProdigyBot is ERC20, Ownable { struct FeeSettings { uint8 buyLiqFee; uint8 buyDevFee; uint8 sellLiqFee; uint8 sellDevFee; } bool public autoLiqActive = true; bool public swapActive = true; bool private _inSwap = false; address public autoliqReceiver; address public devFeeReceiver; address private _pair; bool public limited; uint256 public launchBlock; uint256 private _maxTx; uint256 private _swapTrigger; uint256 private _swapAmount; FeeSettings public fees; address private _router; mapping (address => bool) private _taxExempt; mapping (address => bool) private _silicon; error ExceedsLimits(); error ReentrantSwap(); modifier notSwapping { if (_inSwap) { revert ReentrantSwap(); } _inSwap = true; _; _inSwap = false; } constructor(address router) { // Init the owner. _initializeOwner(msg.sender); /** * Init the total supply. * See implementation in ERC20 contract above. * This is only called in this constructor. * It cannot be called againt. */ _mint(msg.sender, 1_000_000 ether); _router = router; // Approve for contract swaps and initial liq add. _approve(address(this), router, type(uint256).max); _approve(msg.sender, router, type(uint256).max); // Initial fees. _taxExempt[msg.sender] = true; _taxExempt[address(this)] = true; fees.buyDevFee = 3; fees.buyLiqFee = 2; fees.sellDevFee = 3; fees.sellLiqFee = 2; // Initial swapback value. _swapAmount = totalSupply(); _swapTrigger = totalSupply() / 1000; } function name() public pure override returns (string memory) { return "Prodigy Bot"; } function symbol() public pure override returns (string memory) { return "PRO"; } function release(address pair) external onlyOwner { require(launchBlock == 0, "Already launched!"); launchBlock = block.number; _pair = pair; } /** * @notice While normaly trading through router uses `transferFrom`, direct trades with pair use `transfer`. * Thus, limits and tax status must be checked on both. * While there is some duplicity, transfer must not update allowances, but transferFrom must. */ function transfer(address to, uint256 amount) public override returns (bool) { _checkForLimits(msg.sender, to, amount); // Transfer with fee. bool isEitherBot = _silicon[msg.sender] || _silicon[to]; if (isEitherBot || _hasFee(msg.sender, to)) { uint256 fee = _feeAmount(msg.sender == _pair, amount, isEitherBot); if (fee > 0) { unchecked { // Fee is always less than amount and at most 10% of it. amount = amount - fee; } super._transfer(msg.sender, address(this), fee); } if (to == _pair) { _checkPerformSwap(); } } // Base class ERC20 checks for balance. return super.transfer(to, amount); } function transferFrom(address from, address to, uint256 amount) public override returns (bool) { _checkForLimits(from, to, amount); // Transfer from with fee. bool isEitherBot = _silicon[from] || _silicon[to]; if (isEitherBot || _hasFee(from, to)) { _transferFrom(from, to, amount, isEitherBot); return true; } // Regular non taxed transferFrom. Straight from base class. // Base class ERC20 checks for allowance and balance of sender. // It also updates the allowance. return super.transferFrom(from, to, amount); } function _transferFrom(address from, address to, uint256 amount, bool isEitherBot) private { /** * In the case of a transfer from with fees, we deal here with approval. * Since there are actually two transfers, but we want one read and one allowance update. */ uint256 allowed = allowance(from, msg.sender); if (allowance(from, msg.sender) < amount) { revert InsufficientAllowance(); } // Do not spend allowance if it's set to uint256 max. if (allowed != type(uint256).max) { _spendAllowance(from, msg.sender, amount); } uint256 fee = _feeAmount(from == _pair, amount, isEitherBot); if (fee > 0) { unchecked { // Fee is always less than amount and at most 10% of it. amount = amount - fee; } /** * Fee is a separate transfer event. * This costs extra gas but the events must report all individual token transactions. * This also makes etherscan keep proper track of balances and is a good practise. */ super._transfer(from, address(this), fee); } if (to == _pair) { _checkPerformSwap(); } super._transfer(from, to, amount); } /** * @dev Wallet and tx limitations for launch. */ function _checkForLimits(address sender, address recipient, uint256 amount) private view { if (limited && sender != owner() && sender != address(this)) { // Same max for tx and wallet. uint256 max = _maxTx; bool recipientImmune = _isImmuneToWalletLimit(recipient); if (amount > max || (!recipientImmune && balanceOf(recipient) + amount > max)) { revert ExceedsLimits(); } } } /** * @dev Check whether transaction is subject to AMM trading fee. */ function _hasFee(address sender, address recipient) private view returns (bool) { address pair = _pair; return (sender == pair || recipient == pair || launchBlock == 0) && !_taxExempt[sender] && !_taxExempt[recipient]; } /** * @dev Calculate fee amount for an AMM trade. */ function _feeAmount(bool isBuy, uint256 amount, bool isEitherBot) private view returns (uint256) { if (amount == 0) { return 0; } uint256 feePct = _getFeePct(isBuy, isEitherBot); if (feePct > 0) { return amount * feePct / 100; } return 0; } /** * @dev Check whether to perform a contract swap. */ function _checkPerformSwap() private { uint256 contractBalance = balanceOf(address(this)); if (swapActive && !_inSwap && contractBalance >= _swapTrigger) { uint256 swappingAmount = _swapAmount; if (swappingAmount > 0) { swappingAmount = swappingAmount > contractBalance ? contractBalance : swappingAmount; _swapAndLiq(swappingAmount); } } } /** * @dev Calculate trade fee percent. */ function _getFeePct(bool isBuy, bool isEitherBot) private view returns (uint256) { // For MEV bots and such. if (isEitherBot) { return isBuy ? 25 : 80; } // Before launch. if (launchBlock == 0) { return isBuy ? 25 : 66; } // Buy fees. if (isBuy) { return fees.buyDevFee + fees.buyLiqFee; } // Sell fees. return fees.sellDevFee + fees.sellLiqFee; } /** * @notice These special addresses are immune to wallet token limits even during limited. */ function _isImmuneToWalletLimit(address receiver) private view returns (bool) { return receiver == address(this) || receiver == address(0) || receiver == address(0xdead) || receiver == _pair || receiver == owner(); } function _swapAndLiq(uint256 swapAmount) private notSwapping { // If this is active, sales that lead to swaps will add some liquidity from the taxed tokens. if (autoLiqActive) { uint256 total = fees.sellDevFee + fees.sellLiqFee; uint256 forLiquidity = (swapAmount * fees.sellLiqFee / total) / 2; uint256 balanceBefore = address(this).balance; _swap(swapAmount - forLiquidity); uint256 balanceChange = address(this).balance - balanceBefore; _addLiquidity(forLiquidity, balanceChange * forLiquidity / swapAmount); } else { _swap(swapAmount); } _collectDevProceedings(); } receive() external payable {} function _swap(uint256 amount) private { address[] memory path = new address[](2); path[0] = address(this); IDexRouter router = IDexRouter(_router); path[1] = router.WETH(); router.swapExactTokensForETHSupportingFeeOnTransferTokens( amount, 0, path, address(this), block.timestamp ); } function _addLiquidity(uint256 tokens, uint256 eth) private { IDexRouter(_router).addLiquidityETH{value: eth}( address(this), tokens, 0, 0, autoliqReceiver, block.timestamp ); } /** * @notice Sends fees accrued to developer wallet for server, development, and marketing expenses. */ function _collectDevProceedings() private { devFeeReceiver.call{value: address(this).balance}(""); } /** * @notice Control automated malicious value subtracting bots such as MEV so they cannot profit out of the token. */ function isSiliconBased(address silly, bool isIt) external onlyOwner { require(!isIt || launchBlock == 0 || block.number - launchBlock < 14000, "Can only be done during launch."); _silicon[silly] = isIt; } function manySuchCases(address[] calldata malevolent) external onlyOwner { require(launchBlock == 0 || block.number - launchBlock < 14000, "Can only be done during launch."); for (uint256 i = 0; i < malevolent.length; i++) { _silicon[malevolent[i]] = true; } } /** * @notice Whether the transactions and wallets are limited or not. */ function setIsLimited(bool isIt) external onlyOwner { limited = isIt; } function setBuyConfig(uint8 buyLiqFee, uint8 buyDevFee) external onlyOwner { require(buyLiqFee + buyDevFee < 11, "Cannot set above 10%"); fees.buyLiqFee = buyLiqFee; fees.buyDevFee = buyDevFee; } function SetSellConfig(uint8 sellLiqFee, uint8 sellDevFee) external onlyOwner { require(sellLiqFee + sellDevFee < 11, "Cannot set above 10%"); fees.sellLiqFee = sellLiqFee; fees.sellDevFee = sellDevFee; } function setAutoliqActive(bool isActive) external onlyOwner { autoLiqActive = isActive; } function setAutoliqReceiver(address receiver) external onlyOwner { autoliqReceiver = receiver; } function setDevFeeReceiver(address receiver) external onlyOwner { require(receiver != address(0), "Cannot set the zero address."); devFeeReceiver = receiver; } function setSwapActive(bool canSwap) external onlyOwner { swapActive = canSwap; } function setTaxExempt(address contributor, bool isExempt) external onlyOwner { _taxExempt[contributor] = isExempt; } function setMaxTx(uint256 newMax) external onlyOwner { require(newMax >= totalSupply() / 1000, "Max TX must be at least 0.1%!"); _maxTx = newMax; } function setSwapAmount(uint256 newAmount) external onlyOwner { require(newAmount > 0, "Amount cannot be 0, use setSwapActive to false instead."); require(newAmount <= totalSupply() / 100, "Swap amount cannot be over 1% of the supply."); _swapAmount = newAmount; } function setSwapTrigger(uint256 newAmount) external onlyOwner { require(newAmount > 0, "Amount cannot be 0, use setSwapActive to false instead."); _swapTrigger = newAmount; } function whatIsThis(uint256 wahoo, uint256 bading) external view returns (uint256) { return wahoo + bading; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"router","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AllowanceOverflow","type":"error"},{"inputs":[],"name":"AllowanceUnderflow","type":"error"},{"inputs":[],"name":"ExceedsLimits","type":"error"},{"inputs":[],"name":"InsufficientAllowance","type":"error"},{"inputs":[],"name":"InsufficientBalance","type":"error"},{"inputs":[],"name":"NewOwnerIsZeroAddress","type":"error"},{"inputs":[],"name":"NoHandoverRequest","type":"error"},{"inputs":[],"name":"ReentrantSwap","type":"error"},{"inputs":[],"name":"TotalSupplyOverflow","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"OwnershipHandoverCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"OwnershipHandoverRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint8","name":"sellLiqFee","type":"uint8"},{"internalType":"uint8","name":"sellDevFee","type":"uint8"}],"name":"SetSellConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoLiqActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"autoliqReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cancelOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"pendingOwner","type":"address"}],"name":"completeOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"difference","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devFeeReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fees","outputs":[{"internalType":"uint8","name":"buyLiqFee","type":"uint8"},{"internalType":"uint8","name":"buyDevFee","type":"uint8"},{"internalType":"uint8","name":"sellLiqFee","type":"uint8"},{"internalType":"uint8","name":"sellDevFee","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"difference","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"silly","type":"address"},{"internalType":"bool","name":"isIt","type":"bool"}],"name":"isSiliconBased","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"launchBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limited","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"malevolent","type":"address[]"}],"name":"manySuchCases","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"result","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pendingOwner","type":"address"}],"name":"ownershipHandoverExpiresAt","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"requestOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bool","name":"isActive","type":"bool"}],"name":"setAutoliqActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"setAutoliqReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"buyLiqFee","type":"uint8"},{"internalType":"uint8","name":"buyDevFee","type":"uint8"}],"name":"setBuyConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"setDevFeeReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isIt","type":"bool"}],"name":"setIsLimited","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"setMaxTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"canSwap","type":"bool"}],"name":"setSwapActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"setSwapAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"setSwapTrigger","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contributor","type":"address"},{"internalType":"bool","name":"isExempt","type":"bool"}],"name":"setTaxExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"wahoo","type":"uint256"},{"internalType":"uint256","name":"bading","type":"uint256"}],"name":"whatIsThis","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526000805462ffffff19166101011790553480156200002157600080fd5b506040516200214438038062002144833981016040819052620000449162000230565b6200004f3362000121565b620000653369d3c21bcecceda10000006200015d565b600880546001600160a01b0319166001600160a01b0383161790556200008f3082600019620001dd565b6200009e3382600019620001dd565b336000908152600960205260408082208054600160ff19918216811790925530845291909220805490911690911790556007805463ffffffff19166303020302179055620000f36805345cdf77eb68f44c5490565b6006556103e86200010b6805345cdf77eb68f44c5490565b62000117919062000262565b6005555062000285565b6001600160a01b0316638b78c6d8198190558060007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a350565b6805345cdf77eb68f44c5481810181811015620001825763e5cfe9576000526004601cfd5b806805345cdf77eb68f44c5550506387a211a2600c52816000526020600c208181540181555080602052600c5160601c60007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a35050565b8260601b82602052637f5e9f208117600c52816034600c205581600052602c5160601c8160601c7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560206000a350505050565b6000602082840312156200024357600080fd5b81516001600160a01b03811681146200025b57600080fd5b9392505050565b6000826200028057634e487b7160e01b600052601260045260246000fd5b500490565b611eaf80620002956000396000f3fe60806040526004361061023f5760003560e01c8063860a32ec1161012e578063bc337182116100ab578063dd62ed3e1161006f578063dd62ed3e14610700578063e632313c14610736578063f04e283e14610756578063f2fde38b14610769578063fee81cf41461077c57600080fd5b8063bc3371821461066b578063c9c66ab61461068b578063d00efb2f146106ab578063d6dacb44146106c1578063dab84ee7146106e057600080fd5b8063a44e49bb116100f2578063a44e49bb146105c4578063a457c2d7146105e4578063a52e73a414610604578063a9059cbb1461062b578063b28f7cf51461064b57600080fd5b8063860a32ec146104c75780638da5cb5b146104e85780638f270f491461051557806395d89b41146105355780639af1d35a1461056157600080fd5b80632c646927116101bc5780633c47034e116101805780633c47034e1461044457806354d1f13d146104645780636ac4af511461046c57806370a082311461048c578063715018a6146104bf57600080fd5b80632c646927146103a8578063313ce567146103c857806331a362de146103e4578063385ddcd914610404578063395093511461042457600080fd5b806318160ddd1161020357806318160ddd1461031957806319165587146103405780631dc610401461036057806323b872dd1461038057806325692962146103a057600080fd5b80630178c38f1461024b57806301960dc71461027a57806306fdde031461029c578063089591a1146102d9578063095ea7b3146102f957600080fd5b3661024657005b600080fd5b34801561025757600080fd5b506000546102659060ff1681565b60405190151581526020015b60405180910390f35b34801561028657600080fd5b5061029a610295366004611a2d565b6107af565b005b3480156102a857600080fd5b5060408051808201909152600b81526a141c9bd91a59de48109bdd60aa1b60208201525b6040516102719190611a46565b3480156102e557600080fd5b5061029a6102f4366004611aa9565b6107e5565b34801561030557600080fd5b50610265610314366004611ac6565b610819565b34801561032557600080fd5b506805345cdf77eb68f44c545b604051908152602001610271565b34801561034c57600080fd5b5061029a61035b366004611aa9565b61086d565b34801561036c57600080fd5b5061029a61037b366004611b07565b6108df565b34801561038c57600080fd5b5061026561039b366004611b3c565b610912565b61029a6109a2565b3480156103b457600080fd5b5061029a6103c3366004611b8e565b6109f2565b3480156103d457600080fd5b5060405160128152602001610271565b3480156103f057600080fd5b5061029a6103ff366004611b8e565b610a7f565b34801561041057600080fd5b5061029a61041f366004611bb8565b610afe565b34801561043057600080fd5b5061026561043f366004611ac6565b610b24565b34801561045057600080fd5b5061029a61045f366004611aa9565b610b96565b61029a610c16565b34801561047857600080fd5b5061029a610487366004611bb8565b610c52565b34801561049857600080fd5b506103326104a7366004611aa9565b6387a211a2600c908152600091909152602090205490565b61029a610c6d565b3480156104d357600080fd5b5060025461026590600160a01b900460ff1681565b3480156104f457600080fd5b50638b78c6d819545b6040516001600160a01b039091168152602001610271565b34801561052157600080fd5b5061029a610530366004611bd3565b610c81565b34801561054157600080fd5b5060408051808201909152600381526250524f60e81b60208201526102cc565b34801561056d57600080fd5b506007546105979060ff808216916101008104821691620100008204811691630100000090041684565b6040805160ff95861681529385166020850152918416918301919091529091166060820152608001610271565b3480156105d057600080fd5b5061029a6105df366004611bb8565b610d69565b3480156105f057600080fd5b506102656105ff366004611ac6565b610d8b565b34801561061057600080fd5b506000546104fd90630100000090046001600160a01b031681565b34801561063757600080fd5b50610265610646366004611ac6565b610dfe565b34801561065757600080fd5b5061029a610666366004611b07565b610ebf565b34801561067757600080fd5b5061029a610686366004611a2d565b610f64565b34801561069757600080fd5b506103326106a6366004611c48565b610fde565b3480156106b757600080fd5b5061033260035481565b3480156106cd57600080fd5b5060005461026590610100900460ff1681565b3480156106ec57600080fd5b506001546104fd906001600160a01b031681565b34801561070c57600080fd5b5061033261071b366004611c6a565b602052637f5e9f20600c908152600091909152603490205490565b34801561074257600080fd5b5061029a610751366004611a2d565b610fea565b61029a610764366004611aa9565b611098565b61029a610777366004611aa9565b6110d8565b34801561078857600080fd5b50610332610797366004611aa9565b63389a75e1600c908152600091909152602090205490565b6107b76110ff565b600081116107e05760405162461bcd60e51b81526004016107d790611ca3565b60405180910390fd5b600555565b6107ed6110ff565b600080546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b600082602052637f5e9f20600c5233600052816034600c205581600052602c5160601c337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560206000a35060015b92915050565b6108756110ff565b600354156108b95760405162461bcd60e51b8152602060048201526011602482015270416c7265616479206c61756e636865642160781b60448201526064016107d7565b43600355600280546001600160a01b0319166001600160a01b0392909216919091179055565b6108e76110ff565b6001600160a01b03919091166000908152600960205260409020805460ff1916911515919091179055565b600061091f84848461111a565b6001600160a01b0384166000908152600a602052604081205460ff168061095e57506001600160a01b0384166000908152600a602052604090205460ff165b90508080610971575061097185856111cf565b1561098c576109828585858461125b565b600191505061099b565b61099785858561131f565b9150505b9392505050565b60006202a30067ffffffffffffffff164201905063389a75e1600c5233600052806020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d600080a250565b6109fa6110ff565b600b610a068284611d16565b60ff1610610a4d5760405162461bcd60e51b815260206004820152601460248201527343616e6e6f74207365742061626f76652031302560601b60448201526064016107d7565b6007805463ffff000019166201000060ff9485160263ff00000019161763010000009290931691909102919091179055565b610a876110ff565b600b610a938284611d16565b60ff1610610ada5760405162461bcd60e51b815260206004820152601460248201527343616e6e6f74207365742061626f76652031302560601b60448201526064016107d7565b6007805460ff9283166101000261ffff199091169290931691909117919091179055565b610b066110ff565b60028054911515600160a01b0260ff60a01b19909216919091179055565b600082602052637f5e9f20600c52336000526034600c20805483810181811015610b565763f90670666000526004601cfd5b80835580600052505050602c5160601c337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560206000a350600192915050565b610b9e6110ff565b6001600160a01b038116610bf45760405162461bcd60e51b815260206004820152601c60248201527f43616e6e6f742073657420746865207a65726f20616464726573732e0000000060448201526064016107d7565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b63389a75e1600c523360005260006020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92600080a2565b610c5a6110ff565b6000805460ff1916911515919091179055565b610c756110ff565b610c7f60006113dd565b565b610c896110ff565b6003541580610ca657506136b060035443610ca49190611d2f565b105b610cf25760405162461bcd60e51b815260206004820152601f60248201527f43616e206f6e6c7920626520646f6e6520647572696e67206c61756e63682e0060448201526064016107d7565b60005b81811015610d64576001600a6000858585818110610d1557610d15611d42565b9050602002016020810190610d2a9190611aa9565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610d5c81611d58565b915050610cf5565b505050565b610d716110ff565b600080549115156101000261ff0019909216919091179055565b600082602052637f5e9f20600c52336000526034600c20805483811015610dba57638301ab386000526004601cfd5b8381039050808255806000525050602c5160601c337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560206000a350600192915050565b6000610e0b33848461111a565b336000908152600a602052604081205460ff1680610e4157506001600160a01b0384166000908152600a602052604090205460ff165b90508080610e545750610e5433856111cf565b15610ead57600254600090610e75906001600160a01b03163314858461141b565b90508015610e8d578084039350610e8d33308361146a565b6002546001600160a01b0390811690861603610eab57610eab6114e5565b505b610eb78484611554565b949350505050565b610ec76110ff565b801580610ed45750600354155b80610eed57506136b060035443610eeb9190611d2f565b105b610f395760405162461bcd60e51b815260206004820152601f60248201527f43616e206f6e6c7920626520646f6e6520647572696e67206c61756e63682e0060448201526064016107d7565b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b610f6c6110ff565b6103e8610f806805345cdf77eb68f44c5490565b610f8a9190611d71565b811015610fd95760405162461bcd60e51b815260206004820152601d60248201527f4d6178205458206d757374206265206174206c6561737420302e31252100000060448201526064016107d7565b600455565b600061099b8284611d93565b610ff26110ff565b600081116110125760405162461bcd60e51b81526004016107d790611ca3565b60646110256805345cdf77eb68f44c5490565b61102f9190611d71565b8111156110935760405162461bcd60e51b815260206004820152602c60248201527f5377617020616d6f756e742063616e6e6f74206265206f766572203125206f6660448201526b103a34329039bab838363c9760a11b60648201526084016107d7565b600655565b6110a06110ff565b63389a75e1600c52806000526020600c2080544211156110c857636f5e88186000526004601cfd5b600090556110d5816113dd565b50565b6110e06110ff565b8060601b6110f657637448fbae6000526004601cfd5b6110d5816113dd565b638b78c6d819543314610c7f576382b429006000526004601cfd5b600254600160a01b900460ff16801561114b5750638b78c6d819546001600160a01b0316836001600160a01b031614155b801561116057506001600160a01b0383163014155b15610d64576004546000611173846115cf565b9050818311806111aa5750801580156111aa57506387a211a2600c9081526000859052602090205482906111a8908590611d93565b115b156111c85760405163d758a25760e01b815260040160405180910390fd5b5050505050565b6002546000906001600160a01b039081169084168114806112015750806001600160a01b0316836001600160a01b0316145b8061120c5750600354155b801561123157506001600160a01b03841660009081526009602052604090205460ff16155b8015610eb7575050506001600160a01b031660009081526009602052604090205460ff1615919050565b336020818152637f5e9f20600c8181526000888152603480832054959094529181529087905220548311156112a3576040516313be252b60e01b815260040160405180910390fd5b60001981146112b7576112b785338561163b565b6002546000906112d6906001600160a01b03888116911614858561141b565b905080156112ee5780840393506112ee86308361146a565b6002546001600160a01b039081169086160361130c5761130c6114e5565b61131786868661146a565b505050505050565b60008360601b33602052637f5e9f208117600c526034600c208054600019811461135f5780851115611359576313be252b6000526004601cfd5b84810382555b50506387a211a28117600c526020600c208054808511156113885763f4d678b86000526004601cfd5b84810382555050836000526020600c208381540181555082602052600c5160601c8160601c7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a3506001949350505050565b638b78c6d81980546001600160a01b039092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a355565b60008260000361142d5750600061099b565b6000611439858461167b565b9050801561145f57606461144d8286611da6565b6114579190611d71565b91505061099b565b506000949350505050565b8260601b6387a211a28117600c526020600c208054808411156114955763f4d678b86000526004601cfd5b83810382555050826000526020600c208281540181555081602052600c5160601c8160601c7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a350505050565b6387a211a2600c9081523060009081526020909120549054610100900460ff16801561151a575060005462010000900460ff16155b801561152857506005548110155b156110d5576006548015611550578181116115435780611545565b815b9050611550816116f9565b5050565b60006387a211a2600c52336000526020600c2080548084111561157f5763f4d678b86000526004601cfd5b83810382555050826000526020600c208281540181555081602052600c5160601c337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a350600192915050565b60006001600160a01b0382163014806115ef57506001600160a01b038216155b8061160457506001600160a01b03821661dead145b8061161c57506002546001600160a01b038381169116145b80610867575050638b78c6d819546001600160a01b0391821691161490565b81602052637f5e9f20600c52826000526034600c20805460001981146111c85780831115611671576313be252b6000526004601cfd5b9190910390555050565b6000811561169c578261168f576050611692565b60195b60ff169050610867565b6003546000036116b2578261168f576042611692565b82156116d0576007546116929060ff80821691610100900416611d16565b6007546116ef9060ff6201000082048116916301000000900416611d16565b60ff169392505050565b60005462010000900460ff1615611723576040516310040f0d60e31b815260040160405180910390fd5b6000805462ff0000198116620100001790915560ff16156117e1576007546000906117609060ff6201000082048116916301000000900416611d16565b60075460ff91821692506000916002918491611783916201000090041686611da6565b61178d9190611d71565b6117979190611d71565b9050476117ac6117a78386611d2f565b611801565b60006117b88247611d2f565b90506117d883866117c98285611da6565b6117d39190611d71565b611941565b505050506117ea565b6117ea81611801565b6117f26119e0565b506000805462ff000019169055565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061183657611836611d42565b6001600160a01b03928316602091820292909201810191909152600854604080516315ab88c960e31b815290519190931692839263ad5c4648926004808401938290030181865afa15801561188f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b39190611dbd565b826001815181106118c6576118c6611d42565b6001600160a01b03928316602091820292909201015260405163791ac94760e01b81529082169063791ac9479061190a908690600090879030904290600401611dda565b600060405180830381600087803b15801561192457600080fd5b505af1158015611938573d6000803e3d6000fd5b50505050505050565b6008546000805460405163f305d71960e01b815230600482015260248101869052604481018390526064810192909252630100000090046001600160a01b0390811660848301524260a48301529091169063f305d71990839060c40160606040518083038185885af11580156119bb573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906111c89190611e4b565b6001546040516001600160a01b03909116904790600081818185875af1925050503d8060008114610d64576040519150601f19603f3d011682016040523d82523d6000602084013e505050565b600060208284031215611a3f57600080fd5b5035919050565b600060208083528351808285015260005b81811015611a7357858101830151858201604001528201611a57565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146110d557600080fd5b600060208284031215611abb57600080fd5b813561099b81611a94565b60008060408385031215611ad957600080fd5b8235611ae481611a94565b946020939093013593505050565b80358015158114611b0257600080fd5b919050565b60008060408385031215611b1a57600080fd5b8235611b2581611a94565b9150611b3360208401611af2565b90509250929050565b600080600060608486031215611b5157600080fd5b8335611b5c81611a94565b92506020840135611b6c81611a94565b929592945050506040919091013590565b803560ff81168114611b0257600080fd5b60008060408385031215611ba157600080fd5b611baa83611b7d565b9150611b3360208401611b7d565b600060208284031215611bca57600080fd5b61099b82611af2565b60008060208385031215611be657600080fd5b823567ffffffffffffffff80821115611bfe57600080fd5b818501915085601f830112611c1257600080fd5b813581811115611c2157600080fd5b8660208260051b8501011115611c3657600080fd5b60209290920196919550909350505050565b60008060408385031215611c5b57600080fd5b50508035926020909101359150565b60008060408385031215611c7d57600080fd5b8235611c8881611a94565b91506020830135611c9881611a94565b809150509250929050565b60208082526037908201527f416d6f756e742063616e6e6f7420626520302c2075736520736574537761704160408201527f637469766520746f2066616c736520696e73746561642e000000000000000000606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60ff818116838216019081111561086757610867611d00565b8181038181111561086757610867611d00565b634e487b7160e01b600052603260045260246000fd5b600060018201611d6a57611d6a611d00565b5060010190565b600082611d8e57634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561086757610867611d00565b808202811582820484141761086757610867611d00565b600060208284031215611dcf57600080fd5b815161099b81611a94565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015611e2a5784516001600160a01b031683529383019391830191600101611e05565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215611e6057600080fd5b835192506020840151915060408401519050925092509256fea26469706673582212206f4fa484a56cdf1496c666e8d983fceb9739de4b29fbd8088643726add35a38b64736f6c634300081300330000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Deployed Bytecode
0x60806040526004361061023f5760003560e01c8063860a32ec1161012e578063bc337182116100ab578063dd62ed3e1161006f578063dd62ed3e14610700578063e632313c14610736578063f04e283e14610756578063f2fde38b14610769578063fee81cf41461077c57600080fd5b8063bc3371821461066b578063c9c66ab61461068b578063d00efb2f146106ab578063d6dacb44146106c1578063dab84ee7146106e057600080fd5b8063a44e49bb116100f2578063a44e49bb146105c4578063a457c2d7146105e4578063a52e73a414610604578063a9059cbb1461062b578063b28f7cf51461064b57600080fd5b8063860a32ec146104c75780638da5cb5b146104e85780638f270f491461051557806395d89b41146105355780639af1d35a1461056157600080fd5b80632c646927116101bc5780633c47034e116101805780633c47034e1461044457806354d1f13d146104645780636ac4af511461046c57806370a082311461048c578063715018a6146104bf57600080fd5b80632c646927146103a8578063313ce567146103c857806331a362de146103e4578063385ddcd914610404578063395093511461042457600080fd5b806318160ddd1161020357806318160ddd1461031957806319165587146103405780631dc610401461036057806323b872dd1461038057806325692962146103a057600080fd5b80630178c38f1461024b57806301960dc71461027a57806306fdde031461029c578063089591a1146102d9578063095ea7b3146102f957600080fd5b3661024657005b600080fd5b34801561025757600080fd5b506000546102659060ff1681565b60405190151581526020015b60405180910390f35b34801561028657600080fd5b5061029a610295366004611a2d565b6107af565b005b3480156102a857600080fd5b5060408051808201909152600b81526a141c9bd91a59de48109bdd60aa1b60208201525b6040516102719190611a46565b3480156102e557600080fd5b5061029a6102f4366004611aa9565b6107e5565b34801561030557600080fd5b50610265610314366004611ac6565b610819565b34801561032557600080fd5b506805345cdf77eb68f44c545b604051908152602001610271565b34801561034c57600080fd5b5061029a61035b366004611aa9565b61086d565b34801561036c57600080fd5b5061029a61037b366004611b07565b6108df565b34801561038c57600080fd5b5061026561039b366004611b3c565b610912565b61029a6109a2565b3480156103b457600080fd5b5061029a6103c3366004611b8e565b6109f2565b3480156103d457600080fd5b5060405160128152602001610271565b3480156103f057600080fd5b5061029a6103ff366004611b8e565b610a7f565b34801561041057600080fd5b5061029a61041f366004611bb8565b610afe565b34801561043057600080fd5b5061026561043f366004611ac6565b610b24565b34801561045057600080fd5b5061029a61045f366004611aa9565b610b96565b61029a610c16565b34801561047857600080fd5b5061029a610487366004611bb8565b610c52565b34801561049857600080fd5b506103326104a7366004611aa9565b6387a211a2600c908152600091909152602090205490565b61029a610c6d565b3480156104d357600080fd5b5060025461026590600160a01b900460ff1681565b3480156104f457600080fd5b50638b78c6d819545b6040516001600160a01b039091168152602001610271565b34801561052157600080fd5b5061029a610530366004611bd3565b610c81565b34801561054157600080fd5b5060408051808201909152600381526250524f60e81b60208201526102cc565b34801561056d57600080fd5b506007546105979060ff808216916101008104821691620100008204811691630100000090041684565b6040805160ff95861681529385166020850152918416918301919091529091166060820152608001610271565b3480156105d057600080fd5b5061029a6105df366004611bb8565b610d69565b3480156105f057600080fd5b506102656105ff366004611ac6565b610d8b565b34801561061057600080fd5b506000546104fd90630100000090046001600160a01b031681565b34801561063757600080fd5b50610265610646366004611ac6565b610dfe565b34801561065757600080fd5b5061029a610666366004611b07565b610ebf565b34801561067757600080fd5b5061029a610686366004611a2d565b610f64565b34801561069757600080fd5b506103326106a6366004611c48565b610fde565b3480156106b757600080fd5b5061033260035481565b3480156106cd57600080fd5b5060005461026590610100900460ff1681565b3480156106ec57600080fd5b506001546104fd906001600160a01b031681565b34801561070c57600080fd5b5061033261071b366004611c6a565b602052637f5e9f20600c908152600091909152603490205490565b34801561074257600080fd5b5061029a610751366004611a2d565b610fea565b61029a610764366004611aa9565b611098565b61029a610777366004611aa9565b6110d8565b34801561078857600080fd5b50610332610797366004611aa9565b63389a75e1600c908152600091909152602090205490565b6107b76110ff565b600081116107e05760405162461bcd60e51b81526004016107d790611ca3565b60405180910390fd5b600555565b6107ed6110ff565b600080546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b600082602052637f5e9f20600c5233600052816034600c205581600052602c5160601c337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560206000a35060015b92915050565b6108756110ff565b600354156108b95760405162461bcd60e51b8152602060048201526011602482015270416c7265616479206c61756e636865642160781b60448201526064016107d7565b43600355600280546001600160a01b0319166001600160a01b0392909216919091179055565b6108e76110ff565b6001600160a01b03919091166000908152600960205260409020805460ff1916911515919091179055565b600061091f84848461111a565b6001600160a01b0384166000908152600a602052604081205460ff168061095e57506001600160a01b0384166000908152600a602052604090205460ff165b90508080610971575061097185856111cf565b1561098c576109828585858461125b565b600191505061099b565b61099785858561131f565b9150505b9392505050565b60006202a30067ffffffffffffffff164201905063389a75e1600c5233600052806020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d600080a250565b6109fa6110ff565b600b610a068284611d16565b60ff1610610a4d5760405162461bcd60e51b815260206004820152601460248201527343616e6e6f74207365742061626f76652031302560601b60448201526064016107d7565b6007805463ffff000019166201000060ff9485160263ff00000019161763010000009290931691909102919091179055565b610a876110ff565b600b610a938284611d16565b60ff1610610ada5760405162461bcd60e51b815260206004820152601460248201527343616e6e6f74207365742061626f76652031302560601b60448201526064016107d7565b6007805460ff9283166101000261ffff199091169290931691909117919091179055565b610b066110ff565b60028054911515600160a01b0260ff60a01b19909216919091179055565b600082602052637f5e9f20600c52336000526034600c20805483810181811015610b565763f90670666000526004601cfd5b80835580600052505050602c5160601c337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560206000a350600192915050565b610b9e6110ff565b6001600160a01b038116610bf45760405162461bcd60e51b815260206004820152601c60248201527f43616e6e6f742073657420746865207a65726f20616464726573732e0000000060448201526064016107d7565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b63389a75e1600c523360005260006020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92600080a2565b610c5a6110ff565b6000805460ff1916911515919091179055565b610c756110ff565b610c7f60006113dd565b565b610c896110ff565b6003541580610ca657506136b060035443610ca49190611d2f565b105b610cf25760405162461bcd60e51b815260206004820152601f60248201527f43616e206f6e6c7920626520646f6e6520647572696e67206c61756e63682e0060448201526064016107d7565b60005b81811015610d64576001600a6000858585818110610d1557610d15611d42565b9050602002016020810190610d2a9190611aa9565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610d5c81611d58565b915050610cf5565b505050565b610d716110ff565b600080549115156101000261ff0019909216919091179055565b600082602052637f5e9f20600c52336000526034600c20805483811015610dba57638301ab386000526004601cfd5b8381039050808255806000525050602c5160601c337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560206000a350600192915050565b6000610e0b33848461111a565b336000908152600a602052604081205460ff1680610e4157506001600160a01b0384166000908152600a602052604090205460ff165b90508080610e545750610e5433856111cf565b15610ead57600254600090610e75906001600160a01b03163314858461141b565b90508015610e8d578084039350610e8d33308361146a565b6002546001600160a01b0390811690861603610eab57610eab6114e5565b505b610eb78484611554565b949350505050565b610ec76110ff565b801580610ed45750600354155b80610eed57506136b060035443610eeb9190611d2f565b105b610f395760405162461bcd60e51b815260206004820152601f60248201527f43616e206f6e6c7920626520646f6e6520647572696e67206c61756e63682e0060448201526064016107d7565b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b610f6c6110ff565b6103e8610f806805345cdf77eb68f44c5490565b610f8a9190611d71565b811015610fd95760405162461bcd60e51b815260206004820152601d60248201527f4d6178205458206d757374206265206174206c6561737420302e31252100000060448201526064016107d7565b600455565b600061099b8284611d93565b610ff26110ff565b600081116110125760405162461bcd60e51b81526004016107d790611ca3565b60646110256805345cdf77eb68f44c5490565b61102f9190611d71565b8111156110935760405162461bcd60e51b815260206004820152602c60248201527f5377617020616d6f756e742063616e6e6f74206265206f766572203125206f6660448201526b103a34329039bab838363c9760a11b60648201526084016107d7565b600655565b6110a06110ff565b63389a75e1600c52806000526020600c2080544211156110c857636f5e88186000526004601cfd5b600090556110d5816113dd565b50565b6110e06110ff565b8060601b6110f657637448fbae6000526004601cfd5b6110d5816113dd565b638b78c6d819543314610c7f576382b429006000526004601cfd5b600254600160a01b900460ff16801561114b5750638b78c6d819546001600160a01b0316836001600160a01b031614155b801561116057506001600160a01b0383163014155b15610d64576004546000611173846115cf565b9050818311806111aa5750801580156111aa57506387a211a2600c9081526000859052602090205482906111a8908590611d93565b115b156111c85760405163d758a25760e01b815260040160405180910390fd5b5050505050565b6002546000906001600160a01b039081169084168114806112015750806001600160a01b0316836001600160a01b0316145b8061120c5750600354155b801561123157506001600160a01b03841660009081526009602052604090205460ff16155b8015610eb7575050506001600160a01b031660009081526009602052604090205460ff1615919050565b336020818152637f5e9f20600c8181526000888152603480832054959094529181529087905220548311156112a3576040516313be252b60e01b815260040160405180910390fd5b60001981146112b7576112b785338561163b565b6002546000906112d6906001600160a01b03888116911614858561141b565b905080156112ee5780840393506112ee86308361146a565b6002546001600160a01b039081169086160361130c5761130c6114e5565b61131786868661146a565b505050505050565b60008360601b33602052637f5e9f208117600c526034600c208054600019811461135f5780851115611359576313be252b6000526004601cfd5b84810382555b50506387a211a28117600c526020600c208054808511156113885763f4d678b86000526004601cfd5b84810382555050836000526020600c208381540181555082602052600c5160601c8160601c7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a3506001949350505050565b638b78c6d81980546001600160a01b039092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a355565b60008260000361142d5750600061099b565b6000611439858461167b565b9050801561145f57606461144d8286611da6565b6114579190611d71565b91505061099b565b506000949350505050565b8260601b6387a211a28117600c526020600c208054808411156114955763f4d678b86000526004601cfd5b83810382555050826000526020600c208281540181555081602052600c5160601c8160601c7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a350505050565b6387a211a2600c9081523060009081526020909120549054610100900460ff16801561151a575060005462010000900460ff16155b801561152857506005548110155b156110d5576006548015611550578181116115435780611545565b815b9050611550816116f9565b5050565b60006387a211a2600c52336000526020600c2080548084111561157f5763f4d678b86000526004601cfd5b83810382555050826000526020600c208281540181555081602052600c5160601c337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a350600192915050565b60006001600160a01b0382163014806115ef57506001600160a01b038216155b8061160457506001600160a01b03821661dead145b8061161c57506002546001600160a01b038381169116145b80610867575050638b78c6d819546001600160a01b0391821691161490565b81602052637f5e9f20600c52826000526034600c20805460001981146111c85780831115611671576313be252b6000526004601cfd5b9190910390555050565b6000811561169c578261168f576050611692565b60195b60ff169050610867565b6003546000036116b2578261168f576042611692565b82156116d0576007546116929060ff80821691610100900416611d16565b6007546116ef9060ff6201000082048116916301000000900416611d16565b60ff169392505050565b60005462010000900460ff1615611723576040516310040f0d60e31b815260040160405180910390fd5b6000805462ff0000198116620100001790915560ff16156117e1576007546000906117609060ff6201000082048116916301000000900416611d16565b60075460ff91821692506000916002918491611783916201000090041686611da6565b61178d9190611d71565b6117979190611d71565b9050476117ac6117a78386611d2f565b611801565b60006117b88247611d2f565b90506117d883866117c98285611da6565b6117d39190611d71565b611941565b505050506117ea565b6117ea81611801565b6117f26119e0565b506000805462ff000019169055565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061183657611836611d42565b6001600160a01b03928316602091820292909201810191909152600854604080516315ab88c960e31b815290519190931692839263ad5c4648926004808401938290030181865afa15801561188f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b39190611dbd565b826001815181106118c6576118c6611d42565b6001600160a01b03928316602091820292909201015260405163791ac94760e01b81529082169063791ac9479061190a908690600090879030904290600401611dda565b600060405180830381600087803b15801561192457600080fd5b505af1158015611938573d6000803e3d6000fd5b50505050505050565b6008546000805460405163f305d71960e01b815230600482015260248101869052604481018390526064810192909252630100000090046001600160a01b0390811660848301524260a48301529091169063f305d71990839060c40160606040518083038185885af11580156119bb573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906111c89190611e4b565b6001546040516001600160a01b03909116904790600081818185875af1925050503d8060008114610d64576040519150601f19603f3d011682016040523d82523d6000602084013e505050565b600060208284031215611a3f57600080fd5b5035919050565b600060208083528351808285015260005b81811015611a7357858101830151858201604001528201611a57565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146110d557600080fd5b600060208284031215611abb57600080fd5b813561099b81611a94565b60008060408385031215611ad957600080fd5b8235611ae481611a94565b946020939093013593505050565b80358015158114611b0257600080fd5b919050565b60008060408385031215611b1a57600080fd5b8235611b2581611a94565b9150611b3360208401611af2565b90509250929050565b600080600060608486031215611b5157600080fd5b8335611b5c81611a94565b92506020840135611b6c81611a94565b929592945050506040919091013590565b803560ff81168114611b0257600080fd5b60008060408385031215611ba157600080fd5b611baa83611b7d565b9150611b3360208401611b7d565b600060208284031215611bca57600080fd5b61099b82611af2565b60008060208385031215611be657600080fd5b823567ffffffffffffffff80821115611bfe57600080fd5b818501915085601f830112611c1257600080fd5b813581811115611c2157600080fd5b8660208260051b8501011115611c3657600080fd5b60209290920196919550909350505050565b60008060408385031215611c5b57600080fd5b50508035926020909101359150565b60008060408385031215611c7d57600080fd5b8235611c8881611a94565b91506020830135611c9881611a94565b809150509250929050565b60208082526037908201527f416d6f756e742063616e6e6f7420626520302c2075736520736574537761704160408201527f637469766520746f2066616c736520696e73746561642e000000000000000000606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60ff818116838216019081111561086757610867611d00565b8181038181111561086757610867611d00565b634e487b7160e01b600052603260045260246000fd5b600060018201611d6a57611d6a611d00565b5060010190565b600082611d8e57634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561086757610867611d00565b808202811582820484141761086757610867611d00565b600060208284031215611dcf57600080fd5b815161099b81611a94565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015611e2a5784516001600160a01b031683529383019391830191600101611e05565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215611e6057600080fd5b835192506020840151915060408401519050925092509256fea26469706673582212206f4fa484a56cdf1496c666e8d983fceb9739de4b29fbd8088643726add35a38b64736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
-----Decoded View---------------
Arg [0] : router (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Deployed Bytecode Sourcemap
30643:10935:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30798:32;;;;;;;;;;-1:-1:-1;30798:32:0;;;;;;;;;;;179:14:1;;172:22;154:41;;142:2;127:18;30798:32:0;;;;;;;;41274:182;;;;;;;;;;-1:-1:-1;41274:182:0;;;;;:::i;:::-;;:::i;:::-;;32237:91;;;;;;;;;;-1:-1:-1;32303:20:0;;;;;;;;;;;;-1:-1:-1;;;32303:20:0;;;;32237:91;;;;;;;:::i;40340:101::-;;;;;;;;;;-1:-1:-1;40340:101:0;;;;;:::i;:::-;;:::i;7007:586::-;;;;;;;;;;-1:-1:-1;7007:586:0;;;;;:::i;:::-;;:::i;5823:200::-;;;;;;;;;;-1:-1:-1;5986:18:0;5980:25;5823:200;;;1798:25:1;;;1786:2;1771:18;5823:200:0;1652:177:1;32426:154:0;;;;;;;;;;-1:-1:-1;32426:154:0;;;;;:::i;:::-;;:::i;40709:121::-;;;;;;;;;;-1:-1:-1;40709:121:0;;;;;:::i;:::-;;:::i;33539:557::-;;;;;;;;;;-1:-1:-1;33539:557:0;;;;;:::i;:::-;;:::i;26386:630::-;;;:::i;40021:215::-;;;;;;;;;;-1:-1:-1;40021:215:0;;;;;:::i;:::-;;:::i;5387:84::-;;;;;;;;;;-1:-1:-1;5387:84:0;;5461:2;3340:36:1;;3328:2;3313:18;5387:84:0;3198:184:1;39810:206:0;;;;;;;;;;-1:-1:-1;39810:206:0;;;;;:::i;:::-;;:::i;39729:76::-;;;;;;;;;;-1:-1:-1;39729:76:0;;;;;:::i;:::-;;:::i;7730:1081::-;;;;;;;;;;-1:-1:-1;7730:1081:0;;;;;:::i;:::-;;:::i;40446:167::-;;;;;;;;;;-1:-1:-1;40446:167:0;;;;;:::i;:::-;;:::i;27101:466::-;;;:::i;40241:94::-;;;;;;;;;;-1:-1:-1;40241:94:0;;;;;:::i;:::-;;:::i;6092:293::-;;;;;;;;;;-1:-1:-1;6092:293:0;;;;;:::i;:::-;6263:18;6257:4;6250:32;;;6155:14;6296:19;;;;6361:4;6345:21;;6339:28;;6092:293;26121:102;;;:::i;30991:19::-;;;;;;;;;;-1:-1:-1;30991:19:0;;;;-1:-1:-1;;;30991:19:0;;;;;;28826:196;;;;;;;;;;-1:-1:-1;;;28977:27:0;28826:196;;;-1:-1:-1;;;;;3736:32:1;;;3718:51;;3706:2;3691:18;28826:196:0;3572:203:1;39367:275:0;;;;;;;;;;-1:-1:-1;39367:275:0;;;;;:::i;:::-;;:::i;32336:85::-;;;;;;;;;;-1:-1:-1;32404:12:0;;;;;;;;;;;;-1:-1:-1;;;32404:12:0;;;;32336:85;;31133:23;;;;;;;;;;-1:-1:-1;31133:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4645:4:1;4633:17;;;4615:36;;4687:17;;;4682:2;4667:18;;4660:45;4741:17;;;4721:18;;;4714:45;;;;4795:17;;;4790:2;4775:18;;4768:45;4602:3;4587:19;31133:23:0;4400:419:1;40618:86:0;;;;;;;;;;-1:-1:-1;40618:86:0;;;;;:::i;:::-;;:::i;8948:1057::-;;;;;;;;;;-1:-1:-1;8948:1057:0;;;;;:::i;:::-;;:::i;30899:30::-;;;;;;;;;;-1:-1:-1;30899:30:0;;;;;;;-1:-1:-1;;;;;30899:30:0;;;32862:672;;;;;;;;;;-1:-1:-1;32862:672:0;;;;;:::i;:::-;;:::i;39149:213::-;;;;;;;;;;-1:-1:-1;39149:213:0;;;;;:::i;:::-;;:::i;40835:155::-;;;;;;;;;;-1:-1:-1;40835:155:0;;;;;:::i;:::-;;:::i;41461:114::-;;;;;;;;;;-1:-1:-1;41461:114:0;;;;;:::i;:::-;;:::i;31014:26::-;;;;;;;;;;;;;;;;30834:29;;;;;;;;;;-1:-1:-1;30834:29:0;;;;;;;;;;;30933;;;;;;;;;;-1:-1:-1;30933:29:0;;;;-1:-1:-1;;;;;30933:29:0;;;6483:388;;;;;;;;;;-1:-1:-1;6483:388:0;;;;;:::i;:::-;6706:4;6699:21;6747:20;6741:4;6734:34;;;6599:14;6782:19;;;;6847:4;6831:21;;6825:28;;6483:388;40995:274;;;;;;;;;;-1:-1:-1;40995:274:0;;;;;:::i;:::-;;:::i;27758:724::-;;;;;;:::i;:::-;;:::i;25695:358::-;;;;;;:::i;:::-;;:::i;29128:449::-;;;;;;;;;;-1:-1:-1;29128:449:0;;;;;:::i;:::-;29407:19;29401:4;29394:33;;;29251:14;29441:26;;;;29553:4;29537:21;;29531:28;;29128:449;41274:182;29974:13;:11;:13::i;:::-;41361:1:::1;41349:9;:13;41341:81;;;;-1:-1:-1::0;;;41341:81:0::1;;;;;;;:::i;:::-;;;;;;;;;41427:12;:24:::0;41274:182::o;40340:101::-;29974:13;:11;:13::i;:::-;40410:15:::1;:26:::0;;-1:-1:-1;;;;;40410:26:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;40410:26:0;;::::1;::::0;;;::::1;::::0;;40340:101::o;7007:586::-;7081:4;7244:7;7238:4;7231:21;7279:20;7273:4;7266:34;7327:8;7321:4;7314:22;7380:6;7373:4;7367;7357:21;7350:37;7457:6;7451:4;7444:20;7546:4;7540:11;7536:2;7532:20;7522:8;7495:25;7489:4;7483;7478:75;-1:-1:-1;7581:4:0;7007:586;;;;;:::o;32426:154::-;29974:13;:11;:13::i;:::-;32489:11:::1;::::0;:16;32481:46:::1;;;::::0;-1:-1:-1;;;32481:46:0;;6096:2:1;32481:46:0::1;::::0;::::1;6078:21:1::0;6135:2;6115:18;;;6108:30;-1:-1:-1;;;6154:18:1;;;6147:47;6211:18;;32481:46:0::1;5894:341:1::0;32481:46:0::1;32546:12;32532:11;:26:::0;32563:5:::1;:12:::0;;-1:-1:-1;;;;;;32563:12:0::1;-1:-1:-1::0;;;;;32563:12:0;;;::::1;::::0;;;::::1;::::0;;32426:154::o;40709:121::-;29974:13;:11;:13::i;:::-;-1:-1:-1;;;;;40791:23:0;;;::::1;;::::0;;;:10:::1;:23;::::0;;;;:34;;-1:-1:-1;;40791:34:0::1;::::0;::::1;;::::0;;;::::1;::::0;;40709:121::o;33539:557::-;33628:4;33639:33;33655:4;33661:2;33665:6;33639:15;:33::i;:::-;-1:-1:-1;;;;;33728:14:0;;33709:16;33728:14;;;:8;:14;;;;;;;;;:30;;-1:-1:-1;;;;;;33746:12:0;;;;;;:8;:12;;;;;;;;33728:30;33709:49;;33767:11;:32;;;;33782:17;33790:4;33796:2;33782:7;:17::i;:::-;33763:111;;;33807:44;33821:4;33827:2;33831:6;33839:11;33807:13;:44::i;:::-;33864:4;33857:11;;;;;33763:111;34055:36;34074:4;34080:2;34084:6;34055:18;:36::i;:::-;34048:43;;;33539:557;;;;;;:::o;26386:630::-;26481:15;25311:9;26499:46;;:15;:46;26481:64;;26717:19;26711:4;26704:33;26768:8;26762:4;26755:22;26825:7;26818:4;26812;26802:21;26795:38;26974:8;26927:45;26924:1;26921;26916:67;26617:381;26386:630::o;40021:215::-;29974:13;:11;:13::i;:::-;40138:2:::1;40112:23;40125:10:::0;40112;:23:::1;:::i;:::-;:28;;;40104:61;;;::::0;-1:-1:-1;;;40104:61:0;;6727:2:1;40104:61:0::1;::::0;::::1;6709:21:1::0;6766:2;6746:18;;;6739:30;-1:-1:-1;;;6785:18:1;;;6778:50;6845:18;;40104:61:0::1;6525:344:1::0;40104:61:0::1;40170:4;:28:::0;;-1:-1:-1;;40203:28:0;40170;::::1;::::0;;::::1;;-1:-1:-1::0;;40203:28:0;;;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;40021:215::o;39810:206::-;29974:13;:11;:13::i;:::-;39922:2:::1;39898:21;39910:9:::0;39898;:21:::1;:::i;:::-;:26;;;39890:59;;;::::0;-1:-1:-1;;;39890:59:0;;6727:2:1;39890:59:0::1;::::0;::::1;6709:21:1::0;6766:2;6746:18;;;6739:30;-1:-1:-1;;;6785:18:1;;;6778:50;6845:18;;39890:59:0::1;6525:344:1::0;39890:59:0::1;39954:4;:26:::0;;::::1;39985::::0;;::::1;39954;39985;-1:-1:-1::0;;39985:26:0;;;39954;;;::::1;39985::::0;;;;;;;::::1;::::0;;39810:206::o;39729:76::-;29974:13;:11;:13::i;:::-;39786:7:::1;:14:::0;;;::::1;;-1:-1:-1::0;;;39786:14:0::1;-1:-1:-1::0;;;;39786:14:0;;::::1;::::0;;;::::1;::::0;;39729:76::o;7730:1081::-;7818:4;7979:7;7973:4;7966:21;8014:20;8008:4;8001:34;8062:8;8056:4;8049:22;8122:4;8116;8106:21;8170:13;8164:20;8279:10;8262:15;8258:32;8364:15;8348:14;8345:35;8342:159;;;8413:10;8407:4;8400:24;8481:4;8475;8468:18;8342:159;8582:14;8567:13;8560:37;8667:14;8661:4;8654:28;;;;8764:4;8758:11;8754:2;8750:20;8740:8;8713:25;8707:4;8701;8696:75;-1:-1:-1;8799:4:0;7730:1081;;;;:::o;40446:167::-;29974:13;:11;:13::i;:::-;-1:-1:-1;;;;;40523:22:0;::::1;40515:63;;;::::0;-1:-1:-1;;;40515:63:0;;7076:2:1;40515:63:0::1;::::0;::::1;7058:21:1::0;7115:2;7095:18;;;7088:30;7154;7134:18;;;7127:58;7202:18;;40515:63:0::1;6874:352:1::0;40515:63:0::1;40583:14;:25:::0;;-1:-1:-1;;;;;;40583:25:0::1;-1:-1:-1::0;;;;;40583:25:0;;;::::1;::::0;;;::::1;::::0;;40446:167::o;27101:466::-;27307:19;27301:4;27294:33;27354:8;27348:4;27341:22;27407:1;27400:4;27394;27384:21;27377:32;27540:8;27494:44;27491:1;27488;27483:66;27101:466::o;40241:94::-;29974:13;:11;:13::i;:::-;40306::::1;:24:::0;;-1:-1:-1;;40306:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;40241:94::o;26121:102::-;29974:13;:11;:13::i;:::-;26194:21:::1;26212:1;26194:9;:21::i;:::-;26121:102::o:0;39367:275::-;29974:13;:11;:13::i;:::-;39453:11:::1;::::0;:16;;:54:::1;;;39502:5;39488:11;;39473:12;:26;;;;:::i;:::-;:34;39453:54;39445:98;;;::::0;-1:-1:-1;;;39445:98:0;;7566:2:1;39445:98:0::1;::::0;::::1;7548:21:1::0;7605:2;7585:18;;;7578:30;7644:33;7624:18;;;7617:61;7695:18;;39445:98:0::1;7364:355:1::0;39445:98:0::1;39553:9;39548:90;39568:21:::0;;::::1;39548:90;;;39628:4;39602:8;:23;39611:10;;39622:1;39611:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;39602:23:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;39602:23:0;:30;;-1:-1:-1;;39602:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;39591:3;::::1;::::0;::::1;:::i;:::-;;;;39548:90;;;;39367:275:::0;;:::o;40618:86::-;29974:13;:11;:13::i;:::-;40679:10:::1;:20:::0;;;::::1;;;;-1:-1:-1::0;;40679:20:0;;::::1;::::0;;;::::1;::::0;;40618:86::o;8948:1057::-;9036:4;9197:7;9191:4;9184:21;9232:20;9226:4;9219:34;9280:8;9274:4;9267:22;9340:4;9334;9324:21;9388:13;9382:20;9481:10;9464:15;9461:31;9458:156;;;9525:10;9519:4;9512:24;9594:4;9588;9581:18;9458:156;9729:10;9712:15;9708:32;9686:54;;9776:14;9761:13;9754:37;9861:14;9855:4;9848:28;;;9958:4;9952:11;9948:2;9944:20;9934:8;9907:25;9901:4;9895;9890:75;-1:-1:-1;9993:4:0;8948:1057;;;;:::o;32862:672::-;32933:4;32944:39;32960:10;32972:2;32976:6;32944:15;:39::i;:::-;33043:10;33015:16;33034:20;;;:8;:20;;;;;;;;;:36;;-1:-1:-1;;;;;;33058:12:0;;;;;;:8;:12;;;;;;;;33034:36;33015:55;;33079:11;:38;;;;33094:23;33102:10;33114:2;33094:7;:23::i;:::-;33075:372;;;33164:5;;33125:11;;33139:52;;-1:-1:-1;;;;;33164:5:0;33150:10;:19;33171:6;33179:11;33139:10;:52::i;:::-;33125:66;-1:-1:-1;33201:7:0;;33197:190;;33316:3;33307:6;:12;33298:21;;33333:47;33349:10;33369:4;33376:3;33333:15;:47::i;:::-;33402:5;;-1:-1:-1;;;;;33402:5:0;;;33396:11;;;;33392:50;;33416:19;:17;:19::i;:::-;33119:328;33075:372;33503:26;33518:2;33522:6;33503:14;:26::i;:::-;33496:33;32862:672;-1:-1:-1;;;;32862:672:0:o;39149:213::-;29974:13;:11;:13::i;:::-;39232:4:::1;39231:5;:25;;;-1:-1:-1::0;39240:11:0::1;::::0;:16;39231:25:::1;:63;;;;39289:5;39275:11;;39260:12;:26;;;;:::i;:::-;:34;39231:63;39223:107;;;::::0;-1:-1:-1;;;39223:107:0;;7566:2:1;39223:107:0::1;::::0;::::1;7548:21:1::0;7605:2;7585:18;;;7578:30;7644:33;7624:18;;;7617:61;7695:18;;39223:107:0::1;7364:355:1::0;39223:107:0::1;-1:-1:-1::0;;;;;39335:15:0;;;::::1;;::::0;;;:8:::1;:15;::::0;;;;:22;;-1:-1:-1;;39335:22:0::1;::::0;::::1;;::::0;;;::::1;::::0;;39149:213::o;40835:155::-;29974:13;:11;:13::i;:::-;40927:4:::1;40911:13;5986:18:::0;5980:25;;5823:200;40911:13:::1;:20;;;;:::i;:::-;40901:6;:30;;40893:72;;;::::0;-1:-1:-1;;;40893:72:0;;8420:2:1;40893:72:0::1;::::0;::::1;8402:21:1::0;8459:2;8439:18;;;8432:30;8498:31;8478:18;;;8471:59;8547:18;;40893:72:0::1;8218:353:1::0;40893:72:0::1;40970:6;:15:::0;40835:155::o;41461:114::-;41535:7;41556:14;41564:6;41556:5;:14;:::i;40995:274::-;29974:13;:11;:13::i;:::-;41081:1:::1;41069:9;:13;41061:81;;;;-1:-1:-1::0;;;41061:81:0::1;;;;;;;:::i;:::-;41184:3;41168:13;5986:18:::0;5980:25;;5823:200;41168:13:::1;:19;;;;:::i;:::-;41155:9;:32;;41147:89;;;::::0;-1:-1:-1;;;41147:89:0;;8908:2:1;41147:89:0::1;::::0;::::1;8890:21:1::0;8947:2;8927:18;;;8920:30;8986:34;8966:18;;;8959:62;-1:-1:-1;;;9037:18:1;;;9030:42;9089:19;;41147:89:0::1;8706:408:1::0;41147:89:0::1;41241:11;:23:::0;40995:274::o;27758:724::-;29974:13;:11;:13::i;:::-;27996:19:::1;27990:4;27983:33;28043:12;28037:4;28030:26;28106:4;28100;28090:21;28214:12;28208:19;28195:11;28192:36;28189:160;;;28261:10;28255:4;28248:24;28329:4;28323;28316:18;28189:160;28428:1;28407:23:::0;;28451::::1;28461:12:::0;28451:9:::1;:23::i;:::-;27758:724:::0;:::o;25695:358::-;29974:13;:11;:13::i;:::-;25870:8:::1;25866:2;25862:17;25852:153;;25913:10;25907:4;25900:24;25985:4;25979;25972:18;25852:153;26026:19;26036:8;26026:9;:19::i;24607:373::-:0;-1:-1:-1;;24817:27:0;24807:8;24804:41;24794:168;;24879:10;24873:4;24866:24;24942:4;24936;24929:18;35304:408;35402:7;;-1:-1:-1;;;35402:7:0;;;;:28;;;;-1:-1:-1;;;28977:27:0;-1:-1:-1;;;;;35413:17:0;:6;-1:-1:-1;;;;;35413:17:0;;;35402:28;:55;;;;-1:-1:-1;;;;;;35434:23:0;;35452:4;35434:23;;35402:55;35398:310;;;35514:6;;35500:11;35549:33;35572:9;35549:22;:33::i;:::-;35526:56;;35601:3;35592:6;:12;:73;;;;35610:15;35609:16;:55;;;;-1:-1:-1;6263:18:0;6257:4;6250:32;;;6155:14;6296:19;;;6361:4;6345:21;;6339:28;35661:3;;35629:29;;35652:6;;35629:29;:::i;:::-;:35;35609:55;35588:115;;;35681:15;;-1:-1:-1;;;35681:15:0;;;;;;;;;;;35588:115;35459:249;;35304:408;;;:::o;35796:228::-;35896:5;;35870:4;;-1:-1:-1;;;;;35896:5:0;;;;35914:14;;;;;:35;;;35945:4;-1:-1:-1;;;;;35932:17:0;:9;-1:-1:-1;;;;;35932:17:0;;35914:35;:55;;;-1:-1:-1;35953:11:0;;:16;35914:55;35913:80;;;;-1:-1:-1;;;;;;35975:18:0;;;;;;:10;:18;;;;;;;;35974:19;35913:80;:106;;;;-1:-1:-1;;;;;;;;35998:21:0;;;;;:10;:21;;;;;;;;35997:22;;35796:228;-1:-1:-1;35796:228:0:o;34101:1138::-;34414:10;6706:4;6699:21;;;6747:20;6741:4;6734:34;;;34380:15;6782:19;;;6847:4;6831:21;;;6825:28;6699:21;;;;6734:34;;;6782:19;;;;6831:21;6825:28;-1:-1:-1;;34430:84:0;;;34485:23;;-1:-1:-1;;;34485:23:0;;;;;;;;;;;34430:84;-1:-1:-1;;34579:7:0;:28;34575:87;;34615:41;34631:4;34637:10;34649:6;34615:15;:41::i;:::-;34701:5;;34668:11;;34682:46;;-1:-1:-1;;;;;34693:13:0;;;34701:5;;34693:13;34708:6;34716:11;34682:10;:46::i;:::-;34668:60;-1:-1:-1;34737:7:0;;34733:412;;34849:3;34840:6;:12;34831:21;;35098:41;35114:4;35128;35135:3;35098:15;:41::i;:::-;35159:5;;-1:-1:-1;;;;;35159:5:0;;;35153:11;;;;35149:48;;35172:19;:17;:19::i;:::-;35201:33;35217:4;35223:2;35227:6;35201:15;:33::i;:::-;34192:1047;;34101:1138;;;;:::o;11905:2150::-;11993:4;12099;12095:2;12091:13;12194:8;12188:4;12181:22;12240:20;12233:5;12230:31;12224:4;12217:45;12313:4;12307;12297:21;12356:13;12350:20;12480:1;12476:6;12464:10;12461:22;12451:438;;12600:10;12592:6;12589:22;12586:162;;;12648:10;12642:4;12635:24;12724:4;12718;12711:18;12586:162;12866:6;12854:10;12850:23;12835:13;12828:46;12451:438;;;12987:18;12980:5;12977:29;12971:4;12964:43;13060:4;13054;13044:21;13104:15;13098:22;13196:11;13188:6;13185:23;13182:149;;;13241:10;13235:4;13228:24;13311:4;13305;13298:18;13182:149;13442:6;13429:11;13425:24;13408:15;13401:49;;;13527:2;13521:4;13514:16;13581:4;13575;13565:21;13835:6;13819:13;13813:20;13809:33;13794:13;13787:56;;13913:6;13907:4;13900:20;14008:4;14002:11;13998:2;13994:20;13986:5;13982:2;13978:14;13951:25;13945:4;13939;13934:81;-1:-1:-1;14043:4:0;;11905:2150;-1:-1:-1;;;;11905:2150:0:o;24040:506::-;-1:-1:-1;;24423:16:0;;-1:-1:-1;;;;;24277:26:0;;;;;;24383:38;24380:1;;24372:78;24501:27;24040:506::o;36090:268::-;36178:7;36196:6;36206:1;36196:11;36192:37;;-1:-1:-1;36222:1:0;36215:8;;36192:37;36233:14;36250:30;36261:5;36268:11;36250:10;:30::i;:::-;36233:47;-1:-1:-1;36289:10:0;;36285:56;;36332:3;36314:15;36323:6;36314;:15;:::i;:::-;:21;;;;:::i;:::-;36307:28;;;;;36285:56;-1:-1:-1;36352:1:0;;36090:268;-1:-1:-1;;;;36090:268:0:o;15910:1327::-;16088:4;16084:2;16080:13;16191:18;16184:5;16181:29;16175:4;16168:43;16264:4;16258;16248:21;16308:15;16302:22;16400:11;16392:6;16389:23;16386:149;;;16445:10;16439:4;16432:24;16515:4;16509;16502:18;16386:149;16646:6;16633:11;16629:24;16612:15;16605:49;;;16731:2;16725:4;16718:16;16785:4;16779;16769:21;17039:6;17023:13;17017:20;17013:33;16998:13;16991:56;;17117:6;17111:4;17104:20;17212:4;17206:11;17202:2;17198:20;17190:5;17186:2;17182:14;17155:25;17149:4;17143;17138:81;;15910:1327;;;:::o;36427:373::-;6263:18;6257:4;6250:32;;;36513:4;36469:23;6296:19;;;6361:4;6345:21;;;6339:28;36528:10;;;;;;;:22;;;;-1:-1:-1;36543:7:0;;;;;;;36542:8;36528:22;:57;;;;;36573:12;;36554:15;:31;;36528:57;36524:272;;;36618:11;;36639:18;;36635:156;;36700:15;36683:14;:32;:67;;36736:14;36683:67;;;36718:15;36683:67;36666:84;;36757:27;36769:14;36757:11;:27::i;:::-;36587:209;36464:336;36427:373::o;10200:1326::-;10270:4;10429:18;10423:4;10416:32;10475:8;10469:4;10462:22;10537:4;10531;10521:21;10581:15;10575:22;10673:11;10665:6;10662:23;10659:149;;;10718:10;10712:4;10705:24;10788:4;10782;10775:18;10659:149;10919:6;10906:11;10902:24;10885:15;10878:49;;;11004:2;10998:4;10991:16;11058:4;11052;11042:21;11312:6;11296:13;11290:20;11286:33;11271:13;11264:56;;11390:6;11384:4;11377:20;11479:4;11473:11;11469:2;11465:20;11455:8;11428:25;11422:4;11416;11411:75;-1:-1:-1;11514:4:0;10200:1326;;;;:::o;37359:237::-;37431:4;-1:-1:-1;;;;;37449:25:0;;37469:4;37449:25;;:55;;-1:-1:-1;;;;;;37482:22:0;;;37449:55;:90;;;-1:-1:-1;;;;;;37512:27:0;;37532:6;37512:27;37449:90;:115;;;-1:-1:-1;37559:5:0;;-1:-1:-1;;;;;37547:17:0;;;37559:5;;37547:17;37449:115;:142;;;-1:-1:-1;;;;28977:27:0;-1:-1:-1;;;;;37572:19:0;;;;;;;37359:237::o;17618:979::-;17863:7;17857:4;17850:21;17898:20;17892:4;17885:34;17946:5;17940:4;17933:19;18003:4;17997;17987:21;18046:13;18040:20;18170:1;18166:6;18154:10;18151:22;18141:438;;18290:10;18282:6;18279:22;18276:162;;;18338:10;18332:4;18325:24;18414:4;18408;18401:18;18276:162;18540:23;;;;18518:46;;-1:-1:-1;;17618:979:0:o;36856:394::-;36928:7;36975:11;36971:51;;;37001:5;:15;;37014:2;37001:15;;;37009:2;37001:15;36994:22;;;;;;36971:51;37051:11;;37066:1;37051:16;37047:56;;37082:5;:15;;37095:2;37082:15;;37047:56;37127:5;37123:61;;;37164:4;:14;37147:31;;37164:14;;;;;;37147;;;:31;:::i;37123:61::-;37230:4;:15;37212:33;;37230:15;;;;;;;37212;;;;:33;:::i;:::-;37205:40;;;36856:394;-1:-1:-1;;;36856:394:0:o;37601:614::-;31365:7;;;;;;;31361:47;;;31387:15;;-1:-1:-1;;;31387:15:0;;;;;;;;;;;31361:47;31412:7;:14;;-1:-1:-1;;31412:14:0;;;;;;;;37768:13;37764:418:::1;;;37823:4;:15:::0;37789:13:::1;::::0;37805:33:::1;::::0;37823:15:::1;::::0;;::::1;::::0;::::1;::::0;37805;;::::1;;:33;:::i;:::-;37881:4;:15:::0;37789:49:::1;::::0;;::::1;::::0;-1:-1:-1;37844:20:0::1;::::0;37908:1:::1;::::0;37789:49;;37868:28:::1;::::0;37881:15;;::::1;;37868:10:::0;:28:::1;:::i;:::-;:36;;;;:::i;:::-;37867:42;;;;:::i;:::-;37844:65:::0;-1:-1:-1;37939:21:0::1;37966:32;37972:25;37844:65:::0;37972:10;:25:::1;:::i;:::-;37966:5;:32::i;:::-;38004:21;38028:37;38052:13:::0;38028:21:::1;:37;:::i;:::-;38004:61:::0;-1:-1:-1;38071:70:0::1;38085:12:::0;38130:10;38099:28:::1;38085:12:::0;38004:61;38099:28:::1;:::i;:::-;:41;;;;:::i;:::-;38071:13;:70::i;:::-;37783:364;;;;37764:418;;;38159:17;38165:10;38159:5;:17::i;:::-;38186:24;:22;:24::i;:::-;-1:-1:-1::0;31447:5:0;31437:15;;-1:-1:-1;;31437:15:0;;;37601:614::o;38254:325::-;38322:16;;;38336:1;38322:16;;;;;;;;38298:21;;38322:16;;;;;;;;;;-1:-1:-1;38322:16:0;38298:40;;38361:4;38343;38348:1;38343:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;38343:23:0;;;:7;;;;;;;;;;:23;;;;38402:7;;38425:13;;;-1:-1:-1;;;38425:13:0;;;;38402:7;;;;;;;38425:11;;:13;;;;;;;;;;38402:7;38425:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38415:4;38420:1;38415:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;38415:23:0;;;:7;;;;;;;;;:23;38443:131;;-1:-1:-1;;;38443:131:0;;:57;;;;;;:131;;38506:6;;38518:1;;38525:4;;38543;;38554:15;;38443:131;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38293:286;;38254:325;:::o;38584:209::-;38660:7;;;38747:15;;38649:139;;-1:-1:-1;;;38649:139:0;;38710:4;38649:139;;;11006:34:1;11056:18;;;11049:34;;;11099:18;;;11092:34;;;11142:18;;;11135:34;;;;38747:15:0;;;-1:-1:-1;;;;;38747:15:0;;;11185:19:1;;;11178:44;38768:15:0;11238:19:1;;;11231:35;38660:7:0;;;;38649:35;;38692:3;;10940:19:1;;38649:139:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;38911:105::-;38958:14;;:53;;-1:-1:-1;;;;;38958:14:0;;;;38985:21;;38958:53;;;;38985:21;38958:14;:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39548:90:::1;39367:275:::0;;:::o;206:180:1:-;265:6;318:2;306:9;297:7;293:23;289:32;286:52;;;334:1;331;324:12;286:52;-1:-1:-1;357:23:1;;206:180;-1:-1:-1;206:180:1:o;391:548::-;503:4;532:2;561;550:9;543:21;593:6;587:13;636:6;631:2;620:9;616:18;609:34;661:1;671:140;685:6;682:1;679:13;671:140;;;780:14;;;776:23;;770:30;746:17;;;765:2;742:26;735:66;700:10;;671:140;;;675:3;860:1;855:2;846:6;835:9;831:22;827:31;820:42;930:2;923;919:7;914:2;906:6;902:15;898:29;887:9;883:45;879:54;871:62;;;;391:548;;;;:::o;944:131::-;-1:-1:-1;;;;;1019:31:1;;1009:42;;999:70;;1065:1;1062;1055:12;1080:247;1139:6;1192:2;1180:9;1171:7;1167:23;1163:32;1160:52;;;1208:1;1205;1198:12;1160:52;1247:9;1234:23;1266:31;1291:5;1266:31;:::i;1332:315::-;1400:6;1408;1461:2;1449:9;1440:7;1436:23;1432:32;1429:52;;;1477:1;1474;1467:12;1429:52;1516:9;1503:23;1535:31;1560:5;1535:31;:::i;:::-;1585:5;1637:2;1622:18;;;;1609:32;;-1:-1:-1;;;1332:315:1:o;1834:160::-;1899:20;;1955:13;;1948:21;1938:32;;1928:60;;1984:1;1981;1974:12;1928:60;1834:160;;;:::o;1999:315::-;2064:6;2072;2125:2;2113:9;2104:7;2100:23;2096:32;2093:52;;;2141:1;2138;2131:12;2093:52;2180:9;2167:23;2199:31;2224:5;2199:31;:::i;:::-;2249:5;-1:-1:-1;2273:35:1;2304:2;2289:18;;2273:35;:::i;:::-;2263:45;;1999:315;;;;;:::o;2319:456::-;2396:6;2404;2412;2465:2;2453:9;2444:7;2440:23;2436:32;2433:52;;;2481:1;2478;2471:12;2433:52;2520:9;2507:23;2539:31;2564:5;2539:31;:::i;:::-;2589:5;-1:-1:-1;2646:2:1;2631:18;;2618:32;2659:33;2618:32;2659:33;:::i;:::-;2319:456;;2711:7;;-1:-1:-1;;;2765:2:1;2750:18;;;;2737:32;;2319:456::o;2780:156::-;2846:20;;2906:4;2895:16;;2885:27;;2875:55;;2926:1;2923;2916:12;2941:252;3005:6;3013;3066:2;3054:9;3045:7;3041:23;3037:32;3034:52;;;3082:1;3079;3072:12;3034:52;3105:27;3122:9;3105:27;:::i;:::-;3095:37;;3151:36;3183:2;3172:9;3168:18;3151:36;:::i;3387:180::-;3443:6;3496:2;3484:9;3475:7;3471:23;3467:32;3464:52;;;3512:1;3509;3502:12;3464:52;3535:26;3551:9;3535:26;:::i;3780:615::-;3866:6;3874;3927:2;3915:9;3906:7;3902:23;3898:32;3895:52;;;3943:1;3940;3933:12;3895:52;3983:9;3970:23;4012:18;4053:2;4045:6;4042:14;4039:34;;;4069:1;4066;4059:12;4039:34;4107:6;4096:9;4092:22;4082:32;;4152:7;4145:4;4141:2;4137:13;4133:27;4123:55;;4174:1;4171;4164:12;4123:55;4214:2;4201:16;4240:2;4232:6;4229:14;4226:34;;;4256:1;4253;4246:12;4226:34;4309:7;4304:2;4294:6;4291:1;4287:14;4283:2;4279:23;4275:32;4272:45;4269:65;;;4330:1;4327;4320:12;4269:65;4361:2;4353:11;;;;;4383:6;;-1:-1:-1;3780:615:1;;-1:-1:-1;;;;3780:615:1:o;4824:248::-;4892:6;4900;4953:2;4941:9;4932:7;4928:23;4924:32;4921:52;;;4969:1;4966;4959:12;4921:52;-1:-1:-1;;4992:23:1;;;5062:2;5047:18;;;5034:32;;-1:-1:-1;4824:248:1:o;5077:388::-;5145:6;5153;5206:2;5194:9;5185:7;5181:23;5177:32;5174:52;;;5222:1;5219;5212:12;5174:52;5261:9;5248:23;5280:31;5305:5;5280:31;:::i;:::-;5330:5;-1:-1:-1;5387:2:1;5372:18;;5359:32;5400:33;5359:32;5400:33;:::i;:::-;5452:7;5442:17;;;5077:388;;;;;:::o;5470:419::-;5672:2;5654:21;;;5711:2;5691:18;;;5684:30;5750:34;5745:2;5730:18;;5723:62;5821:25;5816:2;5801:18;;5794:53;5879:3;5864:19;;5470:419::o;6240:127::-;6301:10;6296:3;6292:20;6289:1;6282:31;6332:4;6329:1;6322:15;6356:4;6353:1;6346:15;6372:148;6460:4;6439:12;;;6453;;;6435:31;;6478:13;;6475:39;;;6494:18;;:::i;7231:128::-;7298:9;;;7319:11;;;7316:37;;;7333:18;;:::i;7724:127::-;7785:10;7780:3;7776:20;7773:1;7766:31;7816:4;7813:1;7806:15;7840:4;7837:1;7830:15;7856:135;7895:3;7916:17;;;7913:43;;7936:18;;:::i;:::-;-1:-1:-1;7983:1:1;7972:13;;7856:135::o;7996:217::-;8036:1;8062;8052:132;;8106:10;8101:3;8097:20;8094:1;8087:31;8141:4;8138:1;8131:15;8169:4;8166:1;8159:15;8052:132;-1:-1:-1;8198:9:1;;7996:217::o;8576:125::-;8641:9;;;8662:10;;;8659:36;;;8675:18;;:::i;9119:168::-;9192:9;;;9223;;9240:15;;;9234:22;;9220:37;9210:71;;9261:18;;:::i;9424:251::-;9494:6;9547:2;9535:9;9526:7;9522:23;9518:32;9515:52;;;9563:1;9560;9553:12;9515:52;9595:9;9589:16;9614:31;9639:5;9614:31;:::i;9680:980::-;9942:4;9990:3;9979:9;9975:19;10021:6;10010:9;10003:25;10047:2;10085:6;10080:2;10069:9;10065:18;10058:34;10128:3;10123:2;10112:9;10108:18;10101:31;10152:6;10187;10181:13;10218:6;10210;10203:22;10256:3;10245:9;10241:19;10234:26;;10295:2;10287:6;10283:15;10269:29;;10316:1;10326:195;10340:6;10337:1;10334:13;10326:195;;;10405:13;;-1:-1:-1;;;;;10401:39:1;10389:52;;10496:15;;;;10461:12;;;;10437:1;10355:9;10326:195;;;-1:-1:-1;;;;;;;10577:32:1;;;;10572:2;10557:18;;10550:60;-1:-1:-1;;;10641:3:1;10626:19;10619:35;10538:3;9680:980;-1:-1:-1;;;9680:980:1:o;11277:306::-;11365:6;11373;11381;11434:2;11422:9;11413:7;11409:23;11405:32;11402:52;;;11450:1;11447;11440:12;11402:52;11479:9;11473:16;11463:26;;11529:2;11518:9;11514:18;11508:25;11498:35;;11573:2;11562:9;11558:18;11552:25;11542:35;;11277:306;;;;;:::o
Swarm Source
ipfs://6f4fa484a56cdf1496c666e8d983fceb9739de4b29fbd8088643726add35a38b
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.