false
true
0

Contract Address Details

0xD3270DC3361f34a1cb0c4cd2b0b352adB64D4498

Contract Name
FarmHTTHEX
Creator
0xc6eda6–db69f1 at 0x7da59d–3a64e6
Balance
0 PLS ( )
Tokens
Fetching tokens...
Transactions
315 Transactions
Transfers
0 Transfers
Gas Used
0
Last Balance Update
26040320
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
FarmHTTHEX




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




EVM Version
default




Verified at
2025-05-04T11:39:55.166281Z

Contract source code

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


// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

/**
 * @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);
}

// File: https://github.com/Uniswap/uniswap-v2-periphery/blob/master/contracts/interfaces/IUniswapV2Router01.sol

pragma solidity >=0.6.2;

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

// File: https://github.com/Uniswap/uniswap-v2-periphery/blob/master/contracts/interfaces/IUniswapV2Router02.sol

pragma solidity >=0.6.2;


interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    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;
}

// File: @uniswap/v2-core/contracts/interfaces/IUniswapV2Pair.sol

pragma solidity >=0.5.0;

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) 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 DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

// File: @uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol

pragma solidity >=0.5.0;

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

// File: PiggyBank-main/PiggyBank-main/contracts/interface/IGovernor.sol


// !! THIS FILE WAS AUTOGENERATED BY abi-to-sol v0.8.0. SEE SOURCE BELOW. !!
pragma solidity ^0.8.20;

interface IGovernor {
    event EnforceGovernor(
        address indexed _newGovernor,
        address indexed enforcer
    );
    event GiveRolloverBonus(
        address indexed recipient,
        uint256 amount,
        address indexed poolInto
    );
    event Harvest(address indexed sender, uint256 callFee);
    event SetInflation(uint256 rewardPerBlock);

    function acPool1() external view returns (address);

    function acPool1ID() external view returns (uint256);

    function acPool2() external view returns (address);

    function acPool2ID() external view returns (uint256);

    function acPool3() external view returns (address);

    function acPool3ID() external view returns (uint256);

    function acPool4() external view returns (address);

    function acPool4ID() external view returns (uint256);

    function acPool5() external view returns (address);

    function acPool5ID() external view returns (uint256);

    function acPool6() external view returns (address);

    function acPool6ID() external view returns (uint256);

    function addNewPool(address _pool) external;

    function allocationPercentages(uint256) external view returns (uint256);

    function basicContract() external view returns (address);

    function beginMintingPhase() external;

    function burnTokens(uint256 amount) external;

    function changeGovernorActivated() external view returns (bool);

    function changeGovernorForSecurityPriorMintingBegins(address _newGovernor)
        external;

    function consensusContract() external view returns (address);

    function costToVote() external view returns (uint256);

    function creditContract() external view returns (address);

    function delayBeforeEnforce() external view returns (uint256);

    function depositFee() external view returns (uint256);

    function eligibleNewGovernor() external view returns (address);

    function enforceGovernor() external;

    function eventFibonacceningActive() external view returns (bool);

    function farmContract() external view returns (address);

    function fibonacceningContract() external view returns (address);

    function fundingRate() external view returns (uint256);

    function getRollBonus(address _bonusForPool)
        external
        view
        returns (uint256);

    function governorRejected() external;

    function harvest() external;

    function hexVault() external view returns (address);

    function incVault() external view returns (address);

    function lastHarvestedTime() external view returns (uint256);

    function lastRegularReward() external view returns (uint256);

    function lastTotalCredit() external view returns (uint256);

    function masterchef() external view returns (address);

    function maxDelay() external view returns (uint256);

    function minDelay() external view returns (uint256);

    function mintingPhase() external view returns (bool);

    function mintingPhaseLaunchDate() external view returns (uint256);

    function newGovernorBlockDelay() external view returns (uint256);

    function newGovernorRequestBlock() external view returns (uint256);

    function nftAllocationContract() external view returns (address);

    function nftStakingContract() external view returns (address);

    function nftStakingPoolID() external view returns (uint256);

    function nftWallet() external view returns (address);

    function pendingHarvestRewards() external view returns (uint256);

    function plsVault() external view returns (address);

    function plsxVault() external view returns (address);

    function postGrandFibIncreaseCount() external;

    function rebalancePools() external;

    function referralBonus() external view returns (uint256);

    function rememberReward() external;

    function rewardContract() external view returns (address);

    function senateContract() external view returns (address);

    function setActivateFibonaccening(bool _arg) external;

    function setCallFee(address _acPool, uint256 _newCallFee) external;

    function setGovernorTax(uint256 _amount) external;

    function setInflation(uint256 rewardPerBlock) external;

    function setNewGovernor(address beneficiary) external;

    function setPool(
        uint256 _pid,
        uint256 _allocPoint,
        bool _withUpdate
    ) external;

    function setThresholdFibonaccening(uint256 newThreshold) external;

    function stakeRolloverBonus(
        address _toAddress,
        address _depositToPool,
        uint256 _bonusToPay,
        uint256 _stakeID
    ) external;

    function thresholdFibonaccening() external view returns (uint256);

    function token() external view returns (address);

    function tokenDistributionContract() external view returns (address);

    function tokenDistributionContractExtraPenalty()
        external
        view
        returns (address);

    function totalFibonacciEventsAfterGrand() external view returns (uint256);

    function transferCollectedFees(address _tokenContract) external;

    function transferRewardBoostThreshold() external;

    function transferToReferralContract() external;

    function transferToTreasury(uint256 amount) external;

    function treasuryRequest(
        address _tokenAddr,
        address _recipient,
        uint256 _amountToSend
    ) external;

    function treasuryWallet() external view returns (address);

    function tshareVault() external view returns (address);

    function updateCostToVote(uint256 newCostToVote) external;

    function updateDelayBeforeEnforce(uint256 newDelay) external;

    function updateRolloverBonus(address _forPool, uint256 _bonus) external;

    function updateVault(uint256 _type, uint256 _amount) external;
}

// THIS FILE WAS AUTOGENERATED FROM THE FOLLOWING ABI JSON:
/*
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_newGovernor","type":"address"},{"indexed":true,"internalType":"address","name":"enforcer","type":"address"}],"name":"EnforceGovernor","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"poolInto","type":"address"}],"name":"GiveRolloverBonus","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"callFee","type":"uint256"}],"name":"Harvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rewardPerBlock","type":"uint256"}],"name":"SetInflation","type":"event"},{"inputs":[],"name":"acPool1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acPool1ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acPool2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acPool2ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acPool3","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acPool3ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acPool4","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acPool4ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acPool5","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acPool5ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acPool6","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acPool6ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"}],"name":"addNewPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"allocationPercentages","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"basicContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beginMintingPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"changeGovernorActivated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newGovernor","type":"address"}],"name":"changeGovernorForSecurityPriorMintingBegins","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"consensusContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"costToVote","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"creditContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"delayBeforeEnforce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"depositFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eligibleNewGovernor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enforceGovernor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"eventFibonacceningActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"farmContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fibonacceningContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fundingRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_bonusForPool","type":"address"}],"name":"getRollBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governorRejected","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"hexVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"incVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastHarvestedTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRegularReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastTotalCredit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterchef","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingPhase","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingPhaseLaunchDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"newGovernorBlockDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"newGovernorRequestBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftAllocationContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftStakingContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftStakingPoolID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingHarvestRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"plsVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"plsxVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"postGrandFibIncreaseCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rebalancePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"referralBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rememberReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"senateContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_arg","type":"bool"}],"name":"setActivateFibonaccening","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_acPool","type":"address"},{"internalType":"uint256","name":"_newCallFee","type":"uint256"}],"name":"setCallFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setGovernorTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"rewardPerBlock","type":"uint256"}],"name":"setInflation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"beneficiary","type":"address"}],"name":"setNewGovernor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"setPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"setThresholdFibonaccening","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_toAddress","type":"address"},{"internalType":"address","name":"_depositToPool","type":"address"},{"internalType":"uint256","name":"_bonusToPay","type":"uint256"},{"internalType":"uint256","name":"_stakeID","type":"uint256"}],"name":"stakeRolloverBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"thresholdFibonaccening","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenDistributionContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenDistributionContractExtraPenalty","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFibonacciEventsAfterGrand","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"}],"name":"transferCollectedFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferRewardBoostThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferToReferralContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferToTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amountToSend","type":"uint256"}],"name":"treasuryRequest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tshareVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCostToVote","type":"uint256"}],"name":"updateCostToVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newDelay","type":"uint256"}],"name":"updateDelayBeforeEnforce","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_forPool","type":"address"},{"internalType":"uint256","name":"_bonus","type":"uint256"}],"name":"updateRolloverBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_type","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"updateVault","outputs":[],"stateMutability":"nonpayable","type":"function"}]
*/

// File: PiggyBank-main/PiggyBank-main/contracts/interface/IDTX.sol


// !! THIS FILE WAS AUTOGENERATED BY abi-to-sol v0.8.0. SEE SOURCE BELOW. !!
pragma solidity ^0.8.20;

