Token Frens
Overview CRC20
Price
$0.01 @ 0.066246 CRO
Fully Diluted Market Cap
Total Supply:
1,000,000 FRENS
Holders:
903 addresses
Contract:
Decimals:
9
Official Site:
Balance
3.235571215 FRENSValue
$0.03 ( ~0.198587300074041 CRO) [0.0003%]
[ Download CSV Export ]
[ Download CSV Export ]
OVERVIEW
FRENS is the innovative and exciting new community reward token on Cronos.Update? Click here to update the token ICO / general information
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Frens
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at cronoscan.com on 2022-01-07 */ // File: Frens.sol // Henlo frens pragma solidity 0.8.4; abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return payable(msg.sender); } function _msgData() internal view virtual returns (bytes memory) { this; return msg.data; } } interface ICRC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } library SafeMath { function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } library Address { function isContract(address account) internal view returns (bool) { bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { if (returndata.length > 0) { assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } contract Ownable is Context { address private _owner; address private _oldOwner; uint256 private _lockTime; event OwnershipTransferred(address indexed oldOwner, address indexed newOwner); constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } function owner() public view returns (address) { return _owner; } modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } function transferOwnership(address newOwner) external virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } function getUnlockTime() public view returns (uint256) { return _lockTime; } function getTime() public view returns (uint256) { return block.timestamp; } function lock(uint256 time) external virtual onlyOwner { _oldOwner = _owner; _owner = address(0); _lockTime = block.timestamp + time; emit OwnershipTransferred(_owner, address(0)); } function unlock() external virtual { require(_oldOwner == msg.sender, "Ownable: permission to unlock denied"); require(block.timestamp > _lockTime , "Ownable: contract is locked"); emit OwnershipTransferred(_owner, _oldOwner); _owner = _oldOwner; _oldOwner = address(0); // Prevents old owner re-taking ownership. } } interface IDEXFactory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } interface IDEXPair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } interface IDEXRouter { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } contract Frens is Context, ICRC20, Ownable { using SafeMath for uint256; using Address for address; address public immutable deadAddress = 0x000000000000000000000000000000000000dEaD; mapping (address => uint256) private _rOwned; mapping (address => uint256) private _tOwned; mapping (address => mapping (address => uint256)) private _allowances; mapping (address => User) private cooldown; mapping (address => bool) private _isNonFren; address[] private _confirmedNonFrens; mapping (address => bool) private _isExcludedFromTax; mapping (address => bool) private _isExcludedFromReward; address[] private _excluded; uint256 private constant MAX = ~uint256(0); uint256 private _tTotal = 1e6 * 10**9; uint256 private _rTotal = (MAX - (MAX % _tTotal)); uint256 private _tSunTotal; string private constant _name = "Frens"; string private constant _symbol = "FRENS"; uint8 private constant _decimals = 9; address payable private frenFund; address payable private oldFrenFund; uint256 public launchTime; uint256 private buyLimitEnd; uint256 public _sunFee = 0; uint256 private _oldSunFee; uint256 public _moonFee = 0; uint256 private _oldMoonFee; uint256 public _baseMoonFee; uint256 private _oldBaseMoonFee; bool private _useEclipseFeeSetter = true; uint256 private _feeMultiplier = 1000; uint256 public _minTrigger = 5000 * 10**9; uint256 private _oldMinTrigger; uint256 public z = 5000; uint256 private oldZ; uint256 public _baseAmount = 1e15; uint256 private _oldBaseAmount; uint private _maxBuyAmount; bool private _cooldownEnabled = true; bool public tradingOpen = false; IDEXRouter public DEXRouter; address public DEXPair; bool inFission; bool public _fissionEnabled = false; bool public _buyBackEnabled = false; struct User { uint256 buy; uint256 sell; bool exists; } event ContractInitiated(); event TradingEnabled(); event BuyBackToggled(bool toggle); event FissionToggled(bool toggle); event EclipseFeeSetterToggled(bool toggle); event zUpdated( uint256 indexed z, uint256 indexed newZ ); event BaseAmountUpdated( uint256 indexed baseAmount, uint256 indexed newBaseAmount ); event MinTriggerUpdated( uint256 indexed minTrigger, uint256 indexed newMinTrigger ); event BaseMoonFeeUpdated( uint256 indexed baseMoonFee, uint256 indexed newBaseMoonFee ); event SunFeeUpdated( uint256 indexed sunFee, uint256 indexed newSunFee ); event FrenFundUpdated( address indexed frenFund, address indexed newFrenFund ); event SwapCROForTokens( uint256 amountIn, address[] path ); event SwapTokensForCRO( uint256 amountIn, address[] path ); modifier lockTheSwap { inFission = true; _; inFission = false; } constructor () { _rOwned[_msgSender()] = _rTotal; emit Transfer(address(0), _msgSender(), _tTotal); } function enableTrading() external onlyOwner() { _maxBuyAmount = 1337 * 10**9; _baseMoonFee = 37; _moonFee = _baseMoonFee; _sunFee = 3; _fissionEnabled = true; tradingOpen = true; launchTime = block.timestamp; buyLimitEnd = block.timestamp + (45 minutes); emit TradingEnabled(); } function initContract() external onlyOwner() { IDEXRouter _DEXRouter = IDEXRouter(0xcd7d16fB918511BF7269eC4f48d61D79Fb26f918); DEXPair = IDEXFactory(_DEXRouter.factory()) .createPair(address(this), _DEXRouter.WETH()); DEXRouter = _DEXRouter; _isExcludedFromTax[owner()] = true; _isExcludedFromTax[address(this)] = true; _isExcludedFromReward[address(this)] = true; _isExcludedFromReward[deadAddress] = true; frenFund = payable(0xE47f0bE7D492E035667b16CaEF40d6cfF6EfA226); emit ContractInitiated(); } function name() external pure returns (string memory) { return _name; } function symbol() external pure returns (string memory) { return _symbol; } function decimals() external pure returns (uint8) { return _decimals; } function totalSupply() external view override returns (uint256) { return _tTotal; } function balanceOf(address account) public view override returns (uint256) { if (_isExcludedFromReward[account]) return _tOwned[account]; return tokenFromReflection(_rOwned[account]); } function transfer(address recipient, uint256 amount) external override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } function allowance(address owner, address spender) public view override returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) external override returns (bool) { _approve(_msgSender(), spender, amount); return true; } function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "CRC20: transfer amount exceeds allowance")); return true; } function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) external virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "CRC20: decreased allowance below zero")); return true; } function isExcludedFromReward(address account) public view returns (bool) { return _isExcludedFromReward[account]; } function totalSunFees() public view returns (uint256) { return _tSunTotal; } function reflectionFromToken(uint256 tAmount, bool deductTransferFee) public view returns(uint256) { require(tAmount <= _tTotal, "Amount must be less than supply"); if (!deductTransferFee) { (uint256 rAmount,,,,,) = _getValues(tAmount); return rAmount; } else { (,uint256 rTransferAmount,,,,) = _getValues(tAmount); return rTransferAmount; } } function tokenFromReflection(uint256 rAmount) public view returns(uint256) { require(rAmount <= _rTotal, "Amount must be less than total reflections"); uint256 currentRate = _getRate(); return rAmount.div(currentRate); } function isNonFren(address account) public view returns (bool) { return _isNonFren[account]; } function _approve(address owner, address spender, uint256 amount) private { require(owner != address(0), "CRC20: approve from the zero address"); require(spender != address(0), "CRC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function _transfer( address sender, address recipient, uint256 amount ) private { require(sender != address(0), "CRC20: transfer from the zero address"); require(recipient != address(0), "CRC20: transfer to the zero address"); require(amount > 0, "Transfer amount must be greater than zero"); require(!_isNonFren[recipient], "Sorry, frens only!"); require(!_isNonFren[msg.sender], "Sorry, frens only!"); if(!(sender == owner() || recipient == owner() || sender == address(this) || recipient == address(this))) { if (!tradingOpen) { require(tradingOpen, "Trading not yet enabled"); } if(_cooldownEnabled) { if(!cooldown[msg.sender].exists) { cooldown[msg.sender] = User(0,0,true); } } } //buy if(sender == DEXPair && recipient != address(DEXRouter) && !_isExcludedFromTax[recipient]) { require(tradingOpen, "Trading not yet enabled"); _moonFee = _baseMoonFee; if(_cooldownEnabled) { if(buyLimitEnd > block.timestamp) { require(amount <= _maxBuyAmount, "Amount exceeds max tx limit"); require(cooldown[recipient].buy < block.timestamp, "Your buy cooldown has not expired"); cooldown[recipient].buy = block.timestamp + (34 seconds); } } } // Sells if (!inFission && _fissionEnabled && recipient == DEXPair) { // Gets dynamic eclipse fee if(_useEclipseFeeSetter) { uint256 feeBasis = amount.mul(_feeMultiplier); feeBasis = feeBasis.div(balanceOf(DEXPair).add(amount)); setFee(feeBasis); } uint256 eclipseFee = _moonFee; // Swaps FRENS for CRO uint256 contractTokenBalance = balanceOf(address(this)); if(contractTokenBalance > 0) { swapTokens(contractTokenBalance); } // Buybacks uint256 balance = address(this).balance; // Buyback only if sell amount >= _minTrigger if (_buyBackEnabled && amount >= _minTrigger) { uint256 ten = 10; // Math to determine buyback amount dependent on price impact of sell essentially uint256 buyBackAmount = _baseAmount.mul(ten.add(((eclipseFee.sub(_baseMoonFee)).mul(z)).div(_baseMoonFee))).div(10); if (balance >= buyBackAmount) buyBackTokens(buyBackAmount); } // Restore eclipseFee after buyback _moonFee = eclipseFee; } bool takeFee = true; // Check for tax whitelisting if(_isExcludedFromTax[sender] || _isExcludedFromTax[recipient]){ takeFee = false; } // Execute transfer _tokenTransfer(sender, recipient,amount,takeFee); } function swapTokens(uint256 contractTokenBalance) private lockTheSwap { uint256 initialBalance = address(this).balance; // Swap FRENS from the moon fee into CRO swapTokensForCRO(contractTokenBalance); uint256 transferredBalance = address(this).balance.sub(initialBalance); // Deliver the 1/3 dev/marketing portion of the moon fee to the fren fund wallet transferToAddressCRO(frenFund, transferredBalance.div(3)); } function buyBackTokens(uint256 amount) private lockTheSwap { if (amount > 0) { swapCROForTokens(amount); } } function setFee(uint256 eclipseFee) private { uint256 _eclipseFee = _baseMoonFee; if(eclipseFee < _baseMoonFee) { _eclipseFee = _baseMoonFee; } else if(eclipseFee > 40) { _eclipseFee = 40; } else { _eclipseFee = eclipseFee; } if(_eclipseFee.mod(2) != 0) { _eclipseFee++; } _moonFee = _eclipseFee; } function swapTokensForCRO(uint256 tokenAmount) private { // Generate the DEX pair path of token -> WCRO address[] memory path = new address[](2); path[0] = address(this); path[1] = DEXRouter.WETH(); _approve(address(this), address(DEXRouter), tokenAmount); // Make the swap DEXRouter.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, path, address(this), block.timestamp ); emit SwapTokensForCRO(tokenAmount, path); } function swapCROForTokens(uint256 amount) private { // Generate the DEX pair path of FRENS -> WCRO address[] memory path = new address[](2); path[0] = DEXRouter.WETH(); path[1] = address(this); // Make the swap DEXRouter.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amount}( 0, path, deadAddress, block.timestamp.add(300) ); emit SwapCROForTokens(amount, path); } function _tokenTransfer(address sender, address recipient, uint256 amount,bool takeFee) private { if(!takeFee) removeAllFee(); if (_isExcludedFromReward[sender] && !_isExcludedFromReward[recipient]) { _transferFromExcluded(sender, recipient, amount); } else if (!_isExcludedFromReward[sender] && _isExcludedFromReward[recipient]) { _transferToExcluded(sender, recipient, amount); } else if (_isExcludedFromReward[sender] && _isExcludedFromReward[recipient]) { _transferBothExcluded(sender, recipient, amount); } else { _transferStandard(sender, recipient, amount); } if(!takeFee) restoreAllFee(); } function _transferStandard(address sender, address recipient, uint256 tAmount) private { (uint256 rAmount, uint256 rTransferAmount, uint256 rSun, uint256 tTransferAmount, uint256 tSun, uint256 tMoon) = _getValues(tAmount); _rOwned[sender] = _rOwned[sender].sub(rAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); _getMoonFee(tMoon); _getSunFee(rSun, tSun); emit Transfer(sender, recipient, tTransferAmount); } function _transferToExcluded(address sender, address recipient, uint256 tAmount) private { (uint256 rAmount, uint256 rTransferAmount, uint256 rSun, uint256 tTransferAmount, uint256 tSun, uint256 tMoon) = _getValues(tAmount); _rOwned[sender] = _rOwned[sender].sub(rAmount); _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); _getMoonFee(tMoon); _getSunFee(rSun, tSun); emit Transfer(sender, recipient, tTransferAmount); } function _transferFromExcluded(address sender, address recipient, uint256 tAmount) private { (uint256 rAmount, uint256 rTransferAmount, uint256 rSun, uint256 tTransferAmount, uint256 tSun, uint256 tMoon) = _getValues(tAmount); _tOwned[sender] = _tOwned[sender].sub(tAmount); _rOwned[sender] = _rOwned[sender].sub(rAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); _getMoonFee(tMoon); _getSunFee(rSun, tSun); emit Transfer(sender, recipient, tTransferAmount); } function _transferBothExcluded(address sender, address recipient, uint256 tAmount) private { (uint256 rAmount, uint256 rTransferAmount, uint256 rSun, uint256 tTransferAmount, uint256 tSun, uint256 tMoon) = _getValues(tAmount); _tOwned[sender] = _tOwned[sender].sub(tAmount); _rOwned[sender] = _rOwned[sender].sub(rAmount); _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); _getMoonFee(tMoon); _getSunFee(rSun, tSun); emit Transfer(sender, recipient, tTransferAmount); } function _getSunFee(uint256 rSun, uint256 tSun) private { _rTotal = _rTotal.sub(rSun); _tSunTotal = _tSunTotal.add(tSun); } function _getValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256, uint256, uint256) { (uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getTValues(tAmount); (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tLiquidity, _getRate()); return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee, tLiquidity); } function _getTValues(uint256 tAmount) private view returns (uint256, uint256, uint256) { uint256 tSun = calculateSunFee(tAmount); uint256 tMoon = calculateMoonFee(tAmount); uint256 tTransferAmount = tAmount.sub(tSun).sub(tMoon); return (tTransferAmount, tSun, tMoon); } function _getRValues(uint256 tAmount, uint256 tSun, uint256 tMoon, uint256 currentRate) private pure returns (uint256, uint256, uint256) { uint256 rAmount = tAmount.mul(currentRate); uint256 rSun = tSun.mul(currentRate); uint256 rMoon = tMoon.mul(currentRate); uint256 rTransferAmount = rAmount.sub(rSun).sub(rMoon); return (rAmount, rTransferAmount, rSun); } function _getRate() private view returns(uint256) { (uint256 rSupply, uint256 tSupply) = _getCurrentSupply(); return rSupply.div(tSupply); } function _getCurrentSupply() private view returns(uint256, uint256) { uint256 rSupply = _rTotal; uint256 tSupply = _tTotal; for (uint256 i = 0; i < _excluded.length; i++) { if (_rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply) return (_rTotal, _tTotal); rSupply = rSupply.sub(_rOwned[_excluded[i]]); tSupply = tSupply.sub(_tOwned[_excluded[i]]); } if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal); return (rSupply, tSupply); } function _getMoonFee(uint256 tMoon) private { uint256 currentRate = _getRate(); uint256 rMoon = tMoon.mul(currentRate); _rOwned[address(this)] = _rOwned[address(this)].add(rMoon); if(_isExcludedFromReward[address(this)]) _tOwned[address(this)] = _tOwned[address(this)].add(tMoon); } function calculateSunFee(uint256 _amount) private view returns (uint256) { return _amount.mul(_sunFee).div( 10**2 ); } function calculateMoonFee(uint256 _amount) private view returns (uint256) { return _amount.mul(_moonFee).div( 10**2 ); } function removeAllFee() private { if(_sunFee == 0 && _moonFee == 0) return; _oldSunFee = _sunFee; _oldMoonFee = _moonFee; _sunFee = 0; _moonFee = 0; } function restoreAllFee() private { _sunFee = _oldSunFee; _moonFee = _oldMoonFee; } function isExcludedFromTax(address _address) public view returns(bool) { return _isExcludedFromTax[_address]; } function updatefrenFund(address _newAddress) external onlyOwner() { require(_newAddress != address(0), "Zero address"); emit FrenFundUpdated(frenFund, _newAddress); oldFrenFund = payable(frenFund); frenFund = payable(_newAddress); } function toggleBuyBack(bool toggle) external onlyOwner() { _buyBackEnabled = toggle; emit BuyBackToggled(toggle); } function transferToAddressCRO(address payable recipient, uint256 amount) private { recipient.transfer(amount); } function setMinTrigger(uint256 newTrigger) external onlyOwner() { require(newTrigger != _minTrigger, "New minTrigger must be different"); emit MinTriggerUpdated(_minTrigger, newTrigger); _oldMinTrigger = _minTrigger; _minTrigger= newTrigger; } function setZ (uint256 newZ) external onlyOwner() { require(newZ != z, "New Z must be different"); emit zUpdated(z, newZ); oldZ = z; z = newZ; } function setBaseAmount(uint256 newBaseAmount) external onlyOwner() { require(newBaseAmount != _baseAmount, "New baseAmount must be different"); emit BaseAmountUpdated(_baseAmount, newBaseAmount); _oldBaseAmount = _baseAmount; _baseAmount = newBaseAmount; } function setSunFeePercent(uint256 newSunFee) external onlyOwner() { require((_baseMoonFee+newSunFee)<=20, "Total base tax cannot exceed 20%"); emit SunFeeUpdated(_sunFee, newSunFee); _oldSunFee = _sunFee; _sunFee = newSunFee; } function setBaseMoonFeePercent(uint256 newBaseMoonFee) external onlyOwner() { require((newBaseMoonFee+_sunFee)<=20, "Total base tax cannot exceed 20%"); emit BaseMoonFeeUpdated(_baseMoonFee, newBaseMoonFee); _oldBaseMoonFee = _baseMoonFee; _baseMoonFee = newBaseMoonFee; } function makeNonFren(address _address) external onlyOwner() { _isNonFren[_address] = true; _confirmedNonFrens.push(_address); } function makeFrenAgain(address _address) external onlyOwner() { _isNonFren[_address] = false; _confirmedNonFrens.pop(); } function excludeFromTax(address _address) public onlyOwner() { _isExcludedFromTax[_address] = true; } function includeInTax(address _address) external onlyOwner() { _isExcludedFromTax[_address] = false; } function excludeFromReward(address _address) public onlyOwner() { require(!_isExcludedFromReward[_address], "Address already excluded"); if(_rOwned[_address] > 0) { _tOwned[_address] = tokenFromReflection(_rOwned[_address]); } _isExcludedFromReward[_address] = true; _excluded.push(_address); } function includeInReward(address _address) external onlyOwner() { require(_isExcludedFromReward[_address], "Account already included"); for (uint256 i = 0; i < _excluded.length; i++) { if(_excluded[i] == _address) { _excluded[i] = _excluded[_excluded.length - 1]; _tOwned[_address] = 0; _isExcludedFromReward[_address] = false; _excluded.pop(); break; } } } function toggleEclipseFeeSetter(bool toggle) external onlyOwner() { emit EclipseFeeSetterToggled(toggle); _useEclipseFeeSetter = toggle; } function toggleFission(bool toggle) external onlyOwner() { emit FissionToggled(toggle); _fissionEnabled = toggle; } receive() external payable {} }
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":"uint256","name":"baseAmount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"newBaseAmount","type":"uint256"}],"name":"BaseAmountUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"baseMoonFee","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"newBaseMoonFee","type":"uint256"}],"name":"BaseMoonFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"toggle","type":"bool"}],"name":"BuyBackToggled","type":"event"},{"anonymous":false,"inputs":[],"name":"ContractInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"toggle","type":"bool"}],"name":"EclipseFeeSetterToggled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"toggle","type":"bool"}],"name":"FissionToggled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"frenFund","type":"address"},{"indexed":true,"internalType":"address","name":"newFrenFund","type":"address"}],"name":"FrenFundUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"minTrigger","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"newMinTrigger","type":"uint256"}],"name":"MinTriggerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"sunFee","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"newSunFee","type":"uint256"}],"name":"SunFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"SwapCROForTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"SwapTokensForCRO","type":"event"},{"anonymous":false,"inputs":[],"name":"TradingEnabled","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"z","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"newZ","type":"uint256"}],"name":"zUpdated","type":"event"},{"inputs":[],"name":"DEXPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEXRouter","outputs":[{"internalType":"contract IDEXRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_baseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_baseMoonFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_buyBackEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_fissionEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_minTrigger","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_moonFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sunFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","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":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"excludeFromTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUnlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"includeInReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"includeInTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isExcludedFromTax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isNonFren","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"makeFrenAgain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"makeNonFren","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBaseAmount","type":"uint256"}],"name":"setBaseAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBaseMoonFee","type":"uint256"}],"name":"setBaseMoonFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTrigger","type":"uint256"}],"name":"setMinTrigger","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newSunFee","type":"uint256"}],"name":"setSunFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newZ","type":"uint256"}],"name":"setZ","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bool","name":"toggle","type":"bool"}],"name":"toggleBuyBack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"toggle","type":"bool"}],"name":"toggleEclipseFeeSetter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"toggle","type":"bool"}],"name":"toggleFission","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSunFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newAddress","type":"address"}],"name":"updatefrenFund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"z","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a06040526ddead00000000000000000000000060805266038d7ea4c68000600c819055620000319060001962000162565b6200003f906000196200013e565b600d55600060138190556015556019805460ff191660019081179091556103e8601a5565048c27395000601b55611388601d5566038d7ea4c68000601f556022805461ffff191690911790556023805461ffff60a81b19169055348015620000a657600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600d5433600081815260036020908152604080832094909455600c549351938452919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a362000183565b6000828210156200015d57634e487b7160e01b81526011600452602481fd5b500390565b6000826200017e57634e487b7160e01b81526012600452602481fd5b500690565b60805160601c613787620001b060003960008181610465015281816116220152612f1401526137876000f3fe60806040526004361061031e5760003560e01c806370a08231116101ab578063a9059cbb116100f7578063dd46706411610095578063e2c335db1161006f578063e2c335db146109b2578063ead3eb3f146109c8578063f2fde38b146109de578063ffb54a99146109fe57600080fd5b8063dd4670641461092c578063dd62ed3e1461094c578063e17c4c741461099257600080fd5b8063c69b6517116100d1578063c69b651714610884578063cb4ca6311461089a578063d760ca11146108d3578063dc9fdce71461090c57600080fd5b8063a9059cbb1461082e578063be8012761461084e578063c5d7802e1461086e57600080fd5b80638a8c523c116101645780639ffba79b1161013e5780639ffba79b146107b9578063a3b855ce146107d9578063a457c2d7146107f9578063a69df4b51461081957600080fd5b80638a8c523c146107585780638da5cb5b1461076d57806395d89b411461078b57600080fd5b806370a0823114610693578063790ca413146106b35780637bb48853146106c95780638203f5fe146106ea57806383ffeed4146106ff57806388f820201461071f57600080fd5b80633ee951001161026a5780634ddfae4b11610223578063602bc62b116101fd578063602bc62b1461061d57806360d1259e1461063257806361abc0e51461065257806365238f041461067257600080fd5b80634ddfae4b146105d457806352390c02146105ea578063557ed1ba1461060a57600080fd5b80633ee95100146105295780633f0f5e121461053f5780633f2bff511461055f5780634549b0391461057f5780634b42ced01461059f5780634b9c8d3e146105b457600080fd5b806325f6df12116102d7578063313ce567116102b1578063313ce567146104a75780633211a83d146104c35780633685d419146104e9578063395093511461050957600080fd5b806325f6df121461043357806327c8f835146104535780632d8381191461048757600080fd5b806306fdde031461032a578063095ea7b31461036a578063179795dd1461039a57806318160ddd146103d2578063224a7c6a146103f157806323b872dd1461041357600080fd5b3661032557005b600080fd5b34801561033657600080fd5b506040805180820190915260058152644672656e7360d81b60208201525b6040516103619190613552565b60405180910390f35b34801561037657600080fd5b5061038a610385366004613452565b610a1d565b6040519015158152602001610361565b3480156103a657600080fd5b506023546103ba906001600160a01b031681565b6040516001600160a01b039091168152602001610361565b3480156103de57600080fd5b50600c545b604051908152602001610361565b3480156103fd57600080fd5b5061041161040c366004613497565b610a34565b005b34801561041f57600080fd5b5061038a61042e366004613412565b610af2565b34801561043f57600080fd5b5061041161044e3660046133a2565b610b5b565b34801561045f57600080fd5b506103ba7f000000000000000000000000000000000000000000000000000000000000000081565b34801561049357600080fd5b506103e36104a2366004613497565b610be9565b3480156104b357600080fd5b5060405160098152602001610361565b3480156104cf57600080fd5b506022546103ba906201000090046001600160a01b031681565b3480156104f557600080fd5b506104116105043660046133a2565b610c6d565b34801561051557600080fd5b5061038a610524366004613452565b610e5c565b34801561053557600080fd5b506103e360135481565b34801561054b57600080fd5b5061041161055a366004613497565b610e92565b34801561056b57600080fd5b5061041161057a366004613497565b610f53565b34801561058b57600080fd5b506103e361059a3660046134af565b611008565b3480156105ab57600080fd5b50600e546103e3565b3480156105c057600080fd5b506104116105cf3660046133a2565b611095565b3480156105e057600080fd5b506103e3601f5481565b3480156105f657600080fd5b506104116106053660046133a2565b61116e565b34801561061657600080fd5b50426103e3565b34801561062957600080fd5b506002546103e3565b34801561063e57600080fd5b5061041161064d3660046133a2565b6112c1565b34801561065e57600080fd5b5061041161066d36600461347d565b61130f565b34801561067e57600080fd5b5060235461038a90600160a81b900460ff1681565b34801561069f57600080fd5b506103e36106ae3660046133a2565b611391565b3480156106bf57600080fd5b506103e360115481565b3480156106d557600080fd5b5060235461038a90600160b01b900460ff1681565b3480156106f657600080fd5b506104116113f0565b34801561070b57600080fd5b5061041161071a36600461347d565b61169c565b34801561072b57600080fd5b5061038a61073a3660046133a2565b6001600160a01b03166000908152600a602052604090205460ff1690565b34801561076457600080fd5b5061041161170e565b34801561077957600080fd5b506000546001600160a01b03166103ba565b34801561079757600080fd5b506040805180820190915260058152644652454e5360d81b6020820152610354565b3480156107c557600080fd5b506104116107d43660046133a2565b6117b3565b3480156107e557600080fd5b506104116107f4366004613497565b611843565b34801561080557600080fd5b5061038a610814366004613452565b6118f8565b34801561082557600080fd5b50610411611947565b34801561083a57600080fd5b5061038a610849366004613452565b611a62565b34801561085a57600080fd5b50610411610869366004613497565b611a6f565b34801561087a57600080fd5b506103e3601d5481565b34801561089057600080fd5b506103e360155481565b3480156108a657600080fd5b5061038a6108b53660046133a2565b6001600160a01b031660009081526009602052604090205460ff1690565b3480156108df57600080fd5b5061038a6108ee3660046133a2565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561091857600080fd5b5061041161092736600461347d565b611b30565b34801561093857600080fd5b50610411610947366004613497565b611bad565b34801561095857600080fd5b506103e36109673660046133da565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b34801561099e57600080fd5b506104116109ad3660046133a2565b611c44565b3480156109be57600080fd5b506103e3601b5481565b3480156109d457600080fd5b506103e360175481565b3480156109ea57600080fd5b506104116109f93660046133a2565b611c8f565b348015610a0a57600080fd5b5060225461038a90610100900460ff1681565b6000610a2a338484611d79565b5060015b92915050565b6000546001600160a01b03163314610a675760405162461bcd60e51b8152600401610a5e906135a5565b60405180910390fd5b601f54811415610ab95760405162461bcd60e51b815260206004820181905260248201527f4e65772062617365416d6f756e74206d75737420626520646966666572656e746044820152606401610a5e565b601f546040518291907f146a2314596a545f43939d25996feb5216b20a0f7078d013676b5427d76bfc3d90600090a3601f805460205555565b6000610aff848484611e9d565b610b518433610b4c8560405180606001604052806028815260200161372a602891396001600160a01b038a16600090815260056020908152604080832033845290915290205491906124f6565b611d79565b5060019392505050565b6000546001600160a01b03163314610b855760405162461bcd60e51b8152600401610a5e906135a5565b6001600160a01b0381166000908152600760205260409020805460ff191690556008805480610bc457634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b031916905501905550565b6000600d54821115610c505760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610a5e565b6000610c5a612530565b9050610c668382612553565b9392505050565b6000546001600160a01b03163314610c975760405162461bcd60e51b8152600401610a5e906135a5565b6001600160a01b0381166000908152600a602052604090205460ff16610cff5760405162461bcd60e51b815260206004820152601860248201527f4163636f756e7420616c726561647920696e636c7564656400000000000000006044820152606401610a5e565b60005b600b54811015610e5857816001600160a01b0316600b8281548110610d3757634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161415610e4657600b8054610d629060019061367a565b81548110610d8057634e487b7160e01b600052603260045260246000fd5b600091825260209091200154600b80546001600160a01b039092169183908110610dba57634e487b7160e01b600052603260045260246000fd5b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600482526040808220829055600a90925220805460ff19169055600b805480610e2057634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610e5081613691565b915050610d02565b5050565b3360008181526005602090815260408083206001600160a01b03871684529091528120549091610a2a918590610b4c9086612595565b6000546001600160a01b03163314610ebc5760405162461bcd60e51b8152600401610a5e906135a5565b601481601754610ecc919061362f565b1115610f1a5760405162461bcd60e51b815260206004820181905260248201527f546f74616c2062617365207461782063616e6e6f7420657863656564203230256044820152606401610a5e565b6013546040518291907f5bafbaadffe9e69a598337ad268067711e95c25712f9b8faa0eda1f8a66f05c190600090a36013805460145555565b6000546001600160a01b03163314610f7d5760405162461bcd60e51b8152600401610a5e906135a5565b601d54811415610fcf5760405162461bcd60e51b815260206004820152601760248201527f4e6577205a206d75737420626520646966666572656e740000000000000000006044820152606401610a5e565b601d546040518291907fecbd3f9eca94d12ef71a4a0d22e13e391eefeeeeb0d52d5029fd1d49977e45d990600090a3601d8054601e5555565b6000600c5483111561105c5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610a5e565b8161107b57600061106c846125f4565b50939550610a2e945050505050565b6000611086846125f4565b50929550610a2e945050505050565b6000546001600160a01b031633146110bf5760405162461bcd60e51b8152600401610a5e906135a5565b6001600160a01b0381166111045760405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b6044820152606401610a5e565b600f546040516001600160a01b038084169216907f27708143fae6aaf3ac43f80c948cbb31e33e5b8cc169a37f6128ff7e598dc3bf90600090a3600f8054601080546001600160a01b038084166001600160a01b0319928316179092559091169216919091179055565b6000546001600160a01b031633146111985760405162461bcd60e51b8152600401610a5e906135a5565b6001600160a01b0381166000908152600a602052604090205460ff16156112015760405162461bcd60e51b815260206004820152601860248201527f4164647265737320616c7265616479206578636c7564656400000000000000006044820152606401610a5e565b6001600160a01b0381166000908152600360205260409020541561125b576001600160a01b03811660009081526003602052604090205461124190610be9565b6001600160a01b0382166000908152600460205260409020555b6001600160a01b03166000818152600a60205260408120805460ff19166001908117909155600b805491820181559091527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b0319169091179055565b6000546001600160a01b031633146112eb5760405162461bcd60e51b8152600401610a5e906135a5565b6001600160a01b03166000908152600960205260409020805460ff19166001179055565b6000546001600160a01b031633146113395760405162461bcd60e51b8152600401610a5e906135a5565b60238054821515600160b01b0260ff60b01b199091161790556040517fab073a90a6ed753578599e829eb733203df03d75aa3371824f39a137db33d2809061138690831515815260200190565b60405180910390a150565b6001600160a01b0381166000908152600a602052604081205460ff16156113ce57506001600160a01b031660009081526004602052604090205490565b6001600160a01b038216600090815260036020526040902054610a2e90610be9565b6000546001600160a01b0316331461141a5760405162461bcd60e51b8152600401610a5e906135a5565b600073cd7d16fb918511bf7269ec4f48d61d79fb26f9189050806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561146c57600080fd5b505afa158015611480573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a491906133be565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156114ec57600080fd5b505afa158015611500573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152491906133be565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b15801561156c57600080fd5b505af1158015611580573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a491906133be565b602380546001600160a01b03199081166001600160a01b03938416179091556022805462010000600160b01b03191662010000858516021790556000805483168152600960209081526040808320805460ff1990811660019081179092553085528285208054821683179055600a90935281842080548416821790557f0000000000000000000000000000000000000000000000000000000000000000909516835280832080549092169094179055600f805490921673e47f0be7d492e035667b16caef40d6cff6efa2261790915590517fa0967778d40e43722101c8ef18dd2c1c0e6325f30a2811001a971871d505af049190a150565b6000546001600160a01b031633146116c65760405162461bcd60e51b8152600401610a5e906135a5565b60405181151581527f5f6c2fd171e6c40c80061eb773522c37de37b538bdea42aea3b754af64e177f59060200160405180910390a16019805460ff1916911515919091179055565b6000546001600160a01b031633146117385760405162461bcd60e51b8152600401610a5e906135a5565b6501374b68fa006021556025601781905560155560036013556023805460ff60a81b1916600160a81b1790556022805461ff00191661010017905542601181905561178590610a8c61362f565b6012556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a1565b6000546001600160a01b031633146117dd5760405162461bcd60e51b8152600401610a5e906135a5565b6001600160a01b03166000818152600760205260408120805460ff191660019081179091556008805491820181559091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319169091179055565b6000546001600160a01b0316331461186d5760405162461bcd60e51b8152600401610a5e906135a5565b601b548114156118bf5760405162461bcd60e51b815260206004820181905260248201527f4e6577206d696e54726967676572206d75737420626520646966666572656e746044820152606401610a5e565b601b546040518291907f3baa36cd30edc6e97bf2ba1b784ba6f7ebeba34e7b4d9f256f3156379564747490600090a3601b8054601c5555565b6000610a2a3384610b4c85604051806060016040528060258152602001613705602591393360009081526005602090815260408083206001600160a01b038d16845290915290205491906124f6565b6001546001600160a01b031633146119ad5760405162461bcd60e51b8152602060048201526024808201527f4f776e61626c653a207065726d697373696f6e20746f20756e6c6f636b2064656044820152631b9a595960e21b6064820152608401610a5e565b60025442116119fe5760405162461bcd60e51b815260206004820152601b60248201527f4f776e61626c653a20636f6e7472616374206973206c6f636b656400000000006044820152606401610a5e565b600154600080546040516001600160a01b0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6000610a2a338484611e9d565b6000546001600160a01b03163314611a995760405162461bcd60e51b8152600401610a5e906135a5565b601460135482611aa9919061362f565b1115611af75760405162461bcd60e51b815260206004820181905260248201527f546f74616c2062617365207461782063616e6e6f7420657863656564203230256044820152606401610a5e565b6017546040518291907f28d82f0985175c63fc109a5155301df4c17b16f17954c1adb3b0009fd70ac1e890600090a36017805460185555565b6000546001600160a01b03163314611b5a5760405162461bcd60e51b8152600401610a5e906135a5565b60405181151581527f93ef5b81a49872978568bad131403e54e629172ca934de13b52bc8b59711051c9060200160405180910390a160238054911515600160a81b0260ff60a81b19909216919091179055565b6000546001600160a01b03163314611bd75760405162461bcd60e51b8152600401610a5e906135a5565b60008054600180546001600160a01b03199081166001600160a01b03841617909155169055611c06814261362f565b600255600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a350565b6000546001600160a01b03163314611c6e5760405162461bcd60e51b8152600401610a5e906135a5565b6001600160a01b03166000908152600960205260409020805460ff19169055565b6000546001600160a01b03163314611cb95760405162461bcd60e51b8152600401610a5e906135a5565b6001600160a01b038116611d1e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a5e565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316611ddb5760405162461bcd60e51b8152602060048201526024808201527f43524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a5e565b6001600160a01b038216611e3c5760405162461bcd60e51b815260206004820152602260248201527f43524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a5e565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611f015760405162461bcd60e51b815260206004820152602560248201527f43524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a5e565b6001600160a01b038216611f635760405162461bcd60e51b815260206004820152602360248201527f43524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a5e565b60008111611fc55760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610a5e565b6001600160a01b03821660009081526007602052604090205460ff16156120235760405162461bcd60e51b8152602060048201526012602482015271536f7272792c206672656e73206f6e6c792160701b6044820152606401610a5e565b3360009081526007602052604090205460ff16156120785760405162461bcd60e51b8152602060048201526012602482015271536f7272792c206672656e73206f6e6c792160701b6044820152606401610a5e565b6000546001600160a01b03848116911614806120a157506000546001600160a01b038381169116145b806120b457506001600160a01b03831630145b806120c757506001600160a01b03821630145b61219f57602254610100900460ff1661212b57602254610100900460ff1661212b5760405162461bcd60e51b8152602060048201526017602482015276151c98591a5b99c81b9bdd081e595d08195b98589b1959604a1b6044820152606401610a5e565b60225460ff161561219f573360009081526006602052604090206002015460ff1661219f57604080516060810182526000808252602080830182815260018486018181523385526006909352949092209251835590519282019290925590516002909101805460ff19169115159190911790555b6023546001600160a01b0384811691161480156121d057506022546001600160a01b03838116620100009092041614155b80156121f557506001600160a01b03821660009081526009602052604090205460ff16155b1561234e57602254610100900460ff1661224b5760405162461bcd60e51b8152602060048201526017602482015276151c98591a5b99c81b9bdd081e595d08195b98589b1959604a1b6044820152606401610a5e565b60175460155560225460ff161561234e5742601254111561234e576021548111156122b85760405162461bcd60e51b815260206004820152601b60248201527f416d6f756e742065786365656473206d6178207478206c696d697400000000006044820152606401610a5e565b6001600160a01b03821660009081526006602052604090205442116123295760405162461bcd60e51b815260206004820152602160248201527f596f75722062757920636f6f6c646f776e20686173206e6f74206578706972656044820152601960fa1b6064820152608401610a5e565b61233442602261362f565b6001600160a01b0383166000908152600660205260409020555b602354600160a01b900460ff161580156123715750602354600160a81b900460ff165b801561238a57506023546001600160a01b038381169116145b156124995760195460ff16156123ed5760006123b1601a548361264390919063ffffffff16565b6023549091506123e0906123d99084906123d3906001600160a01b0316611391565b90612595565b8290612553565b90506123eb816126c2565b505b60155460006123fb30611391565b9050801561240c5761240c8161270e565b6023544790600160b01b900460ff1680156124295750601b548410155b15612493576000600a9050600061247e600a61246861247561246e601754612468601d546124626017548e61276c90919063ffffffff16565b90612643565b90612553565b8690612595565b601f5490612643565b905080831061249057612490816127ae565b50505b50506015555b6001600160a01b03831660009081526009602052604090205460019060ff16806124db57506001600160a01b03831660009081526009602052604090205460ff165b156124e4575060005b6124f0848484846127e0565b50505050565b6000818484111561251a5760405162461bcd60e51b8152600401610a5e9190613552565b506000612527848661367a565b95945050505050565b600080600061253d612905565b909250905061254c8282612553565b9250505090565b6000610c6683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612abf565b6000806125a2838561362f565b905083811015610c665760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610a5e565b600080600080600080600080600061260b8a612aed565b92509250925060008060006126298d8686612624612530565b612b2f565b919f909e50909c50959a5093985091965092945050505050565b60008261265257506000610a2e565b600061265e838561365b565b90508261266b8583613647565b14610c665760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610a5e565b601754808210156126d657506017546126ea565b60288211156126e7575060286126ea565b50805b6126f5816002612b7f565b15612708578061270481613691565b9150505b60155550565b6023805460ff60a01b1916600160a01b1790554761272b82612bc1565b6000612737478361276c565b600f5490915061275a906001600160a01b0316612755836003612553565b612da4565b50506023805460ff60a01b1916905550565b6000610c6683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506124f6565b6023805460ff60a01b1916600160a01b17905580156127d0576127d081612ddf565b506023805460ff60a01b19169055565b806127ed576127ed612fc1565b6001600160a01b0384166000908152600a602052604090205460ff16801561282e57506001600160a01b0383166000908152600a602052604090205460ff16155b156128435761283e848484612fef565b6128ef565b6001600160a01b0384166000908152600a602052604090205460ff1615801561288457506001600160a01b0383166000908152600a602052604090205460ff165b156128945761283e848484613115565b6001600160a01b0384166000908152600a602052604090205460ff1680156128d457506001600160a01b0383166000908152600a602052604090205460ff165b156128e45761283e8484846131be565b6128ef848484613231565b806124f0576124f0601454601355601654601555565b600d54600c546000918291825b600b54811015612a8f578260036000600b848154811061294257634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806129bb57508160046000600b848154811061299457634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156129d157600d54600c54945094505050509091565b612a2560036000600b84815481106129f957634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054849061276c565b9250612a7b60046000600b8481548110612a4f57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054839061276c565b915080612a8781613691565b915050612912565b50600c54600d54612a9f91612553565b821015612ab657600d54600c549350935050509091565b90939092509050565b60008183612ae05760405162461bcd60e51b8152600401610a5e9190613552565b5060006125278486613647565b600080600080612afc85613275565b90506000612b0986613291565b90506000612b2182612b1b898661276c565b9061276c565b979296509094509092505050565b6000808080612b3e8886612643565b90506000612b4c8887612643565b90506000612b5a8888612643565b90506000612b6c82612b1b868661276c565b939b939a50919850919650505050505050565b6000610c6683836040518060400160405280601881526020017f536166654d6174683a206d6f64756c6f206279207a65726f00000000000000008152506132ad565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612c0457634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050602260029054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015612c7257600080fd5b505afa158015612c86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612caa91906133be565b81600181518110612ccb57634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152602254612cf79130916201000090041684611d79565b60225460405163791ac94760e01b8152620100009091046001600160a01b03169063791ac94790612d359085906000908690309042906004016135f3565b600060405180830381600087803b158015612d4f57600080fd5b505af1158015612d63573d6000803e3d6000fd5b505050507f5796abc9aed2812ca6fda4538212fe897f11e341f80e76fc61946d2cf2eb456b8282604051612d989291906135da565b60405180910390a15050565b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015612dda573d6000803e3d6000fd5b505050565b604080516002808252606082018352600092602083019080368337019050509050602260029054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015612e4e57600080fd5b505afa158015612e62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e8691906133be565b81600081518110612ea757634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110612ee957634e487b7160e01b600052603260045260246000fd5b6001600160a01b0392831660209182029290920101526022546201000090041663b6f9de95836000847f0000000000000000000000000000000000000000000000000000000000000000612f3f4261012c612595565b6040518663ffffffff1660e01b8152600401612f5e949392919061351d565b6000604051808303818588803b158015612f7757600080fd5b505af1158015612f8b573d6000803e3d6000fd5b50505050507f3989b57e2e9fd408b792cd680eb883c3864cf5f7d8b20c4ee713d48d2ba727ae8282604051612d989291906135da565b601354158015612fd15750601554155b15612fd857565b601380546014556015805460165560009182905555565b600080600080600080613001876125f4565b6001600160a01b038f16600090815260046020526040902054959b50939950919750955093509150613033908861276c565b6001600160a01b038a16600090815260046020908152604080832093909355600390522054613062908761276c565b6001600160a01b03808b1660009081526003602052604080822093909355908a16815220546130919086612595565b6001600160a01b0389166000908152600360205260409020556130b3816132e1565b6130bd8483613369565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161310291815260200190565b60405180910390a3505050505050505050565b600080600080600080613127876125f4565b6001600160a01b038f16600090815260036020526040902054959b50939950919750955093509150613159908761276c565b6001600160a01b03808b16600090815260036020908152604080832094909455918b1681526004909152205461318f9084612595565b6001600160a01b0389166000908152600460209081526040808320939093556003905220546130919086612595565b6000806000806000806131d0876125f4565b6001600160a01b038f16600090815260046020526040902054959b50939950919750955093509150613202908861276c565b6001600160a01b038a16600090815260046020908152604080832093909355600390522054613159908761276c565b600080600080600080613243876125f4565b6001600160a01b038f16600090815260036020526040902054959b50939950919750955093509150613062908761276c565b6000610a2e60646124686013548561264390919063ffffffff16565b6000610a2e60646124686015548561264390919063ffffffff16565b600081836132ce5760405162461bcd60e51b8152600401610a5e9190613552565b506132d983856136ac565b949350505050565b60006132eb612530565b905060006132f98383612643565b306000908152600360205260409020549091506133169082612595565b30600090815260036020908152604080832093909355600a9052205460ff1615612dda57306000908152600460205260409020546133549084612595565b30600090815260046020526040902055505050565b600d54613376908361276c565b600d55600e546133869082612595565b600e555050565b8035801515811461339d57600080fd5b919050565b6000602082840312156133b3578081fd5b8135610c66816136ec565b6000602082840312156133cf578081fd5b8151610c66816136ec565b600080604083850312156133ec578081fd5b82356133f7816136ec565b91506020830135613407816136ec565b809150509250929050565b600080600060608486031215613426578081fd5b8335613431816136ec565b92506020840135613441816136ec565b929592945050506040919091013590565b60008060408385031215613464578182fd5b823561346f816136ec565b946020939093013593505050565b60006020828403121561348e578081fd5b610c668261338d565b6000602082840312156134a8578081fd5b5035919050565b600080604083850312156134c1578182fd5b823591506134d16020840161338d565b90509250929050565b6000815180845260208085019450808401835b838110156135125781516001600160a01b0316875295820195908201906001016134ed565b509495945050505050565b84815260806020820152600061353660808301866134da565b6001600160a01b03949094166040830152506060015292915050565b6000602080835283518082850152825b8181101561357e57858101830151858201604001528201613562565b8181111561358f5783604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b8281526040602082015260006132d960408301846134da565b85815284602082015260a06040820152600061361260a08301866134da565b6001600160a01b0394909416606083015250608001529392505050565b60008219821115613642576136426136c0565b500190565b600082613656576136566136d6565b500490565b6000816000190483118215151615613675576136756136c0565b500290565b60008282101561368c5761368c6136c0565b500390565b60006000198214156136a5576136a56136c0565b5060010190565b6000826136bb576136bb6136d6565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6001600160a01b038116811461370157600080fd5b5056fe43524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f43524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a26469706673582212209803ac50d5c85f5dab5d2796f3513b434e1857b67649d9608f294e969722da3d64736f6c63430008040033
Deployed Bytecode
0x60806040526004361061031e5760003560e01c806370a08231116101ab578063a9059cbb116100f7578063dd46706411610095578063e2c335db1161006f578063e2c335db146109b2578063ead3eb3f146109c8578063f2fde38b146109de578063ffb54a99146109fe57600080fd5b8063dd4670641461092c578063dd62ed3e1461094c578063e17c4c741461099257600080fd5b8063c69b6517116100d1578063c69b651714610884578063cb4ca6311461089a578063d760ca11146108d3578063dc9fdce71461090c57600080fd5b8063a9059cbb1461082e578063be8012761461084e578063c5d7802e1461086e57600080fd5b80638a8c523c116101645780639ffba79b1161013e5780639ffba79b146107b9578063a3b855ce146107d9578063a457c2d7146107f9578063a69df4b51461081957600080fd5b80638a8c523c146107585780638da5cb5b1461076d57806395d89b411461078b57600080fd5b806370a0823114610693578063790ca413146106b35780637bb48853146106c95780638203f5fe146106ea57806383ffeed4146106ff57806388f820201461071f57600080fd5b80633ee951001161026a5780634ddfae4b11610223578063602bc62b116101fd578063602bc62b1461061d57806360d1259e1461063257806361abc0e51461065257806365238f041461067257600080fd5b80634ddfae4b146105d457806352390c02146105ea578063557ed1ba1461060a57600080fd5b80633ee95100146105295780633f0f5e121461053f5780633f2bff511461055f5780634549b0391461057f5780634b42ced01461059f5780634b9c8d3e146105b457600080fd5b806325f6df12116102d7578063313ce567116102b1578063313ce567146104a75780633211a83d146104c35780633685d419146104e9578063395093511461050957600080fd5b806325f6df121461043357806327c8f835146104535780632d8381191461048757600080fd5b806306fdde031461032a578063095ea7b31461036a578063179795dd1461039a57806318160ddd146103d2578063224a7c6a146103f157806323b872dd1461041357600080fd5b3661032557005b600080fd5b34801561033657600080fd5b506040805180820190915260058152644672656e7360d81b60208201525b6040516103619190613552565b60405180910390f35b34801561037657600080fd5b5061038a610385366004613452565b610a1d565b6040519015158152602001610361565b3480156103a657600080fd5b506023546103ba906001600160a01b031681565b6040516001600160a01b039091168152602001610361565b3480156103de57600080fd5b50600c545b604051908152602001610361565b3480156103fd57600080fd5b5061041161040c366004613497565b610a34565b005b34801561041f57600080fd5b5061038a61042e366004613412565b610af2565b34801561043f57600080fd5b5061041161044e3660046133a2565b610b5b565b34801561045f57600080fd5b506103ba7f000000000000000000000000000000000000000000000000000000000000dead81565b34801561049357600080fd5b506103e36104a2366004613497565b610be9565b3480156104b357600080fd5b5060405160098152602001610361565b3480156104cf57600080fd5b506022546103ba906201000090046001600160a01b031681565b3480156104f557600080fd5b506104116105043660046133a2565b610c6d565b34801561051557600080fd5b5061038a610524366004613452565b610e5c565b34801561053557600080fd5b506103e360135481565b34801561054b57600080fd5b5061041161055a366004613497565b610e92565b34801561056b57600080fd5b5061041161057a366004613497565b610f53565b34801561058b57600080fd5b506103e361059a3660046134af565b611008565b3480156105ab57600080fd5b50600e546103e3565b3480156105c057600080fd5b506104116105cf3660046133a2565b611095565b3480156105e057600080fd5b506103e3601f5481565b3480156105f657600080fd5b506104116106053660046133a2565b61116e565b34801561061657600080fd5b50426103e3565b34801561062957600080fd5b506002546103e3565b34801561063e57600080fd5b5061041161064d3660046133a2565b6112c1565b34801561065e57600080fd5b5061041161066d36600461347d565b61130f565b34801561067e57600080fd5b5060235461038a90600160a81b900460ff1681565b34801561069f57600080fd5b506103e36106ae3660046133a2565b611391565b3480156106bf57600080fd5b506103e360115481565b3480156106d557600080fd5b5060235461038a90600160b01b900460ff1681565b3480156106f657600080fd5b506104116113f0565b34801561070b57600080fd5b5061041161071a36600461347d565b61169c565b34801561072b57600080fd5b5061038a61073a3660046133a2565b6001600160a01b03166000908152600a602052604090205460ff1690565b34801561076457600080fd5b5061041161170e565b34801561077957600080fd5b506000546001600160a01b03166103ba565b34801561079757600080fd5b506040805180820190915260058152644652454e5360d81b6020820152610354565b3480156107c557600080fd5b506104116107d43660046133a2565b6117b3565b3480156107e557600080fd5b506104116107f4366004613497565b611843565b34801561080557600080fd5b5061038a610814366004613452565b6118f8565b34801561082557600080fd5b50610411611947565b34801561083a57600080fd5b5061038a610849366004613452565b611a62565b34801561085a57600080fd5b50610411610869366004613497565b611a6f565b34801561087a57600080fd5b506103e3601d5481565b34801561089057600080fd5b506103e360155481565b3480156108a657600080fd5b5061038a6108b53660046133a2565b6001600160a01b031660009081526009602052604090205460ff1690565b3480156108df57600080fd5b5061038a6108ee3660046133a2565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561091857600080fd5b5061041161092736600461347d565b611b30565b34801561093857600080fd5b50610411610947366004613497565b611bad565b34801561095857600080fd5b506103e36109673660046133da565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b34801561099e57600080fd5b506104116109ad3660046133a2565b611c44565b3480156109be57600080fd5b506103e3601b5481565b3480156109d457600080fd5b506103e360175481565b3480156109ea57600080fd5b506104116109f93660046133a2565b611c8f565b348015610a0a57600080fd5b5060225461038a90610100900460ff1681565b6000610a2a338484611d79565b5060015b92915050565b6000546001600160a01b03163314610a675760405162461bcd60e51b8152600401610a5e906135a5565b60405180910390fd5b601f54811415610ab95760405162461bcd60e51b815260206004820181905260248201527f4e65772062617365416d6f756e74206d75737420626520646966666572656e746044820152606401610a5e565b601f546040518291907f146a2314596a545f43939d25996feb5216b20a0f7078d013676b5427d76bfc3d90600090a3601f805460205555565b6000610aff848484611e9d565b610b518433610b4c8560405180606001604052806028815260200161372a602891396001600160a01b038a16600090815260056020908152604080832033845290915290205491906124f6565b611d79565b5060019392505050565b6000546001600160a01b03163314610b855760405162461bcd60e51b8152600401610a5e906135a5565b6001600160a01b0381166000908152600760205260409020805460ff191690556008805480610bc457634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b031916905501905550565b6000600d54821115610c505760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610a5e565b6000610c5a612530565b9050610c668382612553565b9392505050565b6000546001600160a01b03163314610c975760405162461bcd60e51b8152600401610a5e906135a5565b6001600160a01b0381166000908152600a602052604090205460ff16610cff5760405162461bcd60e51b815260206004820152601860248201527f4163636f756e7420616c726561647920696e636c7564656400000000000000006044820152606401610a5e565b60005b600b54811015610e5857816001600160a01b0316600b8281548110610d3757634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161415610e4657600b8054610d629060019061367a565b81548110610d8057634e487b7160e01b600052603260045260246000fd5b600091825260209091200154600b80546001600160a01b039092169183908110610dba57634e487b7160e01b600052603260045260246000fd5b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600482526040808220829055600a90925220805460ff19169055600b805480610e2057634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610e5081613691565b915050610d02565b5050565b3360008181526005602090815260408083206001600160a01b03871684529091528120549091610a2a918590610b4c9086612595565b6000546001600160a01b03163314610ebc5760405162461bcd60e51b8152600401610a5e906135a5565b601481601754610ecc919061362f565b1115610f1a5760405162461bcd60e51b815260206004820181905260248201527f546f74616c2062617365207461782063616e6e6f7420657863656564203230256044820152606401610a5e565b6013546040518291907f5bafbaadffe9e69a598337ad268067711e95c25712f9b8faa0eda1f8a66f05c190600090a36013805460145555565b6000546001600160a01b03163314610f7d5760405162461bcd60e51b8152600401610a5e906135a5565b601d54811415610fcf5760405162461bcd60e51b815260206004820152601760248201527f4e6577205a206d75737420626520646966666572656e740000000000000000006044820152606401610a5e565b601d546040518291907fecbd3f9eca94d12ef71a4a0d22e13e391eefeeeeb0d52d5029fd1d49977e45d990600090a3601d8054601e5555565b6000600c5483111561105c5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610a5e565b8161107b57600061106c846125f4565b50939550610a2e945050505050565b6000611086846125f4565b50929550610a2e945050505050565b6000546001600160a01b031633146110bf5760405162461bcd60e51b8152600401610a5e906135a5565b6001600160a01b0381166111045760405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b6044820152606401610a5e565b600f546040516001600160a01b038084169216907f27708143fae6aaf3ac43f80c948cbb31e33e5b8cc169a37f6128ff7e598dc3bf90600090a3600f8054601080546001600160a01b038084166001600160a01b0319928316179092559091169216919091179055565b6000546001600160a01b031633146111985760405162461bcd60e51b8152600401610a5e906135a5565b6001600160a01b0381166000908152600a602052604090205460ff16156112015760405162461bcd60e51b815260206004820152601860248201527f4164647265737320616c7265616479206578636c7564656400000000000000006044820152606401610a5e565b6001600160a01b0381166000908152600360205260409020541561125b576001600160a01b03811660009081526003602052604090205461124190610be9565b6001600160a01b0382166000908152600460205260409020555b6001600160a01b03166000818152600a60205260408120805460ff19166001908117909155600b805491820181559091527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b0319169091179055565b6000546001600160a01b031633146112eb5760405162461bcd60e51b8152600401610a5e906135a5565b6001600160a01b03166000908152600960205260409020805460ff19166001179055565b6000546001600160a01b031633146113395760405162461bcd60e51b8152600401610a5e906135a5565b60238054821515600160b01b0260ff60b01b199091161790556040517fab073a90a6ed753578599e829eb733203df03d75aa3371824f39a137db33d2809061138690831515815260200190565b60405180910390a150565b6001600160a01b0381166000908152600a602052604081205460ff16156113ce57506001600160a01b031660009081526004602052604090205490565b6001600160a01b038216600090815260036020526040902054610a2e90610be9565b6000546001600160a01b0316331461141a5760405162461bcd60e51b8152600401610a5e906135a5565b600073cd7d16fb918511bf7269ec4f48d61d79fb26f9189050806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561146c57600080fd5b505afa158015611480573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a491906133be565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156114ec57600080fd5b505afa158015611500573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152491906133be565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b15801561156c57600080fd5b505af1158015611580573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a491906133be565b602380546001600160a01b03199081166001600160a01b03938416179091556022805462010000600160b01b03191662010000858516021790556000805483168152600960209081526040808320805460ff1990811660019081179092553085528285208054821683179055600a90935281842080548416821790557f000000000000000000000000000000000000000000000000000000000000dead909516835280832080549092169094179055600f805490921673e47f0be7d492e035667b16caef40d6cff6efa2261790915590517fa0967778d40e43722101c8ef18dd2c1c0e6325f30a2811001a971871d505af049190a150565b6000546001600160a01b031633146116c65760405162461bcd60e51b8152600401610a5e906135a5565b60405181151581527f5f6c2fd171e6c40c80061eb773522c37de37b538bdea42aea3b754af64e177f59060200160405180910390a16019805460ff1916911515919091179055565b6000546001600160a01b031633146117385760405162461bcd60e51b8152600401610a5e906135a5565b6501374b68fa006021556025601781905560155560036013556023805460ff60a81b1916600160a81b1790556022805461ff00191661010017905542601181905561178590610a8c61362f565b6012556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a1565b6000546001600160a01b031633146117dd5760405162461bcd60e51b8152600401610a5e906135a5565b6001600160a01b03166000818152600760205260408120805460ff191660019081179091556008805491820181559091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319169091179055565b6000546001600160a01b0316331461186d5760405162461bcd60e51b8152600401610a5e906135a5565b601b548114156118bf5760405162461bcd60e51b815260206004820181905260248201527f4e6577206d696e54726967676572206d75737420626520646966666572656e746044820152606401610a5e565b601b546040518291907f3baa36cd30edc6e97bf2ba1b784ba6f7ebeba34e7b4d9f256f3156379564747490600090a3601b8054601c5555565b6000610a2a3384610b4c85604051806060016040528060258152602001613705602591393360009081526005602090815260408083206001600160a01b038d16845290915290205491906124f6565b6001546001600160a01b031633146119ad5760405162461bcd60e51b8152602060048201526024808201527f4f776e61626c653a207065726d697373696f6e20746f20756e6c6f636b2064656044820152631b9a595960e21b6064820152608401610a5e565b60025442116119fe5760405162461bcd60e51b815260206004820152601b60248201527f4f776e61626c653a20636f6e7472616374206973206c6f636b656400000000006044820152606401610a5e565b600154600080546040516001600160a01b0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6000610a2a338484611e9d565b6000546001600160a01b03163314611a995760405162461bcd60e51b8152600401610a5e906135a5565b601460135482611aa9919061362f565b1115611af75760405162461bcd60e51b815260206004820181905260248201527f546f74616c2062617365207461782063616e6e6f7420657863656564203230256044820152606401610a5e565b6017546040518291907f28d82f0985175c63fc109a5155301df4c17b16f17954c1adb3b0009fd70ac1e890600090a36017805460185555565b6000546001600160a01b03163314611b5a5760405162461bcd60e51b8152600401610a5e906135a5565b60405181151581527f93ef5b81a49872978568bad131403e54e629172ca934de13b52bc8b59711051c9060200160405180910390a160238054911515600160a81b0260ff60a81b19909216919091179055565b6000546001600160a01b03163314611bd75760405162461bcd60e51b8152600401610a5e906135a5565b60008054600180546001600160a01b03199081166001600160a01b03841617909155169055611c06814261362f565b600255600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a350565b6000546001600160a01b03163314611c6e5760405162461bcd60e51b8152600401610a5e906135a5565b6001600160a01b03166000908152600960205260409020805460ff19169055565b6000546001600160a01b03163314611cb95760405162461bcd60e51b8152600401610a5e906135a5565b6001600160a01b038116611d1e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a5e565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316611ddb5760405162461bcd60e51b8152602060048201526024808201527f43524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a5e565b6001600160a01b038216611e3c5760405162461bcd60e51b815260206004820152602260248201527f43524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a5e565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611f015760405162461bcd60e51b815260206004820152602560248201527f43524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a5e565b6001600160a01b038216611f635760405162461bcd60e51b815260206004820152602360248201527f43524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a5e565b60008111611fc55760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610a5e565b6001600160a01b03821660009081526007602052604090205460ff16156120235760405162461bcd60e51b8152602060048201526012602482015271536f7272792c206672656e73206f6e6c792160701b6044820152606401610a5e565b3360009081526007602052604090205460ff16156120785760405162461bcd60e51b8152602060048201526012602482015271536f7272792c206672656e73206f6e6c792160701b6044820152606401610a5e565b6000546001600160a01b03848116911614806120a157506000546001600160a01b038381169116145b806120b457506001600160a01b03831630145b806120c757506001600160a01b03821630145b61219f57602254610100900460ff1661212b57602254610100900460ff1661212b5760405162461bcd60e51b8152602060048201526017602482015276151c98591a5b99c81b9bdd081e595d08195b98589b1959604a1b6044820152606401610a5e565b60225460ff161561219f573360009081526006602052604090206002015460ff1661219f57604080516060810182526000808252602080830182815260018486018181523385526006909352949092209251835590519282019290925590516002909101805460ff19169115159190911790555b6023546001600160a01b0384811691161480156121d057506022546001600160a01b03838116620100009092041614155b80156121f557506001600160a01b03821660009081526009602052604090205460ff16155b1561234e57602254610100900460ff1661224b5760405162461bcd60e51b8152602060048201526017602482015276151c98591a5b99c81b9bdd081e595d08195b98589b1959604a1b6044820152606401610a5e565b60175460155560225460ff161561234e5742601254111561234e576021548111156122b85760405162461bcd60e51b815260206004820152601b60248201527f416d6f756e742065786365656473206d6178207478206c696d697400000000006044820152606401610a5e565b6001600160a01b03821660009081526006602052604090205442116123295760405162461bcd60e51b815260206004820152602160248201527f596f75722062757920636f6f6c646f776e20686173206e6f74206578706972656044820152601960fa1b6064820152608401610a5e565b61233442602261362f565b6001600160a01b0383166000908152600660205260409020555b602354600160a01b900460ff161580156123715750602354600160a81b900460ff165b801561238a57506023546001600160a01b038381169116145b156124995760195460ff16156123ed5760006123b1601a548361264390919063ffffffff16565b6023549091506123e0906123d99084906123d3906001600160a01b0316611391565b90612595565b8290612553565b90506123eb816126c2565b505b60155460006123fb30611391565b9050801561240c5761240c8161270e565b6023544790600160b01b900460ff1680156124295750601b548410155b15612493576000600a9050600061247e600a61246861247561246e601754612468601d546124626017548e61276c90919063ffffffff16565b90612643565b90612553565b8690612595565b601f5490612643565b905080831061249057612490816127ae565b50505b50506015555b6001600160a01b03831660009081526009602052604090205460019060ff16806124db57506001600160a01b03831660009081526009602052604090205460ff165b156124e4575060005b6124f0848484846127e0565b50505050565b6000818484111561251a5760405162461bcd60e51b8152600401610a5e9190613552565b506000612527848661367a565b95945050505050565b600080600061253d612905565b909250905061254c8282612553565b9250505090565b6000610c6683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612abf565b6000806125a2838561362f565b905083811015610c665760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610a5e565b600080600080600080600080600061260b8a612aed565b92509250925060008060006126298d8686612624612530565b612b2f565b919f909e50909c50959a5093985091965092945050505050565b60008261265257506000610a2e565b600061265e838561365b565b90508261266b8583613647565b14610c665760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610a5e565b601754808210156126d657506017546126ea565b60288211156126e7575060286126ea565b50805b6126f5816002612b7f565b15612708578061270481613691565b9150505b60155550565b6023805460ff60a01b1916600160a01b1790554761272b82612bc1565b6000612737478361276c565b600f5490915061275a906001600160a01b0316612755836003612553565b612da4565b50506023805460ff60a01b1916905550565b6000610c6683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506124f6565b6023805460ff60a01b1916600160a01b17905580156127d0576127d081612ddf565b506023805460ff60a01b19169055565b806127ed576127ed612fc1565b6001600160a01b0384166000908152600a602052604090205460ff16801561282e57506001600160a01b0383166000908152600a602052604090205460ff16155b156128435761283e848484612fef565b6128ef565b6001600160a01b0384166000908152600a602052604090205460ff1615801561288457506001600160a01b0383166000908152600a602052604090205460ff165b156128945761283e848484613115565b6001600160a01b0384166000908152600a602052604090205460ff1680156128d457506001600160a01b0383166000908152600a602052604090205460ff165b156128e45761283e8484846131be565b6128ef848484613231565b806124f0576124f0601454601355601654601555565b600d54600c546000918291825b600b54811015612a8f578260036000600b848154811061294257634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806129bb57508160046000600b848154811061299457634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156129d157600d54600c54945094505050509091565b612a2560036000600b84815481106129f957634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054849061276c565b9250612a7b60046000600b8481548110612a4f57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054839061276c565b915080612a8781613691565b915050612912565b50600c54600d54612a9f91612553565b821015612ab657600d54600c549350935050509091565b90939092509050565b60008183612ae05760405162461bcd60e51b8152600401610a5e9190613552565b5060006125278486613647565b600080600080612afc85613275565b90506000612b0986613291565b90506000612b2182612b1b898661276c565b9061276c565b979296509094509092505050565b6000808080612b3e8886612643565b90506000612b4c8887612643565b90506000612b5a8888612643565b90506000612b6c82612b1b868661276c565b939b939a50919850919650505050505050565b6000610c6683836040518060400160405280601881526020017f536166654d6174683a206d6f64756c6f206279207a65726f00000000000000008152506132ad565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612c0457634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050602260029054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015612c7257600080fd5b505afa158015612c86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612caa91906133be565b81600181518110612ccb57634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152602254612cf79130916201000090041684611d79565b60225460405163791ac94760e01b8152620100009091046001600160a01b03169063791ac94790612d359085906000908690309042906004016135f3565b600060405180830381600087803b158015612d4f57600080fd5b505af1158015612d63573d6000803e3d6000fd5b505050507f5796abc9aed2812ca6fda4538212fe897f11e341f80e76fc61946d2cf2eb456b8282604051612d989291906135da565b60405180910390a15050565b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015612dda573d6000803e3d6000fd5b505050565b604080516002808252606082018352600092602083019080368337019050509050602260029054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015612e4e57600080fd5b505afa158015612e62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e8691906133be565b81600081518110612ea757634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110612ee957634e487b7160e01b600052603260045260246000fd5b6001600160a01b0392831660209182029290920101526022546201000090041663b6f9de95836000847f000000000000000000000000000000000000000000000000000000000000dead612f3f4261012c612595565b6040518663ffffffff1660e01b8152600401612f5e949392919061351d565b6000604051808303818588803b158015612f7757600080fd5b505af1158015612f8b573d6000803e3d6000fd5b50505050507f3989b57e2e9fd408b792cd680eb883c3864cf5f7d8b20c4ee713d48d2ba727ae8282604051612d989291906135da565b601354158015612fd15750601554155b15612fd857565b601380546014556015805460165560009182905555565b600080600080600080613001876125f4565b6001600160a01b038f16600090815260046020526040902054959b50939950919750955093509150613033908861276c565b6001600160a01b038a16600090815260046020908152604080832093909355600390522054613062908761276c565b6001600160a01b03808b1660009081526003602052604080822093909355908a16815220546130919086612595565b6001600160a01b0389166000908152600360205260409020556130b3816132e1565b6130bd8483613369565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161310291815260200190565b60405180910390a3505050505050505050565b600080600080600080613127876125f4565b6001600160a01b038f16600090815260036020526040902054959b50939950919750955093509150613159908761276c565b6001600160a01b03808b16600090815260036020908152604080832094909455918b1681526004909152205461318f9084612595565b6001600160a01b0389166000908152600460209081526040808320939093556003905220546130919086612595565b6000806000806000806131d0876125f4565b6001600160a01b038f16600090815260046020526040902054959b50939950919750955093509150613202908861276c565b6001600160a01b038a16600090815260046020908152604080832093909355600390522054613159908761276c565b600080600080600080613243876125f4565b6001600160a01b038f16600090815260036020526040902054959b50939950919750955093509150613062908761276c565b6000610a2e60646124686013548561264390919063ffffffff16565b6000610a2e60646124686015548561264390919063ffffffff16565b600081836132ce5760405162461bcd60e51b8152600401610a5e9190613552565b506132d983856136ac565b949350505050565b60006132eb612530565b905060006132f98383612643565b306000908152600360205260409020549091506133169082612595565b30600090815260036020908152604080832093909355600a9052205460ff1615612dda57306000908152600460205260409020546133549084612595565b30600090815260046020526040902055505050565b600d54613376908361276c565b600d55600e546133869082612595565b600e555050565b8035801515811461339d57600080fd5b919050565b6000602082840312156133b3578081fd5b8135610c66816136ec565b6000602082840312156133cf578081fd5b8151610c66816136ec565b600080604083850312156133ec578081fd5b82356133f7816136ec565b91506020830135613407816136ec565b809150509250929050565b600080600060608486031215613426578081fd5b8335613431816136ec565b92506020840135613441816136ec565b929592945050506040919091013590565b60008060408385031215613464578182fd5b823561346f816136ec565b946020939093013593505050565b60006020828403121561348e578081fd5b610c668261338d565b6000602082840312156134a8578081fd5b5035919050565b600080604083850312156134c1578182fd5b823591506134d16020840161338d565b90509250929050565b6000815180845260208085019450808401835b838110156135125781516001600160a01b0316875295820195908201906001016134ed565b509495945050505050565b84815260806020820152600061353660808301866134da565b6001600160a01b03949094166040830152506060015292915050565b6000602080835283518082850152825b8181101561357e57858101830151858201604001528201613562565b8181111561358f5783604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b8281526040602082015260006132d960408301846134da565b85815284602082015260a06040820152600061361260a08301866134da565b6001600160a01b0394909416606083015250608001529392505050565b60008219821115613642576136426136c0565b500190565b600082613656576136566136d6565b500490565b6000816000190483118215151615613675576136756136c0565b500290565b60008282101561368c5761368c6136c0565b500390565b60006000198214156136a5576136a56136c0565b5060010190565b6000826136bb576136bb6136d6565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6001600160a01b038116811461370157600080fd5b5056fe43524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f43524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a26469706673582212209803ac50d5c85f5dab5d2796f3513b434e1857b67649d9608f294e969722da3d64736f6c63430008040033
Deployed ByteCode Sourcemap
14352:23234:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18702:85;;;;;;;;;;-1:-1:-1;18774:5:0;;;;;;;;;;;;-1:-1:-1;;;18774:5:0;;;;18702:85;;;;;;;:::i;:::-;;;;;;;;19634:163;;;;;;;;;;-1:-1:-1;19634:163:0;;;;;:::i;:::-;;:::i;:::-;;;3714:14:1;;3707:22;3689:41;;3677:2;3662:18;19634:163:0;3644:92:1;16211:22:0;;;;;;;;;;-1:-1:-1;16211:22:0;;;;-1:-1:-1;;;;;16211:22:0;;;;;;-1:-1:-1;;;;;3196:32:1;;;3178:51;;3166:2;3151:18;16211:22:0;3133:102:1;18985:97:0;;;;;;;;;;-1:-1:-1;19067:7:0;;18985:97;;;14262:25:1;;;14250:2;14235:18;18985:97:0;14217:76:1;34892:297:0;;;;;;;;;;-1:-1:-1;34892:297:0;;;;;:::i;:::-;;:::i;:::-;;19805:315;;;;;;;;;;-1:-1:-1;19805:315:0;;;;;:::i;:::-;;:::i;35967:144::-;;;;;;;;;;-1:-1:-1;35967:144:0;;;;;:::i;:::-;;:::i;14469:81::-;;;;;;;;;;;;;;;21315:253;;;;;;;;;;-1:-1:-1;21315:253:0;;;;;:::i;:::-;;:::i;18892:85::-;;;;;;;;;;-1:-1:-1;18892:85:0;;15352:1;15364:36:1;;15352:2;15337:18;18892:85:0;15319:87:1;16177:27:0;;;;;;;;;;-1:-1:-1;16177:27:0;;;;;;;-1:-1:-1;;;;;16177:27:0;;;36731:500;;;;;;;;;;-1:-1:-1;36731:500:0;;;;;:::i;:::-;;:::i;20128:220::-;;;;;;;;;;-1:-1:-1;20128:220:0;;;;;:::i;:::-;;:::i;15521:26::-;;;;;;;;;;;;;;;;35206:269;;;;;;;;;;-1:-1:-1;35206:269:0;;;;;:::i;:::-;;:::i;34699:185::-;;;;;;;;;;-1:-1:-1;34699:185:0;;;;;:::i;:::-;;:::i;20871:436::-;;;;;;;;;;-1:-1:-1;20871:436:0;;;;;:::i;:::-;;:::i;20773:90::-;;;;;;;;;;-1:-1:-1;20845:10:0;;20773:90;;33838:273;;;;;;;;;;-1:-1:-1;33838:273:0;;;;;:::i;:::-;;:::i;15976:33::-;;;;;;;;;;;;;;;;36366:357;;;;;;;;;;-1:-1:-1;36366:357:0;;;;;:::i;:::-;;:::i;5940:90::-;;;;;;;;;;-1:-1:-1;6007:15:0;5940:90;;5842;;;;;;;;;;-1:-1:-1;5915:9:0;;5842:90;;36119:115;;;;;;;;;;-1:-1:-1;36119:115:0;;;;;:::i;:::-;;:::i;34119:138::-;;;;;;;;;;-1:-1:-1;34119:138:0;;;;;:::i;:::-;;:::i;16263:35::-;;;;;;;;;;-1:-1:-1;16263:35:0;;;;-1:-1:-1;;;16263:35:0;;;;;;19090:208;;;;;;;;;;-1:-1:-1;19090:208:0;;;;;:::i;:::-;;:::i;15449:25::-;;;;;;;;;;;;;;;;16305:35;;;;;;;;;;-1:-1:-1;16305:35:0;;;;-1:-1:-1;;;16305:35:0;;;;;;18098:596;;;;;;;;;;;;;:::i;37239:161::-;;;;;;;;;;-1:-1:-1;37239:161:0;;;;;:::i;:::-;;:::i;20635:130::-;;;;;;;;;;-1:-1:-1;20635:130:0;;;;;:::i;:::-;-1:-1:-1;;;;;20727:30:0;20703:4;20727:30;;;:21;:30;;;;;;;;;20635:130;17725:365;;;;;;;;;;;;;:::i;5368:79::-;;;;;;;;;;-1:-1:-1;5406:7:0;5433:6;-1:-1:-1;;;;;5433:6:0;5368:79;;18795:89;;;;;;;;;;-1:-1:-1;18869:7:0;;;;;;;;;;;;-1:-1:-1;;;18869:7:0;;;;18795:89;;35809:150;;;;;;;;;;-1:-1:-1;35809:150:0;;;;;:::i;:::-;;:::i;34403:284::-;;;;;;;;;;-1:-1:-1;34403:284:0;;;;;:::i;:::-;;:::i;20356:271::-;;;;;;;;;;-1:-1:-1;20356:271:0;;;;;:::i;:::-;;:::i;6269:365::-;;;;;;;;;;;;;:::i;19306:169::-;;;;;;;;;;-1:-1:-1;19306:169:0;;;;;:::i;:::-;;:::i;35487:314::-;;;;;;;;;;-1:-1:-1;35487:314:0;;;;;:::i;:::-;;:::i;15919:23::-;;;;;;;;;;;;;;;;15587:27;;;;;;;;;;;;;;;;33705:125;;;;;;;;;;-1:-1:-1;33705:125:0;;;;;:::i;:::-;-1:-1:-1;;;;;33794:28:0;33770:4;33794:28;;;:18;:28;;;;;;;;;33705:125;21576:108;;;;;;;;;;-1:-1:-1;21576:108:0;;;;;:::i;:::-;-1:-1:-1;;;;;21657:19:0;21633:4;21657:19;;;:10;:19;;;;;;;;;21576:108;37408:138;;;;;;;;;;-1:-1:-1;37408:138:0;;;;;:::i;:::-;;:::i;6038:223::-;;;;;;;;;;-1:-1:-1;6038:223:0;;;;;:::i;:::-;;:::i;19483:143::-;;;;;;;;;;-1:-1:-1;19483:143:0;;;;;:::i;:::-;-1:-1:-1;;;;;19591:18:0;;;19564:7;19591:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;19483:143;36242:116;;;;;;;;;;-1:-1:-1;36242:116:0;;;;;:::i;:::-;;:::i;15834:41::-;;;;;;;;;;;;;;;;15655:27;;;;;;;;;;;;;;;;5588:246;;;;;;;;;;-1:-1:-1;5588:246:0;;;;;:::i;:::-;;:::i;16133:31::-;;;;;;;;;;-1:-1:-1;16133:31:0;;;;;;;;;;;19634:163;19711:4;19728:39;199:10;19751:7;19760:6;19728:8;:39::i;:::-;-1:-1:-1;19785:4:0;19634:163;;;;;:::o;34892:297::-;5495:6;;-1:-1:-1;;;;;5495:6:0;199:10;5495:22;5487:67;;;;-1:-1:-1;;;5487:67:0;;;;;;;:::i;:::-;;;;;;;;;34995:11:::1;;34978:13;:28;;34970:73;;;::::0;-1:-1:-1;;;34970:73:0;;5293:2:1;34970:73:0::1;::::0;::::1;5275:21:1::0;;;5312:18;;;5305:30;5371:34;5351:18;;;5344:62;5423:18;;34970:73:0::1;5265:182:1::0;34970:73:0::1;35077:11;::::0;35059:45:::1;::::0;35090:13;;35077:11;35059:45:::1;::::0;;;::::1;35132:11;::::0;;35115:14:::1;:28:::0;35154:27;34892:297::o;19805:315::-;19905:4;19922:36;19932:6;19940:9;19951:6;19922:9;:36::i;:::-;19969:121;19978:6;199:10;20000:89;20038:6;20000:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20000:19:0;;;;;;:11;:19;;;;;;;;199:10;20000:33;;;;;;;;;;:37;:89::i;:::-;19969:8;:121::i;:::-;-1:-1:-1;20108:4:0;19805:315;;;;;:::o;35967:144::-;5495:6;;-1:-1:-1;;;;;5495:6:0;199:10;5495:22;5487:67;;;;-1:-1:-1;;;5487:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36040:20:0;::::1;36063:5;36040:20:::0;;;:10:::1;:20;::::0;;;;:28;;-1:-1:-1;;36040:28:0::1;::::0;;36079:18:::1;:24:::0;;;::::1;;-1:-1:-1::0;;;36079:24:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;;-1:-1:-1;;36079:24:0;;;;;-1:-1:-1;;;;;;36079:24:0::1;::::0;;;;;-1:-1:-1;35967:144:0:o;21315:253::-;21381:7;21420;;21409;:18;;21401:73;;;;-1:-1:-1;;;21401:73:0;;6362:2:1;21401:73:0;;;6344:21:1;6401:2;6381:18;;;6374:30;6440:34;6420:18;;;6413:62;-1:-1:-1;;;6491:18:1;;;6484:40;6541:19;;21401:73:0;6334:232:1;21401:73:0;21485:19;21508:10;:8;:10::i;:::-;21485:33;-1:-1:-1;21536:24:0;:7;21485:33;21536:11;:24::i;:::-;21529:31;21315:253;-1:-1:-1;;;21315:253:0:o;36731:500::-;5495:6;;-1:-1:-1;;;;;5495:6:0;199:10;5495:22;5487:67;;;;-1:-1:-1;;;5487:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36814:31:0;::::1;;::::0;;;:21:::1;:31;::::0;;;;;::::1;;36806:68;;;::::0;-1:-1:-1;;;36806:68:0;;12139:2:1;36806:68:0::1;::::0;::::1;12121:21:1::0;12178:2;12158:18;;;12151:30;12217:26;12197:18;;;12190:54;12261:18;;36806:68:0::1;12111:174:1::0;36806:68:0::1;36890:9;36885:339;36909:9;:16:::0;36905:20;::::1;36885:339;;;36966:8;-1:-1:-1::0;;;;;36950:24:0::1;:9;36960:1;36950:12;;;;;;-1:-1:-1::0;;;36950:12:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;36950:12:0::1;:24;36947:266;;;37010:9;37020:16:::0;;:20:::1;::::0;37039:1:::1;::::0;37020:20:::1;:::i;:::-;37010:31;;;;;;-1:-1:-1::0;;;37010:31:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;36995:9:::1;:12:::0;;-1:-1:-1;;;;;37010:31:0;;::::1;::::0;37005:1;;36995:12;::::1;;;-1:-1:-1::0;;;36995:12:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;;;;;36995:46:0::1;-1:-1:-1::0;;;;;36995:46:0;;::::1;;::::0;;37060:17;;::::1;::::0;;:7:::1;:17:::0;;;;;;:21;;;37100::::1;:31:::0;;;;:39;;-1:-1:-1;;37100:39:0::1;::::0;;37158:9:::1;:15:::0;;;::::1;;-1:-1:-1::0;;;37158:15:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;;-1:-1:-1;;37158:15:0;;;;;-1:-1:-1;;;;;;37158:15:0::1;::::0;;;;;36885:339:::1;36731:500:::0;:::o;36947:266::-:1;36927:3:::0;::::1;::::0;::::1;:::i;:::-;;;;36885:339;;;;36731:500:::0;:::o;20128:220::-;199:10;20218:4;20267:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;20267:34:0;;;;;;;;;;20218:4;;20235:83;;20258:7;;20267:50;;20306:10;20267:38;:50::i;35206:269::-;5495:6;;-1:-1:-1;;;;;5495:6:0;199:10;5495:22;5487:67;;;;-1:-1:-1;;;5487:67:0;;;;;;;:::i;:::-;35317:2:::1;35305:9;35292:12;;:22;;;;:::i;:::-;35291:28;;35283:73;;;::::0;-1:-1:-1;;;35283:73:0;;8288:2:1;35283:73:0::1;::::0;::::1;8270:21:1::0;;;8307:18;;;8300:30;8366:34;8346:18;;;8339:62;8418:18;;35283:73:0::1;8260:182:1::0;35283:73:0::1;35387:7;::::0;35373:33:::1;::::0;35396:9;;35387:7;35373:33:::1;::::0;;;::::1;35430:7;::::0;;35417:10:::1;:20:::0;35448:19;35206:269::o;34699:185::-;5495:6;;-1:-1:-1;;;;;5495:6:0;199:10;5495:22;5487:67;;;;-1:-1:-1;;;5487:67:0;;;;;;;:::i;:::-;34776:1:::1;;34768:4;:9;;34760:45;;;::::0;-1:-1:-1;;;34760:45:0;;5654:2:1;34760:45:0::1;::::0;::::1;5636:21:1::0;5693:2;5673:18;;;5666:30;5732:25;5712:18;;;5705:53;5775:18;;34760:45:0::1;5626:173:1::0;34760:45:0::1;34830:1;::::0;34821:17:::1;::::0;34833:4;;34830:1;34821:17:::1;::::0;;;::::1;34856:1;::::0;;34849:4:::1;:8:::0;34868;34699:185::o;20871:436::-;20961:7;21000;;20989;:18;;20981:62;;;;-1:-1:-1;;;20981:62:0;;9799:2:1;20981:62:0;;;9781:21:1;9838:2;9818:18;;;9811:30;9877:33;9857:18;;;9850:61;9928:18;;20981:62:0;9771:181:1;20981:62:0;21059:17;21054:246;;21094:15;21118:19;21129:7;21118:10;:19::i;:::-;-1:-1:-1;21093:44:0;;-1:-1:-1;21152:14:0;;-1:-1:-1;;;;;21152:14:0;21054:246;21201:23;21232:19;21243:7;21232:10;:19::i;:::-;-1:-1:-1;21199:52:0;;-1:-1:-1;21266:22:0;;-1:-1:-1;;;;;21266:22:0;33838:273;5495:6;;-1:-1:-1;;;;;5495:6:0;199:10;5495:22;5487:67;;;;-1:-1:-1;;;5487:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33923:25:0;::::1;33915:50;;;::::0;-1:-1:-1;;;33915:50:0;;9052:2:1;33915:50:0::1;::::0;::::1;9034:21:1::0;9091:2;9071:18;;;9064:30;-1:-1:-1;;;9110:18:1;;;9103:42;9162:18;;33915:50:0::1;9024:162:1::0;33915:50:0::1;33997:8;::::0;33981:38:::1;::::0;-1:-1:-1;;;;;33981:38:0;;::::1;::::0;33997:8:::1;::::0;33981:38:::1;::::0;33997:8:::1;::::0;33981:38:::1;34052:8;::::0;;34030:11:::1;:31:::0;;-1:-1:-1;;;;;34052:8:0;;::::1;-1:-1:-1::0;;;;;;34030:31:0;;::::1;;::::0;;;34072;;::::1;::::0;::::1;::::0;;;::::1;::::0;;33838:273::o;36366:357::-;5495:6;;-1:-1:-1;;;;;5495:6:0;199:10;5495:22;5487:67;;;;-1:-1:-1;;;5487:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36450:31:0;::::1;;::::0;;;:21:::1;:31;::::0;;;;;::::1;;36449:32;36441:69;;;::::0;-1:-1:-1;;;36441:69:0;;12492:2:1;36441:69:0::1;::::0;::::1;12474:21:1::0;12531:2;12511:18;;;12504:30;12570:26;12550:18;;;12543:54;12614:18;;36441:69:0::1;12464:174:1::0;36441:69:0::1;-1:-1:-1::0;;;;;36524:17:0;::::1;36544:1;36524:17:::0;;;:7:::1;:17;::::0;;;;;:21;36521:111:::1;;-1:-1:-1::0;;;;;36602:17:0;::::1;;::::0;;;:7:::1;:17;::::0;;;;;36582:38:::1;::::0;:19:::1;:38::i;:::-;-1:-1:-1::0;;;;;36562:17:0;::::1;;::::0;;;:7:::1;:17;::::0;;;;:58;36521:111:::1;-1:-1:-1::0;;;;;36642:31:0::1;;::::0;;;:21:::1;:31;::::0;;;;:38;;-1:-1:-1;;36642:38:0::1;36676:4;36642:38:::0;;::::1;::::0;;;36691:9:::1;:24:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;36691:24:0::1;::::0;;::::1;::::0;;36366:357::o;36119:115::-;5495:6;;-1:-1:-1;;;;;5495:6:0;199:10;5495:22;5487:67;;;;-1:-1:-1;;;5487:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36191:28:0::1;;::::0;;;:18:::1;:28;::::0;;;;:35;;-1:-1:-1;;36191:35:0::1;36222:4;36191:35;::::0;;36119:115::o;34119:138::-;5495:6;;-1:-1:-1;;;;;5495:6:0;199:10;5495:22;5487:67;;;;-1:-1:-1;;;5487:67:0;;;;;;;:::i;:::-;34187:15:::1;:24:::0;;;::::1;;-1:-1:-1::0;;;34187:24:0::1;-1:-1:-1::0;;;;34187:24:0;;::::1;;::::0;;34227:22:::1;::::0;::::1;::::0;::::1;::::0;34205:6;3714:14:1;3707:22;3689:41;;3677:2;3662:18;;3644:92;34227:22:0::1;;;;;;;;34119:138:::0;:::o;19090:208::-;-1:-1:-1;;;;;19180:30:0;;19156:7;19180:30;;;:21;:30;;;;;;;;19176:59;;;-1:-1:-1;;;;;;19219:16:0;;;;;:7;:16;;;;;;;19090:208::o;19176:59::-;-1:-1:-1;;;;;19273:16:0;;;;;;:7;:16;;;;;;19253:37;;:19;:37::i;18098:596::-;5495:6;;-1:-1:-1;;;;;5495:6:0;199:10;5495:22;5487:67;;;;-1:-1:-1;;;5487:67:0;;;;;;;:::i;:::-;18154:21:::1;18189:42;18154:78;;18265:10;-1:-1:-1::0;;;;;18265:18:0::1;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;18253:54:0::1;;18316:4;18323:10;-1:-1:-1::0;;;;;18323:15:0::1;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18253:88;::::0;-1:-1:-1;;;;;;18253:88:0::1;::::0;;;;;;-1:-1:-1;;;;;3470:15:1;;;18253:88:0::1;::::0;::::1;3452:34:1::0;3522:15;;3502:18;;;3495:43;3387:18;;18253:88:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18243:7;:98:::0;;-1:-1:-1;;;;;;18243:98:0;;::::1;-1:-1:-1::0;;;;;18243:98:0;;::::1;;::::0;;;18352:9:::1;:22:::0;;-1:-1:-1;;;;;;18352:22:0::1;::::0;;;::::1;;;::::0;;-1:-1:-1;5433:6:0;;;;18385:27;;:18:::1;:27;::::0;;;;;;;:34;;-1:-1:-1;;18385:34:0;;::::1;-1:-1:-1::0;18385:34:0;;::::1;::::0;;;18457:4:::1;18430:33:::0;;;;;:40;;;::::1;::::0;::::1;::::0;;18481:21:::1;:36:::0;;;;;;:43;;;::::1;::::0;::::1;::::0;;18557:11:::1;18535:34:::0;;::::1;::::0;;;;;:41;;;;::::1;::::0;;::::1;::::0;;18589:8:::1;:62:::0;;;;::::1;18608:42;18589:62;::::0;;;18667:19;;::::1;::::0;-1:-1:-1;18667:19:0::1;5565:1;18098:596::o:0;37239:161::-;5495:6;;-1:-1:-1;;;;;5495:6:0;199:10;5495:22;5487:67;;;;-1:-1:-1;;;5487:67:0;;;;;;;:::i;:::-;37321:31:::1;::::0;3714:14:1;;3707:22;3689:41;;37321:31:0::1;::::0;3677:2:1;3662:18;37321:31:0::1;;;;;;;37363:20;:29:::0;;-1:-1:-1;;37363:29:0::1;::::0;::::1;;::::0;;;::::1;::::0;;37239:161::o;17725:365::-;5495:6;;-1:-1:-1;;;;;5495:6:0;199:10;5495:22;5487:67;;;;-1:-1:-1;;;5487:67:0;;;;;;;:::i;:::-;17798:12:::1;17782:13;:28:::0;17836:2:::1;17821:12;:17:::0;;;17849:8:::1;:23:::0;17893:1:::1;17883:7;:11:::0;17905:15:::1;:22:::0;;-1:-1:-1;;;;17905:22:0::1;-1:-1:-1::0;;;17905:22:0::1;::::0;;17938:11:::1;:18:::0;;-1:-1:-1;;17938:18:0::1;17905:22;17938:18;::::0;;17980:15:::1;17967:10;:28:::0;;;18020:30:::1;::::0;18039:10:::1;18020:30;:::i;:::-;18006:11;:44:::0;18066:16:::1;::::0;::::1;::::0;;;::::1;17725:365::o:0;35809:150::-;5495:6;;-1:-1:-1;;;;;5495:6:0;199:10;5495:22;5487:67;;;;-1:-1:-1;;;5487:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35880:20:0::1;;::::0;;;:10:::1;:20;::::0;;;;:27;;-1:-1:-1;;35880:27:0::1;35903:4;35880:27:::0;;::::1;::::0;;;35918:18:::1;:33:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;35918:33:0::1;::::0;;::::1;::::0;;35809:150::o;34403:284::-;5495:6;;-1:-1:-1;;;;;5495:6:0;199:10;5495:22;5487:67;;;;-1:-1:-1;;;5487:67:0;;;;;;;:::i;:::-;34500:11:::1;;34486:10;:25;;34478:70;;;::::0;-1:-1:-1;;;34478:70:0;;13605:2:1;34478:70:0::1;::::0;::::1;13587:21:1::0;;;13624:18;;;13617:30;13683:34;13663:18;;;13656:62;13735:18;;34478:70:0::1;13577:182:1::0;34478:70:0::1;34582:11;::::0;34564:42:::1;::::0;34595:10;;34582:11;34564:42:::1;::::0;;;::::1;34634:11;::::0;;34617:14:::1;:28:::0;34656:23;34403:284::o;20356:271::-;20451:4;20468:129;199:10;20491:7;20500:96;20539:15;20500:96;;;;;;;;;;;;;;;;;199:10;20500:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;20500:34:0;;;;;;;;;;;;:38;:96::i;6269:365::-;6323:9;;-1:-1:-1;;;;;6323:9:0;6336:10;6323:23;6315:72;;;;-1:-1:-1;;;6315:72:0;;10561:2:1;6315:72:0;;;10543:21:1;10600:2;10580:18;;;10573:30;10639:34;10619:18;;;10612:62;-1:-1:-1;;;10690:18:1;;;10683:34;10734:19;;6315:72:0;10533:226:1;6315:72:0;6424:9;;6406:15;:27;6398:68;;;;-1:-1:-1;;;6398:68:0;;6006:2:1;6398:68:0;;;5988:21:1;6045:2;6025:18;;;6018:30;6084:29;6064:18;;;6057:57;6131:18;;6398:68:0;5978:177:1;6398:68:0;6511:9;;;6503:6;;6482:39;;-1:-1:-1;;;;;6511:9:0;;;;6503:6;;;;6482:39;;;6541:9;;;;6532:18;;-1:-1:-1;;;;;;6532:18:0;;;-1:-1:-1;;;;;6541:9:0;;6532:18;;;;6561:22;;;6269:365::o;19306:169::-;19386:4;19403:42;199:10;19427:9;19438:6;19403:9;:42::i;35487:314::-;5495:6;;-1:-1:-1;;;;;5495:6:0;199:10;5495:22;5487:67;;;;-1:-1:-1;;;5487:67:0;;;;;;;:::i;:::-;35608:2:::1;35598:7;;35583:14;:22;;;;:::i;:::-;35582:28;;35574:73;;;::::0;-1:-1:-1;;;35574:73:0;;8288:2:1;35574:73:0::1;::::0;::::1;8270:21:1::0;;;8307:18;;;8300:30;8366:34;8346:18;;;8339:62;8418:18;;35574:73:0::1;8260:182:1::0;35574:73:0::1;35683:12;::::0;35664:48:::1;::::0;35697:14;;35683:12;35664:48:::1;::::0;;;::::1;35741:12;::::0;;35723:15:::1;:30:::0;35764:29;35487:314::o;37408:138::-;5495:6;;-1:-1:-1;;;;;5495:6:0;199:10;5495:22;5487:67;;;;-1:-1:-1;;;5487:67:0;;;;;;;:::i;:::-;37481:22:::1;::::0;3714:14:1;;3707:22;3689:41;;37481:22:0::1;::::0;3677:2:1;3662:18;37481:22:0::1;;;;;;;37514:15;:24:::0;;;::::1;;-1:-1:-1::0;;;37514:24:0::1;-1:-1:-1::0;;;;37514:24:0;;::::1;::::0;;;::::1;::::0;;37408:138::o;6038:223::-;5495:6;;-1:-1:-1;;;;;5495:6:0;199:10;5495:22;5487:67;;;;-1:-1:-1;;;5487:67:0;;;;;;;:::i;:::-;6116:6:::1;::::0;;;6104:18;;-1:-1:-1;;;;;;6104:18:0;;::::1;-1:-1:-1::0;;;;;6116:6:0;::::1;6104:18;::::0;;;6133:19:::1;::::0;;6175:22:::1;6193:4:::0;6175:15:::1;:22;:::i;:::-;6163:9;:34:::0;6250:1:::1;6234:6:::0;;6213:40:::1;::::0;-1:-1:-1;;;;;6234:6:0;;::::1;::::0;6213:40:::1;::::0;6250:1;;6213:40:::1;6038:223:::0;:::o;36242:116::-;5495:6;;-1:-1:-1;;;;;5495:6:0;199:10;5495:22;5487:67;;;;-1:-1:-1;;;5487:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36314:28:0::1;36345:5;36314:28:::0;;;:18:::1;:28;::::0;;;;:36;;-1:-1:-1;;36314:36:0::1;::::0;;36242:116::o;5588:246::-;5495:6;;-1:-1:-1;;;;;5495:6:0;199:10;5495:22;5487:67;;;;-1:-1:-1;;;5487:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5679:22:0;::::1;5671:73;;;::::0;-1:-1:-1;;;5671:73:0;;6773:2:1;5671:73:0::1;::::0;::::1;6755:21:1::0;6812:2;6792:18;;;6785:30;6851:34;6831:18;;;6824:62;-1:-1:-1;;;6902:18:1;;;6895:36;6948:19;;5671:73:0::1;6745:228:1::0;5671:73:0::1;5781:6;::::0;;5760:38:::1;::::0;-1:-1:-1;;;;;5760:38:0;;::::1;::::0;5781:6;::::1;::::0;5760:38:::1;::::0;::::1;5809:6;:17:::0;;-1:-1:-1;;;;;;5809:17:0::1;-1:-1:-1::0;;;;;5809:17:0;;;::::1;::::0;;;::::1;::::0;;5588:246::o;21692:337::-;-1:-1:-1;;;;;21785:19:0;;21777:68;;;;-1:-1:-1;;;21777:68:0;;7180:2:1;21777:68:0;;;7162:21:1;7219:2;7199:18;;;7192:30;7258:34;7238:18;;;7231:62;-1:-1:-1;;;7309:18:1;;;7302:34;7353:19;;21777:68:0;7152:226:1;21777:68:0;-1:-1:-1;;;;;21864:21:0;;21856:68;;;;-1:-1:-1;;;21856:68:0;;8649:2:1;21856:68:0;;;8631:21:1;8688:2;8668:18;;;8661:30;8727:34;8707:18;;;8700:62;-1:-1:-1;;;8778:18:1;;;8771:32;8820:19;;21856:68:0;8621:224:1;21856:68:0;-1:-1:-1;;;;;21937:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;21989:32;;14262:25:1;;;21989:32:0;;14235:18:1;21989:32:0;;;;;;;21692:337;;;:::o;22037:3401::-;-1:-1:-1;;;;;22168:20:0;;22160:70;;;;-1:-1:-1;;;22160:70:0;;9393:2:1;22160:70:0;;;9375:21:1;9432:2;9412:18;;;9405:30;9471:34;9451:18;;;9444:62;-1:-1:-1;;;9522:18:1;;;9515:35;9567:19;;22160:70:0;9365:227:1;22160:70:0;-1:-1:-1;;;;;22249:23:0;;22241:71;;;;-1:-1:-1;;;22241:71:0;;13201:2:1;22241:71:0;;;13183:21:1;13240:2;13220:18;;;13213:30;13279:34;13259:18;;;13252:62;-1:-1:-1;;;13330:18:1;;;13323:33;13373:19;;22241:71:0;13173:225:1;22241:71:0;22340:1;22331:6;:10;22323:64;;;;-1:-1:-1;;;22323:64:0;;11729:2:1;22323:64:0;;;11711:21:1;11768:2;11748:18;;;11741:30;11807:34;11787:18;;;11780:62;-1:-1:-1;;;11858:18:1;;;11851:39;11907:19;;22323:64:0;11701:231:1;22323:64:0;-1:-1:-1;;;;;22407:21:0;;;;;;:10;:21;;;;;;;;22406:22;22398:53;;;;-1:-1:-1;;;22398:53:0;;7585:2:1;22398:53:0;;;7567:21:1;7624:2;7604:18;;;7597:30;-1:-1:-1;;;7643:18:1;;;7636:48;7701:18;;22398:53:0;7557:168:1;22398:53:0;22482:10;22471:22;;;;:10;:22;;;;;;;;22470:23;22462:54;;;;-1:-1:-1;;;22462:54:0;;7585:2:1;22462:54:0;;;7567:21:1;7624:2;7604:18;;;7597:30;-1:-1:-1;;;7643:18:1;;;7636:48;7701:18;;22462:54:0;7557:168:1;22462:54:0;5406:7;5433:6;-1:-1:-1;;;;;22536:17:0;;;5433:6;;22536:17;;:41;;-1:-1:-1;5406:7:0;5433:6;-1:-1:-1;;;;;22557:20:0;;;5433:6;;22557:20;22536:41;:77;;;-1:-1:-1;;;;;;22590:23:0;;22608:4;22590:23;22536:77;:107;;;-1:-1:-1;;;;;;22617:26:0;;22638:4;22617:26;22536:107;22531:455;;22680:11;;;;;;;22675:104;;22720:11;;;;;;;22712:47;;;;-1:-1:-1;;;22712:47:0;;13966:2:1;22712:47:0;;;13948:21:1;14005:2;13985:18;;;13978:30;-1:-1:-1;;;14024:18:1;;;14017:53;14087:18;;22712:47:0;13938:173:1;22712:47:0;22810:16;;;;22807:168;;;22860:10;22851:20;;;;:8;:20;;;;;:27;;;;;22847:113;;22926:14;;;;;;;;-1:-1:-1;22926:14:0;;;;;;;;;;22935:4;22926:14;;;;;;22912:10;22903:20;;:8;:20;;;;;;;:37;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;22903:37:0;;;;;;;;;;22847:113;23034:7;;-1:-1:-1;;;;;23024:17:0;;;23034:7;;23024:17;:52;;;;-1:-1:-1;23066:9:0;;-1:-1:-1;;;;;23045:31:0;;;23066:9;;;;;23045:31;;23024:52;:86;;;;-1:-1:-1;;;;;;23081:29:0;;;;;;:18;:29;;;;;;;;23080:30;23024:86;23021:673;;;23139:11;;;;;;;23131:47;;;;-1:-1:-1;;;23131:47:0;;13966:2:1;23131:47:0;;;13948:21:1;14005:2;13985:18;;;13978:30;-1:-1:-1;;;14024:18:1;;;14017:53;14087:18;;23131:47:0;13938:173:1;23131:47:0;23226:12;;23215:8;:23;23278:16;;;;23275:408;;;23336:15;23322:11;;:29;23319:345;;;23398:13;;23388:6;:23;;23380:63;;;;-1:-1:-1;;;23380:63:0;;12845:2:1;23380:63:0;;;12827:21:1;12884:2;12864:18;;;12857:30;12923:29;12903:18;;;12896:57;12970:18;;23380:63:0;12817:177:1;23380:63:0;-1:-1:-1;;;;;23478:19:0;;;;;;:8;:19;;;;;:23;23504:15;-1:-1:-1;23470:87:0;;;;-1:-1:-1;;;23470:87:0;;10159:2:1;23470:87:0;;;10141:21:1;10198:2;10178:18;;;10171:30;10237:34;10217:18;;;10210:62;-1:-1:-1;;;10288:18:1;;;10281:31;10329:19;;23470:87:0;10131:223:1;23470:87:0;23610:30;:15;23629:10;23610:30;:::i;:::-;-1:-1:-1;;;;;23584:19:0;;;;;;:8;:19;;;;;:56;23319:345;23729:9;;-1:-1:-1;;;23729:9:0;;;;23728:10;:29;;;;-1:-1:-1;23742:15:0;;-1:-1:-1;;;23742:15:0;;;;23728:29;:53;;;;-1:-1:-1;23774:7:0;;-1:-1:-1;;;;;23761:20:0;;;23774:7;;23761:20;23728:53;23724:1429;;;23856:20;;;;23853:226;;;23901:16;23920:26;23931:14;;23920:6;:10;;:26;;;;:::i;:::-;24003:7;;23901:45;;-1:-1:-1;23980:44:0;;23993:30;;24016:6;;23993:18;;-1:-1:-1;;;;;24003:7:0;23993:9;:18::i;:::-;:22;;:30::i;:::-;23980:8;;:12;:44::i;:::-;23969:55;;24047:16;24054:8;24047:6;:16::i;:::-;23853:226;;24128:8;;24107:18;24232:24;24250:4;24232:9;:24::i;:::-;24201:55;-1:-1:-1;24275:24:0;;24272:96;;24320:32;24331:20;24320:10;:32::i;:::-;24552:15;;24439:21;;-1:-1:-1;;;24552:15:0;;;;:40;;;;;24581:11;;24571:6;:21;;24552:40;24548:495;;;24631:11;24645:2;24631:16;;24783:21;24807:91;24895:2;24807:83;24823:66;24831:57;24875:12;;24832:37;24867:1;;24833:28;24848:12;;24833:10;:14;;:28;;;;:::i;:::-;24832:34;;:37::i;:::-;24831:43;;:57::i;:::-;24823:3;;:7;:66::i;:::-;24807:11;;;:15;:83::i;:91::-;24783:115;;24982:13;24971:7;:24;24967:60;;24999:28;25013:13;24999;:28::i;:::-;24548:495;;;-1:-1:-1;;25120:8:0;:21;23724:1429;-1:-1:-1;;;;;25239:26:0;;25165:12;25239:26;;;:18;:26;;;;;;25180:4;;25239:26;;;:59;;-1:-1:-1;;;;;;25269:29:0;;;;;;:18;:29;;;;;;;;25239:59;25236:105;;;-1:-1:-1;25324:5:0;25236:105;25382:48;25397:6;25405:9;25415:6;25422:7;25382:14;:48::i;:::-;22037:3401;;;;:::o;1391:192::-;1477:7;1513:12;1505:6;;;;1497:29;;;;-1:-1:-1;;;1497:29:0;;;;;;;;:::i;:::-;-1:-1:-1;1537:9:0;1549:5;1553:1;1549;:5;:::i;:::-;1537:17;1391:192;-1:-1:-1;;;;;1391:192:0:o;31975:163::-;32016:7;32037:15;32054;32073:19;:17;:19::i;:::-;32036:56;;-1:-1:-1;32036:56:0;-1:-1:-1;32110:20:0;32036:56;;32110:11;:20::i;:::-;32103:27;;;;31975:163;:::o;1851:132::-;1909:7;1936:39;1940:1;1943;1936:39;;;;;;;;;;;;;;;;;:3;:39::i;1058:181::-;1116:7;;1148:5;1152:1;1148;:5;:::i;:::-;1136:17;;1177:1;1172;:6;;1164:46;;;;-1:-1:-1;;;1164:46:0;;7932:2:1;1164:46:0;;;7914:21:1;7971:2;7951:18;;;7944:30;8010:29;7990:18;;;7983:57;8057:18;;1164:46:0;7904:177:1;30813:419:0;30872:7;30881;30890;30899;30908;30917;30938:23;30963:12;30977:18;30999:20;31011:7;30999:11;:20::i;:::-;30937:82;;;;;;31031:15;31048:23;31073:12;31089:50;31101:7;31110:4;31116:10;31128;:8;:10::i;:::-;31089:11;:50::i;:::-;31030:109;;;;-1:-1:-1;31030:109:0;;-1:-1:-1;31190:15:0;;-1:-1:-1;31207:4:0;;-1:-1:-1;31213:10:0;;-1:-1:-1;30813:419:0;;-1:-1:-1;;;;;30813:419:0:o;1591:250::-;1649:7;1673:6;1669:47;;-1:-1:-1;1703:1:0;1696:8;;1669:47;1728:9;1740:5;1744:1;1740;:5;:::i;:::-;1728:17;-1:-1:-1;1773:1:0;1764:5;1768:1;1728:17;1764:5;:::i;:::-;:10;1756:56;;;;-1:-1:-1;;;1756:56:0;;10966:2:1;1756:56:0;;;10948:21:1;11005:2;10985:18;;;10978:30;11044:34;11024:18;;;11017:62;-1:-1:-1;;;11095:18:1;;;11088:31;11136:19;;1756:56:0;10938:223:1;26091:437:0;26168:12;;26194:25;;;26191:209;;;-1:-1:-1;26250:12:0;;26191:209;;;26296:2;26283:10;:15;26280:120;;;-1:-1:-1;26329:2:0;26280:120;;;-1:-1:-1;26378:10:0;26280:120;26413:18;:11;26429:1;26413:15;:18::i;:::-;:23;26410:68;;26453:13;;;;:::i;:::-;;;;26410:68;26498:8;:22;-1:-1:-1;26091:437:0:o;25446:479::-;17521:9;:16;;-1:-1:-1;;;;17521:16:0;-1:-1:-1;;;17521:16:0;;;25554:21:::1;25636:38;25653:20:::0;25636:16:::1;:38::i;:::-;25685:26;25714:41;:21;25740:14:::0;25714:25:::1;:41::i;:::-;25879:8;::::0;25685:70;;-1:-1:-1;25858:57:0::1;::::0;-1:-1:-1;;;;;25879:8:0::1;25889:25;25685:70:::0;25912:1:::1;25889:22;:25::i;:::-;25858:20;:57::i;:::-;-1:-1:-1::0;;17560:9:0;:17;;-1:-1:-1;;;;17560:17:0;;;-1:-1:-1;25446:479:0:o;1247:136::-;1305:7;1332:43;1336:1;1339;1332:43;;;;;;;;;;;;;;;;;:3;:43::i;25935:144::-;17521:9;:16;;-1:-1:-1;;;;17521:16:0;-1:-1:-1;;;17521:16:0;;;26009:10;;26005:67:::1;;26036:24;26053:6;26036:16;:24::i;:::-;-1:-1:-1::0;17560:9:0;:17;;-1:-1:-1;;;;17560:17:0;;;25935:144::o;27653:748::-;27764:7;27760:40;;27786:14;:12;:14::i;:::-;-1:-1:-1;;;;;27817:29:0;;;;;;:21;:29;;;;;;;;:66;;;;-1:-1:-1;;;;;;27851:32:0;;;;;;:21;:32;;;;;;;;27850:33;27817:66;27813:527;;;27900:48;27922:6;27930:9;27941:6;27900:21;:48::i;:::-;27813:527;;;-1:-1:-1;;;;;27971:29:0;;;;;;:21;:29;;;;;;;;27970:30;:66;;;;-1:-1:-1;;;;;;28004:32:0;;;;;;:21;:32;;;;;;;;27970:66;27966:374;;;28053:46;28073:6;28081:9;28092:6;28053:19;:46::i;27966:374::-;-1:-1:-1;;;;;28121:29:0;;;;;;:21;:29;;;;;;;;:65;;;;-1:-1:-1;;;;;;28154:32:0;;;;;;:21;:32;;;;;;;;28121:65;28117:223;;;28203:48;28225:6;28233:9;28244:6;28203:21;:48::i;28117:223::-;28284:44;28302:6;28310:9;28321:6;28284:17;:44::i;:::-;28356:7;28352:41;;28378:15;33646:10;;33636:7;:20;33678:11;;33667:8;:22;33592:105;32146:555;32243:7;;32279;;32196;;;;;32297:289;32321:9;:16;32317:20;;32297:289;;;32387:7;32363;:21;32371:9;32381:1;32371:12;;;;;;-1:-1:-1;;;32371:12:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32371:12:0;32363:21;;;;;;;;;;;;;:31;;:66;;;32422:7;32398;:21;32406:9;32416:1;32406:12;;;;;;-1:-1:-1;;;32406:12:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32406:12:0;32398:21;;;;;;;;;;;;;:31;32363:66;32359:97;;;32439:7;;32448;;32431:25;;;;;;;32146:555;;:::o;32359:97::-;32481:34;32493:7;:21;32501:9;32511:1;32501:12;;;;;;-1:-1:-1;;;32501:12:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32501:12:0;32493:21;;;;;;;;;;;;;32481:7;;:11;:34::i;:::-;32471:44;;32540:34;32552:7;:21;32560:9;32570:1;32560:12;;;;;;-1:-1:-1;;;32560:12:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32560:12:0;32552:21;;;;;;;;;;;;;32540:7;;:11;:34::i;:::-;32530:44;-1:-1:-1;32339:3:0;;;;:::i;:::-;;;;32297:289;;;-1:-1:-1;32622:7:0;;32610;;:20;;:11;:20::i;:::-;32600:7;:30;32596:61;;;32640:7;;32649;;32632:25;;;;;;32146:555;;:::o;32596:61::-;32676:7;;32685;;-1:-1:-1;32146:555:0;-1:-1:-1;32146:555:0:o;1991:278::-;2077:7;2112:12;2105:5;2097:28;;;;-1:-1:-1;;;2097:28:0;;;;;;;;:::i;:::-;-1:-1:-1;2136:9:0;2148:5;2152:1;2148;:5;:::i;31240:310::-;31300:7;31309;31318;31338:12;31353:24;31369:7;31353:15;:24::i;:::-;31338:39;;31388:13;31404:25;31421:7;31404:16;:25::i;:::-;31388:41;-1:-1:-1;31440:23:0;31466:28;31388:41;31466:17;:7;31478:4;31466:11;:17::i;:::-;:21;;:28::i;:::-;31440:54;31530:4;;-1:-1:-1;31536:5:0;;-1:-1:-1;31240:310:0;;-1:-1:-1;;;31240:310:0:o;31558:409::-;31668:7;;;;31724:24;:7;31736:11;31724;:24::i;:::-;31706:42;-1:-1:-1;31759:12:0;31774:21;:4;31783:11;31774:8;:21::i;:::-;31759:36;-1:-1:-1;31806:13:0;31822:22;:5;31832:11;31822:9;:22::i;:::-;31806:38;-1:-1:-1;31855:23:0;31881:28;31806:38;31881:17;:7;31893:4;31881:11;:17::i;:28::-;31928:7;;;;-1:-1:-1;31954:4:0;;-1:-1:-1;31558:409:0;;-1:-1:-1;;;;;;;31558:409:0:o;2277:130::-;2335:7;2362:37;2366:1;2369;2362:37;;;;;;;;;;;;;;;;;:3;:37::i;26536:592::-;26682:16;;;26696:1;26682:16;;;;;;;;26658:21;;26682:16;;;;;;;;;;-1:-1:-1;26682:16:0;26658:40;;26727:4;26709;26714:1;26709:7;;;;;;-1:-1:-1;;;26709:7:0;;;;;;;;;;;;;;:23;-1:-1:-1;;;;;26709:23:0;;;-1:-1:-1;;;;;26709:23:0;;;;;26753:9;;;;;;;;;-1:-1:-1;;;;;26753:9:0;-1:-1:-1;;;;;26753:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26743:4;26748:1;26743:7;;;;;;-1:-1:-1;;;26743:7:0;;;;;;;;;-1:-1:-1;;;;;26743:26:0;;;:7;;;;;;;;;:26;26814:9;;26782:56;;26799:4;;26814:9;;;;26826:11;26782:8;:56::i;:::-;26877:9;;:190;;-1:-1:-1;;;26877:190:0;;:9;;;;-1:-1:-1;;;;;26877:9:0;;:60;;:190;;26952:11;;26978:1;;26994:4;;27021;;27041:15;;26877:190;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27085:35;27102:11;27115:4;27085:35;;;;;;;:::i;:::-;;;;;;;;26536:592;;:::o;34265:126::-;34357:26;;-1:-1:-1;;;;;34357:18:0;;;:26;;;;;34376:6;;34357:26;;;;34376:6;34357:18;:26;;;;;;;;;;;;;;;;;;;;;34265:126;;:::o;27136:509::-;27277:16;;;27291:1;27277:16;;;;;;;;27253:21;;27277:16;;;;;;;;;;-1:-1:-1;27277:16:0;27253:40;;27314:9;;;;;;;;;-1:-1:-1;;;;;27314:9:0;-1:-1:-1;;;;;27314:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27304:4;27309:1;27304:7;;;;;;-1:-1:-1;;;27304:7:0;;;;;;;;;;;;;;:26;-1:-1:-1;;;;;27304:26:0;;;-1:-1:-1;;;;;27304:26:0;;;;;27359:4;27341;27346:1;27341:7;;;;;;-1:-1:-1;;;27341:7:0;;;;;;;;;-1:-1:-1;;;;;27341:23:0;;;:7;;;;;;;;;:23;27403:9;;;;;;:60;27471:6;27493:1;27509:4;27528:11;27554:24;:15;27574:3;27554:19;:24::i;:::-;27403:186;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27607:30;27624:6;27632:4;27607:30;;;;;;;:::i;33380:204::-;33426:7;;:12;:29;;;;-1:-1:-1;33442:8:0;;:13;33426:29;33423:41;;;33380:204::o;33423:41::-;33489:7;;;33476:10;:20;33521:8;;;33507:11;:22;-1:-1:-1;33542:11:0;;;;33564:12;33380:204::o;29474:549::-;29577:15;29594:23;29619:12;29633:23;29658:12;29672:13;29689:19;29700:7;29689:10;:19::i;:::-;-1:-1:-1;;;;;29737:15:0;;;;;;:7;:15;;;;;;29576:132;;-1:-1:-1;29576:132:0;;-1:-1:-1;29576:132:0;;-1:-1:-1;29576:132:0;-1:-1:-1;29576:132:0;-1:-1:-1;29576:132:0;-1:-1:-1;29737:28:0;;29757:7;29737:19;:28::i;:::-;-1:-1:-1;;;;;29719:15:0;;;;;;:7;:15;;;;;;;;:46;;;;29794:7;:15;;;;:28;;29814:7;29794:19;:28::i;:::-;-1:-1:-1;;;;;29776:15:0;;;;;;;:7;:15;;;;;;:46;;;;29854:18;;;;;;;:39;;29877:15;29854:22;:39::i;:::-;-1:-1:-1;;;;;29833:18:0;;;;;;:7;:18;;;;;:60;29904:18;29916:5;29904:11;:18::i;:::-;29933:22;29944:4;29950;29933:10;:22::i;:::-;29988:9;-1:-1:-1;;;;;29971:44:0;29980:6;-1:-1:-1;;;;;29971:44:0;;29999:15;29971:44;;;;14262:25:1;;14250:2;14235:18;;14217:76;29971:44:0;;;;;;;;29474:549;;;;;;;;;:::o;28905:561::-;29006:15;29023:23;29048:12;29062:23;29087:12;29101:13;29118:19;29129:7;29118:10;:19::i;:::-;-1:-1:-1;;;;;29166:15:0;;;;;;:7;:15;;;;;;29005:132;;-1:-1:-1;29005:132:0;;-1:-1:-1;29005:132:0;;-1:-1:-1;29005:132:0;-1:-1:-1;29005:132:0;-1:-1:-1;29005:132:0;-1:-1:-1;29166:28:0;;29005:132;29166:19;:28::i;:::-;-1:-1:-1;;;;;29148:15:0;;;;;;;:7;:15;;;;;;;;:46;;;;29226:18;;;;;:7;:18;;;;;:39;;29249:15;29226:22;:39::i;:::-;-1:-1:-1;;;;;29205:18:0;;;;;;:7;:18;;;;;;;;:60;;;;29297:7;:18;;;;:39;;29320:15;29297:22;:39::i;30031:620::-;30134:15;30151:23;30176:12;30190:23;30215:12;30229:13;30246:19;30257:7;30246:10;:19::i;:::-;-1:-1:-1;;;;;30294:15:0;;;;;;:7;:15;;;;;;30133:132;;-1:-1:-1;30133:132:0;;-1:-1:-1;30133:132:0;;-1:-1:-1;30133:132:0;-1:-1:-1;30133:132:0;-1:-1:-1;30133:132:0;-1:-1:-1;30294:28:0;;30314:7;30294:19;:28::i;:::-;-1:-1:-1;;;;;30276:15:0;;;;;;:7;:15;;;;;;;;:46;;;;30351:7;:15;;;;:28;;30371:7;30351:19;:28::i;28409:488::-;28508:15;28525:23;28550:12;28564:23;28589:12;28603:13;28620:19;28631:7;28620:10;:19::i;:::-;-1:-1:-1;;;;;28668:15:0;;;;;;:7;:15;;;;;;28507:132;;-1:-1:-1;28507:132:0;;-1:-1:-1;28507:132:0;;-1:-1:-1;28507:132:0;-1:-1:-1;28507:132:0;-1:-1:-1;28507:132:0;-1:-1:-1;28668:28:0;;28507:132;28668:19;:28::i;33054:154::-;33118:7;33145:55;33184:5;33145:20;33157:7;;33145;:11;;:20;;;;:::i;33216:156::-;33281:7;33308:56;33348:5;33308:21;33320:8;;33308:7;:11;;:21;;;;:::i;2415:166::-;2501:7;2537:12;2529:6;2521:29;;;;-1:-1:-1;;;2521:29:0;;;;;;;;:::i;:::-;-1:-1:-1;2568:5:0;2572:1;2568;:5;:::i;:::-;2561:12;2415:166;-1:-1:-1;;;;2415:166:0:o;32709:337::-;32764:19;32787:10;:8;:10::i;:::-;32764:33;-1:-1:-1;32808:13:0;32824:22;:5;32764:33;32824:9;:22::i;:::-;32898:4;32882:22;;;;:7;:22;;;;;;32808:38;;-1:-1:-1;32882:33:0;;32808:38;32882:26;:33::i;:::-;32873:4;32857:22;;;;:7;:22;;;;;;;;:58;;;;32929:21;:36;;;;;;32926:112;;;33021:4;33005:22;;;;:7;:22;;;;;;:33;;33032:5;33005:26;:33::i;:::-;32996:4;32980:22;;;;:7;:22;;;;;:58;32709:337;;;:::o;30659:146::-;30736:7;;:17;;30748:4;30736:11;:17::i;:::-;30726:7;:27;30777:10;;:20;;30792:4;30777:14;:20::i;:::-;30764:10;:33;-1:-1:-1;;30659:146:0:o;14:160:1:-;79:20;;135:13;;128:21;118:32;;108:2;;164:1;161;154:12;108:2;60:114;;;:::o;179:257::-;238:6;291:2;279:9;270:7;266:23;262:32;259:2;;;312:6;304;297:22;259:2;356:9;343:23;375:31;400:5;375:31;:::i;441:261::-;511:6;564:2;552:9;543:7;539:23;535:32;532:2;;;585:6;577;570:22;532:2;622:9;616:16;641:31;666:5;641:31;:::i;707:398::-;775:6;783;836:2;824:9;815:7;811:23;807:32;804:2;;;857:6;849;842:22;804:2;901:9;888:23;920:31;945:5;920:31;:::i;:::-;970:5;-1:-1:-1;1027:2:1;1012:18;;999:32;1040:33;999:32;1040:33;:::i;:::-;1092:7;1082:17;;;794:311;;;;;:::o;1110:466::-;1187:6;1195;1203;1256:2;1244:9;1235:7;1231:23;1227:32;1224:2;;;1277:6;1269;1262:22;1224:2;1321:9;1308:23;1340:31;1365:5;1340:31;:::i;:::-;1390:5;-1:-1:-1;1447:2:1;1432:18;;1419:32;1460:33;1419:32;1460:33;:::i;:::-;1214:362;;1512:7;;-1:-1:-1;;;1566:2:1;1551:18;;;;1538:32;;1214:362::o;1581:325::-;1649:6;1657;1710:2;1698:9;1689:7;1685:23;1681:32;1678:2;;;1731:6;1723;1716:22;1678:2;1775:9;1762:23;1794:31;1819:5;1794:31;:::i;:::-;1844:5;1896:2;1881:18;;;;1868:32;;-1:-1:-1;;;1668:238:1:o;1911:190::-;1967:6;2020:2;2008:9;1999:7;1995:23;1991:32;1988:2;;;2041:6;2033;2026:22;1988:2;2069:26;2085:9;2069:26;:::i;2106:190::-;2165:6;2218:2;2206:9;2197:7;2193:23;2189:32;2186:2;;;2239:6;2231;2224:22;2186:2;-1:-1:-1;2267:23:1;;2176:120;-1:-1:-1;2176:120:1:o;2301:258::-;2366:6;2374;2427:2;2415:9;2406:7;2402:23;2398:32;2395:2;;;2448:6;2440;2433:22;2395:2;2489:9;2476:23;2466:33;;2518:35;2549:2;2538:9;2534:18;2518:35;:::i;:::-;2508:45;;2385:174;;;;;:::o;2564:463::-;2617:3;2655:5;2649:12;2682:6;2677:3;2670:19;2708:4;2737:2;2732:3;2728:12;2721:19;;2774:2;2767:5;2763:14;2795:3;2807:195;2821:6;2818:1;2815:13;2807:195;;;2886:13;;-1:-1:-1;;;;;2882:39:1;2870:52;;2942:12;;;;2977:15;;;;2918:1;2836:9;2807:195;;;-1:-1:-1;3018:3:1;;2625:402;-1:-1:-1;;;;;2625:402:1:o;3968:510::-;4239:6;4228:9;4221:25;4282:3;4277:2;4266:9;4262:18;4255:31;4202:4;4303:57;4355:3;4344:9;4340:19;4332:6;4303:57;:::i;:::-;-1:-1:-1;;;;;4396:32:1;;;;4391:2;4376:18;;4369:60;-1:-1:-1;4460:2:1;4445:18;4438:34;4295:65;4211:267;-1:-1:-1;;4211:267:1:o;4483:603::-;4595:4;4624:2;4653;4642:9;4635:21;4685:6;4679:13;4728:6;4723:2;4712:9;4708:18;4701:34;4753:4;4766:140;4780:6;4777:1;4774:13;4766:140;;;4875:14;;;4871:23;;4865:30;4841:17;;;4860:2;4837:26;4830:66;4795:10;;4766:140;;;4924:6;4921:1;4918:13;4915:2;;;4994:4;4989:2;4980:6;4969:9;4965:22;4961:31;4954:45;4915:2;-1:-1:-1;5070:2:1;5049:15;-1:-1:-1;;5045:29:1;5030:45;;;;5077:2;5026:54;;4604:482;-1:-1:-1;;;4604:482:1:o;11166:356::-;11368:2;11350:21;;;11387:18;;;11380:30;11446:34;11441:2;11426:18;;11419:62;11513:2;11498:18;;11340:182::o;14298:332::-;14505:6;14494:9;14487:25;14548:2;14543;14532:9;14528:18;14521:30;14468:4;14568:56;14620:2;14609:9;14605:18;14597:6;14568:56;:::i;14635:582::-;14934:6;14923:9;14916:25;14977:6;14972:2;14961:9;14957:18;14950:34;15020:3;15015:2;15004:9;15000:18;14993:31;14897:4;15041:57;15093:3;15082:9;15078:19;15070:6;15041:57;:::i;:::-;-1:-1:-1;;;;;15134:32:1;;;;15129:2;15114:18;;15107:60;-1:-1:-1;15198:3:1;15183:19;15176:35;15033:65;14906:311;-1:-1:-1;;;14906:311:1:o;15411:128::-;15451:3;15482:1;15478:6;15475:1;15472:13;15469:2;;;15488:18;;:::i;:::-;-1:-1:-1;15524:9:1;;15459:80::o;15544:120::-;15584:1;15610;15600:2;;15615:18;;:::i;:::-;-1:-1:-1;15649:9:1;;15590:74::o;15669:168::-;15709:7;15775:1;15771;15767:6;15763:14;15760:1;15757:21;15752:1;15745:9;15738:17;15734:45;15731:2;;;15782:18;;:::i;:::-;-1:-1:-1;15822:9:1;;15721:116::o;15842:125::-;15882:4;15910:1;15907;15904:8;15901:2;;;15915:18;;:::i;:::-;-1:-1:-1;15952:9:1;;15891:76::o;15972:135::-;16011:3;-1:-1:-1;;16032:17:1;;16029:2;;;16052:18;;:::i;:::-;-1:-1:-1;16099:1:1;16088:13;;16019:88::o;16112:112::-;16144:1;16170;16160:2;;16175:18;;:::i;:::-;-1:-1:-1;16209:9:1;;16150:74::o;16229:127::-;16290:10;16285:3;16281:20;16278:1;16271:31;16321:4;16318:1;16311:15;16345:4;16342:1;16335:15;16361:127;16422:10;16417:3;16413:20;16410:1;16403:31;16453:4;16450:1;16443:15;16477:4;16474:1;16467:15;16493:131;-1:-1:-1;;;;;16568:31:1;;16558:42;;16548:2;;16614:1;16611;16604:12;16548:2;16538:86;:::o
Swarm Source
ipfs://9803ac50d5c85f5dab5d2796f3513b434e1857b67649d9608f294e969722da3d