false
true
0

Contract Address Details

0xdcE001f55DA9c00c438d4129c6f02000b818e792

Token
Staked T.I.M.E. Dividend (xTIME)
Creator
0x7008d2–e6e3cf at 0x8e44cd–fc32ad
Balance
0 PLS ( )
Tokens
Fetching tokens...
Transactions
583 Transactions
Transfers
0 Transfers
Gas Used
0
Last Balance Update
26038874
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
UpToken




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




EVM Version
default




Verified at
2025-04-07T08:21:24.041162Z

Constructor Arguments

0x000000000000000000000000ca35638a3fddd02fec597d8c1681198c06b23f58

Arg [0] (address) : 0xca35638a3fddd02fec597d8c1681198c06b23f58

              

Contract source code

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

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function symbol() external view returns(string memory);
    function name() external view returns(string memory);

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

    function decimals() external view returns (uint8);

    function approve(address spender, uint256 amount) external returns (bool);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

interface ISwapRouter {
    function factory() external pure returns (address);
    function WPLS() 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);

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

interface ITIMEDividend is IERC20 {
    function claimableDividendOf(address account) external view returns (uint256);

    function claimDividend(address payable recipient, uint256 amount) external returns (uint256);
}

library Address {
    function isContract(address account) internal view returns (bool) {
        uint256 size;
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;
        return c;
    }

    function safeSub(uint256 a, uint256 b) internal pure returns (uint256) {
        if (b > a) {
            return 0;
        } else {
            return a - b;
        }
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }

    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }
}

