false
true
0

Contract Address Details

0x69e23263927Ae53E5FF3A898d082a83B7D6fB438

Token
0x69e232-6fb438
Creator
0x3b1489–4bb05e at 0x39b644–0af7b7
Balance
0 PLS ( )
Tokens
Fetching tokens...
Transactions
2,158 Transactions
Transfers
0 Transfers
Gas Used
0
Last Balance Update
25917141
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
SCADAToken




Optimization enabled
true
Compiler version
v0.8.20+commit.a1b79de6




Optimization runs
200
EVM Version
paris




Verified at
2025-12-09T07:50:01.092446Z

Constructor Arguments

0x0000000000000000000000003b1489f3ea4643b7e7b29548e2e2cfef094bb05e0000000000000000000000003b1489f3ea4643b7e7b29548e2e2cfef094bb05e000000000000000000000000915b4145e169ce7352936e88546ac8667d22723c

Arg [0] (address) : 0x3b1489f3ea4643b7e7b29548e2e2cfef094bb05e
Arg [1] (address) : 0x3b1489f3ea4643b7e7b29548e2e2cfef094bb05e
Arg [2] (address) : 0x915b4145e169ce7352936e88546ac8667d22723c

              

SCADAToken.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "./PulseXInterfaces.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";

interface ISCADAManager {
    function notifyNewLP(uint256 liquidity) external;
}

contract SCADAToken is ERC20, Ownable, ReentrancyGuard {

    address public immutable creator;
    address public mainPair;
    address public scadaManager;

    address public constant PULSEX_ROUTER02 = 0x165C3410fC91EF562C50559f7d2289fEbed552d9;
    address public constant PULSEX_FACTORY2 = 0x29eA7545DEf87022BAdc76323F373EA1e707C523;
    address public constant WPLS = 0xA1077a294dDE1B09bB078844df40758a5D0f9a27;

    uint256 public tSell = 120; 
    uint256 public tBuy = 100;
    uint256 public constant MAX_SELL_TAX = 200;
    uint256 public constant MAX_BUY_TAX = 200;
    uint256 public swapTokensAtAmount = 10_000 * 1e18;
    uint256 public collectedForLP;
    uint256 public whaleAmount;

    mapping(address => bool) public isAMMPair;
    mapping(address => bool) public isFeeExempt;
    mapping(address => bool) public isWhaleExcluded;

    bool private inSwap;

    // Administrative events
    event AMMPairSet(address indexed pair, bool value);
    event SwapTokensAtAmountUpdated(uint256 oldAmount, uint256 newAmount);
    event ScadaManagerUpdated(address indexed oldManager, address indexed newManager);
    event BuyTaxUpdated(uint tBuy);
    event SellTaxUpdated(uint tSell);
    event whaleAmountUpdated(uint oldAmount, uint whaleAmount);
    
    // Tax and transfer events
    event TaxCollected(address indexed from, address indexed to, uint256 feeAmount, uint256 totalCollected);
    event TransferProcessed(address indexed from, address indexed to, uint256 amount, uint256 fee);
    
    // Swap trigger events
    event AutoSwapTriggered(uint256 tokensToSwap, string triggerReason);
    event AutoSwapSkipped(string reason, uint256 currentCollected, uint256 threshold);
    
    // Detailed swap process events
    event SwapStarted(uint256 totalTokens, uint256 halfForSwap, uint256 halfForLP);
    event TokenSwapCompleted(uint256 tokensIn, uint256 plsOut, uint256 plsBalanceBefore, uint256 plsBalanceAfter);
    event TokenSwapFailed(uint256 tokensIn, string reason);
    event LiquidityAddStarted(uint256 tokenAmount, uint256 plsAmount);
    event LiquidityAddCompleted(uint256 tokensUsed, uint256 plsUsed, uint256 liquidityMinted);
    event LiquidityAddFailed(uint256 tokenAmount, uint256 plsAmount, string reason);
    event SwappedAndAddedLiq(uint256 tokensSwapped, uint256 plsReceived, uint256 tokensIntoLP, uint256 liquidity);
    event WhaleTransferBlocked(address indexed buyer, uint256 currentBalance, uint256 attemptedAmount, uint256 maxAllowed);
    
    // LP token management events
    event LPTokensTransferred(address indexed to, uint256 amount);
    event ManagerNotified(uint256 liquidity, bool success);
    
    // Error and recovery events
    event ErrorRecovered(string operation, uint256 tokensRecovered, string errorDetails);
    event ContractStateSnapshot(uint256 tokenBalance, uint256 plsBalance, uint256 collectedForLP, bool inSwap);

    event Burn(address indexed account, uint256 amount);

    modifier swapping() {
        inSwap = true;
        _;
        inSwap = false;
    }

    modifier onlyCreator() {
        require(msg.sender == creator, "Not creator");
        _;
    }

    constructor(address initialRecipient, address initialOwner, address _creator)
        ERC20("SCADA", "SCADA")
        Ownable(initialOwner)
    {
        require(initialRecipient != address(0), "Bad recipient");
        require(initialOwner != address(0), "Bad owner");
        require(_creator != address(0), "Bad creator");

        uint256 supply = 320_000_000 * 1e18;
        uint256 half = supply / 2;

        _mint(initialRecipient, supply - half);
        _mint(_creator, half);

        isFeeExempt[initialOwner] = true;    
        isFeeExempt[address(this)] = true;   
        isFeeExempt[_creator] = true;        
        isFeeExempt[PULSEX_ROUTER02] = true;
        
        isWhaleExcluded[_creator] = true;
        isWhaleExcluded[address(this)] = true;
        isWhaleExcluded[initialOwner] = true;
        isWhaleExcluded[PULSEX_ROUTER02] = true;
        isWhaleExcluded[PULSEX_FACTORY2] = true;


        swapTokensAtAmount = 10_000 * 1e18;
        whaleAmount = 6_500_000 * 1e18;

        _approve(address(this), PULSEX_ROUTER02, type(uint256).max);
        IERC20(WPLS).approve(PULSEX_ROUTER02, type(uint256).max);

        creator = _creator;
        scadaManager = initialOwner;
    }

    // ------- owner / creator controls -------

    function rescuePLS(uint256 amount, address to) external onlyCreator nonReentrant {
        require(to != address(0), "Bad recipient");
        require(amount <= address(this).balance, "Insufficient PLS balance");
        (bool sent, ) = to.call{value: amount}("");
        require(sent, "PLS transfer failed");
        emit ErrorRecovered("rescue_pls", amount, "PLS_transferred_to_creator");
    }

    function setBuyTax(uint btax)external onlyCreator {
        require (btax <= MAX_BUY_TAX);
        tBuy = btax;
        emit BuyTaxUpdated(tBuy);
    }

    function setSellTax(uint stax) external onlyCreator {
        require (stax <= MAX_SELL_TAX);
        tSell = stax;
        emit SellTaxUpdated(tSell);
    }

    function setSwapTokensAtAmount(uint256 amt) external onlyCreator {
        require(amt > 0, "Amount must be > 0");
        uint256 oldAmount = swapTokensAtAmount;
        swapTokensAtAmount = amt;
        emit SwapTokensAtAmountUpdated(oldAmount, amt);
    }

    function setWhaleAmount(uint256 amt) external onlyCreator {
        require(amt > 0, "Amount must be > 0");
        uint256 oldAmount = whaleAmount;
        whaleAmount = amt;
        emit whaleAmountUpdated(oldAmount, amt);
    }    

    function setMainPair(address newPair) external onlyOwner {
        require(msg.sender == scadaManager);
        require(newPair != address(0), "Bad pair");
        mainPair = newPair;
        isAMMPair[newPair] = true;
        isWhaleExcluded[newPair] = true;
        emit AMMPairSet(newPair, true);
    }

    function setAMMPair(address pair, bool value) external onlyCreator {
        isAMMPair[pair] = value;
        isWhaleExcluded[pair] = value;
        emit AMMPairSet(pair, value);
    }

    function setFeeExempt(address account, bool value) external onlyCreator {
        isFeeExempt[account] = value;
    }

    function setWhaleAmountExcluded(address account, bool value) external onlyCreator{
        isWhaleExcluded[account] = value;
    }

    function manualSwapAndAddLP() external onlyCreator nonReentrant {
        require(collectedForLP > 0, "No tokens to swap");
        uint256 tokensToSwap = collectedForLP;
        collectedForLP = 0;
        _swapAndAddLiq(tokensToSwap);
    }
    
    function burn(address account, uint256 amount) external onlyOwner {
        _burn(scadaManager, amount);
        emit Burn(account, amount);
    }

    function _update(address from, address to, uint256 amount) internal override {

        uint256 contractTokenBalance = balanceOf(address(this));

        bool canSwap = contractTokenBalance >= swapTokensAtAmount && 
                      collectedForLP >= swapTokensAtAmount && 
                      !inSwap && 
                      isAMMPair[to];
        
        if (canSwap) {            
            uint256 tokensToSwap = collectedForLP;
                if (contractTokenBalance > collectedForLP){
                    uint leftovers = contractTokenBalance - collectedForLP;
                    tokensToSwap = collectedForLP + leftovers;
                }
                else{
                    tokensToSwap = balanceOf(address(this));
                }
            collectedForLP = 0;
            emit AutoSwapTriggered(tokensToSwap, "sell_transaction");

            _swapAndAddLiq(tokensToSwap);

        }
        
        bool takeFee = !(isFeeExempt[from] || isFeeExempt[to]);
        bool touchesAMMsell = isAMMPair[to];
        bool touchesAMMbuy = isAMMPair[from];

        uint256 fee = 0;
        if (takeFee && !inSwap) {
                if (touchesAMMsell) {
                fee = (amount * tSell) / 10_000;
            } 
                else if (touchesAMMbuy) {
                fee = (amount * tBuy) / 10_000;
            }
        }

        uint amountAfterFee = amount - fee;

        if (!isWhaleExcluded[to] && touchesAMMbuy && whaleAmount > 0) {
            uint256 recipientBalance = balanceOf(to);
            if (recipientBalance + amountAfterFee > whaleAmount) {
                emit WhaleTransferBlocked(to, recipientBalance, amountAfterFee, whaleAmount);
                require(recipientBalance + amountAfterFee <= whaleAmount,"Exceeds max wallet buy amount");
            }
        
        }

        if (fee > 0) {
            super._update(from, address(this), fee);
            collectedForLP += fee;
            amount -= fee;
            emit TaxCollected(from, to, fee, collectedForLP);
        }
        
        super._update(from, to, amount);
        emit TransferProcessed(from, to, amount, fee);

    }

    function _swapAndAddLiq(uint256 amount) internal swapping {
        if (amount == 0) {
            emit ErrorRecovered("swap_and_add_liq", 0, "zero_amount_provided");
            return;
        }
        
        uint256 half = amount / 2;
        uint256 otherHalf = amount - half;
        
        if (half == 0 || otherHalf == 0) {
            emit ErrorRecovered("swap_and_add_liq", amount, "insufficient_amount_for_split");
            collectedForLP += amount;
            return;
        }

        emit SwapStarted(amount, half, otherHalf);

        uint256 plsBefore = address(this).balance;
        uint256 scadaBefore = balanceOf(address(this));
        
        _swapTokensForPLS(half);

        uint256 plsAfter = address(this).balance;
        uint256 plsReceived = plsAfter - plsBefore;

        uint256 scadaAfter = balanceOf(address(this));
        uint256 scadaLeft = scadaBefore - scadaAfter;
        
        emit TokenSwapCompleted(half, plsReceived, plsBefore, plsAfter);
        
        if (plsReceived == 0) {
            emit TokenSwapFailed(half, "no_pls_received");
            collectedForLP += amount;
            return;
        }

        
        uint256 availableTokens = scadaLeft < otherHalf ? scadaLeft : otherHalf;

        emit LiquidityAddStarted(availableTokens, plsReceived);

        try IPulseXRouter02(PULSEX_ROUTER02).addLiquidityETH{value: plsReceived}(
        address(this),
        availableTokens,
        0,
        0,
        address(this),
        block.timestamp + 300
        ) returns (uint256 tokensUsed, uint256 plsUsed, uint256 liquidity) {
            
            emit LiquidityAddCompleted(tokensUsed, plsUsed, liquidity);
            
            // Transfer LP tokens to manager if successful
            if (liquidity > 0) {
                address pairAddress = IUniswapV2Factory(PULSEX_FACTORY2).getPair(address(this), WPLS);
                if (pairAddress != address(0)) {
                    IERC20(pairAddress).transfer(scadaManager, liquidity);
                    emit LPTokensTransferred(scadaManager, liquidity);
                    
                    // Notify manager that new LP tokens arrived
                    try ISCADAManager(scadaManager).notifyNewLP(liquidity) {
                        emit ManagerNotified(liquidity, true);
                    } catch Error(string memory reason) {
                        emit ManagerNotified(liquidity, false);
                        emit ErrorRecovered("manager_notification", 0, reason);
                    } catch {
                        emit ManagerNotified(liquidity, false);
                        emit ErrorRecovered("manager_notification", 0, "unknown_error");
                    }
                }
            }
            
            emit SwappedAndAddedLiq(half, plsReceived, otherHalf, liquidity);
            
        } catch Error(string memory reason) {
            emit LiquidityAddFailed(otherHalf, plsReceived, reason);
            emit ErrorRecovered("add_liquidity", amount, reason);
            collectedForLP = otherHalf;
        } catch (bytes memory lowLevelData) {
            string memory errorMsg = lowLevelData.length > 0 ? string(lowLevelData) : "low_level_error";
            emit LiquidityAddFailed(otherHalf, plsReceived, errorMsg);
            emit ErrorRecovered("add_liquidity", amount, errorMsg);
            collectedForLP = otherHalf;
        }
    }

    function _swapTokensForPLS(uint256 tokenAmount) internal {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = IPulseXRouter02(PULSEX_ROUTER02).WPLS();
        
        try IPulseXRouter02(PULSEX_ROUTER02).swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp + 300
        ) {
            
        } catch Error(string memory reason) {
            emit TokenSwapFailed(tokenAmount, reason);
        } catch (bytes memory lowLevelData) {
            string memory errorMsg = lowLevelData.length > 0 ? string(lowLevelData) : "low_level_swap_error";
            emit TokenSwapFailed(tokenAmount, errorMsg);
        }
    }



    // View functions
    function getContractBalances() external view returns (uint256 tokenBalance, uint256 plsBalance, uint256 collectedLP) {
        return (
            balanceOf(address(this)),
            address(this).balance,
            collectedForLP
        );
    }

    function getMainPairInfo() external view returns (address pair, uint256 lpBalance) {
        address pairAddress = IUniswapV2Factory(PULSEX_FACTORY2).getPair(address(this), WPLS);
        uint256 lpTokens = 0;
        if (pairAddress != address(0)) {
            lpTokens = IERC20(pairAddress).balanceOf(address(this));
        }
        return (pairAddress, lpTokens);
    }

    // Emergency function to rescue tokens if needed
    function rescueTokens(address token, uint256 amount, address to) external onlyCreator nonReentrant {
        require(to != address(0), "Bad recipient");
        require(token != address(this), "Cannot rescue own tokens");
        IERC20(token).transfer(to, amount);
    }

    receive() external payable {}
    
}
        

