ETH Price: $3,023.44 (+2.16%)
Gas: 2 Gwei

Token

Binary Assets EXchange (BAEX)
 

Overview

Max Total Supply

458,653.51300272 BAEX

Holders

248 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 8 Decimals)

Balance
395.69574 BAEX

Value
$0.00
0xbD6423070ebfCde221Ca987178A172B2D7b6A856
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Liquidity token of the binary options platform baex.com.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
BAEX

Compiler Version
v0.6.11+commit.5ef660b1

Optimization Enabled:
Yes with 1400000 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 2 of 5: BAEX.sol
pragma solidity 0.6.11; // 5ef660b1
/**
 * @title BAEX - Binary Assets EXchange DeFi token v.2.0.1 (© 2020 - baex.com)
 *
 * The source code of the BAEX token, which provides liquidity for the open binary options platform https://baex.com
 * 
 * THIS SOURCE CODE CONFIRMS THE "NEVER FALL" MATHEMATICAL MODEL USED IN THE BAEX TOKEN.
 * 
 * 9 facts about the BAEX token:
 * 
 * 1) Locked on the BAEX smart-contract, stable coins (USDT,DAI) is always collateral of the tokens value and can be transferred
 *  from it only when the user burns his BAEX tokens.
 * 
 * 2) The total supply of BAEX increases only when stable coins(USDT,DAI) hold on the BAEX smart-contract
 * 	and decreases when the BAEX holder burns his tokens to get USDT.
 * 
 * 3) Any BAEX tokens holder at any time can burn them and receive a part of the stable coins held
 * 	on BAEX smart-contract based on the formula tokens_to_burn * current_burn_price - (5% burning_fee).
 * 
 * 4) current_burn_price is calculated by the formula (amount_of_holded_usdt_and_dai / total_supply) * 0.9
 * 
 * 5) Based on the facts above, the value of the BAEX tokens remaining after the burning increases every time
 * 	someone burns their BAEX tokens and receives USDT for them.
 * 
 * 6) BAEX tokens issuance price calculated as (amount_of_holded_usdt_and_dai / total_supply) + (amount_of_holded_usdt_and_dai / total_supply) * 14%
 *  that previously purchased BAEX tokens are always increased in their price.
 * 
 * 7) BAEX token holders can participate as liquidity providers or traders on the baex.com hence, any withdrawal of
 *  profit will increase the value of previously purchased BAEX tokens.
 * 
 * 8) There is a referral program, running on the blockchain, in the BAEX token that allows you to receive up to 80% of the system's 
 *  commissions as a reward, you can find out more details and get your referral link at https://baex.com/#referral
 *
 * 9) There is an integrated automatic bonus pool distribution system in the BAEX token https://baex.com/#bonus
 * 
 * Read more about all the possible ways of earning and using the BAEX token on https://baex.com/#token
 */

/* Abstract contracts */

/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
import "Uniswap.sol";
import "SafeMath.sol";
import "SafeERC20.sol";

/**
 * @title ERC20 interface with allowance
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
abstract contract ERC20 {
    uint public _totalSupply;
    uint public decimals;
    function totalSupply() public view virtual returns (uint);
    function balanceOf(address who) public view virtual returns (uint);
    function transfer(address to, uint value) virtual public returns (bool);
    function allowance(address owner, address spender) public view virtual returns (uint);
    function transferFrom(address from, address to, uint value) virtual public returns (bool);
    function approve(address spender, uint value) virtual public returns (bool);
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);
}

/**
 * @title Implementation of the basic standard ERC20 token.
 * @dev ERC20 with allowance
 */
abstract contract StandardToken is ERC20 {
    using SafeMath for uint;
    mapping(address => uint) public balances;
    mapping (address => mapping (address => uint)) public allowed;
    
    /**
    * @dev Fix for the ERC20 short address attack.
    */
    function totalSupply() public view override virtual returns (uint) {
        return _totalSupply;
    }

    /**
    * @dev transfer token for a specified address
    * @param _to The address to transfer to.
    * @param _value The amount to be transferred.
    */
    function transfer(address _to, uint _value) override virtual public returns (bool) {
        require( balances[msg.sender] >= _value, "Not enough amount on the source address");
        balances[msg.sender] = balances[msg.sender].sub(_value);
        balances[_to] = balances[_to].add(_value);
        emit Transfer(msg.sender, _to, _value);
        return true;
    }

    /**
    * @dev Get the balance of the specified address.
    * @param _owner The address to query the balance of.
    * @return balance An uint representing the amount owned by the passed address.
    */
    function balanceOf(address _owner) view override public returns (uint balance) {
        return balances[_owner];
    }

    /**
    * @dev Transfer tokens from one address to another
    * @param _from address The address which you want to send tokens from
    * @param _to address The address which you want to transfer to
    * @param _value uint the amount of tokens to be transferred
    */
    function transferFrom(address _from, address _to, uint _value) override virtual public returns (bool) {
        uint _allowance = allowed[_from][msg.sender];
        if (_from != msg.sender && _allowance != uint(-1)) {
            require(_allowance>=_value,"Not enough allowed amount");
            allowed[_from][msg.sender] = _allowance.sub(_value);
        }
        require( balances[_from] >= _value, "Not enough amount on the source address");
        balances[_from] = balances[_from].sub(_value);
        balances[_to] = balances[_to].add(_value);
        emit Transfer(_from, _to, _value);
        return true;
    }

    /**
    * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
    * @param _spender The address which will spend the funds.
    * @param _value The amount of tokens to be spent.
    */
    function approve(address _spender, uint _value) override public returns(bool) {
        allowed[msg.sender][_spender] = _value;
        emit Approval(msg.sender, _spender, _value);
        return true;
    }

    /**
    * @dev Function to check the amount of tokens than an owner allowed to a spender.
    * @param _owner address The address which owns the funds.
    * @param _spender address The address which will spend the funds.
    * @return remaining A uint specifying the amount of tokens still available for the spender.
    */
    function allowance(address _owner, address _spender) override public view returns (uint remaining) {
        return allowed[_owner][_spender];
    }

}

/**
 * @title OptionsContract
 * @dev Abstract contract of BAEX options
 */
interface OptionsContract {
    function onTransferTokens(address _from, address _to, uint256 _value) external returns (bool);
}

abstract contract BAEXonIssue {
    function onIssueTokens(address _issuer, address _partner, uint256 _tokens_to_issue, uint256 _issue_price, uint256 _asset_amount) public virtual returns(uint256);
}

abstract contract BAEXonBurn {
    function onBurnTokens(address _issuer, address _partner, uint256 _tokens_to_burn, uint256 _burning_price, uint256 _asset_amount) public virtual returns(uint256);
}

abstract contract abstractBAEXAssetsBalancer {
    function autoBalancing() public virtual returns(bool);
}
/* END of: Abstract contracts */


abstract contract LinkedToStableCoins {
    using SafeERC20 for IERC20;
    // Fixed point math factor is 10^8
    uint256 constant public fmkd = 8;
    uint256 constant public fmk = 10**fmkd;
    uint256 constant internal _decimals = 8;
    address constant internal super_owner = 0x2B2fD898888Fa3A97c7560B5ebEeA959E1Ca161A;
    address internal owner;
    
    address public usdtContract;
	address public daiContract;
	
	function balanceOfOtherERC20( address _token ) internal view returns (uint256) {
	    if ( _token == address(0x0) ) return 0;
		return tokenAmountToFixedAmount( _token, IERC20(_token).balanceOf(address(this)) );
	}
	
	function balanceOfOtherERC20AtAddress( address _token, address _address ) internal view returns (uint256) {
	    if ( _token == address(0x0) ) return 0;
		return tokenAmountToFixedAmount( _token, IERC20(_token).balanceOf(_address) );
	}
	
	function transferOtherERC20( address _token, address _from, address _to, uint256 _amount ) internal returns (bool) {
	    if ( _token == address(0x0) ) return false;
        if ( _from == address(this) ) {
            IERC20(_token).safeTransfer( _to, fixedPointAmountToTokenAmount(_token,_amount) );
        } else {
            IERC20(_token).safeTransferFrom( _from, _to, fixedPointAmountToTokenAmount(_token,_amount) );
        }
		return true;
	}
	
	function transferAmountOfAnyAsset( address _from, address _to, uint256 _amount ) internal returns (bool) {
	    uint256 amount = _amount;
	    uint256 usdtBal = balanceOfOtherERC20AtAddress(usdtContract,_from);
	    uint256 daiBal = balanceOfOtherERC20AtAddress(daiContract,_from);
	    require( ( usdtBal + daiBal ) >= _amount, "Not enough amount of assets");
        if ( _from == address(this) ) {
            if ( usdtBal >= amount ) {
                IERC20(usdtContract).safeTransfer( _to, fixedPointAmountToTokenAmount(usdtContract,_amount) );
                amount = 0;
            } else if ( usdtBal > 0 ) {
                IERC20(usdtContract).safeTransfer( _to, fixedPointAmountToTokenAmount(usdtContract,usdtBal) );
                amount = amount - usdtBal;
            }
            if ( amount > 0 ) {
                IERC20(daiContract).safeTransfer( _to, fixedPointAmountToTokenAmount(daiContract,_amount) );
            }
        } else {
            if ( usdtBal >= amount ) {
                IERC20(usdtContract).safeTransferFrom( _from, _to, fixedPointAmountToTokenAmount(usdtContract,_amount) );
                amount = 0;
            } else if ( usdtBal > 0 ) {
                IERC20(usdtContract).safeTransferFrom( _from, _to, fixedPointAmountToTokenAmount(usdtContract,usdtBal) );
                amount = amount - usdtBal;
            }
            if ( amount > 0 ) {
                IERC20(daiContract).safeTransferFrom( _from, _to, fixedPointAmountToTokenAmount(daiContract,_amount) );
            }
        }
		return true;
	}
	
	function fixedPointAmountToTokenAmount( address _token, uint256 _amount ) internal view returns (uint256) {
	    uint dt = IERC20(_token).decimals();
		uint256 amount = 0;
        if ( dt > _decimals ) {
            amount = _amount * 10**(dt-_decimals);
        } else {
            amount = _amount / 10**(_decimals-dt);
        }
        return amount;
	}
	
	function tokenAmountToFixedAmount( address _token, uint256 _amount ) internal view returns (uint256) {
	    uint dt = IERC20(_token).decimals();
		uint256 amount = 0;
        if ( dt > _decimals ) {
            amount = _amount / 10**(dt-_decimals);
        } else {
            amount = _amount * 10**(_decimals-dt);
        }
        return amount;
	}
	
	function collateral() public view returns (uint256) {
	    if ( usdtContract == daiContract ) {
	        return balanceOfOtherERC20(usdtContract);
	    } else {
	        return balanceOfOtherERC20(usdtContract) + balanceOfOtherERC20(daiContract);
	    }
	}
	
	function setUSDTContract(address _usdtContract) public onlyOwner {
		usdtContract = _usdtContract;
	}
	
	function setDAIContract(address _daiContract) public onlyOwner {
		daiContract = _daiContract;
	}
	
	function transferOwnership(address newOwner) public onlyOwner {
		require(newOwner != address(0));
		emit OwnershipTransferred(owner, newOwner);
		owner = newOwner;
	}
	
	modifier onlyOwner() {
		require( (msg.sender == owner) || (msg.sender == super_owner), "You don't have permissions to call it" );
		_;
	}
	
	event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
}

/**
 * @title BAEX
 * @dev BAEX token contract
 */
