ERC-20
Overview
Max Total Supply
6,681,835.13061283955808859 DV
Holders
84
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
60,299.032378149607587371 DVValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
DuneVault
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-03-07 */ /********************************************************************** DuneVault web : https://www.dunevault.com doc : https://doc.dunevault.com social : https://t.me/dunevault twitter : https://twitter.com/DuneVault blog : https://medium.com/@dunevault **********************************************************************/ //SPDX-License-Identifier: UNLICENSED pragma solidity >= 0.8.10; interface IOwnable { function owner() external view returns (address); } interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address who) external view returns (uint256); function allowance(address _owner, address spender) external view returns (uint256); function transfer(address to, uint256 value) external returns (bool); function approve(address spender, uint256 value) external returns (bool); function transferFrom(address from, address to, uint256 value) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } interface IBurnable { function burn(uint256 value) external; function burnFrom(address account, uint256 value) external; } interface IDEXFactory { function createPair(address tokenA, address tokenB) external returns (address pair); } interface IDEXRouter { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidityETH(address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline) external payable returns (uint amountToken, uint amountETH, uint liquidity); 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 swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETHSupportingFeeOnTransferTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); } interface IDividendDistributor { function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution) external; function setShare(address shareholder, uint256 amount) external; function depositNative() external payable; function depositToken(address from, uint256 amount) external; function process(uint256 gas) external; function inSwap() external view returns (bool); } interface ITaxDistributor { receive() external payable; function lastSwapTime() external view returns (uint256); function inSwap() external view returns (bool); function createWalletTax(string memory name, uint256 buyTax, uint256 sellTax, address wallet, bool convertToNative) external; function createDistributorTax(string memory name, uint256 buyTax, uint256 sellTax, address wallet, bool convertToNative) external; function createDividendTax(string memory name, uint256 buyTax, uint256 sellTax, address dividendDistributor, bool convertToNative) external; function createBurnTax(string memory name, uint256 buyTax, uint256 sellTax) external; function createLiquidityTax(string memory name, uint256 buyTax, uint256 sellTax, address holder) external; function distribute() external; function getSellTax() external view returns (uint256); function getBuyTax() external view returns (uint256); function setTaxWallet(string memory taxName, address wallet) external; function setSellTax(string memory taxName, uint256 taxPercentage) external; function setBuyTax(string memory taxName, uint256 taxPercentage) external; function takeSellTax(uint256 value) external returns (uint256); function takeBuyTax(uint256 value) external returns (uint256); } interface IWalletDistributor { function receiveToken(address token, address from, uint256 amount) external; } /** * @title SafeMath * @dev Math operations with safety checks that revert on error */ library SafeMath { int256 constant private INT256_MIN = -2**255; /** * @dev Multiplies two unsigned integers, reverts on 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-solidity/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b); return c; } /** * @dev Multiplies two signed integers, reverts on overflow. */ function mul(int256 a, int256 b) internal pure returns (int256) { // 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-solidity/pull/522 if (a == 0) { return 0; } require(!(a == -1 && b == INT256_MIN)); // This is the only case of overflow not detected by the check below int256 c = a * b; require(c / a == b); return c; } /** * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Integer division of two signed integers truncating the quotient, reverts on division by zero. */ function div(int256 a, int256 b) internal pure returns (int256) { require(b != 0); // Solidity only automatically asserts when dividing by 0 require(!(b == -1 && a == INT256_MIN)); // This is the only case of overflow int256 c = a / b; return c; } /** * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a); uint256 c = a - b; return c; } /** * @dev Subtracts two signed integers, reverts on overflow. */ function sub(int256 a, int256 b) internal pure returns (int256) { int256 c = a - b; require((b >= 0 && c <= a) || (b < 0 && c > a)); return c; } /** * @dev Adds two unsigned integers, reverts on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a); return c; } /** * @dev Adds two signed integers, reverts on overflow. */ function add(int256 a, int256 b) internal pure returns (int256) { int256 c = a + b; require((b >= 0 && c >= a) || (b < 0 && c < a)); return c; } /** * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo), * reverts when dividing by zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0); return a % b; } } abstract contract BaseErc20 is IERC20, IOwnable { mapping (address => uint256) internal _balances; mapping (address => mapping (address => uint256)) internal _allowed; uint256 internal _totalSupply; bool internal _useSafeTransfer; string public symbol; string public name; uint8 public decimals; address public override owner; address public operator; bool public isTradingEnabled = true; bool public launched; mapping (address => bool) public canAlwaysTrade; mapping (address => bool) public excludedFromSelling; mapping (address => bool) public exchanges; modifier onlyOwner() { require(msg.sender == owner, "can only be called by the contract owner"); _; } modifier isLaunched() { require(launched, "can only be called once token is launched"); _; } // @dev Trading is allowed before launch if the sender is the owner, we are transferring from the owner, or in canAlwaysTrade list modifier tradingEnabled(address from) { require((isTradingEnabled && launched) || from == owner || canAlwaysTrade[msg.sender], "trading not enabled"); _; } event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); function configure(address _owner) internal virtual { owner = _owner; canAlwaysTrade[owner] = true; operator = owner; } /** * @dev Total number of tokens in existence */ function totalSupply() external override view returns (uint256) { return _totalSupply; } /** * @dev Gets the balance of the specified address. * @param _owner The address to query the balance of. * @return An uint256 representing the amount owned by the passed address. */ function balanceOf(address _owner) external override view returns (uint256) { return _balances[_owner]; } /** * @dev Function to check the amount of tokens that 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 A uint256 specifying the amount of tokens still available for the spender. */ function allowance(address _owner, address spender) external override view returns (uint256) { return _allowed[_owner][spender]; } /** * @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, uint256 value) external override tradingEnabled(msg.sender) returns (bool) { _transfer(msg.sender, to, value); return true; } /** * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender. * Beware that changing an allowance with this method brings the risk that someone may use both the old * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * @param spender The address which will spend the funds. * @param value The amount of tokens to be spent. */ function approve(address spender, uint256 value) external override tradingEnabled(msg.sender) returns (bool) { require(spender != address(0), "cannot approve the 0 address"); _allowed[msg.sender][spender] = value; emit Approval(msg.sender, spender, value); return true; } /** * @dev Transfer tokens from one address to another. * Note that while this function emits an Approval event, this is not required as per the specification, * and other compliant implementations may not emit the event. * @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 uint256 the amount of tokens to be transferred */ function transferFrom(address from, address to, uint256 value) external override tradingEnabled(from) returns (bool) { _allowed[from][msg.sender] = _allowed[from][msg.sender] - value; _transfer(from, to, value); emit Approval(from, msg.sender, _allowed[from][msg.sender]); return true; } /** * @dev Increase the amount of tokens that an owner allowed to a spender. * approve should be called when allowed_[_spender] == 0. To increment * allowed value is better to use this function to avoid 2 calls (and wait until * the first transaction is mined) * From MonolithDAO Token.sol * Emits an Approval event. * @param spender The address which will spend the funds. * @param addedValue The amount of tokens to increase the allowance by. */ function increaseAllowance(address spender, uint256 addedValue) external tradingEnabled(msg.sender) returns (bool) { require(spender != address(0), "cannot approve the 0 address"); _allowed[msg.sender][spender] = _allowed[msg.sender][spender] + addedValue; emit Approval(msg.sender, spender, _allowed[msg.sender][spender]); return true; } /** * @dev Decrease the amount of tokens that an owner allowed to a spender. * approve should be called when allowed_[_spender] == 0. To decrement * allowed value is better to use this function to avoid 2 calls (and wait until * the first transaction is mined) * From MonolithDAO Token.sol * Emits an Approval event. * @param spender The address which will spend the funds. * @param subtractedValue The amount of tokens to decrease the allowance by. */ function decreaseAllowance(address spender, uint256 subtractedValue) external tradingEnabled(msg.sender) returns (bool) { require(spender != address(0), "cannot approve the 0 address"); _allowed[msg.sender][spender] = _allowed[msg.sender][spender] - subtractedValue; emit Approval(msg.sender, spender, _allowed[msg.sender][spender]); return true; } // Virtual methods function launch() virtual public onlyOwner { launched = true; } function preTransfer(address from, address to, uint256 value) virtual internal { } function calculateTransferAmount(address from, address to, uint256 value) virtual internal returns (uint256) { require(from != to, "you cannot transfer to yourself"); return value; } function postTransfer(address from, address to) virtual internal { } // Admin methods function changeOwner(address who) external onlyOwner { require(who != address(0), "cannot be zero address"); owner = who; } function renounceOwnership() external onlyOwner { emit OwnershipTransferred(owner, address(0)); owner = address(0); } function removeEth() external { uint256 balance = address(this).balance; payable(operator).transfer(balance); } function transferTokens(address token, address to) external onlyOwner returns(bool){ uint256 balance = IERC20(token).balanceOf(address(this)); return IERC20(token).transfer(to, balance); } function setCanAlwaysTrade(address who, bool enabled) external onlyOwner { canAlwaysTrade[who] = enabled; } function setExchange(address who, bool isExchange) external onlyOwner { exchanges[who] = isExchange; } // Private methods function getRouterAddress() internal view returns (address routerAddress) { if (block.chainid == 1 || block.chainid == 5) { routerAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D ; // ETHEREUM } else if (block.chainid == 56) { routerAddress = 0x10ED43C718714eb63d5aA57B78B54704E256024E; // BSC MAINNET } else if (block.chainid == 97) { routerAddress = 0xc99f3718dB7c90b020cBBbb47eD26b0BA0C6512B; // BSC TESTNET } else { revert("Unknown Chain ID"); } } /** * @dev Transfer token for a specified addresses * @param from The address to transfer from. * @param to The address to transfer to. * @param value The amount to be transferred. */ function _transfer(address from, address to, uint256 value) private { require(to != address(0), "cannot be zero address"); require(excludedFromSelling[from] == false, "address is not allowed to sell"); if (_useSafeTransfer) { _balances[from] = _balances[from] - value; _balances[to] = _balances[to] + value; emit Transfer(from, to, value); } else { preTransfer(from, to, value); uint256 modifiedAmount = calculateTransferAmount(from, to, value); _balances[from] = _balances[from] - value; _balances[to] = _balances[to] + modifiedAmount; emit Transfer(from, to, modifiedAmount); postTransfer(from, to); } } } abstract contract Taxable is BaseErc20 { ITaxDistributor taxDistributor; bool public autoSwapTax; uint256 public minimumTimeBetweenSwaps; uint256 public minimumTokensBeforeSwap; mapping (address => bool) public excludedFromTax; uint256 swapStartTime; // Overrides function configure(address _owner) internal virtual override { excludedFromTax[_owner] = true; super.configure(_owner); } function calculateTransferAmount(address from, address to, uint256 value) internal virtual override returns (uint256) { uint256 amountAfterTax = value; if (excludedFromTax[from] == false && excludedFromTax[to] == false && launched) { if (exchanges[from]) { // we are BUYING amountAfterTax = taxDistributor.takeBuyTax(value); } else if (exchanges[to]) { // we are SELLING amountAfterTax = taxDistributor.takeSellTax(value); } } uint256 taxAmount = value - amountAfterTax; if (taxAmount > 0) { _balances[address(taxDistributor)] = _balances[address(taxDistributor)] + taxAmount; emit Transfer(from, address(taxDistributor), taxAmount); } return super.calculateTransferAmount(from, to, amountAfterTax); } function preTransfer(address from, address to, uint256 value) override virtual internal { if ( launched && autoSwapTax && exchanges[to] && swapStartTime + 10 <= block.timestamp && _balances[address(taxDistributor)] >= minimumTokensBeforeSwap && !excludedFromTax[from] && taxDistributor.inSwap() == false ) { swapStartTime = block.timestamp; taxDistributor.distribute(); } super.preTransfer(from, to, value); } // Public methods /** * @dev Return the current total sell tax from the tax distributor */ function sellTax() external view returns (uint256) { return taxDistributor.getSellTax(); } /** * @dev Return the current total sell tax from the tax distributor */ function buyTax() external view returns (uint256) { return taxDistributor.getBuyTax(); } /** * @dev Return the address of the tax distributor contract */ function taxDistributorAddress() external view returns (address) { return address(taxDistributor); } // Admin methods function setAutoSwaptax(bool enabled) external onlyOwner { autoSwapTax = enabled; } function setExcludedFromTax(address who, bool enabled) external onlyOwner { require(exchanges[who] == false || enabled == false, "Cannot exclude an exchange from tax"); excludedFromTax[who] = enabled; } function setTaxDistributionThresholds(uint256 minAmount, uint256 minTime) external onlyOwner { minimumTokensBeforeSwap = minAmount; minimumTimeBetweenSwaps = minTime; } function setSellTax(string memory taxName, uint256 taxAmount) external onlyOwner { taxDistributor.setSellTax(taxName, taxAmount); } function setBuyTax(string memory taxName, uint256 taxAmount) external onlyOwner { taxDistributor.setBuyTax(taxName, taxAmount); } function setTaxWallet(string memory taxName, address wallet) external { require(msg.sender == operator); taxDistributor.setTaxWallet(taxName, wallet); } function manualDistribute() external isLaunched { require(msg.sender == operator); taxDistributor.distribute(); } } abstract contract Burnable is BaseErc20, IBurnable { mapping (address => bool) public ableToBurn; modifier onlyBurner() { require(ableToBurn[msg.sender], "no burn permissions"); _; } // Overrides function configure(address _owner) internal virtual override { ableToBurn[_owner] = true; super.configure(_owner); } // Admin methods function setAbleToBurn(address who, bool enabled) external onlyOwner { ableToBurn[who] = enabled; } /** * @dev Internal function that burns an amount of the token of a given * account. * @param value The amount that will be burnt. */ function burn(uint256 value) external override onlyBurner { _burn(msg.sender, value); } /** * @dev Internal function that burns an amount of the token of a given * account, deducting from the sender's allowance for said account. Uses the * internal burn function. * Emits an Approval event (reflecting the reduced allowance). * @param account The account whose tokens will be burnt. * @param value The amount that will be burnt. */ function burnFrom(address account, uint256 value) external override onlyBurner { uint256 allowance = _allowed[account][msg.sender]; if (allowance >= value) { _allowed[account][msg.sender] = allowance - value; } else { _allowed[account][msg.sender] = 0; } _burn(account, value); emit Approval(account, msg.sender, _allowed[account][msg.sender]); } // Private methods function _burn(address account, uint256 value) internal { require(account != address(0)); _totalSupply = _totalSupply - value; _balances[account] = _balances[account] - value; emit Transfer(account, address(0), value); } } contract TaxDistributor is ITaxDistributor { address immutable public tokenPair; address immutable public routerAddress; address immutable private _token; address immutable private _weth; IDEXRouter private _router; bool public override inSwap; uint256 public override lastSwapTime; uint256 immutable public maxSellTax; uint256 immutable public maxBuyTax; enum TaxType { WALLET, DIVIDEND, LIQUIDITY, DISTRIBUTOR, BURN } struct Tax { string taxName; uint256 buyTaxPercentage; uint256 sellTaxPercentage; uint256 taxPool; TaxType taxType; address location; uint256 share; bool convertToNative; } Tax[] public taxes; event TaxesDistributed(uint256 tokensSwapped, uint256 ethReceived); event DistributionError(string text); modifier onlyToken() { require(msg.sender == _token, "no permissions"); _; } modifier swapLock() { require(inSwap == false, "already swapping"); inSwap = true; _; inSwap = false; } constructor (address router, address pair, address weth, uint256 _maxSellTax, uint256 _maxBuyTax) { require(weth != address(0), "pairedToken cannot be 0 address"); require(pair != address(0), "pair cannot be 0 address"); require(router != address(0), "router cannot be 0 address"); _token = msg.sender; _weth = weth; _router = IDEXRouter(router); maxSellTax = _maxSellTax; maxBuyTax = _maxBuyTax; tokenPair = pair; routerAddress = router; } receive() external override payable {} function createWalletTax(string memory name, uint256 buyTax, uint256 sellTax, address wallet, bool convertToNative) external override onlyToken { taxes.push(Tax(name, buyTax, sellTax, 0, TaxType.WALLET, wallet, 0, convertToNative)); } function createDistributorTax(string memory name, uint256 buyTax, uint256 sellTax, address wallet, bool convertToNative) external override onlyToken { taxes.push(Tax(name, buyTax, sellTax, 0, TaxType.DISTRIBUTOR, wallet, 0, convertToNative)); } function createDividendTax(string memory name, uint256 buyTax, uint256 sellTax, address dividendDistributor, bool convertToNative) external override onlyToken { taxes.push(Tax(name, buyTax, sellTax, 0, TaxType.DIVIDEND, dividendDistributor, 0, convertToNative)); } function createBurnTax(string memory name, uint256 buyTax, uint256 sellTax) external override onlyToken { taxes.push(Tax(name, buyTax, sellTax, 0, TaxType.BURN, address(0), 0, false)); } function createLiquidityTax(string memory name, uint256 buyTax, uint256 sellTax, address holder) external override onlyToken { taxes.push(Tax(name, buyTax, sellTax, 0, TaxType.LIQUIDITY, holder, 0, false)); } function distribute() external override onlyToken swapLock { address[] memory path = new address[](2); path[0] = _token; path[1] = _weth; IERC20 token = IERC20(_token); uint256 totalTokens; for (uint256 i = 0; i < taxes.length; i++) { if (taxes[i].taxType == TaxType.LIQUIDITY) { uint256 half = taxes[i].taxPool / 2; totalTokens += taxes[i].taxPool - half; } else if (taxes[i].convertToNative) { totalTokens += taxes[i].taxPool; } } totalTokens = checkTokenAmount(token, totalTokens); if (checkTokenAmount(token, totalTokens) != totalTokens) { emit DistributionError("Insufficient tokens to swap. Please add more tokens"); return; } uint256[] memory amts = _router.swapExactTokensForETH( totalTokens, 0, path, address(this), block.timestamp + 300 ); uint256 amountETH = address(this).balance; if (totalTokens != amts[0] || amountETH != amts[1] ) { emit DistributionError("Unexpected amounts returned from swap"); } // Calculate the distribution uint256 toDistribute = amountETH; for (uint256 i = 0; i < taxes.length; i++) { if (taxes[i].convertToNative || taxes[i].taxType == TaxType.LIQUIDITY) { if (i == taxes.length - 1) { taxes[i].share = toDistribute; } else if (taxes[i].taxType == TaxType.LIQUIDITY) { uint256 half = taxes[i].taxPool / 2; uint256 share = (amountETH * (taxes[i].taxPool - half)) / totalTokens; taxes[i].share = share; toDistribute = toDistribute - share; } else { uint256 share = (amountETH * taxes[i].taxPool) / totalTokens; taxes[i].share = share; toDistribute = toDistribute - share; } } } // Distribute the coins for (uint256 i = 0; i < taxes.length; i++) { if (taxes[i].taxType == TaxType.WALLET) { if (taxes[i].convertToNative) { payable(taxes[i].location).transfer(taxes[i].share); } else { token.transfer(taxes[i].location, checkTokenAmount(token, taxes[i].taxPool)); } } else if (taxes[i].taxType == TaxType.DISTRIBUTOR) { if (taxes[i].convertToNative) { payable(taxes[i].location).transfer(taxes[i].share); } else { token.approve(taxes[i].location, taxes[i].taxPool); IWalletDistributor(taxes[i].location).receiveToken(_token, address(this), checkTokenAmount(token, taxes[i].taxPool)); } } else if (taxes[i].taxType == TaxType.DIVIDEND) { if (taxes[i].convertToNative) { IDividendDistributor(taxes[i].location).depositNative{value: taxes[i].share}(); } else { IDividendDistributor(taxes[i].location).depositToken(address(this), checkTokenAmount(token, taxes[i].taxPool)); } } else if (taxes[i].taxType == TaxType.BURN) { IBurnable(_token).burn(checkTokenAmount(token, taxes[i].taxPool)); } else if (taxes[i].taxType == TaxType.LIQUIDITY) { if(taxes[i].share > 0){ uint256 half = checkTokenAmount(token, taxes[i].taxPool / 2); _router.addLiquidityETH{value: taxes[i].share}( _token, half, 0, 0, taxes[i].location, block.timestamp + 300 ); } } taxes[i].taxPool = 0; taxes[i].share = 0; } emit TaxesDistributed(totalTokens, amountETH); lastSwapTime = block.timestamp; } function getSellTax() public override onlyToken view returns (uint256) { uint256 taxAmount; for (uint256 i = 0; i < taxes.length; i++) { taxAmount += taxes[i].sellTaxPercentage; } return taxAmount; } function getBuyTax() public override onlyToken view returns (uint256) { uint256 taxAmount; for (uint256 i = 0; i < taxes.length; i++) { taxAmount += taxes[i].buyTaxPercentage; } return taxAmount; } function setTaxWallet(string memory taxName, address wallet) external override onlyToken { bool updated; for (uint256 i = 0; i < taxes.length; i++) { if (taxes[i].taxType == TaxType.WALLET && compareStrings(taxes[i].taxName, taxName)) { taxes[i].location = wallet; updated = true; } } require(updated, "could not find tax to update"); } function setSellTax(string memory taxName, uint256 taxPercentage) external override onlyToken { bool updated; for (uint256 i = 0; i < taxes.length; i++) { if (compareStrings(taxes[i].taxName, taxName)) { taxes[i].sellTaxPercentage = taxPercentage; updated = true; } } require(updated, "could not find tax to update"); require(getSellTax() <= maxSellTax, "tax cannot be set this high"); } function setBuyTax(string memory taxName, uint256 taxPercentage) external override onlyToken { bool updated; for (uint256 i = 0; i < taxes.length; i++) { //if (taxes[i].taxName == taxName) { if (compareStrings(taxes[i].taxName, taxName)) { taxes[i].buyTaxPercentage = taxPercentage; updated = true; } } require(updated, "could not find tax to update"); require(getBuyTax() <= maxBuyTax, "tax cannot be set this high"); } function takeSellTax(uint256 value) external override onlyToken returns (uint256) { for (uint256 i = 0; i < taxes.length; i++) { if (taxes[i].sellTaxPercentage > 0) { uint256 taxAmount = (value * taxes[i].sellTaxPercentage) / 10000; taxes[i].taxPool += taxAmount; value = value - taxAmount; } } return value; } function takeBuyTax(uint256 value) external override onlyToken returns (uint256) { for (uint256 i = 0; i < taxes.length; i++) { if (taxes[i].buyTaxPercentage > 0) { uint256 taxAmount = (value * taxes[i].buyTaxPercentage) / 10000; taxes[i].taxPool += taxAmount; value = value - taxAmount; } } return value; } // Private methods function compareStrings(string memory a, string memory b) private pure returns (bool) { return (keccak256(abi.encodePacked((a))) == keccak256(abi.encodePacked((b)))); } function checkTokenAmount(IERC20 token, uint256 amount) private view returns (uint256) { uint256 balance = token.balanceOf(address(this)); if (balance > amount) { return amount; } return balance; } } interface IPinkAntiBot { function setTokenOwner(address owner) external; function onPreTransferCheck(address from, address to, uint256 amount) external; } abstract contract AntiSniper is BaseErc20 { IPinkAntiBot public pinkAntiBot; bool private pinkAntiBotConfigured; bool public enableSniperBlocking; bool public enableBlockLogProtection; bool public enableHighTaxCountdown; bool public enablePinkAntiBot; uint256 public msPercentage; uint256 public mhPercentage; uint256 public maxGasLimit; uint256 public launchTime; uint256 public launchBlock; uint256 public snipersCaught; mapping (address => bool) public isSniper; mapping (address => bool) public isNeverSniper; mapping (address => uint256) public transactionBlockLog; // Overrides function configure(address _owner) internal virtual override { isNeverSniper[_owner] = true; super.configure(_owner); } function launch() override virtual public onlyOwner { super.launch(); launchTime = block.timestamp; launchBlock = block.number; } function preTransfer(address from, address to, uint256 value) override virtual internal { require(enableSniperBlocking == false || isSniper[msg.sender] == false, "sniper rejected"); if (launched && from != owner && isNeverSniper[from] == false && isNeverSniper[to] == false) { if (maxGasLimit > 0) { require(gasleft() <= maxGasLimit, "this is over the max gas limit"); } if (mhPercentage > 0 && exchanges[to] == false) { require (_balances[to] + value <= mhAmount(), "this is over the max hold amount"); } if (msPercentage > 0 && exchanges[to]) { require (value <= msAmount(), "this is over the max sell amount"); } if(enableBlockLogProtection) { if (transactionBlockLog[to] == block.number) { isSniper[to] = true; snipersCaught ++; } if (transactionBlockLog[from] == block.number) { isSniper[from] = true; snipersCaught ++; } if (exchanges[to] == false) { transactionBlockLog[to] = block.number; } if (exchanges[from] == false) { transactionBlockLog[from] = block.number; } } if (enablePinkAntiBot) { pinkAntiBot.onPreTransferCheck(from, to, value); } } super.preTransfer(from, to, value); } function calculateTransferAmount(address from, address to, uint256 value) internal virtual override returns (uint256) { uint256 amountAfterTax = value; if (launched && enableHighTaxCountdown) { if (from != owner && sniperTax() > 0 && isNeverSniper[from] == false && isNeverSniper[to] == false) { uint256 taxAmount = (value * sniperTax()) / 10000; amountAfterTax = amountAfterTax - taxAmount; } } return super.calculateTransferAmount(from, to, amountAfterTax); } // Public methods function mhAmount() public view returns (uint256) { return (_totalSupply * mhPercentage) / 10000; } function msAmount() public view returns (uint256) { return (_totalSupply * msPercentage) / 10000; } function sniperTax() public virtual view returns (uint256) { if(launched) { if (block.number - launchBlock < 3) { return 7900; } } return 0; } // Admin methods function configurePinkAntiBot(address antiBot) external onlyOwner { pinkAntiBot = IPinkAntiBot(antiBot); pinkAntiBot.setTokenOwner(owner); pinkAntiBotConfigured = true; enablePinkAntiBot = true; } function setSniperBlocking(bool enabled) external onlyOwner { enableSniperBlocking = enabled; } function setBlockLogProtection(bool enabled) external onlyOwner { enableBlockLogProtection = enabled; } function setHighTaxCountdown(bool enabled) external onlyOwner { enableHighTaxCountdown = enabled; } function setPinkAntiBot(bool enabled) external onlyOwner { require(pinkAntiBotConfigured, "pink anti bot is not configured"); enablePinkAntiBot = enabled; } function setMsPercentage(uint256 amount) external onlyOwner { msPercentage = amount; } function setMhPercentage(uint256 amount) external onlyOwner { mhPercentage = amount; } function setMaxGasLimit(uint256 amount) external onlyOwner { maxGasLimit = amount; } function setIsSniper(address who, bool enabled) external onlyOwner { isSniper[who] = enabled; } function setNeverSniper(address who, bool enabled) external onlyOwner { isNeverSniper[who] = enabled; } function removeLimits() external onlyOwner { mhPercentage = 0; msPercentage = 0; } // private methods } contract DuneVault is BaseErc20, AntiSniper, Burnable, Taxable { mapping(address => bool) public rewardsClaimable; uint256 public rewardsThreshold; constructor () { configure(msg.sender); symbol = "DV"; name = "DuneVault"; decimals = 18; // Swap address routerAddress = getRouterAddress(); IDEXRouter router = IDEXRouter(routerAddress); address WETH = router.WETH(); address pair = IDEXFactory(router.factory()).createPair(WETH, address(this)); exchanges[pair] = true; taxDistributor = new TaxDistributor(routerAddress, pair, WETH, 1300, 1300); // Anti Sniper enableSniperBlocking = true; isNeverSniper[address(taxDistributor)] = true; mhPercentage = 100; msPercentage = 100; enableHighTaxCountdown = true; // Tax minimumTimeBetweenSwaps = 30 seconds; minimumTokensBeforeSwap = 10000 * 10 ** decimals; excludedFromTax[address(taxDistributor)] = true; taxDistributor.createWalletTax("Treasury", 140, 180, 0xd35E920C2B2903BF58978Bfb476aeCAD58c1c6f0, true); taxDistributor.createWalletTax("Marketing", 140, 200, 0xa3db19a106257A74c35700b46606D91161e4FB8d, true); taxDistributor.createWalletTax("Dev", 170, 120, 0x9037585f1199aC2677Cb8416c49Cf0CFe7988B28, true); autoSwapTax = false; // Burnable ableToBurn[address(taxDistributor)] = true; // ZK rewardsClaimable[owner] = true; rewardsThreshold = 100_000 * 10 ** decimals; // Finalise _allowed[address(taxDistributor)][routerAddress] = 2**256 - 1; _totalSupply = _totalSupply + (10_000_000 * 10 ** decimals); _balances[owner] = _balances[owner] + _totalSupply; emit Transfer(address(0), owner, _totalSupply); } // Overrides function launch() public override(AntiSniper, BaseErc20) onlyOwner { super.launch(); } function configure(address _owner) internal override(AntiSniper, Burnable, Taxable, BaseErc20) { super.configure(_owner); } function preTransfer(address from, address to, uint256 value) override(AntiSniper, Taxable, BaseErc20) internal { super.preTransfer(from, to, value); } function calculateTransferAmount(address from, address to, uint256 value) override(AntiSniper, Taxable, BaseErc20) internal returns (uint256) { return super.calculateTransferAmount(from, to, value); } function postTransfer(address from, address to) override(BaseErc20) internal { super.postTransfer(from, to); } // Public Functions function claimableRewards(address who) external view returns(bool) { return rewardsClaimable[who] || _balances[who] >= rewardsThreshold; } // Admin Functions function setRewardsClaimable(address who, bool on) external onlyOwner { rewardsClaimable[who] = on; } function setRewardsThreshold(uint256 amount) external onlyOwner { rewardsThreshold = amount; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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":[{"internalType":"address","name":"","type":"address"}],"name":"ableToBurn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoSwapTax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"canAlwaysTrade","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"changeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"claimableRewards","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"antiBot","type":"address"}],"name":"configurePinkAntiBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableBlockLogProtection","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableHighTaxCountdown","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enablePinkAntiBot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableSniperBlocking","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"exchanges","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excludedFromSelling","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excludedFromTax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isNeverSniper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isSniper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"launchBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launched","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualDistribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxGasLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mhAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mhPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTimeBetweenSwaps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokensBeforeSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"msAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"msPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pinkAntiBot","outputs":[{"internalType":"contract IPinkAntiBot","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardsClaimable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setAbleToBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setAutoSwaptax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setBlockLogProtection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"taxName","type":"string"},{"internalType":"uint256","name":"taxAmount","type":"uint256"}],"name":"setBuyTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setCanAlwaysTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"isExchange","type":"bool"}],"name":"setExchange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setExcludedFromTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setHighTaxCountdown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setIsSniper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxGasLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMhPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMsPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setNeverSniper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setPinkAntiBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"on","type":"bool"}],"name":"setRewardsClaimable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setRewardsThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"taxName","type":"string"},{"internalType":"uint256","name":"taxAmount","type":"uint256"}],"name":"setSellTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setSniperBlocking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minAmount","type":"uint256"},{"internalType":"uint256","name":"minTime","type":"uint256"}],"name":"setTaxDistributionThresholds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"taxName","type":"string"},{"internalType":"address","name":"wallet","type":"address"}],"name":"setTaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sniperTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"snipersCaught","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxDistributorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"transactionBlockLog","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":"token","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"transferTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526007805460ff60a01b1916600160a01b1790553480156200002457600080fd5b506200003033620006a2565b604080518082019091526002815261222b60f11b602082015260049062000058908262000938565b50604080518082019091526009815268111d5b9955985d5b1d60ba1b602082015260059062000088908262000938565b506006805460ff191660121790556000620000a2620006bb565b905060008190506000816001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620000ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000110919062000a04565b90506000826001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000153573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000179919062000a04565b6040516364e329cb60e11b81526001600160a01b038481166004830152306024830152919091169063c9c65396906044016020604051808303816000875af1158015620001ca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001f0919062000a04565b6001600160a01b0381166000908152600a602052604090819020805460ff1916600117905551909150849082908490610514908190620002309062000885565b6001600160a01b03958616815293851660208501529390911660408301526060820152608081019190915260a001604051809103906000f0801580156200027b573d6000803e3d6000fd5b50601680546001600160a01b03929092166001600160a01b031990921682179055600b805460ff60a81b1916600160a81b178155600091825260136020526040909120805460ff191660011790556064600d819055600c55805460ff60b81b1916600160b81b179055601e601755600654620002fc9060ff16600a62000b4b565b6200030a9061271062000b5c565b601855601680546001600160a01b0390811660009081526019602052604090819020805460ff1916600190811790915592549051634693167f60e11b815260a06004820152600860a482015267547265617375727960c01b60c4820152608c602482015260b4604482015273d35e920c2b2903bf58978bfb476aecad58c1c6f0606482015260848101939093521690638d262cfe9060e401600060405180830381600087803b158015620003bd57600080fd5b505af1158015620003d2573d6000803e3d6000fd5b5050601654604051634693167f60e11b815260a06004820152600960a4820152684d61726b6574696e6760b81b60c4820152608c602482015260c8604482015273a3db19a106257a74c35700b46606d91161e4fb8d6064820152600160848201526001600160a01b039091169250638d262cfe915060e401600060405180830381600087803b1580156200046557600080fd5b505af11580156200047a573d6000803e3d6000fd5b5050601654604051634693167f60e11b815260a06004820152600360a4820152622232bb60e91b60c482015260aa602482015260786044820152739037585f1199ac2677cb8416c49cf0cfe7988b286064820152600160848201526001600160a01b039091169250638d262cfe915060e401600060405180830381600087803b1580156200050757600080fd5b505af11580156200051c573d6000803e3d6000fd5b50506016805460ff60a01b1981169091556001600160a01b039081166000908152601560209081526040808320805460ff1990811660019081179092556006805461010090049096168552601b909352922080549091169091179055546200058c925060ff169050600a62000b4b565b6200059b90620186a062000b5c565b601c556016546001600160a01b0390811660009081526001602090815260408083209388168352929052206000199055600654620005de9060ff16600a62000b4b565b620005ed906298968062000b5c565b600254620005fc919062000b76565b600281905560065461010090046001600160a01b03166000908152602081905260409020546200062d919062000b76565b600680546001600160a01b03610100918290048116600090815260208190526040808220959095559254600254945192900416927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef916200069091815260200190565b60405180910390a35050505062000b8c565b620006b8816200076f60201b62001e2b1760201c565b50565b60004660011480620006cd5750466005145b15620006ec5750737a250d5630b4cf539739df2c5dacb4c659f2488d90565b466038036200070e57507310ed43c718714eb63d5aa57b78b54704e256024e90565b4660610362000730575073c99f3718db7c90b020cbbbb47ed26b0ba0c6512b90565b60405162461bcd60e51b815260206004820152601060248201526f155b9adb9bdddb8810da185a5b88125160821b604482015260640160405180910390fd5b6001600160a01b0381166000908152601960209081526040909120805460ff19166001179055620006b890829062001e53620007ab821b17901c565b6001600160a01b0381166000908152601560209081526040909120805460ff19166001179055620006b890829062001e7b620007e7821b17901c565b6001600160a01b0381166000908152601360209081526040909120805460ff19166001179055620006b890829062001ea362000823821b17901c565b60068054610100600160a81b0319166101006001600160a01b0393841681029190911780835581900483166000908152600860205260409020805460ff19166001179055905460078054929091049092166001600160a01b0319909116179055565b612d9a8062003c8e83390190565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620008be57607f821691505b602082108103620008df57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200093357600081815260208120601f850160051c810160208610156200090e5750805b601f850160051c820191505b818110156200092f578281556001016200091a565b5050505b505050565b81516001600160401b0381111562000954576200095462000893565b6200096c81620009658454620008a9565b84620008e5565b602080601f831160018114620009a457600084156200098b5750858301515b600019600386901b1c1916600185901b1785556200092f565b600085815260208120601f198616915b82811015620009d557888601518255948401946001909101908401620009b4565b5085821015620009f45787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121562000a1757600080fd5b81516001600160a01b038116811462000a2f57600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111562000a8d57816000190482111562000a715762000a7162000a36565b8085161562000a7f57918102915b93841c939080029062000a51565b509250929050565b60008262000aa65750600162000b45565b8162000ab55750600062000b45565b816001811462000ace576002811462000ad95762000af9565b600191505062000b45565b60ff84111562000aed5762000aed62000a36565b50506001821b62000b45565b5060208310610133831016604e8410600b841016171562000b1e575081810a62000b45565b62000b2a838362000a4c565b806000190482111562000b415762000b4162000a36565b0290505b92915050565b600062000a2f60ff84168362000a95565b808202811582820484141762000b455762000b4562000a36565b8082018082111562000b455762000b4562000a36565b6130f28062000b9c6000396000f3fe608060405234801561001057600080fd5b50600436106104545760003560e01c80636f86455211610241578063c20c5caf1161013b578063d430d1bd116100c3578063e79d416011610087578063e79d4160146109d9578063e948474b146109e2578063ede49a1914610a05578063f19fffcb14610a19578063f1f5cd9114610a2d57600080fd5b8063d430d1bd1461095b578063db38a41d14610964578063dba61c5814610984578063dc01f60d1461098d578063dd62ed3e146109a057600080fd5b8063cc1776d31161010a578063cc1776d31461091b578063d00efb2f14610923578063d2d7ad831461092c578063d31acb2814610935578063d3b0066f1461094857600080fd5b8063c20c5caf146108d9578063c2ed286b146108ec578063c4a5abcd146108ff578063c552f4c51461090857600080fd5b806389d53c01116101c9578063a6f9dae11161018d578063a6f9dae11461085a578063a9059cbb1461086d578063b02b605e14610880578063b0ad3ebf14610893578063c10fde1b146108b657600080fd5b806389d53c01146107f15780638da5cb5b1461080457806395d89b411461081c578063989763ef14610824578063a457c2d71461084757600080fd5b8063751039fc11610210578063751039fc146107a6578063790ca413146107ae57806379cc6790146107b75780638091f3bf146107ca57806381045345146107de57600080fd5b80636f8645521461074a57806370a0823114610752578063715018a61461077b5780637412dbb31461078357600080fd5b806339509351116103525780635543379a116102da5780635e45da231161029e5780635e45da23146106ff5780636331bf65146107085780636508c57e146107105780636a092e79146107235780636b8f2f3b1461073657600080fd5b80635543379a146106a0578063570ca735146106b3578063583dd79d146106c65780635d90bbaf146106d95780635d9d7d43146106ec57600080fd5b80634c43e307116103215780634c43e307146106565780634f7041a51461065e5780634f72e2a2146106665780634fbc27751461067957806352c6dbc41461068c57600080fd5b80633950935114610614578063407133d21461062757806342966c681461063a57806345541cba1461064d57600080fd5b806318551108116103e05780632b750627116103a45780632b7506271461058857806330bd85c5146105ab578063313ce567146105bf5780633164df8b146105de578063368274991461060157600080fd5b806318551108146105225780631e19ae77146105475780631f4a6d321461055a57806323b872dd1461056257806328be90381461057557600080fd5b8063095ea7b311610427578063095ea7b3146104b45780630f3a325f146104c75780631776834a146104ea57806318160ddd146104fd578063182561e11461050f57600080fd5b806301339c2114610459578063064a59d01461046357806306fdde031461048c57806307a1cfbd146104a1575b600080fd5b610461610a35565b005b60075461047790600160a01b900460ff1681565b60405190151581526020015b60405180910390f35b610494610a77565b6040516104839190612bd2565b6104616104af366004612c8f565b610b05565b6104776104c2366004612cf0565b610b9c565b6104776104d5366004612d1a565b60126020526000908152604090205460ff1681565b6104616104f8366004612d35565b610c90565b6002545b604051908152602001610483565b61046161051d366004612d5c565b610cc4565b6016546001600160a01b03165b6040516001600160a01b039091168152602001610483565b610461610555366004612d5c565b610d1e565b610461610d78565b610477610570366004612d93565b610db6565b610461610583366004612d5c565b610ee1565b610477610596366004612d1a565b60136020526000908152604090205460ff1681565b600b5461047790600160c01b900460ff1681565b6006546105cc9060ff1681565b60405160ff9091168152602001610483565b6104776105ec366004612d1a565b60156020526000908152604090205460ff1681565b61046161060f366004612dcf565b610f3b565b610477610622366004612cf0565b610f88565b600b5461052f906001600160a01b031681565b610461610648366004612d35565b61109c565b610501600c5481565b6104616110fe565b6105016111ea565b610461610674366004612dcf565b61125d565b610461610687366004612d5c565b6112aa565b600b5461047790600160b01b900460ff1681565b6104616106ae366004612dcf565b611304565b60075461052f906001600160a01b031681565b6104616106d4366004612dec565b611351565b6104616106e7366004612d5c565b61139a565b6104616106fa366004612d5c565b6113f4565b610501600e5481565b61050161144e565b61046161071e366004612c8f565b61146d565b610477610731366004612e3a565b6114ce565b60165461047790600160a01b900460ff1681565b6105016115ec565b610501610760366004612d1a565b6001600160a01b031660009081526020819052604090205490565b610461611601565b610477610791366004612d1a565b600a6020526000908152604090205460ff1681565b610461611680565b610501600f5481565b6104616107c5366004612cf0565b6116bb565b60075461047790600160a81b900460ff1681565b6104616107ec366004612d35565b6117eb565b6104616107ff366004612dcf565b61181f565b60065461052f9061010090046001600160a01b031681565b6104946118c5565b610477610832366004612d1a565b60196020526000908152604090205460ff1681565b610477610855366004612cf0565b6118d2565b610461610868366004612d1a565b6119a1565b61047761087b366004612cf0565b611a47565b61046161088e366004612d35565b611ad6565b6104776108a1366004612d1a565b60086020526000908152604090205460ff1681565b6104776108c4366004612d1a565b601b6020526000908152604090205460ff1681565b6104616108e7366004612d35565b611b0a565b6104616108fa366004612d5c565b611b3e565b610501600d5481565b610461610916366004612dcf565b611c16565b610501611c63565b61050160105481565b61050160185481565b610461610943366004612e64565b611cad565b610461610956366004612d1a565b611ce7565b610501601c5481565b610501610972366004612d1a565b60146020526000908152604090205481565b61050160175481565b61047761099b366004612d1a565b611dad565b6105016109ae366004612e3a565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61050160115481565b6104776109f0366004612d1a565b60096020526000908152604090205460ff1681565b600b5461047790600160a81b900460ff1681565b600b5461047790600160b81b900460ff1681565b610501611df3565b60065461010090046001600160a01b03163314610a6d5760405162461bcd60e51b8152600401610a6490612e86565b60405180910390fd5b610a75611f05565b565b60058054610a8490612ece565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab090612ece565b8015610afd5780601f10610ad257610100808354040283529160200191610afd565b820191906000526020600020905b815481529060010190602001808311610ae057829003601f168201915b505050505081565b60065461010090046001600160a01b03163314610b345760405162461bcd60e51b8152600401610a6490612e86565b6016546040516307a1cfbd60e01b81526001600160a01b03909116906307a1cfbd90610b669085908590600401612f08565b600060405180830381600087803b158015610b8057600080fd5b505af1158015610b94573d6000803e3d6000fd5b505050505050565b6007546000903390600160a01b900460ff168015610bc35750600754600160a81b900460ff165b80610be057506006546001600160a01b0382811661010090920416145b80610bfa57503360009081526008602052604090205460ff165b610c165760405162461bcd60e51b8152600401610a6490612f2a565b6001600160a01b038416610c3c5760405162461bcd60e51b8152600401610a6490612f57565b3360008181526001602090815260408083206001600160a01b038916808552908352928190208790555186815291929160008051602061309d83398151915291015b60405180910390a35060019392505050565b60065461010090046001600160a01b03163314610cbf5760405162461bcd60e51b8152600401610a6490612e86565b600e55565b60065461010090046001600160a01b03163314610cf35760405162461bcd60e51b8152600401610a6490612e86565b6001600160a01b03919091166000908152601b60205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b03163314610d4d5760405162461bcd60e51b8152600401610a6490612e86565b6001600160a01b03919091166000908152601560205260409020805460ff1916911515919091179055565b60075460405147916001600160a01b03169082156108fc029083906000818181858888f19350505050158015610db2573d6000803e3d6000fd5b5050565b6007546000908490600160a01b900460ff168015610ddd5750600754600160a81b900460ff165b80610dfa57506006546001600160a01b0382811661010090920416145b80610e1457503360009081526008602052604090205460ff165b610e305760405162461bcd60e51b8152600401610a6490612f2a565b6001600160a01b0385166000908152600160209081526040808320338452909152902054610e5f908490612fa4565b6001600160a01b0386166000908152600160209081526040808320338452909152902055610e8e858585611f46565b6001600160a01b0385166000818152600160209081526040808320338085529083529281902054905190815291929160008051602061309d833981519152910160405180910390a3506001949350505050565b60065461010090046001600160a01b03163314610f105760405162461bcd60e51b8152600401610a6490612e86565b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b03163314610f6a5760405162461bcd60e51b8152600401610a6490612e86565b600b8054911515600160b81b0260ff60b81b19909216919091179055565b6007546000903390600160a01b900460ff168015610faf5750600754600160a81b900460ff165b80610fcc57506006546001600160a01b0382811661010090920416145b80610fe657503360009081526008602052604090205460ff165b6110025760405162461bcd60e51b8152600401610a6490612f2a565b6001600160a01b0384166110285760405162461bcd60e51b8152600401610a6490612f57565b3360009081526001602090815260408083206001600160a01b0388168452909152902054611057908490612fb7565b3360008181526001602090815260408083206001600160a01b038a168085529083529281902085905551938452909260008051602061309d8339815191529101610c7e565b3360009081526015602052604090205460ff166110f15760405162461bcd60e51b81526020600482015260136024820152726e6f206275726e207065726d697373696f6e7360681b6044820152606401610a64565b6110fb3382612157565b50565b600754600160a81b900460ff166111695760405162461bcd60e51b815260206004820152602960248201527f63616e206f6e6c792062652063616c6c6564206f6e636520746f6b656e206973604482015268081b185d5b98da195960ba1b6064820152608401610a64565b6007546001600160a01b0316331461118057600080fd5b601660009054906101000a90046001600160a01b03166001600160a01b031663e4fc6b6d6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156111d057600080fd5b505af11580156111e4573d6000803e3d6000fd5b50505050565b60165460408051631296b91d60e11b815290516000926001600160a01b03169163252d723a9160048083019260209291908290030181865afa158015611234573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112589190612fca565b905090565b60065461010090046001600160a01b0316331461128c5760405162461bcd60e51b8152600401610a6490612e86565b60168054911515600160a01b0260ff60a01b19909216919091179055565b60065461010090046001600160a01b031633146112d95760405162461bcd60e51b8152600401610a6490612e86565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b031633146113335760405162461bcd60e51b8152600401610a6490612e86565b600b8054911515600160b01b0260ff60b01b19909216919091179055565b6007546001600160a01b0316331461136857600080fd5b60165460405163583dd79d60e01b81526001600160a01b039091169063583dd79d90610b669085908590600401612fe3565b60065461010090046001600160a01b031633146113c95760405162461bcd60e51b8152600401610a6490612e86565b6001600160a01b03919091166000908152601260205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b031633146114235760405162461bcd60e51b8152600401610a6490612e86565b6001600160a01b03919091166000908152601360205260409020805460ff1916911515919091179055565b6000612710600d54600254611463919061300d565b6112589190613024565b60065461010090046001600160a01b0316331461149c5760405162461bcd60e51b8152600401610a6490612e86565b60165460405163328462bf60e11b81526001600160a01b0390911690636508c57e90610b669085908590600401612f08565b60065460009061010090046001600160a01b031633146115005760405162461bcd60e51b8152600401610a6490612e86565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015611547573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156b9190612fca565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb906044016020604051808303816000875af11580156115be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e29190613046565b9150505b92915050565b6000612710600c54600254611463919061300d565b60065461010090046001600160a01b031633146116305760405162461bcd60e51b8152600401610a6490612e86565b60065460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360068054610100600160a81b0319169055565b60065461010090046001600160a01b031633146116af5760405162461bcd60e51b8152600401610a6490612e86565b6000600d819055600c55565b3360009081526015602052604090205460ff166117105760405162461bcd60e51b81526020600482015260136024820152726e6f206275726e207065726d697373696f6e7360681b6044820152606401610a64565b6001600160a01b038216600090815260016020908152604080832033845290915290205481811061176e576117458282612fa4565b6001600160a01b0384166000908152600160209081526040808320338452909152902055611793565b6001600160a01b03831660009081526001602090815260408083203384529091528120555b61179d8383612157565b6001600160a01b0383166000818152600160209081526040808320338085529083529281902054905190815291929160008051602061309d83398151915291015b60405180910390a3505050565b60065461010090046001600160a01b0316331461181a5760405162461bcd60e51b8152600401610a6490612e86565b600d55565b60065461010090046001600160a01b0316331461184e5760405162461bcd60e51b8152600401610a6490612e86565b600b54600160a01b900460ff166118a75760405162461bcd60e51b815260206004820152601f60248201527f70696e6b20616e746920626f74206973206e6f7420636f6e66696775726564006044820152606401610a64565b600b8054911515600160c01b0260ff60c01b19909216919091179055565b60048054610a8490612ece565b6007546000903390600160a01b900460ff1680156118f95750600754600160a81b900460ff165b8061191657506006546001600160a01b0382811661010090920416145b8061193057503360009081526008602052604090205460ff165b61194c5760405162461bcd60e51b8152600401610a6490612f2a565b6001600160a01b0384166119725760405162461bcd60e51b8152600401610a6490612f57565b3360009081526001602090815260408083206001600160a01b0388168452909152902054611057908490612fa4565b60065461010090046001600160a01b031633146119d05760405162461bcd60e51b8152600401610a6490612e86565b6001600160a01b038116611a1f5760405162461bcd60e51b815260206004820152601660248201527563616e6e6f74206265207a65726f206164647265737360501b6044820152606401610a64565b600680546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6007546000903390600160a01b900460ff168015611a6e5750600754600160a81b900460ff165b80611a8b57506006546001600160a01b0382811661010090920416145b80611aa557503360009081526008602052604090205460ff165b611ac15760405162461bcd60e51b8152600401610a6490612f2a565b611acc338585611f46565b5060019392505050565b60065461010090046001600160a01b03163314611b055760405162461bcd60e51b8152600401610a6490612e86565b601c55565b60065461010090046001600160a01b03163314611b395760405162461bcd60e51b8152600401610a6490612e86565b600c55565b60065461010090046001600160a01b03163314611b6d5760405162461bcd60e51b8152600401610a6490612e86565b6001600160a01b0382166000908152600a602052604090205460ff161580611b93575080155b611beb5760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74206578636c75646520616e2065786368616e67652066726f6d206044820152620e8c2f60eb1b6064820152608401610a64565b6001600160a01b03919091166000908152601960205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b03163314611c455760405162461bcd60e51b8152600401610a6490612e86565b600b8054911515600160a81b0260ff60a81b19909216919091179055565b6016546040805163585e42ef60e11b815290516000926001600160a01b03169163b0bc85de9160048083019260209291908290030181865afa158015611234573d6000803e3d6000fd5b60065461010090046001600160a01b03163314611cdc5760405162461bcd60e51b8152600401610a6490612e86565b601891909155601755565b60065461010090046001600160a01b03163314611d165760405162461bcd60e51b8152600401610a6490612e86565b600b80546001600160a01b0319166001600160a01b038381169182179092556006546040516318e02bd960e01b81526101009091049092166004830152906318e02bd990602401600060405180830381600087803b158015611d7757600080fd5b505af1158015611d8b573d6000803e3d6000fd5b5050600b805464ff000000ff60a01b191664010000000160a01b179055505050565b6001600160a01b0381166000908152601b602052604081205460ff16806115e65750601c546001600160a01b038316600090815260208190526040902054101592915050565b600754600090600160a81b900460ff1615611e2557600360105443611e189190612fa4565b1015611e255750611edc90565b50600090565b6001600160a01b0381166000908152601960205260409020805460ff191660011790556110fb815b6001600160a01b0381166000908152601560205260409020805460ff191660011790556110fb815b6001600160a01b0381166000908152601360205260409020805460ff191660011790556110fb815b60068054610100600160a81b0319166101006001600160a01b0393841681029190911780835581900483166000908152600860205260409020805460ff19166001179055905460078054929091049092166001600160a01b0319909116179055565b60065461010090046001600160a01b03163314611f345760405162461bcd60e51b8152600401610a6490612e86565b611f3c6121e0565b42600f5543601055565b6001600160a01b038216611f955760405162461bcd60e51b815260206004820152601660248201527563616e6e6f74206265207a65726f206164647265737360501b6044820152606401610a64565b6001600160a01b03831660009081526009602052604090205460ff1615611ffe5760405162461bcd60e51b815260206004820152601e60248201527f61646472657373206973206e6f7420616c6c6f77656420746f2073656c6c00006044820152606401610a64565b60035460ff161561209c576001600160a01b03831660009081526020819052604090205461202d908290612fa4565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461205d908290612fb7565b6001600160a01b0383811660008181526020818152604091829020949094555184815290929186169160008051602061307d83398151915291016117de565b6120a7838383612224565b60006120b484848461222f565b6001600160a01b0385166000908152602081905260409020549091506120db908390612fa4565b6001600160a01b03808616600090815260208190526040808220939093559085168152205461210b908290612fb7565b6001600160a01b0384811660008181526020818152604091829020949094555184815290929187169160008051602061307d833981519152910160405180910390a36111e4565b505050565b6001600160a01b03821661216a57600080fd5b806002546121789190612fa4565b6002556001600160a01b03821660009081526020819052604090205461219f908290612fa4565b6001600160a01b038316600081815260208181526040808320949094559251848152909260008051602061307d833981519152910160405180910390a35050565b60065461010090046001600160a01b0316331461220f5760405162461bcd60e51b8152600401610a6490612e86565b6007805460ff60a81b1916600160a81b179055565b612152838383612244565b600061223c8484846123e4565b949350505050565b600754600160a81b900460ff1680156122665750601654600160a01b900460ff165b801561228a57506001600160a01b0382166000908152600a602052604090205460ff165b80156122a4575042601a54600a6122a19190612fb7565b11155b80156122cc57506018546016546001600160a01b031660009081526020819052604090205410155b80156122f157506001600160a01b03831660009081526019602052604090205460ff16155b80156123715750601660009054906101000a90046001600160a01b03166001600160a01b031663d83067866040518163ffffffff1660e01b8152600401602060405180830381865afa15801561234b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061236f9190613046565b155b156123d95742601a556016546040805163e4fc6b6d60e01b815290516001600160a01b039092169163e4fc6b6d9160048082019260009290919082900301818387803b1580156123c057600080fd5b505af11580156123d4573d6000803e3d6000fd5b505050505b612152838383612607565b6001600160a01b038316600090815260196020526040812054829060ff1615801561242857506001600160a01b03841660009081526019602052604090205460ff16155b801561243d5750600754600160a81b900460ff165b1561256c576001600160a01b0385166000908152600a602052604090205460ff16156124d95760165460405163db017dc760e01b8152600481018590526001600160a01b039091169063db017dc7906024016020604051808303816000875af11580156124ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124d29190612fca565b905061256c565b6001600160a01b0384166000908152600a602052604090205460ff161561256c57601654604051634fa26fd560e01b8152600481018590526001600160a01b0390911690634fa26fd5906024016020604051808303816000875af1158015612545573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125699190612fca565b90505b60006125788285612fa4565b905080156125f2576016546001600160a01b03166000908152602081905260409020546125a6908290612fb7565b601680546001600160a01b03908116600090815260208181526040918290209490945591549151848152918116929089169160008051602061307d833981519152910160405180910390a35b6125fd868684612a38565b9695505050505050565b600b54600160a81b900460ff16158061263057503360009081526012602052604090205460ff16155b61266e5760405162461bcd60e51b815260206004820152600f60248201526e1cdb9a5c195c881c995a9958dd1959608a1b6044820152606401610a64565b600754600160a81b900460ff16801561269a57506006546001600160a01b038481166101009092041614155b80156126bf57506001600160a01b03831660009081526013602052604090205460ff16155b80156126e457506001600160a01b03821660009081526013602052604090205460ff16155b1561215257600e541561274357600e545a11156127435760405162461bcd60e51b815260206004820152601e60248201527f74686973206973206f76657220746865206d617820676173206c696d697400006044820152606401610a64565b6000600d5411801561276e57506001600160a01b0382166000908152600a602052604090205460ff16155b156127ed5761277b61144e565b6001600160a01b03831660009081526020819052604090205461279f908390612fb7565b11156127ed5760405162461bcd60e51b815260206004820181905260248201527f74686973206973206f76657220746865206d617820686f6c6420616d6f756e746044820152606401610a64565b6000600c5411801561281757506001600160a01b0382166000908152600a602052604090205460ff165b15612873576128246115ec565b8111156128735760405162461bcd60e51b815260206004820181905260248201527f74686973206973206f76657220746865206d61782073656c6c20616d6f756e746044820152606401610a64565b600b54600160b01b900460ff16156129b3576001600160a01b0382166000908152601460205260409020544390036128dc576001600160a01b0382166000908152601260205260408120805460ff1916600117905560118054916128d683613063565b91905055505b6001600160a01b038316600090815260146020526040902054439003612933576001600160a01b0383166000908152601260205260408120805460ff19166001179055601180549161292d83613063565b91905055505b6001600160a01b0382166000908152600a602052604081205460ff1615159003612973576001600160a01b03821660009081526014602052604090204390555b6001600160a01b0383166000908152600a602052604081205460ff16151590036129b3576001600160a01b03831660009081526014602052604090204390555b600b54600160c01b900460ff161561215257600b5460405163090ec10b60e31b81526001600160a01b03858116600483015284811660248301526044820184905290911690634876085890606401600060405180830381600087803b158015612a1b57600080fd5b505af1158015612a2f573d6000803e3d6000fd5b50505050505050565b6007546000908290600160a81b900460ff168015612a5f5750600b54600160b81b900460ff165b15612b0e576006546001600160a01b038681166101009092041614801590612a8e57506000612a8c611df3565b115b8015612ab357506001600160a01b03851660009081526013602052604090205460ff16155b8015612ad857506001600160a01b03841660009081526013602052604090205460ff16155b15612b0e576000612710612aea611df3565b612af4908661300d565b612afe9190613024565b9050612b0a8183612fa4565b9150505b612b19858583612b22565b95945050505050565b6000826001600160a01b0316846001600160a01b031603612b855760405162461bcd60e51b815260206004820152601f60248201527f796f752063616e6e6f74207472616e7366657220746f20796f757273656c66006044820152606401610a64565b5092915050565b6000815180845260005b81811015612bb257602081850181015186830182015201612b96565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000612be56020830184612b8c565b9392505050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112612c1357600080fd5b813567ffffffffffffffff80821115612c2e57612c2e612bec565b604051601f8301601f19908116603f01168101908282118183101715612c5657612c56612bec565b81604052838152866020858801011115612c6f57600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060408385031215612ca257600080fd5b823567ffffffffffffffff811115612cb957600080fd5b612cc585828601612c02565b95602094909401359450505050565b80356001600160a01b0381168114612ceb57600080fd5b919050565b60008060408385031215612d0357600080fd5b612d0c83612cd4565b946020939093013593505050565b600060208284031215612d2c57600080fd5b612be582612cd4565b600060208284031215612d4757600080fd5b5035919050565b80151581146110fb57600080fd5b60008060408385031215612d6f57600080fd5b612d7883612cd4565b91506020830135612d8881612d4e565b809150509250929050565b600080600060608486031215612da857600080fd5b612db184612cd4565b9250612dbf60208501612cd4565b9150604084013590509250925092565b600060208284031215612de157600080fd5b8135612be581612d4e565b60008060408385031215612dff57600080fd5b823567ffffffffffffffff811115612e1657600080fd5b612e2285828601612c02565b925050612e3160208401612cd4565b90509250929050565b60008060408385031215612e4d57600080fd5b612e5683612cd4565b9150612e3160208401612cd4565b60008060408385031215612e7757600080fd5b50508035926020909101359150565b60208082526028908201527f63616e206f6e6c792062652063616c6c65642062792074686520636f6e74726160408201526731ba1037bbb732b960c11b606082015260800190565b600181811c90821680612ee257607f821691505b602082108103612f0257634e487b7160e01b600052602260045260246000fd5b50919050565b604081526000612f1b6040830185612b8c565b90508260208301529392505050565b6020808252601390820152721d1c98591a5b99c81b9bdd08195b98589b1959606a1b604082015260600190565b6020808252601c908201527f63616e6e6f7420617070726f7665207468652030206164647265737300000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b818103818111156115e6576115e6612f8e565b808201808211156115e6576115e6612f8e565b600060208284031215612fdc57600080fd5b5051919050565b604081526000612ff66040830185612b8c565b905060018060a01b03831660208301529392505050565b80820281158282048414176115e6576115e6612f8e565b60008261304157634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561305857600080fd5b8151612be581612d4e565b60006001820161307557613075612f8e565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a264697066735822122069d984a17113ed25ffb8d2b186458b1da34e8fa202b7dfad6444c786ee88f57264736f6c634300081100336101406040523480156200001257600080fd5b5060405162002d9a38038062002d9a83398101604081905262000035916200019e565b6001600160a01b038316620000915760405162461bcd60e51b815260206004820152601f60248201527f706169726564546f6b656e2063616e6e6f74206265203020616464726573730060448201526064015b60405180910390fd5b6001600160a01b038416620000e95760405162461bcd60e51b815260206004820152601860248201527f706169722063616e6e6f74206265203020616464726573730000000000000000604482015260640162000088565b6001600160a01b038516620001415760405162461bcd60e51b815260206004820152601a60248201527f726f757465722063616e6e6f7420626520302061646472657373000000000000604482015260640162000088565b3360c0526001600160a01b0392831660e052600080546001600160a01b031916958416958617905561010091909152610120521660805260a052620001fb565b80516001600160a01b03811681146200019957600080fd5b919050565b600080600080600060a08688031215620001b757600080fd5b620001c28662000181565b9450620001d26020870162000181565b9350620001e26040870162000181565b6060870151608090970151959894975095949392505050565b60805160a05160c05160e0516101005161012051612aca620002d06000396000818161032a01526105a00152600081816102ad0152610be101526000611055015260008181610431015281816106250152818161079c0152818161083c015281816108c0015281816109e701528181610b1b01528181610c1301528181610c9701528181610e2501528181610f4201528181611001015281816110a1015281816119da01528181611c7601528181611dc201528181611f8101526120f1015260006101e1015260006103e40152612aca6000f3fe6080604052600436106101235760003560e01c8063a411209a116100a0578063db017dc711610064578063db017dc71461037d578063e4fc6b6d1461039d578063ed4ce99e146103b2578063ee16c160146103d2578063fb5a780c1461040657600080fd5b8063a411209a1461029b578063b0bc85de146102cf578063c5be2bc7146102e4578063c8e956ab14610318578063d83067861461034c57600080fd5b80633268cc56116100e75780633268cc56146101cf5780634fa26fd51461021b578063583dd79d1461023b5780636508c57e1461025b5780638d262cfe1461027b57600080fd5b806307a1cfbd1461012f5780630dd8715714610151578063135b4fc01461017a578063252d723a1461019a5780632b1fb89e146101af57600080fd5b3661012a57005b600080fd5b34801561013b57600080fd5b5061014f61014a3660046123e0565b610426565b005b34801561015d57600080fd5b5061016760015481565b6040519081526020015b60405180910390f35b34801561018657600080fd5b5061014f61019536600461244d565b61061a565b3480156101a657600080fd5b5061016761078f565b3480156101bb57600080fd5b5061014f6101ca36600461244d565b610831565b3480156101db57600080fd5b506102037f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610171565b34801561022757600080fd5b506101676102363660046124c3565b6108b3565b34801561024757600080fd5b5061014f6102563660046124dc565b6109dc565b34801561026757600080fd5b5061014f6102763660046123e0565b610b10565b34801561028757600080fd5b5061014f61029636600461244d565b610c08565b3480156102a757600080fd5b506101677f000000000000000000000000000000000000000000000000000000000000000081565b3480156102db57600080fd5b50610167610c8a565b3480156102f057600080fd5b506103046102ff3660046124c3565b610d26565b604051610171989796959493929190612564565b34801561032457600080fd5b506101677f000000000000000000000000000000000000000000000000000000000000000081565b34801561035857600080fd5b5060005461036d90600160a01b900460ff1681565b6040519015158152602001610171565b34801561038957600080fd5b506101676103983660046124c3565b610e18565b3480156103a957600080fd5b5061014f610f37565b3480156103be57600080fd5b5061014f6103cd366004612603565b611f76565b3480156103de57600080fd5b506102037f000000000000000000000000000000000000000000000000000000000000000081565b34801561041257600080fd5b5061014f610421366004612664565b6120e6565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104775760405162461bcd60e51b815260040161046e906126b2565b60405180910390fd5b6000805b6002548110156105805761053b6002828154811061049b5761049b6126da565b906000526020600020906007020160000180546104b7906126f0565b80601f01602080910402602001604051908101604052809291908181526020018280546104e3906126f0565b80156105305780601f1061050557610100808354040283529160200191610530565b820191906000526020600020905b81548152906001019060200180831161051357829003601f168201915b505050505085612248565b1561056e578260028281548110610554576105546126da565b906000526020600020906007020160010181905550600191505b8061057881612740565b91505061047b565b508061059e5760405162461bcd60e51b815260040161046e90612759565b7f00000000000000000000000000000000000000000000000000000000000000006105c761078f565b11156106155760405162461bcd60e51b815260206004820152601b60248201527f7461782063616e6e6f7420626520736574207468697320686967680000000000604482015260640161046e565b505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106625760405162461bcd60e51b815260040161046e906126b2565b6002604051806101000160405280878152602001868152602001858152602001600081526020016003600481111561069c5761069c61254e565b81526001600160a01b0385166020808301919091526000604083018190528515156060909301929092528354600181018555938252902081519192600702019081906106e890826127de565b5060208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548160ff021916908360048111156107315761073161254e565b021790555060a0820151600482018054610100600160a81b0319166101006001600160a01b039093169290920291909117905560c0820151600582015560e0909101516006909101805460ff19169115159190911790555050505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107d95760405162461bcd60e51b815260040161046e906126b2565b6000805b60025481101561082b57600281815481106107fa576107fa6126da565b90600052602060002090600702016001015482610817919061289e565b91508061082381612740565b9150506107dd565b50905090565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108795760405162461bcd60e51b815260040161046e906126b2565b6002604051806101000160405280878152602001868152602001858152602001600081526020016001600481111561069c5761069c61254e565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108fd5760405162461bcd60e51b815260040161046e906126b2565b60005b6002548110156109d25760006002828154811061091f5761091f6126da565b90600052602060002090600702016002015411156109c05760006127106002838154811061094f5761094f6126da565b9060005260206000209060070201600201548561096c91906128b1565b61097691906128c8565b9050806002838154811061098c5761098c6126da565b906000526020600020906007020160030160008282546109ac919061289e565b909155506109bc905081856128ea565b9350505b806109ca81612740565b915050610900565b508190505b919050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a245760405162461bcd60e51b815260040161046e906126b2565b6000805b600254811015610af257600060028281548110610a4757610a476126da565b60009182526020909120600460079092020181015460ff1690811115610a6f57610a6f61254e565b148015610a8d5750610a8d6002828154811061049b5761049b6126da565b15610ae0578260028281548110610aa657610aa66126da565b906000526020600020906007020160040160016101000a8154816001600160a01b0302191690836001600160a01b03160217905550600191505b80610aea81612740565b915050610a28565b50806106155760405162461bcd60e51b815260040161046e90612759565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b585760405162461bcd60e51b815260040161046e906126b2565b6000805b600254811015610bc157610b7c6002828154811061049b5761049b6126da565b15610baf578260028281548110610b9557610b956126da565b906000526020600020906007020160020181905550600191505b80610bb981612740565b915050610b5c565b5080610bdf5760405162461bcd60e51b815260040161046e90612759565b7f00000000000000000000000000000000000000000000000000000000000000006105c7610c8a565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c505760405162461bcd60e51b815260040161046e906126b2565b6002604051806101000160405280878152602001868152602001858152602001600081526020016000600481111561069c5761069c61254e565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610cd45760405162461bcd60e51b815260040161046e906126b2565b6000805b60025481101561082b5760028181548110610cf557610cf56126da565b90600052602060002090600702016002015482610d12919061289e565b915080610d1e81612740565b915050610cd8565b60028181548110610d3657600080fd5b9060005260206000209060070201600091509050806000018054610d59906126f0565b80601f0160208091040260200160405190810160405280929190818152602001828054610d85906126f0565b8015610dd25780601f10610da757610100808354040283529160200191610dd2565b820191906000526020600020905b815481529060010190602001808311610db557829003601f168201915b505050506001830154600284015460038501546004860154600587015460069097015495969395929450909260ff808316936101009093046001600160a01b0316921688565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e625760405162461bcd60e51b815260040161046e906126b2565b60005b6002548110156109d257600060028281548110610e8457610e846126da565b9060005260206000209060070201600101541115610f2557600061271060028381548110610eb457610eb46126da565b90600052602060002090600702016001015485610ed191906128b1565b610edb91906128c8565b90508060028381548110610ef157610ef16126da565b90600052602060002090600702016003016000828254610f11919061289e565b90915550610f21905081856128ea565b9350505b80610f2f81612740565b915050610e65565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f7f5760405162461bcd60e51b815260040161046e906126b2565b600054600160a01b900460ff1615610fcc5760405162461bcd60e51b815260206004820152601060248201526f616c7265616479207377617070696e6760801b604482015260640161046e565b6000805460ff60a01b1916600160a01b17815560408051600280825260608201835290916020830190803683370190505090507f000000000000000000000000000000000000000000000000000000000000000081600081518110611033576110336126da565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611087576110876126da565b6001600160a01b03909216602092830291909101909101527f00000000000000000000000000000000000000000000000000000000000000006000805b6002548110156111f95760028082815481106110e2576110e26126da565b60009182526020909120600460079092020181015460ff169081111561110a5761110a61254e565b036111855760006002808381548110611125576111256126da565b90600052602060002090600702016003015461114191906128c8565b90508060028381548110611157576111576126da565b90600052602060002090600702016003015461117391906128ea565b61117d908461289e565b9250506111e7565b60028181548110611198576111986126da565b600091825260209091206006600790920201015460ff16156111e757600281815481106111c7576111c76126da565b906000526020600020906007020160030154826111e4919061289e565b91505b806111f181612740565b9150506110c4565b5061120482826122a2565b90508061121183836122a2565b146112a1577fde3142f93c040ab4be0d03a16ac06c502816c1205865dd41d9848727102570d16040516112919060208082526033908201527f496e73756666696369656e7420746f6b656e7320746f20737761702e20506c6560408201527261736520616464206d6f726520746f6b656e7360681b606082015260800190565b60405180910390a1505050611f67565b600080546001600160a01b03166318cbafe5838387306112c34261012c61289e565b6040518663ffffffff1660e01b81526004016112e39594939291906128fd565b6000604051808303816000875af1158015611302573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261132a919081019061296e565b9050600047905081600081518110611344576113446126da565b602002602001015183141580611374575081600181518110611368576113686126da565b60200260200101518114155b156113ef577fde3142f93c040ab4be0d03a16ac06c502816c1205865dd41d9848727102570d16040516113e69060208082526025908201527f556e657870656374656420616d6f756e74732072657475726e65642066726f6d604082015264020737761760dc1b606082015260800190565b60405180910390a15b8060005b6002548110156116335760028181548110611410576114106126da565b600091825260209091206006600790920201015460ff168061146b57506002808281548110611441576114416126da565b60009182526020909120600460079092020181015460ff16908111156114695761146961254e565b145b156116215760025461147f906001906128ea565b81036114b3578160028281548110611499576114996126da565b906000526020600020906007020160050181905550611621565b60028082815481106114c7576114c76126da565b60009182526020909120600460079092020181015460ff16908111156114ef576114ef61254e565b036115ac576000600280838154811061150a5761150a6126da565b90600052602060002090600702016003015461152691906128c8565b9050600086826002858154811061153f5761153f6126da565b90600052602060002090600702016003015461155b91906128ea565b61156590876128b1565b61156f91906128c8565b90508060028481548110611585576115856126da565b60009182526020909120600560079092020101556115a381856128ea565b93505050611621565b600085600283815481106115c2576115c26126da565b906000526020600020906007020160030154856115df91906128b1565b6115e991906128c8565b905080600283815481106115ff576115ff6126da565b600091825260209091206005600790920201015561161d81846128ea565b9250505b8061162b81612740565b9150506113f3565b5060005b600254811015611f2257600060028281548110611656576116566126da565b60009182526020909120600460079092020181015460ff169081111561167e5761167e61254e565b036118305760028181548110611696576116966126da565b600091825260209091206006600790920201015460ff161561174c57600281815481106116c5576116c56126da565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166001600160a01b03166108fc60028381548110611709576117096126da565b9060005260206000209060070201600501549081150290604051600060405180830381858888f19350505050158015611746573d6000803e3d6000fd5b50611ebd565b856001600160a01b031663a9059cbb6002838154811061176e5761176e6126da565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166117c189600286815481106117aa576117aa6126da565b9060005260206000209060070201600301546122a2565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af115801561180c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117469190612a14565b600360028281548110611845576118456126da565b60009182526020909120600460079092020181015460ff169081111561186d5761186d61254e565b03611a7e5760028181548110611885576118856126da565b600091825260209091206006600790920201015460ff16156118b457600281815481106116c5576116c56126da565b856001600160a01b031663095ea7b3600283815481106118d6576118d66126da565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166002848154811061190e5761190e6126da565b60009182526020909120600360079092020101546040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af115801561196d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119919190612a14565b50600281815481106119a5576119a56126da565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166001600160a01b0316634ec109f47f000000000000000000000000000000000000000000000000000000000000000030611a118a600287815481106117aa576117aa6126da565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064015b600060405180830381600087803b158015611a6157600080fd5b505af1158015611a75573d6000803e3d6000fd5b50505050611ebd565b600160028281548110611a9357611a936126da565b60009182526020909120600460079092020181015460ff1690811115611abb57611abb61254e565b03611c325760028181548110611ad357611ad36126da565b600091825260209091206006600790920201015460ff1615611ba35760028181548110611b0257611b026126da565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166001600160a01b031663db6b524660028381548110611b4857611b486126da565b9060005260206000209060070201600501546040518263ffffffff1660e01b81526004016000604051808303818588803b158015611b8557600080fd5b505af1158015611b99573d6000803e3d6000fd5b5050505050611ebd565b60028181548110611bb657611bb66126da565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166001600160a01b031663338b5dea30611c0189600286815481106117aa576117aa6126da565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401611a47565b600460028281548110611c4757611c476126da565b60009182526020909120600460079092020181015460ff1690811115611c6f57611c6f61254e565b03611cd8577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166342966c68611cba88600285815481106117aa576117aa6126da565b6040518263ffffffff1660e01b8152600401611a4791815260200190565b6002808281548110611cec57611cec6126da565b60009182526020909120600460079092020181015460ff1690811115611d1457611d1461254e565b03611ebd57600060028281548110611d2e57611d2e6126da565b9060005260206000209060070201600501541115611ebd576000611d81876002808581548110611d6057611d606126da565b906000526020600020906007020160030154611d7c91906128c8565b6122a2565b600054600280549293506001600160a01b039091169163f305d719919085908110611dae57611dae6126da565b9060005260206000209060070201600501547f00000000000000000000000000000000000000000000000000000000000000008460008060028981548110611df857611df86126da565b600091825260209091206007909102016004015461010090046001600160a01b0316611e264261012c61289e565b60405160e089901b6001600160e01b03191681526001600160a01b039687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c40160606040518083038185885af1158015611e93573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611eb89190612a31565b505050505b600060028281548110611ed257611ed26126da565b906000526020600020906007020160030181905550600060028281548110611efc57611efc6126da565b600091825260209091206005600790920201015580611f1a81612740565b915050611637565b5060408051858152602081018490527f5e20c9aee521e656eed033c4ae35378c79c584706f5ce7f410ab3fba389607a1910160405180910390a1505042600155505050505b6000805460ff60a01b19169055565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611fbe5760405162461bcd60e51b815260040161046e906126b2565b60026040518061010001604052808681526020018581526020018481526020016000815260200160026004811115611ff857611ff861254e565b81526001600160a01b038416602080830191909152600060408301819052606090920182905283546001810185559382529020815191926007020190819061204090826127de565b5060208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548160ff021916908360048111156120895761208961254e565b021790555060a0820151600482018054610100600160a81b0319166101006001600160a01b039093169290920291909117905560c0820151600582015560e0909101516006909101805460ff191691151591909117905550505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461212e5760405162461bcd60e51b815260040161046e906126b2565b6002604051806101000160405280858152602001848152602001838152602001600081526020016004808111156121675761216761254e565b81526000602080830182905260408301829052606090920181905283546001810185559381522081519192600702019081906121a390826127de565b5060208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548160ff021916908360048111156121ec576121ec61254e565b021790555060a0820151600482018054610100600160a81b0319166101006001600160a01b039093169290920291909117905560c0820151600582015560e0909101516006909101805460ff1916911515919091179055505050565b60008160405160200161225b9190612a5f565b60405160208183030381529060405280519060200120836040516020016122829190612a5f565b604051602081830303815290604052805190602001201490505b92915050565b6040516370a0823160e01b815230600482015260009081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156122eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061230f9190612a7b565b905082811115612322578291505061229c565b9392505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561236857612368612329565b604052919050565b600082601f83011261238157600080fd5b813567ffffffffffffffff81111561239b5761239b612329565b6123ae601f8201601f191660200161233f565b8181528460208386010111156123c357600080fd5b816020850160208301376000918101602001919091529392505050565b600080604083850312156123f357600080fd5b823567ffffffffffffffff81111561240a57600080fd5b61241685828601612370565b95602094909401359450505050565b80356001600160a01b03811681146109d757600080fd5b801515811461244a57600080fd5b50565b600080600080600060a0868803121561246557600080fd5b853567ffffffffffffffff81111561247c57600080fd5b61248888828901612370565b95505060208601359350604086013592506124a560608701612425565b915060808601356124b58161243c565b809150509295509295909350565b6000602082840312156124d557600080fd5b5035919050565b600080604083850312156124ef57600080fd5b823567ffffffffffffffff81111561250657600080fd5b61251285828601612370565b92505061252160208401612425565b90509250929050565b60005b8381101561254557818101518382015260200161252d565b50506000910152565b634e487b7160e01b600052602160045260246000fd5b60006101008083528a51808285015261012091506125888183860160208f0161252a565b602084018b9052604084018a905260608401899052601f01601f19168301019050600586106125c757634e487b7160e01b600052602160045260246000fd5b8560808301526125e260a08301866001600160a01b03169052565b8360c08301526125f660e083018415159052565b9998505050505050505050565b6000806000806080858703121561261957600080fd5b843567ffffffffffffffff81111561263057600080fd5b61263c87828801612370565b945050602085013592506040850135915061265960608601612425565b905092959194509250565b60008060006060848603121561267957600080fd5b833567ffffffffffffffff81111561269057600080fd5b61269c86828701612370565b9660208601359650604090950135949350505050565b6020808252600e908201526d6e6f207065726d697373696f6e7360901b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b600181811c9082168061270457607f821691505b60208210810361272457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000600182016127525761275261272a565b5060010190565b6020808252601c908201527f636f756c64206e6f742066696e642074617820746f2075706461746500000000604082015260600190565b601f82111561061557600081815260208120601f850160051c810160208610156127b75750805b601f850160051c820191505b818110156127d6578281556001016127c3565b505050505050565b815167ffffffffffffffff8111156127f8576127f8612329565b61280c8161280684546126f0565b84612790565b602080601f83116001811461284157600084156128295750858301515b600019600386901b1c1916600185901b1785556127d6565b600085815260208120601f198616915b8281101561287057888601518255948401946001909101908401612851565b508582101561288e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8082018082111561229c5761229c61272a565b808202811582820484141761229c5761229c61272a565b6000826128e557634e487b7160e01b600052601260045260246000fd5b500490565b8181038181111561229c5761229c61272a565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561294d5784516001600160a01b031683529383019391830191600101612928565b50506001600160a01b03969096166060850152505050608001529392505050565b6000602080838503121561298157600080fd5b825167ffffffffffffffff8082111561299957600080fd5b818501915085601f8301126129ad57600080fd5b8151818111156129bf576129bf612329565b8060051b91506129d084830161233f565b81815291830184019184810190888411156129ea57600080fd5b938501935b83851015612a08578451825293850193908501906129ef565b98975050505050505050565b600060208284031215612a2657600080fd5b81516123228161243c565b600080600060608486031215612a4657600080fd5b8351925060208401519150604084015190509250925092565b60008251612a7181846020870161252a565b9190910192915050565b600060208284031215612a8d57600080fd5b505191905056fea26469706673582212201c9bf0ac564be296bd7b92234f1e8c87a80f526e8c209c7fe4f72285788feba464736f6c63430008110033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106104545760003560e01c80636f86455211610241578063c20c5caf1161013b578063d430d1bd116100c3578063e79d416011610087578063e79d4160146109d9578063e948474b146109e2578063ede49a1914610a05578063f19fffcb14610a19578063f1f5cd9114610a2d57600080fd5b8063d430d1bd1461095b578063db38a41d14610964578063dba61c5814610984578063dc01f60d1461098d578063dd62ed3e146109a057600080fd5b8063cc1776d31161010a578063cc1776d31461091b578063d00efb2f14610923578063d2d7ad831461092c578063d31acb2814610935578063d3b0066f1461094857600080fd5b8063c20c5caf146108d9578063c2ed286b146108ec578063c4a5abcd146108ff578063c552f4c51461090857600080fd5b806389d53c01116101c9578063a6f9dae11161018d578063a6f9dae11461085a578063a9059cbb1461086d578063b02b605e14610880578063b0ad3ebf14610893578063c10fde1b146108b657600080fd5b806389d53c01146107f15780638da5cb5b1461080457806395d89b411461081c578063989763ef14610824578063a457c2d71461084757600080fd5b8063751039fc11610210578063751039fc146107a6578063790ca413146107ae57806379cc6790146107b75780638091f3bf146107ca57806381045345146107de57600080fd5b80636f8645521461074a57806370a0823114610752578063715018a61461077b5780637412dbb31461078357600080fd5b806339509351116103525780635543379a116102da5780635e45da231161029e5780635e45da23146106ff5780636331bf65146107085780636508c57e146107105780636a092e79146107235780636b8f2f3b1461073657600080fd5b80635543379a146106a0578063570ca735146106b3578063583dd79d146106c65780635d90bbaf146106d95780635d9d7d43146106ec57600080fd5b80634c43e307116103215780634c43e307146106565780634f7041a51461065e5780634f72e2a2146106665780634fbc27751461067957806352c6dbc41461068c57600080fd5b80633950935114610614578063407133d21461062757806342966c681461063a57806345541cba1461064d57600080fd5b806318551108116103e05780632b750627116103a45780632b7506271461058857806330bd85c5146105ab578063313ce567146105bf5780633164df8b146105de578063368274991461060157600080fd5b806318551108146105225780631e19ae77146105475780631f4a6d321461055a57806323b872dd1461056257806328be90381461057557600080fd5b8063095ea7b311610427578063095ea7b3146104b45780630f3a325f146104c75780631776834a146104ea57806318160ddd146104fd578063182561e11461050f57600080fd5b806301339c2114610459578063064a59d01461046357806306fdde031461048c57806307a1cfbd146104a1575b600080fd5b610461610a35565b005b60075461047790600160a01b900460ff1681565b60405190151581526020015b60405180910390f35b610494610a77565b6040516104839190612bd2565b6104616104af366004612c8f565b610b05565b6104776104c2366004612cf0565b610b9c565b6104776104d5366004612d1a565b60126020526000908152604090205460ff1681565b6104616104f8366004612d35565b610c90565b6002545b604051908152602001610483565b61046161051d366004612d5c565b610cc4565b6016546001600160a01b03165b6040516001600160a01b039091168152602001610483565b610461610555366004612d5c565b610d1e565b610461610d78565b610477610570366004612d93565b610db6565b610461610583366004612d5c565b610ee1565b610477610596366004612d1a565b60136020526000908152604090205460ff1681565b600b5461047790600160c01b900460ff1681565b6006546105cc9060ff1681565b60405160ff9091168152602001610483565b6104776105ec366004612d1a565b60156020526000908152604090205460ff1681565b61046161060f366004612dcf565b610f3b565b610477610622366004612cf0565b610f88565b600b5461052f906001600160a01b031681565b610461610648366004612d35565b61109c565b610501600c5481565b6104616110fe565b6105016111ea565b610461610674366004612dcf565b61125d565b610461610687366004612d5c565b6112aa565b600b5461047790600160b01b900460ff1681565b6104616106ae366004612dcf565b611304565b60075461052f906001600160a01b031681565b6104616106d4366004612dec565b611351565b6104616106e7366004612d5c565b61139a565b6104616106fa366004612d5c565b6113f4565b610501600e5481565b61050161144e565b61046161071e366004612c8f565b61146d565b610477610731366004612e3a565b6114ce565b60165461047790600160a01b900460ff1681565b6105016115ec565b610501610760366004612d1a565b6001600160a01b031660009081526020819052604090205490565b610461611601565b610477610791366004612d1a565b600a6020526000908152604090205460ff1681565b610461611680565b610501600f5481565b6104616107c5366004612cf0565b6116bb565b60075461047790600160a81b900460ff1681565b6104616107ec366004612d35565b6117eb565b6104616107ff366004612dcf565b61181f565b60065461052f9061010090046001600160a01b031681565b6104946118c5565b610477610832366004612d1a565b60196020526000908152604090205460ff1681565b610477610855366004612cf0565b6118d2565b610461610868366004612d1a565b6119a1565b61047761087b366004612cf0565b611a47565b61046161088e366004612d35565b611ad6565b6104776108a1366004612d1a565b60086020526000908152604090205460ff1681565b6104776108c4366004612d1a565b601b6020526000908152604090205460ff1681565b6104616108e7366004612d35565b611b0a565b6104616108fa366004612d5c565b611b3e565b610501600d5481565b610461610916366004612dcf565b611c16565b610501611c63565b61050160105481565b61050160185481565b610461610943366004612e64565b611cad565b610461610956366004612d1a565b611ce7565b610501601c5481565b610501610972366004612d1a565b60146020526000908152604090205481565b61050160175481565b61047761099b366004612d1a565b611dad565b6105016109ae366004612e3a565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61050160115481565b6104776109f0366004612d1a565b60096020526000908152604090205460ff1681565b600b5461047790600160a81b900460ff1681565b600b5461047790600160b81b900460ff1681565b610501611df3565b60065461010090046001600160a01b03163314610a6d5760405162461bcd60e51b8152600401610a6490612e86565b60405180910390fd5b610a75611f05565b565b60058054610a8490612ece565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab090612ece565b8015610afd5780601f10610ad257610100808354040283529160200191610afd565b820191906000526020600020905b815481529060010190602001808311610ae057829003601f168201915b505050505081565b60065461010090046001600160a01b03163314610b345760405162461bcd60e51b8152600401610a6490612e86565b6016546040516307a1cfbd60e01b81526001600160a01b03909116906307a1cfbd90610b669085908590600401612f08565b600060405180830381600087803b158015610b8057600080fd5b505af1158015610b94573d6000803e3d6000fd5b505050505050565b6007546000903390600160a01b900460ff168015610bc35750600754600160a81b900460ff165b80610be057506006546001600160a01b0382811661010090920416145b80610bfa57503360009081526008602052604090205460ff165b610c165760405162461bcd60e51b8152600401610a6490612f2a565b6001600160a01b038416610c3c5760405162461bcd60e51b8152600401610a6490612f57565b3360008181526001602090815260408083206001600160a01b038916808552908352928190208790555186815291929160008051602061309d83398151915291015b60405180910390a35060019392505050565b60065461010090046001600160a01b03163314610cbf5760405162461bcd60e51b8152600401610a6490612e86565b600e55565b60065461010090046001600160a01b03163314610cf35760405162461bcd60e51b8152600401610a6490612e86565b6001600160a01b03919091166000908152601b60205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b03163314610d4d5760405162461bcd60e51b8152600401610a6490612e86565b6001600160a01b03919091166000908152601560205260409020805460ff1916911515919091179055565b60075460405147916001600160a01b03169082156108fc029083906000818181858888f19350505050158015610db2573d6000803e3d6000fd5b5050565b6007546000908490600160a01b900460ff168015610ddd5750600754600160a81b900460ff165b80610dfa57506006546001600160a01b0382811661010090920416145b80610e1457503360009081526008602052604090205460ff165b610e305760405162461bcd60e51b8152600401610a6490612f2a565b6001600160a01b0385166000908152600160209081526040808320338452909152902054610e5f908490612fa4565b6001600160a01b0386166000908152600160209081526040808320338452909152902055610e8e858585611f46565b6001600160a01b0385166000818152600160209081526040808320338085529083529281902054905190815291929160008051602061309d833981519152910160405180910390a3506001949350505050565b60065461010090046001600160a01b03163314610f105760405162461bcd60e51b8152600401610a6490612e86565b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b03163314610f6a5760405162461bcd60e51b8152600401610a6490612e86565b600b8054911515600160b81b0260ff60b81b19909216919091179055565b6007546000903390600160a01b900460ff168015610faf5750600754600160a81b900460ff165b80610fcc57506006546001600160a01b0382811661010090920416145b80610fe657503360009081526008602052604090205460ff165b6110025760405162461bcd60e51b8152600401610a6490612f2a565b6001600160a01b0384166110285760405162461bcd60e51b8152600401610a6490612f57565b3360009081526001602090815260408083206001600160a01b0388168452909152902054611057908490612fb7565b3360008181526001602090815260408083206001600160a01b038a168085529083529281902085905551938452909260008051602061309d8339815191529101610c7e565b3360009081526015602052604090205460ff166110f15760405162461bcd60e51b81526020600482015260136024820152726e6f206275726e207065726d697373696f6e7360681b6044820152606401610a64565b6110fb3382612157565b50565b600754600160a81b900460ff166111695760405162461bcd60e51b815260206004820152602960248201527f63616e206f6e6c792062652063616c6c6564206f6e636520746f6b656e206973604482015268081b185d5b98da195960ba1b6064820152608401610a64565b6007546001600160a01b0316331461118057600080fd5b601660009054906101000a90046001600160a01b03166001600160a01b031663e4fc6b6d6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156111d057600080fd5b505af11580156111e4573d6000803e3d6000fd5b50505050565b60165460408051631296b91d60e11b815290516000926001600160a01b03169163252d723a9160048083019260209291908290030181865afa158015611234573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112589190612fca565b905090565b60065461010090046001600160a01b0316331461128c5760405162461bcd60e51b8152600401610a6490612e86565b60168054911515600160a01b0260ff60a01b19909216919091179055565b60065461010090046001600160a01b031633146112d95760405162461bcd60e51b8152600401610a6490612e86565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b031633146113335760405162461bcd60e51b8152600401610a6490612e86565b600b8054911515600160b01b0260ff60b01b19909216919091179055565b6007546001600160a01b0316331461136857600080fd5b60165460405163583dd79d60e01b81526001600160a01b039091169063583dd79d90610b669085908590600401612fe3565b60065461010090046001600160a01b031633146113c95760405162461bcd60e51b8152600401610a6490612e86565b6001600160a01b03919091166000908152601260205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b031633146114235760405162461bcd60e51b8152600401610a6490612e86565b6001600160a01b03919091166000908152601360205260409020805460ff1916911515919091179055565b6000612710600d54600254611463919061300d565b6112589190613024565b60065461010090046001600160a01b0316331461149c5760405162461bcd60e51b8152600401610a6490612e86565b60165460405163328462bf60e11b81526001600160a01b0390911690636508c57e90610b669085908590600401612f08565b60065460009061010090046001600160a01b031633146115005760405162461bcd60e51b8152600401610a6490612e86565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015611547573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156b9190612fca565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb906044016020604051808303816000875af11580156115be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e29190613046565b9150505b92915050565b6000612710600c54600254611463919061300d565b60065461010090046001600160a01b031633146116305760405162461bcd60e51b8152600401610a6490612e86565b60065460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360068054610100600160a81b0319169055565b60065461010090046001600160a01b031633146116af5760405162461bcd60e51b8152600401610a6490612e86565b6000600d819055600c55565b3360009081526015602052604090205460ff166117105760405162461bcd60e51b81526020600482015260136024820152726e6f206275726e207065726d697373696f6e7360681b6044820152606401610a64565b6001600160a01b038216600090815260016020908152604080832033845290915290205481811061176e576117458282612fa4565b6001600160a01b0384166000908152600160209081526040808320338452909152902055611793565b6001600160a01b03831660009081526001602090815260408083203384529091528120555b61179d8383612157565b6001600160a01b0383166000818152600160209081526040808320338085529083529281902054905190815291929160008051602061309d83398151915291015b60405180910390a3505050565b60065461010090046001600160a01b0316331461181a5760405162461bcd60e51b8152600401610a6490612e86565b600d55565b60065461010090046001600160a01b0316331461184e5760405162461bcd60e51b8152600401610a6490612e86565b600b54600160a01b900460ff166118a75760405162461bcd60e51b815260206004820152601f60248201527f70696e6b20616e746920626f74206973206e6f7420636f6e66696775726564006044820152606401610a64565b600b8054911515600160c01b0260ff60c01b19909216919091179055565b60048054610a8490612ece565b6007546000903390600160a01b900460ff1680156118f95750600754600160a81b900460ff165b8061191657506006546001600160a01b0382811661010090920416145b8061193057503360009081526008602052604090205460ff165b61194c5760405162461bcd60e51b8152600401610a6490612f2a565b6001600160a01b0384166119725760405162461bcd60e51b8152600401610a6490612f57565b3360009081526001602090815260408083206001600160a01b0388168452909152902054611057908490612fa4565b60065461010090046001600160a01b031633146119d05760405162461bcd60e51b8152600401610a6490612e86565b6001600160a01b038116611a1f5760405162461bcd60e51b815260206004820152601660248201527563616e6e6f74206265207a65726f206164647265737360501b6044820152606401610a64565b600680546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6007546000903390600160a01b900460ff168015611a6e5750600754600160a81b900460ff165b80611a8b57506006546001600160a01b0382811661010090920416145b80611aa557503360009081526008602052604090205460ff165b611ac15760405162461bcd60e51b8152600401610a6490612f2a565b611acc338585611f46565b5060019392505050565b60065461010090046001600160a01b03163314611b055760405162461bcd60e51b8152600401610a6490612e86565b601c55565b60065461010090046001600160a01b03163314611b395760405162461bcd60e51b8152600401610a6490612e86565b600c55565b60065461010090046001600160a01b03163314611b6d5760405162461bcd60e51b8152600401610a6490612e86565b6001600160a01b0382166000908152600a602052604090205460ff161580611b93575080155b611beb5760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74206578636c75646520616e2065786368616e67652066726f6d206044820152620e8c2f60eb1b6064820152608401610a64565b6001600160a01b03919091166000908152601960205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b03163314611c455760405162461bcd60e51b8152600401610a6490612e86565b600b8054911515600160a81b0260ff60a81b19909216919091179055565b6016546040805163585e42ef60e11b815290516000926001600160a01b03169163b0bc85de9160048083019260209291908290030181865afa158015611234573d6000803e3d6000fd5b60065461010090046001600160a01b03163314611cdc5760405162461bcd60e51b8152600401610a6490612e86565b601891909155601755565b60065461010090046001600160a01b03163314611d165760405162461bcd60e51b8152600401610a6490612e86565b600b80546001600160a01b0319166001600160a01b038381169182179092556006546040516318e02bd960e01b81526101009091049092166004830152906318e02bd990602401600060405180830381600087803b158015611d7757600080fd5b505af1158015611d8b573d6000803e3d6000fd5b5050600b805464ff000000ff60a01b191664010000000160a01b179055505050565b6001600160a01b0381166000908152601b602052604081205460ff16806115e65750601c546001600160a01b038316600090815260208190526040902054101592915050565b600754600090600160a81b900460ff1615611e2557600360105443611e189190612fa4565b1015611e255750611edc90565b50600090565b6001600160a01b0381166000908152601960205260409020805460ff191660011790556110fb815b6001600160a01b0381166000908152601560205260409020805460ff191660011790556110fb815b6001600160a01b0381166000908152601360205260409020805460ff191660011790556110fb815b60068054610100600160a81b0319166101006001600160a01b0393841681029190911780835581900483166000908152600860205260409020805460ff19166001179055905460078054929091049092166001600160a01b0319909116179055565b60065461010090046001600160a01b03163314611f345760405162461bcd60e51b8152600401610a6490612e86565b611f3c6121e0565b42600f5543601055565b6001600160a01b038216611f955760405162461bcd60e51b815260206004820152601660248201527563616e6e6f74206265207a65726f206164647265737360501b6044820152606401610a64565b6001600160a01b03831660009081526009602052604090205460ff1615611ffe5760405162461bcd60e51b815260206004820152601e60248201527f61646472657373206973206e6f7420616c6c6f77656420746f2073656c6c00006044820152606401610a64565b60035460ff161561209c576001600160a01b03831660009081526020819052604090205461202d908290612fa4565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461205d908290612fb7565b6001600160a01b0383811660008181526020818152604091829020949094555184815290929186169160008051602061307d83398151915291016117de565b6120a7838383612224565b60006120b484848461222f565b6001600160a01b0385166000908152602081905260409020549091506120db908390612fa4565b6001600160a01b03808616600090815260208190526040808220939093559085168152205461210b908290612fb7565b6001600160a01b0384811660008181526020818152604091829020949094555184815290929187169160008051602061307d833981519152910160405180910390a36111e4565b505050565b6001600160a01b03821661216a57600080fd5b806002546121789190612fa4565b6002556001600160a01b03821660009081526020819052604090205461219f908290612fa4565b6001600160a01b038316600081815260208181526040808320949094559251848152909260008051602061307d833981519152910160405180910390a35050565b60065461010090046001600160a01b0316331461220f5760405162461bcd60e51b8152600401610a6490612e86565b6007805460ff60a81b1916600160a81b179055565b612152838383612244565b600061223c8484846123e4565b949350505050565b600754600160a81b900460ff1680156122665750601654600160a01b900460ff165b801561228a57506001600160a01b0382166000908152600a602052604090205460ff165b80156122a4575042601a54600a6122a19190612fb7565b11155b80156122cc57506018546016546001600160a01b031660009081526020819052604090205410155b80156122f157506001600160a01b03831660009081526019602052604090205460ff16155b80156123715750601660009054906101000a90046001600160a01b03166001600160a01b031663d83067866040518163ffffffff1660e01b8152600401602060405180830381865afa15801561234b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061236f9190613046565b155b156123d95742601a556016546040805163e4fc6b6d60e01b815290516001600160a01b039092169163e4fc6b6d9160048082019260009290919082900301818387803b1580156123c057600080fd5b505af11580156123d4573d6000803e3d6000fd5b505050505b612152838383612607565b6001600160a01b038316600090815260196020526040812054829060ff1615801561242857506001600160a01b03841660009081526019602052604090205460ff16155b801561243d5750600754600160a81b900460ff165b1561256c576001600160a01b0385166000908152600a602052604090205460ff16156124d95760165460405163db017dc760e01b8152600481018590526001600160a01b039091169063db017dc7906024016020604051808303816000875af11580156124ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124d29190612fca565b905061256c565b6001600160a01b0384166000908152600a602052604090205460ff161561256c57601654604051634fa26fd560e01b8152600481018590526001600160a01b0390911690634fa26fd5906024016020604051808303816000875af1158015612545573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125699190612fca565b90505b60006125788285612fa4565b905080156125f2576016546001600160a01b03166000908152602081905260409020546125a6908290612fb7565b601680546001600160a01b03908116600090815260208181526040918290209490945591549151848152918116929089169160008051602061307d833981519152910160405180910390a35b6125fd868684612a38565b9695505050505050565b600b54600160a81b900460ff16158061263057503360009081526012602052604090205460ff16155b61266e5760405162461bcd60e51b815260206004820152600f60248201526e1cdb9a5c195c881c995a9958dd1959608a1b6044820152606401610a64565b600754600160a81b900460ff16801561269a57506006546001600160a01b038481166101009092041614155b80156126bf57506001600160a01b03831660009081526013602052604090205460ff16155b80156126e457506001600160a01b03821660009081526013602052604090205460ff16155b1561215257600e541561274357600e545a11156127435760405162461bcd60e51b815260206004820152601e60248201527f74686973206973206f76657220746865206d617820676173206c696d697400006044820152606401610a64565b6000600d5411801561276e57506001600160a01b0382166000908152600a602052604090205460ff16155b156127ed5761277b61144e565b6001600160a01b03831660009081526020819052604090205461279f908390612fb7565b11156127ed5760405162461bcd60e51b815260206004820181905260248201527f74686973206973206f76657220746865206d617820686f6c6420616d6f756e746044820152606401610a64565b6000600c5411801561281757506001600160a01b0382166000908152600a602052604090205460ff165b15612873576128246115ec565b8111156128735760405162461bcd60e51b815260206004820181905260248201527f74686973206973206f76657220746865206d61782073656c6c20616d6f756e746044820152606401610a64565b600b54600160b01b900460ff16156129b3576001600160a01b0382166000908152601460205260409020544390036128dc576001600160a01b0382166000908152601260205260408120805460ff1916600117905560118054916128d683613063565b91905055505b6001600160a01b038316600090815260146020526040902054439003612933576001600160a01b0383166000908152601260205260408120805460ff19166001179055601180549161292d83613063565b91905055505b6001600160a01b0382166000908152600a602052604081205460ff1615159003612973576001600160a01b03821660009081526014602052604090204390555b6001600160a01b0383166000908152600a602052604081205460ff16151590036129b3576001600160a01b03831660009081526014602052604090204390555b600b54600160c01b900460ff161561215257600b5460405163090ec10b60e31b81526001600160a01b03858116600483015284811660248301526044820184905290911690634876085890606401600060405180830381600087803b158015612a1b57600080fd5b505af1158015612a2f573d6000803e3d6000fd5b50505050505050565b6007546000908290600160a81b900460ff168015612a5f5750600b54600160b81b900460ff165b15612b0e576006546001600160a01b038681166101009092041614801590612a8e57506000612a8c611df3565b115b8015612ab357506001600160a01b03851660009081526013602052604090205460ff16155b8015612ad857506001600160a01b03841660009081526013602052604090205460ff16155b15612b0e576000612710612aea611df3565b612af4908661300d565b612afe9190613024565b9050612b0a8183612fa4565b9150505b612b19858583612b22565b95945050505050565b6000826001600160a01b0316846001600160a01b031603612b855760405162461bcd60e51b815260206004820152601f60248201527f796f752063616e6e6f74207472616e7366657220746f20796f757273656c66006044820152606401610a64565b5092915050565b6000815180845260005b81811015612bb257602081850181015186830182015201612b96565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000612be56020830184612b8c565b9392505050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112612c1357600080fd5b813567ffffffffffffffff80821115612c2e57612c2e612bec565b604051601f8301601f19908116603f01168101908282118183101715612c5657612c56612bec565b81604052838152866020858801011115612c6f57600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060408385031215612ca257600080fd5b823567ffffffffffffffff811115612cb957600080fd5b612cc585828601612c02565b95602094909401359450505050565b80356001600160a01b0381168114612ceb57600080fd5b919050565b60008060408385031215612d0357600080fd5b612d0c83612cd4565b946020939093013593505050565b600060208284031215612d2c57600080fd5b612be582612cd4565b600060208284031215612d4757600080fd5b5035919050565b80151581146110fb57600080fd5b60008060408385031215612d6f57600080fd5b612d7883612cd4565b91506020830135612d8881612d4e565b809150509250929050565b600080600060608486031215612da857600080fd5b612db184612cd4565b9250612dbf60208501612cd4565b9150604084013590509250925092565b600060208284031215612de157600080fd5b8135612be581612d4e565b60008060408385031215612dff57600080fd5b823567ffffffffffffffff811115612e1657600080fd5b612e2285828601612c02565b925050612e3160208401612cd4565b90509250929050565b60008060408385031215612e4d57600080fd5b612e5683612cd4565b9150612e3160208401612cd4565b60008060408385031215612e7757600080fd5b50508035926020909101359150565b60208082526028908201527f63616e206f6e6c792062652063616c6c65642062792074686520636f6e74726160408201526731ba1037bbb732b960c11b606082015260800190565b600181811c90821680612ee257607f821691505b602082108103612f0257634e487b7160e01b600052602260045260246000fd5b50919050565b604081526000612f1b6040830185612b8c565b90508260208301529392505050565b6020808252601390820152721d1c98591a5b99c81b9bdd08195b98589b1959606a1b604082015260600190565b6020808252601c908201527f63616e6e6f7420617070726f7665207468652030206164647265737300000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b818103818111156115e6576115e6612f8e565b808201808211156115e6576115e6612f8e565b600060208284031215612fdc57600080fd5b5051919050565b604081526000612ff66040830185612b8c565b905060018060a01b03831660208301529392505050565b80820281158282048414176115e6576115e6612f8e565b60008261304157634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561305857600080fd5b8151612be581612d4e565b60006001820161307557613075612f8e565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a264697066735822122069d984a17113ed25ffb8d2b186458b1da34e8fa202b7dfad6444c786ee88f57264736f6c63430008110033
Deployed Bytecode Sourcemap
39416:3182:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41359:100;;;:::i;:::-;;8330:35;;;;;-1:-1:-1;;;8330:35:0;;;;;;;;;179:14:1;;172:22;154:41;;142:2;127:18;8330:35:0;;;;;;;;8204:19;;;:::i;:::-;;;;;;;:::i;20762:143::-;;;;;;:::i;:::-;;:::i;11392:314::-;;;;;;:::i;:::-;;:::i;34565:41::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;38928:98;;;;;;:::i;:::-;;:::i;9474:102::-;9556:12;;9474:102;;;3069:25:1;;;3057:2;3042:18;9474:102:0;2923:177:1;42364:115:0;;;;;;:::i;:::-;;:::i;19908:114::-;19999:14;;-1:-1:-1;;;;;19999:14:0;19908:114;;;-1:-1:-1;;;;;3712:32:1;;;3694:51;;3682:2;3667:18;19908:114:0;3548:203:1;21683:113:0;;;;;;:::i;:::-;;:::i;15162:134::-;;;:::i;12179:328::-;;;;;;:::i;:::-;;:::i;15662:116::-;;;;;;:::i;:::-;;:::i;34613:46::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;34314:29;;;;;-1:-1:-1;;;34314:29:0;;;;;;8230:21;;;;;;;;;;;;4261:4:1;4249:17;;;4231:36;;4219:2;4204:18;8230:21:0;4089:184:1;21311:43:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;38388:113;;;;;;:::i;:::-;;:::i;13022:381::-;;;;;;:::i;:::-;;:::i;34110:31::-;;;;;-1:-1:-1;;;;;34110:31:0;;;21967:101;;;;;;:::i;:::-;;:::i;34356:27::-;;;;;;21104:136;;;:::i;19716:102::-;;;:::i;20068:97::-;;;;;;:::i;:::-;;:::i;15529:121::-;;;;;;:::i;:::-;;:::i;34230:36::-;;;;;-1:-1:-1;;;34230:36:0;;;;;;38259:117;;;;;;:::i;:::-;;:::i;8300:23::-;;;;;-1:-1:-1;;;;;8300:23:0;;;20917:175;;;;;;:::i;:::-;;:::i;39038:109::-;;;;;;:::i;:::-;;:::i;39155:117::-;;;;;;:::i;:::-;;:::i;34424:26::-;;;;;;37382:113;;;:::i;20609:145::-;;;;;;:::i;:::-;;:::i;15306:211::-;;;;;;:::i;:::-;;:::i;17490:23::-;;;;;-1:-1:-1;;;17490:23:0;;;;;;37507:114;;;:::i;9793:119::-;;;;;;:::i;:::-;-1:-1:-1;;;;;9887:17:0;9860:7;9887:17;;;;;;;;;;;;9793:119;15014:140;;;:::i;8518:42::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;39280:105;;;:::i;34459:25::-;;;;;;22467:431;;;;;;:::i;:::-;;:::i;8372:20::-;;;;;-1:-1:-1;;;8372:20:0;;;;;;38816:100;;;;;;:::i;:::-;;:::i;38513:179::-;;;;;;:::i;:::-;;:::i;8264:29::-;;;;;;;;-1:-1:-1;;;;;8264:29:0;;;8177:20;;;:::i;17610:48::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;13923:391;;;;;;:::i;:::-;;:::i;14860:146::-;;;;;;:::i;:::-;;:::i;10567:178::-;;;;;;:::i;:::-;;:::i;42487:108::-;;;;;;:::i;:::-;;:::i;8405:47::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;39488:48;;;;;;:::i;:::-;;;;;;;;;;;;;;;;38704:100;;;;;;:::i;:::-;;:::i;20173:225::-;;;;;;:::i;:::-;;:::i;34390:27::-;;;;;;38138:109;;;;;;:::i;:::-;;:::i;19514:104::-;;;:::i;34491:26::-;;;;;;17565:38;;;;;;20406:191;;;;;;:::i;:::-;;:::i;37889:237::-;;;;;;:::i;:::-;;:::i;39543:31::-;;;;;;34666:55;;;;;;:::i;:::-;;;;;;;;;;;;;;17520:38;;;;;;42178:152;;;;;;:::i;:::-;;:::i;10252:144::-;;;;;;:::i;:::-;-1:-1:-1;;;;;10363:16:0;;;10336:7;10363:16;;;:8;:16;;;;;;;;:25;;;;;;;;;;;;;10252:144;34524:28;;;;;;8459:52;;;;;;:::i;:::-;;;;;;;;;;;;;;;;34191:32;;;;;-1:-1:-1;;;34191:32:0;;;;;;34273:34;;;;;-1:-1:-1;;;34273:34:0;;;;;;37632:217;;;:::i;41359:100::-;8627:5;;;;;-1:-1:-1;;;;;8627:5:0;8613:10;:19;8605:72;;;;-1:-1:-1;;;8605:72:0;;;;;;;:::i;:::-;;;;;;;;;41437:14:::1;:12;:14::i;:::-;41359:100::o:0;8204:19::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20762:143::-;8627:5;;;;;-1:-1:-1;;;;;8627:5:0;8613:10;:19;8605:72;;;;-1:-1:-1;;;8605:72:0;;;;;;;:::i;:::-;20853:14:::1;::::0;:44:::1;::::0;-1:-1:-1;;;20853:44:0;;-1:-1:-1;;;;;20853:14:0;;::::1;::::0;:24:::1;::::0;:44:::1;::::0;20878:7;;20887:9;;20853:44:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;20762:143:::0;;:::o;11392:314::-;9026:16;;11495:4;;11474:10;;-1:-1:-1;;;9026:16:0;;;;:28;;;;-1:-1:-1;9046:8:0;;-1:-1:-1;;;9046:8:0;;;;9026:28;9025:47;;;-1:-1:-1;9067:5:0;;-1:-1:-1;;;;;9059:13:0;;;9067:5;;;;;9059:13;9025:47;:77;;;-1:-1:-1;9091:10:0;9076:26;;;;:14;:26;;;;;;;;9025:77;9017:109;;;;-1:-1:-1;;;9017:109:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11520:21:0;::::1;11512:62;;;;-1:-1:-1::0;;;11512:62:0::1;;;;;;;:::i;:::-;11596:10;11587:20;::::0;;;:8:::1;:20;::::0;;;;;;;-1:-1:-1;;;;;11587:29:0;::::1;::::0;;;;;;;;;;:37;;;11640:36;3069:25:1;;;11587:29:0;;11596:10;-1:-1:-1;;;;;;;;;;;11640:36:0;3042:18:1;11640:36:0::1;;;;;;;;-1:-1:-1::0;11694:4:0::1;::::0;11392:314;-1:-1:-1;;;11392:314:0:o;38928:98::-;8627:5;;;;;-1:-1:-1;;;;;8627:5:0;8613:10;:19;8605:72;;;;-1:-1:-1;;;8605:72:0;;;;;;;:::i;:::-;38998:11:::1;:20:::0;38928:98::o;42364:115::-;8627:5;;;;;-1:-1:-1;;;;;8627:5:0;8613:10;:19;8605:72;;;;-1:-1:-1;;;8605:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42445:21:0;;;::::1;;::::0;;;:16:::1;:21;::::0;;;;:26;;-1:-1:-1;;42445:26:0::1;::::0;::::1;;::::0;;;::::1;::::0;;42364:115::o;21683:113::-;8627:5;;;;;-1:-1:-1;;;;;8627:5:0;8613:10;:19;8605:72;;;;-1:-1:-1;;;8605:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21763:15:0;;;::::1;;::::0;;;:10:::1;:15;::::0;;;;:25;;-1:-1:-1;;21763:25:0::1;::::0;::::1;;::::0;;;::::1;::::0;;21683:113::o;15162:134::-;15261:8;;15253:35;;15221:21;;-1:-1:-1;;;;;15261:8:0;;15253:35;;;;;15221:21;;15203:15;15253:35;15203:15;15253:35;15221:21;15261:8;15253:35;;;;;;;;;;;;;;;;;;;;;15192:104;15162:134::o;12179:328::-;9026:16;;12290:4;;12275;;-1:-1:-1;;;9026:16:0;;;;:28;;;;-1:-1:-1;9046:8:0;;-1:-1:-1;;;9046:8:0;;;;9026:28;9025:47;;;-1:-1:-1;9067:5:0;;-1:-1:-1;;;;;9059:13:0;;;9067:5;;;;;9059:13;9025:47;:77;;;-1:-1:-1;9091:10:0;9076:26;;;;:14;:26;;;;;;;;9025:77;9017:109;;;;-1:-1:-1;;;9017:109:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;12336:14:0;::::1;;::::0;;;:8:::1;:14;::::0;;;;;;;12351:10:::1;12336:26:::0;;;;;;;;:34:::1;::::0;12365:5;;12336:34:::1;:::i;:::-;-1:-1:-1::0;;;;;12307:14:0;::::1;;::::0;;;:8:::1;:14;::::0;;;;;;;12322:10:::1;12307:26:::0;;;;;;;:63;12381:26:::1;12316:4:::0;12397:2;12401:5;12381:9:::1;:26::i;:::-;-1:-1:-1::0;;;;;12423:54:0;::::1;12450:14;::::0;;;:8:::1;:14;::::0;;;;;;;12438:10:::1;12450:26:::0;;;;;;;;;;;12423:54;;3069:25:1;;;12438:10:0;;12423:54;-1:-1:-1;;;;;;;;;;;12423:54:0;3042:18:1;12423:54:0::1;;;;;;;-1:-1:-1::0;12495:4:0::1;::::0;12179:328;-1:-1:-1;;;;12179:328:0:o;15662:116::-;8627:5;;;;;-1:-1:-1;;;;;8627:5:0;8613:10;:19;8605:72;;;;-1:-1:-1;;;8605:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15743:14:0;;;::::1;;::::0;;;:9:::1;:14;::::0;;;;:27;;-1:-1:-1;;15743:27:0::1;::::0;::::1;;::::0;;;::::1;::::0;;15662:116::o;38388:113::-;8627:5;;;;;-1:-1:-1;;;;;8627:5:0;8613:10;:19;8605:72;;;;-1:-1:-1;;;8605:72:0;;;;;;;:::i;:::-;38461:22:::1;:32:::0;;;::::1;;-1:-1:-1::0;;;38461:32:0::1;-1:-1:-1::0;;;;38461:32:0;;::::1;::::0;;;::::1;::::0;;38388:113::o;13022:381::-;9026:16;;13131:4;;13110:10;;-1:-1:-1;;;9026:16:0;;;;:28;;;;-1:-1:-1;9046:8:0;;-1:-1:-1;;;9046:8:0;;;;9026:28;9025:47;;;-1:-1:-1;9067:5:0;;-1:-1:-1;;;;;9059:13:0;;;9067:5;;;;;9059:13;9025:47;:77;;;-1:-1:-1;9091:10:0;9076:26;;;;:14;:26;;;;;;;;9025:77;9017:109;;;;-1:-1:-1;;;9017:109:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13156:21:0;::::1;13148:62;;;;-1:-1:-1::0;;;13148:62:0::1;;;;;;;:::i;:::-;13264:10;13255:20;::::0;;;:8:::1;:20;::::0;;;;;;;-1:-1:-1;;;;;13255:29:0;::::1;::::0;;;;;;;;:42:::1;::::0;13287:10;;13255:42:::1;:::i;:::-;13232:10;13223:20;::::0;;;:8:::1;:20;::::0;;;;;;;-1:-1:-1;;;;;13223:29:0;::::1;::::0;;;;;;;;;;:74;;;13313:60;3069:25:1;;;13223:29:0;;-1:-1:-1;;;;;;;;;;;13313:60:0;3042:18:1;13313:60:0::1;2923:177:1::0;21967:101:0;21415:10;21404:22;;;;:10;:22;;;;;;;;21396:54;;;;-1:-1:-1;;;21396:54:0;;8064:2:1;21396:54:0;;;8046:21:1;8103:2;8083:18;;;8076:30;-1:-1:-1;;;8122:18:1;;;8115:49;8181:18;;21396:54:0;7862:343:1;21396:54:0;22036:24:::1;22042:10;22054:5;22036;:24::i;:::-;21967:101:::0;:::o;21104:136::-;8750:8;;-1:-1:-1;;;8750:8:0;;;;8742:62;;;;-1:-1:-1;;;8742:62:0;;8412:2:1;8742:62:0;;;8394:21:1;8451:2;8431:18;;;8424:30;8490:34;8470:18;;;8463:62;-1:-1:-1;;;8541:18:1;;;8534:39;8590:19;;8742:62:0;8210:405:1;8742:62:0;21185:8:::1;::::0;-1:-1:-1;;;;;21185:8:0::1;21171:10;:22;21163:31;;;::::0;::::1;;21205:14;;;;;;;;;-1:-1:-1::0;;;;;21205:14:0::1;-1:-1:-1::0;;;;;21205:25:0::1;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;21104:136::o:0;19716:102::-;19784:14;;:26;;;-1:-1:-1;;;19784:26:0;;;;19757:7;;-1:-1:-1;;;;;19784:14:0;;:24;;:26;;;;;;;;;;;;;;:14;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19777:33;;19716:102;:::o;20068:97::-;8627:5;;;;;-1:-1:-1;;;;;8627:5:0;8613:10;:19;8605:72;;;;-1:-1:-1;;;8605:72:0;;;;;;;:::i;:::-;20136:11:::1;:21:::0;;;::::1;;-1:-1:-1::0;;;20136:21:0::1;-1:-1:-1::0;;;;20136:21:0;;::::1;::::0;;;::::1;::::0;;20068:97::o;15529:121::-;8627:5;;;;;-1:-1:-1;;;;;8627:5:0;8613:10;:19;8605:72;;;;-1:-1:-1;;;8605:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15613:19:0;;;::::1;;::::0;;;:14:::1;:19;::::0;;;;:29;;-1:-1:-1;;15613:29:0::1;::::0;::::1;;::::0;;;::::1;::::0;;15529:121::o;38259:117::-;8627:5;;;;;-1:-1:-1;;;;;8627:5:0;8613:10;:19;8605:72;;;;-1:-1:-1;;;8605:72:0;;;;;;;:::i;:::-;38334:24:::1;:34:::0;;;::::1;;-1:-1:-1::0;;;38334:34:0::1;-1:-1:-1::0;;;;38334:34:0;;::::1;::::0;;;::::1;::::0;;38259:117::o;20917:175::-;21020:8;;-1:-1:-1;;;;;21020:8:0;21006:10;:22;20998:31;;;;;;21040:14;;:44;;-1:-1:-1;;;21040:44:0;;-1:-1:-1;;;;;21040:14:0;;;;:27;;:44;;21068:7;;21077:6;;21040:44;;;:::i;39038:109::-;8627:5;;;;;-1:-1:-1;;;;;8627:5:0;8613:10;:19;8605:72;;;;-1:-1:-1;;;8605:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;39116:13:0;;;::::1;;::::0;;;:8:::1;:13;::::0;;;;:23;;-1:-1:-1;;39116:23:0::1;::::0;::::1;;::::0;;;::::1;::::0;;39038:109::o;39155:117::-;8627:5;;;;;-1:-1:-1;;;;;8627:5:0;8613:10;:19;8605:72;;;;-1:-1:-1;;;8605:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;39236:18:0;;;::::1;;::::0;;;:13:::1;:18;::::0;;;;:28;;-1:-1:-1;;39236:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;39155:117::o;37382:113::-;37423:7;37482:5;37466:12;;37451;;:27;;;;:::i;:::-;37450:37;;;;:::i;20609:145::-;8627:5;;;;;-1:-1:-1;;;;;8627:5:0;8613:10;:19;8605:72;;;;-1:-1:-1;;;8605:72:0;;;;;;;:::i;:::-;20701:14:::1;::::0;:45:::1;::::0;-1:-1:-1;;;20701:45:0;;-1:-1:-1;;;;;20701:14:0;;::::1;::::0;:25:::1;::::0;:45:::1;::::0;20727:7;;20736:9;;20701:45:::1;;;:::i;15306:211::-:0;8627:5;;15384:4;;8627:5;;;-1:-1:-1;;;;;8627:5:0;8613:10;:19;8605:72;;;;-1:-1:-1;;;8605:72:0;;;;;;;:::i;:::-;15418:38:::1;::::0;-1:-1:-1;;;15418:38:0;;15450:4:::1;15418:38;::::0;::::1;3694:51:1::0;15400:15:0::1;::::0;-1:-1:-1;;;;;15418:23:0;::::1;::::0;::::1;::::0;3667:18:1;;15418:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15474:35;::::0;-1:-1:-1;;;15474:35:0;;-1:-1:-1;;;;;9718:32:1;;;15474:35:0::1;::::0;::::1;9700:51:1::0;9767:18;;;9760:34;;;15400:56:0;;-1:-1:-1;15474:22:0;;::::1;::::0;::::1;::::0;9673:18:1;;15474:35:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15467:42;;;8688:1;15306:211:::0;;;;:::o;37507:114::-;37548:7;37608:5;37592:12;;37577;;:27;;;;:::i;15014:140::-;8627:5;;;;;-1:-1:-1;;;;;8627:5:0;8613:10;:19;8605:72;;;;-1:-1:-1;;;8605:72:0;;;;;;;:::i;:::-;15099:5:::1;::::0;15078:39:::1;::::0;15114:1:::1;::::0;15099:5:::1;::::0;::::1;-1:-1:-1::0;;;;;15099:5:0::1;::::0;15078:39:::1;::::0;15114:1;;15078:39:::1;15128:5;:18:::0;;-1:-1:-1;;;;;;15128:18:0::1;::::0;;15014:140::o;39280:105::-;8627:5;;;;;-1:-1:-1;;;;;8627:5:0;8613:10;:19;8605:72;;;;-1:-1:-1;;;8605:72:0;;;;;;;:::i;:::-;39349:1:::1;39334:12;:16:::0;;;39361:12:::1;:16:::0;39280:105::o;22467:431::-;21415:10;21404:22;;;;:10;:22;;;;;;;;21396:54;;;;-1:-1:-1;;;21396:54:0;;8064:2:1;21396:54:0;;;8046:21:1;8103:2;8083:18;;;8076:30;-1:-1:-1;;;8122:18:1;;;8115:49;8181:18;;21396:54:0;7862:343:1;21396:54:0;-1:-1:-1;;;;;22577:17:0;::::1;22557;22577::::0;;;:8:::1;:17;::::0;;;;;;;22595:10:::1;22577:29:::0;;;;;;;;22621:18;;::::1;22617:166;;22688:17;22700:5:::0;22688:9;:17:::1;:::i;:::-;-1:-1:-1::0;;;;;22656:17:0;::::1;;::::0;;;:8:::1;:17;::::0;;;;;;;22674:10:::1;22656:29:::0;;;;;;;:49;22617:166:::1;;;-1:-1:-1::0;;;;;22738:17:0;::::1;22770:1;22738:17:::0;;;:8:::1;:17;::::0;;;;;;;22756:10:::1;22738:29:::0;;;;;;;:33;22617:166:::1;22793:21;22799:7;22808:5;22793;:21::i;:::-;-1:-1:-1::0;;;;;22830:60:0;::::1;22860:17;::::0;;;:8:::1;:17;::::0;;;;;;;22848:10:::1;22860:29:::0;;;;;;;;;;;22830:60;;3069:25:1;;;22848:10:0;;22830:60;-1:-1:-1;;;;;;;;;;;22830:60:0;3042:18:1;22830:60:0::1;;;;;;;;22546:352;22467:431:::0;;:::o;38816:100::-;8627:5;;;;;-1:-1:-1;;;;;8627:5:0;8613:10;:19;8605:72;;;;-1:-1:-1;;;8605:72:0;;;;;;;:::i;:::-;38887:12:::1;:21:::0;38816:100::o;38513:179::-;8627:5;;;;;-1:-1:-1;;;;;8627:5:0;8613:10;:19;8605:72;;;;-1:-1:-1;;;8605:72:0;;;;;;;:::i;:::-;38589:21:::1;::::0;-1:-1:-1;;;38589:21:0;::::1;;;38581:65;;;::::0;-1:-1:-1;;;38581:65:0;;10257:2:1;38581:65:0::1;::::0;::::1;10239:21:1::0;10296:2;10276:18;;;10269:30;10335:33;10315:18;;;10308:61;10386:18;;38581:65:0::1;10055:355:1::0;38581:65:0::1;38657:17;:27:::0;;;::::1;;-1:-1:-1::0;;;38657:27:0::1;-1:-1:-1::0;;;;38657:27:0;;::::1;::::0;;;::::1;::::0;;38513:179::o;8177:20::-;;;;;;;:::i;13923:391::-;9026:16;;14037:4;;14016:10;;-1:-1:-1;;;9026:16:0;;;;:28;;;;-1:-1:-1;9046:8:0;;-1:-1:-1;;;9046:8:0;;;;9026:28;9025:47;;;-1:-1:-1;9067:5:0;;-1:-1:-1;;;;;9059:13:0;;;9067:5;;;;;9059:13;9025:47;:77;;;-1:-1:-1;9091:10:0;9076:26;;;;:14;:26;;;;;;;;9025:77;9017:109;;;;-1:-1:-1;;;9017:109:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14062:21:0;::::1;14054:62;;;;-1:-1:-1::0;;;14054:62:0::1;;;;;;;:::i;:::-;14170:10;14161:20;::::0;;;:8:::1;:20;::::0;;;;;;;-1:-1:-1;;;;;14161:29:0;::::1;::::0;;;;;;;;:47:::1;::::0;14193:15;;14161:47:::1;:::i;14860:146::-:0;8627:5;;;;;-1:-1:-1;;;;;8627:5:0;8613:10;:19;8605:72;;;;-1:-1:-1;;;8605:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14932:17:0;::::1;14924:52;;;::::0;-1:-1:-1;;;14924:52:0;;10617:2:1;14924:52:0::1;::::0;::::1;10599:21:1::0;10656:2;10636:18;;;10629:30;-1:-1:-1;;;10675:18:1;;;10668:52;10737:18;;14924:52:0::1;10415:346:1::0;14924:52:0::1;14987:5;:11:::0;;-1:-1:-1;;;;;14987:11:0;;::::1;;;-1:-1:-1::0;;;;;;14987:11:0;;::::1;::::0;;;::::1;::::0;;14860:146::o;10567:178::-;9026:16;;10666:4;;10645:10;;-1:-1:-1;;;9026:16:0;;;;:28;;;;-1:-1:-1;9046:8:0;;-1:-1:-1;;;9046:8:0;;;;9026:28;9025:47;;;-1:-1:-1;9067:5:0;;-1:-1:-1;;;;;9059:13:0;;;9067:5;;;;;9059:13;9025:47;:77;;;-1:-1:-1;9091:10:0;9076:26;;;;:14;:26;;;;;;;;9025:77;9017:109;;;;-1:-1:-1;;;9017:109:0;;;;;;;:::i;:::-;10683:32:::1;10693:10;10705:2;10709:5;10683:9;:32::i;:::-;-1:-1:-1::0;10733:4:0::1;::::0;10567:178;-1:-1:-1;;;10567:178:0:o;42487:108::-;8627:5;;;;;-1:-1:-1;;;;;8627:5:0;8613:10;:19;8605:72;;;;-1:-1:-1;;;8605:72:0;;;;;;;:::i;:::-;42562:16:::1;:25:::0;42487:108::o;38704:100::-;8627:5;;;;;-1:-1:-1;;;;;8627:5:0;8613:10;:19;8605:72;;;;-1:-1:-1;;;8605:72:0;;;;;;;:::i;:::-;38775:12:::1;:21:::0;38704:100::o;20173:225::-;8627:5;;;;;-1:-1:-1;;;;;8627:5:0;8613:10;:19;8605:72;;;;-1:-1:-1;;;8605:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20266:14:0;::::1;;::::0;;;:9:::1;:14;::::0;;;;;::::1;;:23;::::0;:43:::1;;-1:-1:-1::0;20293:16:0;::::1;20266:43;20258:91;;;::::0;-1:-1:-1;;;20258:91:0;;10968:2:1;20258:91:0::1;::::0;::::1;10950:21:1::0;11007:2;10987:18;;;10980:30;11046:34;11026:18;;;11019:62;-1:-1:-1;;;11097:18:1;;;11090:33;11140:19;;20258:91:0::1;10766:399:1::0;20258:91:0::1;-1:-1:-1::0;;;;;20360:20:0;;;::::1;;::::0;;;:15:::1;:20;::::0;;;;:30;;-1:-1:-1;;20360:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;20173:225::o;38138:109::-;8627:5;;;;;-1:-1:-1;;;;;8627:5:0;8613:10;:19;8605:72;;;;-1:-1:-1;;;8605:72:0;;;;;;;:::i;:::-;38209:20:::1;:30:::0;;;::::1;;-1:-1:-1::0;;;38209:30:0::1;-1:-1:-1::0;;;;38209:30:0;;::::1;::::0;;;::::1;::::0;;38138:109::o;19514:104::-;19583:14;;:27;;;-1:-1:-1;;;19583:27:0;;;;19556:7;;-1:-1:-1;;;;;19583:14:0;;:25;;:27;;;;;;;;;;;;;;:14;:27;;;;;;;;;;;;;;20406:191;8627:5;;;;;-1:-1:-1;;;;;8627:5:0;8613:10;:19;8605:72;;;;-1:-1:-1;;;8605:72:0;;;;;;;:::i;:::-;20510:23:::1;:35:::0;;;;20556:23:::1;:33:::0;20406:191::o;37889:237::-;8627:5;;;;;-1:-1:-1;;;;;8627:5:0;8613:10;:19;8605:72;;;;-1:-1:-1;;;8605:72:0;;;;;;;:::i;:::-;37966:11:::1;:35:::0;;-1:-1:-1;;;;;;37966:35:0::1;-1:-1:-1::0;;;;;37966:35:0;;::::1;::::0;;::::1;::::0;;;38038:5:::1;::::0;38012:32:::1;::::0;-1:-1:-1;;;38012:32:0;;37966:35:::1;38038:5:::0;;::::1;::::0;;::::1;38012:32;::::0;::::1;3694:51:1::0;37966:35:0;38012:25:::1;::::0;3667:18:1;;38012:32:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;38055:21:0::1;:28:::0;;-1:-1:-1;;;;38094:24:0;-1:-1:-1;;;38094:24:0;;;-1:-1:-1;;;37889:237:0:o;42178:152::-;-1:-1:-1;;;;;42263:21:0;;42239:4;42263:21;;;:16;:21;;;;;;;;;:59;;-1:-1:-1;42306:16:0;;-1:-1:-1;;;;;42288:14:0;;:9;:14;;;;;;;;;;;:34;;42256:66;42178:152;-1:-1:-1;;42178:152:0:o;37632:217::-;37705:8;;37682:7;;-1:-1:-1;;;37705:8:0;;;;37702:121;;;37763:1;37749:11;;37734:12;:26;;;;:::i;:::-;:30;37730:82;;;-1:-1:-1;37792:4:0;;37632:217::o;37730:82::-;-1:-1:-1;37840:1:0;;37632:217::o;17723:144::-;-1:-1:-1;;;;;17795:23:0;;;;;;:15;:23;;;;;:30;;-1:-1:-1;;17795:30:0;17821:4;17795:30;;;17836:23;17811:6;21502:139;-1:-1:-1;;;;;21574:18:0;;;;;;:10;:18;;;;;:25;;-1:-1:-1;;21574:25:0;21595:4;21574:25;;;21610:23;21585:6;34758:142;-1:-1:-1;;;;;34830:21:0;;;;;;:13;:21;;;;;:28;;-1:-1:-1;;34830:28:0;34854:4;34830:28;;;34869:23;34844:6;9250:151;9313:5;:14;;-1:-1:-1;;;;;;9313:14:0;;-1:-1:-1;;;;;9313:14:0;;;;;;;;;;;;9353:5;;;;;-1:-1:-1;9338:21:0;;;:14;:21;;;;;:28;;-1:-1:-1;;9338:28:0;-1:-1:-1;9338:28:0;;;9388:5;;9377:8;:16;;9388:5;;;;;;;-1:-1:-1;;;;;;9377:16:0;;;;;;9250:151::o;34912:161::-;8627:5;;;;;-1:-1:-1;;;;;8627:5:0;8613:10;:19;8605:72;;;;-1:-1:-1;;;8605:72:0;;;;;;;:::i;:::-;34975:14:::1;:12;:14::i;:::-;35013:15;35000:10;:28:::0;35053:12:::1;35039:11;:26:::0;34912:161::o;16600:792::-;-1:-1:-1;;;;;16687:16:0;;16679:51;;;;-1:-1:-1;;;16679:51:0;;10617:2:1;16679:51:0;;;10599:21:1;10656:2;10636:18;;;10629:30;-1:-1:-1;;;10675:18:1;;;10668:52;10737:18;;16679:51:0;10415:346:1;16679:51:0;-1:-1:-1;;;;;16749:25:0;;;;;;:19;:25;;;;;;;;:34;16741:77;;;;-1:-1:-1;;;16741:77:0;;11372:2:1;16741:77:0;;;11354:21:1;11411:2;11391:18;;;11384:30;11450:32;11430:18;;;11423:60;11500:18;;16741:77:0;11170:354:1;16741:77:0;16843:16;;;;16839:546;;;-1:-1:-1;;;;;16896:15:0;;:9;:15;;;;;;;;;;;:23;;16914:5;;16896:23;:::i;:::-;-1:-1:-1;;;;;16878:15:0;;;:9;:15;;;;;;;;;;;:41;;;;16950:13;;;;;;;:21;;16966:5;;16950:21;:::i;:::-;-1:-1:-1;;;;;16934:13:0;;;:9;:13;;;;;;;;;;;;:37;;;;16991:25;3069::1;;;16934:13:0;;16991:25;;;;-1:-1:-1;;;;;;;;;;;16991:25:0;3042:18:1;16991:25:0;2923:177:1;16839:546:0;17051:28;17063:4;17069:2;17073:5;17051:11;:28::i;:::-;17096:22;17121:40;17145:4;17151:2;17155:5;17121:23;:40::i;:::-;-1:-1:-1;;;;;17194:15:0;;:9;:15;;;;;;;;;;;17096:65;;-1:-1:-1;17194:23:0;;17212:5;;17194:23;:::i;:::-;-1:-1:-1;;;;;17176:15:0;;;:9;:15;;;;;;;;;;;:41;;;;17248:13;;;;;;;:30;;17264:14;;17248:30;:::i;:::-;-1:-1:-1;;;;;17232:13:0;;;:9;:13;;;;;;;;;;;;:46;;;;17300:34;3069:25:1;;;17232:13:0;;17300:34;;;;-1:-1:-1;;;;;;;;;;;17300:34:0;3042:18:1;17300:34:0;;;;;;;17351:22;15162:134;16839:546;16600:792;;;:::o;22930:263::-;-1:-1:-1;;;;;23005:21:0;;22997:30;;;;;;23070:5;23055:12;;:20;;;;:::i;:::-;23040:12;:35;-1:-1:-1;;;;;23107:18:0;;:9;:18;;;;;;;;;;;:26;;23128:5;;23107:26;:::i;:::-;-1:-1:-1;;;;;23086:18:0;;:9;:18;;;;;;;;;;;:47;;;;23149:36;;3069:25:1;;;23086:9:0;;-1:-1:-1;;;;;;;;;;;23149:36:0;3042:18:1;23149:36:0;;;;;;;22930:263;;:::o;14358:77::-;8627:5;;;;;-1:-1:-1;;;;;8627:5:0;8613:10;:19;8605:72;;;;-1:-1:-1;;;8605:72:0;;;;;;;:::i;:::-;14412:8:::1;:15:::0;;-1:-1:-1;;;;14412:15:0::1;-1:-1:-1::0;;;14412:15:0::1;::::0;;14358:77::o;41616:165::-;41739:34;41757:4;41763:2;41767:5;41739:17;:34::i;41793:214::-;41926:7;41953:46;41983:4;41989:2;41993:5;41953:29;:46::i;:::-;41946:53;41793:214;-1:-1:-1;;;;41793:214:0:o;18811:570::-;18928:8;;-1:-1:-1;;;18928:8:0;;;;:37;;;;-1:-1:-1;18954:11:0;;-1:-1:-1;;;18954:11:0;;;;18928:37;:68;;;;-1:-1:-1;;;;;;18983:13:0;;;;;;:9;:13;;;;;;;;18928:68;:123;;;;;19036:15;19014:13;;19030:2;19014:18;;;;:::i;:::-;:37;;18928:123;:201;;;;-1:-1:-1;19106:23:0;;19086:14;;-1:-1:-1;;;;;19086:14:0;19068:9;:34;;;;;;;;;;;:61;;18928:201;:240;;;;-1:-1:-1;;;;;;19147:21:0;;;;;;:15;:21;;;;;;;;19146:22;18928:240;:289;;;;;19185:14;;;;;;;;;-1:-1:-1;;;;;19185:14:0;-1:-1:-1;;;;;19185:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:32;18928:289;18910:419;;;19260:15;19244:13;:31;19290:14;;:27;;;-1:-1:-1;;;19290:27:0;;;;-1:-1:-1;;;;;19290:14:0;;;;:25;;:27;;;;;:14;;:27;;;;;;;;:14;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18910:419;19339:34;19357:4;19363:2;19367:5;19339:17;:34::i;17885:916::-;-1:-1:-1;;;;;18071:21:0;;17994:7;18071:21;;;:15;:21;;;;;;18049:5;;18071:21;;:30;;;:62;;-1:-1:-1;;;;;;18105:19:0;;;;;;:15;:19;;;;;;;;:28;18071:62;:74;;;;-1:-1:-1;18137:8:0;;-1:-1:-1;;;18137:8:0;;;;18071:74;18067:390;;;-1:-1:-1;;;;;18166:15:0;;;;;;:9;:15;;;;;;;;18162:284;;;18253:14;;:32;;-1:-1:-1;;;18253:32:0;;;;;3069:25:1;;;-1:-1:-1;;;;;18253:14:0;;;;:25;;3042:18:1;;18253:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18236:49;;18162:284;;;-1:-1:-1;;;;;18311:13:0;;;;;;:9;:13;;;;;;;;18307:139;;;18397:14;;:33;;-1:-1:-1;;;18397:33:0;;;;;3069:25:1;;;-1:-1:-1;;;;;18397:14:0;;;;:26;;3042:18:1;;18397:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18380:50;;18307:139;18469:17;18489:22;18497:14;18489:5;:22;:::i;:::-;18469:42;-1:-1:-1;18526:13:0;;18522:199;;18611:14;;-1:-1:-1;;;;;18611:14:0;18593:9;:34;;;;;;;;;;;:46;;18630:9;;18593:46;:::i;:::-;18574:14;;;-1:-1:-1;;;;;18574:14:0;;;18556:9;:34;;;;;;;;;;;;:83;;;;18682:14;;18659:50;;3069:25:1;;;18682:14:0;;;;18659:50;;;;-1:-1:-1;;;;;;;;;;;18659:50:0;3042:18:1;18659:50:0;;;;;;;18522:199;18738:55;18768:4;18774:2;18778:14;18738:29;:55::i;:::-;18731:62;17885:916;-1:-1:-1;;;;;;17885:916:0:o;35085:1682::-;35192:20;;-1:-1:-1;;;35192:20:0;;;;:29;;:62;;-1:-1:-1;35234:10:0;35225:20;;;;:8;:20;;;;;;;;:29;35192:62;35184:90;;;;-1:-1:-1;;;35184:90:0;;11731:2:1;35184:90:0;;;11713:21:1;11770:2;11750:18;;;11743:30;-1:-1:-1;;;11789:18:1;;;11782:45;11844:18;;35184:90:0;11529:339:1;35184:90:0;35299:8;;-1:-1:-1;;;35299:8:0;;;;:25;;;;-1:-1:-1;35319:5:0;;-1:-1:-1;;;;;35311:13:0;;;35319:5;;;;;35311:13;;35299:25;:57;;;;-1:-1:-1;;;;;;35328:19:0;;;;;;:13;:19;;;;;;;;:28;35299:57;:87;;;;-1:-1:-1;;;;;;35360:17:0;;;;;;:13;:17;;;;;;;;:26;35299:87;35295:1410;;;35421:11;;:15;35417:122;;35477:11;;35464:9;:24;;35456:67;;;;-1:-1:-1;;;35456:67:0;;12075:2:1;35456:67:0;;;12057:21:1;12114:2;12094:18;;;12087:30;12153:32;12133:18;;;12126:60;12203:18;;35456:67:0;11873:354:1;35456:67:0;35586:1;35571:12;;:16;:42;;;;-1:-1:-1;;;;;;35591:13:0;;;;;;:9;:13;;;;;;;;:22;35571:42;35567:164;;;35668:10;:8;:10::i;:::-;-1:-1:-1;;;;;35643:13:0;;:9;:13;;;;;;;;;;;:21;;35659:5;;35643:21;:::i;:::-;:35;;35634:81;;;;-1:-1:-1;;;35634:81:0;;12434:2:1;35634:81:0;;;12416:21:1;;;12453:18;;;12446:30;12512:34;12492:18;;;12485:62;12564:18;;35634:81:0;12232:356:1;35634:81:0;35778:1;35763:12;;:16;:33;;;;-1:-1:-1;;;;;;35783:13:0;;;;;;:9;:13;;;;;;;;35763:33;35759:139;;;35835:10;:8;:10::i;:::-;35826:5;:19;;35817:65;;;;-1:-1:-1;;;35817:65:0;;12795:2:1;35817:65:0;;;12777:21:1;;;12814:18;;;12807:30;12873:34;12853:18;;;12846:62;12925:18;;35817:65:0;12593:356:1;35817:65:0;35929:24;;-1:-1:-1;;;35929:24:0;;;;35926:635;;;-1:-1:-1;;;;;35978:23:0;;;;;;:19;:23;;;;;;36005:12;35978:39;;35974:146;;-1:-1:-1;;;;;36042:12:0;;;;;;:8;:12;;;;;:19;;-1:-1:-1;;36042:19:0;36057:4;36042:19;;;36084:13;:16;;;;;;:::i;:::-;;;;;;35974:146;-1:-1:-1;;;;;36142:25:0;;;;;;:19;:25;;;;;;36171:12;36142:41;;36138:150;;-1:-1:-1;;;;;36208:14:0;;;;;;:8;:14;;;;;:21;;-1:-1:-1;;36208:21:0;36225:4;36208:21;;;36252:13;:16;;;;;;:::i;:::-;;;;;;36138:150;-1:-1:-1;;;;;36310:13:0;;;;;;:9;:13;;;;;;;;:22;;;;36306:109;;-1:-1:-1;;;;;36357:23:0;;;;;;:19;:23;;;;;36383:12;36357:38;;36306:109;-1:-1:-1;;;;;36437:15:0;;;;;;:9;:15;;;;;;;;:24;;;;36433:113;;-1:-1:-1;;;;;36486:25:0;;;;;;:19;:25;;;;;36514:12;36486:40;;36433:113;36593:17;;-1:-1:-1;;;36593:17:0;;;;36589:105;;;36631:11;;:47;;-1:-1:-1;;;36631:47:0;;-1:-1:-1;;;;;13352:15:1;;;36631:47:0;;;13334:34:1;13404:15;;;13384:18;;;13377:43;13436:18;;;13429:34;;;36631:11:0;;;;:30;;13269:18:1;;36631:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16600:792;;;:::o;36779:562::-;36953:8;;36888:7;;36933:5;;-1:-1:-1;;;36953:8:0;;;;:34;;;;-1:-1:-1;36965:22:0;;-1:-1:-1;;;36965:22:0;;;;36953:34;36949:312;;;37016:5;;-1:-1:-1;;;;;37008:13:0;;;37016:5;;;;;37008:13;;;;:32;;;37039:1;37025:11;:9;:11::i;:::-;:15;37008:32;:64;;;;-1:-1:-1;;;;;;37044:19:0;;;;;;:13;:19;;;;;;;;:28;37008:64;:94;;;;-1:-1:-1;;;;;;37076:17:0;;;;;;:13;:17;;;;;;;;:26;37008:94;37004:246;;;37123:17;37167:5;37152:11;:9;:11::i;:::-;37144:19;;:5;:19;:::i;:::-;37143:29;;;;:::i;:::-;37123:49;-1:-1:-1;37208:26:0;37123:49;37208:14;:26;:::i;:::-;37191:43;;37104:146;37004:246;37278:55;37308:4;37314:2;37318:14;37278:29;:55::i;:::-;37271:62;36779:562;-1:-1:-1;;;;;36779:562:0:o;14537:205::-;14637:7;14673:2;-1:-1:-1;;;;;14665:10:0;:4;-1:-1:-1;;;;;14665:10:0;;14657:54;;;;-1:-1:-1;;;14657:54:0;;13676:2:1;14657:54:0;;;13658:21:1;13715:2;13695:18;;;13688:30;13754:33;13734:18;;;13727:61;13805:18;;14657:54:0;13474:355:1;14657:54:0;-1:-1:-1;14729:5:0;14537:205;-1:-1:-1;;14537:205:0:o;206:423:1:-;248:3;286:5;280:12;313:6;308:3;301:19;338:1;348:162;362:6;359:1;356:13;348:162;;;424:4;480:13;;;476:22;;470:29;452:11;;;448:20;;441:59;377:12;348:162;;;352:3;555:1;548:4;539:6;534:3;530:16;526:27;519:38;618:4;611:2;607:7;602:2;594:6;590:15;586:29;581:3;577:39;573:50;566:57;;;206:423;;;;:::o;634:220::-;783:2;772:9;765:21;746:4;803:45;844:2;833:9;829:18;821:6;803:45;:::i;:::-;795:53;634:220;-1:-1:-1;;;634:220:1:o;859:127::-;920:10;915:3;911:20;908:1;901:31;951:4;948:1;941:15;975:4;972:1;965:15;991:719;1034:5;1087:3;1080:4;1072:6;1068:17;1064:27;1054:55;;1105:1;1102;1095:12;1054:55;1141:6;1128:20;1167:18;1204:2;1200;1197:10;1194:36;;;1210:18;;:::i;:::-;1285:2;1279:9;1253:2;1339:13;;-1:-1:-1;;1335:22:1;;;1359:2;1331:31;1327:40;1315:53;;;1383:18;;;1403:22;;;1380:46;1377:72;;;1429:18;;:::i;:::-;1469:10;1465:2;1458:22;1504:2;1496:6;1489:18;1550:3;1543:4;1538:2;1530:6;1526:15;1522:26;1519:35;1516:55;;;1567:1;1564;1557:12;1516:55;1631:2;1624:4;1616:6;1612:17;1605:4;1597:6;1593:17;1580:54;1678:1;1671:4;1666:2;1658:6;1654:15;1650:26;1643:37;1698:6;1689:15;;;;;;991:719;;;;:::o;1715:390::-;1793:6;1801;1854:2;1842:9;1833:7;1829:23;1825:32;1822:52;;;1870:1;1867;1860:12;1822:52;1910:9;1897:23;1943:18;1935:6;1932:30;1929:50;;;1975:1;1972;1965:12;1929:50;1998;2040:7;2031:6;2020:9;2016:22;1998:50;:::i;:::-;1988:60;2095:2;2080:18;;;;2067:32;;-1:-1:-1;;;;1715:390:1:o;2110:173::-;2178:20;;-1:-1:-1;;;;;2227:31:1;;2217:42;;2207:70;;2273:1;2270;2263:12;2207:70;2110:173;;;:::o;2288:254::-;2356:6;2364;2417:2;2405:9;2396:7;2392:23;2388:32;2385:52;;;2433:1;2430;2423:12;2385:52;2456:29;2475:9;2456:29;:::i;:::-;2446:39;2532:2;2517:18;;;;2504:32;;-1:-1:-1;;;2288:254:1:o;2547:186::-;2606:6;2659:2;2647:9;2638:7;2634:23;2630:32;2627:52;;;2675:1;2672;2665:12;2627:52;2698:29;2717:9;2698:29;:::i;2738:180::-;2797:6;2850:2;2838:9;2829:7;2825:23;2821:32;2818:52;;;2866:1;2863;2856:12;2818:52;-1:-1:-1;2889:23:1;;2738:180;-1:-1:-1;2738:180:1:o;3105:118::-;3191:5;3184:13;3177:21;3170:5;3167:32;3157:60;;3213:1;3210;3203:12;3228:315;3293:6;3301;3354:2;3342:9;3333:7;3329:23;3325:32;3322:52;;;3370:1;3367;3360:12;3322:52;3393:29;3412:9;3393:29;:::i;:::-;3383:39;;3472:2;3461:9;3457:18;3444:32;3485:28;3507:5;3485:28;:::i;:::-;3532:5;3522:15;;;3228:315;;;;;:::o;3756:328::-;3833:6;3841;3849;3902:2;3890:9;3881:7;3877:23;3873:32;3870:52;;;3918:1;3915;3908:12;3870:52;3941:29;3960:9;3941:29;:::i;:::-;3931:39;;3989:38;4023:2;4012:9;4008:18;3989:38;:::i;:::-;3979:48;;4074:2;4063:9;4059:18;4046:32;4036:42;;3756:328;;;;;:::o;4278:241::-;4334:6;4387:2;4375:9;4366:7;4362:23;4358:32;4355:52;;;4403:1;4400;4393:12;4355:52;4442:9;4429:23;4461:28;4483:5;4461:28;:::i;4753:396::-;4831:6;4839;4892:2;4880:9;4871:7;4867:23;4863:32;4860:52;;;4908:1;4905;4898:12;4860:52;4948:9;4935:23;4981:18;4973:6;4970:30;4967:50;;;5013:1;5010;5003:12;4967:50;5036;5078:7;5069:6;5058:9;5054:22;5036:50;:::i;:::-;5026:60;;;5105:38;5139:2;5128:9;5124:18;5105:38;:::i;:::-;5095:48;;4753:396;;;;;:::o;5154:260::-;5222:6;5230;5283:2;5271:9;5262:7;5258:23;5254:32;5251:52;;;5299:1;5296;5289:12;5251:52;5322:29;5341:9;5322:29;:::i;:::-;5312:39;;5370:38;5404:2;5393:9;5389:18;5370:38;:::i;5419:248::-;5487:6;5495;5548:2;5536:9;5527:7;5523:23;5519:32;5516:52;;;5564:1;5561;5554:12;5516:52;-1:-1:-1;;5587:23:1;;;5657:2;5642:18;;;5629:32;;-1:-1:-1;5419:248:1:o;5672:404::-;5874:2;5856:21;;;5913:2;5893:18;;;5886:30;5952:34;5947:2;5932:18;;5925:62;-1:-1:-1;;;6018:2:1;6003:18;;5996:38;6066:3;6051:19;;5672:404::o;6081:380::-;6160:1;6156:12;;;;6203;;;6224:61;;6278:4;6270:6;6266:17;6256:27;;6224:61;6331:2;6323:6;6320:14;6300:18;6297:38;6294:161;;6377:10;6372:3;6368:20;6365:1;6358:31;6412:4;6409:1;6402:15;6440:4;6437:1;6430:15;6294:161;;6081:380;;;:::o;6466:291::-;6643:2;6632:9;6625:21;6606:4;6663:45;6704:2;6693:9;6689:18;6681:6;6663:45;:::i;:::-;6655:53;;6744:6;6739:2;6728:9;6724:18;6717:34;6466:291;;;;;:::o;6762:343::-;6964:2;6946:21;;;7003:2;6983:18;;;6976:30;-1:-1:-1;;;7037:2:1;7022:18;;7015:49;7096:2;7081:18;;6762:343::o;7110:352::-;7312:2;7294:21;;;7351:2;7331:18;;;7324:30;7390;7385:2;7370:18;;7363:58;7453:2;7438:18;;7110:352::o;7467:127::-;7528:10;7523:3;7519:20;7516:1;7509:31;7559:4;7556:1;7549:15;7583:4;7580:1;7573:15;7599:128;7666:9;;;7687:11;;;7684:37;;;7701:18;;:::i;7732:125::-;7797:9;;;7818:10;;;7815:36;;;7831:18;;:::i;8620:184::-;8690:6;8743:2;8731:9;8722:7;8718:23;8714:32;8711:52;;;8759:1;8756;8749:12;8711:52;-1:-1:-1;8782:16:1;;8620:184;-1:-1:-1;8620:184:1:o;8809:317::-;8986:2;8975:9;8968:21;8949:4;9006:45;9047:2;9036:9;9032:18;9024:6;9006:45;:::i;:::-;8998:53;;9116:1;9112;9107:3;9103:11;9099:19;9091:6;9087:32;9082:2;9071:9;9067:18;9060:60;8809:317;;;;;:::o;9131:168::-;9204:9;;;9235;;9252:15;;;9246:22;;9232:37;9222:71;;9273:18;;:::i;9304:217::-;9344:1;9370;9360:132;;9414:10;9409:3;9405:20;9402:1;9395:31;9449:4;9446:1;9439:15;9477:4;9474:1;9467:15;9360:132;-1:-1:-1;9506:9:1;;9304:217::o;9805:245::-;9872:6;9925:2;9913:9;9904:7;9900:23;9896:32;9893:52;;;9941:1;9938;9931:12;9893:52;9973:9;9967:16;9992:28;10014:5;9992:28;:::i;12954:135::-;12993:3;13014:17;;;13011:43;;13034:18;;:::i;:::-;-1:-1:-1;13081:1:1;13070:13;;12954:135::o
Swarm Source
ipfs://1c9bf0ac564be296bd7b92234f1e8c87a80f526e8c209c7fe4f72285788feba4
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.