ETH Price: $2,518.52 (+13.01%)
 

Overview

Max Total Supply

2,500,000,000 Toil

Holders

52

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.000000000000000001 Toil

Value
$0.00
0xBdf59d84e393cC0728409144512D2cd62C3278f3
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Token

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 6 : token.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.2;

import '@openzeppelin/contracts/token/ERC20/ERC20.sol';
import "@openzeppelin/contracts/access/Ownable.sol";


// Toil is used to create multiple uniswap V3 positions and allow for fee collections based on market volume and volatility across them
//By creating 3 positions with each paired token the system allows for curvation of token value over time
//With the ability of creating new V3 postions with unpaired token this consistently allows for liquidity to always be present with in

//No webpage
//No defined image atm
//No community created from developer
//TOIL stands for "The One I Love"
//Through toil we are complete...

interface Router {
	function factory() external view returns (address);
	function positionManager() external view returns (address);
	function WETH9() external view returns (address);
}

interface Factory {
	function createPool(address tokenA, address tokenB, uint24 fee) external returns (address);
}

interface Pool {
	function initialize(uint160 _sqrtPriceX96) external;
}

interface Params {
	struct MintParams {
		address token0;
		address token1;
		uint24 fee;
		int24 tickLower;
		int24 tickUpper;
		uint256 amount0Desired;
		uint256 amount1Desired;
		uint256 amount0Min;
		uint256 amount1Min;
		address recipient;
		uint256 deadline;
	}
	struct CollectParams {
		uint256 tokenId;
		address recipient;
		uint128 amount0Max;
		uint128 amount1Max;
	}

}

interface PositionManager is Params {
	function mint(MintParams calldata) external payable returns (uint256 tokenId, uint128 liquidity, uint256 amount0, uint256 amount1);
	function collect(CollectParams calldata) external payable returns (uint256 amount0, uint256 amount1);
	
	function positions(uint256) external view returns (uint96 nonce, address operator, address token0, address token1, uint24 fee, int24 tickLower, int24 tickUpper, uint128 liquidity, uint256 feeGrowthInside0LastX128, uint256 feeGrowthInside1LastX128, uint128 tokensOwed0, uint128 tokensOwed1);
}