contract BAEX is LinkedToStableCoins, StandardToken {
    // Burn price ratio is 0.9
    uint256 constant burn_ratio = 9 * fmk / 10;
    // Burning fee is 5%
    uint256 constant burn_fee = 5 * fmk / 100;
    // Issuing price increase ratio vs locked_amount/supply is 14 %
    uint256 public issue_increase_ratio = 14 * fmk / 100;
    
	string public name;
	string public symbol;
	
	uint256 public issue_price;
	uint256 public burn_price;
	
	// Counters of transactions
	uint256 public issue_counter;
	uint256 public burn_counter;
	
	// Issued & burned volumes
	uint256 public issued_volume;
	uint256 public burned_volume;
	
    // Links to other smart-contracts
	mapping (address => bool) optionsContracts;
	address referralProgramContract;
	address bonusProgramContract;
	address uniswapRouter;
	
	// Contract for assets balancing
    address assetsBalancer;	
	
    /**
    * @dev constructor, initialization of starting values
    */
	constructor() public {
		name = "Binary Assets EXchange";
		symbol = "BAEX";
		decimals = _decimals;
		
		owner = msg.sender;		

		// Initial Supply of BAEX is ZERO
		_totalSupply = 0;
		balances[address(this)] = _totalSupply;
		
		// Initial issue price of BAEX is 1 USDT or DAI per 1.0 BAEX
		issue_price = 1 * fmk;
		
		// USDT token contract address
		usdtContract = 0xdAC17F958D2ee523a2206206994597C13D831ec7;
		// DAI token contract address
		daiContract = 0x6B175474E89094C44Da98b954EedeAC495271d0F;
		// Uniswap V2 Router
		uniswapRouter = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;		
	}
	
	function issuePrice() public view returns (uint256) {
		return issue_price;
	}
	
	function burnPrice() public view returns (uint256) {
		return burn_price;
	}

	/**
    * @dev ERC20 transfer with burning of BAEX when it will be sent to the BAEX smart-contract
    * @dev and with the placing liquidity to the binary options when tokens will be sent to the BAEXOptions contracts.
    */
	function transfer(address _to, uint256 _value) public override returns (bool) {
	    require(_to != address(0),"Destination address can't be empty");
	    require(_value > 0,"Value for transfer should be more than zero");
	    return transferFrom( msg.sender, _to, _value);
	}
	
    /**
    * @dev ERC20 transferFrom with burning of BAEX when it will be sent to the BAEX smart-contract
    * @dev and with the placing liquidity to the binary options when tokens will be sent to the BAEXOptions contracts.
	*/
	function transferFrom(address _from, address _to, uint256 _value) public override returns (bool) {
	    require(_to != address(0),"Destination address can't be empty");
	    require(_value > 0,"Value for transfer should be more than zero");
	    bool res = false;
	    if ( _from == msg.sender ) {
	        res = super.transfer(_to, _value);
	    } else {
	        res = super.transferFrom(_from, _to, _value);
	    }
		if ( res ) {
		    if ( _to == address(this) ) {
                burnBAEX( _from, _value );
    		} else if ( optionsContracts[_to] ) {
                OptionsContract(_to).onTransferTokens( _from, _to, _value );
    		}
    		return true;
		}
		return false;
	}
	
    /**
    * @dev This helper function is used by BAEXOptions smart-contracts to operate with the liquidity pool of options.
	*/
	function transferOptions(address _from, address _to, uint256 _value, bool _burn_to_assets) public onlyOptions returns (bool) {
	    require(_to != address(0),"Destination address can't be empty");
		require(_value <= balances[_from], "Not enough balance to transfer");

		if (_burn_to_assets) {
		    balances[_from] = balances[_from].sub(_value);
		    balances[address(this)] = balances[address(this)].add(_value);
		    emit Transfer( _from, _to, _value );
		    emit Transfer( _to, address(this), _value );
		    return burnBAEX( _to, _value );
		} else {
		    balances[_from] = balances[_from].sub(_value);
		    balances[_to] = balances[_to].add(_value);
		    emit Transfer( _from, _to, _value );
		}
		return true;
	}
	
	/**
    * @dev Recalc issuing and burning prices
	*/
    function recalcPrices() private {
        issue_price = collateral() * fmk / _totalSupply;
	    burn_price = issue_price * burn_ratio / fmk;
	    issue_price = issue_price + issue_price * issue_increase_ratio / fmk;
    }
	
    /**
    * @dev Issue the BAEX tokens, recalc prices and hold ERC20 USDT or DAI on the smart-contract.
	*/
	function issueBAEXvsKnownAsset( address _token_contract, address _to_address, uint256 _asset_amount, address _partner, bool _need_transfer ) private returns (uint256) {
	    uint256 tokens_to_issue;
	    tokens_to_issue = tokenAmountToFixedAmount( _token_contract, _asset_amount ) * fmk / issue_price;
	    if ( _need_transfer ) {
	        require( IERC20(_token_contract).allowance(_to_address,address(this)) >= _asset_amount, "issueBAEXbyERC20: Not enough allowance" );
	        uint256 asset_balance_before = IERC20(_token_contract).balanceOf(address(this));
	        IERC20(_token_contract).safeTransferFrom(_to_address,address(this),_asset_amount);
	        require( IERC20(_token_contract).balanceOf(address(this)) == (asset_balance_before+_asset_amount), "issueBAEXbyERC20: Error in transfering" );
	    }
	    if (address(referralProgramContract) != address(0) && _partner != address(0)) {
            BAEXonIssue(referralProgramContract).onIssueTokens( _to_address, _partner, tokens_to_issue, issue_price, tokenAmountToFixedAmount(_token_contract,_asset_amount) );
	    }
        // Increase the total supply
	    _totalSupply = _totalSupply.add( tokens_to_issue );
	    balances[_to_address] = balances[_to_address].add( tokens_to_issue );
	    if ( address(bonusProgramContract) != address(0) ) {
	        uint256 to_bonus_amount = BAEXonIssue(bonusProgramContract).onIssueTokens( _to_address, _partner, tokens_to_issue, issue_price, tokenAmountToFixedAmount(_token_contract,_asset_amount) );
	        if (to_bonus_amount > 0) {
	            if ( ( _token_contract == usdtContract ) || ( balanceOfOtherERC20(usdtContract) >= to_bonus_amount ) ) {
	                transferOtherERC20( usdtContract, address(this), bonusProgramContract, to_bonus_amount );
	            } else {
	                transferOtherERC20( daiContract, address(this), bonusProgramContract, to_bonus_amount );
	            }
	        }
	    }
	    if (  address(assetsBalancer) != address(0) && ( _asset_amount - (_asset_amount/1000)*1000) == 777 ) {
            abstractBAEXAssetsBalancer( assetsBalancer ).autoBalancing();
        }
	    // Recalculate issuing & burning prices after tokens issue
	    recalcPrices();
	    //---------------------------------
	    emit Transfer(address(0x0), address(this), tokens_to_issue);
	    emit Transfer(address(this), _to_address, tokens_to_issue);
	    issue_counter++;
	    issued_volume = issued_volume + tokens_to_issue;
	    log3(bytes20(address(this)),bytes8("ISSUE"),bytes32(_totalSupply),bytes32( (issue_price<<128) | burn_price ));
	    return tokens_to_issue;	    
	}
	
	function issueBAEXvsERC20( address _erc20_contract, uint256 _max_slippage, uint256 _deadline, uint256 _erc20_asset_amount, address _partner) public returns (uint256){
	    require( _deadline == 0 || block.timestamp <= _deadline, "issueBAEXbyERC20: reverted because time is over" );
	    // Before issuing from USDT or DAI contracts you need to call approve(BAEX_CONTRACT_ADDRESS, AMOUNT) from your wallet
	    if ( _erc20_contract == usdtContract || _erc20_contract == daiContract ) {
	        return issueBAEXvsKnownAsset( _erc20_contract, msg.sender, _erc20_asset_amount, _partner, true );
	    }
	    // Default slippage of swap thru Uniswap is 2%
	    if ( _max_slippage == 0 ) _max_slippage = 20;
	    IERC20(_erc20_contract).safeTransferFrom(msg.sender,address(this),_erc20_asset_amount);
	    IERC20(_erc20_contract).safeIncreaseAllowance(uniswapRouter,_erc20_asset_amount);
	    address[] memory path;
	    if ( _erc20_contract == IUniswapV2Router02(uniswapRouter).WETH() ) {
	        // Direct swap WETH -> DAI if _erc20_contract is WETH contract
	        path = new address[](2);
	        path[0] = IUniswapV2Router02(uniswapRouter).WETH();
            path[1] = daiContract;
	    } else {
	        // Using path ERC20 -> WETH -> DAI because most of liquidity in pairs with ETH
	        // and resulted amount of DAI tokens will be greater than in direct pair
	        path = new address[](3);
	        path[0] = _erc20_contract;
            path[1] = IUniswapV2Router02(uniswapRouter).WETH();
            path[2] = daiContract;
	    }
        uint[] memory amounts = IUniswapV2Router02(uniswapRouter).getAmountsOut(_erc20_asset_amount,path);
        uint256 out_min_amount = amounts[path.length-1] * _max_slippage / 1000;
        amounts = IUniswapV2Router02(uniswapRouter).swapExactTokensForTokens(_erc20_asset_amount, out_min_amount, path, address(this), block.timestamp);
        return issueBAEXvsKnownAsset( daiContract, msg.sender, amounts[path.length-1], _partner, false );
	}
	
	/**
    * @dev Burn the BAEX tokens when someone sends BAEX to the BAEX token smart-contract.
	*/
	function burnBAEXtoERC20private(address _erc20_contract, address _from_address, uint256 _tokens_to_burn) private returns (bool){
	    require( _totalSupply >= _tokens_to_burn, "Not enough supply to burn");
	    require( _tokens_to_burn >= 1000, "Minimum amount of BAEX to burn is 0.00001 BAEX" );
	    uint256 contract_balance = collateral();
	    uint256 assets_to_send = _tokens_to_burn * burn_price / fmk;
	    require( ( contract_balance + 10000 ) >= assets_to_send, "Not enough collateral on the contract to burn tokens" );
	    if ( assets_to_send > contract_balance ) {
	        assets_to_send = contract_balance;
	    }
	    uint256 fees_of_burn = assets_to_send * burn_fee / fmk;
	    // Decrease the total supply
	    _totalSupply = _totalSupply.sub(_tokens_to_burn);
	    uint256 usdt_to_send = assets_to_send-fees_of_burn;
	    uint256 usdtBal = balanceOfOtherERC20( usdtContract );
	    if ( _erc20_contract == usdtContract || _erc20_contract == daiContract ) {
	        if ( usdtBal >= usdt_to_send ) {
    	        transferOtherERC20( usdtContract, address(this), _from_address, usdt_to_send );
    	        usdt_to_send = 0;
    	    } else if ( usdtBal  >= 0 ) {
                transferOtherERC20( usdtContract, address(this), _from_address, usdtBal );
    	        usdt_to_send = usdt_to_send - usdtBal;
    	    }
    	    if ( usdt_to_send > 0 ) {
    	        transferOtherERC20( daiContract, address(this), _from_address, usdt_to_send );
    	    }
	    } else {
	        require( usdtBal >= usdt_to_send, "Not enough USDT on the BAEX contract, need to call balancing of the assets or burn to USDT,DAI");
	        usdt_to_send = fixedPointAmountToTokenAmount(usdtContract,usdt_to_send);
	        address[] memory path;
	        if ( IUniswapV2Router02(uniswapRouter).WETH() == _erc20_contract ) {
	            path = new address[](2);
                path[0] = usdtContract;
                path[1] = IUniswapV2Router02(uniswapRouter).WETH();
	        } else {
        	    path = new address[](3);
                path[0] = usdtContract;
                path[1] = IUniswapV2Router02(uniswapRouter).WETH();
                path[2] = _erc20_contract;
	        }
	        IERC20(usdtContract).safeIncreaseAllowance(uniswapRouter,usdt_to_send);
            uint[] memory amounts = IUniswapV2Router02(uniswapRouter).getAmountsOut(usdt_to_send, path);
            IUniswapV2Router02(uniswapRouter).swapExactTokensForTokens(usdt_to_send, amounts[amounts.length-1] * 98/100, path, _from_address, block.timestamp);
	    }
	    transferOtherERC20( daiContract, address(this), owner, fees_of_burn );
	    contract_balance = contract_balance.sub( assets_to_send );
	    balances[address(this)] = balances[address(this)].sub( _tokens_to_burn );
	    if ( _totalSupply == 0 ) {
	        // When all tokens were burned 🙂 it's unreal, but we are good coders
	        burn_price = 0;
	        if ( balanceOfOtherERC20( usdtContract ) > 0 ) {
	            IERC20(usdtContract).safeTransfer( owner, balanceOfOtherERC20( usdtContract ) );
	        }
	        if ( balanceOfOtherERC20( daiContract ) > 0 ) {
	            IERC20(daiContract).safeTransfer( owner, balanceOfOtherERC20( daiContract ) );
	        }
	    } else {
	        // Recalculate issuing & burning prices after the burning
	        recalcPrices();
	    }
	    emit Transfer(address(this), address(0x0), _tokens_to_burn);
	    burn_counter++;
	    burned_volume = burned_volume + _tokens_to_burn;
	    log3(bytes20(address(this)),bytes4("BURN"),bytes32(_totalSupply),bytes32( (issue_price<<128) | burn_price ));
	    return true;
	}
	
	function burnBAEX(address _from_address, uint256 _tokens_to_burn) private returns (bool){
	    return burnBAEXtoERC20private(usdtContract, _from_address, _tokens_to_burn);
	}
	
	function burnBAEXtoERC20(address _erc20_contract, uint256 _tokens_to_burn) public returns (bool){
	    require(balances[msg.sender] >= _tokens_to_burn, "Not enough BAEX balance to burn");
	    balances[msg.sender] = balances[msg.sender].sub(_tokens_to_burn);
		balances[address(this)] = balances[address(this)].add(_tokens_to_burn);
		emit Transfer( msg.sender, address(this), _tokens_to_burn );
	    return burnBAEXtoERC20private(_erc20_contract, msg.sender, _tokens_to_burn);
	}
	
    receive() external payable  {
        msg.sender.transfer(msg.value);
	}
	
	modifier onlyOptions() {
	    require( optionsContracts[msg.sender], "Only options contracts can call it" );
		_;
	}
	
	function setOptionsContract(address _optionsContract, bool _enabled) public onlyOwner() {
		optionsContracts[_optionsContract] = _enabled;
	}
	
	function setReferralProgramContract(address _referralProgramContract) public onlyOwner() {
		referralProgramContract = _referralProgramContract;
	}
	
	function setBonusContract(address _bonusProgramContract) public onlyOwner() {
		bonusProgramContract = _bonusProgramContract;
	}
	
	function setAssetsBalancer(address _assetsBalancer) public onlyOwner() {
		assetsBalancer = _assetsBalancer;
		// Allow to balancer contract make swap between assets
		if ( IERC20(usdtContract).allowance(address(this),assetsBalancer) == 0 ) {
		    IERC20(usdtContract).safeIncreaseAllowance(assetsBalancer,uint(-1));
		}
		if ( IERC20(daiContract).allowance(address(this),assetsBalancer) == 0 ) {
		    IERC20(daiContract).safeIncreaseAllowance(assetsBalancer,uint(-1));
		}
	}
	
	function setUniswapRouter(address _uniswapRouter) public onlyOwner() {
	    uniswapRouter = _uniswapRouter;
	}
}
// SPDX-License-Identifier: UNLICENSED

File 1 of 5: Address.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.2 <0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.3._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.3._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 3 of 5: SafeERC20.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;

import "Uniswap.sol";
import "SafeMath.sol";
import "Address.sol";

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

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

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

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

File 4 of 5: SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