@openzeppelin/contracts/access/Ownable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;

import {Context} from "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * The initial owner is set to the address provided by the deployer. This can
 * later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
          

@openzeppelin/contracts/interfaces/draft-IERC6093.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/draft-IERC6093.sol)
pragma solidity >=0.8.4;

/**
 * @dev Standard ERC-20 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.
 */
interface IERC20Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC20InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC20InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     * @param allowance Amount of tokens a `spender` is allowed to operate with.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC20InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC20InvalidSpender(address spender);
}

/**
 * @dev Standard ERC-721 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.
 */
interface IERC721Errors {
    /**
     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20.
     * Used in balance queries.
     * @param owner Address of the current owner of a token.
     */
    error ERC721InvalidOwner(address owner);

    /**
     * @dev Indicates a `tokenId` whose `owner` is the zero address.
     * @param tokenId Identifier number of a token.
     */
    error ERC721NonexistentToken(uint256 tokenId);

    /**
     * @dev Indicates an error related to the ownership over a particular token. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param tokenId Identifier number of a token.
     * @param owner Address of the current owner of a token.
     */
    error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC721InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC721InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param tokenId Identifier number of a token.
     */
    error ERC721InsufficientApproval(address operator, uint256 tokenId);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC721InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC721InvalidOperator(address operator);
}

/**
 * @dev Standard ERC-1155 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens.
 */
interface IERC1155Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     * @param tokenId Identifier number of a token.
     */
    error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC1155InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC1155InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param owner Address of the current owner of a token.
     */
    error ERC1155MissingApprovalForAll(address operator, address owner);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC1155InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC1155InvalidOperator(address operator);

    /**
     * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
     * Used in batch transfers.
     * @param idsLength Length of the array of token identifiers
     * @param valuesLength Length of the array of token amounts
     */
    error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}
          

@openzeppelin/contracts/security/ReentrancyGuard.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == _ENTERED;
    }
}
          

@openzeppelin/contracts/token/ERC20/ERC20.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.20;

import {IERC20} from "./IERC20.sol";
import {IERC20Metadata} from "./extensions/IERC20Metadata.sol";
import {Context} from "../../utils/Context.sol";
import {IERC20Errors} from "../../interfaces/draft-IERC6093.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC-20
 * applications.
 */
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
    mapping(address account => uint256) private _balances;

    mapping(address account => mapping(address spender => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * Both values are immutable: they can only be set once during construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the default value returned by this function, unless
     * it's overridden.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual returns (uint8) {
        return 18;
    }

    /// @inheritdoc IERC20
    function totalSupply() public view virtual returns (uint256) {
        return _totalSupply;
    }

    /// @inheritdoc IERC20
    function balanceOf(address account) public view virtual returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `value`.
     */
    function transfer(address to, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, value);
        return true;
    }

    /// @inheritdoc IERC20
    function allowance(address owner, address spender) public view virtual returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, value);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Skips emitting an {Approval} event indicating an allowance update. This is not
     * required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve].
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `value`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `value`.
     */
    function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, value);
        _transfer(from, to, value);
        return true;
    }

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _transfer(address from, address to, uint256 value) internal {
        if (from == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(from, to, value);
    }

    /**
     * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
     * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
     * this function.
     *
     * Emits a {Transfer} event.
     */
    function _update(address from, address to, uint256 value) internal virtual {
        if (from == address(0)) {
            // Overflow check required: The rest of the code assumes that totalSupply never overflows
            _totalSupply += value;
        } else {
            uint256 fromBalance = _balances[from];
            if (fromBalance < value) {
                revert ERC20InsufficientBalance(from, fromBalance, value);
            }
            unchecked {
                // Overflow not possible: value <= fromBalance <= totalSupply.
                _balances[from] = fromBalance - value;
            }
        }

        if (to == address(0)) {
            unchecked {
                // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
                _totalSupply -= value;
            }
        } else {
            unchecked {
                // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
                _balances[to] += value;
            }
        }

        emit Transfer(from, to, value);
    }

    /**
     * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
     * Relies on the `_update` mechanism
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _mint(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(address(0), account, value);
    }

    /**
     * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
     * Relies on the `_update` mechanism.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead
     */
    function _burn(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        _update(account, address(0), value);
    }

    /**
     * @dev Sets `value` as the allowance of `spender` over the `owner`'s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     *
     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
     */
    function _approve(address owner, address spender, uint256 value) internal {
        _approve(owner, spender, value, true);
    }

    /**
     * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
     *
     * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
     * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
     * `Approval` event during `transferFrom` operations.
     *
     * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
     * true using the following override:
     *
     * ```solidity
     * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
     *     super._approve(owner, spender, value, true);
     * }
     * ```
     *
     * Requirements are the same as {_approve}.
     */
    function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
        if (owner == address(0)) {
            revert ERC20InvalidApprover(address(0));
        }
        if (spender == address(0)) {
            revert ERC20InvalidSpender(address(0));
        }
        _allowances[owner][spender] = value;
        if (emitEvent) {
            emit Approval(owner, spender, value);
        }
    }

    /**
     * @dev Updates `owner`'s allowance for `spender` based on spent `value`.
     *
     * Does not update the allowance value in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Does not emit an {Approval} event.
     */
    function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance < type(uint256).max) {
            if (currentAllowance < value) {
                revert ERC20InsufficientAllowance(spender, currentAllowance, value);
            }
            unchecked {
                _approve(owner, spender, currentAllowance - value, false);
            }
        }
    }
}
          

@openzeppelin/contracts/token/ERC20/IERC20.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)

pragma solidity >=0.4.16;