contract TickMath {

	int24 internal constant MIN_TICK = -887272;
	int24 internal constant MAX_TICK = -MIN_TICK;
	uint160 internal constant MIN_SQRT_RATIO = 4295128739;
	uint160 internal constant MAX_SQRT_RATIO = 1461446703485210103287273052203988822378723970342;


	function _getSqrtRatioAtTick(int24 tick) internal pure returns (uint160 sqrtPriceX96) {
		unchecked {
			uint256 absTick = tick < 0 ? uint256(-int256(tick)) : uint256(int256(tick));
			require(absTick <= uint256(int256(MAX_TICK)), 'T');

			uint256 ratio = absTick & 0x1 != 0 ? 0xfffcb933bd6fad37aa2d162d1a594001 : 0x100000000000000000000000000000000;
			if (absTick & 0x2 != 0) ratio = (ratio * 0xfff97272373d413259a46990580e213a) >> 128;
			if (absTick & 0x4 != 0) ratio = (ratio * 0xfff2e50f5f656932ef12357cf3c7fdcc) >> 128;
			if (absTick & 0x8 != 0) ratio = (ratio * 0xffe5caca7e10e4e61c3624eaa0941cd0) >> 128;
			if (absTick & 0x10 != 0) ratio = (ratio * 0xffcb9843d60f6159c9db58835c926644) >> 128;
			if (absTick & 0x20 != 0) ratio = (ratio * 0xff973b41fa98c081472e6896dfb254c0) >> 128;
			if (absTick & 0x40 != 0) ratio = (ratio * 0xff2ea16466c96a3843ec78b326b52861) >> 128;
			if (absTick & 0x80 != 0) ratio = (ratio * 0xfe5dee046a99a2a811c461f1969c3053) >> 128;
			if (absTick & 0x100 != 0) ratio = (ratio * 0xfcbe86c7900a88aedcffc83b479aa3a4) >> 128;
			if (absTick & 0x200 != 0) ratio = (ratio * 0xf987a7253ac413176f2b074cf7815e54) >> 128;
			if (absTick & 0x400 != 0) ratio = (ratio * 0xf3392b0822b70005940c7a398e4b70f3) >> 128;
			if (absTick & 0x800 != 0) ratio = (ratio * 0xe7159475a2c29b7443b29c7fa6e889d9) >> 128;
			if (absTick & 0x1000 != 0) ratio = (ratio * 0xd097f3bdfd2022b8845ad8f792aa5825) >> 128;
			if (absTick & 0x2000 != 0) ratio = (ratio * 0xa9f746462d870fdf8a65dc1f90e061e5) >> 128;
			if (absTick & 0x4000 != 0) ratio = (ratio * 0x70d869a156d2a1b890bb3df62baf32f7) >> 128;
			if (absTick & 0x8000 != 0) ratio = (ratio * 0x31be135f97d08fd981231505542fcfa6) >> 128;
			if (absTick & 0x10000 != 0) ratio = (ratio * 0x9aa508b5b7a84e1c677de54f3e99bc9) >> 128;
			if (absTick & 0x20000 != 0) ratio = (ratio * 0x5d6af8dedb81196699c329225ee604) >> 128;
			if (absTick & 0x40000 != 0) ratio = (ratio * 0x2216e584f5fa1ea926041bedfe98) >> 128;
			if (absTick & 0x80000 != 0) ratio = (ratio * 0x48a170391f7dc42444e8fa2) >> 128;

			if (tick > 0) ratio = type(uint256).max / ratio;

			sqrtPriceX96 = uint160((ratio >> 32) + (ratio % (1 << 32) == 0 ? 0 : 1));
		}
	}

	function _getTickAtSqrtRatio(uint160 sqrtPriceX96) internal pure returns (int24 tick) {
		unchecked {
			require(sqrtPriceX96 >= MIN_SQRT_RATIO && sqrtPriceX96 < MAX_SQRT_RATIO, 'R');
			uint256 ratio = uint256(sqrtPriceX96) << 32;

			uint256 r = ratio;
			uint256 msb = 0;

			assembly {
				let f := shl(7, gt(r, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF))
				msb := or(msb, f)
				r := shr(f, r)
			}
			assembly {
				let f := shl(6, gt(r, 0xFFFFFFFFFFFFFFFF))
				msb := or(msb, f)
				r := shr(f, r)
			}
			assembly {
				let f := shl(5, gt(r, 0xFFFFFFFF))
				msb := or(msb, f)
				r := shr(f, r)
			}
			assembly {
				let f := shl(4, gt(r, 0xFFFF))
				msb := or(msb, f)
				r := shr(f, r)
			}
			assembly {
				let f := shl(3, gt(r, 0xFF))
				msb := or(msb, f)
				r := shr(f, r)
			}
			assembly {
				let f := shl(2, gt(r, 0xF))
				msb := or(msb, f)
				r := shr(f, r)
			}
			assembly {
				let f := shl(1, gt(r, 0x3))
				msb := or(msb, f)
				r := shr(f, r)
			}
			assembly {
				let f := gt(r, 0x1)
				msb := or(msb, f)
			}

			if (msb >= 128) r = ratio >> (msb - 127);
			else r = ratio << (127 - msb);

			int256 log_2 = (int256(msb) - 128) << 64;

			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(63, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(62, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(61, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(60, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(59, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(58, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(57, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(56, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(55, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(54, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(53, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(52, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(51, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(50, f))
			}

			int256 log_sqrt10001 = log_2 * 255738958999603826347141;

			int24 tickLow = int24((log_sqrt10001 - 3402992956809132418596140100660247210) >> 128);
			int24 tickHi = int24((log_sqrt10001 + 291339464771989622907027621153398088495) >> 128);

			tick = tickLow == tickHi ? tickLow : _getSqrtRatioAtTick(tickHi) <= sqrtPriceX96 ? tickHi : tickLow;
		}
	}

	function _sqrt(uint256 _n) internal pure returns (uint256 result) {
		unchecked {
			uint256 _tmp = (_n + 1) / 2;
			result = _n;
			while (_tmp < result) {
				result = _tmp;
				_tmp = (_n / _tmp + _tmp) / 2;
			}
		}
	}

	function _getPriceAndTickFromValues(bool _weth0, uint256 _tokens, uint256 _weth) internal pure returns (uint160 price, int24 tick) {
		uint160 _tmpPrice = uint160(_sqrt(2**192 / (!_weth0 ? _tokens : _weth) * (_weth0 ? _tokens : _weth)));
		tick = _getTickAtSqrtRatio(_tmpPrice);
		tick = tick - (tick % 200);
		price = _getSqrtRatioAtTick(tick);
	}
}

contract Token is ERC20, Ownable, TickMath, Params{
    

    Router public constant ROUTER =Router(0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45);

    uint256[] initialMCs;
    uint256[]  midMCs;
    uint256[] upperMCs;
    uint256 tokenSupply;
    address[] pairedTokens;

    uint256[] private liquidityPositions;

    address[] public pools;

    uint256 interval = 1 weeks;
    uint256 nextClaim;

    mapping(address => bool) public usedTokens;

    constructor(
        uint256[] memory _initialMCs,
        uint256[] memory _midMCs,
        uint256[] memory _upperMCs,
        uint256 _tokenSupply,
        address[] memory _pairedTokens

        ) ERC20('Toil','Toil'){

            require(_initialMCs.length == _midMCs.length && _midMCs.length == _upperMCs.length && _upperMCs.length == _pairedTokens.length, "Arrays not equal length");
            tokenSupply = _tokenSupply;
            address _this = address(this);



            for(uint x =0; x< _initialMCs.length; x++){
                address token = _pairedTokens[x];
		        (uint160 _initialSqrtPrice, ) = _getPriceAndTickFromValues(token < _this, _tokenSupply, _initialMCs[x]);//gets price
		
                pools.push( Factory(ROUTER.factory()).createPool(_this, token, 10000));//starts pool with 1% fee
		        Pool(pools[x]).initialize(_initialSqrtPrice); //Set the pool pricing, needs looked into

                //nonfungiblePositionManager = _nonfungiblePositionManager;
                nextClaim = block.timestamp + interval;

                require(_upperMCs[x] > _midMCs[x] && _midMCs[x] > _initialMCs[x], "Fix MC");
                initialMCs.push(_initialMCs[x]);
                midMCs.push(_midMCs[x]);
                upperMCs.push(_upperMCs[x]);

                pairedTokens.push(token);

            }

    }

      function initialize() external {
       
		require(totalSupply() == 0);

        
        _mint(address(this), tokenSupply);

		uint256 amount = tokenSupply/pairedTokens.length;
        for(uint i = 0; i < pairedTokens.length; i++){
			if(totalSupply() >= amount){
				_threePositions(initialMCs[i], midMCs[i], upperMCs[i], tokenSupply/pairedTokens.length, pairedTokens[i]);
			}
        }
		
	}

    function _threePositions(uint256 lower, uint256 mid, uint256 up, uint256 supply, address _token) internal{
		address _this = address(this);

		bool _token0 = _token < _this; //token0 is the lesser address()
        nextClaim = block.timestamp + interval;

		( , int24 _minTick) = _getPriceAndTickFromValues(_token0, tokenSupply, lower);
        (, int24 _midTick) = _getPriceAndTickFromValues(_token0, tokenSupply, mid);
		( , int24 _maxTick) = _getPriceAndTickFromValues(_token0, tokenSupply, up);

        uint256 _concentratedTokens = 20 * supply / 100;

        //First Step blue line
        liquidityPositions.push(_createNewPosition(_token, _this, 
          _token0,
          _token0 ? _minTick - 200 : _minTick,//LowerTick
         !_token0 ? _minTick + 200 : _minTick,//UpperTick
         _concentratedTokens
         ));
		//Second step orange curve
        liquidityPositions.push(_createNewPosition(_token, _this, 
          _token0,
          _token0 ? _midTick: _minTick + 200,//LowerTick
         !_token0 ? _midTick: _minTick - 200,//UpperTick
         (3*_concentratedTokens)
         ));
        //Third Step blowoff
        liquidityPositions.push(_createNewPosition(_token, _this, 
          _token0,
          _token0 ? _maxTick : _midTick,//LowerTick
         !_token0 ? _maxTick : _midTick,//UpperTick
         _concentratedTokens > balanceOf(_this)? balanceOf(_this) : _concentratedTokens
         ));

    }

    function _createNewPosition(address _token, address _this, bool _token0, int24 _tickLower, int24 _tickUpper, uint256 amount) internal returns(uint256 a){
        PositionManager _pm = PositionManager(ROUTER.positionManager());
        _approve(_this, address(_pm), amount);

        (a, , , ) = _pm.mint(MintParams({
			token0: _token0 ? _token : _this,
			token1: !_token0 ? _token : _this,
			fee: 10000,
			tickLower: _tickLower,
			tickUpper: _tickUpper,
			amount0Desired: _token0 ? 0 : amount,
			amount1Desired: !_token0 ? 0 : amount,
			amount0Min: 0,
			amount1Min: 0,
			recipient: _this,
			deadline: block.timestamp
		}));
    } 

    function createNewPosition(address token, uint256 lowerMC, uint256 midMC, uint256 upperMC)public onlyOwner{


        require(upperMC > midMC && midMC > lowerMC, "Fix MC");
        require(!usedTokens[token], "Token Already Used");
        
        address _this = address(this);

        (uint160 _initialSqrtPrice, ) = _getPriceAndTickFromValues(token < _this, tokenSupply , lowerMC);
        address npool = Factory(ROUTER.factory()).createPool(_this, token, 10000);//starts pool with 1% fee
		Pool(npool).initialize(_initialSqrtPrice); //Set the pool pricing, needs looked into
        pools.push(npool);

        _threePositions(lowerMC, midMC, upperMC, balanceOf(_this), token);

        pairedTokens.push(token);

    }

    function claimFees()public{
        require(nextClaim < block.timestamp, "Not enough time has passed");
        nextClaim = block.timestamp + interval;
        _claimFees();
        for(uint i =0; i < pairedTokens.length;){
            IERC20 t = IERC20(pairedTokens[i]);
            uint256 _amount = t.balanceOf(address(this));
            if(_amount > 0){
                t.transfer(msg.sender, _amount/50);
                t.transfer(owner(), t.balanceOf(address(this)));
            } 
            unchecked{i++;}
        }

        uint256 amount = address(this).balance;
        if(amount >50){
            address payable m = payable(msg.sender);
            bool f;
            f = m.send(amount/50);
            address payable o = payable(owner());
            f=o.send(address(this).balance);

        }

    }

    function _claimFees()internal{


        for(uint i = 0; i < liquidityPositions.length;){
			_claim(liquidityPositions[i]);
            unchecked{i++;}
        }
    }

	function _claim(uint256 pos)internal{

        PositionManager _pm = PositionManager(ROUTER.positionManager());
        uint128 Uint128Max = type(uint128).max;
        _pm.collect(CollectParams({
                tokenId: pos,
                recipient: address(this),
                amount0Max: Uint128Max,
                amount1Max: Uint128Max
        }));

	}

    function claim()external onlyOwner{
        _claimFees();
        nextClaim = block.timestamp + interval;
        for(uint i =0; i < pairedTokens.length;){
            IERC20 t = IERC20(pairedTokens[i]);
            if(t.balanceOf(address(this)) > 0) {
                t.transfer(msg.sender, t.balanceOf(address(this)));
            }
            unchecked{i++;}
        }



        uint256 amount = address(this).balance;
        if(amount >0){
            address payable o = payable(owner());
            bool f;
            f = o.send(amount);
        }
    }

    receive() external payable {}

	function liquidityPositons()external view returns(uint256[] memory){

		return liquidityPositions;
	}

	function claimSpecficPositions(uint256[] memory positions)external{

		for(uint i =0; i < positions.length;){
			_claim(positions[i]);
			unchecked{i++;}
		}

	} 

	function erc20Withdrawal(address[] memory tokens) external onlyOwner{

		address _this = address(this);
		for(uint i =0; i < tokens.length;){
			require(tokens[i] != _this, "Cannot withdraw contract token");
			IERC20 t = IERC20(tokens[i]);
			t.transfer(msg.sender, t.balanceOf(_this));
			unchecked{i++;}
		}
        uint256 amount = address(this).balance;
        if(amount >0){
            address payable o = payable(owner());
            bool f;
            f = o.send(amount);
        }
	}

	function pairedTokensView() public view returns(address[]memory ){
		return pairedTokens;
	}

}

File 2 of 6 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

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

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

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

File 3 of 6 : ERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

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

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

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

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

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(address from, address to, uint256 amount) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}
}

File 4 of 6 : IERC20Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

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

File 5 of 6 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

File 6 of 6 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"uint256[]","name":"_initialMCs","type":"uint256[]"},{"internalType":"uint256[]","name":"_midMCs","type":"uint256[]"},{"internalType":"uint256[]","name":"_upperMCs","type":"uint256[]"},{"internalType":"uint256","name":"_tokenSupply","type":"uint256"},{"internalType":"address[]","name":"_pairedTokens","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"ROUTER","outputs":[{"internalType":"contract Router","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"positions","type":"uint256[]"}],"name":"claimSpecficPositions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"lowerMC","type":"uint256"},{"internalType":"uint256","name":"midMC","type":"uint256"},{"internalType":"uint256","name":"upperMC","type":"uint256"}],"name":"createNewPosition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"name":"erc20Withdrawal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"liquidityPositons","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pairedTokensView","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pools","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"usedTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405262093a80600d553480156200001857600080fd5b50604051620062173803806200621783398181016040528101906200003e91906200133e565b6040518060400160405280600481526020017f546f696c000000000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f546f696c000000000000000000000000000000000000000000000000000000008152508160039081620000bb919062001683565b508060049081620000cd919062001683565b505050620000f0620000e46200064460201b60201c565b6200064c60201b60201c565b8351855114801562000103575082518451145b801562000111575080518351145b62000153576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200014a90620017cb565b60405180910390fd5b81600981905550600030905060005b865181101562000637576000838281518110620001845762000183620017ed565b5b602002602001015190506000620001ee8473ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1610878b8681518110620001da57620001d9620017ed565b5b60200260200101516200071260201b60201c565b509050600c7368b3465833fb72a70ecdf485e0e4c7bd8665fc4573ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000253573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200027991906200181c565b73ffffffffffffffffffffffffffffffffffffffff1663a167129586856127106040518463ffffffff1660e01b8152600401620002b993929190620018b1565b6020604051808303816000875af1158015620002d9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002ff91906200181c565b9080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600c8381548110620003765762000375620017ed565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f637731d826040518263ffffffff1660e01b8152600401620003db9190620018ff565b600060405180830381600087803b158015620003f657600080fd5b505af11580156200040b573d6000803e3d6000fd5b50505050600d54426200041f91906200194b565b600e819055508783815181106200043b576200043a620017ed565b5b6020026020010151878481518110620004595762000458620017ed565b5b6020026020010151118015620004a8575088838151811062000480576200047f620017ed565b5b60200260200101518884815181106200049e576200049d620017ed565b5b6020026020010151115b620004ea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004e190620019d6565b60405180910390fd5b6006898481518110620005025762000501620017ed565b5b602002602001015190806001815401808255809150506001900390600052602060002001600090919091909150556007888481518110620005485762000547620017ed565b5b6020026020010151908060018154018082558091505060019003906000526020600020016000909190919091505560088784815181106200058e576200058d620017ed565b5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190915055600a829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505080806200062e90620019f8565b91505062000162565b5050505050505062001c82565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080600062000778866200072857846200072a565b855b87156200073857856200073a565b865b780100000000000000000000000000000000000000000000000062000760919062001a74565b6200076c919062001aac565b620007c760201b60201c565b90506200078b816200082c60201b60201c565b915060c8826200079c919062001b04565b82620007a9919062001b3c565b9150620007bc8262000c0760201b60201c565b925050935093915050565b60008060026001840181620007e157620007e062001a45565b5b0490508291505b8181101562000826578091506002818285816200080a576200080962001a45565b5b0401816200081d576200081c62001a45565b5b049050620007e8565b50919050565b60006401000276a373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1610158015620008af575073fffd8963efd1fc6a506488495d951d5263988d2673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16105b620008f1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008e89062001bee565b60405180910390fd5b600060208373ffffffffffffffffffffffffffffffffffffffff16901b9050600081905060006fffffffffffffffffffffffffffffffff821160071b808217915082811c92505067ffffffffffffffff821160061b808217915082811c92505063ffffffff821160051b808217915082811c92505061ffff821160041b808217915082811c92505060ff821160031b808217915082811c925050600f821160021b808217915082811c9250506003821160011b808217915082811c9250506001821180821791505060808110620009d157607f810383901c9150620009db565b80607f0383901b91505b6000604060808303901b9050828302607f1c92508260801c80603f1b8217915083811c935050828302607f1c92508260801c80603e1b8217915083811c935050828302607f1c92508260801c80603d1b8217915083811c935050828302607f1c92508260801c80603c1b8217915083811c935050828302607f1c92508260801c80603b1b8217915083811c935050828302607f1c92508260801c80603a1b8217915083811c935050828302607f1c92508260801c8060391b8217915083811c935050828302607f1c92508260801c8060381b8217915083811c935050828302607f1c92508260801c8060371b8217915083811c935050828302607f1c92508260801c8060361b8217915083811c935050828302607f1c92508260801c8060351b8217915083811c935050828302607f1c92508260801c8060341b8217915083811c935050828302607f1c92508260801c8060331b8217915083811c935050828302607f1c92508260801c8060321b82179150506000693627a301d71055774c8582029050600060806f028f6481ab7f045a5af012a19d003aaa8303901d9050600060806fdb2df09e81959a81455e260799a0632f8401901d90508060020b8260020b1462000bf7578873ffffffffffffffffffffffffffffffffffffffff1662000bcb8262000c0760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16111562000bef578162000bf1565b805b62000bf9565b815b975050505050505050919050565b60008060008360020b1262000c20578260020b62000c28565b8260020b6000035b90507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2761860000360020b81111562000c96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000c8d9062001c60565b60405180910390fd5b600080600183160362000cbb5770010000000000000000000000000000000062000ccd565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506000600283161462000d085760806ffff97272373d413259a46990580e213a8202901c90505b6000600483161462000d2e5760806ffff2e50f5f656932ef12357cf3c7fdcc8202901c90505b6000600883161462000d545760806fffe5caca7e10e4e61c3624eaa0941cd08202901c90505b6000601083161462000d7a5760806fffcb9843d60f6159c9db58835c9266448202901c90505b6000602083161462000da05760806fff973b41fa98c081472e6896dfb254c08202901c90505b6000604083161462000dc65760806fff2ea16466c96a3843ec78b326b528618202901c90505b6000608083161462000dec5760806ffe5dee046a99a2a811c461f1969c30538202901c90505b600061010083161462000e135760806ffcbe86c7900a88aedcffc83b479aa3a48202901c90505b600061020083161462000e3a5760806ff987a7253ac413176f2b074cf7815e548202901c90505b600061040083161462000e615760806ff3392b0822b70005940c7a398e4b70f38202901c90505b600061080083161462000e885760806fe7159475a2c29b7443b29c7fa6e889d98202901c90505b600061100083161462000eaf5760806fd097f3bdfd2022b8845ad8f792aa58258202901c90505b600061200083161462000ed65760806fa9f746462d870fdf8a65dc1f90e061e58202901c90505b600061400083161462000efd5760806f70d869a156d2a1b890bb3df62baf32f78202901c90505b600061800083161462000f245760806f31be135f97d08fd981231505542fcfa68202901c90505b60006201000083161462000f4c5760806f09aa508b5b7a84e1c677de54f3e99bc98202901c90505b60006202000083161462000f735760806e5d6af8dedb81196699c329225ee6048202901c90505b60006204000083161462000f995760806d2216e584f5fa1ea926041bedfe988202901c90505b60006208000083161462000fbd5760806b048a170391f7dc42444e8fa28202901c90505b60008460020b13156200100157807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8162000ffd5762000ffc62001a45565b5b0490505b600064010000000082816200101b576200101a62001a45565b5b06146200102a5760016200102d565b60005b60ff16602082901c0192505050919050565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620010a38262001058565b810181811067ffffffffffffffff82111715620010c557620010c462001069565b5b80604052505050565b6000620010da6200103f565b9050620010e8828262001098565b919050565b600067ffffffffffffffff8211156200110b576200110a62001069565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b620011368162001121565b81146200114257600080fd5b50565b60008151905062001156816200112b565b92915050565b6000620011736200116d84620010ed565b620010ce565b905080838252602082019050602084028301858111156200119957620011986200111c565b5b835b81811015620011c65780620011b1888262001145565b8452602084019350506020810190506200119b565b5050509392505050565b600082601f830112620011e857620011e762001053565b5b8151620011fa8482602086016200115c565b91505092915050565b600067ffffffffffffffff82111562001221576200122062001069565b5b602082029050602081019050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200125f8262001232565b9050919050565b620012718162001252565b81146200127d57600080fd5b50565b600081519050620012918162001266565b92915050565b6000620012ae620012a88462001203565b620010ce565b90508083825260208201905060208402830185811115620012d457620012d36200111c565b5b835b81811015620013015780620012ec888262001280565b845260208401935050602081019050620012d6565b5050509392505050565b600082601f83011262001323576200132262001053565b5b81516200133584826020860162001297565b91505092915050565b600080600080600060a086880312156200135d576200135c62001049565b5b600086015167ffffffffffffffff8111156200137e576200137d6200104e565b5b6200138c88828901620011d0565b955050602086015167ffffffffffffffff811115620013b057620013af6200104e565b5b620013be88828901620011d0565b945050604086015167ffffffffffffffff811115620013e257620013e16200104e565b5b620013f088828901620011d0565b9350506060620014038882890162001145565b925050608086015167ffffffffffffffff8111156200142757620014266200104e565b5b62001435888289016200130b565b9150509295509295909350565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200149557607f821691505b602082108103620014ab57620014aa6200144d565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620014d6565b620015218683620014d6565b95508019841693508086168417925050509392505050565b6000819050919050565b6000620015646200155e620015588462001121565b62001539565b62001121565b9050919050565b6000819050919050565b620015808362001543565b620015986200158f826200156b565b848454620014e3565b825550505050565b600090565b620015af620015a0565b620015bc81848462001575565b505050565b5b81811015620015e457620015d8600082620015a5565b600181019050620015c2565b5050565b601f8211156200163357620015fd81620014b1565b6200160884620014c6565b8101602085101562001618578190505b620016306200162785620014c6565b830182620015c1565b50505b505050565b600082821c905092915050565b6000620016586000198460080262001638565b1980831691505092915050565b600062001673838362001645565b9150826002028217905092915050565b6200168e8262001442565b67ffffffffffffffff811115620016aa57620016a962001069565b5b620016b682546200147c565b620016c3828285620015e8565b600060209050601f831160018114620016fb5760008415620016e6578287015190505b620016f2858262001665565b86555062001762565b601f1984166200170b86620014b1565b60005b8281101562001735578489015182556001820191506020850194506020810190506200170e565b8683101562001755578489015162001751601f89168262001645565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f417272617973206e6f7420657175616c206c656e677468000000000000000000600082015250565b6000620017b36017836200176a565b9150620017c0826200177b565b602082019050919050565b60006020820190508181036000830152620017e681620017a4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121562001835576200183462001049565b5b6000620018458482850162001280565b91505092915050565b620018598162001252565b82525050565b6000819050919050565b600062ffffff82169050919050565b600062001899620018936200188d846200185f565b62001539565b62001869565b9050919050565b620018ab8162001878565b82525050565b6000606082019050620018c860008301866200184e565b620018d760208301856200184e565b620018e66040830184620018a0565b949350505050565b620018f98162001232565b82525050565b6000602082019050620019166000830184620018ee565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620019588262001121565b9150620019658362001121565b925082820190508082111562001980576200197f6200191c565b5b92915050565b7f466978204d430000000000000000000000000000000000000000000000000000600082015250565b6000620019be6006836200176a565b9150620019cb8262001986565b602082019050919050565b60006020820190508181036000830152620019f181620019af565b9050919050565b600062001a058262001121565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362001a3a5762001a396200191c565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600062001a818262001121565b915062001a8e8362001121565b92508262001aa15762001aa062001a45565b5b828204905092915050565b600062001ab98262001121565b915062001ac68362001121565b925082820262001ad68162001121565b9150828204841483151762001af05762001aef6200191c565b5b5092915050565b60008160020b9050919050565b600062001b118262001af7565b915062001b1e8362001af7565b92508262001b315762001b3062001a45565b5b828207905092915050565b600062001b498262001af7565b915062001b568362001af7565b92508282039050627fffff81137fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000008212171562001b985762001b976200191c565b5b92915050565b7f5200000000000000000000000000000000000000000000000000000000000000600082015250565b600062001bd66001836200176a565b915062001be38262001b9e565b602082019050919050565b6000602082019050818103600083015262001c098162001bc7565b9050919050565b7f5400000000000000000000000000000000000000000000000000000000000000600082015250565b600062001c486001836200176a565b915062001c558262001c10565b602082019050919050565b6000602082019050818103600083015262001c7b8162001c39565b9050919050565b6145858062001c926000396000f3fe60806040526004361061016a5760003560e01c8063715018a6116100d1578063ac4afa381161008a578063d5c11e3011610064578063d5c11e3014610539578063dd62ed3e14610564578063dff7e3cb146105a1578063f2fde38b146105ca57610171565b8063ac4afa38146104bc578063bdd859ce146104f9578063d294f0931461052257610171565b8063715018a6146103be5780638129fc1c146103d55780638da5cb5b146103ec57806395d89b4114610417578063a457c2d714610442578063a9059cbb1461047f57610171565b806332fe7b261161012357806332fe7b261461029c5780633659ffb2146102c757806339509351146103045780634e71d92d146103415780636d60cb761461035857806370a082311461038157610171565b806306fdde0314610176578063095ea7b3146101a157806318160ddd146101de57806318f3b92a1461020957806323b872dd14610234578063313ce5671461027157610171565b3661017157005b600080fd5b34801561018257600080fd5b5061018b6105f3565b6040516101989190612e85565b60405180910390f35b3480156101ad57600080fd5b506101c860048036038101906101c39190612f4f565b610685565b6040516101d59190612faa565b60405180910390f35b3480156101ea57600080fd5b506101f36106a8565b6040516102009190612fd4565b60405180910390f35b34801561021557600080fd5b5061021e6106b2565b60405161022b91906130ad565b60405180910390f35b34801561024057600080fd5b5061025b600480360381019061025691906130cf565b61070a565b6040516102689190612faa565b60405180910390f35b34801561027d57600080fd5b50610286610739565b604051610293919061313e565b60405180910390f35b3480156102a857600080fd5b506102b1610742565b6040516102be91906131b8565b60405180910390f35b3480156102d357600080fd5b506102ee60048036038101906102e991906131d3565b61075a565b6040516102fb9190612faa565b60405180910390f35b34801561031057600080fd5b5061032b60048036038101906103269190612f4f565b61077a565b6040516103389190612faa565b60405180910390f35b34801561034d57600080fd5b506103566107b1565b005b34801561036457600080fd5b5061037f600480360381019061037a9190613200565b610a0b565b005b34801561038d57600080fd5b506103a860048036038101906103a391906131d3565b610d89565b6040516103b59190612fd4565b60405180910390f35b3480156103ca57600080fd5b506103d3610dd1565b005b3480156103e157600080fd5b506103ea610de5565b005b3480156103f857600080fd5b50610401610f09565b60405161040e9190613276565b60405180910390f35b34801561042357600080fd5b5061042c610f33565b6040516104399190612e85565b60405180910390f35b34801561044e57600080fd5b5061046960048036038101906104649190612f4f565b610fc5565b6040516104769190612faa565b60405180910390f35b34801561048b57600080fd5b506104a660048036038101906104a19190612f4f565b61103c565b6040516104b39190612faa565b60405180910390f35b3480156104c857600080fd5b506104e360048036038101906104de9190613291565b61105f565b6040516104f09190613276565b60405180910390f35b34801561050557600080fd5b50610520600480360381019061051b9190613406565b61109e565b005b34801561052e57600080fd5b506105376112c0565b005b34801561054557600080fd5b5061054e611637565b60405161055b919061350d565b60405180910390f35b34801561057057600080fd5b5061058b6004803603810190610586919061352f565b6116c5565b6040516105989190612fd4565b60405180910390f35b3480156105ad57600080fd5b506105c860048036038101906105c39190613632565b61174c565b005b3480156105d657600080fd5b506105f160048036038101906105ec91906131d3565b61178c565b005b606060038054610602906136aa565b80601f016020809104026020016040519081016040528092919081815260200182805461062e906136aa565b801561067b5780601f106106505761010080835404028352916020019161067b565b820191906000526020600020905b81548152906001019060200180831161065e57829003601f168201915b5050505050905090565b60008061069061180f565b905061069d818585611817565b600191505092915050565b6000600254905090565b6060600b80548060200260200160405190810160405280929190818152602001828054801561070057602002820191906000526020600020905b8154815260200190600101908083116106ec575b5050505050905090565b60008061071561180f565b90506107228582856119e0565b61072d858585611a6c565b60019150509392505050565b60006012905090565b7368b3465833fb72a70ecdf485e0e4c7bd8665fc4581565b600f6020528060005260406000206000915054906101000a900460ff1681565b60008061078561180f565b90506107a681858561079785896116c5565b6107a1919061370a565b611817565b600191505092915050565b6107b9611ce2565b6107c1611d60565b600d54426107cf919061370a565b600e8190555060005b600a805490508110156109b1576000600a82815481106107fb576107fa61373e565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016108639190613276565b602060405180830381865afa158015610880573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a49190613782565b11156109a3578073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb338373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016109009190613276565b602060405180830381865afa15801561091d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109419190613782565b6040518363ffffffff1660e01b815260040161095e9291906137af565b6020604051808303816000875af115801561097d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a19190613804565b505b8180600101925050506107d8565b5060004790506000811115610a085760006109ca610f09565b905060008173ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050905050505b50565b610a13611ce2565b8181118015610a2157508282115b610a60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a579061387d565b60405180910390fd5b600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610aed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae4906138e9565b60405180910390fd5b60003090506000610b2f8273ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161060095487611da7565b50905060007368b3465833fb72a70ecdf485e0e4c7bd8665fc4573ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb7919061391e565b73ffffffffffffffffffffffffffffffffffffffff1663a167129584896127106040518463ffffffff1660e01b8152600401610bf593929190613995565b6020604051808303816000875af1158015610c14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c38919061391e565b90508073ffffffffffffffffffffffffffffffffffffffff1663f637731d836040518263ffffffff1660e01b8152600401610c7391906139db565b600060405180830381600087803b158015610c8d57600080fd5b505af1158015610ca1573d6000803e3d6000fd5b50505050600c819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610d1d868686610d1787610d89565b8b611e38565b600a879080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610dd9611ce2565b610de3600061202b565b565b6000610def6106a8565b14610df957600080fd5b610e05306009546120f1565b6000600a80549050600954610e1a9190613a25565b905060005b600a80549050811015610f055781610e356106a8565b10610ef257610ef160068281548110610e5157610e5061373e565b5b906000526020600020015460078381548110610e7057610e6f61373e565b5b906000526020600020015460088481548110610e8f57610e8e61373e565b5b9060005260206000200154600a80549050600954610ead9190613a25565b600a8681548110610ec157610ec061373e565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611e38565b5b8080610efd90613a56565b915050610e1f565b5050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610f42906136aa565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6e906136aa565b8015610fbb5780601f10610f9057610100808354040283529160200191610fbb565b820191906000526020600020905b815481529060010190602001808311610f9e57829003601f168201915b5050505050905090565b600080610fd061180f565b90506000610fde82866116c5565b905083811015611023576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101a90613b10565b60405180910390fd5b6110308286868403611817565b60019250505092915050565b60008061104761180f565b9050611054818585611a6c565b600191505092915050565b600c818154811061106f57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6110a6611ce2565b600030905060005b8251811015611264578173ffffffffffffffffffffffffffffffffffffffff168382815181106110e1576110e061373e565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff160361113f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113690613b7c565b60405180910390fd5b60008382815181106111545761115361373e565b5b602002602001015190508073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb338373ffffffffffffffffffffffffffffffffffffffff166370a08231876040518263ffffffff1660e01b81526004016111b49190613276565b602060405180830381865afa1580156111d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f59190613782565b6040518363ffffffff1660e01b81526004016112129291906137af565b6020604051808303816000875af1158015611231573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112559190613804565b508180600101925050506110ae565b50600047905060008111156112bb57600061127d610f09565b905060008173ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050905050505b505050565b42600e5410611304576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fb90613be8565b60405180910390fd5b600d5442611312919061370a565b600e81905550611320611d60565b60005b600a80549050811015611594576000600a82815481106113465761134561373e565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016113ae9190613276565b602060405180830381865afa1580156113cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ef9190613782565b90506000811115611585578173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb336032846114249190613a25565b6040518363ffffffff1660e01b81526004016114419291906137af565b6020604051808303816000875af1158015611460573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114849190613804565b508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6114a9610f09565b8473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016114e29190613276565b602060405180830381865afa1580156114ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115239190613782565b6040518363ffffffff1660e01b81526004016115409291906137af565b6020604051808303816000875af115801561155f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115839190613804565b505b82806001019350505050611323565b506000479050603281111561163457600033905060008173ffffffffffffffffffffffffffffffffffffffff166108fc6032856115d19190613a25565b9081150290604051600060405180830381858888f19350505050905060006115f7610f09565b90508073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505091505050505b50565b6060600a8054806020026020016040519081016040528092919081815260200182805480156116bb57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611671575b5050505050905090565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60005b81518110156117885761177b82828151811061176e5761176d61373e565b5b6020026020010151612247565b808060010191505061174f565b5050565b611794611ce2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611803576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fa90613c7a565b60405180910390fd5b61180c8161202b565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611886576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187d90613d0c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036118f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ec90613d9e565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516119d39190612fd4565b60405180910390a3505050565b60006119ec84846116c5565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611a665781811015611a58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4f90613e0a565b60405180910390fd5b611a658484848403611817565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611adb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad290613e9c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4190613f2e565b60405180910390fd5b611b558383836123bf565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611bdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd290613fc0565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611cc99190612fd4565b60405180910390a3611cdc8484846123c4565b50505050565b611cea61180f565b73ffffffffffffffffffffffffffffffffffffffff16611d08610f09565b73ffffffffffffffffffffffffffffffffffffffff1614611d5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d559061402c565b60405180910390fd5b565b60005b600b80549050811015611da457611d97600b8281548110611d8757611d8661373e565b5b9060005260206000200154612247565b8080600101915050611d63565b50565b6000806000611dfd86611dba5784611dbc565b855b8715611dc85785611dca565b865b7801000000000000000000000000000000000000000000000000611dee9190613a25565b611df8919061404c565b6123c9565b9050611e0881612423565b915060c882611e17919061409b565b82611e2291906140cc565b9150611e2d826127ec565b925050935093915050565b600030905060008173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16109050600d5442611e7e919061370a565b600e819055506000611e93826009548a611da7565b9150506000611ea5836009548a611da7565b9150506000611eb7846009548a611da7565b91505060006064886014611ecb919061404c565b611ed59190613a25565b9050600b611f1888888889611eea5788611ef8565b60c889611ef791906140cc565b5b8a15611f045789611f12565b60c88a611f119190614127565b5b87612c01565b9080600181540180825580915050600190039060005260206000200160009091909190915055600b611f8b88888889611f5d5760c889611f589190614127565b611f5f565b875b8a15611f775760c88a611f7291906140cc565b611f79565b885b876003611f86919061404c565b612c01565b9080600181540180825580915050600190039060005260206000200160009091909190915055600b611ff888888889611fc45787611fc6565b865b8a15611fd25788611fd4565b875b611fdd8d610d89565b8811611fe95787611ff3565b611ff28d610d89565b5b612c01565b90806001815401808255809150506001900390600052602060002001600090919091909150555050505050505050505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612160576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612157906141ce565b60405180910390fd5b61216c600083836123bf565b806002600082825461217e919061370a565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161222f9190612fd4565b60405180910390a3612243600083836123c4565b5050565b60007368b3465833fb72a70ecdf485e0e4c7bd8665fc4573ffffffffffffffffffffffffffffffffffffffff1663791b98bc6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122cc919061391e565b905060006fffffffffffffffffffffffffffffffff90508173ffffffffffffffffffffffffffffffffffffffff1663fc6f786560405180608001604052808681526020013073ffffffffffffffffffffffffffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff168152506040518263ffffffff1660e01b8152600401612376919061426e565b60408051808303816000875af1158015612394573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123b89190614289565b5050505050565b505050565b505050565b600080600260018401816123e0576123df6139f6565b5b0490508291505b8181101561241d57809150600281828581612405576124046139f6565b5b040181612415576124146139f6565b5b0490506123e7565b50919050565b60006401000276a373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16101580156124a5575073fffd8963efd1fc6a506488495d951d5263988d2673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16105b6124e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124db90614315565b60405180910390fd5b600060208373ffffffffffffffffffffffffffffffffffffffff16901b9050600081905060006fffffffffffffffffffffffffffffffff821160071b808217915082811c92505067ffffffffffffffff821160061b808217915082811c92505063ffffffff821160051b808217915082811c92505061ffff821160041b808217915082811c92505060ff821160031b808217915082811c925050600f821160021b808217915082811c9250506003821160011b808217915082811c92505060018211808217915050608081106125c257607f810383901c91506125cc565b80607f0383901b91505b6000604060808303901b9050828302607f1c92508260801c80603f1b8217915083811c935050828302607f1c92508260801c80603e1b8217915083811c935050828302607f1c92508260801c80603d1b8217915083811c935050828302607f1c92508260801c80603c1b8217915083811c935050828302607f1c92508260801c80603b1b8217915083811c935050828302607f1c92508260801c80603a1b8217915083811c935050828302607f1c92508260801c8060391b8217915083811c935050828302607f1c92508260801c8060381b8217915083811c935050828302607f1c92508260801c8060371b8217915083811c935050828302607f1c92508260801c8060361b8217915083811c935050828302607f1c92508260801c8060351b8217915083811c935050828302607f1c92508260801c8060341b8217915083811c935050828302607f1c92508260801c8060331b8217915083811c935050828302607f1c92508260801c8060321b82179150506000693627a301d71055774c8582029050600060806f028f6481ab7f045a5af012a19d003aaa8303901d9050600060806fdb2df09e81959a81455e260799a0632f8401901d90508060020b8260020b146127dc578873ffffffffffffffffffffffffffffffffffffffff166127b3826127ec565b73ffffffffffffffffffffffffffffffffffffffff1611156127d557816127d7565b805b6127de565b815b975050505050505050919050565b60008060008360020b12612803578260020b61280b565b8260020b6000035b90507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2761860000360020b811115612876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286d90614381565b60405180910390fd5b6000806001831603612899577001000000000000000000000000000000006128ab565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff169050600060028316146128e55760806ffff97272373d413259a46990580e213a8202901c90505b6000600483161461290a5760806ffff2e50f5f656932ef12357cf3c7fdcc8202901c90505b6000600883161461292f5760806fffe5caca7e10e4e61c3624eaa0941cd08202901c90505b600060108316146129545760806fffcb9843d60f6159c9db58835c9266448202901c90505b600060208316146129795760806fff973b41fa98c081472e6896dfb254c08202901c90505b6000604083161461299e5760806fff2ea16466c96a3843ec78b326b528618202901c90505b600060808316146129c35760806ffe5dee046a99a2a811c461f1969c30538202901c90505b60006101008316146129e95760806ffcbe86c7900a88aedcffc83b479aa3a48202901c90505b6000610200831614612a0f5760806ff987a7253ac413176f2b074cf7815e548202901c90505b6000610400831614612a355760806ff3392b0822b70005940c7a398e4b70f38202901c90505b6000610800831614612a5b5760806fe7159475a2c29b7443b29c7fa6e889d98202901c90505b6000611000831614612a815760806fd097f3bdfd2022b8845ad8f792aa58258202901c90505b6000612000831614612aa75760806fa9f746462d870fdf8a65dc1f90e061e58202901c90505b6000614000831614612acd5760806f70d869a156d2a1b890bb3df62baf32f78202901c90505b6000618000831614612af35760806f31be135f97d08fd981231505542fcfa68202901c90505b600062010000831614612b1a5760806f09aa508b5b7a84e1c677de54f3e99bc98202901c90505b600062020000831614612b405760806e5d6af8dedb81196699c329225ee6048202901c90505b600062040000831614612b655760806d2216e584f5fa1ea926041bedfe988202901c90505b600062080000831614612b885760806b048a170391f7dc42444e8fa28202901c90505b60008460020b1315612bc857807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81612bc457612bc36139f6565b5b0490505b60006401000000008281612bdf57612bde6139f6565b5b0614612bec576001612bef565b60005b60ff16602082901c0192505050919050565b6000807368b3465833fb72a70ecdf485e0e4c7bd8665fc4573ffffffffffffffffffffffffffffffffffffffff1663791b98bc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c87919061391e565b9050612c94878285611817565b8073ffffffffffffffffffffffffffffffffffffffff16638831645660405180610160016040528089612cc7578a612cc9565b8b5b73ffffffffffffffffffffffffffffffffffffffff1681526020018915612cf0578a612cf2565b8b5b73ffffffffffffffffffffffffffffffffffffffff16815260200161271062ffffff1681526020018860020b81526020018760020b815260200189612d375786612d3a565b60005b81526020018915612d4b5786612d4e565b60005b815260200160008152602001600081526020018a73ffffffffffffffffffffffffffffffffffffffff168152602001428152506040518263ffffffff1660e01b8152600401612d9d91906144a0565b6080604051808303816000875af1158015612dbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612de091906144e8565b90915090505080925050509695505050505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e2f578082015181840152602081019050612e14565b60008484015250505050565b6000601f19601f8301169050919050565b6000612e5782612df5565b612e618185612e00565b9350612e71818560208601612e11565b612e7a81612e3b565b840191505092915050565b60006020820190508181036000830152612e9f8184612e4c565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612ee682612ebb565b9050919050565b612ef681612edb565b8114612f0157600080fd5b50565b600081359050612f1381612eed565b92915050565b6000819050919050565b612f2c81612f19565b8114612f3757600080fd5b50565b600081359050612f4981612f23565b92915050565b60008060408385031215612f6657612f65612eb1565b5b6000612f7485828601612f04565b9250506020612f8585828601612f3a565b9150509250929050565b60008115159050919050565b612fa481612f8f565b82525050565b6000602082019050612fbf6000830184612f9b565b92915050565b612fce81612f19565b82525050565b6000602082019050612fe96000830184612fc5565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61302481612f19565b82525050565b6000613036838361301b565b60208301905092915050565b6000602082019050919050565b600061305a82612fef565b6130648185612ffa565b935061306f8361300b565b8060005b838110156130a0578151613087888261302a565b975061309283613042565b925050600181019050613073565b5085935050505092915050565b600060208201905081810360008301526130c7818461304f565b905092915050565b6000806000606084860312156130e8576130e7612eb1565b5b60006130f686828701612f04565b935050602061310786828701612f04565b925050604061311886828701612f3a565b9150509250925092565b600060ff82169050919050565b61313881613122565b82525050565b6000602082019050613153600083018461312f565b92915050565b6000819050919050565b600061317e61317961317484612ebb565b613159565b612ebb565b9050919050565b600061319082613163565b9050919050565b60006131a282613185565b9050919050565b6131b281613197565b82525050565b60006020820190506131cd60008301846131a9565b92915050565b6000602082840312156131e9576131e8612eb1565b5b60006131f784828501612f04565b91505092915050565b6000806000806080858703121561321a57613219612eb1565b5b600061322887828801612f04565b945050602061323987828801612f3a565b935050604061324a87828801612f3a565b925050606061325b87828801612f3a565b91505092959194509250565b61327081612edb565b82525050565b600060208201905061328b6000830184613267565b92915050565b6000602082840312156132a7576132a6612eb1565b5b60006132b584828501612f3a565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6132fb82612e3b565b810181811067ffffffffffffffff8211171561331a576133196132c3565b5b80604052505050565b600061332d612ea7565b905061333982826132f2565b919050565b600067ffffffffffffffff821115613359576133586132c3565b5b602082029050602081019050919050565b600080fd5b600061338261337d8461333e565b613323565b905080838252602082019050602084028301858111156133a5576133a461336a565b5b835b818110156133ce57806133ba8882612f04565b8452602084019350506020810190506133a7565b5050509392505050565b600082601f8301126133ed576133ec6132be565b5b81356133fd84826020860161336f565b91505092915050565b60006020828403121561341c5761341b612eb1565b5b600082013567ffffffffffffffff81111561343a57613439612eb6565b5b613446848285016133d8565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61348481612edb565b82525050565b6000613496838361347b565b60208301905092915050565b6000602082019050919050565b60006134ba8261344f565b6134c4818561345a565b93506134cf8361346b565b8060005b838110156135005781516134e7888261348a565b97506134f2836134a2565b9250506001810190506134d3565b5085935050505092915050565b6000602082019050818103600083015261352781846134af565b905092915050565b6000806040838503121561354657613545612eb1565b5b600061355485828601612f04565b925050602061356585828601612f04565b9150509250929050565b600067ffffffffffffffff82111561358a576135896132c3565b5b602082029050602081019050919050565b60006135ae6135a98461356f565b613323565b905080838252602082019050602084028301858111156135d1576135d061336a565b5b835b818110156135fa57806135e68882612f3a565b8452602084019350506020810190506135d3565b5050509392505050565b600082601f830112613619576136186132be565b5b813561362984826020860161359b565b91505092915050565b60006020828403121561364857613647612eb1565b5b600082013567ffffffffffffffff81111561366657613665612eb6565b5b61367284828501613604565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806136c257607f821691505b6020821081036136d5576136d461367b565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061371582612f19565b915061372083612f19565b9250828201905080821115613738576137376136db565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008151905061377c81612f23565b92915050565b60006020828403121561379857613797612eb1565b5b60006137a68482850161376d565b91505092915050565b60006040820190506137c46000830185613267565b6137d16020830184612fc5565b9392505050565b6137e181612f8f565b81146137ec57600080fd5b50565b6000815190506137fe816137d8565b92915050565b60006020828403121561381a57613819612eb1565b5b6000613828848285016137ef565b91505092915050565b7f466978204d430000000000000000000000000000000000000000000000000000600082015250565b6000613867600683612e00565b915061387282613831565b602082019050919050565b600060208201905081810360008301526138968161385a565b9050919050565b7f546f6b656e20416c726561647920557365640000000000000000000000000000600082015250565b60006138d3601283612e00565b91506138de8261389d565b602082019050919050565b60006020820190508181036000830152613902816138c6565b9050919050565b60008151905061391881612eed565b92915050565b60006020828403121561393457613933612eb1565b5b600061394284828501613909565b91505092915050565b6000819050919050565b600062ffffff82169050919050565b600061397f61397a6139758461394b565b613159565b613955565b9050919050565b61398f81613964565b82525050565b60006060820190506139aa6000830186613267565b6139b76020830185613267565b6139c46040830184613986565b949350505050565b6139d581612ebb565b82525050565b60006020820190506139f060008301846139cc565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613a3082612f19565b9150613a3b83612f19565b925082613a4b57613a4a6139f6565b5b828204905092915050565b6000613a6182612f19565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613a9357613a926136db565b5b600182019050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000613afa602583612e00565b9150613b0582613a9e565b604082019050919050565b60006020820190508181036000830152613b2981613aed565b9050919050565b7f43616e6e6f7420776974686472617720636f6e747261637420746f6b656e0000600082015250565b6000613b66601e83612e00565b9150613b7182613b30565b602082019050919050565b60006020820190508181036000830152613b9581613b59565b9050919050565b7f4e6f7420656e6f7567682074696d652068617320706173736564000000000000600082015250565b6000613bd2601a83612e00565b9150613bdd82613b9c565b602082019050919050565b60006020820190508181036000830152613c0181613bc5565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613c64602683612e00565b9150613c6f82613c08565b604082019050919050565b60006020820190508181036000830152613c9381613c57565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613cf6602483612e00565b9150613d0182613c9a565b604082019050919050565b60006020820190508181036000830152613d2581613ce9565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d88602283612e00565b9150613d9382613d2c565b604082019050919050565b60006020820190508181036000830152613db781613d7b565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000613df4601d83612e00565b9150613dff82613dbe565b602082019050919050565b60006020820190508181036000830152613e2381613de7565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000613e86602583612e00565b9150613e9182613e2a565b604082019050919050565b60006020820190508181036000830152613eb581613e79565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000613f18602383612e00565b9150613f2382613ebc565b604082019050919050565b60006020820190508181036000830152613f4781613f0b565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000613faa602683612e00565b9150613fb582613f4e565b604082019050919050565b60006020820190508181036000830152613fd981613f9d565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614016602083612e00565b915061402182613fe0565b602082019050919050565b6000602082019050818103600083015261404581614009565b9050919050565b600061405782612f19565b915061406283612f19565b925082820261407081612f19565b91508282048414831517614087576140866136db565b5b5092915050565b60008160020b9050919050565b60006140a68261408e565b91506140b18361408e565b9250826140c1576140c06139f6565b5b828207905092915050565b60006140d78261408e565b91506140e28361408e565b92508282039050627fffff81137fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80000082121715614121576141206136db565b5b92915050565b60006141328261408e565b915061413d8361408e565b925082820190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000008112627fffff8213171561417c5761417b6136db565b5b92915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006141b8601f83612e00565b91506141c382614182565b602082019050919050565b600060208201905081810360008301526141e7816141ab565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b614213816141ee565b82525050565b60808201600082015161422f600085018261301b565b506020820151614242602085018261347b565b506040820151614255604085018261420a565b506060820151614268606085018261420a565b50505050565b60006080820190506142836000830184614219565b92915050565b600080604083850312156142a05761429f612eb1565b5b60006142ae8582860161376d565b92505060206142bf8582860161376d565b9150509250929050565b7f5200000000000000000000000000000000000000000000000000000000000000600082015250565b60006142ff600183612e00565b915061430a826142c9565b602082019050919050565b6000602082019050818103600083015261432e816142f2565b9050919050565b7f5400000000000000000000000000000000000000000000000000000000000000600082015250565b600061436b600183612e00565b915061437682614335565b602082019050919050565b6000602082019050818103600083015261439a8161435e565b9050919050565b6143aa81613955565b82525050565b6143b98161408e565b82525050565b610160820160008201516143d6600085018261347b565b5060208201516143e9602085018261347b565b5060408201516143fc60408501826143a1565b50606082015161440f60608501826143b0565b50608082015161442260808501826143b0565b5060a082015161443560a085018261301b565b5060c082015161444860c085018261301b565b5060e082015161445b60e085018261301b565b5061010082015161447061010085018261301b565b5061012082015161448561012085018261347b565b5061014082015161449a61014085018261301b565b50505050565b6000610160820190506144b660008301846143bf565b92915050565b6144c5816141ee565b81146144d057600080fd5b50565b6000815190506144e2816144bc565b92915050565b6000806000806080858703121561450257614501612eb1565b5b60006145108782880161376d565b9450506020614521878288016144d3565b93505060406145328782880161376d565b92505060606145438782880161376d565b9150509295919450925056fea26469706673582212208cd8227c5c7b195c942aff31d57a25a99b9d84e0d51d385d5374d88d479e525964736f6c6343000812003300000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000813f3978f894098440000000000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000d8d726b7177a80000000000000000000000000000000000000000000000000121e4dbab336ee8000000000000000000000000000000000000000000000000e299b1f48c3159e80000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000021e19e0c9bab240000000000000000000000000000000000000000000000000044f0bacd9cb7a480000000000000000000000000000000000000000000000028a1de992260c9be80000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000d3c21bcecceda10000000000000000000000000000000000000000000000000069f3e5d2accce6480000000000000000000000000000000000000000000000109a01c24dc1d44ce800000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca0000000000000000000000003d3d35bb9bec23b06ca00fe472b50e7a4c692c30

Deployed Bytecode

0x60806040526004361061016a5760003560e01c8063715018a6116100d1578063ac4afa381161008a578063d5c11e3011610064578063d5c11e3014610539578063dd62ed3e14610564578063dff7e3cb146105a1578063f2fde38b146105ca57610171565b8063ac4afa38146104bc578063bdd859ce146104f9578063d294f0931461052257610171565b8063715018a6146103be5780638129fc1c146103d55780638da5cb5b146103ec57806395d89b4114610417578063a457c2d714610442578063a9059cbb1461047f57610171565b806332fe7b261161012357806332fe7b261461029c5780633659ffb2146102c757806339509351146103045780634e71d92d146103415780636d60cb761461035857806370a082311461038157610171565b806306fdde0314610176578063095ea7b3146101a157806318160ddd146101de57806318f3b92a1461020957806323b872dd14610234578063313ce5671461027157610171565b3661017157005b600080fd5b34801561018257600080fd5b5061018b6105f3565b6040516101989190612e85565b60405180910390f35b3480156101ad57600080fd5b506101c860048036038101906101c39190612f4f565b610685565b6040516101d59190612faa565b60405180910390f35b3480156101ea57600080fd5b506101f36106a8565b6040516102009190612fd4565b60405180910390f35b34801561021557600080fd5b5061021e6106b2565b60405161022b91906130ad565b60405180910390f35b34801561024057600080fd5b5061025b600480360381019061025691906130cf565b61070a565b6040516102689190612faa565b60405180910390f35b34801561027d57600080fd5b50610286610739565b604051610293919061313e565b60405180910390f35b3480156102a857600080fd5b506102b1610742565b6040516102be91906131b8565b60405180910390f35b3480156102d357600080fd5b506102ee60048036038101906102e991906131d3565b61075a565b6040516102fb9190612faa565b60405180910390f35b34801561031057600080fd5b5061032b60048036038101906103269190612f4f565b61077a565b6040516103389190612faa565b60405180910390f35b34801561034d57600080fd5b506103566107b1565b005b34801561036457600080fd5b5061037f600480360381019061037a9190613200565b610a0b565b005b34801561038d57600080fd5b506103a860048036038101906103a391906131d3565b610d89565b6040516103b59190612fd4565b60405180910390f35b3480156103ca57600080fd5b506103d3610dd1565b005b3480156103e157600080fd5b506103ea610de5565b005b3480156103f857600080fd5b50610401610f09565b60405161040e9190613276565b60405180910390f35b34801561042357600080fd5b5061042c610f33565b6040516104399190612e85565b60405180910390f35b34801561044e57600080fd5b5061046960048036038101906104649190612f4f565b610fc5565b6040516104769190612faa565b60405180910390f35b34801561048b57600080fd5b506104a660048036038101906104a19190612f4f565b61103c565b6040516104b39190612faa565b60405180910390f35b3480156104c857600080fd5b506104e360048036038101906104de9190613291565b61105f565b6040516104f09190613276565b60405180910390f35b34801561050557600080fd5b50610520600480360381019061051b9190613406565b61109e565b005b34801561052e57600080fd5b506105376112c0565b005b34801561054557600080fd5b5061054e611637565b60405161055b919061350d565b60405180910390f35b34801561057057600080fd5b5061058b6004803603810190610586919061352f565b6116c5565b6040516105989190612fd4565b60405180910390f35b3480156105ad57600080fd5b506105c860048036038101906105c39190613632565b61174c565b005b3480156105d657600080fd5b506105f160048036038101906105ec91906131d3565b61178c565b005b606060038054610602906136aa565b80601f016020809104026020016040519081016040528092919081815260200182805461062e906136aa565b801561067b5780601f106106505761010080835404028352916020019161067b565b820191906000526020600020905b81548152906001019060200180831161065e57829003601f168201915b5050505050905090565b60008061069061180f565b905061069d818585611817565b600191505092915050565b6000600254905090565b6060600b80548060200260200160405190810160405280929190818152602001828054801561070057602002820191906000526020600020905b8154815260200190600101908083116106ec575b5050505050905090565b60008061071561180f565b90506107228582856119e0565b61072d858585611a6c565b60019150509392505050565b60006012905090565b7368b3465833fb72a70ecdf485e0e4c7bd8665fc4581565b600f6020528060005260406000206000915054906101000a900460ff1681565b60008061078561180f565b90506107a681858561079785896116c5565b6107a1919061370a565b611817565b600191505092915050565b6107b9611ce2565b6107c1611d60565b600d54426107cf919061370a565b600e8190555060005b600a805490508110156109b1576000600a82815481106107fb576107fa61373e565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016108639190613276565b602060405180830381865afa158015610880573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a49190613782565b11156109a3578073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb338373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016109009190613276565b602060405180830381865afa15801561091d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109419190613782565b6040518363ffffffff1660e01b815260040161095e9291906137af565b6020604051808303816000875af115801561097d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a19190613804565b505b8180600101925050506107d8565b5060004790506000811115610a085760006109ca610f09565b905060008173ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050905050505b50565b610a13611ce2565b8181118015610a2157508282115b610a60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a579061387d565b60405180910390fd5b600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610aed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae4906138e9565b60405180910390fd5b60003090506000610b2f8273ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161060095487611da7565b50905060007368b3465833fb72a70ecdf485e0e4c7bd8665fc4573ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb7919061391e565b73ffffffffffffffffffffffffffffffffffffffff1663a167129584896127106040518463ffffffff1660e01b8152600401610bf593929190613995565b6020604051808303816000875af1158015610c14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c38919061391e565b90508073ffffffffffffffffffffffffffffffffffffffff1663f637731d836040518263ffffffff1660e01b8152600401610c7391906139db565b600060405180830381600087803b158015610c8d57600080fd5b505af1158015610ca1573d6000803e3d6000fd5b50505050600c819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610d1d868686610d1787610d89565b8b611e38565b600a879080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610dd9611ce2565b610de3600061202b565b565b6000610def6106a8565b14610df957600080fd5b610e05306009546120f1565b6000600a80549050600954610e1a9190613a25565b905060005b600a80549050811015610f055781610e356106a8565b10610ef257610ef160068281548110610e5157610e5061373e565b5b906000526020600020015460078381548110610e7057610e6f61373e565b5b906000526020600020015460088481548110610e8f57610e8e61373e565b5b9060005260206000200154600a80549050600954610ead9190613a25565b600a8681548110610ec157610ec061373e565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611e38565b5b8080610efd90613a56565b915050610e1f565b5050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610f42906136aa565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6e906136aa565b8015610fbb5780601f10610f9057610100808354040283529160200191610fbb565b820191906000526020600020905b815481529060010190602001808311610f9e57829003601f168201915b5050505050905090565b600080610fd061180f565b90506000610fde82866116c5565b905083811015611023576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101a90613b10565b60405180910390fd5b6110308286868403611817565b60019250505092915050565b60008061104761180f565b9050611054818585611a6c565b600191505092915050565b600c818154811061106f57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6110a6611ce2565b600030905060005b8251811015611264578173ffffffffffffffffffffffffffffffffffffffff168382815181106110e1576110e061373e565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff160361113f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113690613b7c565b60405180910390fd5b60008382815181106111545761115361373e565b5b602002602001015190508073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb338373ffffffffffffffffffffffffffffffffffffffff166370a08231876040518263ffffffff1660e01b81526004016111b49190613276565b602060405180830381865afa1580156111d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f59190613782565b6040518363ffffffff1660e01b81526004016112129291906137af565b6020604051808303816000875af1158015611231573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112559190613804565b508180600101925050506110ae565b50600047905060008111156112bb57600061127d610f09565b905060008173ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050905050505b505050565b42600e5410611304576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fb90613be8565b60405180910390fd5b600d5442611312919061370a565b600e81905550611320611d60565b60005b600a80549050811015611594576000600a82815481106113465761134561373e565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016113ae9190613276565b602060405180830381865afa1580156113cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ef9190613782565b90506000811115611585578173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb336032846114249190613a25565b6040518363ffffffff1660e01b81526004016114419291906137af565b6020604051808303816000875af1158015611460573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114849190613804565b508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6114a9610f09565b8473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016114e29190613276565b602060405180830381865afa1580156114ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115239190613782565b6040518363ffffffff1660e01b81526004016115409291906137af565b6020604051808303816000875af115801561155f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115839190613804565b505b82806001019350505050611323565b506000479050603281111561163457600033905060008173ffffffffffffffffffffffffffffffffffffffff166108fc6032856115d19190613a25565b9081150290604051600060405180830381858888f19350505050905060006115f7610f09565b90508073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505091505050505b50565b6060600a8054806020026020016040519081016040528092919081815260200182805480156116bb57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611671575b5050505050905090565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60005b81518110156117885761177b82828151811061176e5761176d61373e565b5b6020026020010151612247565b808060010191505061174f565b5050565b611794611ce2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611803576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fa90613c7a565b60405180910390fd5b61180c8161202b565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611886576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187d90613d0c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036118f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ec90613d9e565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516119d39190612fd4565b60405180910390a3505050565b60006119ec84846116c5565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611a665781811015611a58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4f90613e0a565b60405180910390fd5b611a658484848403611817565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611adb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad290613e9c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4190613f2e565b60405180910390fd5b611b558383836123bf565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611bdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd290613fc0565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611cc99190612fd4565b60405180910390a3611cdc8484846123c4565b50505050565b611cea61180f565b73ffffffffffffffffffffffffffffffffffffffff16611d08610f09565b73ffffffffffffffffffffffffffffffffffffffff1614611d5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d559061402c565b60405180910390fd5b565b60005b600b80549050811015611da457611d97600b8281548110611d8757611d8661373e565b5b9060005260206000200154612247565b8080600101915050611d63565b50565b6000806000611dfd86611dba5784611dbc565b855b8715611dc85785611dca565b865b7801000000000000000000000000000000000000000000000000611dee9190613a25565b611df8919061404c565b6123c9565b9050611e0881612423565b915060c882611e17919061409b565b82611e2291906140cc565b9150611e2d826127ec565b925050935093915050565b600030905060008173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16109050600d5442611e7e919061370a565b600e819055506000611e93826009548a611da7565b9150506000611ea5836009548a611da7565b9150506000611eb7846009548a611da7565b91505060006064886014611ecb919061404c565b611ed59190613a25565b9050600b611f1888888889611eea5788611ef8565b60c889611ef791906140cc565b5b8a15611f045789611f12565b60c88a611f119190614127565b5b87612c01565b9080600181540180825580915050600190039060005260206000200160009091909190915055600b611f8b88888889611f5d5760c889611f589190614127565b611f5f565b875b8a15611f775760c88a611f7291906140cc565b611f79565b885b876003611f86919061404c565b612c01565b9080600181540180825580915050600190039060005260206000200160009091909190915055600b611ff888888889611fc45787611fc6565b865b8a15611fd25788611fd4565b875b611fdd8d610d89565b8811611fe95787611ff3565b611ff28d610d89565b5b612c01565b90806001815401808255809150506001900390600052602060002001600090919091909150555050505050505050505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612160576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612157906141ce565b60405180910390fd5b61216c600083836123bf565b806002600082825461217e919061370a565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161222f9190612fd4565b60405180910390a3612243600083836123c4565b5050565b60007368b3465833fb72a70ecdf485e0e4c7bd8665fc4573ffffffffffffffffffffffffffffffffffffffff1663791b98bc6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122cc919061391e565b905060006fffffffffffffffffffffffffffffffff90508173ffffffffffffffffffffffffffffffffffffffff1663fc6f786560405180608001604052808681526020013073ffffffffffffffffffffffffffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff168152506040518263ffffffff1660e01b8152600401612376919061426e565b60408051808303816000875af1158015612394573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123b89190614289565b5050505050565b505050565b505050565b600080600260018401816123e0576123df6139f6565b5b0490508291505b8181101561241d57809150600281828581612405576124046139f6565b5b040181612415576124146139f6565b5b0490506123e7565b50919050565b60006401000276a373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16101580156124a5575073fffd8963efd1fc6a506488495d951d5263988d2673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16105b6124e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124db90614315565b60405180910390fd5b600060208373ffffffffffffffffffffffffffffffffffffffff16901b9050600081905060006fffffffffffffffffffffffffffffffff821160071b808217915082811c92505067ffffffffffffffff821160061b808217915082811c92505063ffffffff821160051b808217915082811c92505061ffff821160041b808217915082811c92505060ff821160031b808217915082811c925050600f821160021b808217915082811c9250506003821160011b808217915082811c92505060018211808217915050608081106125c257607f810383901c91506125cc565b80607f0383901b91505b6000604060808303901b9050828302607f1c92508260801c80603f1b8217915083811c935050828302607f1c92508260801c80603e1b8217915083811c935050828302607f1c92508260801c80603d1b8217915083811c935050828302607f1c92508260801c80603c1b8217915083811c935050828302607f1c92508260801c80603b1b8217915083811c935050828302607f1c92508260801c80603a1b8217915083811c935050828302607f1c92508260801c8060391b8217915083811c935050828302607f1c92508260801c8060381b8217915083811c935050828302607f1c92508260801c8060371b8217915083811c935050828302607f1c92508260801c8060361b8217915083811c935050828302607f1c92508260801c8060351b8217915083811c935050828302607f1c92508260801c8060341b8217915083811c935050828302607f1c92508260801c8060331b8217915083811c935050828302607f1c92508260801c8060321b82179150506000693627a301d71055774c8582029050600060806f028f6481ab7f045a5af012a19d003aaa8303901d9050600060806fdb2df09e81959a81455e260799a0632f8401901d90508060020b8260020b146127dc578873ffffffffffffffffffffffffffffffffffffffff166127b3826127ec565b73ffffffffffffffffffffffffffffffffffffffff1611156127d557816127d7565b805b6127de565b815b975050505050505050919050565b60008060008360020b12612803578260020b61280b565b8260020b6000035b90507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2761860000360020b811115612876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286d90614381565b60405180910390fd5b6000806001831603612899577001000000000000000000000000000000006128ab565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff169050600060028316146128e55760806ffff97272373d413259a46990580e213a8202901c90505b6000600483161461290a5760806ffff2e50f5f656932ef12357cf3c7fdcc8202901c90505b6000600883161461292f5760806fffe5caca7e10e4e61c3624eaa0941cd08202901c90505b600060108316146129545760806fffcb9843d60f6159c9db58835c9266448202901c90505b600060208316146129795760806fff973b41fa98c081472e6896dfb254c08202901c90505b6000604083161461299e5760806fff2ea16466c96a3843ec78b326b528618202901c90505b600060808316146129c35760806ffe5dee046a99a2a811c461f1969c30538202901c90505b60006101008316146129e95760806ffcbe86c7900a88aedcffc83b479aa3a48202901c90505b6000610200831614612a0f5760806ff987a7253ac413176f2b074cf7815e548202901c90505b6000610400831614612a355760806ff3392b0822b70005940c7a398e4b70f38202901c90505b6000610800831614612a5b5760806fe7159475a2c29b7443b29c7fa6e889d98202901c90505b6000611000831614612a815760806fd097f3bdfd2022b8845ad8f792aa58258202901c90505b6000612000831614612aa75760806fa9f746462d870fdf8a65dc1f90e061e58202901c90505b6000614000831614612acd5760806f70d869a156d2a1b890bb3df62baf32f78202901c90505b6000618000831614612af35760806f31be135f97d08fd981231505542fcfa68202901c90505b600062010000831614612b1a5760806f09aa508b5b7a84e1c677de54f3e99bc98202901c90505b600062020000831614612b405760806e5d6af8dedb81196699c329225ee6048202901c90505b600062040000831614612b655760806d2216e584f5fa1ea926041bedfe988202901c90505b600062080000831614612b885760806b048a170391f7dc42444e8fa28202901c90505b60008460020b1315612bc857807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81612bc457612bc36139f6565b5b0490505b60006401000000008281612bdf57612bde6139f6565b5b0614612bec576001612bef565b60005b60ff16602082901c0192505050919050565b6000807368b3465833fb72a70ecdf485e0e4c7bd8665fc4573ffffffffffffffffffffffffffffffffffffffff1663791b98bc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c87919061391e565b9050612c94878285611817565b8073ffffffffffffffffffffffffffffffffffffffff16638831645660405180610160016040528089612cc7578a612cc9565b8b5b73ffffffffffffffffffffffffffffffffffffffff1681526020018915612cf0578a612cf2565b8b5b73ffffffffffffffffffffffffffffffffffffffff16815260200161271062ffffff1681526020018860020b81526020018760020b815260200189612d375786612d3a565b60005b81526020018915612d4b5786612d4e565b60005b815260200160008152602001600081526020018a73ffffffffffffffffffffffffffffffffffffffff168152602001428152506040518263ffffffff1660e01b8152600401612d9d91906144a0565b6080604051808303816000875af1158015612dbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612de091906144e8565b90915090505080925050509695505050505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e2f578082015181840152602081019050612e14565b60008484015250505050565b6000601f19601f8301169050919050565b6000612e5782612df5565b612e618185612e00565b9350612e71818560208601612e11565b612e7a81612e3b565b840191505092915050565b60006020820190508181036000830152612e9f8184612e4c565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612ee682612ebb565b9050919050565b612ef681612edb565b8114612f0157600080fd5b50565b600081359050612f1381612eed565b92915050565b6000819050919050565b612f2c81612f19565b8114612f3757600080fd5b50565b600081359050612f4981612f23565b92915050565b60008060408385031215612f6657612f65612eb1565b5b6000612f7485828601612f04565b9250506020612f8585828601612f3a565b9150509250929050565b60008115159050919050565b612fa481612f8f565b82525050565b6000602082019050612fbf6000830184612f9b565b92915050565b612fce81612f19565b82525050565b6000602082019050612fe96000830184612fc5565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61302481612f19565b82525050565b6000613036838361301b565b60208301905092915050565b6000602082019050919050565b600061305a82612fef565b6130648185612ffa565b935061306f8361300b565b8060005b838110156130a0578151613087888261302a565b975061309283613042565b925050600181019050613073565b5085935050505092915050565b600060208201905081810360008301526130c7818461304f565b905092915050565b6000806000606084860312156130e8576130e7612eb1565b5b60006130f686828701612f04565b935050602061310786828701612f04565b925050604061311886828701612f3a565b9150509250925092565b600060ff82169050919050565b61313881613122565b82525050565b6000602082019050613153600083018461312f565b92915050565b6000819050919050565b600061317e61317961317484612ebb565b613159565b612ebb565b9050919050565b600061319082613163565b9050919050565b60006131a282613185565b9050919050565b6131b281613197565b82525050565b60006020820190506131cd60008301846131a9565b92915050565b6000602082840312156131e9576131e8612eb1565b5b60006131f784828501612f04565b91505092915050565b6000806000806080858703121561321a57613219612eb1565b5b600061322887828801612f04565b945050602061323987828801612f3a565b935050604061324a87828801612f3a565b925050606061325b87828801612f3a565b91505092959194509250565b61327081612edb565b82525050565b600060208201905061328b6000830184613267565b92915050565b6000602082840312156132a7576132a6612eb1565b5b60006132b584828501612f3a565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6132fb82612e3b565b810181811067ffffffffffffffff8211171561331a576133196132c3565b5b80604052505050565b600061332d612ea7565b905061333982826132f2565b919050565b600067ffffffffffffffff821115613359576133586132c3565b5b602082029050602081019050919050565b600080fd5b600061338261337d8461333e565b613323565b905080838252602082019050602084028301858111156133a5576133a461336a565b5b835b818110156133ce57806133ba8882612f04565b8452602084019350506020810190506133a7565b5050509392505050565b600082601f8301126133ed576133ec6132be565b5b81356133fd84826020860161336f565b91505092915050565b60006020828403121561341c5761341b612eb1565b5b600082013567ffffffffffffffff81111561343a57613439612eb6565b5b613446848285016133d8565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61348481612edb565b82525050565b6000613496838361347b565b60208301905092915050565b6000602082019050919050565b60006134ba8261344f565b6134c4818561345a565b93506134cf8361346b565b8060005b838110156135005781516134e7888261348a565b97506134f2836134a2565b9250506001810190506134d3565b5085935050505092915050565b6000602082019050818103600083015261352781846134af565b905092915050565b6000806040838503121561354657613545612eb1565b5b600061355485828601612f04565b925050602061356585828601612f04565b9150509250929050565b600067ffffffffffffffff82111561358a576135896132c3565b5b602082029050602081019050919050565b60006135ae6135a98461356f565b613323565b905080838252602082019050602084028301858111156135d1576135d061336a565b5b835b818110156135fa57806135e68882612f3a565b8452602084019350506020810190506135d3565b5050509392505050565b600082601f830112613619576136186132be565b5b813561362984826020860161359b565b91505092915050565b60006020828403121561364857613647612eb1565b5b600082013567ffffffffffffffff81111561366657613665612eb6565b5b61367284828501613604565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806136c257607f821691505b6020821081036136d5576136d461367b565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061371582612f19565b915061372083612f19565b9250828201905080821115613738576137376136db565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008151905061377c81612f23565b92915050565b60006020828403121561379857613797612eb1565b5b60006137a68482850161376d565b91505092915050565b60006040820190506137c46000830185613267565b6137d16020830184612fc5565b9392505050565b6137e181612f8f565b81146137ec57600080fd5b50565b6000815190506137fe816137d8565b92915050565b60006020828403121561381a57613819612eb1565b5b6000613828848285016137ef565b91505092915050565b7f466978204d430000000000000000000000000000000000000000000000000000600082015250565b6000613867600683612e00565b915061387282613831565b602082019050919050565b600060208201905081810360008301526138968161385a565b9050919050565b7f546f6b656e20416c726561647920557365640000000000000000000000000000600082015250565b60006138d3601283612e00565b91506138de8261389d565b602082019050919050565b60006020820190508181036000830152613902816138c6565b9050919050565b60008151905061391881612eed565b92915050565b60006020828403121561393457613933612eb1565b5b600061394284828501613909565b91505092915050565b6000819050919050565b600062ffffff82169050919050565b600061397f61397a6139758461394b565b613159565b613955565b9050919050565b61398f81613964565b82525050565b60006060820190506139aa6000830186613267565b6139b76020830185613267565b6139c46040830184613986565b949350505050565b6139d581612ebb565b82525050565b60006020820190506139f060008301846139cc565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613a3082612f19565b9150613a3b83612f19565b925082613a4b57613a4a6139f6565b5b828204905092915050565b6000613a6182612f19565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613a9357613a926136db565b5b600182019050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000613afa602583612e00565b9150613b0582613a9e565b604082019050919050565b60006020820190508181036000830152613b2981613aed565b9050919050565b7f43616e6e6f7420776974686472617720636f6e747261637420746f6b656e0000600082015250565b6000613b66601e83612e00565b9150613b7182613b30565b602082019050919050565b60006020820190508181036000830152613b9581613b59565b9050919050565b7f4e6f7420656e6f7567682074696d652068617320706173736564000000000000600082015250565b6000613bd2601a83612e00565b9150613bdd82613b9c565b602082019050919050565b60006020820190508181036000830152613c0181613bc5565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613c64602683612e00565b9150613c6f82613c08565b604082019050919050565b60006020820190508181036000830152613c9381613c57565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613cf6602483612e00565b9150613d0182613c9a565b604082019050919050565b60006020820190508181036000830152613d2581613ce9565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d88602283612e00565b9150613d9382613d2c565b604082019050919050565b60006020820190508181036000830152613db781613d7b565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000613df4601d83612e00565b9150613dff82613dbe565b602082019050919050565b60006020820190508181036000830152613e2381613de7565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000613e86602583612e00565b9150613e9182613e2a565b604082019050919050565b60006020820190508181036000830152613eb581613e79565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000613f18602383612e00565b9150613f2382613ebc565b604082019050919050565b60006020820190508181036000830152613f4781613f0b565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000613faa602683612e00565b9150613fb582613f4e565b604082019050919050565b60006020820190508181036000830152613fd981613f9d565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614016602083612e00565b915061402182613fe0565b602082019050919050565b6000602082019050818103600083015261404581614009565b9050919050565b600061405782612f19565b915061406283612f19565b925082820261407081612f19565b91508282048414831517614087576140866136db565b5b5092915050565b60008160020b9050919050565b60006140a68261408e565b91506140b18361408e565b9250826140c1576140c06139f6565b5b828207905092915050565b60006140d78261408e565b91506140e28361408e565b92508282039050627fffff81137fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80000082121715614121576141206136db565b5b92915050565b60006141328261408e565b915061413d8361408e565b925082820190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000008112627fffff8213171561417c5761417b6136db565b5b92915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006141b8601f83612e00565b91506141c382614182565b602082019050919050565b600060208201905081810360008301526141e7816141ab565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b614213816141ee565b82525050565b60808201600082015161422f600085018261301b565b506020820151614242602085018261347b565b506040820151614255604085018261420a565b506060820151614268606085018261420a565b50505050565b60006080820190506142836000830184614219565b92915050565b600080604083850312156142a05761429f612eb1565b5b60006142ae8582860161376d565b92505060206142bf8582860161376d565b9150509250929050565b7f5200000000000000000000000000000000000000000000000000000000000000600082015250565b60006142ff600183612e00565b915061430a826142c9565b602082019050919050565b6000602082019050818103600083015261432e816142f2565b9050919050565b7f5400000000000000000000000000000000000000000000000000000000000000600082015250565b600061436b600183612e00565b915061437682614335565b602082019050919050565b6000602082019050818103600083015261439a8161435e565b9050919050565b6143aa81613955565b82525050565b6143b98161408e565b82525050565b610160820160008201516143d6600085018261347b565b5060208201516143e9602085018261347b565b5060408201516143fc60408501826143a1565b50606082015161440f60608501826143b0565b50608082015161442260808501826143b0565b5060a082015161443560a085018261301b565b5060c082015161444860c085018261301b565b5060e082015161445b60e085018261301b565b5061010082015161447061010085018261301b565b5061012082015161448561012085018261347b565b5061014082015161449a61014085018261301b565b50505050565b6000610160820190506144b660008301846143bf565b92915050565b6144c5816141ee565b81146144d057600080fd5b50565b6000815190506144e2816144bc565b92915050565b6000806000806080858703121561450257614501612eb1565b5b60006145108782880161376d565b9450506020614521878288016144d3565b93505060406145328782880161376d565b92505060606145438782880161376d565b9150509295919450925056fea26469706673582212208cd8227c5c7b195c942aff31d57a25a99b9d84e0d51d385d5374d88d479e525964736f6c63430008120033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000813f3978f894098440000000000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000d8d726b7177a80000000000000000000000000000000000000000000000000121e4dbab336ee8000000000000000000000000000000000000000000000000e299b1f48c3159e80000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000021e19e0c9bab240000000000000000000000000000000000000000000000000044f0bacd9cb7a480000000000000000000000000000000000000000000000028a1de992260c9be80000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000d3c21bcecceda10000000000000000000000000000000000000000000000000069f3e5d2accce6480000000000000000000000000000000000000000000000109a01c24dc1d44ce800000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca0000000000000000000000003d3d35bb9bec23b06ca00fe472b50e7a4c692c30

-----Decoded View---------------
Arg [0] : _initialMCs (uint256[]): 250000000000000000000,5347600000000000000000,1070090000000000000000000
Arg [1] : _midMCs (uint256[]): 10000000000000000000000,20347600000000000000000,3070090000000000000000000
Arg [2] : _upperMCs (uint256[]): 1000000000000000000000000,500347600000000000000000,20070090000000000000000000
Arg [3] : _tokenSupply (uint256): 2500000000000000000000000000
Arg [4] : _pairedTokens (address[]): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2,0x514910771AF9Ca656af840dff83E8264EcF986CA,0x3D3D35bb9bEC23b06Ca00fe472b50E7A4c692C30

-----Encoded View---------------
21 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [2] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [3] : 00000000000000000000000000000000000000000813f3978f89409844000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000220
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [6] : 00000000000000000000000000000000000000000000000d8d726b7177a80000
Arg [7] : 000000000000000000000000000000000000000000000121e4dbab336ee80000
Arg [8] : 00000000000000000000000000000000000000000000e299b1f48c3159e80000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [10] : 00000000000000000000000000000000000000000000021e19e0c9bab2400000
Arg [11] : 00000000000000000000000000000000000000000000044f0bacd9cb7a480000
Arg [12] : 000000000000000000000000000000000000000000028a1de992260c9be80000
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [14] : 00000000000000000000000000000000000000000000d3c21bcecceda1000000
Arg [15] : 0000000000000000000000000000000000000000000069f3e5d2accce6480000
Arg [16] : 000000000000000000000000000000000000000000109a01c24dc1d44ce80000
Arg [17] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [18] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [19] : 000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca
Arg [20] : 0000000000000000000000003d3d35bb9bec23b06ca00fe472b50e7a4c692c30


Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.