File 5 of 5: Uniswap.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.6.11;
// Factory 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f
// Router 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D

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

    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);
}

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"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":"_totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"remaining","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_erc20_contract","type":"address"},{"internalType":"uint256","name":"_tokens_to_burn","type":"uint256"}],"name":"burnBAEXtoERC20","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burn_counter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burn_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burned_volume","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collateral","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"daiContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fmk","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fmkd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_erc20_contract","type":"address"},{"internalType":"uint256","name":"_max_slippage","type":"uint256"},{"internalType":"uint256","name":"_deadline","type":"uint256"},{"internalType":"uint256","name":"_erc20_asset_amount","type":"uint256"},{"internalType":"address","name":"_partner","type":"address"}],"name":"issueBAEXvsERC20","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"issuePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"issue_counter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"issue_increase_ratio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"issue_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"issued_volume","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_assetsBalancer","type":"address"}],"name":"setAssetsBalancer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_bonusProgramContract","type":"address"}],"name":"setBonusContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_daiContract","type":"address"}],"name":"setDAIContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_optionsContract","type":"address"},{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setOptionsContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_referralProgramContract","type":"address"}],"name":"setReferralProgramContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_usdtContract","type":"address"}],"name":"setUSDTContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_uniswapRouter","type":"address"}],"name":"setUniswapRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"bool","name":"_burn_to_assets","type":"bool"}],"name":"transferOptions","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":[],"name":"usdtContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405262d59f806007553480156200001857600080fd5b506040805180820190915260168082527f42696e617279204173736574732045586368616e67650000000000000000000060209092019182526200005f9160089162000125565b5060408051808201909152600480825263084828ab60e31b60209092019182526200008d9160099162000125565b506008600455600080546001600160a01b0319908116331782556003829055308252600560205260408220919091556305f5e100600a5560018054821673dac17f958d2ee523a2206206994597c13d831ec7179055600280548216736b175474e89094c44da98b954eedeac495271d0f17905560138054909116737a250d5630b4cf539739df2c5dacb4c659f2488d179055620001ca565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200016857805160ff191683800117855562000198565b8280016001018555821562000198579182015b82811115620001985782518255916020019190600101906200017b565b50620001a6929150620001aa565b5090565b620001c791905b80821115620001a65760008155600101620001b1565b90565b6149ff80620001da6000396000f3fe60806040526004361061026e5760003560e01c80637697421c11610153578063bea9849e116100cb578063dd62ed3e1161007f578063e2166c6411610064578063e2166c641461092a578063eaac40f31461096a578063f2fde38b146109aa576102a2565b8063dd62ed3e146108a2578063dfedd814146108ea576102a2565b8063cb1a8015116100b0578063cb1a801514610832578063d8dfeb4514610878578063db4563d31461088d576102a2565b8063bea9849e146107dd578063c701b7741461081d576102a2565b806395d89b4111610122578063ab6167a911610107578063ab6167a914610757578063b48713a8146107b3578063bde6a5a9146107c8576102a2565b806395d89b41146106fc578063a9059cbb14610711576102a2565b80637697421c1461060f5780637be1e945146106675780637d1b0acd146106a7578063805034fd146106e7576102a2565b8063313ce567116101e65780635c2c2005116101b5578063611509231161019a57806361150923146105a5578063632807df146105ba57806370a08231146105cf576102a2565b80635c2c2005146105485780635c6581651461055d576102a2565b8063313ce567146104bf578063321f6832146104d457806339996f6a1461051e5780633eaaf86b14610533576102a2565b80631f03ef771161023d57806327e235e31161022257806327e235e31461042c578063280d8fe51461046c5780632ce8b91314610481576102a2565b80631f03ef77146103c757806323b872dd146103dc576102a2565b806306fdde03146102a7578063081e444e14610331578063095ea7b31461035857806318160ddd146103b2576102a2565b366102a25760405133903480156108fc02916000818181858888f1935050505015801561029f573d6000803e3d6000fd5b50005b600080fd5b3480156102b357600080fd5b506102bc6109ea565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102f65781810151838201526020016102de565b50505050905090810190601f1680156103235780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561033d57600080fd5b50610346610a96565b60408051918252519081900360200190f35b34801561036457600080fd5b5061039e6004803603604081101561037b57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610a9c565b604080519115158252519081900360200190f35b3480156103be57600080fd5b50610346610b0f565b3480156103d357600080fd5b50610346610b16565b3480156103e857600080fd5b5061039e600480360360608110156103ff57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135610b1c565b34801561043857600080fd5b506103466004803603602081101561044f57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610d46565b34801561047857600080fd5b50610346610d58565b34801561048d57600080fd5b50610496610d5e565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156104cb57600080fd5b50610346610d7a565b3480156104e057600080fd5b5061051c600480360360408110156104f757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001351515610d80565b005b34801561052a57600080fd5b50610346610e64565b34801561053f57600080fd5b50610346610e6a565b34801561055457600080fd5b50610346610e70565b34801561056957600080fd5b506103466004803603604081101561058057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610e76565b3480156105b157600080fd5b50610496610e93565b3480156105c657600080fd5b50610346610eaf565b3480156105db57600080fd5b50610346600480360360208110156105f257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610eb5565b34801561061b57600080fd5b5061039e6004803603608081101561063257600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604081013590606001351515610ee1565b34801561067357600080fd5b5061051c6004803603602081101561068a57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611271565b3480156106b357600080fd5b5061051c600480360360208110156106ca57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611346565b3480156106f357600080fd5b5061034661141b565b34801561070857600080fd5b506102bc611420565b34801561071d57600080fd5b5061039e6004803603604081101561073457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611499565b34801561076357600080fd5b50610346600480360360a081101561077a57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080909101351661156b565b3480156107bf57600080fd5b50610346611daf565b3480156107d457600080fd5b50610346611db5565b3480156107e957600080fd5b5061051c6004803603602081101561080057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611dbb565b34801561082957600080fd5b50610346611e90565b34801561083e57600080fd5b5061039e6004803603604081101561085557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611e96565b34801561088457600080fd5b50610346611fb4565b34801561089957600080fd5b50610346612052565b3480156108ae57600080fd5b50610346600480360360408110156108c557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602001351661205a565b3480156108f657600080fd5b5061051c6004803603602081101561090d57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612092565b34801561093657600080fd5b5061051c6004803603602081101561094d57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612346565b34801561097657600080fd5b5061051c6004803603602081101561098d57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661241b565b3480156109b657600080fd5b5061051c600480360360208110156109cd57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166124f0565b6008805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529291830182828015610a8e5780601f10610a6357610100808354040283529160200191610a8e565b820191906000526020600020905b815481529060010190602001808311610a7157829003601f168201915b505050505081565b600f5481565b33600081815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b6003545b90565b600c5481565b600073ffffffffffffffffffffffffffffffffffffffff8316610b8a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806148d46022913960400191505060405180910390fd5b60008211610be3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180614946602b913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff8516331415610c1457610c0d848461262b565b9050610c22565b610c1f85858561275d565b90505b8015610d395773ffffffffffffffffffffffffffffffffffffffff8416301415610c5657610c5085846128f2565b50610d2f565b73ffffffffffffffffffffffffffffffffffffffff841660009081526010602052604090205460ff1615610d2f57604080517f87c3328900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301528616602482018190526044820186905291516387c33289916064808201926020929091908290030181600087803b158015610d0257600080fd5b505af1158015610d16573d6000803e3d6000fd5b505050506040513d6020811015610d2c57600080fd5b50505b6001915050610d3f565b60009150505b9392505050565b60056020526000908152604090205481565b600e5481565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b60045481565b60005473ffffffffffffffffffffffffffffffffffffffff16331480610db9575033732b2fd898888fa3a97c7560b5ebeea959e1ca161a145b610e0e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806149716025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260106020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b600a5481565b60035481565b600a5490565b600660209081526000928352604080842090915290825290205481565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b60075481565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600560205260409020545b919050565b3360009081526010602052604081205460ff16610f49576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806148b26022913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610fb5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806148d46022913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff851660009081526005602052604090205483111561104957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4e6f7420656e6f7567682062616c616e636520746f207472616e736665720000604482015290519081900360640190fd5b81156111885773ffffffffffffffffffffffffffffffffffffffff8516600090815260056020526040902054611085908463ffffffff61291916565b73ffffffffffffffffffffffffffffffffffffffff86166000908152600560205260408082209290925530815220546110c4908463ffffffff61295b16565b30600090815260056020908152604091829020929092558051858152905173ffffffffffffffffffffffffffffffffffffffff87811693908916927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a3604080518481529051309173ffffffffffffffffffffffffffffffffffffffff8716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a361118184846128f2565b9050611269565b73ffffffffffffffffffffffffffffffffffffffff85166000908152600560205260409020546111be908463ffffffff61291916565b73ffffffffffffffffffffffffffffffffffffffff8087166000908152600560205260408082209390935590861681522054611200908463ffffffff61295b16565b73ffffffffffffffffffffffffffffffffffffffff80861660008181526005602090815260409182902094909455805187815290519193928916927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a35b5060015b949350505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314806112aa575033732b2fd898888fa3a97c7560b5ebeea959e1ca161a145b6112ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806149716025913960400191505060405180910390fd5b601180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff1633148061137f575033732b2fd898888fa3a97c7560b5ebeea959e1ca161a145b6113d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806149716025913960400191505060405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600881565b6009805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529291830182828015610a8e5780601f10610a6357610100808354040283529160200191610a8e565b600073ffffffffffffffffffffffffffffffffffffffff8316611507576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806148d46022913960400191505060405180910390fd5b60008211611560576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180614946602b913960400191505060405180910390fd5b610d3f338484610b1c565b600083158061157a5750834211155b6115cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001806147aa602f913960400191505060405180910390fd5b60015473ffffffffffffffffffffffffffffffffffffffff87811691161480611612575060025473ffffffffffffffffffffffffffffffffffffffff8781169116145b1561162c576116258633858560016129cf565b9050611da6565b8461163657601494505b61165e73ffffffffffffffffffffffffffffffffffffffff871633308663ffffffff6131da16565b60135461168b9073ffffffffffffffffffffffffffffffffffffffff88811691168563ffffffff61327516565b601354604080517fad5c4648000000000000000000000000000000000000000000000000000000008152905160609273ffffffffffffffffffffffffffffffffffffffff169163ad5c4648916004808301926020929190829003018186803b1580156116f657600080fd5b505afa15801561170a573d6000803e3d6000fd5b505050506040513d602081101561172057600080fd5b505173ffffffffffffffffffffffffffffffffffffffff8881169116141561187c5760408051600280825260608201835290916020830190803683375050601354604080517fad5c4648000000000000000000000000000000000000000000000000000000008152905193945073ffffffffffffffffffffffffffffffffffffffff9091169263ad5c464892506004808301926020929190829003018186803b1580156117cc57600080fd5b505afa1580156117e0573d6000803e3d6000fd5b505050506040513d60208110156117f657600080fd5b50518151829060009061180557fe5b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201015260025482519116908290600190811061183d57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506119d2565b60408051600380825260808201909252906020820160608036833701905050905086816000815181106118ab57fe5b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201810191909152601354604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c4648926004808301939192829003018186803b15801561192557600080fd5b505afa158015611939573d6000803e3d6000fd5b505050506040513d602081101561194f57600080fd5b505181518290600190811061196057fe5b73ffffffffffffffffffffffffffffffffffffffff9283166020918202929092010152600280548351921691839190811061199757fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b601354604080517fd06ca61f000000000000000000000000000000000000000000000000000000008152600481018781526024820192835284516044830152845160609473ffffffffffffffffffffffffffffffffffffffff169363d06ca61f938a938893909291606401906020808601910280838360005b83811015611a63578181015183820152602001611a4b565b50505050905001935050505060006040518083038186803b158015611a8757600080fd5b505afa158015611a9b573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526020811015611ae257600080fd5b8101908080516040519392919084640100000000821115611b0257600080fd5b908301906020820185811115611b1757600080fd5b8251866020820283011164010000000082111715611b3457600080fd5b82525081516020918201928201910280838360005b83811015611b61578181015183820152602001611b49565b50505050905001604052505050905060006103e88883600186510381518110611b8657fe5b60200260200101510281611b9657fe5b6013546040517f38ed1739000000000000000000000000000000000000000000000000000000008152600481018a815293909204602483018190523060648401819052426084850181905260a060448601908152895160a4870152895193975073ffffffffffffffffffffffffffffffffffffffff909416956338ed1739958d9589958c9594939260c401906020808801910280838360005b83811015611c47578181015183820152602001611c2f565b505050509050019650505050505050600060405180830381600087803b158015611c7057600080fd5b505af1158015611c84573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526020811015611ccb57600080fd5b8101908080516040519392919084640100000000821115611ceb57600080fd5b908301906020820185811115611d0057600080fd5b8251866020820283011164010000000082111715611d1d57600080fd5b82525081516020918201928201910280838360005b83811015611d4a578181015183820152602001611d32565b505050509050016040525050509150611da0600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163384600187510381518110611d9057fe5b60200260200101518860006129cf565b93505050505b95945050505050565b600d5481565b600b5490565b60005473ffffffffffffffffffffffffffffffffffffffff16331480611df4575033732b2fd898888fa3a97c7560b5ebeea959e1ca161a145b611e49576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806149716025913960400191505060405180910390fd5b601380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600b5481565b33600090815260056020526040812054821115611f1457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4e6f7420656e6f75676820424145582062616c616e636520746f206275726e00604482015290519081900360640190fd5b33600090815260056020526040902054611f34908363ffffffff61291916565b33600090815260056020526040808220929092553081522054611f5d908363ffffffff61295b16565b306000818152600560209081526040918290209390935580518581529051919233927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a3610d3f8333846133bc565b60025460015460009173ffffffffffffffffffffffffffffffffffffffff9182169116141561200657600154611fff9073ffffffffffffffffffffffffffffffffffffffff1661406d565b9050610b13565b6002546120289073ffffffffffffffffffffffffffffffffffffffff1661406d565b60015461204a9073ffffffffffffffffffffffffffffffffffffffff1661406d565b019050610b13565b6305f5e10081565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260066020908152604080832093909416825291909152205490565b60005473ffffffffffffffffffffffffffffffffffffffff163314806120cb575033732b2fd898888fa3a97c7560b5ebeea959e1ca161a145b612120576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806149716025913960400191505060405180910390fd5b601480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8381169190911791829055600154604080517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015293831660248501525191169163dd62ed3e916044808301926020929190829003018186803b1580156121c757600080fd5b505afa1580156121db573d6000803e3d6000fd5b505050506040513d60208110156121f157600080fd5b5051612247576014546001546122479173ffffffffffffffffffffffffffffffffffffffff91821691167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63ffffffff61327516565b600254601454604080517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff92831660248201529051919092169163dd62ed3e916044808301926020929190829003018186803b1580156122c357600080fd5b505afa1580156122d7573d6000803e3d6000fd5b505050506040513d60208110156122ed57600080fd5b5051612343576014546002546123439173ffffffffffffffffffffffffffffffffffffffff91821691167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63ffffffff61327516565b50565b60005473ffffffffffffffffffffffffffffffffffffffff1633148061237f575033732b2fd898888fa3a97c7560b5ebeea959e1ca161a145b6123d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806149716025913960400191505060405180910390fd5b601280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff16331480612454575033732b2fd898888fa3a97c7560b5ebeea959e1ca161a145b6124a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806149716025913960400191505060405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff16331480612529575033732b2fd898888fa3a97c7560b5ebeea959e1ca161a145b61257e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806149716025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811661259e57600080fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b33600090815260056020526040812054821115612693576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061482d6027913960400191505060405180910390fd5b336000908152600560205260409020546126b3908363ffffffff61291916565b336000908152600560205260408082209290925573ffffffffffffffffffffffffffffffffffffffff8516815220546126f2908363ffffffff61295b16565b73ffffffffffffffffffffffffffffffffffffffff84166000818152600560209081526040918290209390935580518581529051919233927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a350600192915050565b73ffffffffffffffffffffffffffffffffffffffff831660008181526006602090815260408083203380855292528220549192148015906127be57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114155b15612874578281101561283257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4e6f7420656e6f75676820616c6c6f77656420616d6f756e7400000000000000604482015290519081900360640190fd5b612842818463ffffffff61291916565b73ffffffffffffffffffffffffffffffffffffffff861660009081526006602090815260408083203384529091529020555b73ffffffffffffffffffffffffffffffffffffffff8516600090815260056020526040902054831115611188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061482d6027913960400191505060405180910390fd5b600154600090610d3f9073ffffffffffffffffffffffffffffffffffffffff1684846133bc565b6000610d3f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061413b565b600082820183811015610d3f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600080600a546008600a0a6129e489886141ec565b02816129ec57fe5b0490508215612ca957604080517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152306024830152915187928a169163dd62ed3e916044808301926020929190829003018186803b158015612a6b57600080fd5b505afa158015612a7f573d6000803e3d6000fd5b505050506040513d6020811015612a9557600080fd5b50511015612aee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806148f66026913960400191505060405180910390fd5b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905160009173ffffffffffffffffffffffffffffffffffffffff8a16916370a0823191602480820192602092909190829003018186803b158015612b5e57600080fd5b505afa158015612b72573d6000803e3d6000fd5b505050506040513d6020811015612b8857600080fd5b50519050612bb473ffffffffffffffffffffffffffffffffffffffff891688308963ffffffff6131da16565b604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290518288019173ffffffffffffffffffffffffffffffffffffffff8b16916370a0823191602480820192602092909190829003018186803b158015612c2557600080fd5b505afa158015612c39573d6000803e3d6000fd5b505050506040513d6020811015612c4f57600080fd5b505114612ca7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806148076026913960400191505060405180910390fd5b505b60115473ffffffffffffffffffffffffffffffffffffffff1615801590612ce5575073ffffffffffffffffffffffffffffffffffffffff841615155b15612dd457601154600a5473ffffffffffffffffffffffffffffffffffffffff90911690636e92e9d290889087908590612d1f8d8c6141ec565b604080517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b16815273ffffffffffffffffffffffffffffffffffffffff9687166004820152949095166024850152604484019290925260648301526084820152905160a48083019260209291908290030181600087803b158015612da757600080fd5b505af1158015612dbb573d6000803e3d6000fd5b505050506040513d6020811015612dd157600080fd5b50505b600354612de7908263ffffffff61295b16565b60035573ffffffffffffffffffffffffffffffffffffffff8616600090815260056020526040902054612e20908263ffffffff61295b16565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600560205260409020919091556012541615612ff757601254600a5460009173ffffffffffffffffffffffffffffffffffffffff1690636e92e9d290899088908690612e898e8d6141ec565b604080517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b16815273ffffffffffffffffffffffffffffffffffffffff9687166004820152949095166024850152604484019290925260648301526084820152905160a48083019260209291908290030181600087803b158015612f1157600080fd5b505af1158015612f25573d6000803e3d6000fd5b505050506040513d6020811015612f3b57600080fd5b505190508015612ff55760015473ffffffffffffffffffffffffffffffffffffffff89811691161480612f9057506001548190612f8d9073ffffffffffffffffffffffffffffffffffffffff1661406d565b10155b15612fc757600154601254612fc19173ffffffffffffffffffffffffffffffffffffffff9081169130911684614299565b50612ff5565b600254601254612ff39173ffffffffffffffffffffffffffffffffffffffff9081169130911684614299565b505b505b60145473ffffffffffffffffffffffffffffffffffffffff161580159061302957506103e885046103e8028503610309145b156130c557601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd15a38d6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561309857600080fd5b505af11580156130ac573d6000803e3d6000fd5b505050506040513d60208110156130c257600080fd5b50505b6130cd614347565b60408051828152905130916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a360408051828152905173ffffffffffffffffffffffffffffffffffffffff88169130917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a3600c80546001019055600e805482019055600b54600a54600354604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b168152905160809390931b9093179290917f49535355450000000000000000000000000000000000000000000000000000009181900360200190a39695505050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff80861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905261326f908590614382565b50505050565b604080517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8481166024830152915160009261332c9285929188169163dd62ed3e91604480820192602092909190829003018186803b1580156132f457600080fd5b505afa158015613308573d6000803e3d6000fd5b505050506040513d602081101561331e57600080fd5b50519063ffffffff61295b16565b6040805173ffffffffffffffffffffffffffffffffffffffff8616602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b30000000000000000000000000000000000000000000000000000000017905290915061326f908590614382565b600081600354101561342f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4e6f7420656e6f75676820737570706c7920746f206275726e00000000000000604482015290519081900360640190fd5b6103e882101561348a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806147d9602e913960400191505060405180910390fd5b6000613494611fb4565b905060006008600a0a600b548502816134a957fe5b0490508082612710011015613509576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001806149966034913960400191505060405180910390fd5b818111156135145750805b6003546305f5e100624c4b4083020490613534908663ffffffff61291916565b600355600154818303906000906135609073ffffffffffffffffffffffffffffffffffffffff1661406d565b60015490915073ffffffffffffffffffffffffffffffffffffffff8a8116911614806135a6575060025473ffffffffffffffffffffffffffffffffffffffff8a81169116145b1561363f578181106135e1576001546135d79073ffffffffffffffffffffffffffffffffffffffff16308a85614299565b506000915061360d565b6001546136069073ffffffffffffffffffffffffffffffffffffffff16308a84614299565b5080820391505b811561363a576002546136389073ffffffffffffffffffffffffffffffffffffffff16308a85614299565b505b613e24565b81811015613698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252605e815260200180614854605e913960600191505060405180910390fd5b6001546136bb9073ffffffffffffffffffffffffffffffffffffffff168361445f565b915060608973ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561373e57600080fd5b505afa158015613752573d6000803e3d6000fd5b505050506040513d602081101561376857600080fd5b505173ffffffffffffffffffffffffffffffffffffffff1614156138c15760408051600280825260608201835290916020830190803683375050600154825192935073ffffffffffffffffffffffffffffffffffffffff16918391506000906137cd57fe5b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201810191909152601354604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c4648926004808301939192829003018186803b15801561384757600080fd5b505afa15801561385b573d6000803e3d6000fd5b505050506040513d602081101561387157600080fd5b505181518290600190811061388257fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613a41565b6040805160038082526080820190925290602082016060803683375050600154825192935073ffffffffffffffffffffffffffffffffffffffff169183915060009061390957fe5b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201810191909152601354604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c4648926004808301939192829003018186803b15801561398357600080fd5b505afa158015613997573d6000803e3d6000fd5b505050506040513d60208110156139ad57600080fd5b50518151829060019081106139be57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508981600281518110613a0657fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b601354600154613a719173ffffffffffffffffffffffffffffffffffffffff91821691168563ffffffff61327516565b601354604080517fd06ca61f000000000000000000000000000000000000000000000000000000008152600481018681526024820192835284516044830152845160609473ffffffffffffffffffffffffffffffffffffffff169363d06ca61f9389938893909291606401906020808601910280838360005b83811015613b02578181015183820152602001613aea565b50505050905001935050505060006040518083038186803b158015613b2657600080fd5b505afa158015613b3a573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526020811015613b8157600080fd5b8101908080516040519392919084640100000000821115613ba157600080fd5b908301906020820185811115613bb657600080fd5b8251866020820283011164010000000082111715613bd357600080fd5b82525081516020918201928201910280838360005b83811015613c00578181015183820152602001613be8565b50505050919091016040525050601354835193945073ffffffffffffffffffffffffffffffffffffffff16926338ed1739925087915060649085907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908110613c6757fe5b602002602001015160620281613c7957fe5b04858e426040518663ffffffff1660e01b815260040180868152602001858152602001806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015613d10578181015183820152602001613cf8565b505050509050019650505050505050600060405180830381600087803b158015613d3957600080fd5b505af1158015613d4d573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526020811015613d9457600080fd5b8101908080516040519392919084640100000000821115613db457600080fd5b908301906020820185811115613dc957600080fd5b8251866020820283011164010000000082111715613de657600080fd5b82525081516020918201928201910280838360005b83811015613e13578181015183820152602001613dfb565b505050509050016040525050505050505b600254600054613e509173ffffffffffffffffffffffffffffffffffffffff9081169130911686614299565b50613e61858563ffffffff61291916565b30600090815260056020526040902054909550613e84908863ffffffff61291916565b30600090815260056020526040902055600354613fa0576000600b819055600154613ec49073ffffffffffffffffffffffffffffffffffffffff1661406d565b1115613f1d57600054600154613f1d9173ffffffffffffffffffffffffffffffffffffffff90811691613ef7911661406d565b60015473ffffffffffffffffffffffffffffffffffffffff16919063ffffffff61452b16565b600254600090613f429073ffffffffffffffffffffffffffffffffffffffff1661406d565b1115613f9b57600054600254613f9b9173ffffffffffffffffffffffffffffffffffffffff90811691613f75911661406d565b60025473ffffffffffffffffffffffffffffffffffffffff16919063ffffffff61452b16565b613fa8565b613fa8614347565b60408051888152905160009130917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a3600d80546001019055600f805488019055600b54600a54600354604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b168152905160809390931b9093179290917f4255524e000000000000000000000000000000000000000000000000000000009181900360200190a350600198975050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff821661409257506000610edc565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905161413591849173ffffffffffffffffffffffffffffffffffffffff8316916370a08231916024808301926020929190829003018186803b15801561410457600080fd5b505afa158015614118573d6000803e3d6000fd5b505050506040513d602081101561412e57600080fd5b50516141ec565b92915050565b600081848411156141e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156141a9578181015183820152602001614191565b50505050905090810190601f1680156141d65780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000808373ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561423557600080fd5b505afa158015614249573d6000803e3d6000fd5b505050506040513d602081101561425f57600080fd5b505160ff169050600060088211156142885760088203600a0a848161428057fe5b049050611269565b50600803600a0a9190910292915050565b600073ffffffffffffffffffffffffffffffffffffffff85166142be57506000611269565b73ffffffffffffffffffffffffffffffffffffffff84163014156143135761430e836142ea878561445f565b73ffffffffffffffffffffffffffffffffffffffff8816919063ffffffff61452b16565b611265565b6112658484614322888661445f565b73ffffffffffffffffffffffffffffffffffffffff891692919063ffffffff6131da16565b6003546305f5e100614357611fb4565b028161435f57fe5b6305f5e10063055d4a8092909104918202819004600b5560075482020401600a55565b60606143e4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166145b89092919063ffffffff16565b80519091501561445a5780806020019051602081101561440357600080fd5b505161445a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061491c602a913960400191505060405180910390fd5b505050565b6000808373ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156144a857600080fd5b505afa1580156144bc573d6000803e3d6000fd5b505050506040513d60208110156144d257600080fd5b505160ff1690506000600882111561451257507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff88101600a0a8302611269565b81600803600a0a848161452157fe5b0495945050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261445a908490614382565b60606112698484600085856145cc85614723565b61463757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b602083106146a157805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101614664565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114614703576040519150601f19603f3d011682016040523d82523d6000602084013e614708565b606091505b5091509150614718828286614729565b979650505050505050565b3b151590565b60608315614738575081610d3f565b8251156147485782518084602001fd5b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528451602484015284518593919283926044019190850190808383600083156141a957818101518382015260200161419156fe697373756542414558627945524332303a20726576657274656420626563617573652074696d65206973206f7665724d696e696d756d20616d6f756e74206f66204241455820746f206275726e20697320302e30303030312042414558697373756542414558627945524332303a204572726f7220696e207472616e73666572696e674e6f7420656e6f75676820616d6f756e74206f6e2074686520736f7572636520616464726573734e6f7420656e6f7567682055534454206f6e20746865204241455820636f6e74726163742c206e65656420746f2063616c6c2062616c616e63696e67206f662074686520617373657473206f72206275726e20746f20555344542c4441494f6e6c79206f7074696f6e7320636f6e7472616374732063616e2063616c6c20697444657374696e6174696f6e20616464726573732063616e277420626520656d707479697373756542414558627945524332303a204e6f7420656e6f75676820616c6c6f77616e63655361666545524332303a204552433230206f7065726174696f6e20646964206e6f74207375636365656456616c756520666f72207472616e736665722073686f756c64206265206d6f7265207468616e207a65726f596f7520646f6e27742068617665207065726d697373696f6e7320746f2063616c6c2069744e6f7420656e6f75676820636f6c6c61746572616c206f6e2074686520636f6e747261637420746f206275726e20746f6b656e73a2646970667358221220d670d14cacb5dc427db754e8e5ba0e4cd2cece80b86dd8fba15acee44a9c6b8764736f6c634300060b0033