library SafeERC20 {
    using Address for address;
    using SafeMath for uint256;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    function safeApprove(IERC20 token, address spender, uint256 value) internal {        
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

abstract contract ReentrancyGuard {
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;
    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    modifier nonReentrant() {
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
        _status = _ENTERED;
        _;
        _status = _NOT_ENTERED;
    }
}

contract LiquidityLock is ReentrancyGuard {

    ISwapRouter public constant swapRouter = ISwapRouter(0x165C3410fC91EF562C50559f7d2289fEbed552d9);

    IERC20 public immutable token;

    constructor (address _token) {
        token = IERC20(_token);
    }

    receive () external payable {

    }

    // Buy token, then Add token + PLS to PulseX V2 LP
    function boost() external nonReentrant() returns (bool success) {

        // Get PLS Balance
        uint256 plsBalance = address(this).balance;
        uint256 halfBalance = plsBalance / 2;

        success = (plsBalance > 0);
        require(success, "CANNOT_BOOST_ZERO_PLS");

        address[] memory path = new address[](2);
        path[0] = address(0xA1077a294dDE1B09bB078844df40758a5D0f9a27);
        path[1] = address(token);

        // Buy token on PulseX V2 with PLS
        swapRouter.swapExactETHForTokens{value: halfBalance}(0, path, address(this), block.timestamp + 3 minutes);

        // Get PLS & token balances in this contract
        uint256 tknBal = token.balanceOf(address(this));
        uint256 plsBal = address(this).balance;

        // Approve token & PLS for use on the router
        token.approve(address(swapRouter), tknBal);

        // Add token/PLS Liquidity and burn it
        swapRouter.addLiquidityETH{value: plsBal}(address(token), tknBal, 0, 0, address(0), block.timestamp + 3 minutes);
    }
}

contract UpToken is IERC20, ReentrancyGuard {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    IERC20 public immutable BaseAsset;

    LiquidityLock public liquidityLock;

    uint256 private constant precision = 10**18;

    uint256  private _total_users;
    uint256  private _total_txs;
    uint256 private _totalSupply;

    // storage
    struct User {
        uint256 lastEntryPrice; // Ratio at time of last deposit
        uint256 deposited;  // Deposited BaseAsset, from minting
        uint256 withdrawn;  // Withdrawn BaseAsset, from redemptions
    }

    // balances
    mapping (address => User) private _stats;
    mapping (address => uint8) private _users;
    mapping (address => uint256) private _balances;
    mapping (address => mapping (address => uint256)) private _allowances;

    
    // 5% mint and redeem Fees
    uint256 public mintFee = 95000;            
    uint256 public sellFee = 95000;            
    uint256 private constant feeDenominator = 10**5;

    // Events
    
    event Burn(address from, uint256 amountBurned);
    event GarbageCollected(uint256 amountBurned);
    
    event Minted(address recipient, uint256 amountTKN);
    event Redeemed(address seller, uint256 amountTKN, uint256 amountBASE);
    event PriceChange(uint256 previousPrice, uint256 currentPrice, uint256 totalSupply);

    ////////////////////////////
    // CONSTRUCTOR & FALLBACK //
    ////////////////////////////

    constructor(address _baseAsset) {
        BaseAsset = IERC20(_baseAsset);
        liquidityLock = new LiquidityLock(address(this));
    }

    receive () external payable {
        
    }

    ////////////////////
    // VIEW FUNCTIONS //
    ////////////////////

    // Token Name
    function name() public view override returns (string memory) {
        string memory tokenName = BaseAsset.name();
        return string(abi.encodePacked("Staked ", tokenName));
    }

    // Token Ticker Symbol
    function symbol() public view override returns (string memory) {
        string memory tokenSymbol = BaseAsset.symbol();
        return string(abi.encodePacked("x", tokenSymbol));
    }

    // Tokens decimals
    function decimals() public pure override returns (uint8) {
        return 18;
    }

    // Returns the total number of tokens in existence
    function totalSupply() external view override returns (uint256) { 
        return _totalSupply; 
    }

    // Returns the number of tokens owned by `account`
    function balanceOf(address account) public view override returns (uint256) { 
        return _balances[account]; 
    }

    // Returns the number of tokens `spender` can transfer from `holder`
    function allowance(address holder, address spender) external view override returns (uint256) { 
        return _allowances[holder][spender]; 
    }

    // Returns the amount of token given numtokens of BaseAsset; accounting for fees
    function estimateMinted(uint256 numTokens) public view returns (uint256) {
        uint balance = underlyingBalance();
        return _totalSupply == 0 ? numTokens.mul(mintFee).div(feeDenominator) : _totalSupply.mul(numTokens).div(balance).mul(mintFee).div(feeDenominator);
    }

    // Returns the amount of BaseAsset given numtokens of token
    function estimateRedeemed(uint256 numTokens) public view returns (uint256) {
        return amountOut(numTokens.mul(sellFee).div(feeDenominator));
    }

    // Amount Of Underlying To Receive For `numTokens` of token
    function amountOut(uint256 numTokens) public view returns (uint256) {
        return _calculatePrice().mul(numTokens).div(precision);
    }

    // Returns the value of `holder`'s holdings
    function getValueOfHoldings(address holder) public view returns(uint256) {
        return amountOut(_balances[holder]);
    }

    // Underlying BaseAsset balance
    function underlyingBalance() public view returns (uint256) {
        return BaseAsset.balanceOf(address(this));
    }

    // Price Of token in BaseAsset
    function calculatePrice() public view returns (uint256) {
        return _calculatePrice();
    }

    // Returns basic contract stats
    function getInfo() public view returns(uint256 users, uint256 txs, uint256 underlyingSupply, uint256 supply, uint256 price){
        users = _total_users;
        txs = _total_txs;
        underlyingSupply = underlyingBalance();
        supply = _totalSupply;
        price = _calculatePrice();
    }

    // Last price a user minted at
    function getLastEntryOf(address user) public view returns (uint256) {
        return _stats[user].lastEntryPrice;
    }

    // Total BaseAsset deposited
    function getDepositedOf(address user) public view returns (uint256) {
        return _stats[user].deposited;
    }

    // Total BaseAsset withdrawn
    function getWithdrawnOf(address user) public view returns (uint256) {
        return _stats[user].withdrawn;
    }

    // Calculate StakedAsset required to redeem for an exact amount of BaseAsset
    function getStakedAssetForExactBaseAsset(uint256 _amountOut) public view returns (uint256 _amountIn) {
        require(_amountOut > 0, "BaseAsset amount must be greater than 0");

        _amountIn = _amountOut.mul(precision).div(_calculatePrice()).mul(feeDenominator).div(sellFee);
    }

    // Calculate BaseAsset required to deposit for an exact amount of StakedAsset
    function getBaseAssetForExactStakedAsset(uint256 _amountIn) public view returns (uint256 _amountOut) {
        require(_amountIn > 0, "Token amount must be greater than 0");
        _amountOut = _amountIn.mul(_calculatePrice()).div(precision).mul(feeDenominator).div(mintFee);
    }

    /////////////////////
    // WRITE FUNCTIONS //
    /////////////////////

    // Mint token Tokens For `recipient` By Depositing BaseAsset Into The Contract
    function mintWithBacking(uint256 numTokens, address recipient) external nonReentrant returns (uint256) {
        _checkGarbageCollector(address(this));
        return _mintWithBacking(numTokens, recipient);
    }

    // Burns Sender's token Tokens and redeems their value in BaseAsset
    function redeem(uint256 tokenAmount) external nonReentrant returns (uint256) {
        return _sell(msg.sender, tokenAmount, msg.sender);
    }
    
    // Burns Sender's token Tokens and redeems their value in BaseAsset for `recipient`
    function redeemTo(uint256 tokenAmount, address recipient) external nonReentrant returns (uint256) {
        return _sell(msg.sender, tokenAmount, recipient);
    }
    
    // Allows A User To Erase Their Holdings From Supply - DOES NOT REDEEM UNDERLYING ASSET FOR USER
    function burn(uint256 amount) external nonReentrant {
        uint256 bal = _balances[msg.sender];
        require(bal >= amount && bal > 0, 'Zero Holdings');

        uint256 oldPrice = _calculatePrice();

        _burn(msg.sender, amount);
        _requirePriceRises(oldPrice);

        emit Burn(msg.sender, amount);
    }

    // Approves `spender` to transfer `amount` tokens from caller
    function approve(address spender, uint256 amount) public override returns (bool) {
        _allowances[msg.sender][spender] = amount;
        emit Approval(msg.sender, spender, amount);
        return true;
    }
  
    // Transfer Function
    function transfer(address recipient, uint256 amount) external override nonReentrant returns (bool) {
        return _transferFrom(msg.sender, recipient, amount);
    }

    // Transfer Function
    function transferFrom(address sender, address recipient, uint256 amount) external override nonReentrant returns (bool) {
        _allowances[sender][msg.sender] = _allowances[sender][msg.sender].sub(amount, 'Insufficient Allowance');
        return _transferFrom(sender, recipient, amount);
    }

    ////////////////////////
    // INTERNAL FUNCTIONS //
    ////////////////////////

    // Internal Transfer
    function _transferFrom(address sender, address recipient, uint256 amount) internal returns (bool) {
        require(recipient != address(0) && sender != address(0), "Transfer To Zero");
        require(amount > 0, "Transfer Amt Zero");

        uint256 oldPrice = _calculatePrice();

        _balances[sender] = _balances[sender].sub(amount, "Insufficient Balance");
        _balances[recipient] = _balances[recipient].add(amount);

        _requirePriceRises(oldPrice);
        _total_txs += 1;

        emit Transfer(sender, recipient, amount);
        return true;
    }

    // Stake Tokens and Deposits token in Sender's Address, Must Have Prior Approval For BaseAsset
    function _mintWithBacking(uint256 amount, address recipient) internal returns (uint256) {
        uint256 userTokenBalance = BaseAsset.balanceOf(msg.sender);
        require(userTokenBalance > 0 && amount <= userTokenBalance, 'Insufficient Balance');

        uint256 oldPrice = _calculatePrice();
        uint256 amountUnderlying = underlyingBalance();
        uint256 received = _transferIn(amount);

        _stats[msg.sender].lastEntryPrice = oldPrice;
        _stats[msg.sender].deposited = _stats[msg.sender].deposited.add(amount);

        return _mintTo(recipient, received, amountUnderlying, oldPrice);
    }
    
    // Burns token Tokens And Deposits BaseAsset Tokens into Recipients's Address
    function _sell(address seller, uint256 tokenAmount, address recipient) internal returns (uint256) {
        require(tokenAmount > 0 && _balances[seller] >= tokenAmount);
        require(seller != address(0) && recipient != address(0));

        uint256 oldPrice = _calculatePrice();
        uint256 tokensToSwap = tokenAmount.mul(sellFee).div(feeDenominator);
        uint256 amountUnderlyingAsset = amountOut(tokensToSwap);

        _burn(seller, tokenAmount);

        require(BaseAsset.transfer(recipient, amountUnderlyingAsset), 'Underlying Transfer Failure');

        _requirePriceRises(oldPrice);
        _total_txs += 1;

        _stats[recipient].withdrawn = _stats[recipient].withdrawn.add(amountUnderlyingAsset);

        emit Redeemed(seller, tokenAmount, amountUnderlyingAsset);
        return amountUnderlyingAsset;
    }

    // Handles Minting Logic To Create New token
    function _mintTo(address recipient, uint256 received, uint256 totalBacking, uint256 oldPrice) private returns(uint256) {
        uint256 tokensToMintNoTax = _totalSupply == 0 ? received : _totalSupply.mul(received).div(totalBacking);
        uint256 tokensToMint = tokensToMintNoTax.mul(mintFee).div(feeDenominator);
        
        require(tokensToMint > 0, 'Zero Amount');

        _mint(recipient, tokensToMint);
        _requirePriceRises(oldPrice);

        _total_txs += 1;

        // differentiate purchase
        emit Minted(recipient, tokensToMint);
        return tokensToMint;
    }

    // Requires The Price Of token To Rise For The Transaction To Conclude
    function _requirePriceRises(uint256 oldPrice) internal {
        uint256 newPrice = _calculatePrice();
        require(newPrice >= oldPrice, 'Price Cannot Fall');
        emit PriceChange(oldPrice, newPrice, _totalSupply);
    }

    // Transfers `desiredAmount` of `token` in and verifies the transaction success
    function _transferIn(uint256 desiredAmount) internal returns (uint256) {
        uint256 balBefore = underlyingBalance();
        require(BaseAsset.transferFrom(msg.sender, address(this), desiredAmount), 'Failure Transfer From');
        uint256 balAfter = underlyingBalance();
        require(balAfter > balBefore, 'Zero Received');
        return balAfter - balBefore;
    }
    
    // Mints Tokens to the Receivers Address
    function _mint(address receiver, uint amount) private {

        if (_users[receiver] == 0){
            _users[receiver] = 1;
            _total_users += 1;
        }
        
        _balances[receiver] = _balances[receiver].add(amount);
        _totalSupply = _totalSupply.add(amount);
        emit Transfer(address(0), receiver, amount);
    }
    
    // Burns `amount` of tokens from `account`
    function _burn(address account, uint amount) private {
        _balances[account] = _balances[account].sub(amount, 'Insufficient Balance');
        _totalSupply = _totalSupply.sub(amount, 'Negative Supply');
        emit Transfer(account, address(0), amount);
    }

    // Make Sure there's no Native Tokens in contract
    function _checkGarbageCollector(address burnLocation) internal {

        _claimTimeDividends();

        uint256 bal = _balances[burnLocation];

        if (bal > 10**3) {
            uint256 oldPrice = _calculatePrice();
            _burn(burnLocation, bal);

            emit GarbageCollected(bal);
            emit PriceChange(oldPrice, _calculatePrice(), _totalSupply);
        }
    }

    // Returns the Current Price of 1 Token
    function _calculatePrice() internal view returns (uint256) {
        return _totalSupply == 0 ? 10**18 : (underlyingBalance().mul(precision)).div(_totalSupply);
    }

    // Claim PLS from TIME
    function _claimTimeDividends() internal {
        uint256 divs = ITIMEDividend(address(BaseAsset)).claimableDividendOf(address(this));

        if (divs > 0) {
            ITIMEDividend(address(BaseAsset)).claimDividend(payable(address(this)), divs);
        }

        uint256 bal = address(this).balance;

        if (bal > 0) {
            payable(liquidityLock).transfer(bal);
        }
    }
}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_baseAsset","internalType":"address"}]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Burn","inputs":[{"type":"address","name":"from","internalType":"address","indexed":false},{"type":"uint256","name":"amountBurned","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"GarbageCollected","inputs":[{"type":"uint256","name":"amountBurned","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Minted","inputs":[{"type":"address","name":"recipient","internalType":"address","indexed":false},{"type":"uint256","name":"amountTKN","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"PriceChange","inputs":[{"type":"uint256","name":"previousPrice","internalType":"uint256","indexed":false},{"type":"uint256","name":"currentPrice","internalType":"uint256","indexed":false},{"type":"uint256","name":"totalSupply","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Redeemed","inputs":[{"type":"address","name":"seller","internalType":"address","indexed":false},{"type":"uint256","name":"amountTKN","internalType":"uint256","indexed":false},{"type":"uint256","name":"amountBASE","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC20"}],"name":"BaseAsset","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"holder","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"amountOut","inputs":[{"type":"uint256","name":"numTokens","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"burn","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"calculatePrice","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"estimateMinted","inputs":[{"type":"uint256","name":"numTokens","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"estimateRedeemed","inputs":[{"type":"uint256","name":"numTokens","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"_amountOut","internalType":"uint256"}],"name":"getBaseAssetForExactStakedAsset","inputs":[{"type":"uint256","name":"_amountIn","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getDepositedOf","inputs":[{"type":"address","name":"user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"users","internalType":"uint256"},{"type":"uint256","name":"txs","internalType":"uint256"},{"type":"uint256","name":"underlyingSupply","internalType":"uint256"},{"type":"uint256","name":"supply","internalType":"uint256"},{"type":"uint256","name":"price","internalType":"uint256"}],"name":"getInfo","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getLastEntryOf","inputs":[{"type":"address","name":"user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"_amountIn","internalType":"uint256"}],"name":"getStakedAssetForExactBaseAsset","inputs":[{"type":"uint256","name":"_amountOut","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getValueOfHoldings","inputs":[{"type":"address","name":"holder","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getWithdrawnOf","inputs":[{"type":"address","name":"user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract LiquidityLock"}],"name":"liquidityLock","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"mintFee","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"mintWithBacking","inputs":[{"type":"uint256","name":"numTokens","internalType":"uint256"},{"type":"address","name":"recipient","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"redeem","inputs":[{"type":"uint256","name":"tokenAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"redeemTo","inputs":[{"type":"uint256","name":"tokenAmount","internalType":"uint256"},{"type":"address","name":"recipient","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"sellFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"underlyingBalance","inputs":[]},{"type":"receive","stateMutability":"payable"}]
              

Contract Creation Code

Verify & Publish
0x60a06040526201731860095562017318600a553480156200001e575f80fd5b50604051620047bf380380620047bf83398181016040528101906200004491906200016e565b60015f819055508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050306040516200008e90620000fb565b6200009a9190620001af565b604051809103905ff080158015620000b4573d5f803e3d5ffd5b5060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620001ca565b610e6b806200395483390190565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000138826200010d565b9050919050565b6200014a816200012c565b811462000155575f80fd5b50565b5f8151905062000168816200013f565b92915050565b5f6020828403121562000186576200018562000109565b5b5f620001958482850162000158565b91505092915050565b620001a9816200012c565b82525050565b5f602082019050620001c45f8301846200019e565b92915050565b6080516137396200021b5f395f818161083701528181610d9001528181611035015281816111fa01528181611af901528181611e7f0152818161213b015281816121dd01526122fc01526137395ff3fe6080604052600436106101c4575f3560e01c80636b014f83116100f6578063a9059cbb11610094578063db006a7511610063578063db006a75146106d5578063dd62ed3e14610711578063e8bba4f61461074d578063ed13b25314610789576101cb565b8063a9059cbb14610609578063aeca768b14610645578063cfa3eefa1461066f578063d348b409146106ab576101cb565b80637314f109116100d05780637314f1091461052b57806375fe9fba1461056757806395d89b41146105a35780639d6e6c35146105cd576101cb565b80636b014f83146104775780636ba56b38146104b357806370a08231146104ef576101cb565b806323b872dd1161016357806342966c681161013d57806342966c68146103bb57806352c08bb4146103e357806359356c5c1461041f5780635a9b0b8914610449576101cb565b806323b872dd1461032b5780632b14ca5614610367578063313ce56714610391576101cb565b8063095ea7b31161019f578063095ea7b31461025f57806313966db51461029b57806318160ddd146102c55780631f02a29c146102ef576101cb565b806246516b146101cf57806301dea7711461020b57806306fdde0314610235576101cb565b366101cb57005b5f80fd5b3480156101da575f80fd5b506101f560048036038101906101f09190612797565b6107c5565b60405161020291906127da565b60405180910390f35b348015610216575f80fd5b5061021f61080d565b60405161022c919061284e565b60405180910390f35b348015610240575f80fd5b50610249610832565b60405161025691906128f1565b60405180910390f35b34801561026a575f80fd5b506102856004803603810190610280919061293b565b6108ed565b6040516102929190612993565b60405180910390f35b3480156102a6575f80fd5b506102af6109da565b6040516102bc91906127da565b60405180910390f35b3480156102d0575f80fd5b506102d96109e0565b6040516102e691906127da565b60405180910390f35b3480156102fa575f80fd5b5061031560048036038101906103109190612797565b6109e9565b60405161032291906127da565b60405180910390f35b348015610336575f80fd5b50610351600480360381019061034c91906129ac565b610a37565b60405161035e9190612993565b60405180910390f35b348015610372575f80fd5b5061037b610bdc565b60405161038891906127da565b60405180910390f35b34801561039c575f80fd5b506103a5610be2565b6040516103b29190612a17565b60405180910390f35b3480156103c6575f80fd5b506103e160048036038101906103dc9190612a30565b610bea565b005b3480156103ee575f80fd5b5061040960048036038101906104049190612a5b565b610d27565b60405161041691906127da565b60405180910390f35b34801561042a575f80fd5b50610433610d8d565b60405161044091906127da565b60405180910390f35b348015610454575f80fd5b5061045d610e2b565b60405161046e959493929190612a99565b60405180910390f35b348015610482575f80fd5b5061049d60048036038101906104989190612a30565b610e5a565b6040516104aa91906127da565b60405180910390f35b3480156104be575f80fd5b506104d960048036038101906104d49190612797565b610ef7565b6040516104e691906127da565b60405180910390f35b3480156104fa575f80fd5b5061051560048036038101906105109190612797565b610f40565b60405161052291906127da565b60405180910390f35b348015610536575f80fd5b50610551600480360381019061054c9190612a5b565b610f86565b60405161055e91906127da565b60405180910390f35b348015610572575f80fd5b5061058d60048036038101906105889190612a30565b610ff4565b60405161059a91906127da565b60405180910390f35b3480156105ae575f80fd5b506105b7611030565b6040516105c491906128f1565b60405180910390f35b3480156105d8575f80fd5b506105f360048036038101906105ee9190612a30565b6110eb565b60405161060091906127da565b60405180910390f35b348015610614575f80fd5b5061062f600480360381019061062a919061293b565b611192565b60405161063c9190612993565b60405180910390f35b348015610650575f80fd5b506106596111f8565b6040516106669190612b1b565b60405180910390f35b34801561067a575f80fd5b5061069560048036038101906106909190612a30565b61121c565b6040516106a291906127da565b60405180910390f35b3480156106b6575f80fd5b506106bf6112c3565b6040516106cc91906127da565b60405180910390f35b3480156106e0575f80fd5b506106fb60048036038101906106f69190612a30565b6112d1565b60405161070891906127da565b60405180910390f35b34801561071c575f80fd5b5061073760048036038101906107329190612b34565b611336565b60405161074491906127da565b60405180910390f35b348015610758575f80fd5b50610773600480360381019061076e9190612797565b6113b8565b60405161078091906127da565b60405180910390f35b348015610794575f80fd5b506107af60048036038101906107aa9190612a30565b611401565b6040516107bc91906127da565b60405180910390f35b5f60055f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f01549050919050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60605f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b81526004015f60405180830381865afa15801561089d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906108c59190612c90565b9050806040516020016108d89190612d5b565b60405160208183030381529060405291505090565b5f8160085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516109c891906127da565b60405180910390a36001905092915050565b60095481565b5f600454905090565b5f610a3060075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054610ff4565b9050919050565b5f60025f5403610a7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7390612dc6565b60405180910390fd5b60025f81905550610b45826040518060400160405280601681526020017f496e73756666696369656e7420416c6c6f77616e63650000000000000000000081525060085f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461143b9092919063ffffffff16565b60085f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550610bcc84848461149d565b905060015f819055509392505050565b600a5481565b5f6012905090565b60025f5403610c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2590612dc6565b60405180910390fd5b60025f819055505f60075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110158015610c8557505f81115b610cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbb90612e2e565b60405180910390fd5b5f610ccd61177e565b9050610cd933846117d2565b610ce281611955565b7fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca53384604051610d13929190612e5b565b60405180910390a1505060015f8190555050565b5f60025f5403610d6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6390612dc6565b60405180910390fd5b60025f81905550610d7e3384846119e4565b905060015f8190555092915050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610de79190612e82565b602060405180830381865afa158015610e02573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e269190612eaf565b905090565b5f805f805f60025494506003549350610e42610d8d565b92506004549150610e5161177e565b90509091929394565b5f80610e64610d8d565b90505f60045414610ec457610ebf620186a0610eb1600954610ea385610e9589600454611cd290919063ffffffff16565b611d4990919063ffffffff16565b611cd290919063ffffffff16565b611d4990919063ffffffff16565b610eef565b610eee620186a0610ee060095486611cd290919063ffffffff16565b611d4990919063ffffffff16565b5b915050919050565b5f60055f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600201549050919050565b5f60075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f60025f5403610fcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc290612dc6565b60405180910390fd5b60025f81905550610fdb30611d92565b610fe58383611e7b565b905060015f8190555092915050565b5f611029670de0b6b3a764000061101b8461100d61177e565b611cd290919063ffffffff16565b611d4990919063ffffffff16565b9050919050565b60605f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa15801561109b573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906110c39190612c90565b9050806040516020016110d69190612f24565b60405160208183030381529060405291505090565b5f80821161112e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112590612fb5565b60405180910390fd5b61118b60095461117d620186a061116f670de0b6b3a764000061116161115261177e565b89611cd290919063ffffffff16565b611d4990919063ffffffff16565b611cd290919063ffffffff16565b611d4990919063ffffffff16565b9050919050565b5f60025f54036111d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ce90612dc6565b60405180910390fd5b60025f819055506111e933848461149d565b905060015f8190555092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f80821161125f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125690613043565b60405180910390fd5b6112bc600a546112ae620186a06112a061127761177e565b611292670de0b6b3a764000089611cd290919063ffffffff16565b611d4990919063ffffffff16565b611cd290919063ffffffff16565b611d4990919063ffffffff16565b9050919050565b5f6112cc61177e565b905090565b5f60025f5403611316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130d90612dc6565b60405180910390fd5b60025f819055506113283383336119e4565b905060015f81905550919050565b5f60085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b5f60055f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600101549050919050565b5f61143461142f620186a0611421600a5486611cd290919063ffffffff16565b611d4990919063ffffffff16565b610ff4565b9050919050565b5f838311158290611482576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147991906128f1565b60405180910390fd5b505f8385611490919061308e565b9050809150509392505050565b5f8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561150657505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b611545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153c9061310b565b60405180910390fd5b5f8211611587576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157e90613173565b60405180910390fd5b5f61159061177e565b9050611619836040518060400160405280601481526020017f496e73756666696369656e742042616c616e636500000000000000000000000081525060075f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461143b9092919063ffffffff16565b60075f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506116aa8360075f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461207a90919063ffffffff16565b60075f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506116f481611955565b600160035f8282546117069190613191565b925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161176a91906127da565b60405180910390a360019150509392505050565b5f80600454146117c3576117be6004546117b0670de0b6b3a76400006117a2610d8d565b611cd290919063ffffffff16565b611d4990919063ffffffff16565b6117cd565b670de0b6b3a76400005b905090565b611859816040518060400160405280601481526020017f496e73756666696369656e742042616c616e636500000000000000000000000081525060075f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461143b9092919063ffffffff16565b60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506118e6816040518060400160405280600f81526020017f4e6567617469766520537570706c79000000000000000000000000000000000081525060045461143b9092919063ffffffff16565b6004819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161194991906127da565b60405180910390a35050565b5f61195e61177e565b9050818110156119a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199a9061320e565b60405180910390fd5b7f046aa811b2923fd55b4ca06375b4045117d4584c66fc40880a8ab8ee32d88ed182826004546040516119d89392919061322c565b60405180910390a15050565b5f8083118015611a3157508260075f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410155b611a39575f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614158015611aa157505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b611aa9575f80fd5b5f611ab261177e565b90505f611adf620186a0611ad1600a5488611cd290919063ffffffff16565b611d4990919063ffffffff16565b90505f611aeb82610ff4565b9050611af787876117d2565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb86836040518363ffffffff1660e01b8152600401611b52929190612e5b565b6020604051808303815f875af1158015611b6e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b92919061328b565b611bd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc890613300565b60405180910390fd5b611bda83611955565b600160035f828254611bec9190613191565b92505081905550611c468160055f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002015461207a90919063ffffffff16565b60055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600201819055507ff3a670cd3af7d64b488926880889d08a8585a138ff455227af6737339a1ec262878783604051611cbd9392919061331e565b60405180910390a18093505050509392505050565b5f808303611ce2575f9050611d43565b5f8284611cef9190613353565b9050828482611cfe91906133c1565b14611d3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3590613461565b60405180910390fd5b809150505b92915050565b5f611d8a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506120d7565b905092915050565b611d9a612138565b5f60075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490506103e8811115611e77575f611dee61177e565b9050611dfa83836117d2565b7f8a1c945864c85a9dee42b8734075761f7a16095a8384ab751f2417c5767e227e82604051611e2991906127da565b60405180910390a17f046aa811b2923fd55b4ca06375b4045117d4584c66fc40880a8ab8ee32d88ed181611e5b61177e565b600454604051611e6d9392919061322c565b60405180910390a1505b5050565b5f807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611ed69190612e82565b602060405180830381865afa158015611ef1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f159190612eaf565b90505f81118015611f265750808411155b611f65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5c906134c9565b60405180910390fd5b5f611f6e61177e565b90505f611f79610d8d565b90505f611f85876122ee565b90508260055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f018190555061201e8760055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001015461207a90919063ffffffff16565b60055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001018190555061206e86828486612438565b94505050505092915050565b5f8082846120889190613191565b9050838110156120cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c490613531565b60405180910390fd5b8091505092915050565b5f808311829061211d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211491906128f1565b60405180910390fd5b505f838561212b91906133c1565b9050809150509392505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637e1c4273306040518263ffffffff1660e01b81526004016121929190612e82565b602060405180830381865afa1580156121ad573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121d19190612eaf565b90505f811115612278577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635247ab0530836040518363ffffffff1660e01b815260040161223692919061356f565b6020604051808303815f875af1158015612252573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122769190612eaf565b505b5f4790505f8111156122ea5760015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f193505050501580156122e8573d5f803e3d5ffd5b505b5050565b5f806122f8610d8d565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b815260040161235793929190613596565b6020604051808303815f875af1158015612373573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612397919061328b565b6123d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cd90613615565b60405180910390fd5b5f6123df610d8d565b9050818111612423576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241a9061367d565b60405180910390fd5b818161242f919061308e565b92505050919050565b5f805f6004541461246f5761246a8461245c87600454611cd290919063ffffffff16565b611d4990919063ffffffff16565b612471565b845b90505f61249e620186a061249060095485611cd290919063ffffffff16565b611d4990919063ffffffff16565b90505f81116124e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d9906136e5565b60405180910390fd5b6124ec8782612554565b6124f584611955565b600160035f8282546125079190613191565b925050819055507f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe878260405161253f929190612e5b565b60405180910390a18092505050949350505050565b5f60065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1660ff160361261757600160065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908360ff160217905550600160025f82825461260f9190613191565b925050819055505b6126678160075f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461207a90919063ffffffff16565b60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506126bd8160045461207a90919063ffffffff16565b6004819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161272091906127da565b60405180910390a35050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6127668261273d565b9050919050565b6127768161275c565b8114612780575f80fd5b50565b5f813590506127918161276d565b92915050565b5f602082840312156127ac576127ab612735565b5b5f6127b984828501612783565b91505092915050565b5f819050919050565b6127d4816127c2565b82525050565b5f6020820190506127ed5f8301846127cb565b92915050565b5f819050919050565b5f61281661281161280c8461273d565b6127f3565b61273d565b9050919050565b5f612827826127fc565b9050919050565b5f6128388261281d565b9050919050565b6128488161282e565b82525050565b5f6020820190506128615f83018461283f565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561289e578082015181840152602081019050612883565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6128c382612867565b6128cd8185612871565b93506128dd818560208601612881565b6128e6816128a9565b840191505092915050565b5f6020820190508181035f83015261290981846128b9565b905092915050565b61291a816127c2565b8114612924575f80fd5b50565b5f8135905061293581612911565b92915050565b5f806040838503121561295157612950612735565b5b5f61295e85828601612783565b925050602061296f85828601612927565b9150509250929050565b5f8115159050919050565b61298d81612979565b82525050565b5f6020820190506129a65f830184612984565b92915050565b5f805f606084860312156129c3576129c2612735565b5b5f6129d086828701612783565b93505060206129e186828701612783565b92505060406129f286828701612927565b9150509250925092565b5f60ff82169050919050565b612a11816129fc565b82525050565b5f602082019050612a2a5f830184612a08565b92915050565b5f60208284031215612a4557612a44612735565b5b5f612a5284828501612927565b91505092915050565b5f8060408385031215612a7157612a70612735565b5b5f612a7e85828601612927565b9250506020612a8f85828601612783565b9150509250929050565b5f60a082019050612aac5f8301886127cb565b612ab960208301876127cb565b612ac660408301866127cb565b612ad360608301856127cb565b612ae060808301846127cb565b9695505050505050565b5f612af4826127fc565b9050919050565b5f612b0582612aea565b9050919050565b612b1581612afb565b82525050565b5f602082019050612b2e5f830184612b0c565b92915050565b5f8060408385031215612b4a57612b49612735565b5b5f612b5785828601612783565b9250506020612b6885828601612783565b9150509250929050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b612bb0826128a9565b810181811067ffffffffffffffff82111715612bcf57612bce612b7a565b5b80604052505050565b5f612be161272c565b9050612bed8282612ba7565b919050565b5f67ffffffffffffffff821115612c0c57612c0b612b7a565b5b612c15826128a9565b9050602081019050919050565b5f612c34612c2f84612bf2565b612bd8565b905082815260208101848484011115612c5057612c4f612b76565b5b612c5b848285612881565b509392505050565b5f82601f830112612c7757612c76612b72565b5b8151612c87848260208601612c22565b91505092915050565b5f60208284031215612ca557612ca4612735565b5b5f82015167ffffffffffffffff811115612cc257612cc1612739565b5b612cce84828501612c63565b91505092915050565b5f81905092915050565b7f5374616b656420000000000000000000000000000000000000000000000000005f82015250565b5f612d15600783612cd7565b9150612d2082612ce1565b600782019050919050565b5f612d3582612867565b612d3f8185612cd7565b9350612d4f818560208601612881565b80840191505092915050565b5f612d6582612d09565b9150612d718284612d2b565b915081905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f612db0601f83612871565b9150612dbb82612d7c565b602082019050919050565b5f6020820190508181035f830152612ddd81612da4565b9050919050565b7f5a65726f20486f6c64696e6773000000000000000000000000000000000000005f82015250565b5f612e18600d83612871565b9150612e2382612de4565b602082019050919050565b5f6020820190508181035f830152612e4581612e0c565b9050919050565b612e558161275c565b82525050565b5f604082019050612e6e5f830185612e4c565b612e7b60208301846127cb565b9392505050565b5f602082019050612e955f830184612e4c565b92915050565b5f81519050612ea981612911565b92915050565b5f60208284031215612ec457612ec3612735565b5b5f612ed184828501612e9b565b91505092915050565b7f78000000000000000000000000000000000000000000000000000000000000005f82015250565b5f612f0e600183612cd7565b9150612f1982612eda565b600182019050919050565b5f612f2e82612f02565b9150612f3a8284612d2b565b915081905092915050565b7f546f6b656e20616d6f756e74206d7573742062652067726561746572207468615f8201527f6e20300000000000000000000000000000000000000000000000000000000000602082015250565b5f612f9f602383612871565b9150612faa82612f45565b604082019050919050565b5f6020820190508181035f830152612fcc81612f93565b9050919050565b7f42617365417373657420616d6f756e74206d75737420626520677265617465725f8201527f207468616e203000000000000000000000000000000000000000000000000000602082015250565b5f61302d602783612871565b915061303882612fd3565b604082019050919050565b5f6020820190508181035f83015261305a81613021565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f613098826127c2565b91506130a3836127c2565b92508282039050818111156130bb576130ba613061565b5b92915050565b7f5472616e7366657220546f205a65726f000000000000000000000000000000005f82015250565b5f6130f5601083612871565b9150613100826130c1565b602082019050919050565b5f6020820190508181035f830152613122816130e9565b9050919050565b7f5472616e7366657220416d74205a65726f0000000000000000000000000000005f82015250565b5f61315d601183612871565b915061316882613129565b602082019050919050565b5f6020820190508181035f83015261318a81613151565b9050919050565b5f61319b826127c2565b91506131a6836127c2565b92508282019050808211156131be576131bd613061565b5b92915050565b7f50726963652043616e6e6f742046616c6c0000000000000000000000000000005f82015250565b5f6131f8601183612871565b9150613203826131c4565b602082019050919050565b5f6020820190508181035f830152613225816131ec565b9050919050565b5f60608201905061323f5f8301866127cb565b61324c60208301856127cb565b61325960408301846127cb565b949350505050565b61326a81612979565b8114613274575f80fd5b50565b5f8151905061328581613261565b92915050565b5f602082840312156132a05761329f612735565b5b5f6132ad84828501613277565b91505092915050565b7f556e6465726c79696e67205472616e73666572204661696c75726500000000005f82015250565b5f6132ea601b83612871565b91506132f5826132b6565b602082019050919050565b5f6020820190508181035f830152613317816132de565b9050919050565b5f6060820190506133315f830186612e4c565b61333e60208301856127cb565b61334b60408301846127cb565b949350505050565b5f61335d826127c2565b9150613368836127c2565b9250828202613376816127c2565b9150828204841483151761338d5761338c613061565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6133cb826127c2565b91506133d6836127c2565b9250826133e6576133e5613394565b5b828204905092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f5f8201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b5f61344b602183612871565b9150613456826133f1565b604082019050919050565b5f6020820190508181035f8301526134788161343f565b9050919050565b7f496e73756666696369656e742042616c616e63650000000000000000000000005f82015250565b5f6134b3601483612871565b91506134be8261347f565b602082019050919050565b5f6020820190508181035f8301526134e0816134a7565b9050919050565b7f536166654d6174683a206164646974696f6e206f766572666c6f7700000000005f82015250565b5f61351b601b83612871565b9150613526826134e7565b602082019050919050565b5f6020820190508181035f8301526135488161350f565b9050919050565b5f6135598261273d565b9050919050565b6135698161354f565b82525050565b5f6040820190506135825f830185613560565b61358f60208301846127cb565b9392505050565b5f6060820190506135a95f830186612e4c565b6135b66020830185612e4c565b6135c360408301846127cb565b949350505050565b7f4661696c757265205472616e736665722046726f6d00000000000000000000005f82015250565b5f6135ff601583612871565b915061360a826135cb565b602082019050919050565b5f6020820190508181035f83015261362c816135f3565b9050919050565b7f5a65726f205265636569766564000000000000000000000000000000000000005f82015250565b5f613667600d83612871565b915061367282613633565b602082019050919050565b5f6020820190508181035f8301526136948161365b565b9050919050565b7f5a65726f20416d6f756e740000000000000000000000000000000000000000005f82015250565b5f6136cf600b83612871565b91506136da8261369b565b602082019050919050565b5f6020820190508181035f8301526136fc816136c3565b905091905056fea264697066735822122082f68492e8dae00742a39a271e0bfe7aeb257f0523717e5426c49add5aa6edf764736f6c6343000814003360a060405234801561000f575f80fd5b50604051610e6b380380610e6b833981810160405281019061003191906100d0565b60015f819055508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050506100fb565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61009f82610076565b9050919050565b6100af81610095565b81146100b9575f80fd5b50565b5f815190506100ca816100a6565b92915050565b5f602082840312156100e5576100e4610072565b5b5f6100f2848285016100bc565b91505092915050565b608051610d3c61012f5f395f81816102160152818161032b015281816103c9015281816104aa01526105680152610d3c5ff3fe608060405260043610610037575f3560e01c8063a66f42c014610042578063c31c9c071461006c578063fc0c546a146100965761003e565b3661003e57005b5f80fd5b34801561004d575f80fd5b506100566100c0565b60405161006391906105a4565b60405180910390f35b348015610077575f80fd5b5061008061054e565b60405161008d9190610637565b60405180910390f35b3480156100a1575f80fd5b506100aa610566565b6040516100b79190610670565b60405180910390f35b5f60025f5403610105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100fc906106e3565b60405180910390fd5b60025f819055505f4790505f60028261011e9190610764565b90505f8211925082610165576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161015c906107de565b60405180910390fd5b5f600267ffffffffffffffff811115610181576101806107fc565b5b6040519080825280602002602001820160405280156101af5781602001602082028036833780820191505090505b50905073a1077a294dde1b09bb078844df40758a5d0f9a27815f815181106101da576101d9610829565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061024957610248610829565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073165c3410fc91ef562c50559f7d2289febed552d973ffffffffffffffffffffffffffffffffffffffff16637ff36ab5835f843060b4426102c49190610856565b6040518663ffffffff1660e01b81526004016102e394939291906109a8565b5f6040518083038185885af11580156102fe573d5f803e3d5ffd5b50505050506040513d5f823e3d601f19601f820116820180604052508101906103279190610b50565b505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016103829190610b97565b602060405180830381865afa15801561039d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103c19190610bb0565b90505f4790507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b373165c3410fc91ef562c50559f7d2289febed552d9846040518363ffffffff1660e01b8152600401610436929190610bdb565b6020604051808303815f875af1158015610452573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104769190610c2c565b5073165c3410fc91ef562c50559f7d2289febed552d973ffffffffffffffffffffffffffffffffffffffff1663f305d719827f0000000000000000000000000000000000000000000000000000000000000000855f805f60b4426104da9190610856565b6040518863ffffffff1660e01b81526004016104fb96959493929190610c57565b60606040518083038185885af1158015610517573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061053c9190610cb6565b505050505050505060015f8190555090565b73165c3410fc91ef562c50559f7d2289febed552d981565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f8115159050919050565b61059e8161058a565b82525050565b5f6020820190506105b75f830184610595565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f6105ff6105fa6105f5846105bd565b6105dc565b6105bd565b9050919050565b5f610610826105e5565b9050919050565b5f61062182610606565b9050919050565b61063181610617565b82525050565b5f60208201905061064a5f830184610628565b92915050565b5f61065a82610606565b9050919050565b61066a81610650565b82525050565b5f6020820190506106835f830184610661565b92915050565b5f82825260208201905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f6106cd601f83610689565b91506106d882610699565b602082019050919050565b5f6020820190508181035f8301526106fa816106c1565b9050919050565b5f819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61076e82610701565b915061077983610701565b9250826107895761078861070a565b5b828204905092915050565b7f43414e4e4f545f424f4f53545f5a45524f5f504c5300000000000000000000005f82015250565b5f6107c8601583610689565b91506107d382610794565b602082019050919050565b5f6020820190508181035f8301526107f5816107bc565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f61086082610701565b915061086b83610701565b925082820190508082111561088357610882610737565b5b92915050565b5f819050919050565b5f6108ac6108a76108a284610889565b6105dc565b610701565b9050919050565b6108bc81610892565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f6108f5826105bd565b9050919050565b610905816108eb565b82525050565b5f61091683836108fc565b60208301905092915050565b5f602082019050919050565b5f610938826108c2565b61094281856108cc565b935061094d836108dc565b805f5b8381101561097d578151610964888261090b565b975061096f83610922565b925050600181019050610950565b5085935050505092915050565b610993816108eb565b82525050565b6109a281610701565b82525050565b5f6080820190506109bb5f8301876108b3565b81810360208301526109cd818661092e565b90506109dc604083018561098a565b6109e96060830184610999565b95945050505050565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b610a2082610a07565b810181811067ffffffffffffffff82111715610a3f57610a3e6107fc565b5b80604052505050565b5f610a516109f2565b9050610a5d8282610a17565b919050565b5f67ffffffffffffffff821115610a7c57610a7b6107fc565b5b602082029050602081019050919050565b5f80fd5b610a9a81610701565b8114610aa4575f80fd5b50565b5f81519050610ab581610a91565b92915050565b5f610acd610ac884610a62565b610a48565b90508083825260208201905060208402830185811115610af057610aef610a8d565b5b835b81811015610b195780610b058882610aa7565b845260208401935050602081019050610af2565b5050509392505050565b5f82601f830112610b3757610b36610a03565b5b8151610b47848260208601610abb565b91505092915050565b5f60208284031215610b6557610b646109fb565b5b5f82015167ffffffffffffffff811115610b8257610b816109ff565b5b610b8e84828501610b23565b91505092915050565b5f602082019050610baa5f83018461098a565b92915050565b5f60208284031215610bc557610bc46109fb565b5b5f610bd284828501610aa7565b91505092915050565b5f604082019050610bee5f83018561098a565b610bfb6020830184610999565b9392505050565b610c0b8161058a565b8114610c15575f80fd5b50565b5f81519050610c2681610c02565b92915050565b5f60208284031215610c4157610c406109fb565b5b5f610c4e84828501610c18565b91505092915050565b5f60c082019050610c6a5f83018961098a565b610c776020830188610999565b610c8460408301876108b3565b610c9160608301866108b3565b610c9e608083018561098a565b610cab60a0830184610999565b979650505050505050565b5f805f60608486031215610ccd57610ccc6109fb565b5b5f610cda86828701610aa7565b9350506020610ceb86828701610aa7565b9250506040610cfc86828701610aa7565b915050925092509256fea26469706673582212202940eeb7333ad4c14f297fc5a45b6fdfa9908b4b9f4731994c9c3d6a250000dc64736f6c63430008140033000000000000000000000000ca35638a3fddd02fec597d8c1681198c06b23f58

Deployed ByteCode

0x6080604052600436106101c4575f3560e01c80636b014f83116100f6578063a9059cbb11610094578063db006a7511610063578063db006a75146106d5578063dd62ed3e14610711578063e8bba4f61461074d578063ed13b25314610789576101cb565b8063a9059cbb14610609578063aeca768b14610645578063cfa3eefa1461066f578063d348b409146106ab576101cb565b80637314f109116100d05780637314f1091461052b57806375fe9fba1461056757806395d89b41146105a35780639d6e6c35146105cd576101cb565b80636b014f83146104775780636ba56b38146104b357806370a08231146104ef576101cb565b806323b872dd1161016357806342966c681161013d57806342966c68146103bb57806352c08bb4146103e357806359356c5c1461041f5780635a9b0b8914610449576101cb565b806323b872dd1461032b5780632b14ca5614610367578063313ce56714610391576101cb565b8063095ea7b31161019f578063095ea7b31461025f57806313966db51461029b57806318160ddd146102c55780631f02a29c146102ef576101cb565b806246516b146101cf57806301dea7711461020b57806306fdde0314610235576101cb565b366101cb57005b5f80fd5b3480156101da575f80fd5b506101f560048036038101906101f09190612797565b6107c5565b60405161020291906127da565b60405180910390f35b348015610216575f80fd5b5061021f61080d565b60405161022c919061284e565b60405180910390f35b348015610240575f80fd5b50610249610832565b60405161025691906128f1565b60405180910390f35b34801561026a575f80fd5b506102856004803603810190610280919061293b565b6108ed565b6040516102929190612993565b60405180910390f35b3480156102a6575f80fd5b506102af6109da565b6040516102bc91906127da565b60405180910390f35b3480156102d0575f80fd5b506102d96109e0565b6040516102e691906127da565b60405180910390f35b3480156102fa575f80fd5b5061031560048036038101906103109190612797565b6109e9565b60405161032291906127da565b60405180910390f35b348015610336575f80fd5b50610351600480360381019061034c91906129ac565b610a37565b60405161035e9190612993565b60405180910390f35b348015610372575f80fd5b5061037b610bdc565b60405161038891906127da565b60405180910390f35b34801561039c575f80fd5b506103a5610be2565b6040516103b29190612a17565b60405180910390f35b3480156103c6575f80fd5b506103e160048036038101906103dc9190612a30565b610bea565b005b3480156103ee575f80fd5b5061040960048036038101906104049190612a5b565b610d27565b60405161041691906127da565b60405180910390f35b34801561042a575f80fd5b50610433610d8d565b60405161044091906127da565b60405180910390f35b348015610454575f80fd5b5061045d610e2b565b60405161046e959493929190612a99565b60405180910390f35b348015610482575f80fd5b5061049d60048036038101906104989190612a30565b610e5a565b6040516104aa91906127da565b60405180910390f35b3480156104be575f80fd5b506104d960048036038101906104d49190612797565b610ef7565b6040516104e691906127da565b60405180910390f35b3480156104fa575f80fd5b5061051560048036038101906105109190612797565b610f40565b60405161052291906127da565b60405180910390f35b348015610536575f80fd5b50610551600480360381019061054c9190612a5b565b610f86565b60405161055e91906127da565b60405180910390f35b348015610572575f80fd5b5061058d60048036038101906105889190612a30565b610ff4565b60405161059a91906127da565b60405180910390f35b3480156105ae575f80fd5b506105b7611030565b6040516105c491906128f1565b60405180910390f35b3480156105d8575f80fd5b506105f360048036038101906105ee9190612a30565b6110eb565b60405161060091906127da565b60405180910390f35b348015610614575f80fd5b5061062f600480360381019061062a919061293b565b611192565b60405161063c9190612993565b60405180910390f35b348015610650575f80fd5b506106596111f8565b6040516106669190612b1b565b60405180910390f35b34801561067a575f80fd5b5061069560048036038101906106909190612a30565b61121c565b6040516106a291906127da565b60405180910390f35b3480156106b6575f80fd5b506106bf6112c3565b6040516106cc91906127da565b60405180910390f35b3480156106e0575f80fd5b506106fb60048036038101906106f69190612a30565b6112d1565b60405161070891906127da565b60405180910390f35b34801561071c575f80fd5b5061073760048036038101906107329190612b34565b611336565b60405161074491906127da565b60405180910390f35b348015610758575f80fd5b50610773600480360381019061076e9190612797565b6113b8565b60405161078091906127da565b60405180910390f35b348015610794575f80fd5b506107af60048036038101906107aa9190612a30565b611401565b6040516107bc91906127da565b60405180910390f35b5f60055f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f01549050919050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60605f7f000000000000000000000000ca35638a3fddd02fec597d8c1681198c06b23f5873ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b81526004015f60405180830381865afa15801561089d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906108c59190612c90565b9050806040516020016108d89190612d5b565b60405160208183030381529060405291505090565b5f8160085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516109c891906127da565b60405180910390a36001905092915050565b60095481565b5f600454905090565b5f610a3060075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054610ff4565b9050919050565b5f60025f5403610a7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7390612dc6565b60405180910390fd5b60025f81905550610b45826040518060400160405280601681526020017f496e73756666696369656e7420416c6c6f77616e63650000000000000000000081525060085f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461143b9092919063ffffffff16565b60085f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550610bcc84848461149d565b905060015f819055509392505050565b600a5481565b5f6012905090565b60025f5403610c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2590612dc6565b60405180910390fd5b60025f819055505f60075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110158015610c8557505f81115b610cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbb90612e2e565b60405180910390fd5b5f610ccd61177e565b9050610cd933846117d2565b610ce281611955565b7fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca53384604051610d13929190612e5b565b60405180910390a1505060015f8190555050565b5f60025f5403610d6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6390612dc6565b60405180910390fd5b60025f81905550610d7e3384846119e4565b905060015f8190555092915050565b5f7f000000000000000000000000ca35638a3fddd02fec597d8c1681198c06b23f5873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610de79190612e82565b602060405180830381865afa158015610e02573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e269190612eaf565b905090565b5f805f805f60025494506003549350610e42610d8d565b92506004549150610e5161177e565b90509091929394565b5f80610e64610d8d565b90505f60045414610ec457610ebf620186a0610eb1600954610ea385610e9589600454611cd290919063ffffffff16565b611d4990919063ffffffff16565b611cd290919063ffffffff16565b611d4990919063ffffffff16565b610eef565b610eee620186a0610ee060095486611cd290919063ffffffff16565b611d4990919063ffffffff16565b5b915050919050565b5f60055f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600201549050919050565b5f60075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f60025f5403610fcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc290612dc6565b60405180910390fd5b60025f81905550610fdb30611d92565b610fe58383611e7b565b905060015f8190555092915050565b5f611029670de0b6b3a764000061101b8461100d61177e565b611cd290919063ffffffff16565b611d4990919063ffffffff16565b9050919050565b60605f7f000000000000000000000000ca35638a3fddd02fec597d8c1681198c06b23f5873ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa15801561109b573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906110c39190612c90565b9050806040516020016110d69190612f24565b60405160208183030381529060405291505090565b5f80821161112e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112590612fb5565b60405180910390fd5b61118b60095461117d620186a061116f670de0b6b3a764000061116161115261177e565b89611cd290919063ffffffff16565b611d4990919063ffffffff16565b611cd290919063ffffffff16565b611d4990919063ffffffff16565b9050919050565b5f60025f54036111d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ce90612dc6565b60405180910390fd5b60025f819055506111e933848461149d565b905060015f8190555092915050565b7f000000000000000000000000ca35638a3fddd02fec597d8c1681198c06b23f5881565b5f80821161125f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125690613043565b60405180910390fd5b6112bc600a546112ae620186a06112a061127761177e565b611292670de0b6b3a764000089611cd290919063ffffffff16565b611d4990919063ffffffff16565b611cd290919063ffffffff16565b611d4990919063ffffffff16565b9050919050565b5f6112cc61177e565b905090565b5f60025f5403611316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130d90612dc6565b60405180910390fd5b60025f819055506113283383336119e4565b905060015f81905550919050565b5f60085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b5f60055f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600101549050919050565b5f61143461142f620186a0611421600a5486611cd290919063ffffffff16565b611d4990919063ffffffff16565b610ff4565b9050919050565b5f838311158290611482576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147991906128f1565b60405180910390fd5b505f8385611490919061308e565b9050809150509392505050565b5f8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561150657505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b611545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153c9061310b565b60405180910390fd5b5f8211611587576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157e90613173565b60405180910390fd5b5f61159061177e565b9050611619836040518060400160405280601481526020017f496e73756666696369656e742042616c616e636500000000000000000000000081525060075f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461143b9092919063ffffffff16565b60075f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506116aa8360075f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461207a90919063ffffffff16565b60075f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506116f481611955565b600160035f8282546117069190613191565b925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161176a91906127da565b60405180910390a360019150509392505050565b5f80600454146117c3576117be6004546117b0670de0b6b3a76400006117a2610d8d565b611cd290919063ffffffff16565b611d4990919063ffffffff16565b6117cd565b670de0b6b3a76400005b905090565b611859816040518060400160405280601481526020017f496e73756666696369656e742042616c616e636500000000000000000000000081525060075f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461143b9092919063ffffffff16565b60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506118e6816040518060400160405280600f81526020017f4e6567617469766520537570706c79000000000000000000000000000000000081525060045461143b9092919063ffffffff16565b6004819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161194991906127da565b60405180910390a35050565b5f61195e61177e565b9050818110156119a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199a9061320e565b60405180910390fd5b7f046aa811b2923fd55b4ca06375b4045117d4584c66fc40880a8ab8ee32d88ed182826004546040516119d89392919061322c565b60405180910390a15050565b5f8083118015611a3157508260075f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410155b611a39575f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614158015611aa157505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b611aa9575f80fd5b5f611ab261177e565b90505f611adf620186a0611ad1600a5488611cd290919063ffffffff16565b611d4990919063ffffffff16565b90505f611aeb82610ff4565b9050611af787876117d2565b7f000000000000000000000000ca35638a3fddd02fec597d8c1681198c06b23f5873ffffffffffffffffffffffffffffffffffffffff1663a9059cbb86836040518363ffffffff1660e01b8152600401611b52929190612e5b565b6020604051808303815f875af1158015611b6e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b92919061328b565b611bd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc890613300565b60405180910390fd5b611bda83611955565b600160035f828254611bec9190613191565b92505081905550611c468160055f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002015461207a90919063ffffffff16565b60055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600201819055507ff3a670cd3af7d64b488926880889d08a8585a138ff455227af6737339a1ec262878783604051611cbd9392919061331e565b60405180910390a18093505050509392505050565b5f808303611ce2575f9050611d43565b5f8284611cef9190613353565b9050828482611cfe91906133c1565b14611d3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3590613461565b60405180910390fd5b809150505b92915050565b5f611d8a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506120d7565b905092915050565b611d9a612138565b5f60075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490506103e8811115611e77575f611dee61177e565b9050611dfa83836117d2565b7f8a1c945864c85a9dee42b8734075761f7a16095a8384ab751f2417c5767e227e82604051611e2991906127da565b60405180910390a17f046aa811b2923fd55b4ca06375b4045117d4584c66fc40880a8ab8ee32d88ed181611e5b61177e565b600454604051611e6d9392919061322c565b60405180910390a1505b5050565b5f807f000000000000000000000000ca35638a3fddd02fec597d8c1681198c06b23f5873ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611ed69190612e82565b602060405180830381865afa158015611ef1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f159190612eaf565b90505f81118015611f265750808411155b611f65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5c906134c9565b60405180910390fd5b5f611f6e61177e565b90505f611f79610d8d565b90505f611f85876122ee565b90508260055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f018190555061201e8760055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001015461207a90919063ffffffff16565b60055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001018190555061206e86828486612438565b94505050505092915050565b5f8082846120889190613191565b9050838110156120cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c490613531565b60405180910390fd5b8091505092915050565b5f808311829061211d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211491906128f1565b60405180910390fd5b505f838561212b91906133c1565b9050809150509392505050565b5f7f000000000000000000000000ca35638a3fddd02fec597d8c1681198c06b23f5873ffffffffffffffffffffffffffffffffffffffff16637e1c4273306040518263ffffffff1660e01b81526004016121929190612e82565b602060405180830381865afa1580156121ad573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121d19190612eaf565b90505f811115612278577f000000000000000000000000ca35638a3fddd02fec597d8c1681198c06b23f5873ffffffffffffffffffffffffffffffffffffffff16635247ab0530836040518363ffffffff1660e01b815260040161223692919061356f565b6020604051808303815f875af1158015612252573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122769190612eaf565b505b5f4790505f8111156122ea5760015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f193505050501580156122e8573d5f803e3d5ffd5b505b5050565b5f806122f8610d8d565b90507f000000000000000000000000ca35638a3fddd02fec597d8c1681198c06b23f5873ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b815260040161235793929190613596565b6020604051808303815f875af1158015612373573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612397919061328b565b6123d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cd90613615565b60405180910390fd5b5f6123df610d8d565b9050818111612423576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241a9061367d565b60405180910390fd5b818161242f919061308e565b92505050919050565b5f805f6004541461246f5761246a8461245c87600454611cd290919063ffffffff16565b611d4990919063ffffffff16565b612471565b845b90505f61249e620186a061249060095485611cd290919063ffffffff16565b611d4990919063ffffffff16565b90505f81116124e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d9906136e5565b60405180910390fd5b6124ec8782612554565b6124f584611955565b600160035f8282546125079190613191565b925050819055507f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe878260405161253f929190612e5b565b60405180910390a18092505050949350505050565b5f60065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1660ff160361261757600160065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908360ff160217905550600160025f82825461260f9190613191565b925050819055505b6126678160075f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461207a90919063ffffffff16565b60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506126bd8160045461207a90919063ffffffff16565b6004819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161272091906127da565b60405180910390a35050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6127668261273d565b9050919050565b6127768161275c565b8114612780575f80fd5b50565b5f813590506127918161276d565b92915050565b5f602082840312156127ac576127ab612735565b5b5f6127b984828501612783565b91505092915050565b5f819050919050565b6127d4816127c2565b82525050565b5f6020820190506127ed5f8301846127cb565b92915050565b5f819050919050565b5f61281661281161280c8461273d565b6127f3565b61273d565b9050919050565b5f612827826127fc565b9050919050565b5f6128388261281d565b9050919050565b6128488161282e565b82525050565b5f6020820190506128615f83018461283f565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561289e578082015181840152602081019050612883565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6128c382612867565b6128cd8185612871565b93506128dd818560208601612881565b6128e6816128a9565b840191505092915050565b5f6020820190508181035f83015261290981846128b9565b905092915050565b61291a816127c2565b8114612924575f80fd5b50565b5f8135905061293581612911565b92915050565b5f806040838503121561295157612950612735565b5b5f61295e85828601612783565b925050602061296f85828601612927565b9150509250929050565b5f8115159050919050565b61298d81612979565b82525050565b5f6020820190506129a65f830184612984565b92915050565b5f805f606084860312156129c3576129c2612735565b5b5f6129d086828701612783565b93505060206129e186828701612783565b92505060406129f286828701612927565b9150509250925092565b5f60ff82169050919050565b612a11816129fc565b82525050565b5f602082019050612a2a5f830184612a08565b92915050565b5f60208284031215612a4557612a44612735565b5b5f612a5284828501612927565b91505092915050565b5f8060408385031215612a7157612a70612735565b5b5f612a7e85828601612927565b9250506020612a8f85828601612783565b9150509250929050565b5f60a082019050612aac5f8301886127cb565b612ab960208301876127cb565b612ac660408301866127cb565b612ad360608301856127cb565b612ae060808301846127cb565b9695505050505050565b5f612af4826127fc565b9050919050565b5f612b0582612aea565b9050919050565b612b1581612afb565b82525050565b5f602082019050612b2e5f830184612b0c565b92915050565b5f8060408385031215612b4a57612b49612735565b5b5f612b5785828601612783565b9250506020612b6885828601612783565b9150509250929050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b612bb0826128a9565b810181811067ffffffffffffffff82111715612bcf57612bce612b7a565b5b80604052505050565b5f612be161272c565b9050612bed8282612ba7565b919050565b5f67ffffffffffffffff821115612c0c57612c0b612b7a565b5b612c15826128a9565b9050602081019050919050565b5f612c34612c2f84612bf2565b612bd8565b905082815260208101848484011115612c5057612c4f612b76565b5b612c5b848285612881565b509392505050565b5f82601f830112612c7757612c76612b72565b5b8151612c87848260208601612c22565b91505092915050565b5f60208284031215612ca557612ca4612735565b5b5f82015167ffffffffffffffff811115612cc257612cc1612739565b5b612cce84828501612c63565b91505092915050565b5f81905092915050565b7f5374616b656420000000000000000000000000000000000000000000000000005f82015250565b5f612d15600783612cd7565b9150612d2082612ce1565b600782019050919050565b5f612d3582612867565b612d3f8185612cd7565b9350612d4f818560208601612881565b80840191505092915050565b5f612d6582612d09565b9150612d718284612d2b565b915081905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f612db0601f83612871565b9150612dbb82612d7c565b602082019050919050565b5f6020820190508181035f830152612ddd81612da4565b9050919050565b7f5a65726f20486f6c64696e6773000000000000000000000000000000000000005f82015250565b5f612e18600d83612871565b9150612e2382612de4565b602082019050919050565b5f6020820190508181035f830152612e4581612e0c565b9050919050565b612e558161275c565b82525050565b5f604082019050612e6e5f830185612e4c565b612e7b60208301846127cb565b9392505050565b5f602082019050612e955f830184612e4c565b92915050565b5f81519050612ea981612911565b92915050565b5f60208284031215612ec457612ec3612735565b5b5f612ed184828501612e9b565b91505092915050565b7f78000000000000000000000000000000000000000000000000000000000000005f82015250565b5f612f0e600183612cd7565b9150612f1982612eda565b600182019050919050565b5f612f2e82612f02565b9150612f3a8284612d2b565b915081905092915050565b7f546f6b656e20616d6f756e74206d7573742062652067726561746572207468615f8201527f6e20300000000000000000000000000000000000000000000000000000000000602082015250565b5f612f9f602383612871565b9150612faa82612f45565b604082019050919050565b5f6020820190508181035f830152612fcc81612f93565b9050919050565b7f42617365417373657420616d6f756e74206d75737420626520677265617465725f8201527f207468616e203000000000000000000000000000000000000000000000000000602082015250565b5f61302d602783612871565b915061303882612fd3565b604082019050919050565b5f6020820190508181035f83015261305a81613021565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f613098826127c2565b91506130a3836127c2565b92508282039050818111156130bb576130ba613061565b5b92915050565b7f5472616e7366657220546f205a65726f000000000000000000000000000000005f82015250565b5f6130f5601083612871565b9150613100826130c1565b602082019050919050565b5f6020820190508181035f830152613122816130e9565b9050919050565b7f5472616e7366657220416d74205a65726f0000000000000000000000000000005f82015250565b5f61315d601183612871565b915061316882613129565b602082019050919050565b5f6020820190508181035f83015261318a81613151565b9050919050565b5f61319b826127c2565b91506131a6836127c2565b92508282019050808211156131be576131bd613061565b5b92915050565b7f50726963652043616e6e6f742046616c6c0000000000000000000000000000005f82015250565b5f6131f8601183612871565b9150613203826131c4565b602082019050919050565b5f6020820190508181035f830152613225816131ec565b9050919050565b5f60608201905061323f5f8301866127cb565b61324c60208301856127cb565b61325960408301846127cb565b949350505050565b61326a81612979565b8114613274575f80fd5b50565b5f8151905061328581613261565b92915050565b5f602082840312156132a05761329f612735565b5b5f6132ad84828501613277565b91505092915050565b7f556e6465726c79696e67205472616e73666572204661696c75726500000000005f82015250565b5f6132ea601b83612871565b91506132f5826132b6565b602082019050919050565b5f6020820190508181035f830152613317816132de565b9050919050565b5f6060820190506133315f830186612e4c565b61333e60208301856127cb565b61334b60408301846127cb565b949350505050565b5f61335d826127c2565b9150613368836127c2565b9250828202613376816127c2565b9150828204841483151761338d5761338c613061565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6133cb826127c2565b91506133d6836127c2565b9250826133e6576133e5613394565b5b828204905092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f5f8201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b5f61344b602183612871565b9150613456826133f1565b604082019050919050565b5f6020820190508181035f8301526134788161343f565b9050919050565b7f496e73756666696369656e742042616c616e63650000000000000000000000005f82015250565b5f6134b3601483612871565b91506134be8261347f565b602082019050919050565b5f6020820190508181035f8301526134e0816134a7565b9050919050565b7f536166654d6174683a206164646974696f6e206f766572666c6f7700000000005f82015250565b5f61351b601b83612871565b9150613526826134e7565b602082019050919050565b5f6020820190508181035f8301526135488161350f565b9050919050565b5f6135598261273d565b9050919050565b6135698161354f565b82525050565b5f6040820190506135825f830185613560565b61358f60208301846127cb565b9392505050565b5f6060820190506135a95f830186612e4c565b6135b66020830185612e4c565b6135c360408301846127cb565b949350505050565b7f4661696c757265205472616e736665722046726f6d00000000000000000000005f82015250565b5f6135ff601583612871565b915061360a826135cb565b602082019050919050565b5f6020820190508181035f83015261362c816135f3565b9050919050565b7f5a65726f205265636569766564000000000000000000000000000000000000005f82015250565b5f613667600d83612871565b915061367282613633565b602082019050919050565b5f6020820190508181035f8301526136948161365b565b9050919050565b7f5a65726f20416d6f756e740000000000000000000000000000000000000000005f82015250565b5f6136cf600b83612871565b91506136da8261369b565b602082019050919050565b5f6020820190508181035f8301526136fc816136c3565b905091905056fea264697066735822122082f68492e8dae00742a39a271e0bfe7aeb257f0523717e5426c49add5aa6edf764736f6c63430008140033