interface IDTX {
    error ERC20InsufficientAllowance(
        address spender,
        uint256 allowance,
        uint256 needed
    );
    error ERC20InsufficientBalance(
        address sender,
        uint256 balance,
        uint256 needed
    );
    error ERC20InvalidApprover(address approver);
    error ERC20InvalidReceiver(address receiver);
    error ERC20InvalidSender(address sender);
    error ERC20InvalidSpender(address spender);
    error OwnableInvalidOwner(address owner);
    error OwnableUnauthorizedAccount(address account);
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );
    event Transfer(address indexed from, address indexed to, uint256 value);

    function MAX_SUPPLY() external view returns (uint256);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function balanceOf(address account) external view returns (uint256);

    function burn(uint256 value) external;

    function burnFrom(address account, uint256 value) external;

    function burnToken(address account, uint256 amount) external returns (bool);

    function decimals() external view returns (uint8);

    function governor() external view returns (address);

    function masterchefAddress() external view returns (address);

    function mint(address to, uint256 amount) external;

    function name() external view returns (string memory);

    function owner() external view returns (address);

    function rebrandName(string memory _newName) external;

    function rebrandSymbol(string memory _newSymbol) external;

    function renounceOwnership() external;

    function symbol() external view returns (string memory);

    function totalSupply() external view returns (uint256);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);

    function transferOwnership(address newOwner) external;
}

// THIS FILE WAS AUTOGENERATED FROM THE FOLLOWING ABI JSON:
/*
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterchefAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_newName","type":"string"}],"name":"rebrandName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newSymbol","type":"string"}],"name":"rebrandSymbol","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
*/

// File: PiggyBank-main/PiggyBank-main/contracts/interface/IVoting.sol


// !! THIS FILE WAS AUTOGENERATED BY abi-to-sol v0.8.0. SEE SOURCE BELOW. !!
pragma solidity ^0.8.20;

interface IVoting {
    event AddCredit(address indexed depositor, uint256 amount);
    event BurnCredit(
        address indexed burnFrom,
        uint256 amount,
        uint256 indexed forId
    );
    event DeductCredit(address indexed from, uint256 amount);
    event SetCreditingContract(address indexed _contract, bool setting);
    event SetDeductingContract(address indexed _contract, bool setting);

    function addCredit(uint256 amount, address _beneficiary) external;

    function airdropContract() external view returns (address);

    function airdropContractLocked() external view returns (address);

    function airdropVotingCredit(uint256 amount, address beneficiary) external;

    function burnCredit(uint256 amount, uint256 _forId) external;

    function burnedForId(uint256) external view returns (uint256);

    function creditingContract(address) external view returns (bool);

    function creditingContractCount() external view returns (uint256);

    function deductCredit(address from, uint256 amount) external returns (bool);

    function deductingContract(address) external view returns (bool);

    function deductingContractCount() external view returns (uint256);

    function depositCredit(uint256 amount) external;

    function masterchef() external view returns (address);

    function modifyCreditingContract(address _contract, bool setting) external;

    function modifyDeductingContract(address _contract, bool setting) external;

    function owner() external view returns (address);

    function redeemGovernor() external;

    function syncOwner() external;

    function token() external view returns (address);

    function updateChef() external;

    function userCredit(address) external view returns (uint256);
}

// THIS FILE WAS AUTOGENERATED FROM THE FOLLOWING ABI JSON:
/*
[{"inputs":[{"internalType":"contract IDTX","name":"_token","type":"address"},{"internalType":"contract IMasterChef","name":"_masterchef","type":"address"},{"internalType":"address","name":"_airdropContract","type":"address"},{"internalType":"address","name":"_airdropContractLocked","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"depositor","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AddCredit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"burnFrom","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"forId","type":"uint256"}],"name":"BurnCredit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DeductCredit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_contract","type":"address"},{"indexed":false,"internalType":"bool","name":"setting","type":"bool"}],"name":"SetCreditingContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_contract","type":"address"},{"indexed":false,"internalType":"bool","name":"setting","type":"bool"}],"name":"SetDeductingContract","type":"event"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"addCredit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"airdropContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"airdropContractLocked","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"beneficiary","type":"address"}],"name":"airdropVotingCredit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"_forId","type":"uint256"}],"name":"burnCredit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"burnedForId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"creditingContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"creditingContractCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deductCredit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"deductingContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deductingContractCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositCredit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"masterchef","outputs":[{"internalType":"contract IMasterChef","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"},{"internalType":"bool","name":"setting","type":"bool"}],"name":"modifyCreditingContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"},{"internalType":"bool","name":"setting","type":"bool"}],"name":"modifyDeductingContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redeemGovernor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"syncOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IDTX","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"updateChef","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userCredit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
*/

// File: PiggyBank-main/PiggyBank-main/contracts/helper/actuator.sol


pragma solidity 0.8.20;

//Iuniswapfactoryv2,IUniswapV2Pair,IUniswapV2Router02,IUniswapV2Router01








interface IFarm {
    function userInfo(uint256, address)
        external
        view
        returns (uint256 amount, uint256 rewardDebt);
    function deposit(uint256 _pid, uint256 _amount) external;
    function withdraw(uint256 _pid, uint256 _amount) external;
}