Deployed Bytecode

0x60806040526004361061026e5760003560e01c80637697421c11610153578063bea9849e116100cb578063dd62ed3e1161007f578063e2166c6411610064578063e2166c641461092a578063eaac40f31461096a578063f2fde38b146109aa576102a2565b8063dd62ed3e146108a2578063dfedd814146108ea576102a2565b8063cb1a8015116100b0578063cb1a801514610832578063d8dfeb4514610878578063db4563d31461088d576102a2565b8063bea9849e146107dd578063c701b7741461081d576102a2565b806395d89b4111610122578063ab6167a911610107578063ab6167a914610757578063b48713a8146107b3578063bde6a5a9146107c8576102a2565b806395d89b41146106fc578063a9059cbb14610711576102a2565b80637697421c1461060f5780637be1e945146106675780637d1b0acd146106a7578063805034fd146106e7576102a2565b8063313ce567116101e65780635c2c2005116101b5578063611509231161019a57806361150923146105a5578063632807df146105ba57806370a08231146105cf576102a2565b80635c2c2005146105485780635c6581651461055d576102a2565b8063313ce567146104bf578063321f6832146104d457806339996f6a1461051e5780633eaaf86b14610533576102a2565b80631f03ef771161023d57806327e235e31161022257806327e235e31461042c578063280d8fe51461046c5780632ce8b91314610481576102a2565b80631f03ef77146103c757806323b872dd146103dc576102a2565b806306fdde03146102a7578063081e444e14610331578063095ea7b31461035857806318160ddd146103b2576102a2565b366102a25760405133903480156108fc02916000818181858888f1935050505015801561029f573d6000803e3d6000fd5b50005b600080fd5b3480156102b357600080fd5b506102bc6109ea565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102f65781810151838201526020016102de565b50505050905090810190601f1680156103235780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561033d57600080fd5b50610346610a96565b60408051918252519081900360200190f35b34801561036457600080fd5b5061039e6004803603604081101561037b57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610a9c565b604080519115158252519081900360200190f35b3480156103be57600080fd5b50610346610b0f565b3480156103d357600080fd5b50610346610b16565b3480156103e857600080fd5b5061039e600480360360608110156103ff57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135610b1c565b34801561043857600080fd5b506103466004803603602081101561044f57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610d46565b34801561047857600080fd5b50610346610d58565b34801561048d57600080fd5b50610496610d5e565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156104cb57600080fd5b50610346610d7a565b3480156104e057600080fd5b5061051c600480360360408110156104f757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001351515610d80565b005b34801561052a57600080fd5b50610346610e64565b34801561053f57600080fd5b50610346610e6a565b34801561055457600080fd5b50610346610e70565b34801561056957600080fd5b506103466004803603604081101561058057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610e76565b3480156105b157600080fd5b50610496610e93565b3480156105c657600080fd5b50610346610eaf565b3480156105db57600080fd5b50610346600480360360208110156105f257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610eb5565b34801561061b57600080fd5b5061039e6004803603608081101561063257600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604081013590606001351515610ee1565b34801561067357600080fd5b5061051c6004803603602081101561068a57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611271565b3480156106b357600080fd5b5061051c600480360360208110156106ca57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611346565b3480156106f357600080fd5b5061034661141b565b34801561070857600080fd5b506102bc611420565b34801561071d57600080fd5b5061039e6004803603604081101561073457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611499565b34801561076357600080fd5b50610346600480360360a081101561077a57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080909101351661156b565b3480156107bf57600080fd5b50610346611daf565b3480156107d457600080fd5b50610346611db5565b3480156107e957600080fd5b5061051c6004803603602081101561080057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611dbb565b34801561082957600080fd5b50610346611e90565b34801561083e57600080fd5b5061039e6004803603604081101561085557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611e96565b34801561088457600080fd5b50610346611fb4565b34801561089957600080fd5b50610346612052565b3480156108ae57600080fd5b50610346600480360360408110156108c557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602001351661205a565b3480156108f657600080fd5b5061051c6004803603602081101561090d57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612092565b34801561093657600080fd5b5061051c6004803603602081101561094d57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612346565b34801561097657600080fd5b5061051c6004803603602081101561098d57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661241b565b3480156109b657600080fd5b5061051c600480360360208110156109cd57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166124f0565b6008805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529291830182828015610a8e5780601f10610a6357610100808354040283529160200191610a8e565b820191906000526020600020905b815481529060010190602001808311610a7157829003601f168201915b505050505081565b600f5481565b33600081815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b6003545b90565b600c5481565b600073ffffffffffffffffffffffffffffffffffffffff8316610b8a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806148d46022913960400191505060405180910390fd5b60008211610be3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180614946602b913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff8516331415610c1457610c0d848461262b565b9050610c22565b610c1f85858561275d565b90505b8015610d395773ffffffffffffffffffffffffffffffffffffffff8416301415610c5657610c5085846128f2565b50610d2f565b73ffffffffffffffffffffffffffffffffffffffff841660009081526010602052604090205460ff1615610d2f57604080517f87c3328900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301528616602482018190526044820186905291516387c33289916064808201926020929091908290030181600087803b158015610d0257600080fd5b505af1158015610d16573d6000803e3d6000fd5b505050506040513d6020811015610d2c57600080fd5b50505b6001915050610d3f565b60009150505b9392505050565b60056020526000908152604090205481565b600e5481565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b60045481565b60005473ffffffffffffffffffffffffffffffffffffffff16331480610db9575033732b2fd898888fa3a97c7560b5ebeea959e1ca161a145b610e0e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806149716025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260106020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b600a5481565b60035481565b600a5490565b600660209081526000928352604080842090915290825290205481565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b60075481565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600560205260409020545b919050565b3360009081526010602052604081205460ff16610f49576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806148b26022913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610fb5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806148d46022913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff851660009081526005602052604090205483111561104957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4e6f7420656e6f7567682062616c616e636520746f207472616e736665720000604482015290519081900360640190fd5b81156111885773ffffffffffffffffffffffffffffffffffffffff8516600090815260056020526040902054611085908463ffffffff61291916565b73ffffffffffffffffffffffffffffffffffffffff86166000908152600560205260408082209290925530815220546110c4908463ffffffff61295b16565b30600090815260056020908152604091829020929092558051858152905173ffffffffffffffffffffffffffffffffffffffff87811693908916927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a3604080518481529051309173ffffffffffffffffffffffffffffffffffffffff8716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a361118184846128f2565b9050611269565b73ffffffffffffffffffffffffffffffffffffffff85166000908152600560205260409020546111be908463ffffffff61291916565b73ffffffffffffffffffffffffffffffffffffffff8087166000908152600560205260408082209390935590861681522054611200908463ffffffff61295b16565b73ffffffffffffffffffffffffffffffffffffffff80861660008181526005602090815260409182902094909455805187815290519193928916927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a35b5060015b949350505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314806112aa575033732b2fd898888fa3a97c7560b5ebeea959e1ca161a145b6112ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806149716025913960400191505060405180910390fd5b601180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff1633148061137f575033732b2fd898888fa3a97c7560b5ebeea959e1ca161a145b6113d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806149716025913960400191505060405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600881565b6009805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529291830182828015610a8e5780601f10610a6357610100808354040283529160200191610a8e565b600073ffffffffffffffffffffffffffffffffffffffff8316611507576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806148d46022913960400191505060405180910390fd5b60008211611560576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180614946602b913960400191505060405180910390fd5b610d3f338484610b1c565b600083158061157a5750834211155b6115cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001806147aa602f913960400191505060405180910390fd5b60015473ffffffffffffffffffffffffffffffffffffffff87811691161480611612575060025473ffffffffffffffffffffffffffffffffffffffff8781169116145b1561162c576116258633858560016129cf565b9050611da6565b8461163657601494505b61165e73ffffffffffffffffffffffffffffffffffffffff871633308663ffffffff6131da16565b60135461168b9073ffffffffffffffffffffffffffffffffffffffff88811691168563ffffffff61327516565b601354604080517fad5c4648000000000000000000000000000000000000000000000000000000008152905160609273ffffffffffffffffffffffffffffffffffffffff169163ad5c4648916004808301926020929190829003018186803b1580156116f657600080fd5b505afa15801561170a573d6000803e3d6000fd5b505050506040513d602081101561172057600080fd5b505173ffffffffffffffffffffffffffffffffffffffff8881169116141561187c5760408051600280825260608201835290916020830190803683375050601354604080517fad5c4648000000000000000000000000000000000000000000000000000000008152905193945073ffffffffffffffffffffffffffffffffffffffff9091169263ad5c464892506004808301926020929190829003018186803b1580156117cc57600080fd5b505afa1580156117e0573d6000803e3d6000fd5b505050506040513d60208110156117f657600080fd5b50518151829060009061180557fe5b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201015260025482519116908290600190811061183d57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506119d2565b60408051600380825260808201909252906020820160608036833701905050905086816000815181106118ab57fe5b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201810191909152601354604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c4648926004808301939192829003018186803b15801561192557600080fd5b505afa158015611939573d6000803e3d6000fd5b505050506040513d602081101561194f57600080fd5b505181518290600190811061196057fe5b73ffffffffffffffffffffffffffffffffffffffff9283166020918202929092010152600280548351921691839190811061199757fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b601354604080517fd06ca61f000000000000000000000000000000000000000000000000000000008152600481018781526024820192835284516044830152845160609473ffffffffffffffffffffffffffffffffffffffff169363d06ca61f938a938893909291606401906020808601910280838360005b83811015611a63578181015183820152602001611a4b565b50505050905001935050505060006040518083038186803b158015611a8757600080fd5b505afa158015611a9b573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526020811015611ae257600080fd5b8101908080516040519392919084640100000000821115611b0257600080fd5b908301906020820185811115611b1757600080fd5b8251866020820283011164010000000082111715611b3457600080fd5b82525081516020918201928201910280838360005b83811015611b61578181015183820152602001611b49565b50505050905001604052505050905060006103e88883600186510381518110611b8657fe5b60200260200101510281611b9657fe5b6013546040517f38ed1739000000000000000000000000000000000000000000000000000000008152600481018a815293909204602483018190523060648401819052426084850181905260a060448601908152895160a4870152895193975073ffffffffffffffffffffffffffffffffffffffff909416956338ed1739958d9589958c9594939260c401906020808801910280838360005b83811015611c47578181015183820152602001611c2f565b505050509050019650505050505050600060405180830381600087803b158015611c7057600080fd5b505af1158015611c84573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526020811015611ccb57600080fd5b8101908080516040519392919084640100000000821115611ceb57600080fd5b908301906020820185811115611d0057600080fd5b8251866020820283011164010000000082111715611d1d57600080fd5b82525081516020918201928201910280838360005b83811015611d4a578181015183820152602001611d32565b505050509050016040525050509150611da0600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163384600187510381518110611d9057fe5b60200260200101518860006129cf565b93505050505b95945050505050565b600d5481565b600b5490565b60005473ffffffffffffffffffffffffffffffffffffffff16331480611df4575033732b2fd898888fa3a97c7560b5ebeea959e1ca161a145b611e49576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806149716025913960400191505060405180910390fd5b601380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600b5481565b33600090815260056020526040812054821115611f1457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4e6f7420656e6f75676820424145582062616c616e636520746f206275726e00604482015290519081900360640190fd5b33600090815260056020526040902054611f34908363ffffffff61291916565b33600090815260056020526040808220929092553081522054611f5d908363ffffffff61295b16565b306000818152600560209081526040918290209390935580518581529051919233927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a3610d3f8333846133bc565b60025460015460009173ffffffffffffffffffffffffffffffffffffffff9182169116141561200657600154611fff9073ffffffffffffffffffffffffffffffffffffffff1661406d565b9050610b13565b6002546120289073ffffffffffffffffffffffffffffffffffffffff1661406d565b60015461204a9073ffffffffffffffffffffffffffffffffffffffff1661406d565b019050610b13565b6305f5e10081565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260066020908152604080832093909416825291909152205490565b60005473ffffffffffffffffffffffffffffffffffffffff163314806120cb575033732b2fd898888fa3a97c7560b5ebeea959e1ca161a145b612120576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806149716025913960400191505060405180910390fd5b601480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8381169190911791829055600154604080517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015293831660248501525191169163dd62ed3e916044808301926020929190829003018186803b1580156121c757600080fd5b505afa1580156121db573d6000803e3d6000fd5b505050506040513d60208110156121f157600080fd5b5051612247576014546001546122479173ffffffffffffffffffffffffffffffffffffffff91821691167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63ffffffff61327516565b600254601454604080517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff92831660248201529051919092169163dd62ed3e916044808301926020929190829003018186803b1580156122c357600080fd5b505afa1580156122d7573d6000803e3d6000fd5b505050506040513d60208110156122ed57600080fd5b5051612343576014546002546123439173ffffffffffffffffffffffffffffffffffffffff91821691167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63ffffffff61327516565b50565b60005473ffffffffffffffffffffffffffffffffffffffff1633148061237f575033732b2fd898888fa3a97c7560b5ebeea959e1ca161a145b6123d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806149716025913960400191505060405180910390fd5b601280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff16331480612454575033732b2fd898888fa3a97c7560b5ebeea959e1ca161a145b6124a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806149716025913960400191505060405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff16331480612529575033732b2fd898888fa3a97c7560b5ebeea959e1ca161a145b61257e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806149716025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811661259e57600080fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b33600090815260056020526040812054821115612693576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061482d6027913960400191505060405180910390fd5b336000908152600560205260409020546126b3908363ffffffff61291916565b336000908152600560205260408082209290925573ffffffffffffffffffffffffffffffffffffffff8516815220546126f2908363ffffffff61295b16565b73ffffffffffffffffffffffffffffffffffffffff84166000818152600560209081526040918290209390935580518581529051919233927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a350600192915050565b73ffffffffffffffffffffffffffffffffffffffff831660008181526006602090815260408083203380855292528220549192148015906127be57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114155b15612874578281101561283257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4e6f7420656e6f75676820616c6c6f77656420616d6f756e7400000000000000604482015290519081900360640190fd5b612842818463ffffffff61291916565b73ffffffffffffffffffffffffffffffffffffffff861660009081526006602090815260408083203384529091529020555b73ffffffffffffffffffffffffffffffffffffffff8516600090815260056020526040902054831115611188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061482d6027913960400191505060405180910390fd5b600154600090610d3f9073ffffffffffffffffffffffffffffffffffffffff1684846133bc565b6000610d3f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061413b565b600082820183811015610d3f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600080600a546008600a0a6129e489886141ec565b02816129ec57fe5b0490508215612ca957604080517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152306024830152915187928a169163dd62ed3e916044808301926020929190829003018186803b158015612a6b57600080fd5b505afa158015612a7f573d6000803e3d6000fd5b505050506040513d6020811015612a9557600080fd5b50511015612aee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806148f66026913960400191505060405180910390fd5b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905160009173ffffffffffffffffffffffffffffffffffffffff8a16916370a0823191602480820192602092909190829003018186803b158015612b5e57600080fd5b505afa158015612b72573d6000803e3d6000fd5b505050506040513d6020811015612b8857600080fd5b50519050612bb473ffffffffffffffffffffffffffffffffffffffff891688308963ffffffff6131da16565b604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290518288019173ffffffffffffffffffffffffffffffffffffffff8b16916370a0823191602480820192602092909190829003018186803b158015612c2557600080fd5b505afa158015612c39573d6000803e3d6000fd5b505050506040513d6020811015612c4f57600080fd5b505114612ca7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806148076026913960400191505060405180910390fd5b505b60115473ffffffffffffffffffffffffffffffffffffffff1615801590612ce5575073ffffffffffffffffffffffffffffffffffffffff841615155b15612dd457601154600a5473ffffffffffffffffffffffffffffffffffffffff90911690636e92e9d290889087908590612d1f8d8c6141ec565b604080517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b16815273ffffffffffffffffffffffffffffffffffffffff9687166004820152949095166024850152604484019290925260648301526084820152905160a48083019260209291908290030181600087803b158015612da757600080fd5b505af1158015612dbb573d6000803e3d6000fd5b505050506040513d6020811015612dd157600080fd5b50505b600354612de7908263ffffffff61295b16565b60035573ffffffffffffffffffffffffffffffffffffffff8616600090815260056020526040902054612e20908263ffffffff61295b16565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600560205260409020919091556012541615612ff757601254600a5460009173ffffffffffffffffffffffffffffffffffffffff1690636e92e9d290899088908690612e898e8d6141ec565b604080517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b16815273ffffffffffffffffffffffffffffffffffffffff9687166004820152949095166024850152604484019290925260648301526084820152905160a48083019260209291908290030181600087803b158015612f1157600080fd5b505af1158015612f25573d6000803e3d6000fd5b505050506040513d6020811015612f3b57600080fd5b505190508015612ff55760015473ffffffffffffffffffffffffffffffffffffffff89811691161480612f9057506001548190612f8d9073ffffffffffffffffffffffffffffffffffffffff1661406d565b10155b15612fc757600154601254612fc19173ffffffffffffffffffffffffffffffffffffffff9081169130911684614299565b50612ff5565b600254601254612ff39173ffffffffffffffffffffffffffffffffffffffff9081169130911684614299565b505b505b60145473ffffffffffffffffffffffffffffffffffffffff161580159061302957506103e885046103e8028503610309145b156130c557601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd15a38d6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561309857600080fd5b505af11580156130ac573d6000803e3d6000fd5b505050506040513d60208110156130c257600080fd5b50505b6130cd614347565b60408051828152905130916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a360408051828152905173ffffffffffffffffffffffffffffffffffffffff88169130917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a3600c80546001019055600e805482019055600b54600a54600354604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b168152905160809390931b9093179290917f49535355450000000000000000000000000000000000000000000000000000009181900360200190a39695505050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff80861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905261326f908590614382565b50505050565b604080517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8481166024830152915160009261332c9285929188169163dd62ed3e91604480820192602092909190829003018186803b1580156132f457600080fd5b505afa158015613308573d6000803e3d6000fd5b505050506040513d602081101561331e57600080fd5b50519063ffffffff61295b16565b6040805173ffffffffffffffffffffffffffffffffffffffff8616602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b30000000000000000000000000000000000000000000000000000000017905290915061326f908590614382565b600081600354101561342f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4e6f7420656e6f75676820737570706c7920746f206275726e00000000000000604482015290519081900360640190fd5b6103e882101561348a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806147d9602e913960400191505060405180910390fd5b6000613494611fb4565b905060006008600a0a600b548502816134a957fe5b0490508082612710011015613509576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001806149966034913960400191505060405180910390fd5b818111156135145750805b6003546305f5e100624c4b4083020490613534908663ffffffff61291916565b600355600154818303906000906135609073ffffffffffffffffffffffffffffffffffffffff1661406d565b60015490915073ffffffffffffffffffffffffffffffffffffffff8a8116911614806135a6575060025473ffffffffffffffffffffffffffffffffffffffff8a81169116145b1561363f578181106135e1576001546135d79073ffffffffffffffffffffffffffffffffffffffff16308a85614299565b506000915061360d565b6001546136069073ffffffffffffffffffffffffffffffffffffffff16308a84614299565b5080820391505b811561363a576002546136389073ffffffffffffffffffffffffffffffffffffffff16308a85614299565b505b613e24565b81811015613698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252605e815260200180614854605e913960600191505060405180910390fd5b6001546136bb9073ffffffffffffffffffffffffffffffffffffffff168361445f565b915060608973ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561373e57600080fd5b505afa158015613752573d6000803e3d6000fd5b505050506040513d602081101561376857600080fd5b505173ffffffffffffffffffffffffffffffffffffffff1614156138c15760408051600280825260608201835290916020830190803683375050600154825192935073ffffffffffffffffffffffffffffffffffffffff16918391506000906137cd57fe5b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201810191909152601354604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c4648926004808301939192829003018186803b15801561384757600080fd5b505afa15801561385b573d6000803e3d6000fd5b505050506040513d602081101561387157600080fd5b505181518290600190811061388257fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613a41565b6040805160038082526080820190925290602082016060803683375050600154825192935073ffffffffffffffffffffffffffffffffffffffff169183915060009061390957fe5b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201810191909152601354604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c4648926004808301939192829003018186803b15801561398357600080fd5b505afa158015613997573d6000803e3d6000fd5b505050506040513d60208110156139ad57600080fd5b50518151829060019081106139be57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508981600281518110613a0657fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b601354600154613a719173ffffffffffffffffffffffffffffffffffffffff91821691168563ffffffff61327516565b601354604080517fd06ca61f000000000000000000000000000000000000000000000000000000008152600481018681526024820192835284516044830152845160609473ffffffffffffffffffffffffffffffffffffffff169363d06ca61f9389938893909291606401906020808601910280838360005b83811015613b02578181015183820152602001613aea565b50505050905001935050505060006040518083038186803b158015613b2657600080fd5b505afa158015613b3a573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526020811015613b8157600080fd5b8101908080516040519392919084640100000000821115613ba157600080fd5b908301906020820185811115613bb657600080fd5b8251866020820283011164010000000082111715613bd357600080fd5b82525081516020918201928201910280838360005b83811015613c00578181015183820152602001613be8565b50505050919091016040525050601354835193945073ffffffffffffffffffffffffffffffffffffffff16926338ed1739925087915060649085907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908110613c6757fe5b602002602001015160620281613c7957fe5b04858e426040518663ffffffff1660e01b815260040180868152602001858152602001806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015613d10578181015183820152602001613cf8565b505050509050019650505050505050600060405180830381600087803b158015613d3957600080fd5b505af1158015613d4d573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526020811015613d9457600080fd5b8101908080516040519392919084640100000000821115613db457600080fd5b908301906020820185811115613dc957600080fd5b8251866020820283011164010000000082111715613de657600080fd5b82525081516020918201928201910280838360005b83811015613e13578181015183820152602001613dfb565b505050509050016040525050505050505b600254600054613e509173ffffffffffffffffffffffffffffffffffffffff9081169130911686614299565b50613e61858563ffffffff61291916565b30600090815260056020526040902054909550613e84908863ffffffff61291916565b30600090815260056020526040902055600354613fa0576000600b819055600154613ec49073ffffffffffffffffffffffffffffffffffffffff1661406d565b1115613f1d57600054600154613f1d9173ffffffffffffffffffffffffffffffffffffffff90811691613ef7911661406d565b60015473ffffffffffffffffffffffffffffffffffffffff16919063ffffffff61452b16565b600254600090613f429073ffffffffffffffffffffffffffffffffffffffff1661406d565b1115613f9b57600054600254613f9b9173ffffffffffffffffffffffffffffffffffffffff90811691613f75911661406d565b60025473ffffffffffffffffffffffffffffffffffffffff16919063ffffffff61452b16565b613fa8565b613fa8614347565b60408051888152905160009130917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a3600d80546001019055600f805488019055600b54600a54600354604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b168152905160809390931b9093179290917f4255524e000000000000000000000000000000000000000000000000000000009181900360200190a350600198975050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff821661409257506000610edc565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905161413591849173ffffffffffffffffffffffffffffffffffffffff8316916370a08231916024808301926020929190829003018186803b15801561410457600080fd5b505afa158015614118573d6000803e3d6000fd5b505050506040513d602081101561412e57600080fd5b50516141ec565b92915050565b600081848411156141e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156141a9578181015183820152602001614191565b50505050905090810190601f1680156141d65780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000808373ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561423557600080fd5b505afa158015614249573d6000803e3d6000fd5b505050506040513d602081101561425f57600080fd5b505160ff169050600060088211156142885760088203600a0a848161428057fe5b049050611269565b50600803600a0a9190910292915050565b600073ffffffffffffffffffffffffffffffffffffffff85166142be57506000611269565b73ffffffffffffffffffffffffffffffffffffffff84163014156143135761430e836142ea878561445f565b73ffffffffffffffffffffffffffffffffffffffff8816919063ffffffff61452b16565b611265565b6112658484614322888661445f565b73ffffffffffffffffffffffffffffffffffffffff891692919063ffffffff6131da16565b6003546305f5e100614357611fb4565b028161435f57fe5b6305f5e10063055d4a8092909104918202819004600b5560075482020401600a55565b60606143e4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166145b89092919063ffffffff16565b80519091501561445a5780806020019051602081101561440357600080fd5b505161445a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061491c602a913960400191505060405180910390fd5b505050565b6000808373ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156144a857600080fd5b505afa1580156144bc573d6000803e3d6000fd5b505050506040513d60208110156144d257600080fd5b505160ff1690506000600882111561451257507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff88101600a0a8302611269565b81600803600a0a848161452157fe5b0495945050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261445a908490614382565b60606112698484600085856145cc85614723565b61463757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b602083106146a157805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101614664565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114614703576040519150601f19603f3d011682016040523d82523d6000602084013e614708565b606091505b5091509150614718828286614729565b979650505050505050565b3b151590565b60608315614738575081610d3f565b8251156147485782518084602001fd5b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528451602484015284518593919283926044019190850190808383600083156141a957818101518382015260200161419156fe697373756542414558627945524332303a20726576657274656420626563617573652074696d65206973206f7665724d696e696d756d20616d6f756e74206f66204241455820746f206275726e20697320302e30303030312042414558697373756542414558627945524332303a204572726f7220696e207472616e73666572696e674e6f7420656e6f75676820616d6f756e74206f6e2074686520736f7572636520616464726573734e6f7420656e6f7567682055534454206f6e20746865204241455820636f6e74726163742c206e65656420746f2063616c6c2062616c616e63696e67206f662074686520617373657473206f72206275726e20746f20555344542c4441494f6e6c79206f7074696f6e7320636f6e7472616374732063616e2063616c6c20697444657374696e6174696f6e20616464726573732063616e277420626520656d707479697373756542414558627945524332303a204e6f7420656e6f75676820616c6c6f77616e63655361666545524332303a204552433230206f7065726174696f6e20646964206e6f74207375636365656456616c756520666f72207472616e736665722073686f756c64206265206d6f7265207468616e207a65726f596f7520646f6e27742068617665207065726d697373696f6e7320746f2063616c6c2069744e6f7420656e6f75676820636f6c6c61746572616c206f6e2074686520636f6e747261637420746f206275726e20746f6b656e73a2646970667358221220d670d14cacb5dc427db754e8e5ba0e4cd2cece80b86dd8fba15acee44a9c6b8764736f6c634300060b0033