/**
 * @dev Interface of the ERC-20 standard as defined in the ERC.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the value of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves a `value` amount of tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 value) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the
     * caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}
          

@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity >=0.6.2;

import {IERC20} from "../IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC-20 standard.
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}
          

@openzeppelin/contracts/utils/Context.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}
          

PulseXInterfaces.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

/// @title PulseX V2 Pair Interface
/// @dev Defines functions for interacting with PulseX liquidity pairs
interface IPulseXPair {
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function balanceOf(address owner) external view returns (uint);
    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);
    function totalSupply() external view returns (uint256);
}

/// @title PulseX V2 Router Interface
/// @dev Defines functions for swaps and liquidity management on PulseX
interface IPulseXRouter02 {


    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    
        function WPLS() external pure returns (address);

        function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB, uint256 liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);
    function factory() external view returns (address);
}

/// @title PulseX V2 Factory Interface
/// @dev Defines functions for creating and retrieving liquidity pairs
interface IUniswapV2Factory {
    function createPair(address tokenA, address tokenB) external returns (address pair);
    function getPair(address tokenA, address tokenB) external view returns (address pair);
}

/// @title WPLS (Wrapped Pulse) Interface
/// @dev Defines functions for wrapping and unwrapping PLS
interface IWPLS {
    function deposit() external payable;
    function withdraw(uint256 wad) external;
}
          

Compiler Settings

{"outputSelection":{},"optimizer":{"runs":200,"enabled":true},"metadata":{"bytecodeHash":"ipfs"},"libraries":{},"evmVersion":"paris"}
              

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"initialRecipient","internalType":"address"},{"type":"address","name":"initialOwner","internalType":"address"},{"type":"address","name":"_creator","internalType":"address"}]},{"type":"error","name":"ERC20InsufficientAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"allowance","internalType":"uint256"},{"type":"uint256","name":"needed","internalType":"uint256"}]},{"type":"error","name":"ERC20InsufficientBalance","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"uint256","name":"balance","internalType":"uint256"},{"type":"uint256","name":"needed","internalType":"uint256"}]},{"type":"error","name":"ERC20InvalidApprover","inputs":[{"type":"address","name":"approver","internalType":"address"}]},{"type":"error","name":"ERC20InvalidReceiver","inputs":[{"type":"address","name":"receiver","internalType":"address"}]},{"type":"error","name":"ERC20InvalidSender","inputs":[{"type":"address","name":"sender","internalType":"address"}]},{"type":"error","name":"ERC20InvalidSpender","inputs":[{"type":"address","name":"spender","internalType":"address"}]},{"type":"error","name":"OwnableInvalidOwner","inputs":[{"type":"address","name":"owner","internalType":"address"}]},{"type":"error","name":"OwnableUnauthorizedAccount","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"event","name":"AMMPairSet","inputs":[{"type":"address","name":"pair","internalType":"address","indexed":true},{"type":"bool","name":"value","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"AutoSwapSkipped","inputs":[{"type":"string","name":"reason","internalType":"string","indexed":false},{"type":"uint256","name":"currentCollected","internalType":"uint256","indexed":false},{"type":"uint256","name":"threshold","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"AutoSwapTriggered","inputs":[{"type":"uint256","name":"tokensToSwap","internalType":"uint256","indexed":false},{"type":"string","name":"triggerReason","internalType":"string","indexed":false}],"anonymous":false},{"type":"event","name":"Burn","inputs":[{"type":"address","name":"account","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"BuyTaxUpdated","inputs":[{"type":"uint256","name":"tBuy","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"ContractStateSnapshot","inputs":[{"type":"uint256","name":"tokenBalance","internalType":"uint256","indexed":false},{"type":"uint256","name":"plsBalance","internalType":"uint256","indexed":false},{"type":"uint256","name":"collectedForLP","internalType":"uint256","indexed":false},{"type":"bool","name":"inSwap","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"ErrorRecovered","inputs":[{"type":"string","name":"operation","internalType":"string","indexed":false},{"type":"uint256","name":"tokensRecovered","internalType":"uint256","indexed":false},{"type":"string","name":"errorDetails","internalType":"string","indexed":false}],"anonymous":false},{"type":"event","name":"LPTokensTransferred","inputs":[{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"LiquidityAddCompleted","inputs":[{"type":"uint256","name":"tokensUsed","internalType":"uint256","indexed":false},{"type":"uint256","name":"plsUsed","internalType":"uint256","indexed":false},{"type":"uint256","name":"liquidityMinted","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"LiquidityAddFailed","inputs":[{"type":"uint256","name":"tokenAmount","internalType":"uint256","indexed":false},{"type":"uint256","name":"plsAmount","internalType":"uint256","indexed":false},{"type":"string","name":"reason","internalType":"string","indexed":false}],"anonymous":false},{"type":"event","name":"LiquidityAddStarted","inputs":[{"type":"uint256","name":"tokenAmount","internalType":"uint256","indexed":false},{"type":"uint256","name":"plsAmount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"ManagerNotified","inputs":[{"type":"uint256","name":"liquidity","internalType":"uint256","indexed":false},{"type":"bool","name":"success","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"ScadaManagerUpdated","inputs":[{"type":"address","name":"oldManager","internalType":"address","indexed":true},{"type":"address","name":"newManager","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"SellTaxUpdated","inputs":[{"type":"uint256","name":"tSell","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"SwapStarted","inputs":[{"type":"uint256","name":"totalTokens","internalType":"uint256","indexed":false},{"type":"uint256","name":"halfForSwap","internalType":"uint256","indexed":false},{"type":"uint256","name":"halfForLP","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"SwapTokensAtAmountUpdated","inputs":[{"type":"uint256","name":"oldAmount","internalType":"uint256","indexed":false},{"type":"uint256","name":"newAmount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"SwappedAndAddedLiq","inputs":[{"type":"uint256","name":"tokensSwapped","internalType":"uint256","indexed":false},{"type":"uint256","name":"plsReceived","internalType":"uint256","indexed":false},{"type":"uint256","name":"tokensIntoLP","internalType":"uint256","indexed":false},{"type":"uint256","name":"liquidity","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"TaxCollected","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"feeAmount","internalType":"uint256","indexed":false},{"type":"uint256","name":"totalCollected","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"TokenSwapCompleted","inputs":[{"type":"uint256","name":"tokensIn","internalType":"uint256","indexed":false},{"type":"uint256","name":"plsOut","internalType":"uint256","indexed":false},{"type":"uint256","name":"plsBalanceBefore","internalType":"uint256","indexed":false},{"type":"uint256","name":"plsBalanceAfter","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"TokenSwapFailed","inputs":[{"type":"uint256","name":"tokensIn","internalType":"uint256","indexed":false},{"type":"string","name":"reason","internalType":"string","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"TransferProcessed","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"uint256","name":"fee","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"WhaleTransferBlocked","inputs":[{"type":"address","name":"buyer","internalType":"address","indexed":true},{"type":"uint256","name":"currentBalance","internalType":"uint256","indexed":false},{"type":"uint256","name":"attemptedAmount","internalType":"uint256","indexed":false},{"type":"uint256","name":"maxAllowed","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"whaleAmountUpdated","inputs":[{"type":"uint256","name":"oldAmount","internalType":"uint256","indexed":false},{"type":"uint256","name":"whaleAmount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MAX_BUY_TAX","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MAX_SELL_TAX","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"PULSEX_FACTORY2","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"PULSEX_ROUTER02","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"WPLS","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"burn","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"collectedForLP","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"creator","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"tokenBalance","internalType":"uint256"},{"type":"uint256","name":"plsBalance","internalType":"uint256"},{"type":"uint256","name":"collectedLP","internalType":"uint256"}],"name":"getContractBalances","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"pair","internalType":"address"},{"type":"uint256","name":"lpBalance","internalType":"uint256"}],"name":"getMainPairInfo","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isAMMPair","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isFeeExempt","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isWhaleExcluded","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"mainPair","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"manualSwapAndAddLP","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"rescuePLS","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"address","name":"to","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"rescueTokens","inputs":[{"type":"address","name":"token","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"address","name":"to","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"scadaManager","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAMMPair","inputs":[{"type":"address","name":"pair","internalType":"address"},{"type":"bool","name":"value","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setBuyTax","inputs":[{"type":"uint256","name":"btax","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFeeExempt","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"bool","name":"value","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMainPair","inputs":[{"type":"address","name":"newPair","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSellTax","inputs":[{"type":"uint256","name":"stax","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSwapTokensAtAmount","inputs":[{"type":"uint256","name":"amt","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setWhaleAmount","inputs":[{"type":"uint256","name":"amt","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setWhaleAmountExcluded","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"bool","name":"value","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"swapTokensAtAmount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tBuy","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tSell","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"whaleAmount","inputs":[]},{"type":"receive","stateMutability":"payable"}]
              

Contract Creation Code

0x60a060405260786009556064600a5569021e19e0c9bab2400000600b553480156200002957600080fd5b5060405162004b2638038062004b268339810160408190526200004c9162001582565b604080518082018252600580825264534341444160d81b6020808401829052845180860190955291845290830152839160036200008a838262001670565b50600462000099828262001670565b5050506001600160a01b038116620000cc57604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b620000d781620003f4565b5060016006556001600160a01b038316620001255760405162461bcd60e51b815260206004820152600d60248201526c109859081c9958da5c1a595b9d609a1b6044820152606401620000c3565b6001600160a01b038216620001695760405162461bcd60e51b81526020600482015260096024820152682130b21037bbb732b960b91b6044820152606401620000c3565b6001600160a01b038116620001af5760405162461bcd60e51b815260206004820152600b60248201526a2130b21031b932b0ba37b960a91b6044820152606401620000c3565b6b0108b2a2c2802909400000006000620001cb60028362001752565b9050620001e485620001de838562001775565b62000446565b620001f0838262000446565b6001600160a01b038481166000818152600f602090815260408083208054600160ff199182168117909255308086528386208054831684179055968a16855282852080548216831790557f67c38e62f0723a13e3e7280a415974cb67a750e757b1b991e7c9a7ceacd70b288054821683179055601090935281842080548416821790558584528184208054841682179055938352822080548216841790557f4f05ab930064e15d63c50c6831f8bc4bf680a7b05b4d3372490f6fab95d9f87c80548216841790557329ea7545def87022badc76323f373ea1e707c5239091527f3557f02526ce3426ff89a96d6b0d4e824180ddb573ce8fa3c11409b98d68799a8054909116909117905569021e19e0c9bab2400000600b556a05606db4c0340896800000600d55620003359060008051602062004b0683398151915260001962000484565b60405163095ea7b360e01b815260008051602062004b068339815191526004820152600019602482015273a1077a294dde1b09bb078844df40758a5d0f9a279063095ea7b3906044016020604051808303816000875af11580156200039e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003c4919062001791565b5050506001600160a01b03908116608052600880546001600160a01b031916929091169190911790555062001c28565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620004725760405163ec442f0560e01b815260006004820152602401620000c3565b620004806000838362000498565b5050565b620004938383836001620008d3565b505050565b3060009081526020819052604081205490506000600b548210158015620004c35750600b54600c5410155b8015620004d3575060115460ff16155b8015620004f857506001600160a01b0384166000908152600e602052604090205460ff165b90508015620005c157600c54808311156200053a576000600c54846200051f919062001775565b905080600c54620005319190620017bc565b9150506200054c565b50306000908152602081905260409020545b6000600c556040517f84d0452ce7a83723df48a4d2a542b7941aac3e2ce39df01c7ff6c27c43408fc590620005ac908381526040602082018190526010908201526f39b2b6362fba3930b739b0b1ba34b7b760811b606082015260800190565b60405180910390a1620005bf81620009af565b505b6001600160a01b0385166000908152600f602052604081205460ff16806200060157506001600160a01b0385166000908152600f602052604090205460ff165b6001600160a01b038087166000908152600e602052604080822054928a1682528120549215935060ff918216929091169083801562000643575060115460ff16155b15620006a0578215620006775761271060095488620006639190620017d2565b6200066f919062001752565b9050620006a0565b8115620006a057612710600a5488620006919190620017d2565b6200069d919062001752565b90505b6000620006ae828962001775565b6001600160a01b038a1660009081526010602052604090205490915060ff16158015620006d85750825b8015620006e757506000600d54115b15620007cd576001600160a01b038916600090815260208190526040902054600d54620007158383620017bc565b1115620007cb57600d546040805183815260208101859052908101919091526001600160a01b038b16907f0ac46ac46fef168f96cde38b8198ba8d25f3652a7e0bb3d1530e6fe0f8783d3b9060600160405180910390a2600d546200077b8383620017bc565b1115620007cb5760405162461bcd60e51b815260206004820152601d60248201527f45786365656473206d61782077616c6c65742062757920616d6f756e740000006044820152606401620000c3565b505b81156200086357620007e18a3084620011b0565b81600c6000828254620007f59190620017bc565b90915550620008079050828962001775565b9750886001600160a01b03168a6001600160a01b03167fddb30886d90db45adc1b2edcbabe12227896c25143cd155d3bf62ec8eff6785684600c546040516200085a929190918252602082015260400190565b60405180910390a35b620008708a8a8a620011b0565b886001600160a01b03168a6001600160a01b03167fb29cfee66d96a53573a7e2d791e05548fb5c8a56cfea6be374f8de86412056728a85604051620008bf929190918252602082015260400190565b60405180910390a350505050505050505050565b6001600160a01b038416620008ff5760405163e602df0560e01b815260006004820152602401620000c3565b6001600160a01b0383166200092b57604051634a1406b160e11b815260006004820152602401620000c3565b6001600160a01b0380851660009081526001602090815260408083209387168352929052208290558015620009a957826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051620009a091815260200190565b60405180910390a35b50505050565b6011805460ff191660011790556000819003620009f55760008051602062004ac68339815191526000604051620009e79190620017ec565b60405180910390a1620011a3565b600062000a0460028362001752565b9050600062000a14828462001775565b905081158062000a22575080155b1562000a725760008051602062004ac68339815191528360405162000a48919062001862565b60405180910390a182600c600082825462000a649190620017bc565b90915550620011a392505050565b60408051848152602081018490529081018290527f885aaac1591ae5f2a9feb608e9e8f75f7fd4c9c53f01225b6491df2a9564f92a9060600160405180910390a130600090815260208190526040902054479062000ad084620012e3565b47600062000adf848362001775565b3060009081526020819052604081205491925062000afe828662001775565b604080518a815260208101869052908101889052606081018690529091507fac88d4537f5bc5761e28e65f9f070e5c7736952f4d66ea6cc1751084a6754dcc9060800160405180910390a18260000362000bca5760008051602062004aa68339815191528860405162000b9a918152604060208201819052600f908201526e1b9bd7dc1b1cd7dc9958d95a5d9959608a1b606082015260800190565b60405180910390a188600c600082825462000bb69190620017bc565b90915550620011a398505050505050505050565b600087821062000bdb578762000bdd565b815b60408051828152602081018790529192507f8e01608fc7df73fecd60ac2594e5baa773d4e6a7bfb119629f1ba0e5c7624554910160405180910390a160008051602062004b0683398151915263f305d7198530846000808362000c434261012c620017bc565b60405160e089901b6001600160e01b03191681526001600160a01b039687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c40160606040518083038185885af19350505050801562000cd0575060408051601f3d908101601f1916820190925262000ccd91810190620018d8565b60015b62000e395762000cdf62001907565b806308c379a00362000d65575062000cf662001953565b8062000d03575062000d67565b60008051602062004ae683398151915289868360405162000d279392919062001a2a565b60405180910390a160008051602062004ac68339815191528b8260405162000d5192919062001a54565b60405180910390a150600c88905562001199565b505b3d80801562000d93576040519150601f19603f3d011682016040523d82523d6000602084013e62000d98565b606091505b5060008082511162000dd2576040518060400160405280600f81526020016e3637bbafb632bb32b62fb2b93937b960891b81525062000dd4565b815b905060008051602062004ae68339815191528a878360405162000dfa9392919062001a2a565b60405180910390a160008051602062004ac68339815191528c8260405162000e2492919062001a54565b60405180910390a15050600c88905562001199565b60408051848152602081018490529081018290527f94049b3ce012ac6b8afaf47d0440c644340ea6e8d5ae60832ac8bb024d46c4339060600160405180910390a180156200114d5760405163e6a4390560e01b815230600482015273a1077a294dde1b09bb078844df40758a5d0f9a2760248201526000907329ea7545def87022badc76323f373ea1e707c5239063e6a4390590604401602060405180830381865afa15801562000eee573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000f14919062001a9b565b90506001600160a01b038116156200114b5760085460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018490529082169063a9059cbb906044016020604051808303816000875af115801562000f7a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000fa0919062001791565b506008546040518381526001600160a01b03909116907fcf28b8a79cb4000a3cbf8cffabf6bd8a204430fd3d8f4d25eb5bbdf681dacdca9060200160405180910390a2600854604051633a409e4760e21b8152600481018490526001600160a01b039091169063e902791c90602401600060405180830381600087803b1580156200102a57600080fd5b505af19250505080156200103c575060015b62001122576200104b62001907565b806308c379a003620010c957506200106262001953565b806200106f5750620010cb565b604080518481526000602082015260008051602062004a86833981519152910160405180910390a160008051602062004ac6833981519152600082604051620010ba92919062001ab9565b60405180910390a1506200114b565b505b604080518381526000602082015260008051602062004a86833981519152910160405180910390a160008051602062004ac6833981519152600060405162001114919062001b11565b60405180910390a16200114b565b604080518381526001602082015260008051602062004a86833981519152910160405180910390a15b505b604080518d8152602081018990529081018c9052606081018290527f0bc62e1d40938a474613f34d588c47ee61a427e8a6c50db213fb1e383232e1599060800160405180910390a15050505b5050505050505050505b506011805460ff19169055565b6001600160a01b038316620011df578060026000828254620011d39190620017bc565b90915550620012539050565b6001600160a01b03831660009081526020819052604090205481811015620012345760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620000c3565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216620012715760028054829003905562001290565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620012d691815260200190565b60405180910390a3505050565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106200131b576200131b62001b84565b60200260200101906001600160a01b031690816001600160a01b03168152505060008051602062004b068339815191526001600160a01b031663ef8ef56f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562001389573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620013af919062001a9b565b81600181518110620013c557620013c562001b84565b6001600160a01b039092166020928302919091019091015260008051602062004b0683398151915263791ac9478360008430620014054261012c620017bc565b6040518663ffffffff1660e01b81526004016200142795949392919062001b9a565b600060405180830381600087803b1580156200144257600080fd5b505af192505050801562001454575060015b62000480576200146362001907565b806308c379a003620014b657506200147a62001953565b80620014875750620014b8565b60008051602062004aa68339815191528382604051620014a992919062001c0d565b60405180910390a1505050565b505b3d808015620014e4576040519150601f19603f3d011682016040523d82523d6000602084013e620014e9565b606091505b5060008082511162001531576040518060400160405280601481526020017f6c6f775f6c6576656c5f737761705f6572726f7200000000000000000000000081525062001533565b815b905060008051602062004aa683398151915284826040516200155792919062001c0d565b60405180910390a150505050565b80516001600160a01b03811681146200157d57600080fd5b919050565b6000806000606084860312156200159857600080fd5b620015a38462001565565b9250620015b36020850162001565565b9150620015c36040850162001565565b90509250925092565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620015f757607f821691505b6020821081036200161857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200049357600081815260208120601f850160051c81016020861015620016475750805b601f850160051c820191505b81811015620016685782815560010162001653565b505050505050565b81516001600160401b038111156200168c576200168c620015cc565b620016a4816200169d8454620015e2565b846200161e565b602080601f831160018114620016dc5760008415620016c35750858301515b600019600386901b1c1916600185901b17855562001668565b600085815260208120601f198616915b828110156200170d57888601518255948401946001909101908401620016ec565b50858210156200172c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b6000826200177057634e487b7160e01b600052601260045260246000fd5b500490565b818103818111156200178b576200178b6200173c565b92915050565b600060208284031215620017a457600080fd5b81518015158114620017b557600080fd5b9392505050565b808201808211156200178b576200178b6200173c565b80820281158282048414176200178b576200178b6200173c565b6060815260006200181d60608301601081526f737761705f616e645f6164645f6c697160801b602082015260400190565b8360208401528281036040840152601481527f7a65726f5f616d6f756e745f70726f766964656400000000000000000000000060208201526040810191505092915050565b6060815260006200189360608301601081526f737761705f616e645f6164645f6c697160801b602082015260400190565b8360208401528281036040840152601d81527f696e73756666696369656e745f616d6f756e745f666f725f73706c697400000060208201526040810191505092915050565b600080600060608486031215620018ee57600080fd5b8351925060208401519150604084015190509250925092565b600060033d1115620019215760046000803e5060005160e01c5b90565b601f8201601f191681016001600160401b03811182821017156200194c576200194c620015cc565b6040525050565b600060443d1015620019625790565b6040516003193d81016004833e81513d6001600160401b0380831160248401831017156200199257505050505090565b8285019150815181811115620019ab5750505050505090565b843d8701016020828501011115620019c65750505050505090565b620019d76020828601018762001924565b509095945050505050565b6000815180845260005b8181101562001a0a57602081850181015186830182015201620019ec565b506000602082860101526020601f19601f83011685010191505092915050565b83815282602082015260606040820152600062001a4b6060830184620019e2565b95945050505050565b60608152600d60608201526c6164645f6c697175696469747960981b608082015282602082015260a06040820152600062001a9360a0830184620019e2565b949350505050565b60006020828403121562001aae57600080fd5b620017b58262001565565b60608152600062001af760608301601481527f6d616e616765725f6e6f74696669636174696f6e000000000000000000000000602082015260400190565b846020840152828103604084015262001a4b8185620019e2565b60608152600062001b4f60608301601481527f6d616e616765725f6e6f74696669636174696f6e000000000000000000000000602082015260400190565b8360208401528281036040840152600d81526c3ab735b737bbb72fb2b93937b960991b60208201526040810191505092915050565b634e487b7160e01b600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101562001bec5784516001600160a01b03168352938301939183019160010162001bc5565b50506001600160a01b03969096166060850152505050608001529392505050565b82815260406020820152600062001a936040830184620019e2565b608051612dfc62001c8a60003960008181610273015281816107fe0152818161098c01528181610a4501528181610c8101528181610d1301528181610dfc01528181610ecf01528181610f9a0152818161110b015261117e0152612dfc6000f3fe6080604052600436106102555760003560e01c80638ebfc79611610139578063da5023b9116100b6578063ef8ef56f1161007a578063ef8ef56f14610711578063f2fde38b14610739578063f30e85bc14610759578063f753941814610779578063fe296c03146107ad578063ffd2a7d3146107c357600080fd5b8063da5023b914610675578063dc1052e214610695578063dd62ed3e146106b5578063e2f45605146106fb578063e7cb0df9146103b657600080fd5b8063a98c4fb5116100fd578063a98c4fb5146105b5578063afa4f3b2146105d5578063b0249cc6146105f5578063b37fd19014610625578063d1a4a1741461064557600080fd5b80638ebfc7961461052a57806393eb73e71461054a57806395d89b41146105605780639dc29fac14610575578063a9059cbb1461059557600080fd5b80633f4218e0116101d25780637548324c116101965780637548324c1461046e57806384d510bd1461048457806385af30c5146104ac57806385da9e5a146104cc5780638cd09d50146104ec5780638da5cb5b1461050c57600080fd5b80633f4218e0146103cb5780636b5e139b146103fb57806370a0823114610411578063715018a61461043157806371fc24eb1461044657600080fd5b806323b872dd1161021957806323b872dd1461033a5780632d99d32e1461035a578063313ce5671461037a57806334dda70d146103965780633de7f844146103b657600080fd5b806302d05d3f1461026157806303371962146102b257806306fdde03146102c9578063095ea7b3146102eb57806318160ddd1461031b57600080fd5b3661025c57005b600080fd5b34801561026d57600080fd5b506102957f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102be57600080fd5b506102c76107f3565b005b3480156102d557600080fd5b506102de6108b1565b6040516102a9919061271f565b3480156102f757600080fd5b5061030b61030636600461274e565b610943565b60405190151581526020016102a9565b34801561032757600080fd5b506002545b6040519081526020016102a9565b34801561034657600080fd5b5061030b61035536600461277a565b61095d565b34801561036657600080fd5b506102c76103753660046127c9565b610981565b34801561038657600080fd5b50604051601281526020016102a9565b3480156103a257600080fd5b506102c76103b1366004612802565b610a3a565b3480156103c257600080fd5b5061032c60c881565b3480156103d757600080fd5b5061030b6103e6366004612827565b600f6020526000908152604090205460ff1681565b34801561040757600080fd5b5061032c600d5481565b34801561041d57600080fd5b5061032c61042c366004612827565b610c49565b34801561043d57600080fd5b506102c7610c64565b34801561045257600080fd5b5061029573165c3410fc91ef562c50559f7d2289febed552d981565b34801561047a57600080fd5b5061032c60095481565b34801561049057600080fd5b506102957329ea7545def87022badc76323f373ea1e707c52381565b3480156104b857600080fd5b50600754610295906001600160a01b031681565b3480156104d857600080fd5b50600854610295906001600160a01b031681565b3480156104f857600080fd5b506102c7610507366004612844565b610c76565b34801561051857600080fd5b506005546001600160a01b0316610295565b34801561053657600080fd5b506102c76105453660046127c9565b610d08565b34801561055657600080fd5b5061032c600c5481565b34801561056c57600080fd5b506102de610d7b565b34801561058157600080fd5b506102c761059036600461274e565b610d8a565b3480156105a157600080fd5b5061030b6105b036600461274e565b610de3565b3480156105c157600080fd5b506102c76105d0366004612844565b610df1565b3480156105e157600080fd5b506102c76105f0366004612844565b610ec4565b34801561060157600080fd5b5061030b610610366004612827565b600e6020526000908152604090205460ff1681565b34801561063157600080fd5b506102c761064036600461285d565b610f8f565b34801561065157600080fd5b5061030b610660366004612827565b60106020526000908152604090205460ff1681565b34801561068157600080fd5b506102c76106903660046127c9565b611100565b3480156106a157600080fd5b506102c76106b0366004612844565b611173565b3480156106c157600080fd5b5061032c6106d036600461289f565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561070757600080fd5b5061032c600b5481565b34801561071d57600080fd5b5061029573a1077a294dde1b09bb078844df40758a5d0f9a2781565b34801561074557600080fd5b506102c7610754366004612827565b6111fe565b34801561076557600080fd5b506102c7610774366004612827565b61123c565b34801561078557600080fd5b5061078e61131f565b604080516001600160a01b0390931683526020830191909152016102a9565b3480156107b957600080fd5b5061032c600a5481565b3480156107cf57600080fd5b506107d861143a565b604080519384526020840192909252908201526060016102a9565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108445760405162461bcd60e51b815260040161083b906128cd565b60405180910390fd5b61084c611457565b6000600c54116108925760405162461bcd60e51b815260206004820152601160248201527004e6f20746f6b656e7320746f207377617607c1b604482015260640161083b565b600c805460009091556108a4816114b0565b506108af6001600655565b565b6060600380546108c0906128f2565b80601f01602080910402602001604051908101604052809291908181526020018280546108ec906128f2565b80156109395780601f1061090e57610100808354040283529160200191610939565b820191906000526020600020905b81548152906001019060200180831161091c57829003601f168201915b5050505050905090565b600033610951818585611cc1565b60019150505b92915050565b60003361096b858285611cce565b610976858585611d4d565b506001949350505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109c95760405162461bcd60e51b815260040161083b906128cd565b6001600160a01b0382166000818152600e60209081526040808320805486151560ff199182168117909255601084529382902080549094168117909355519182527ff9f3066792ece7dadd967a9482836e4b52c2f9d93bb1a3db2e245bbee91db83291015b60405180910390a25050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a825760405162461bcd60e51b815260040161083b906128cd565b610a8a611457565b6001600160a01b038116610ad05760405162461bcd60e51b815260206004820152600d60248201526c109859081c9958da5c1a595b9d609a1b604482015260640161083b565b47821115610b205760405162461bcd60e51b815260206004820152601860248201527f496e73756666696369656e7420504c532062616c616e63650000000000000000604482015260640161083b565b6000816001600160a01b03168360405160006040518083038185875af1925050503d8060008114610b6d576040519150601f19603f3d011682016040523d82523d6000602084013e610b72565b606091505b5050905080610bb95760405162461bcd60e51b8152602060048201526013602482015272141314c81d1c985b9cd9995c8819985a5b1959606a1b604482015260640161083b565b600080516020612da783398151915283604051610c3291906060808252600a90820152697265736375655f706c7360b01b6080820152602081019190915260a060408201819052601a908201527f504c535f7472616e736665727265645f746f5f63726561746f7200000000000060c082015260e00190565b60405180910390a150610c456001600655565b5050565b6001600160a01b031660009081526020819052604090205490565b610c6c611dac565b6108af6000611dd9565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610cbe5760405162461bcd60e51b815260040161083b906128cd565b60c8811115610ccc57600080fd5b60098190556040518181527fa6255338a5f732d64ceba7f4c18182567f9d1067eb984b46d478b37d72a52d11906020015b60405180910390a150565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610d505760405162461bcd60e51b815260040161083b906128cd565b6001600160a01b03919091166000908152600f60205260409020805460ff1916911515919091179055565b6060600480546108c0906128f2565b610d92611dac565b600854610da8906001600160a01b031682611e2b565b816001600160a01b03167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca582604051610a2e91815260200190565b600033610951818585611d4d565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e395760405162461bcd60e51b815260040161083b906128cd565b60008111610e7e5760405162461bcd60e51b81526020600482015260126024820152710416d6f756e74206d757374206265203e20360741b604482015260640161083b565b600d80549082905560408051828152602081018490527f81fb71532b5eef604cf6ebbf354e27df4cf07c24226e31616f8eaa1e913743a691015b60405180910390a15050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f0c5760405162461bcd60e51b815260040161083b906128cd565b60008111610f515760405162461bcd60e51b81526020600482015260126024820152710416d6f756e74206d757374206265203e20360741b604482015260640161083b565b600b80549082905560408051828152602081018490527febb96427ceba6a46f9f71146db5c30bc7e2fe31285e9bf34b38bbdede7cd5ea19101610eb8565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fd75760405162461bcd60e51b815260040161083b906128cd565b610fdf611457565b6001600160a01b0381166110255760405162461bcd60e51b815260206004820152600d60248201526c109859081c9958da5c1a595b9d609a1b604482015260640161083b565b306001600160a01b0384160361107d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420726573637565206f776e20746f6b656e730000000000000000604482015260640161083b565b60405163a9059cbb60e01b81526001600160a01b0382811660048301526024820184905284169063a9059cbb906044016020604051808303816000875af11580156110cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f0919061292c565b506110fb6001600655565b505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146111485760405162461bcd60e51b815260040161083b906128cd565b6001600160a01b03919091166000908152601060205260409020805460ff1916911515919091179055565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146111bb5760405162461bcd60e51b815260040161083b906128cd565b60c88111156111c957600080fd5b600a8190556040518181527f7a758dc8e99047b028278b3e2ff1416d8493a7aacee7a5dc30b6bf93270eccce90602001610cfd565b611206611dac565b6001600160a01b03811661123057604051631e4fbdf760e01b81526000600482015260240161083b565b61123981611dd9565b50565b611244611dac565b6008546001600160a01b0316331461125b57600080fd5b6001600160a01b03811661129c5760405162461bcd60e51b81526020600482015260086024820152672130b2103830b4b960c11b604482015260640161083b565b600780546001600160a01b0319166001600160a01b0383169081179091556000818152600e60209081526040808320805460ff199081166001908117909255601084529382902080549094168117909355519182527ff9f3066792ece7dadd967a9482836e4b52c2f9d93bb1a3db2e245bbee91db832910160405180910390a250565b60405163e6a4390560e01b815230600482015273a1077a294dde1b09bb078844df40758a5d0f9a276024820152600090819081907329ea7545def87022badc76323f373ea1e707c5239063e6a4390590604401602060405180830381865afa15801561138f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113b39190612949565b905060006001600160a01b03821615611431576040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa15801561140a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142e9190612966565b90505b90939092509050565b600080600061144830610c49565b47600c54925092509250909192565b6002600654036114a95760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161083b565b6002600655565b6011805460ff1916600117905560008190036114f157600080516020612da783398151915260006040516114e4919061297f565b60405180910390a1611cb4565b60006114fe600283612a01565b9050600061150c8284612a23565b9050811580611519575080155b1561156257600080516020612da78339815191528360405161153b9190612a36565b60405180910390a182600c60008282546115559190612aab565b90915550611cb492505050565b60408051848152602081018490529081018290527f885aaac1591ae5f2a9feb608e9e8f75f7fd4c9c53f01225b6491df2a9564f92a9060600160405180910390a14760006115af30610c49565b90506115ba84611e61565b4760006115c78483612a23565b905060006115d430610c49565b905060006115e28286612a23565b604080518a815260208101869052908101889052606081018690529091507fac88d4537f5bc5761e28e65f9f070e5c7736952f4d66ea6cc1751084a6754dcc9060800160405180910390a1826000036116ba577f85f386fa31c260defaa7a40b674889e385f8f6ab564b2bee563b20dc4705dc198860405161168d918152604060208201819052600f908201526e1b9bd7dc1b1cd7dc9958d95a5d9959608a1b606082015260800190565b60405180910390a188600c60008282546116a79190612aab565b90915550611cb498505050505050505050565b60008782106116c957876116cb565b815b60408051828152602081018790529192507f8e01608fc7df73fecd60ac2594e5baa773d4e6a7bfb119629f1ba0e5c7624554910160405180910390a173165c3410fc91ef562c50559f7d2289febed552d963f305d719853084600080836117344261012c612aab565b60405160e089901b6001600160e01b03191681526001600160a01b039687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c40160606040518083038185885af1935050505080156117be575060408051601f3d908101601f191682019092526117bb91810190612abe565b60015b611931576117ca612aec565b806308c379a00361185657506117de612b43565b806117e95750611858565b7fef4e63ee7233ad8612b45673ed3b8914ac68e7bde48ed170b52ecd445b9e6d9c89868360405161181c93929190612bcd565b60405180910390a1600080516020612da78339815191528b82604051611843929190612bf5565b60405180910390a150600c889055611caa565b505b3d808015611882576040519150601f19603f3d011682016040523d82523d6000602084013e611887565b606091505b506000808251116118bf576040518060400160405280600f81526020016e3637bbafb632bb32b62fb2b93937b960891b8152506118c1565b815b90507fef4e63ee7233ad8612b45673ed3b8914ac68e7bde48ed170b52ecd445b9e6d9c8a87836040516118f693929190612bcd565b60405180910390a1600080516020612da78339815191528c8260405161191d929190612bf5565b60405180910390a15050600c889055611caa565b60408051848152602081018490529081018290527f94049b3ce012ac6b8afaf47d0440c644340ea6e8d5ae60832ac8bb024d46c4339060600160405180910390a18015611c5e5760405163e6a4390560e01b815230600482015273a1077a294dde1b09bb078844df40758a5d0f9a2760248201526000907329ea7545def87022badc76323f373ea1e707c5239063e6a4390590604401602060405180830381865afa1580156119e4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a089190612949565b90506001600160a01b03811615611c5c5760085460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018490529082169063a9059cbb906044016020604051808303816000875af1158015611a6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a90919061292c565b506008546040518381526001600160a01b03909116907fcf28b8a79cb4000a3cbf8cffabf6bd8a204430fd3d8f4d25eb5bbdf681dacdca9060200160405180910390a2600854604051633a409e4760e21b8152600481018490526001600160a01b039091169063e902791c90602401600060405180830381600087803b158015611b1957600080fd5b505af1925050508015611b2a575060015b611c2257611b36612aec565b806308c379a003611bbc5750611b4a612b43565b80611b555750611bbe565b60408051848152600060208201527f95381f09dc53a96f9c5af5cd04e29ef7bd6f97306b88d38aaac740695b870bd1910160405180910390a1600080516020612da7833981519152600082604051611bae929190612c3a565b60405180910390a150611c5c565b505b60408051838152600060208201527f95381f09dc53a96f9c5af5cd04e29ef7bd6f97306b88d38aaac740695b870bd1910160405180910390a1600080516020612da78339815191526000604051611c159190612c86565b60405180910390a1611c5c565b60408051838152600160208201527f95381f09dc53a96f9c5af5cd04e29ef7bd6f97306b88d38aaac740695b870bd1910160405180910390a15b505b604080518d8152602081018990529081018c9052606081018290527f0bc62e1d40938a474613f34d588c47ee61a427e8a6c50db213fb1e383232e1599060800160405180910390a15050505b5050505050505050505b506011805460ff19169055565b6110fb83838360016120e7565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811015611d475781811015611d3857604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161083b565b611d47848484840360006120e7565b50505050565b6001600160a01b038316611d7757604051634b637e8f60e11b81526000600482015260240161083b565b6001600160a01b038216611da15760405163ec442f0560e01b81526000600482015260240161083b565b6110fb8383836121bc565b6005546001600160a01b031633146108af5760405163118cdaa760e01b815233600482015260240161083b565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216611e5557604051634b637e8f60e11b81526000600482015260240161083b565b610c45826000836121bc565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611e9657611e96612cef565b60200260200101906001600160a01b031690816001600160a01b03168152505073165c3410fc91ef562c50559f7d2289febed552d96001600160a01b031663ef8ef56f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f2c9190612949565b81600181518110611f3f57611f3f612cef565b6001600160a01b039092166020928302919091019091015273165c3410fc91ef562c50559f7d2289febed552d963791ac9478360008430611f824261012c612aab565b6040518663ffffffff1660e01b8152600401611fa2959493929190612d05565b600060405180830381600087803b158015611fbc57600080fd5b505af1925050508015611fcd575060015b610c4557611fd9612aec565b806308c379a0036120365750611fed612b43565b80611ff85750612038565b7f85f386fa31c260defaa7a40b674889e385f8f6ab564b2bee563b20dc4705dc198382604051612029929190612d76565b60405180910390a1505050565b505b3d808015612062576040519150601f19603f3d011682016040523d82523d6000602084013e612067565b606091505b506000808251116120a457604051806040016040528060148152602001733637bbafb632bb32b62fb9bbb0b82fb2b93937b960611b8152506120a6565b815b90507f85f386fa31c260defaa7a40b674889e385f8f6ab564b2bee563b20dc4705dc1984826040516120d9929190612d76565b60405180910390a150505050565b6001600160a01b0384166121115760405163e602df0560e01b81526000600482015260240161083b565b6001600160a01b03831661213b57604051634a1406b160e11b81526000600482015260240161083b565b6001600160a01b0380851660009081526001602090815260408083209387168352929052208290558015611d4757826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516121ae91815260200190565b60405180910390a350505050565b60006121c730610c49565b90506000600b5482101580156121e15750600b54600c5410155b80156121f0575060115460ff16155b801561221457506001600160a01b0384166000908152600e602052604090205460ff165b905080156122cd57600c548083111561224f576000600c54846122379190612a23565b905080600c546122479190612aab565b91505061225b565b61225830610c49565b90505b6000600c556040517f84d0452ce7a83723df48a4d2a542b7941aac3e2ce39df01c7ff6c27c43408fc5906122ba908381526040602082018190526010908201526f39b2b6362fba3930b739b0b1ba34b7b760811b606082015260800190565b60405180910390a16122cb816114b0565b505b6001600160a01b0385166000908152600f602052604081205460ff168061230c57506001600160a01b0385166000908152600f602052604090205460ff165b6001600160a01b038087166000908152600e602052604080822054928a1682528120549215935060ff918216929091169083801561234d575060115460ff16155b1561239e57821561237a57612710600954886123699190612d8f565b6123739190612a01565b905061239e565b811561239e57612710600a54886123919190612d8f565b61239b9190612a01565b90505b60006123aa8289612a23565b6001600160a01b038a1660009081526010602052604090205490915060ff161580156123d35750825b80156123e157506000600d54115b156124b45760006123f18a610c49565b600d549091506124018383612aab565b11156124b257600d546040805183815260208101859052908101919091526001600160a01b038b16907f0ac46ac46fef168f96cde38b8198ba8d25f3652a7e0bb3d1530e6fe0f8783d3b9060600160405180910390a2600d546124648383612aab565b11156124b25760405162461bcd60e51b815260206004820152601d60248201527f45786365656473206d61782077616c6c65742062757920616d6f756e74000000604482015260640161083b565b505b8115612542576124c58a30846125af565b81600c60008282546124d79190612aab565b909155506124e790508289612a23565b9750886001600160a01b03168a6001600160a01b03167fddb30886d90db45adc1b2edcbabe12227896c25143cd155d3bf62ec8eff6785684600c54604051612539929190918252602082015260400190565b60405180910390a35b61254d8a8a8a6125af565b886001600160a01b03168a6001600160a01b03167fb29cfee66d96a53573a7e2d791e05548fb5c8a56cfea6be374f8de86412056728a8560405161259b929190918252602082015260400190565b60405180910390a350505050505050505050565b6001600160a01b0383166125da5780600260008282546125cf9190612aab565b9091555061264c9050565b6001600160a01b0383166000908152602081905260409020548181101561262d5760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640161083b565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661266857600280548290039055612687565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516126cc91815260200190565b60405180910390a3505050565b6000815180845260005b818110156126ff576020818501810151868301820152016126e3565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061273260208301846126d9565b9392505050565b6001600160a01b038116811461123957600080fd5b6000806040838503121561276157600080fd5b823561276c81612739565b946020939093013593505050565b60008060006060848603121561278f57600080fd5b833561279a81612739565b925060208401356127aa81612739565b929592945050506040919091013590565b801515811461123957600080fd5b600080604083850312156127dc57600080fd5b82356127e781612739565b915060208301356127f7816127bb565b809150509250929050565b6000806040838503121561281557600080fd5b8235915060208301356127f781612739565b60006020828403121561283957600080fd5b813561273281612739565b60006020828403121561285657600080fd5b5035919050565b60008060006060848603121561287257600080fd5b833561287d81612739565b925060208401359150604084013561289481612739565b809150509250925092565b600080604083850312156128b257600080fd5b82356128bd81612739565b915060208301356127f781612739565b6020808252600b908201526a2737ba1031b932b0ba37b960a91b604082015260600190565b600181811c9082168061290657607f821691505b60208210810361292657634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561293e57600080fd5b8151612732816127bb565b60006020828403121561295b57600080fd5b815161273281612739565b60006020828403121561297857600080fd5b5051919050565b6060815260006129af60608301601081526f737761705f616e645f6164645f6c697160801b602082015260400190565b836020840152828103604084015260148152731e995c9bd7d85b5bdd5b9d17dc1c9bdd9a59195960621b60208201526040810191505092915050565b634e487b7160e01b600052601160045260246000fd5b600082612a1e57634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115610957576109576129eb565b606081526000612a6660608301601081526f737761705f616e645f6164645f6c697160801b602082015260400190565b8360208401528281036040840152601d81527f696e73756666696369656e745f616d6f756e745f666f725f73706c697400000060208201526040810191505092915050565b80820180821115610957576109576129eb565b600080600060608486031215612ad357600080fd5b8351925060208401519150604084015190509250925092565b600060033d1115612b055760046000803e5060005160e01c5b90565b601f8201601f1916810167ffffffffffffffff81118282101715612b3c57634e487b7160e01b600052604160045260246000fd5b6040525050565b600060443d1015612b515790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715612b8157505050505090565b8285019150815181811115612b995750505050505090565b843d8701016020828501011115612bb35750505050505090565b612bc260208286010187612b08565b509095945050505050565b838152826020820152606060408201526000612bec60608301846126d9565b95945050505050565b60608152600d60608201526c6164645f6c697175696469747960981b608082015282602082015260a060408201526000612c3260a08301846126d9565b949350505050565b606081526000612c6e60608301601481527336b0b730b3b2b92fb737ba34b334b1b0ba34b7b760611b602082015260400190565b8460208401528281036040840152612bec81856126d9565b606081526000612cba60608301601481527336b0b730b3b2b92fb737ba34b334b1b0ba34b7b760611b602082015260400190565b8360208401528281036040840152600d81526c3ab735b737bbb72fb2b93937b960991b60208201526040810191505092915050565b634e487b7160e01b600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612d555784516001600160a01b031683529383019391830191600101612d30565b50506001600160a01b03969096166060850152505050608001529392505050565b828152604060208201526000612c3260408301846126d9565b8082028115828204841417610957576109576129eb56fe73e8f135c199b4935bde234a32b4636748b9f027dca244f9dd1ddc38fd70b776a26469706673582212206b6697b2f319a36ae76e303a6eb71a28a01de4d24dac0b458f8f87a8ce78ffc764736f6c6343000814003395381f09dc53a96f9c5af5cd04e29ef7bd6f97306b88d38aaac740695b870bd185f386fa31c260defaa7a40b674889e385f8f6ab564b2bee563b20dc4705dc1973e8f135c199b4935bde234a32b4636748b9f027dca244f9dd1ddc38fd70b776ef4e63ee7233ad8612b45673ed3b8914ac68e7bde48ed170b52ecd445b9e6d9c000000000000000000000000165c3410fc91ef562c50559f7d2289febed552d90000000000000000000000003b1489f3ea4643b7e7b29548e2e2cfef094bb05e0000000000000000000000003b1489f3ea4643b7e7b29548e2e2cfef094bb05e000000000000000000000000915b4145e169ce7352936e88546ac8667d22723c

Deployed ByteCode

0x6080604052600436106102555760003560e01c80638ebfc79611610139578063da5023b9116100b6578063ef8ef56f1161007a578063ef8ef56f14610711578063f2fde38b14610739578063f30e85bc14610759578063f753941814610779578063fe296c03146107ad578063ffd2a7d3146107c357600080fd5b8063da5023b914610675578063dc1052e214610695578063dd62ed3e146106b5578063e2f45605146106fb578063e7cb0df9146103b657600080fd5b8063a98c4fb5116100fd578063a98c4fb5146105b5578063afa4f3b2146105d5578063b0249cc6146105f5578063b37fd19014610625578063d1a4a1741461064557600080fd5b80638ebfc7961461052a57806393eb73e71461054a57806395d89b41146105605780639dc29fac14610575578063a9059cbb1461059557600080fd5b80633f4218e0116101d25780637548324c116101965780637548324c1461046e57806384d510bd1461048457806385af30c5146104ac57806385da9e5a146104cc5780638cd09d50146104ec5780638da5cb5b1461050c57600080fd5b80633f4218e0146103cb5780636b5e139b146103fb57806370a0823114610411578063715018a61461043157806371fc24eb1461044657600080fd5b806323b872dd1161021957806323b872dd1461033a5780632d99d32e1461035a578063313ce5671461037a57806334dda70d146103965780633de7f844146103b657600080fd5b806302d05d3f1461026157806303371962146102b257806306fdde03146102c9578063095ea7b3146102eb57806318160ddd1461031b57600080fd5b3661025c57005b600080fd5b34801561026d57600080fd5b506102957f000000000000000000000000915b4145e169ce7352936e88546ac8667d22723c81565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102be57600080fd5b506102c76107f3565b005b3480156102d557600080fd5b506102de6108b1565b6040516102a9919061271f565b3480156102f757600080fd5b5061030b61030636600461274e565b610943565b60405190151581526020016102a9565b34801561032757600080fd5b506002545b6040519081526020016102a9565b34801561034657600080fd5b5061030b61035536600461277a565b61095d565b34801561036657600080fd5b506102c76103753660046127c9565b610981565b34801561038657600080fd5b50604051601281526020016102a9565b3480156103a257600080fd5b506102c76103b1366004612802565b610a3a565b3480156103c257600080fd5b5061032c60c881565b3480156103d757600080fd5b5061030b6103e6366004612827565b600f6020526000908152604090205460ff1681565b34801561040757600080fd5b5061032c600d5481565b34801561041d57600080fd5b5061032c61042c366004612827565b610c49565b34801561043d57600080fd5b506102c7610c64565b34801561045257600080fd5b5061029573165c3410fc91ef562c50559f7d2289febed552d981565b34801561047a57600080fd5b5061032c60095481565b34801561049057600080fd5b506102957329ea7545def87022badc76323f373ea1e707c52381565b3480156104b857600080fd5b50600754610295906001600160a01b031681565b3480156104d857600080fd5b50600854610295906001600160a01b031681565b3480156104f857600080fd5b506102c7610507366004612844565b610c76565b34801561051857600080fd5b506005546001600160a01b0316610295565b34801561053657600080fd5b506102c76105453660046127c9565b610d08565b34801561055657600080fd5b5061032c600c5481565b34801561056c57600080fd5b506102de610d7b565b34801561058157600080fd5b506102c761059036600461274e565b610d8a565b3480156105a157600080fd5b5061030b6105b036600461274e565b610de3565b3480156105c157600080fd5b506102c76105d0366004612844565b610df1565b3480156105e157600080fd5b506102c76105f0366004612844565b610ec4565b34801561060157600080fd5b5061030b610610366004612827565b600e6020526000908152604090205460ff1681565b34801561063157600080fd5b506102c761064036600461285d565b610f8f565b34801561065157600080fd5b5061030b610660366004612827565b60106020526000908152604090205460ff1681565b34801561068157600080fd5b506102c76106903660046127c9565b611100565b3480156106a157600080fd5b506102c76106b0366004612844565b611173565b3480156106c157600080fd5b5061032c6106d036600461289f565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561070757600080fd5b5061032c600b5481565b34801561071d57600080fd5b5061029573a1077a294dde1b09bb078844df40758a5d0f9a2781565b34801561074557600080fd5b506102c7610754366004612827565b6111fe565b34801561076557600080fd5b506102c7610774366004612827565b61123c565b34801561078557600080fd5b5061078e61131f565b604080516001600160a01b0390931683526020830191909152016102a9565b3480156107b957600080fd5b5061032c600a5481565b3480156107cf57600080fd5b506107d861143a565b604080519384526020840192909252908201526060016102a9565b336001600160a01b037f000000000000000000000000915b4145e169ce7352936e88546ac8667d22723c16146108445760405162461bcd60e51b815260040161083b906128cd565b60405180910390fd5b61084c611457565b6000600c54116108925760405162461bcd60e51b815260206004820152601160248201527004e6f20746f6b656e7320746f207377617607c1b604482015260640161083b565b600c805460009091556108a4816114b0565b506108af6001600655565b565b6060600380546108c0906128f2565b80601f01602080910402602001604051908101604052809291908181526020018280546108ec906128f2565b80156109395780601f1061090e57610100808354040283529160200191610939565b820191906000526020600020905b81548152906001019060200180831161091c57829003601f168201915b5050505050905090565b600033610951818585611cc1565b60019150505b92915050565b60003361096b858285611cce565b610976858585611d4d565b506001949350505050565b336001600160a01b037f000000000000000000000000915b4145e169ce7352936e88546ac8667d22723c16146109c95760405162461bcd60e51b815260040161083b906128cd565b6001600160a01b0382166000818152600e60209081526040808320805486151560ff199182168117909255601084529382902080549094168117909355519182527ff9f3066792ece7dadd967a9482836e4b52c2f9d93bb1a3db2e245bbee91db83291015b60405180910390a25050565b336001600160a01b037f000000000000000000000000915b4145e169ce7352936e88546ac8667d22723c1614610a825760405162461bcd60e51b815260040161083b906128cd565b610a8a611457565b6001600160a01b038116610ad05760405162461bcd60e51b815260206004820152600d60248201526c109859081c9958da5c1a595b9d609a1b604482015260640161083b565b47821115610b205760405162461bcd60e51b815260206004820152601860248201527f496e73756666696369656e7420504c532062616c616e63650000000000000000604482015260640161083b565b6000816001600160a01b03168360405160006040518083038185875af1925050503d8060008114610b6d576040519150601f19603f3d011682016040523d82523d6000602084013e610b72565b606091505b5050905080610bb95760405162461bcd60e51b8152602060048201526013602482015272141314c81d1c985b9cd9995c8819985a5b1959606a1b604482015260640161083b565b600080516020612da783398151915283604051610c3291906060808252600a90820152697265736375655f706c7360b01b6080820152602081019190915260a060408201819052601a908201527f504c535f7472616e736665727265645f746f5f63726561746f7200000000000060c082015260e00190565b60405180910390a150610c456001600655565b5050565b6001600160a01b031660009081526020819052604090205490565b610c6c611dac565b6108af6000611dd9565b336001600160a01b037f000000000000000000000000915b4145e169ce7352936e88546ac8667d22723c1614610cbe5760405162461bcd60e51b815260040161083b906128cd565b60c8811115610ccc57600080fd5b60098190556040518181527fa6255338a5f732d64ceba7f4c18182567f9d1067eb984b46d478b37d72a52d11906020015b60405180910390a150565b336001600160a01b037f000000000000000000000000915b4145e169ce7352936e88546ac8667d22723c1614610d505760405162461bcd60e51b815260040161083b906128cd565b6001600160a01b03919091166000908152600f60205260409020805460ff1916911515919091179055565b6060600480546108c0906128f2565b610d92611dac565b600854610da8906001600160a01b031682611e2b565b816001600160a01b03167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca582604051610a2e91815260200190565b600033610951818585611d4d565b336001600160a01b037f000000000000000000000000915b4145e169ce7352936e88546ac8667d22723c1614610e395760405162461bcd60e51b815260040161083b906128cd565b60008111610e7e5760405162461bcd60e51b81526020600482015260126024820152710416d6f756e74206d757374206265203e20360741b604482015260640161083b565b600d80549082905560408051828152602081018490527f81fb71532b5eef604cf6ebbf354e27df4cf07c24226e31616f8eaa1e913743a691015b60405180910390a15050565b336001600160a01b037f000000000000000000000000915b4145e169ce7352936e88546ac8667d22723c1614610f0c5760405162461bcd60e51b815260040161083b906128cd565b60008111610f515760405162461bcd60e51b81526020600482015260126024820152710416d6f756e74206d757374206265203e20360741b604482015260640161083b565b600b80549082905560408051828152602081018490527febb96427ceba6a46f9f71146db5c30bc7e2fe31285e9bf34b38bbdede7cd5ea19101610eb8565b336001600160a01b037f000000000000000000000000915b4145e169ce7352936e88546ac8667d22723c1614610fd75760405162461bcd60e51b815260040161083b906128cd565b610fdf611457565b6001600160a01b0381166110255760405162461bcd60e51b815260206004820152600d60248201526c109859081c9958da5c1a595b9d609a1b604482015260640161083b565b306001600160a01b0384160361107d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420726573637565206f776e20746f6b656e730000000000000000604482015260640161083b565b60405163a9059cbb60e01b81526001600160a01b0382811660048301526024820184905284169063a9059cbb906044016020604051808303816000875af11580156110cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f0919061292c565b506110fb6001600655565b505050565b336001600160a01b037f000000000000000000000000915b4145e169ce7352936e88546ac8667d22723c16146111485760405162461bcd60e51b815260040161083b906128cd565b6001600160a01b03919091166000908152601060205260409020805460ff1916911515919091179055565b336001600160a01b037f000000000000000000000000915b4145e169ce7352936e88546ac8667d22723c16146111bb5760405162461bcd60e51b815260040161083b906128cd565b60c88111156111c957600080fd5b600a8190556040518181527f7a758dc8e99047b028278b3e2ff1416d8493a7aacee7a5dc30b6bf93270eccce90602001610cfd565b611206611dac565b6001600160a01b03811661123057604051631e4fbdf760e01b81526000600482015260240161083b565b61123981611dd9565b50565b611244611dac565b6008546001600160a01b0316331461125b57600080fd5b6001600160a01b03811661129c5760405162461bcd60e51b81526020600482015260086024820152672130b2103830b4b960c11b604482015260640161083b565b600780546001600160a01b0319166001600160a01b0383169081179091556000818152600e60209081526040808320805460ff199081166001908117909255601084529382902080549094168117909355519182527ff9f3066792ece7dadd967a9482836e4b52c2f9d93bb1a3db2e245bbee91db832910160405180910390a250565b60405163e6a4390560e01b815230600482015273a1077a294dde1b09bb078844df40758a5d0f9a276024820152600090819081907329ea7545def87022badc76323f373ea1e707c5239063e6a4390590604401602060405180830381865afa15801561138f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113b39190612949565b905060006001600160a01b03821615611431576040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa15801561140a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142e9190612966565b90505b90939092509050565b600080600061144830610c49565b47600c54925092509250909192565b6002600654036114a95760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161083b565b6002600655565b6011805460ff1916600117905560008190036114f157600080516020612da783398151915260006040516114e4919061297f565b60405180910390a1611cb4565b60006114fe600283612a01565b9050600061150c8284612a23565b9050811580611519575080155b1561156257600080516020612da78339815191528360405161153b9190612a36565b60405180910390a182600c60008282546115559190612aab565b90915550611cb492505050565b60408051848152602081018490529081018290527f885aaac1591ae5f2a9feb608e9e8f75f7fd4c9c53f01225b6491df2a9564f92a9060600160405180910390a14760006115af30610c49565b90506115ba84611e61565b4760006115c78483612a23565b905060006115d430610c49565b905060006115e28286612a23565b604080518a815260208101869052908101889052606081018690529091507fac88d4537f5bc5761e28e65f9f070e5c7736952f4d66ea6cc1751084a6754dcc9060800160405180910390a1826000036116ba577f85f386fa31c260defaa7a40b674889e385f8f6ab564b2bee563b20dc4705dc198860405161168d918152604060208201819052600f908201526e1b9bd7dc1b1cd7dc9958d95a5d9959608a1b606082015260800190565b60405180910390a188600c60008282546116a79190612aab565b90915550611cb498505050505050505050565b60008782106116c957876116cb565b815b60408051828152602081018790529192507f8e01608fc7df73fecd60ac2594e5baa773d4e6a7bfb119629f1ba0e5c7624554910160405180910390a173165c3410fc91ef562c50559f7d2289febed552d963f305d719853084600080836117344261012c612aab565b60405160e089901b6001600160e01b03191681526001600160a01b039687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c40160606040518083038185885af1935050505080156117be575060408051601f3d908101601f191682019092526117bb91810190612abe565b60015b611931576117ca612aec565b806308c379a00361185657506117de612b43565b806117e95750611858565b7fef4e63ee7233ad8612b45673ed3b8914ac68e7bde48ed170b52ecd445b9e6d9c89868360405161181c93929190612bcd565b60405180910390a1600080516020612da78339815191528b82604051611843929190612bf5565b60405180910390a150600c889055611caa565b505b3d808015611882576040519150601f19603f3d011682016040523d82523d6000602084013e611887565b606091505b506000808251116118bf576040518060400160405280600f81526020016e3637bbafb632bb32b62fb2b93937b960891b8152506118c1565b815b90507fef4e63ee7233ad8612b45673ed3b8914ac68e7bde48ed170b52ecd445b9e6d9c8a87836040516118f693929190612bcd565b60405180910390a1600080516020612da78339815191528c8260405161191d929190612bf5565b60405180910390a15050600c889055611caa565b60408051848152602081018490529081018290527f94049b3ce012ac6b8afaf47d0440c644340ea6e8d5ae60832ac8bb024d46c4339060600160405180910390a18015611c5e5760405163e6a4390560e01b815230600482015273a1077a294dde1b09bb078844df40758a5d0f9a2760248201526000907329ea7545def87022badc76323f373ea1e707c5239063e6a4390590604401602060405180830381865afa1580156119e4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a089190612949565b90506001600160a01b03811615611c5c5760085460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018490529082169063a9059cbb906044016020604051808303816000875af1158015611a6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a90919061292c565b506008546040518381526001600160a01b03909116907fcf28b8a79cb4000a3cbf8cffabf6bd8a204430fd3d8f4d25eb5bbdf681dacdca9060200160405180910390a2600854604051633a409e4760e21b8152600481018490526001600160a01b039091169063e902791c90602401600060405180830381600087803b158015611b1957600080fd5b505af1925050508015611b2a575060015b611c2257611b36612aec565b806308c379a003611bbc5750611b4a612b43565b80611b555750611bbe565b60408051848152600060208201527f95381f09dc53a96f9c5af5cd04e29ef7bd6f97306b88d38aaac740695b870bd1910160405180910390a1600080516020612da7833981519152600082604051611bae929190612c3a565b60405180910390a150611c5c565b505b60408051838152600060208201527f95381f09dc53a96f9c5af5cd04e29ef7bd6f97306b88d38aaac740695b870bd1910160405180910390a1600080516020612da78339815191526000604051611c159190612c86565b60405180910390a1611c5c565b60408051838152600160208201527f95381f09dc53a96f9c5af5cd04e29ef7bd6f97306b88d38aaac740695b870bd1910160405180910390a15b505b604080518d8152602081018990529081018c9052606081018290527f0bc62e1d40938a474613f34d588c47ee61a427e8a6c50db213fb1e383232e1599060800160405180910390a15050505b5050505050505050505b506011805460ff19169055565b6110fb83838360016120e7565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811015611d475781811015611d3857604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161083b565b611d47848484840360006120e7565b50505050565b6001600160a01b038316611d7757604051634b637e8f60e11b81526000600482015260240161083b565b6001600160a01b038216611da15760405163ec442f0560e01b81526000600482015260240161083b565b6110fb8383836121bc565b6005546001600160a01b031633146108af5760405163118cdaa760e01b815233600482015260240161083b565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216611e5557604051634b637e8f60e11b81526000600482015260240161083b565b610c45826000836121bc565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611e9657611e96612cef565b60200260200101906001600160a01b031690816001600160a01b03168152505073165c3410fc91ef562c50559f7d2289febed552d96001600160a01b031663ef8ef56f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f2c9190612949565b81600181518110611f3f57611f3f612cef565b6001600160a01b039092166020928302919091019091015273165c3410fc91ef562c50559f7d2289febed552d963791ac9478360008430611f824261012c612aab565b6040518663ffffffff1660e01b8152600401611fa2959493929190612d05565b600060405180830381600087803b158015611fbc57600080fd5b505af1925050508015611fcd575060015b610c4557611fd9612aec565b806308c379a0036120365750611fed612b43565b80611ff85750612038565b7f85f386fa31c260defaa7a40b674889e385f8f6ab564b2bee563b20dc4705dc198382604051612029929190612d76565b60405180910390a1505050565b505b3d808015612062576040519150601f19603f3d011682016040523d82523d6000602084013e612067565b606091505b506000808251116120a457604051806040016040528060148152602001733637bbafb632bb32b62fb9bbb0b82fb2b93937b960611b8152506120a6565b815b90507f85f386fa31c260defaa7a40b674889e385f8f6ab564b2bee563b20dc4705dc1984826040516120d9929190612d76565b60405180910390a150505050565b6001600160a01b0384166121115760405163e602df0560e01b81526000600482015260240161083b565b6001600160a01b03831661213b57604051634a1406b160e11b81526000600482015260240161083b565b6001600160a01b0380851660009081526001602090815260408083209387168352929052208290558015611d4757826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516121ae91815260200190565b60405180910390a350505050565b60006121c730610c49565b90506000600b5482101580156121e15750600b54600c5410155b80156121f0575060115460ff16155b801561221457506001600160a01b0384166000908152600e602052604090205460ff165b905080156122cd57600c548083111561224f576000600c54846122379190612a23565b905080600c546122479190612aab565b91505061225b565b61225830610c49565b90505b6000600c556040517f84d0452ce7a83723df48a4d2a542b7941aac3e2ce39df01c7ff6c27c43408fc5906122ba908381526040602082018190526010908201526f39b2b6362fba3930b739b0b1ba34b7b760811b606082015260800190565b60405180910390a16122cb816114b0565b505b6001600160a01b0385166000908152600f602052604081205460ff168061230c57506001600160a01b0385166000908152600f602052604090205460ff165b6001600160a01b038087166000908152600e602052604080822054928a1682528120549215935060ff918216929091169083801561234d575060115460ff16155b1561239e57821561237a57612710600954886123699190612d8f565b6123739190612a01565b905061239e565b811561239e57612710600a54886123919190612d8f565b61239b9190612a01565b90505b60006123aa8289612a23565b6001600160a01b038a1660009081526010602052604090205490915060ff161580156123d35750825b80156123e157506000600d54115b156124b45760006123f18a610c49565b600d549091506124018383612aab565b11156124b257600d546040805183815260208101859052908101919091526001600160a01b038b16907f0ac46ac46fef168f96cde38b8198ba8d25f3652a7e0bb3d1530e6fe0f8783d3b9060600160405180910390a2600d546124648383612aab565b11156124b25760405162461bcd60e51b815260206004820152601d60248201527f45786365656473206d61782077616c6c65742062757920616d6f756e74000000604482015260640161083b565b505b8115612542576124c58a30846125af565b81600c60008282546124d79190612aab565b909155506124e790508289612a23565b9750886001600160a01b03168a6001600160a01b03167fddb30886d90db45adc1b2edcbabe12227896c25143cd155d3bf62ec8eff6785684600c54604051612539929190918252602082015260400190565b60405180910390a35b61254d8a8a8a6125af565b886001600160a01b03168a6001600160a01b03167fb29cfee66d96a53573a7e2d791e05548fb5c8a56cfea6be374f8de86412056728a8560405161259b929190918252602082015260400190565b60405180910390a350505050505050505050565b6001600160a01b0383166125da5780600260008282546125cf9190612aab565b9091555061264c9050565b6001600160a01b0383166000908152602081905260409020548181101561262d5760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640161083b565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661266857600280548290039055612687565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516126cc91815260200190565b60405180910390a3505050565b6000815180845260005b818110156126ff576020818501810151868301820152016126e3565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061273260208301846126d9565b9392505050565b6001600160a01b038116811461123957600080fd5b6000806040838503121561276157600080fd5b823561276c81612739565b946020939093013593505050565b60008060006060848603121561278f57600080fd5b833561279a81612739565b925060208401356127aa81612739565b929592945050506040919091013590565b801515811461123957600080fd5b600080604083850312156127dc57600080fd5b82356127e781612739565b915060208301356127f7816127bb565b809150509250929050565b6000806040838503121561281557600080fd5b8235915060208301356127f781612739565b60006020828403121561283957600080fd5b813561273281612739565b60006020828403121561285657600080fd5b5035919050565b60008060006060848603121561287257600080fd5b833561287d81612739565b925060208401359150604084013561289481612739565b809150509250925092565b600080604083850312156128b257600080fd5b82356128bd81612739565b915060208301356127f781612739565b6020808252600b908201526a2737ba1031b932b0ba37b960a91b604082015260600190565b600181811c9082168061290657607f821691505b60208210810361292657634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561293e57600080fd5b8151612732816127bb565b60006020828403121561295b57600080fd5b815161273281612739565b60006020828403121561297857600080fd5b5051919050565b6060815260006129af60608301601081526f737761705f616e645f6164645f6c697160801b602082015260400190565b836020840152828103604084015260148152731e995c9bd7d85b5bdd5b9d17dc1c9bdd9a59195960621b60208201526040810191505092915050565b634e487b7160e01b600052601160045260246000fd5b600082612a1e57634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115610957576109576129eb565b606081526000612a6660608301601081526f737761705f616e645f6164645f6c697160801b602082015260400190565b8360208401528281036040840152601d81527f696e73756666696369656e745f616d6f756e745f666f725f73706c697400000060208201526040810191505092915050565b80820180821115610957576109576129eb565b600080600060608486031215612ad357600080fd5b8351925060208401519150604084015190509250925092565b600060033d1115612b055760046000803e5060005160e01c5b90565b601f8201601f1916810167ffffffffffffffff81118282101715612b3c57634e487b7160e01b600052604160045260246000fd5b6040525050565b600060443d1015612b515790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715612b8157505050505090565b8285019150815181811115612b995750505050505090565b843d8701016020828501011115612bb35750505050505090565b612bc260208286010187612b08565b509095945050505050565b838152826020820152606060408201526000612bec60608301846126d9565b95945050505050565b60608152600d60608201526c6164645f6c697175696469747960981b608082015282602082015260a060408201526000612c3260a08301846126d9565b949350505050565b606081526000612c6e60608301601481527336b0b730b3b2b92fb737ba34b334b1b0ba34b7b760611b602082015260400190565b8460208401528281036040840152612bec81856126d9565b606081526000612cba60608301601481527336b0b730b3b2b92fb737ba34b334b1b0ba34b7b760611b602082015260400190565b8360208401528281036040840152600d81526c3ab735b737bbb72fb2b93937b960991b60208201526040810191505092915050565b634e487b7160e01b600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612d555784516001600160a01b031683529383019391830191600101612d30565b50506001600160a01b03969096166060850152505050608001529392505050565b828152604060208201526000612c3260408301846126d9565b8082028115828204841417610957576109576129eb56fe73e8f135c199b4935bde234a32b4636748b9f027dca244f9dd1ddc38fd70b776a26469706673582212206b6697b2f319a36ae76e303a6eb71a28a01de4d24dac0b458f8f87a8ce78ffc764736f6c63430008140033