contract FarmHTTHEX {
    address public constant UNISWAP_ROUTER_ADDRESS = 0x165C3410fC91EF562C50559f7d2289fEbed552d9;
    address public immutable DTX = 0xFAaC6a85C3e123AB2CF7669B1024f146cFef0b38;
    address public immutable votingCreditContract = 0xCF14DbcfFA6E99A444539aBbc9aE273a7bb5d75A;

    address public immutable PLSX = 0x95B303987A60C71504D99Aa1b13B4DA07b0790ab;
    address public immutable HEX = 0x2b591e99afE9f32eAA6214f7B7629768c40Eeb39;
    address public immutable EHEX = 0x57fde0a71132198BBeC939B98976993d8D89D225;
    address public immutable HTT5000 = 0x47810bb3ECDc6b080CeB2d39E769F21Ff14AB7E9; //NOTICE: IT'S HTT-7000!!!
    address public immutable ACTR = 0x85DF7cE20A4CE0cF859804b45cB540FFE42074Da;

    address public immutable farmingContract = 0x4469A40D4243aC1c6cF350d99B6d69b49b5005F1;

    uint256 public immutable poolId = 2;


    IFarm stakingContract = IFarm(0x4469A40D4243aC1c6cF350d99B6d69b49b5005F1);

    uint256 public haltProposalStartingId = 19000000; //arbitrary starting proposal ID

    bool public withdrawalStarted = false;
    uint256 public withdrawalStartedTime = 0;
    bool public canWithdraw = false;
    uint256 public withdrawalStartedCount = 0;

    IUniswapV2Router02 public uniswapRouter;
    

    address public constant PAIR_ADDRESS = 0x0d37481cD2c2E1a309a159Fd08D9F6eFd0a1F224; 

    constructor() {
        uniswapRouter = IUniswapV2Router02(UNISWAP_ROUTER_ADDRESS);
        IERC20(PLSX).approve(UNISWAP_ROUTER_ADDRESS, type(uint256).max);
        IERC20(HEX).approve(UNISWAP_ROUTER_ADDRESS, type(uint256).max);
        IERC20(HTT5000).approve(UNISWAP_ROUTER_ADDRESS, type(uint256).max); 
        IERC20(ACTR).approve(UNISWAP_ROUTER_ADDRESS, type(uint256).max);
        IERC20(EHEX).approve(UNISWAP_ROUTER_ADDRESS, type(uint256).max);
        IERC20(PAIR_ADDRESS).approve(0x4469A40D4243aC1c6cF350d99B6d69b49b5005F1, type(uint256).max); //lp to staking contract
    }


    function harvest() external {
        require(msg.sender == tx.origin);
        stakingContract.withdraw(poolId, 0);
        
        uint deadline = block.timestamp + 15; 
        uint256 _swapAmount = IERC20(ACTR).balanceOf(address(this));

        uint[] memory _minOutT = getEstimatedHexForToken(ACTR, _swapAmount);
        uint _minOut = _minOutT[_minOutT.length-1];
        uniswapRouter.swapTokensForExactTokens(_minOut, _swapAmount, getTokenPath(ACTR), address(this), deadline);

        _swapAmount = IERC20(HEX).balanceOf(address(this));
        _minOutT = getEstimatedEHEXForHex(_swapAmount);
        _minOut = _minOutT[_minOutT.length-1];
        uniswapRouter.swapTokensForExactTokens(_minOut, _swapAmount, getTokenPath3(), address(this), deadline);

        IERC20(EHEX).transfer(treasury(), IERC20(EHEX).balanceOf(address(this))); 
    }

    function swapTokenForHTTandHEX(address _token) external {
        require(msg.sender == tx.origin);
        uint deadline = block.timestamp + 15; 
        uint256 _swapAmount = IERC20(_token).balanceOf(address(this));

        uint[] memory _minOutT = getEstimatedHexForToken(_token, _swapAmount);
        uint _minOut = _minOutT[_minOutT.length-1];
        uniswapRouter.swapTokensForExactTokens(_minOut, _swapAmount, getTokenPath(_token), address(this), deadline);

        _swapAmount = IERC20(HEX).balanceOf(address(this)) / 2;
        _minOutT = getEstimatedHTTForToken(_swapAmount);
        _minOut = _minOutT[_minOutT.length-1];
        uniswapRouter.swapTokensForExactTokens(_minOut, _swapAmount, getTokenPath2(), address(this), deadline);

        provideLiquidity(1);

        stakingContract.deposit(poolId, IERC20(PAIR_ADDRESS).balanceOf(address(this)));
    }

    
    function enableToken(address _token) external {
        IERC20(_token).approve(UNISWAP_ROUTER_ADDRESS, type(uint256).max);
    }

    
    function getEstimatedHexForToken(address _token, uint256 _amount) public view returns (uint[] memory) {
        return uniswapRouter.getAmountsOut(_amount, getTokenPath(_token)); 
    }

    function getEstimatedHTTForToken(uint256 _amount) public view returns (uint[] memory) {
        return uniswapRouter.getAmountsOut(_amount, getTokenPath2()); 
    }

    function getEstimatedEHEXForHex(uint256 _amount) public view returns (uint[] memory) {
        return uniswapRouter.getAmountsOut(_amount, getTokenPath3()); 
    }
    
    function getTokenPath(address _token) private view returns (address[] memory) {
        address[] memory path = new address[](2);
        path[0] = _token;
        path[1] = HEX;
        return path;
    }

    function getTokenPath2() private view returns (address[] memory) {
        address[] memory path = new address[](2);
        path[0] = HEX;
        path[1] = HTT5000;
        return path;
    }

    function getTokenPath3() private view returns (address[] memory) {
        address[] memory path = new address[](2);
        path[0] = HEX;
        path[1] = EHEX;
        return path;
    }

    function provideLiquidity(uint256 _slippageTolerance) public {
        uint256 incBalance = IERC20(HEX).balanceOf(address(this));
        uint256 printBalance = IERC20(HTT5000).balanceOf(address(this));
        require(incBalance > 0 && printBalance > 0, "No tokens to provide liquidity");
        
        uint deadline = block.timestamp + 15;
        
        // Get the current ratio in the pool
        (uint256 reserveInc, uint256 reservePrint) = getReserves(HEX, HTT5000);
        
        uint256 amountIncToUse = incBalance;
        uint256 amountPrintToUse = printBalance;
        
        // If pool exists, calculate optimal amounts
        if (reserveInc > 0 && reservePrint > 0) {
            uint256 optimalPrintForInc = (incBalance * reservePrint) / reserveInc;
            
            if (optimalPrintForInc <= printBalance) {
                // We have enough PRINT for the INC we have
                amountPrintToUse = optimalPrintForInc;
            } else {
                // We have more INC than needed for the PRINT we have
                uint256 optimalIncForPrint = (printBalance * reserveInc) / reservePrint;
                amountIncToUse = optimalIncForPrint;
            }
        }
        
        uniswapRouter.addLiquidity(
            HEX,
            HTT5000,
            amountIncToUse,
            amountPrintToUse,
            amountIncToUse * (100 - _slippageTolerance) / 100,
            amountPrintToUse * (100 - _slippageTolerance) / 100,
            address(this),
            deadline
        );
    }

    function getReserves(address tokenA, address tokenB) public view returns (uint256 reserveA, uint256 reserveB) {
        address pair = PAIR_ADDRESS;
        
        if (pair == address(0)) {
            return (0, 0);
        }
        
        (uint256 reserve0, uint256 reserve1, ) = IUniswapV2Pair(pair).getReserves();
        
        // Check token order in the pair
        address token0 = IUniswapV2Pair(pair).token0();
        
        if (token0 == tokenA) {
            return (reserve0, reserve1);
        } else {
            return (reserve1, reserve0);
        }
    }

    function governor() public view returns (address) {
        return IDTX(DTX).governor();
    }

    function treasury() public view returns (address) {
        return IGovernor(governor()).treasuryWallet();
    }

    function stopStaking() external {
        require(msg.sender == governor(), "only thru decentralized Governance");
        (uint256 _amount, ) = stakingContract.userInfo(poolId, address(this));
        stakingContract.withdraw(poolId, _amount);

        require(IERC20(ACTR).transfer(treasury(), IERC20(ACTR).balanceOf(address(this))));
        require(IERC20(PAIR_ADDRESS).transfer(treasury(), IERC20(PAIR_ADDRESS).balanceOf(address(this))));
    }

    function withdrawERC(address _a) external {
        require(msg.sender == governor(), "only thru decentralized Governance");
        require(IERC20(_a).transfer(treasury(), IERC20(_a).balanceOf(address(this))));
    }

    function emergencyWithdraw() external {
        require(!canWithdraw, "withdrawal already enabled");
        if(!withdrawalStarted) {
            require(IVoting(votingCreditContract).burnedForId(haltProposalStartingId + 1000 + withdrawalStartedCount) > 3000000 * 1e18, "insufficient burned voting credit");   
            withdrawalStarted = true;
            withdrawalStartedTime = block.timestamp;
        } else {
            require(block.timestamp > withdrawalStartedTime + 20 hours, "must wait 20hours");// after 20 hours
                if(IVoting(votingCreditContract).burnedForId(haltProposalStartingId + 1000 + withdrawalStartedCount) >
                                    IVoting(votingCreditContract).burnedForId(haltProposalStartingId + 1000 + withdrawalStartedCount + 1)) {
                    canWithdraw = true;
                } else {
                    withdrawalStarted = false;
                    withdrawalStartedCount = withdrawalStartedCount + 2;
                }
            }
        }
    

     function stopStaking2() external {
        require(canWithdraw, "Withdrawal not allowed");
        (uint256 _amount, ) = stakingContract.userInfo(poolId, address(this));
        stakingContract.withdraw(poolId, _amount);

        require(IERC20(ACTR).transfer(treasury(), IERC20(ACTR).balanceOf(address(this))));
        require(IERC20(PAIR_ADDRESS).transfer(treasury(), IERC20(PAIR_ADDRESS).balanceOf(address(this))));
    }

    function withdrawToken(address _token) external {
        require(canWithdraw, "Withdrawal not allowed");
        require(IERC20(_token).transfer(treasury(), IERC20(_token).balanceOf(address(this))));
    }

}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"ACTR","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"DTX","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"EHEX","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"HEX","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"HTT5000","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"PAIR_ADDRESS","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"PLSX","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"UNISWAP_ROUTER_ADDRESS","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"canWithdraw","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"emergencyWithdraw","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"enableToken","inputs":[{"type":"address","name":"_token","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"farmingContract","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256[]","name":"","internalType":"uint256[]"}],"name":"getEstimatedEHEXForHex","inputs":[{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256[]","name":"","internalType":"uint256[]"}],"name":"getEstimatedHTTForToken","inputs":[{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256[]","name":"","internalType":"uint256[]"}],"name":"getEstimatedHexForToken","inputs":[{"type":"address","name":"_token","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"reserveA","internalType":"uint256"},{"type":"uint256","name":"reserveB","internalType":"uint256"}],"name":"getReserves","inputs":[{"type":"address","name":"tokenA","internalType":"address"},{"type":"address","name":"tokenB","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"governor","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"haltProposalStartingId","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"harvest","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"poolId","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"provideLiquidity","inputs":[{"type":"uint256","name":"_slippageTolerance","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"stopStaking","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"stopStaking2","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"swapTokenForHTTandHEX","inputs":[{"type":"address","name":"_token","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"treasury","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IUniswapV2Router02"}],"name":"uniswapRouter","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"votingCreditContract","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdrawERC","inputs":[{"type":"address","name":"_a","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdrawToken","inputs":[{"type":"address","name":"_token","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"withdrawalStarted","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"withdrawalStartedCount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"withdrawalStartedTime","inputs":[]}]
              

Contract Creation Code

Verify & Publish
0x6101a060405273faac6a85c3e123ab2cf7669b1024f146cfef0b3873ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1681525073cf14dbcffa6e99a444539abbc9ae273a7bb5d75a73ffffffffffffffffffffffffffffffffffffffff1660a09073ffffffffffffffffffffffffffffffffffffffff168152507395b303987a60c71504d99aa1b13b4da07b0790ab73ffffffffffffffffffffffffffffffffffffffff1660c09073ffffffffffffffffffffffffffffffffffffffff16815250732b591e99afe9f32eaa6214f7b7629768c40eeb3973ffffffffffffffffffffffffffffffffffffffff1660e09073ffffffffffffffffffffffffffffffffffffffff168152507357fde0a71132198bbec939b98976993d8d89d22573ffffffffffffffffffffffffffffffffffffffff166101009073ffffffffffffffffffffffffffffffffffffffff168152507347810bb3ecdc6b080ceb2d39e769f21ff14ab7e973ffffffffffffffffffffffffffffffffffffffff166101209073ffffffffffffffffffffffffffffffffffffffff168152507385df7ce20a4ce0cf859804b45cb540ffe42074da73ffffffffffffffffffffffffffffffffffffffff166101409073ffffffffffffffffffffffffffffffffffffffff16815250734469a40d4243ac1c6cf350d99b6d69b49b5005f173ffffffffffffffffffffffffffffffffffffffff166101609073ffffffffffffffffffffffffffffffffffffffff16815250600261018090815250734469a40d4243ac1c6cf350d99b6d69b49b5005f15f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550630121eac06001555f60025f6101000a81548160ff0219169083151502179055505f6003555f60045f6101000a81548160ff0219169083151502179055505f600555348015620002eb575f80fd5b5073165c3410fc91ef562c50559f7d2289febed552d960065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060c05173ffffffffffffffffffffffffffffffffffffffff1663095ea7b373165c3410fc91ef562c50559f7d2289febed552d97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401620003b392919062000802565b6020604051808303815f875af1158015620003d0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620003f691906200086b565b5060e05173ffffffffffffffffffffffffffffffffffffffff1663095ea7b373165c3410fc91ef562c50559f7d2289febed552d97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016200046a92919062000802565b6020604051808303815f875af115801562000487573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620004ad91906200086b565b506101205173ffffffffffffffffffffffffffffffffffffffff1663095ea7b373165c3410fc91ef562c50559f7d2289febed552d97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016200052292919062000802565b6020604051808303815f875af11580156200053f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200056591906200086b565b506101405173ffffffffffffffffffffffffffffffffffffffff1663095ea7b373165c3410fc91ef562c50559f7d2289febed552d97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401620005da92919062000802565b6020604051808303815f875af1158015620005f7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200061d91906200086b565b506101005173ffffffffffffffffffffffffffffffffffffffff1663095ea7b373165c3410fc91ef562c50559f7d2289febed552d97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016200069292919062000802565b6020604051808303815f875af1158015620006af573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620006d591906200086b565b50730d37481cd2c2e1a309a159fd08d9f6efd0a1f22473ffffffffffffffffffffffffffffffffffffffff1663095ea7b3734469a40d4243ac1c6cf350d99b6d69b49b5005f17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016200075b92919062000802565b6020604051808303815f875af115801562000778573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200079e91906200086b565b506200089b565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620007d082620007a5565b9050919050565b620007e281620007c4565b82525050565b5f819050919050565b620007fc81620007e8565b82525050565b5f604082019050620008175f830185620007d7565b620008266020830184620007f1565b9392505050565b5f80fd5b5f8115159050919050565b620008478162000831565b811462000852575f80fd5b50565b5f8151905062000865816200083c565b92915050565b5f602082840312156200088357620008826200082d565b5b5f620008928482850162000855565b91505092915050565b60805160a05160c05160e0516101005161012051610140516101605161018051613a8d620009e15f395f818161091701528181610aeb01528181610ba60152818161101a015281816110c8015281816119ab0152611a6601525f610a1501525f8181610c1201528181610c5601528181611145015281816111e301528181611279015281816118ea01528181611ad20152611b1601525f8181611641015281816126310152818161274e0152818161283b0152612af601525f8181610fd201528181611481015281816114c50152612c2901525f818161074c01528181610ff601528181611305015281816125960152818161272d0152818161281a015281816129c101528181612a880152612bbb01525f61166501525f8181611774015281816120e501528181612251015261231101525f8181610e9201526120530152613a8d5ff3fe608060405234801561000f575f80fd5b50600436106101ed575f3560e01c8063735de9f71161010d578063c73c103c116100a0578063e95164f51161006f578063e95164f51461052c578063eb521a4c14610548578063ee52df4e14610564578063fa6f098d14610582576101ed565b8063c73c103c146104a3578063d52bb6f4146104d3578063dacec9fa14610504578063db2e21bc14610522576101ed565b8063a972892a116100dc578063a972892a14610441578063b51459fe1461045f578063be20eb4d1461047d578063c690908a14610487576101ed565b8063735de9f7146103cb57806379b36943146103e95780637dbf9a7a146104075780638947606914610425576101ed565b80633e0dc34e1161018557806361d027b31161015457806361d027b3146103415780636285e95c1461035f57806363dd9d741461037d5780636aed6e531461039b576101ed565b80633e0dc34e146102dd57806345ce2a0b146102fb5780634641257d146103195780635c422ff114610323576101ed565b80630c340a24116101c15780630c340a24146102535780630f74c4ba146102715780631b9d0bc2146102a15780631d558966146102bf576101ed565b8062618161146101f157806302eec5681461020d5780630550b2661461022b57806306179f5214610235575b5f80fd5b61020b60048036038101906102069190612d08565b6105a0565b005b610215610a13565b6040516102229190612d42565b60405180910390f35b610233610a37565b005b61023d610e7d565b60405161024a9190612d75565b60405180910390f35b61025b610e8f565b6040516102689190612d42565b60405180910390f35b61028b60048036038101906102869190612dc1565b610f22565b6040516102989190612ea3565b60405180910390f35b6102a9610fd0565b6040516102b69190612d42565b60405180910390f35b6102c7610ff4565b6040516102d49190612d42565b60405180910390f35b6102e5611018565b6040516102f29190612ed2565b60405180910390f35b61030361103c565b6040516103109190612d42565b60405180910390f35b610321611054565b005b61032b6115bf565b6040516103389190612ed2565b60405180910390f35b6103496115c5565b6040516103569190612d42565b60405180910390f35b61036761163f565b6040516103749190612d42565b60405180910390f35b610385611663565b6040516103929190612d42565b60405180910390f35b6103b560048036038101906103b09190612dc1565b611687565b6040516103c29190612ea3565b60405180910390f35b6103d3611735565b6040516103e09190612f46565b60405180910390f35b6103f161175a565b6040516103fe9190612d42565b60405180910390f35b61040f611772565b60405161041c9190612d42565b60405180910390f35b61043f600480360381019061043a9190612d08565b611796565b005b6104496118e8565b6040516104569190612d42565b60405180910390f35b61046761190c565b6040516104749190612d75565b60405180910390f35b61048561191e565b005b6104a1600480360381019061049c9190612d08565b611d3d565b005b6104bd60048036038101906104b89190612f5f565b611df0565b6040516104ca9190612ea3565b60405180910390f35b6104ed60048036038101906104e89190612f9d565b611ea0565b6040516104fb929190612fdb565b60405180910390f35b61050c612051565b6040516105199190612d42565b60405180910390f35b61052a612075565b005b61054660048036038101906105419190612d08565b61241a565b005b610562600480360381019061055d9190612dc1565b612593565b005b61056c612916565b6040516105799190612ed2565b60405180910390f35b61058a61291c565b6040516105979190612ed2565b60405180910390f35b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105d7575f80fd5b5f600f426105e5919061302f565b90505f8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016106219190612d42565b602060405180830381865afa15801561063c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106609190613076565b90505f61066d8483611df0565b90505f816001835161067f91906130a1565b815181106106905761068f6130d4565b5b6020026020010151905060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638803dbee82856106e289612922565b30896040518663ffffffff1660e01b81526004016107049594939291906131b8565b5f604051808303815f875af115801561071f573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906107479190613360565b5060027f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016107a39190612d42565b602060405180830381865afa1580156107be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107e29190613076565b6107ec91906133d4565b92506107f783611687565b9150816001835161080891906130a1565b81518110610819576108186130d4565b5b6020026020010151905060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638803dbee828561086a612a37565b30896040518663ffffffff1660e01b815260040161088c9594939291906131b8565b5f604051808303815f875af11580156108a7573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906108cf9190613360565b506108da6001612593565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2bbb1587f0000000000000000000000000000000000000000000000000000000000000000730d37481cd2c2e1a309a159fd08d9f6efd0a1f22473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016109839190612d42565b602060405180830381865afa15801561099e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109c29190613076565b6040518363ffffffff1660e01b81526004016109df929190612fdb565b5f604051808303815f87803b1580156109f6575f80fd5b505af1158015610a08573d5f803e3d5ffd5b505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b610a3f610e8f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610aac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa390613484565b60405180910390fd5b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166393f1a40b7f0000000000000000000000000000000000000000000000000000000000000000306040518363ffffffff1660e01b8152600401610b289291906134a2565b6040805180830381865afa158015610b42573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b6691906134c9565b5090505f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663441a3e707f0000000000000000000000000000000000000000000000000000000000000000836040518363ffffffff1660e01b8152600401610be3929190612fdb565b5f604051808303815f87803b158015610bfa575f80fd5b505af1158015610c0c573d5f803e3d5ffd5b505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610c546115c5565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610cad9190612d42565b602060405180830381865afa158015610cc8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cec9190613076565b6040518363ffffffff1660e01b8152600401610d09929190613507565b6020604051808303815f875af1158015610d25573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d499190613558565b610d51575f80fd5b730d37481cd2c2e1a309a159fd08d9f6efd0a1f22473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610d896115c5565b730d37481cd2c2e1a309a159fd08d9f6efd0a1f22473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610dd69190612d42565b602060405180830381865afa158015610df1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e159190613076565b6040518363ffffffff1660e01b8152600401610e32929190613507565b6020604051808303815f875af1158015610e4e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e729190613558565b610e7a575f80fd5b50565b60025f9054906101000a900460ff1681565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16630c340a246040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ef9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f1d9190613597565b905090565b606060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f83610f6a612b6a565b6040518363ffffffff1660e01b8152600401610f879291906135c2565b5f60405180830381865afa158015610fa1573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610fc99190613360565b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b730d37481cd2c2e1a309a159fd08d9f6efd0a1f22481565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461108b575f80fd5b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663441a3e707f00000000000000000000000000000000000000000000000000000000000000005f6040518363ffffffff1660e01b8152600401611105929190613629565b5f604051808303815f87803b15801561111c575f80fd5b505af115801561112e573d5f803e3d5ffd5b505050505f600f42611140919061302f565b90505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161119c9190612d42565b602060405180830381865afa1580156111b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111db9190613076565b90505f6112087f000000000000000000000000000000000000000000000000000000000000000083611df0565b90505f816001835161121a91906130a1565b8151811061122b5761122a6130d4565b5b6020026020010151905060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638803dbee828561129d7f0000000000000000000000000000000000000000000000000000000000000000612922565b30896040518663ffffffff1660e01b81526004016112bf9594939291906131b8565b5f604051808303815f875af11580156112da573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906113029190613360565b507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161135c9190612d42565b602060405180830381865afa158015611377573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061139b9190613076565b92506113a683610f22565b915081600183516113b791906130a1565b815181106113c8576113c76130d4565b5b6020026020010151905060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638803dbee8285611419612b6a565b30896040518663ffffffff1660e01b815260040161143b9594939291906131b8565b5f604051808303815f875af1158015611456573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061147e9190613360565b507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6114c36115c5565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161151c9190612d42565b602060405180830381865afa158015611537573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061155b9190613076565b6040518363ffffffff1660e01b8152600401611578929190613507565b6020604051808303815f875af1158015611594573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115b89190613558565b5050505050565b60055481565b5f6115ce610e8f565b73ffffffffffffffffffffffffffffffffffffffff16634626402b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611616573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061163a9190613597565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b606060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f836116cf612a37565b6040518363ffffffff1660e01b81526004016116ec9291906135c2565b5f60405180830381865afa158015611706573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061172e9190613360565b9050919050565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b73165c3410fc91ef562c50559f7d2289febed552d981565b7f000000000000000000000000000000000000000000000000000000000000000081565b60045f9054906101000a900460ff166117e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117db9061369a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6118086115c5565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016118419190612d42565b602060405180830381865afa15801561185c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118809190613076565b6040518363ffffffff1660e01b815260040161189d929190613507565b6020604051808303815f875af11580156118b9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118dd9190613558565b6118e5575f80fd5b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b60045f9054906101000a900460ff1681565b60045f9054906101000a900460ff1661196c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119639061369a565b60405180910390fd5b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166393f1a40b7f0000000000000000000000000000000000000000000000000000000000000000306040518363ffffffff1660e01b81526004016119e89291906134a2565b6040805180830381865afa158015611a02573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a2691906134c9565b5090505f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663441a3e707f0000000000000000000000000000000000000000000000000000000000000000836040518363ffffffff1660e01b8152600401611aa3929190612fdb565b5f604051808303815f87803b158015611aba575f80fd5b505af1158015611acc573d5f803e3d5ffd5b505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611b146115c5565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611b6d9190612d42565b602060405180830381865afa158015611b88573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bac9190613076565b6040518363ffffffff1660e01b8152600401611bc9929190613507565b6020604051808303815f875af1158015611be5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c099190613558565b611c11575f80fd5b730d37481cd2c2e1a309a159fd08d9f6efd0a1f22473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611c496115c5565b730d37481cd2c2e1a309a159fd08d9f6efd0a1f22473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611c969190612d42565b602060405180830381865afa158015611cb1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cd59190613076565b6040518363ffffffff1660e01b8152600401611cf2929190613507565b6020604051808303815f875af1158015611d0e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d329190613558565b611d3a575f80fd5b50565b8073ffffffffffffffffffffffffffffffffffffffff1663095ea7b373165c3410fc91ef562c50559f7d2289febed552d97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401611dac929190613507565b6020604051808303815f875af1158015611dc8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dec9190613558565b5050565b606060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f83611e3986612922565b6040518363ffffffff1660e01b8152600401611e569291906135c2565b5f60405180830381865afa158015611e70573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611e989190613360565b905092915050565b5f805f730d37481cd2c2e1a309a159fd08d9f6efd0a1f22490505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ef9575f80925092505061204a565b5f808273ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611f44573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f689190613734565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691505f8373ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015611fd7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ffb9190613597565b90508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361203f578282955095505050505061204a565b818395509550505050505b9250929050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60045f9054906101000a900460ff16156120c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bb906137ce565b60405180910390fd5b60025f9054906101000a900460ff166121fd576a027b46536c66c8e30000007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b03013f06005546103e8600154612132919061302f565b61213c919061302f565b6040518263ffffffff1660e01b81526004016121589190612ed2565b602060405180830381865afa158015612173573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121979190613076565b116121d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ce9061385c565b60405180910390fd5b600160025f6101000a81548160ff02191690831515021790555042600381905550612418565b6201194060035461220e919061302f565b421161224f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612246906138c4565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b03013f060016005546103e86001546122a0919061302f565b6122aa919061302f565b6122b4919061302f565b6040518263ffffffff1660e01b81526004016122d09190612ed2565b602060405180830381865afa1580156122eb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061230f9190613076565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b03013f06005546103e860015461235e919061302f565b612368919061302f565b6040518263ffffffff1660e01b81526004016123849190612ed2565b602060405180830381865afa15801561239f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123c39190613076565b11156123e857600160045f6101000a81548160ff021916908315150217905550612417565b5f60025f6101000a81548160ff0219169083151502179055506002600554612410919061302f565b6005819055505b5b565b612422610e8f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461248f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248690613484565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6124b36115c5565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016124ec9190612d42565b602060405180830381865afa158015612507573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061252b9190613076565b6040518363ffffffff1660e01b8152600401612548929190613507565b6020604051808303815f875af1158015612564573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125889190613558565b612590575f80fd5b50565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016125ed9190612d42565b602060405180830381865afa158015612608573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061262c9190613076565b90505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016126889190612d42565b602060405180830381865afa1580156126a3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126c79190613076565b90505f821180156126d757505f81115b612716576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270d9061392c565b60405180910390fd5b5f600f42612724919061302f565b90505f806127727f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611ea0565b915091505f8590505f8590505f8411801561278c57505f83115b156127db575f84848961279f919061394a565b6127a991906133d4565b90508681116127ba578091506127d9565b5f8486896127c8919061394a565b6127d291906133d4565b9050809350505b505b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e8e337007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000858560648e606461286b91906130a1565b89612876919061394a565b61288091906133d4565b60648f606461288f91906130a1565b8961289a919061394a565b6128a491906133d4565b308d6040518963ffffffff1660e01b81526004016128c998979695949392919061398b565b6060604051808303815f875af11580156128e5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129099190613a07565b5050505050505050505050565b60015481565b60035481565b60605f600267ffffffffffffffff8111156129405761293f613224565b5b60405190808252806020026020018201604052801561296e5781602001602082028036833780820191505090505b50905082815f81518110612985576129846130d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000000000000000000000000000000000000000000000816001815181106129f4576129f36130d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080915050919050565b60605f600267ffffffffffffffff811115612a5557612a54613224565b5b604051908082528060200260200182016040528015612a835781602001602082028036833780820191505090505b5090507f0000000000000000000000000000000000000000000000000000000000000000815f81518110612aba57612ab96130d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110612b2957612b286130d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508091505090565b60605f600267ffffffffffffffff811115612b8857612b87613224565b5b604051908082528060200260200182016040528015612bb65781602001602082028036833780820191505090505b5090507f0000000000000000000000000000000000000000000000000000000000000000815f81518110612bed57612bec6130d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110612c5c57612c5b6130d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508091505090565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612cd782612cae565b9050919050565b612ce781612ccd565b8114612cf1575f80fd5b50565b5f81359050612d0281612cde565b92915050565b5f60208284031215612d1d57612d1c612ca6565b5b5f612d2a84828501612cf4565b91505092915050565b612d3c81612ccd565b82525050565b5f602082019050612d555f830184612d33565b92915050565b5f8115159050919050565b612d6f81612d5b565b82525050565b5f602082019050612d885f830184612d66565b92915050565b5f819050919050565b612da081612d8e565b8114612daa575f80fd5b50565b5f81359050612dbb81612d97565b92915050565b5f60208284031215612dd657612dd5612ca6565b5b5f612de384828501612dad565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b612e1e81612d8e565b82525050565b5f612e2f8383612e15565b60208301905092915050565b5f602082019050919050565b5f612e5182612dec565b612e5b8185612df6565b9350612e6683612e06565b805f5b83811015612e96578151612e7d8882612e24565b9750612e8883612e3b565b925050600181019050612e69565b5085935050505092915050565b5f6020820190508181035f830152612ebb8184612e47565b905092915050565b612ecc81612d8e565b82525050565b5f602082019050612ee55f830184612ec3565b92915050565b5f819050919050565b5f612f0e612f09612f0484612cae565b612eeb565b612cae565b9050919050565b5f612f1f82612ef4565b9050919050565b5f612f3082612f15565b9050919050565b612f4081612f26565b82525050565b5f602082019050612f595f830184612f37565b92915050565b5f8060408385031215612f7557612f74612ca6565b5b5f612f8285828601612cf4565b9250506020612f9385828601612dad565b9150509250929050565b5f8060408385031215612fb357612fb2612ca6565b5b5f612fc085828601612cf4565b9250506020612fd185828601612cf4565b9150509250929050565b5f604082019050612fee5f830185612ec3565b612ffb6020830184612ec3565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61303982612d8e565b915061304483612d8e565b925082820190508082111561305c5761305b613002565b5b92915050565b5f8151905061307081612d97565b92915050565b5f6020828403121561308b5761308a612ca6565b5b5f61309884828501613062565b91505092915050565b5f6130ab82612d8e565b91506130b683612d8e565b92508282039050818111156130ce576130cd613002565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61313381612ccd565b82525050565b5f613144838361312a565b60208301905092915050565b5f602082019050919050565b5f61316682613101565b613170818561310b565b935061317b8361311b565b805f5b838110156131ab5781516131928882613139565b975061319d83613150565b92505060018101905061317e565b5085935050505092915050565b5f60a0820190506131cb5f830188612ec3565b6131d86020830187612ec3565b81810360408301526131ea818661315c565b90506131f96060830185612d33565b6132066080830184612ec3565b9695505050505050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61325a82613214565b810181811067ffffffffffffffff8211171561327957613278613224565b5b80604052505050565b5f61328b612c9d565b90506132978282613251565b919050565b5f67ffffffffffffffff8211156132b6576132b5613224565b5b602082029050602081019050919050565b5f80fd5b5f6132dd6132d88461329c565b613282565b90508083825260208201905060208402830185811115613300576132ff6132c7565b5b835b8181101561332957806133158882613062565b845260208401935050602081019050613302565b5050509392505050565b5f82601f83011261334757613346613210565b5b81516133578482602086016132cb565b91505092915050565b5f6020828403121561337557613374612ca6565b5b5f82015167ffffffffffffffff81111561339257613391612caa565b5b61339e84828501613333565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6133de82612d8e565b91506133e983612d8e565b9250826133f9576133f86133a7565b5b828204905092915050565b5f82825260208201905092915050565b7f6f6e6c79207468727520646563656e7472616c697a656420476f7665726e616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f61346e602283613404565b915061347982613414565b604082019050919050565b5f6020820190508181035f83015261349b81613462565b9050919050565b5f6040820190506134b55f830185612ec3565b6134c26020830184612d33565b9392505050565b5f80604083850312156134df576134de612ca6565b5b5f6134ec85828601613062565b92505060206134fd85828601613062565b9150509250929050565b5f60408201905061351a5f830185612d33565b6135276020830184612ec3565b9392505050565b61353781612d5b565b8114613541575f80fd5b50565b5f815190506135528161352e565b92915050565b5f6020828403121561356d5761356c612ca6565b5b5f61357a84828501613544565b91505092915050565b5f8151905061359181612cde565b92915050565b5f602082840312156135ac576135ab612ca6565b5b5f6135b984828501613583565b91505092915050565b5f6040820190506135d55f830185612ec3565b81810360208301526135e7818461315c565b90509392505050565b5f819050919050565b5f61361361360e613609846135f0565b612eeb565b612d8e565b9050919050565b613623816135f9565b82525050565b5f60408201905061363c5f830185612ec3565b613649602083018461361a565b9392505050565b7f5769746864726177616c206e6f7420616c6c6f776564000000000000000000005f82015250565b5f613684601683613404565b915061368f82613650565b602082019050919050565b5f6020820190508181035f8301526136b181613678565b9050919050565b5f6dffffffffffffffffffffffffffff82169050919050565b6136da816136b8565b81146136e4575f80fd5b50565b5f815190506136f5816136d1565b92915050565b5f63ffffffff82169050919050565b613713816136fb565b811461371d575f80fd5b50565b5f8151905061372e8161370a565b92915050565b5f805f6060848603121561374b5761374a612ca6565b5b5f613758868287016136e7565b9350506020613769868287016136e7565b925050604061377a86828701613720565b9150509250925092565b7f7769746864726177616c20616c726561647920656e61626c65640000000000005f82015250565b5f6137b8601a83613404565b91506137c382613784565b602082019050919050565b5f6020820190508181035f8301526137e5816137ac565b9050919050565b7f696e73756666696369656e74206275726e656420766f74696e672063726564695f8201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b5f613846602183613404565b9150613851826137ec565b604082019050919050565b5f6020820190508181035f8301526138738161383a565b9050919050565b7f6d7573742077616974203230686f7572730000000000000000000000000000005f82015250565b5f6138ae601183613404565b91506138b98261387a565b602082019050919050565b5f6020820190508181035f8301526138db816138a2565b9050919050565b7f4e6f20746f6b656e7320746f2070726f76696465206c697175696469747900005f82015250565b5f613916601e83613404565b9150613921826138e2565b602082019050919050565b5f6020820190508181035f8301526139438161390a565b9050919050565b5f61395482612d8e565b915061395f83612d8e565b925082820261396d81612d8e565b9150828204841483151761398457613983613002565b5b5092915050565b5f6101008201905061399f5f83018b612d33565b6139ac602083018a612d33565b6139b96040830189612ec3565b6139c66060830188612ec3565b6139d36080830187612ec3565b6139e060a0830186612ec3565b6139ed60c0830185612d33565b6139fa60e0830184612ec3565b9998505050505050505050565b5f805f60608486031215613a1e57613a1d612ca6565b5b5f613a2b86828701613062565b9350506020613a3c86828701613062565b9250506040613a4d86828701613062565b915050925092509256fea2646970667358221220468a39e99f35b06685f672ab182af0a4bdb0802bbb9a3e7099e3452bf952086764736f6c63430008140033

Deployed ByteCode

0x608060405234801561000f575f80fd5b50600436106101ed575f3560e01c8063735de9f71161010d578063c73c103c116100a0578063e95164f51161006f578063e95164f51461052c578063eb521a4c14610548578063ee52df4e14610564578063fa6f098d14610582576101ed565b8063c73c103c146104a3578063d52bb6f4146104d3578063dacec9fa14610504578063db2e21bc14610522576101ed565b8063a972892a116100dc578063a972892a14610441578063b51459fe1461045f578063be20eb4d1461047d578063c690908a14610487576101ed565b8063735de9f7146103cb57806379b36943146103e95780637dbf9a7a146104075780638947606914610425576101ed565b80633e0dc34e1161018557806361d027b31161015457806361d027b3146103415780636285e95c1461035f57806363dd9d741461037d5780636aed6e531461039b576101ed565b80633e0dc34e146102dd57806345ce2a0b146102fb5780634641257d146103195780635c422ff114610323576101ed565b80630c340a24116101c15780630c340a24146102535780630f74c4ba146102715780631b9d0bc2146102a15780631d558966146102bf576101ed565b8062618161146101f157806302eec5681461020d5780630550b2661461022b57806306179f5214610235575b5f80fd5b61020b60048036038101906102069190612d08565b6105a0565b005b610215610a13565b6040516102229190612d42565b60405180910390f35b610233610a37565b005b61023d610e7d565b60405161024a9190612d75565b60405180910390f35b61025b610e8f565b6040516102689190612d42565b60405180910390f35b61028b60048036038101906102869190612dc1565b610f22565b6040516102989190612ea3565b60405180910390f35b6102a9610fd0565b6040516102b69190612d42565b60405180910390f35b6102c7610ff4565b6040516102d49190612d42565b60405180910390f35b6102e5611018565b6040516102f29190612ed2565b60405180910390f35b61030361103c565b6040516103109190612d42565b60405180910390f35b610321611054565b005b61032b6115bf565b6040516103389190612ed2565b60405180910390f35b6103496115c5565b6040516103569190612d42565b60405180910390f35b61036761163f565b6040516103749190612d42565b60405180910390f35b610385611663565b6040516103929190612d42565b60405180910390f35b6103b560048036038101906103b09190612dc1565b611687565b6040516103c29190612ea3565b60405180910390f35b6103d3611735565b6040516103e09190612f46565b60405180910390f35b6103f161175a565b6040516103fe9190612d42565b60405180910390f35b61040f611772565b60405161041c9190612d42565b60405180910390f35b61043f600480360381019061043a9190612d08565b611796565b005b6104496118e8565b6040516104569190612d42565b60405180910390f35b61046761190c565b6040516104749190612d75565b60405180910390f35b61048561191e565b005b6104a1600480360381019061049c9190612d08565b611d3d565b005b6104bd60048036038101906104b89190612f5f565b611df0565b6040516104ca9190612ea3565b60405180910390f35b6104ed60048036038101906104e89190612f9d565b611ea0565b6040516104fb929190612fdb565b60405180910390f35b61050c612051565b6040516105199190612d42565b60405180910390f35b61052a612075565b005b61054660048036038101906105419190612d08565b61241a565b005b610562600480360381019061055d9190612dc1565b612593565b005b61056c612916565b6040516105799190612ed2565b60405180910390f35b61058a61291c565b6040516105979190612ed2565b60405180910390f35b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105d7575f80fd5b5f600f426105e5919061302f565b90505f8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016106219190612d42565b602060405180830381865afa15801561063c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106609190613076565b90505f61066d8483611df0565b90505f816001835161067f91906130a1565b815181106106905761068f6130d4565b5b6020026020010151905060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638803dbee82856106e289612922565b30896040518663ffffffff1660e01b81526004016107049594939291906131b8565b5f604051808303815f875af115801561071f573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906107479190613360565b5060027f0000000000000000000000002b591e99afe9f32eaa6214f7b7629768c40eeb3973ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016107a39190612d42565b602060405180830381865afa1580156107be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107e29190613076565b6107ec91906133d4565b92506107f783611687565b9150816001835161080891906130a1565b81518110610819576108186130d4565b5b6020026020010151905060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638803dbee828561086a612a37565b30896040518663ffffffff1660e01b815260040161088c9594939291906131b8565b5f604051808303815f875af11580156108a7573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906108cf9190613360565b506108da6001612593565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2bbb1587f0000000000000000000000000000000000000000000000000000000000000002730d37481cd2c2e1a309a159fd08d9f6efd0a1f22473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016109839190612d42565b602060405180830381865afa15801561099e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109c29190613076565b6040518363ffffffff1660e01b81526004016109df929190612fdb565b5f604051808303815f87803b1580156109f6575f80fd5b505af1158015610a08573d5f803e3d5ffd5b505050505050505050565b7f0000000000000000000000004469a40d4243ac1c6cf350d99b6d69b49b5005f181565b610a3f610e8f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610aac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa390613484565b60405180910390fd5b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166393f1a40b7f0000000000000000000000000000000000000000000000000000000000000002306040518363ffffffff1660e01b8152600401610b289291906134a2565b6040805180830381865afa158015610b42573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b6691906134c9565b5090505f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663441a3e707f0000000000000000000000000000000000000000000000000000000000000002836040518363ffffffff1660e01b8152600401610be3929190612fdb565b5f604051808303815f87803b158015610bfa575f80fd5b505af1158015610c0c573d5f803e3d5ffd5b505050507f00000000000000000000000085df7ce20a4ce0cf859804b45cb540ffe42074da73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610c546115c5565b7f00000000000000000000000085df7ce20a4ce0cf859804b45cb540ffe42074da73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610cad9190612d42565b602060405180830381865afa158015610cc8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cec9190613076565b6040518363ffffffff1660e01b8152600401610d09929190613507565b6020604051808303815f875af1158015610d25573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d499190613558565b610d51575f80fd5b730d37481cd2c2e1a309a159fd08d9f6efd0a1f22473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610d896115c5565b730d37481cd2c2e1a309a159fd08d9f6efd0a1f22473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610dd69190612d42565b602060405180830381865afa158015610df1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e159190613076565b6040518363ffffffff1660e01b8152600401610e32929190613507565b6020604051808303815f875af1158015610e4e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e729190613558565b610e7a575f80fd5b50565b60025f9054906101000a900460ff1681565b5f7f000000000000000000000000faac6a85c3e123ab2cf7669b1024f146cfef0b3873ffffffffffffffffffffffffffffffffffffffff16630c340a246040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ef9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f1d9190613597565b905090565b606060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f83610f6a612b6a565b6040518363ffffffff1660e01b8152600401610f879291906135c2565b5f60405180830381865afa158015610fa1573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610fc99190613360565b9050919050565b7f00000000000000000000000057fde0a71132198bbec939b98976993d8d89d22581565b7f0000000000000000000000002b591e99afe9f32eaa6214f7b7629768c40eeb3981565b7f000000000000000000000000000000000000000000000000000000000000000281565b730d37481cd2c2e1a309a159fd08d9f6efd0a1f22481565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461108b575f80fd5b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663441a3e707f00000000000000000000000000000000000000000000000000000000000000025f6040518363ffffffff1660e01b8152600401611105929190613629565b5f604051808303815f87803b15801561111c575f80fd5b505af115801561112e573d5f803e3d5ffd5b505050505f600f42611140919061302f565b90505f7f00000000000000000000000085df7ce20a4ce0cf859804b45cb540ffe42074da73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161119c9190612d42565b602060405180830381865afa1580156111b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111db9190613076565b90505f6112087f00000000000000000000000085df7ce20a4ce0cf859804b45cb540ffe42074da83611df0565b90505f816001835161121a91906130a1565b8151811061122b5761122a6130d4565b5b6020026020010151905060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638803dbee828561129d7f00000000000000000000000085df7ce20a4ce0cf859804b45cb540ffe42074da612922565b30896040518663ffffffff1660e01b81526004016112bf9594939291906131b8565b5f604051808303815f875af11580156112da573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906113029190613360565b507f0000000000000000000000002b591e99afe9f32eaa6214f7b7629768c40eeb3973ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161135c9190612d42565b602060405180830381865afa158015611377573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061139b9190613076565b92506113a683610f22565b915081600183516113b791906130a1565b815181106113c8576113c76130d4565b5b6020026020010151905060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638803dbee8285611419612b6a565b30896040518663ffffffff1660e01b815260040161143b9594939291906131b8565b5f604051808303815f875af1158015611456573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061147e9190613360565b507f00000000000000000000000057fde0a71132198bbec939b98976993d8d89d22573ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6114c36115c5565b7f00000000000000000000000057fde0a71132198bbec939b98976993d8d89d22573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161151c9190612d42565b602060405180830381865afa158015611537573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061155b9190613076565b6040518363ffffffff1660e01b8152600401611578929190613507565b6020604051808303815f875af1158015611594573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115b89190613558565b5050505050565b60055481565b5f6115ce610e8f565b73ffffffffffffffffffffffffffffffffffffffff16634626402b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611616573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061163a9190613597565b905090565b7f00000000000000000000000047810bb3ecdc6b080ceb2d39e769f21ff14ab7e981565b7f00000000000000000000000095b303987a60c71504d99aa1b13b4da07b0790ab81565b606060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f836116cf612a37565b6040518363ffffffff1660e01b81526004016116ec9291906135c2565b5f60405180830381865afa158015611706573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061172e9190613360565b9050919050565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b73165c3410fc91ef562c50559f7d2289febed552d981565b7f000000000000000000000000cf14dbcffa6e99a444539abbc9ae273a7bb5d75a81565b60045f9054906101000a900460ff166117e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117db9061369a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6118086115c5565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016118419190612d42565b602060405180830381865afa15801561185c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118809190613076565b6040518363ffffffff1660e01b815260040161189d929190613507565b6020604051808303815f875af11580156118b9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118dd9190613558565b6118e5575f80fd5b50565b7f00000000000000000000000085df7ce20a4ce0cf859804b45cb540ffe42074da81565b60045f9054906101000a900460ff1681565b60045f9054906101000a900460ff1661196c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119639061369a565b60405180910390fd5b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166393f1a40b7f0000000000000000000000000000000000000000000000000000000000000002306040518363ffffffff1660e01b81526004016119e89291906134a2565b6040805180830381865afa158015611a02573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a2691906134c9565b5090505f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663441a3e707f0000000000000000000000000000000000000000000000000000000000000002836040518363ffffffff1660e01b8152600401611aa3929190612fdb565b5f604051808303815f87803b158015611aba575f80fd5b505af1158015611acc573d5f803e3d5ffd5b505050507f00000000000000000000000085df7ce20a4ce0cf859804b45cb540ffe42074da73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611b146115c5565b7f00000000000000000000000085df7ce20a4ce0cf859804b45cb540ffe42074da73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611b6d9190612d42565b602060405180830381865afa158015611b88573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bac9190613076565b6040518363ffffffff1660e01b8152600401611bc9929190613507565b6020604051808303815f875af1158015611be5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c099190613558565b611c11575f80fd5b730d37481cd2c2e1a309a159fd08d9f6efd0a1f22473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611c496115c5565b730d37481cd2c2e1a309a159fd08d9f6efd0a1f22473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611c969190612d42565b602060405180830381865afa158015611cb1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cd59190613076565b6040518363ffffffff1660e01b8152600401611cf2929190613507565b6020604051808303815f875af1158015611d0e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d329190613558565b611d3a575f80fd5b50565b8073ffffffffffffffffffffffffffffffffffffffff1663095ea7b373165c3410fc91ef562c50559f7d2289febed552d97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401611dac929190613507565b6020604051808303815f875af1158015611dc8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dec9190613558565b5050565b606060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f83611e3986612922565b6040518363ffffffff1660e01b8152600401611e569291906135c2565b5f60405180830381865afa158015611e70573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611e989190613360565b905092915050565b5f805f730d37481cd2c2e1a309a159fd08d9f6efd0a1f22490505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ef9575f80925092505061204a565b5f808273ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611f44573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f689190613734565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691505f8373ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015611fd7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ffb9190613597565b90508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361203f578282955095505050505061204a565b818395509550505050505b9250929050565b7f000000000000000000000000faac6a85c3e123ab2cf7669b1024f146cfef0b3881565b60045f9054906101000a900460ff16156120c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bb906137ce565b60405180910390fd5b60025f9054906101000a900460ff166121fd576a027b46536c66c8e30000007f000000000000000000000000cf14dbcffa6e99a444539abbc9ae273a7bb5d75a73ffffffffffffffffffffffffffffffffffffffff1663b03013f06005546103e8600154612132919061302f565b61213c919061302f565b6040518263ffffffff1660e01b81526004016121589190612ed2565b602060405180830381865afa158015612173573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121979190613076565b116121d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ce9061385c565b60405180910390fd5b600160025f6101000a81548160ff02191690831515021790555042600381905550612418565b6201194060035461220e919061302f565b421161224f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612246906138c4565b60405180910390fd5b7f000000000000000000000000cf14dbcffa6e99a444539abbc9ae273a7bb5d75a73ffffffffffffffffffffffffffffffffffffffff1663b03013f060016005546103e86001546122a0919061302f565b6122aa919061302f565b6122b4919061302f565b6040518263ffffffff1660e01b81526004016122d09190612ed2565b602060405180830381865afa1580156122eb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061230f9190613076565b7f000000000000000000000000cf14dbcffa6e99a444539abbc9ae273a7bb5d75a73ffffffffffffffffffffffffffffffffffffffff1663b03013f06005546103e860015461235e919061302f565b612368919061302f565b6040518263ffffffff1660e01b81526004016123849190612ed2565b602060405180830381865afa15801561239f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123c39190613076565b11156123e857600160045f6101000a81548160ff021916908315150217905550612417565b5f60025f6101000a81548160ff0219169083151502179055506002600554612410919061302f565b6005819055505b5b565b612422610e8f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461248f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248690613484565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6124b36115c5565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016124ec9190612d42565b602060405180830381865afa158015612507573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061252b9190613076565b6040518363ffffffff1660e01b8152600401612548929190613507565b6020604051808303815f875af1158015612564573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125889190613558565b612590575f80fd5b50565b5f7f0000000000000000000000002b591e99afe9f32eaa6214f7b7629768c40eeb3973ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016125ed9190612d42565b602060405180830381865afa158015612608573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061262c9190613076565b90505f7f00000000000000000000000047810bb3ecdc6b080ceb2d39e769f21ff14ab7e973ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016126889190612d42565b602060405180830381865afa1580156126a3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126c79190613076565b90505f821180156126d757505f81115b612716576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270d9061392c565b60405180910390fd5b5f600f42612724919061302f565b90505f806127727f0000000000000000000000002b591e99afe9f32eaa6214f7b7629768c40eeb397f00000000000000000000000047810bb3ecdc6b080ceb2d39e769f21ff14ab7e9611ea0565b915091505f8590505f8590505f8411801561278c57505f83115b156127db575f84848961279f919061394a565b6127a991906133d4565b90508681116127ba578091506127d9565b5f8486896127c8919061394a565b6127d291906133d4565b9050809350505b505b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e8e337007f0000000000000000000000002b591e99afe9f32eaa6214f7b7629768c40eeb397f00000000000000000000000047810bb3ecdc6b080ceb2d39e769f21ff14ab7e9858560648e606461286b91906130a1565b89612876919061394a565b61288091906133d4565b60648f606461288f91906130a1565b8961289a919061394a565b6128a491906133d4565b308d6040518963ffffffff1660e01b81526004016128c998979695949392919061398b565b6060604051808303815f875af11580156128e5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129099190613a07565b5050505050505050505050565b60015481565b60035481565b60605f600267ffffffffffffffff8111156129405761293f613224565b5b60405190808252806020026020018201604052801561296e5781602001602082028036833780820191505090505b50905082815f81518110612985576129846130d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000002b591e99afe9f32eaa6214f7b7629768c40eeb39816001815181106129f4576129f36130d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080915050919050565b60605f600267ffffffffffffffff811115612a5557612a54613224565b5b604051908082528060200260200182016040528015612a835781602001602082028036833780820191505090505b5090507f0000000000000000000000002b591e99afe9f32eaa6214f7b7629768c40eeb39815f81518110612aba57612ab96130d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f00000000000000000000000047810bb3ecdc6b080ceb2d39e769f21ff14ab7e981600181518110612b2957612b286130d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508091505090565b60605f600267ffffffffffffffff811115612b8857612b87613224565b5b604051908082528060200260200182016040528015612bb65781602001602082028036833780820191505090505b5090507f0000000000000000000000002b591e99afe9f32eaa6214f7b7629768c40eeb39815f81518110612bed57612bec6130d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f00000000000000000000000057fde0a71132198bbec939b98976993d8d89d22581600181518110612c5c57612c5b6130d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508091505090565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612cd782612cae565b9050919050565b612ce781612ccd565b8114612cf1575f80fd5b50565b5f81359050612d0281612cde565b92915050565b5f60208284031215612d1d57612d1c612ca6565b5b5f612d2a84828501612cf4565b91505092915050565b612d3c81612ccd565b82525050565b5f602082019050612d555f830184612d33565b92915050565b5f8115159050919050565b612d6f81612d5b565b82525050565b5f602082019050612d885f830184612d66565b92915050565b5f819050919050565b612da081612d8e565b8114612daa575f80fd5b50565b5f81359050612dbb81612d97565b92915050565b5f60208284031215612dd657612dd5612ca6565b5b5f612de384828501612dad565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b612e1e81612d8e565b82525050565b5f612e2f8383612e15565b60208301905092915050565b5f602082019050919050565b5f612e5182612dec565b612e5b8185612df6565b9350612e6683612e06565b805f5b83811015612e96578151612e7d8882612e24565b9750612e8883612e3b565b925050600181019050612e69565b5085935050505092915050565b5f6020820190508181035f830152612ebb8184612e47565b905092915050565b612ecc81612d8e565b82525050565b5f602082019050612ee55f830184612ec3565b92915050565b5f819050919050565b5f612f0e612f09612f0484612cae565b612eeb565b612cae565b9050919050565b5f612f1f82612ef4565b9050919050565b5f612f3082612f15565b9050919050565b612f4081612f26565b82525050565b5f602082019050612f595f830184612f37565b92915050565b5f8060408385031215612f7557612f74612ca6565b5b5f612f8285828601612cf4565b9250506020612f9385828601612dad565b9150509250929050565b5f8060408385031215612fb357612fb2612ca6565b5b5f612fc085828601612cf4565b9250506020612fd185828601612cf4565b9150509250929050565b5f604082019050612fee5f830185612ec3565b612ffb6020830184612ec3565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61303982612d8e565b915061304483612d8e565b925082820190508082111561305c5761305b613002565b5b92915050565b5f8151905061307081612d97565b92915050565b5f6020828403121561308b5761308a612ca6565b5b5f61309884828501613062565b91505092915050565b5f6130ab82612d8e565b91506130b683612d8e565b92508282039050818111156130ce576130cd613002565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61313381612ccd565b82525050565b5f613144838361312a565b60208301905092915050565b5f602082019050919050565b5f61316682613101565b613170818561310b565b935061317b8361311b565b805f5b838110156131ab5781516131928882613139565b975061319d83613150565b92505060018101905061317e565b5085935050505092915050565b5f60a0820190506131cb5f830188612ec3565b6131d86020830187612ec3565b81810360408301526131ea818661315c565b90506131f96060830185612d33565b6132066080830184612ec3565b9695505050505050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61325a82613214565b810181811067ffffffffffffffff8211171561327957613278613224565b5b80604052505050565b5f61328b612c9d565b90506132978282613251565b919050565b5f67ffffffffffffffff8211156132b6576132b5613224565b5b602082029050602081019050919050565b5f80fd5b5f6132dd6132d88461329c565b613282565b90508083825260208201905060208402830185811115613300576132ff6132c7565b5b835b8181101561332957806133158882613062565b845260208401935050602081019050613302565b5050509392505050565b5f82601f83011261334757613346613210565b5b81516133578482602086016132cb565b91505092915050565b5f6020828403121561337557613374612ca6565b5b5f82015167ffffffffffffffff81111561339257613391612caa565b5b61339e84828501613333565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6133de82612d8e565b91506133e983612d8e565b9250826133f9576133f86133a7565b5b828204905092915050565b5f82825260208201905092915050565b7f6f6e6c79207468727520646563656e7472616c697a656420476f7665726e616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f61346e602283613404565b915061347982613414565b604082019050919050565b5f6020820190508181035f83015261349b81613462565b9050919050565b5f6040820190506134b55f830185612ec3565b6134c26020830184612d33565b9392505050565b5f80604083850312156134df576134de612ca6565b5b5f6134ec85828601613062565b92505060206134fd85828601613062565b9150509250929050565b5f60408201905061351a5f830185612d33565b6135276020830184612ec3565b9392505050565b61353781612d5b565b8114613541575f80fd5b50565b5f815190506135528161352e565b92915050565b5f6020828403121561356d5761356c612ca6565b5b5f61357a84828501613544565b91505092915050565b5f8151905061359181612cde565b92915050565b5f602082840312156135ac576135ab612ca6565b5b5f6135b984828501613583565b91505092915050565b5f6040820190506135d55f830185612ec3565b81810360208301526135e7818461315c565b90509392505050565b5f819050919050565b5f61361361360e613609846135f0565b612eeb565b612d8e565b9050919050565b613623816135f9565b82525050565b5f60408201905061363c5f830185612ec3565b613649602083018461361a565b9392505050565b7f5769746864726177616c206e6f7420616c6c6f776564000000000000000000005f82015250565b5f613684601683613404565b915061368f82613650565b602082019050919050565b5f6020820190508181035f8301526136b181613678565b9050919050565b5f6dffffffffffffffffffffffffffff82169050919050565b6136da816136b8565b81146136e4575f80fd5b50565b5f815190506136f5816136d1565b92915050565b5f63ffffffff82169050919050565b613713816136fb565b811461371d575f80fd5b50565b5f8151905061372e8161370a565b92915050565b5f805f6060848603121561374b5761374a612ca6565b5b5f613758868287016136e7565b9350506020613769868287016136e7565b925050604061377a86828701613720565b9150509250925092565b7f7769746864726177616c20616c726561647920656e61626c65640000000000005f82015250565b5f6137b8601a83613404565b91506137c382613784565b602082019050919050565b5f6020820190508181035f8301526137e5816137ac565b9050919050565b7f696e73756666696369656e74206275726e656420766f74696e672063726564695f8201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b5f613846602183613404565b9150613851826137ec565b604082019050919050565b5f6020820190508181035f8301526138738161383a565b9050919050565b7f6d7573742077616974203230686f7572730000000000000000000000000000005f82015250565b5f6138ae601183613404565b91506138b98261387a565b602082019050919050565b5f6020820190508181035f8301526138db816138a2565b9050919050565b7f4e6f20746f6b656e7320746f2070726f76696465206c697175696469747900005f82015250565b5f613916601e83613404565b9150613921826138e2565b602082019050919050565b5f6020820190508181035f8301526139438161390a565b9050919050565b5f61395482612d8e565b915061395f83612d8e565b925082820261396d81612d8e565b9150828204841483151761398457613983613002565b5b5092915050565b5f6101008201905061399f5f83018b612d33565b6139ac602083018a612d33565b6139b96040830189612ec3565b6139c66060830188612ec3565b6139d36080830187612ec3565b6139e060a0830186612ec3565b6139ed60c0830185612d33565b6139fa60e0830184612ec3565b9998505050505050505050565b5f805f60608486031215613a1e57613a1d612ca6565b5b5f613a2b86828701613062565b9350506020613a3c86828701613062565b9250506040613a4d86828701613062565b915050925092509256fea2646970667358221220468a39e99f35b06685f672ab182af0a4bdb0802bbb9a3e7099e3452bf952086764736f6c63430008140033