Deployed Bytecode Sourcemap

11603:14570:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24993:30;;:10;;25013:9;24993:30;;;;;;;;;25013:9;24993:10;:30;;;;;;;;;;;;;;;;;;;;;11603:14570;;;;;11940:18;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12196:28;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;5620:207;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5620:207:1;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;3503:103;;;;;;;;;;;;;:::i;12074:28::-;;;;;;;;;;;;;:::i;14038:682::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14038:682:1;;;;;;;;;;;;;;;;;;:::i;3319:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3319:40:1;;;;:::i;12165:28::-;;;;;;;;;;;;;:::i;7458:26::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2488:20;;;;;;;;;;;;;:::i;25151:141::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25151:141:1;;;;;;;;;;;:::i;:::-;;11986:26;;;;;;;;;;;;;:::i;2458:24::-;;;;;;;;;;;;;:::i;13141:78::-;;;;;;;;;;;;;:::i;3365:61::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3365:61:1;;;;;;;;;;;:::i;7428:27::-;;;;;;;;;;;;;:::i;11880:52::-;;;;;;;;;;;;;:::i;4354:119::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4354:119:1;;;;:::i;14854:726::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14854:726:1;;;;;;;;;;;;;;;;;;;;;;;;;:::i;25296:147::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25296:147:1;;;;:::i;11050:97::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11050:97:1;;;;:::i;7180:32::-;;;;;;;;;;;;;:::i;11961:20::-;;;;;;;;;;;;;:::i;13528:276::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13528:276:1;;;;;;;;;:::i;18583:1994::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18583:1994:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;12105:27::-;;;;;;;;;;;;;:::i;13223:76::-;;;;;;;;;;;;;:::i;26061:110::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26061:110:1;;;;:::i;12015:25::-;;;;;;;;;;;;;:::i;24468:480::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24468:480:1;;;;;;;;;:::i;10685:256::-;;;;;;;;;;;;;:::i;7218:38::-;;;;;;;;;;;;;:::i;6162:148::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6162:148:1;;;;;;;;;;;:::i;25579:478::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25579:478:1;;;;:::i;25447:128::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25447:128:1;;;;:::i;10945:101::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10945:101:1;;;;:::i;11151:167::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11151:167:1;;;;:::i;11940:18::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;12196:28::-;;;;:::o;5620:207::-;5716:10;5692:4;5708:19;;;:7;:19;;;;;;;;;:29;;;;;;;;;;;:38;;;5761;;;;;;;5692:4;;5708:29;;5716:10;;5761:38;;;;;;;;-1:-1:-1;5816:4:1;5620:207;;;;:::o;3503:103::-;3587:12;;3503:103;;:::o;12074:28::-;;;;:::o;14038:682::-;14129:4;14150:17;;;14142:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14229:1;14220:6;:10;14212:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14284:8;14312:19;;;14321:10;14312:19;14307:148;;;14351:27;14366:3;14371:6;14351:14;:27::i;:::-;14345:33;;14307:148;;;14409:38;14428:5;14435:3;14440:6;14409:18;:38::i;:::-;14403:44;;14307:148;14463:3;14458:243;;;14482:20;;;14497:4;14482:20;14477:201;;;14523:25;14533:5;14540:6;14523:8;:25::i;:::-;;14477:201;;;14568:21;;;;;;;:16;:21;;;;;;;;14563:115;;;14610:59;;;;;;:37;:59;;;;;;;:37;;:59;;;;;;;;;;;;;;:37;;:59;;;;;;;;;;;;;;;-1:-1:-1;14610:37:1;:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;14563:115:1;14692:4;14685:11;;;;;14458:243;14711:5;14704:12;;;14038:682;;;;;;:::o;3319:40::-;;;;;;;;;;;;;:::o;12165:28::-;;;;:::o;7458:26::-;;;;;;:::o;2488:20::-;;;;:::o;25151:141::-;11371:5;;;;11357:10;:19;;11356:52;;-1:-1:-1;11382:10:1;7347:42;11382:25;11356:52;11347:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25243:34:::1;::::0;;;::::1;;::::0;;;:16:::1;:34;::::0;;;;:45;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;25151:141::o;11986:26::-;;;;:::o;2458:24::-;;;;:::o;13141:78::-;13204:11;;13141:78;:::o;3365:61::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;7428:27::-;;;;;;:::o;11880:52::-;;;;:::o;4354:119::-;4450:16;;;4419:12;4450:16;;;:8;:16;;;;;;4354:119;;;;:::o;14854:726::-;25087:10;14973:4;25070:28;;;:16;:28;;;;;;;;25061:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14994:17:::1;::::0;::::1;14986:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15071:15;::::0;::::1;;::::0;;;:8:::1;:15;::::0;;;;;15061:25;::::1;;15053:68;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;15130:15;15126:436;;;15173:15;::::0;::::1;;::::0;;;:8:::1;:15;::::0;;;;;:27:::1;::::0;15193:6;15173:27:::1;:19;:27;:::i;:::-;15155:15;::::0;::::1;;::::0;;;:8:::1;:15;::::0;;;;;:45;;;;15251:4:::1;15234:23:::0;;;;:35:::1;::::0;15262:6;15234:35:::1;:27;:35;:::i;:::-;15225:4;15208:23;::::0;;;:8:::1;:23;::::0;;;;;;;;:61;;;;15282:30;;;;;;;15208:23:::1;15282:30:::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;;;;;;::::1;15325:38;::::0;;;;;;;15348:4:::1;::::0;15325:38:::1;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;15378:23;15388:3;15393:6;15378:8;:23::i;:::-;15371:30;;;;15126:436;15438:15;::::0;::::1;;::::0;;;:8:::1;:15;::::0;;;;;:27:::1;::::0;15458:6;15438:27:::1;:19;:27;:::i;:::-;15420:15;::::0;;::::1;;::::0;;;:8:::1;:15;::::0;;;;;:45;;;;15489:13;;::::1;::::0;;;;:25:::1;::::0;15507:6;15489:25:::1;:17;:25;:::i;:::-;15473:13;::::0;;::::1;;::::0;;;:8:::1;:13;::::0;;;;;;;;:41;;;;15527:30;;;;;;;15473:13;;15527:30;;::::1;::::0;::::1;::::0;;;;;;;::::1;15126:436;-1:-1:-1::0;15572:4:1::1;25142:1;14854:726:::0;;;;;;:::o;25296:147::-;11371:5;;;;11357:10;:19;;11356:52;;-1:-1:-1;11382:10:1;7347:42;11382:25;11356:52;11347:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25389:23:::1;:50:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;25296:147::o;11050:97::-;11371:5;;;;11357:10;:19;;11356:52;;-1:-1:-1;11382:10:1;7347:42;11382:25;11356:52;11347:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11117:11:::1;:26:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;11050:97::o;7180:32::-;7211:1;7180:32;:::o;11961:20::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13528:276;13600:4;13621:17;;;13613:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13700:1;13691:6;:10;13683:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13762:38;13776:10;13788:3;13793:6;13762:12;:38::i;18583:1994::-;18740:7;18764:14;;;:46;;;18801:9;18782:15;:28;;18764:46;18755:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19017:12;;;18998:31;;;19017:12;;18998:31;;:65;;-1:-1:-1;19052:11:1;;;19033:30;;;19052:11;;19033:30;18998:65;18993:188;;;19084:89;19107:15;19124:10;19136:19;19157:8;19167:4;19084:21;:89::i;:::-;19077:96;;;;18993:188;19244:18;19239:44;;19281:2;19265:18;;19239:44;19290:86;:40;;;19331:10;19350:4;19356:19;19290:86;:40;:86;:::i;:::-;19429:13;;19383:80;;19429:13;19383:45;;;;19429:13;19443:19;19383:80;:45;:80;:::i;:::-;19541:13;;19522:40;;;;;;;;19470:21;;19541:13;;;19522:38;;:40;;;;;;;;;;;;;;19541:13;19522:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19522:40:1;19503:59;;;;;;;19498:630;;;19655:16;;;19669:1;19655:16;;;;;;;;;;;;;;;;;;-1:-1:-1;;19711:13:1;;19692:40;;;;;;;;19648:23;;-1:-1:-1;19711:13:1;;;;;19692:38;;-1:-1:-1;19692:40:1;;;;;;;;;;;;;;19711:13;19692:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19692:40:1;19682:7;;:4;;19687:1;;19682:7;;;;:50;;;;:7;;;;;;;;;:50;19756:11;;19746:7;;19756:11;;;19746:4;;19756:11;;19746:7;;;;;;;;;;;:21;;;;;;;;;;;19498:630;;;19969:16;;;19983:1;19969:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19969:16:1;19962:23;;20006:15;19996:4;20001:1;19996:7;;;;;;;;:25;;;;:7;;;;;;;;;;:25;;;;20064:13;;20045:40;;;;;;;;20064:13;;;;;20045:38;;:40;;;;;19996:7;;20045:40;;;;;20064:13;20045:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20045:40:1;20035:7;;:4;;20040:1;;20035:7;;;;;;:50;;;;:7;;;;;;;;;:50;20109:11;;;20099:7;;20109:11;;;20099:4;;20109:11;20099:7;;;;;;;;;;;:21;;;;;;;;;;;19498:630;20180:13;;20161:73;;;;;;;;;;;;;;;;;;;;;;;;;;20137:21;;20180:13;;;20161:47;;20209:19;;20229:4;;20161:73;;;;;;;;;;;;;;;20180:13;20161:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20161:73:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20137:97;;20244:22;20310:4;20294:13;20269:7;20289:1;20277:4;:11;:13;20269:22;;;;;;;;;;;;;;:38;:45;;;;;20353:13;;20334:133;;;;;;;;;;;20269:45;;;;20334:133;;;;;;20444:4;20334:133;;;;;;20451:15;20334:133;;;;;;;;;;;;;;;;;;;;;20269:45;;-1:-1:-1;20353:13:1;;;;;20334:58;;20393:19;;20269:45;;20430:4;;20444;20451:15;20334:133;;;;;;;;;;;;;20353:13;20334:133;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20334:133:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20324:143;;20484:89;20507:11;;;;;;;;;;;20520:10;20532:7;20552:1;20540:4;:11;:13;20532:22;;;;;;;;;;;;;;20556:8;20566:5;20484:21;:89::i;:::-;20477:96;;;;;18583:1994;;;;;;;;:::o;12105:27::-;;;;:::o;13223:76::-;13285:10;;13223:76;:::o;26061:110::-;11371:5;;;;11357:10;:19;;11356:52;;-1:-1:-1;11382:10:1;7347:42;11382:25;11356:52;11347:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26137:13:::1;:30:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;26061:110::o;12015:25::-;;;;:::o;24468:480::-;24588:10;24559:4;24579:20;;;:8;:20;;;;;;:39;-1:-1:-1;24579:39:1;24571:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24693:10;24684:20;;;;:8;:20;;;;;;:41;;24709:15;24684:41;:24;:41;:::i;:::-;24670:10;24661:20;;;;:8;:20;;;;;;:64;;;;24772:4;24755:23;;;;:44;;24783:15;24755:44;:27;:44;:::i;:::-;24746:4;24729:23;;;;:8;:23;;;;;;;;;:70;;;;24808:54;;;;;;;24746:4;;24818:10;;24808:54;;;;;;;;;;24876:68;24899:15;24916:10;24928:15;24876:22;:68::i;10685:256::-;10765:11;;;10749:12;10728:7;;10765:11;10749:12;;;10765:11;;10749:27;10744:194;;;10817:12;;10797:33;;10817:12;;10797:19;:33::i;:::-;10790:40;;;;10744:194;10918:11;;10898:32;;10918:11;;10898:19;:32::i;:::-;10882:12;;10862:33;;10882:12;;10862:19;:33::i;:::-;:68;10855:75;;;;7218:38;7248:8;7218:38;:::o;6162:148::-;6278:15;;;;6245:14;6278:15;;;:7;:15;;;;;;;;:25;;;;;;;;;;;;;6162:148::o;25579:478::-;11371:5;;;;11357:10;:19;;11356:52;;-1:-1:-1;11382:10:1;7347:42;11382:25;11356:52;11347:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25654:14:::1;:32:::0;;;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;;;-1:-1:-1;25759:12:1;25752:60:::1;::::0;;;;;25791:4:::1;25752:60;::::0;::::1;::::0;25797:14;;::::1;25752:60:::0;;;;;25759:12;::::1;::::0;25752:30:::1;::::0;:60;;;;;::::1;::::0;;;;;;;;25759:12;25752:60;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;25752:60:1;25747:153:::1;;25871:14;::::0;;25835:12;25828:67:::1;::::0;25871:14:::1;25835:12:::0;;::::1;::::0;25871:14:::1;25891:2;25828:67;:42;:67;:::i;:::-;25915:11;::::0;25952:14:::1;::::0;25908:59:::1;::::0;;;;;25946:4:::1;25908:59;::::0;::::1;::::0;25915:11:::1;25952:14:::0;;::::1;25908:59:::0;;;;;;25915:11;;;::::1;::::0;25908:29:::1;::::0;:59;;;;;::::1;::::0;;;;;;;;25915:11;25908:59;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;25908:59:1;25903:151:::1;;26025:14;::::0;25990:11:::1;::::0;25983:66:::1;::::0;26025:14:::1;25990:11:::0;;::::1;::::0;26025:14:::1;26045:2;25983:66;:41;:66;:::i;:::-;25579:478:::0;:::o;25447:128::-;11371:5;;;;11357:10;:19;;11356:52;;-1:-1:-1;11382:10:1;7347:42;11382:25;11356:52;11347:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25527:20:::1;:44:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;25447:128::o;10945:101::-;11371:5;;;;11357:10;:19;;11356:52;;-1:-1:-1;11382:10:1;7347:42;11382:25;11356:52;11347:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11014:12:::1;:28:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;10945:101::o;11151:167::-;11371:5;;;;11357:10;:19;;11356:52;;-1:-1:-1;11382:10:1;7347:42;11382:25;11356:52;11347:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11225:22:::1;::::0;::::1;11217:31;;;::::0;::::1;;11278:5;::::0;;11257:37:::1;::::0;::::1;::::0;;::::1;::::0;11278:5;::::1;::::0;11257:37:::1;::::0;::::1;11298:5;:16:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;11151:167::o;3772:368::-;3883:10;3849:4;3874:20;;;:8;:20;;;;;;:30;-1:-1:-1;3874:30:1;3865:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3990:10;3981:20;;;;:8;:20;;;;;;:32;;4006:6;3981:32;:24;:32;:::i;:::-;3967:10;3958:20;;;;:8;:20;;;;;;:55;;;;:20;4039:13;;;;;;:25;;4057:6;4039:25;:17;:25;:::i;:::-;4023:13;;;;;;;:8;:13;;;;;;;;;:41;;;;4079:33;;;;;;;4023:13;;4088:10;;4079:33;;;;;;;;;;-1:-1:-1;4129:4:1;3772:368;;;;:::o;4754:626::-;4884:14;;;4850:4;4884:14;;;:7;:14;;;;;;;;4899:10;4884:26;;;;;;;;4850:4;;4924:19;;;;:45;;;4966:2;4947:10;:22;;4924:45;4920:196;;;5005:6;4993:10;:18;;4985:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5083:22;:10;5098:6;5083:22;:14;:22;:::i;:::-;5054:14;;;;;;;:7;:14;;;;;;;;5069:10;5054:26;;;;;;;:51;4920:196;5134:15;;;;;;;:8;:15;;;;;;:25;-1:-1:-1;5134:25:1;5125:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24290:174;24415:12;;24373:4;;24392:68;;24415:12;;24429:13;24444:15;24392:22;:68::i;1329:134:3:-;1387:7;1413:43;1417:1;1420;1413:43;;;;;;;;;;;;;;;;;:3;:43::i;882:176::-;940:7;971:5;;;994:6;;;;986:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15976:2603:1;16134:7;16150:23;16265:11;;7211:1;7248:2;:8;16198:58;16224:15;16241:13;16198:24;:58::i;:::-;:64;:78;;;;;;16180:96;;16288:14;16283:505;;;16325:60;;;;;;:33;:60;;;;;;;16379:4;16325:60;;;;;;16389:13;;16325:33;;;;;:60;;;;;;;;;;;;;;:33;:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16325:60:1;:77;;16316:130;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16488:48;;;;;;16530:4;16488:48;;;;;;16457:28;;16488:33;;;;;;:48;;;;;;;;;;;;;;;:33;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16488:48:1;;-1:-1:-1;16547:81:1;:40;;;16588:11;16608:4;16614:13;16547:81;:40;:81;:::i;:::-;16648:48;;;;;;16690:4;16648:48;;;;;;16701:34;;;;16648:33;;;;;;:48;;;;;;;;;;;;;;;:33;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16648:48:1;:88;16639:141;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16283:505;;16806:23;;16798:46;16806:23;16798:46;;;;:72;;-1:-1:-1;16848:22:1;;;;;16798:72;16794:262;;;16898:23;;16978:11;;16898:23;;;;;16886:50;;16938:11;;16951:8;;16961:15;;16991:55;17016:15;17032:13;16991:24;:55::i;:::-;16886:162;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16886:162:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;16794:262:1;17114:12;;:35;;17132:15;17114:35;:16;:35;:::i;:::-;17099:12;:50;17180:21;;;;;;;:8;:21;;;;;;:44;;17207:15;17180:44;:25;:44;:::i;:::-;17156:21;;;;;;;;:8;:21;;;;;:68;;;;17244:20;;;17236:43;17231:670;;17331:20;;17408:11;;17293:23;;17331:20;;;17319:47;;17368:11;;17381:8;;17391:15;;17421:55;17446:15;17462:13;17421:24;:55::i;:::-;17319:159;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17319:159:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17319:159:1;;-1:-1:-1;17493:19:1;;17489:405;;17555:12;;;17536:31;;;17555:12;;17536:31;;17534:95;;-1:-1:-1;17595:12:1;;17612:15;;17575:33;;17595:12;;17575:19;:33::i;:::-;:52;;17534:95;17529:354;;;17671:12;;17700:20;;17651:88;;17671:12;;;;;17693:4;;17700:20;17722:15;17651:18;:88::i;:::-;;17529:354;;;17800:11;;17828:20;;17780:87;;17800:11;;;;;17821:4;;17828:20;17850:15;17780:18;:87::i;:::-;;17529:354;17231:670;;17921:14;;17913:37;17921:14;17913:37;;;;:92;;-1:-1:-1;17987:4:1;17973:13;:18;17993:4;17972:25;17956:13;:41;18002:3;17954:51;17913:92;17907:186;;;18050:14;;;;;;;;;;;18022:58;;;:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;17907:186:1;18163:14;:12;:14::i;:::-;18230:54;;;;;;;;18261:4;;18247:3;;18230:54;;;;;;;;;18296:53;;;;;;;;;;;;18313:4;;18296:53;;;;;;;;;18356:13;:15;;;;;;18394:13;;;:31;;18378:47;;18528:10;;18508:11;;18484:12;;18432:109;;;;18453:4;18437:22;;18432:109;;;;;18521:3;18508:16;;;;18507:31;;;;18484:12;;18460:15;;18432:109;;;;;;;18555:15;15976:2603;-1:-1:-1;;;;;;15976:2603:1:o;860:203:2:-;987:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1010:27;987:68;;;960:96;;980:5;;960:19;:96::i;:::-;860:203;;;;:::o;1942:283::-;2061:39;;;;;;2085:4;2061:39;;;;:15;:39;;;;;;;;;2038:20;;2061:50;;2105:5;;2061:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2061:39:2;;:50;:43;:50;:::i;:::-;2148:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2171:22;2148:69;;;2038:73;;-1:-1:-1;2121:97:2;;2141:5;;2121:19;:97::i;20680:3606:1:-;20802:4;20839:15;20823:12;;:31;;20814:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20919:4;20900:15;:23;;20891:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20982:24;21009:12;:10;:12::i;:::-;20982:39;;21028:22;7211:1;7248:2;:8;21071:10;;21053:15;:28;:34;;;;;;21028:59;;21135:14;21105:16;21124:5;21105:24;21103:46;;21094:113;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21236:16;21219:14;:33;21214:93;;;-1:-1:-1;21283:16:1;21214:93;21423:12;;7248:8;11793:13;21336:25;;:31;;21423:33;;21440:15;21423:33;:16;:33;:::i;:::-;21408:12;:48;21559:12;;21486:27;;;;21463:20;;21538:35;;21559:12;;21538:19;:35::i;:::-;21604:12;;21520:53;;-1:-1:-1;21604:12:1;21585:31;;;21604:12;;21585:31;;:65;;-1:-1:-1;21639:11:1;;;21620:30;;;21639:11;;21620:30;21585:65;21580:1636;;;21680:12;21669:7;:23;21664:349;;21730:12;;21710:78;;21730:12;;21752:4;21759:13;21774:12;21710:18;:78::i;:::-;;21818:1;21803:16;;21664:349;;;21896:12;;21876:73;;21896:12;;21918:4;21925:13;21940:7;21876:18;:73::i;:::-;;21994:7;21979:12;:22;21964:37;;21837:176;22028:16;;22023:128;;22082:11;;22062:77;;22082:11;;22103:4;22110:13;22125:12;22062:18;:77::i;:::-;;22023:128;21580:1636;;;22195:12;22184:7;:23;;22175:131;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22362:12;;22332:56;;22362:12;;22375;22332:29;:56::i;:::-;22317:71;;22399:21;22480:15;22436:59;;22455:13;;;;;;;;;;;22436:38;;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22436:40:1;:59;;;22431:432;;;22520:16;;;22534:1;22520:16;;;;;;;;;;;;;;;;;;-1:-1:-1;;22564:12:1;;22554:7;;;;-1:-1:-1;22564:12:1;;;22554:7;;-1:-1:-1;22564:12:1;;22554:7;;;;:22;;;;:7;;;;;;;;;;:22;;;;22623:13;;22604:40;;;;;;;;22623:13;;;;;22604:38;;:40;;;;;22554:7;;22604:40;;;;;22623:13;22604:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22604:40:1;22594:7;;:4;;22599:1;;22594:7;;;;;;;;;;;:50;;;;;;;;;;;22431:432;;;22684:16;;;22698:1;22684:16;;;;;;;;;;;;;;;;;;-1:-1:-1;;22728:12:1;;22718:7;;;;-1:-1:-1;22728:12:1;;;22718:7;;-1:-1:-1;22728:12:1;;22718:7;;;;:22;;;;:7;;;;;;;;;;:22;;;;22787:13;;22768:40;;;;;;;;22787:13;;;;;22768:38;;:40;;;;;22718:7;;22768:40;;;;;22787:13;22768:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22768:40:1;22758:7;;:4;;22763:1;;22758:7;;;;;;;;;;;:50;;;;;;;;;;;22836:15;22826:4;22831:1;22826:7;;;;;;;;;;;;;:25;;;;;;;;;;;22431:432;22916:13;;;22880:12;22873:70;;22916:13;22880:12;;;;22916:13;22930:12;22873:70;:42;:70;:::i;:::-;23000:13;;22981:67;;;;;;;;;;;;;;;;;;;;;;;;;;22957:21;;23000:13;;;22981:47;;23029:12;;23043:4;;22981:67;;;;;;;;;;;;;;;23000:13;22981:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22981:67:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;22981:67:1;;;;;;-1:-1:-1;;23081:13:1;;23143:14;;22957:91;;-1:-1:-1;23081:13:1;;;23062:58;;-1:-1:-1;23121:12:1;;-1:-1:-1;23166:3:1;;22957:91;;23143:16;;;;23135:25;;;;;;;;;;;;23163:2;23135:30;:34;;;;;;23171:4;23177:13;23192:15;23062:146;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23062:146:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21580:1636;;;23242:11;;;23270:5;23222:69;;23242:11;;;;;23263:4;;23270:5;23277:12;23222:18;:69::i;:::-;-1:-1:-1;23317:38:1;:16;23339:14;23317:38;:20;:38;:::i;:::-;23405:4;23388:23;;;;:8;:23;;;;;;23298:57;;-1:-1:-1;23388:46:1;;23417:15;23388:46;:27;:46;:::i;:::-;23379:4;23362:23;;;;:8;:23;;;;;:72;23446:12;;23441:568;;23571:1;23558:10;:14;;;23609:12;;23588:35;;23609:12;;23588:19;:35::i;:::-;:39;23583:153;;;23680:5;;;23708:12;23645:79;;23680:5;;;;;23687:35;;23708:12;23687:19;:35::i;:::-;23652:12;;;;;23645:79;;:33;:79;:::i;:::-;23772:11;;23788:1;;23751:34;;23772:11;;23751:19;:34::i;:::-;:38;23746:150;;;23841:5;;23869:11;;23807:77;;23841:5;;;;;23848:34;;23869:11;23848:19;:34::i;:::-;23814:11;;;;;23807:77;;:32;:77;:::i;:::-;23441:568;;;23987:14;:12;:14::i;:::-;24020:54;;;;;;;;24052:3;;24037:4;;24020:54;;;;;;;;;24081:12;:14;;;;;;24118:13;;;:31;;24102:47;;24251:10;;24231:11;;24207:12;;24156:108;;;;24177:4;24161:22;;24156:108;;;;;24244:3;24231:16;;;;24230:31;;;;24207:12;;24184:14;;24156:108;;;;;;;-1:-1:-1;24278:4:1;;20680:3606;-1:-1:-1;;;;;;;;20680:3606:1:o;7489:214::-;7559:7;7580:22;;;7575:38;;-1:-1:-1;7612:1:1;7605:8;;7575:38;7658:39;;;;;;7691:4;7658:39;;;;;;7624:75;;7650:6;;7658:24;;;;;;:39;;;;;;;;;;;;;;:24;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7658:39:1;7624:24;:75::i;:::-;7617:82;7489:214;-1:-1:-1;;7489:214:1:o;1754:187:3:-;1840:7;1875:12;1867:6;;;;1859:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1910:5:3;;;1754:187::o;10328:353:1:-;10420:7;10436;10453:6;10446:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10446:25:1;10436:35;;;-1:-1:-1;10475:14:1;7300:1;10508:14;;10503:152;;;7300:1;10563:2;:12;10558:2;:18;10548:7;:28;;;;;;10539:37;;10503:152;;;-1:-1:-1;7300:1:1;10631:12;10626:2;:18;10616:28;;;;;10671:6;-1:-1:-1;;10328:353:1:o;7947:451::-;8056:4;8074:22;;;8069:42;;-1:-1:-1;8106:5:1;8099:12;;8069:42;8126:22;;;8143:4;8126:22;8121:259;;;8165:81;8194:3;8199:45;8229:6;8236:7;8199:29;:45::i;:::-;8165:27;;;;:81;;:27;:81;:::i;:::-;8121:259;;;8277:92;8310:5;8317:3;8322:45;8352:6;8359:7;8322:29;:45::i;:::-;8277:31;;;;:92;;;:31;:92;:::i;15641:221::-;15718:12;;7248:8;15697:12;:10;:12::i;:::-;:18;:33;;;;;7248:8;11722:12;15697:33;;;;15750:24;;;:30;;;15737:10;:43;15829:20;;15815:34;;:40;15801:54;15683:11;15787:68;15641:221::o;2942:751:2:-;3361:23;3387:69;3415:4;3387:69;;;;;;;;;;;;;;;;;3395:5;3387:27;;;;:69;;;;;:::i;:::-;3470:17;;3361:95;;-1:-1:-1;3470:21:2;3466:221;;3610:10;3599:30;;;;;;;;;;;;;;;-1:-1:-1;3599:30:2;3591:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2942:751;;;:::o;9966:358:1:-;10063:7;10079;10096:6;10089:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10089:25:1;10079:35;;;-1:-1:-1;10118:14:1;7300:1;10151:14;;10146:152;;;-1:-1:-1;10206:12:1;;;10201:2;:18;10191:28;;10146:152;;;10284:2;7300:1;10274:12;10269:2;:18;10259:7;:28;;;;;;;9966:358;-1:-1:-1;;;;;9966:358:1:o;679:175:2:-;788:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;811:23;788:58;;;761:86;;781:5;;761:19;:86::i;3580:193:0:-;3683:12;3714:52;3736:6;3744:4;3750:1;3753:12;3683;4857:18;4868:6;4857:10;:18::i;:::-;4849:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4980:12;4994:23;5021:6;:11;;5041:5;5049:4;5021:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4979:75;;;;5071:52;5089:7;5098:10;5110:12;5071:17;:52::i;:::-;5064:59;4607:523;-1:-1:-1;;;;;;;4607:523:0:o;725:413::-;1085:20;1123:8;;;725:413::o;7090:725::-;7205:12;7233:7;7229:580;;;-1:-1:-1;7263:10:0;7256:17;;7229:580;7374:17;;:21;7370:429;;7632:10;7626:17;7692:15;7679:10;7675:2;7671:19;7664:44;7581:145;7764:20;;;;;;;;;;;;;;;;;;;;7771:12;;7764:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

ipfs://d670d14cacb5dc427db754e8e5ba0e4cd2cece80b86dd8fba15acee44a9c6b87
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.