Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
FoodCoin
Compiler Version
v0.8.14+commit.80d49f37
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-05-22 */ // SPDX-License-Identifier: Unlicensed pragma solidity 0.8.14; /* * Tax Fee: 0.1 % * Liquidity Fee: 0.1 % * Marketing wallet: 0.1 % * Charity wallet: 0.1 % */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return payable(msg.sender); } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; address private _previousOwner; uint256 private _lockTime; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } function geUnlockTime() public view returns (uint256) { return _lockTime; } //Locks the contract for owner for the amount of time provided function lock(uint256 time) public virtual onlyOwner { _previousOwner = _owner; _owner = address(0); _lockTime = block.timestamp + time; emit OwnershipTransferred(_owner, address(0)); } //Unlocks the contract for owner when _lockTime is exceeds function unlock() public virtual { require(_previousOwner == msg.sender, "You don't have permission to unlock"); require(block.timestamp > _lockTime , "Contract is locked until 7 days"); emit OwnershipTransferred(_owner, _previousOwner); _owner = _previousOwner; } } interface IERC20 { function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); 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"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // pragma solidity >=0.5.0; interface IUniswapV2Factory { 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; } // pragma solidity >=0.5.0; interface IUniswapV2Pair { 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; } // pragma solidity >=0.6.2; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } // pragma solidity >=0.6.2; interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } contract FoodCoin is Context, IERC20, Ownable { using SafeMath for uint256; using Address for address; mapping (address => uint256) private _rOwned; mapping (address => uint256) private _tOwned; mapping (address => mapping (address => uint256)) private _allowances; mapping (address => bool) private _isExcludedFromFee; mapping (address => bool) private _isExcluded; address[] private _excluded; uint256 private constant MAX = ~uint128(0); uint256 private _tTotal = 10000000 * 10**18; uint256 private _rTotal = (MAX - (MAX % _tTotal)); uint256 private _tFeeTotal; string private _name = "FoodCoin"; string private _symbol = "Food"; uint8 private _decimals = 18; uint256 public _taxFee = 10; // 0.1 % uint256 private _previousTaxFee = _taxFee; uint256 public _liquidityFee = 10; // 0.1% uint256 private _previousLiquidityFee = _liquidityFee; uint256 public _marketingFee = 10; // 0.1% uint256 private _previousmarketingFee = _marketingFee; address public marketingWallet = 0x0c460A9cC3b585A53f494F2DB933Bd260ae3E9f5; uint256 public _charityFee = 10; // 0.1% uint256 private _previouscharityFee = _charityFee; address public charityWallet = 0xe68b9E3f175B93c3591C97d611fd6790516eA672; IUniswapV2Router02 public uniswapV2Router; address public uniswapV2Pair; bool inSwapAndLiquify; bool public swapAndLiquifyEnabled = true; uint256 public numTokensSellToAddToLiquidity = 10000 * 10**18; uint256 public _maxTxAmount = 10000000 * 10**18; event MinTokensBeforeSwapUpdated(uint256 minTokensBeforeSwap); event SwapAndLiquifyEnabledUpdated(bool enabled); event SwapAndLiquify( uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity ); modifier lockTheSwap { inSwapAndLiquify = true; _; inSwapAndLiquify = false; } constructor() { _rOwned[_msgSender()] = _rTotal; IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); // Create a uniswap pair for this new token uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()) .createPair(address(this), _uniswapV2Router.WETH()); // set the rest of the contract variables uniswapV2Router = _uniswapV2Router; //exclude owner and this contract from fee _isExcludedFromFee[owner()] = true; _isExcludedFromFee[marketingWallet] = true; _isExcludedFromFee[charityWallet] = true; _isExcludedFromFee[address(this)] = true; emit Transfer(address(0), _msgSender(), _tTotal); } function name() public view returns (string memory) { return _name; } function symbol() public view returns (string memory) { return _symbol; } function decimals() public view returns (uint8) { return _decimals; } function totalSupply() public view override returns (uint256) { return _tTotal; } function balanceOf(address account) public view override returns (uint256) { if (_isExcluded[account]) return _tOwned[account]; return tokenFromReflection(_rOwned[account]); } function transfer(address recipient, uint256 amount) public 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) public override returns (bool) { _approve(_msgSender(), spender, amount); return true; } function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } function isExcludedFromReward(address account) public view returns (bool) { return _isExcluded[account]; } function totalFees() public view returns (uint256) { return _tFeeTotal; } function deliver(uint256 tAmount) public { address sender = _msgSender(); require(!_isExcluded[sender], "Excluded addresses cannot call this function"); (uint256 rAmount,,,,,) = _getValues(tAmount); _rOwned[sender] = _rOwned[sender].sub(rAmount); _rTotal = _rTotal.sub(rAmount); _tFeeTotal = _tFeeTotal.add(tAmount); } 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 excludeFromReward(address account) public onlyOwner() { require(!_isExcluded[account], "Account is already excluded"); if(_rOwned[account] > 0) { _tOwned[account] = tokenFromReflection(_rOwned[account]); } _isExcluded[account] = true; _excluded.push(account); } function includeInReward(address account) external onlyOwner() { require(_isExcluded[account], "Account is already excluded"); for (uint256 i = 0; i < _excluded.length; i++) { if (_excluded[i] == account) { _excluded[i] = _excluded[_excluded.length - 1]; _tOwned[account] = 0; _isExcluded[account] = false; _excluded.pop(); break; } } } function _transferBothExcluded(address sender, address recipient, uint256 tAmount) private { (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _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); _takeLiquidity(tLiquidity); _reflectFee(rFee, tFee); emit Transfer(sender, recipient, tTransferAmount); } //to recieve ETH from uniswapV2Router when swaping receive() external payable {} function _reflectFee(uint256 rFee, uint256 tFee) private { _rTotal = _rTotal.sub(rFee); _tFeeTotal = _tFeeTotal.add(tFee); } 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 tFee = calculateTaxFee(tAmount); uint256 tLiquidity = calculateLiquidityFee(tAmount); uint256 tTransferAmount = tAmount.sub(tFee).sub(tLiquidity); return (tTransferAmount, tFee, tLiquidity); } function _getRValues(uint256 tAmount, uint256 tFee, uint256 tLiquidity, uint256 currentRate) private pure returns (uint256, uint256, uint256) { uint256 rAmount = tAmount.mul(currentRate); uint256 rFee = tFee.mul(currentRate); uint256 rLiquidity = tLiquidity.mul(currentRate); uint256 rTransferAmount = rAmount.sub(rFee).sub(rLiquidity); return (rAmount, rTransferAmount, rFee); } 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 _takeLiquidity(uint256 tLiquidity) private { uint256 currentRate = _getRate(); uint256 rLiquidity = tLiquidity.mul(currentRate); _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidity); if(_isExcluded[address(this)]) _tOwned[address(this)] = _tOwned[address(this)].add(tLiquidity); } function calculateTaxFee(uint256 _amount) private view returns (uint256) { return _amount.mul(_taxFee).div(10000); } function calculateLiquidityFee(uint256 _amount) private view returns (uint256) { return _amount.mul(_liquidityFee).div(10000); } function removeAllFee() private { if(_taxFee == 0 && _liquidityFee == 0 && _marketingFee==0 && _charityFee==0) return; _previousTaxFee = _taxFee; _previousLiquidityFee = _liquidityFee; _previousmarketingFee = _marketingFee; _previouscharityFee = _charityFee; _taxFee = 0; _liquidityFee = 0; _marketingFee = 0; _charityFee = 0; } function restoreAllFee() private { _taxFee = _previousTaxFee; _liquidityFee = _previousLiquidityFee; _marketingFee = _previousmarketingFee; _charityFee = _previouscharityFee; } function isExcludedFromFee(address account) public view returns(bool) { return _isExcludedFromFee[account]; } function _approve(address owner, address spender, uint256 amount) private { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function _transfer( address from, address to, uint256 amount ) private { require(from != address(0), "ERC20: transfer from the zero address"); require(amount > 0, "Transfer amount must be greater than zero"); // is the token balance of this contract address over the min number of // tokens that we need to initiate a swap + liquidity lock? // also, don't get caught in a circular liquidity event. // also, don't swap & liquify if sender is uniswap pair. uint256 contractTokenBalance = balanceOf(address(this)); bool overMinTokenBalance = contractTokenBalance >= numTokensSellToAddToLiquidity; if ( overMinTokenBalance && !inSwapAndLiquify && to == uniswapV2Pair && swapAndLiquifyEnabled ) { contractTokenBalance = numTokensSellToAddToLiquidity; //add liquidity swapAndLiquify(contractTokenBalance); } //transfer amount, it will take tax, liquidity fee _tokenTransfer(from,to,amount); } function swapAndLiquify(uint256 contractTokenBalance) private lockTheSwap { // split the contract balance into halves uint256 half = contractTokenBalance.div(2); uint256 otherHalf = contractTokenBalance.sub(half); // capture the contract's current ETH balance. // this is so that we can capture exactly the amount of ETH that the // swap creates, and not make the liquidity event include any ETH that // has been manually sent to the contract uint256 initialBalance = address(this).balance; // swap tokens for ETH swapTokensForEth(half); // <- this breaks the ETH -> HATE swap when swap+liquify is triggered // how much ETH did we just swap into? uint256 newBalance = address(this).balance.sub(initialBalance); // add liquidity to uniswap addLiquidity(otherHalf, newBalance); emit SwapAndLiquify(half, newBalance, otherHalf); } function swapTokensForEth(uint256 tokenAmount) private { // generate the uniswap pair path of token -> weth address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapV2Router.WETH(); _approve(address(this), address(uniswapV2Router), tokenAmount); // make the swap uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, // accept any amount of ETH path, address(this), block.timestamp ); } function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private { // approve token transfer to cover all possible scenarios _approve(address(this), address(uniswapV2Router), tokenAmount); // add the liquidity uniswapV2Router.addLiquidityETH{value: ethAmount}( address(this), tokenAmount, 0, // slippage is unavoidable 0, // slippage is unavoidable owner(), block.timestamp ); } //this method is responsible for taking all fee, if takeFee is true function _tokenTransfer(address sender, address recipient, uint256 amount) private { if(_isExcludedFromFee[sender] || _isExcludedFromFee[recipient]) { removeAllFee(); } else { require(amount <= _maxTxAmount, "Transfer amount exceeds the maxTxAmount."); } if (_isExcluded[sender] && !_isExcluded[recipient]) { _transferFromExcluded(sender, recipient, amount); } else if (!_isExcluded[sender] && _isExcluded[recipient]) { _transferToExcluded(sender, recipient, amount); } else if (!_isExcluded[sender] && !_isExcluded[recipient]) { _transferStandard(sender, recipient, amount); } else if (_isExcluded[sender] && _isExcluded[recipient]) { _transferBothExcluded(sender, recipient, amount); } else { _transferStandard(sender, recipient, amount); } if(_isExcludedFromFee[sender] || _isExcludedFromFee[recipient]) { restoreAllFee(); } } function _transferStandard(address sender, address recipient, uint256 tAmount) private { (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getValues(tAmount); (tTransferAmount, rTransferAmount) = takeMarketing(sender, tTransferAmount, rTransferAmount, tAmount); (tTransferAmount, rTransferAmount) = takeCharity(sender, tTransferAmount, rTransferAmount, tAmount); _rOwned[sender] = _rOwned[sender].sub(rAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); _takeLiquidity(tLiquidity); _reflectFee(rFee, tFee); emit Transfer(sender, recipient, tTransferAmount); } function takeMarketing(address sender, uint256 tTransferAmount, uint256 rTransferAmount, uint256 tAmount) private returns (uint256, uint256) { if(_marketingFee==0) { return(tTransferAmount, rTransferAmount); } uint256 tMarketing = tAmount.div(10000).mul(_marketingFee); uint256 rMarketing = tMarketing.mul(_getRate()); rTransferAmount = rTransferAmount.sub(rMarketing); tTransferAmount = tTransferAmount.sub(tMarketing); _rOwned[marketingWallet] = _rOwned[marketingWallet].add(rMarketing); emit Transfer(sender, marketingWallet, tMarketing); return(tTransferAmount, rTransferAmount); } function takeCharity(address sender, uint256 tTransferAmount, uint256 rTransferAmount, uint256 tAmount) private returns (uint256, uint256) { if(_charityFee==0) { return(tTransferAmount, rTransferAmount); } uint256 tCharity = tAmount.div(10000).mul(_charityFee); uint256 rCharity = tCharity.mul(_getRate()); rTransferAmount = rTransferAmount.sub(rCharity); tTransferAmount = tTransferAmount.sub(tCharity); _rOwned[charityWallet] = _rOwned[charityWallet].add(rCharity); emit Transfer(sender, charityWallet, tCharity); return(tTransferAmount, rTransferAmount); } function _transferToExcluded(address sender, address recipient, uint256 tAmount) private { (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getValues(tAmount); _rOwned[sender] = _rOwned[sender].sub(rAmount); _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); _takeLiquidity(tLiquidity); _reflectFee(rFee, tFee); emit Transfer(sender, recipient, tTransferAmount); } function _transferFromExcluded(address sender, address recipient, uint256 tAmount) private { (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getValues(tAmount); _tOwned[sender] = _tOwned[sender].sub(tAmount); _rOwned[sender] = _rOwned[sender].sub(rAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); _takeLiquidity(tLiquidity); _reflectFee(rFee, tFee); emit Transfer(sender, recipient, tTransferAmount); } function excludeFromFee(address account) public onlyOwner { _isExcludedFromFee[account] = true; } function includeInFee(address account) public onlyOwner { _isExcludedFromFee[account] = false; } function mint(uint256 amount) public onlyOwner { uint256 rate = _getRate(); uint256 rAmount = amount.mul(rate); _rOwned[owner()] += rAmount; _tTotal += amount; _rTotal += rAmount; emit Transfer(address(0), owner(), amount); } function burn(uint256 amount) public onlyOwner { uint256 rate = _getRate(); uint256 rAmount = amount.mul(rate); require(balanceOf(_msgSender()) >= amount, "amount too high"); _rOwned[_msgSender()] += rAmount; _tTotal -= amount; _rTotal -= rAmount; emit Transfer(_msgSender(), address(0), amount); } function setMarketingWallet(address newWallet) external onlyOwner() { marketingWallet = newWallet; } function setCharityWallet(address newWallet) external onlyOwner() { charityWallet = newWallet; } function setFeePercent(uint256 taxFee, uint256 liquidityFee, uint256 charityFee, uint256 marketingFee) external onlyOwner() { _taxFee = taxFee; _liquidityFee = liquidityFee; _charityFee = charityFee; _marketingFee = marketingFee; } function setNumTokensSellToAddToLiquidity(uint256 newAmount) external onlyOwner() { numTokensSellToAddToLiquidity = newAmount; } function setMaxTxAmount(uint256 maxTxAmount) external onlyOwner() { _maxTxAmount = maxTxAmount; require(_maxTxAmount > totalSupply().div(400), "value too low"); } function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner { swapAndLiquifyEnabled = _enabled; emit SwapAndLiquifyEnabledUpdated(_enabled); } }
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":false,"internalType":"uint256","name":"minTokensBeforeSwap","type":"uint256"}],"name":"MinTokensBeforeSwapUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_charityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_marketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxFee","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":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"charityWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"geUnlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","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":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTokensSellToAddToLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"setCharityWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"taxFee","type":"uint256"},{"internalType":"uint256","name":"liquidityFee","type":"uint256"},{"internalType":"uint256","name":"charityFee","type":"uint256"},{"internalType":"uint256","name":"marketingFee","type":"uint256"}],"name":"setFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxAmount","type":"uint256"}],"name":"setMaxTxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"setNumTokensSellToAddToLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526a084595161401484a000000600981905562000028906001600160801b03620004ca565b6200003b906001600160801b03620004ed565b600a55604080518082019091526008808252672337b7b221b7b4b760c11b60209092019182526200006f91600c9162000424565b5060408051808201909152600480825263119bdbd960e21b60209092019182526200009d91600d9162000424565b50600e805460ff19166012908117909155600a600f819055601081905560118190559081905560138190556014819055601580546001600160a01b0319908116730c460a9cc3b585a53f494f2db933bd260ae3e9f51790915560168290556017919091556018805490911673e68b9e3f175b93c3591c97d611fd6790516ea672179055601a805460ff60a81b1916600160a81b17905569021e19e0c9bab2400000601b556a084595161401484a000000601c553480156200015d57600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600a543360009081526003602090815260409182902092909255805163c45a015560e01b81529051737a250d5630b4cf539739df2c5dacb4c659f2488d92839263c45a015592600480830193928290030181865afa15801562000206573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200022c919062000513565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200027a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002a0919062000513565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015620002ee573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000314919062000513565b601a80546001600160a01b03199081166001600160a01b0393841617909155601980549091169183169190911790556001600660006200035c6000546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff199687161790556015548216815260069093528183208054851660019081179091556018549091168352818320805485168217905530835291208054909216179055620003cd3390565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6009546040516200041591815260200190565b60405180910390a35062000581565b828054620004329062000545565b90600052602060002090601f016020900481019282620004565760008555620004a1565b82601f106200047157805160ff1916838001178555620004a1565b82800160010185558215620004a1579182015b82811115620004a157825182559160200191906001019062000484565b50620004af929150620004b3565b5090565b5b80821115620004af5760008155600101620004b4565b600082620004e857634e487b7160e01b600052601260045260246000fd5b500690565b6000828210156200050e57634e487b7160e01b600052601160045260246000fd5b500390565b6000602082840312156200052657600080fd5b81516001600160a01b03811681146200053e57600080fd5b9392505050565b600181811c908216806200055a57607f821691505b6020821081036200057b57634e487b7160e01b600052602260045260246000fd5b50919050565b612cef80620005916000396000f3fe6080604052600436106102815760003560e01c80636bc87c3a1161014f578063a69df4b5116100c1578063dd4670641161007a578063dd46706414610781578063dd62ed3e146107a1578063ea2f0b37146107e7578063ec28438a14610807578063f0f165af14610827578063f2fde38b1461084757600080fd5b8063a69df4b5146106e1578063a9059cbb146106f6578063b6c5232414610716578063c49b9a801461072b578063d12a76881461074b578063d38ab97d1461076157600080fd5b80637d1db4a5116101135780637d1db4a51461061f57806388f82020146106355780638da5cb5b1461066e57806395d89b411461068c578063a0712d68146106a1578063a457c2d7146106c157600080fd5b80636bc87c3a1461059457806370a08231146105aa578063715018a6146105ca57806375f0a874146105df5780637b208769146105ff57600080fd5b806339509351116101f35780634549b039116101ac5780634549b039146104ba57806349bd5a5e146104da5780634a74bb02146104fa57806352390c021461051b5780635342acb41461053b5780635d098b381461057457600080fd5b8063395093511461040e5780633b124fe71461042e5780633bd5d1731461044457806340f8007a1461046457806342966c681461047a578063437823ec1461049a57600080fd5b806322976e0d1161024557806322976e0d1461035457806323b872dd1461036a5780632d8381191461038a57806330563bd7146103aa578063313ce567146103cc5780633685d419146103ee57600080fd5b806306fdde031461028d578063095ea7b3146102b857806313114a9d146102e85780631694505e1461030757806318160ddd1461033f57600080fd5b3661028857005b600080fd5b34801561029957600080fd5b506102a2610867565b6040516102af9190612862565b60405180910390f35b3480156102c457600080fd5b506102d86102d33660046128cc565b6108f9565b60405190151581526020016102af565b3480156102f457600080fd5b50600b545b6040519081526020016102af565b34801561031357600080fd5b50601954610327906001600160a01b031681565b6040516001600160a01b0390911681526020016102af565b34801561034b57600080fd5b506009546102f9565b34801561036057600080fd5b506102f960135481565b34801561037657600080fd5b506102d86103853660046128f8565b610910565b34801561039657600080fd5b506102f96103a5366004612939565b610979565b3480156103b657600080fd5b506103ca6103c5366004612952565b610a02565b005b3480156103d857600080fd5b50600e5460405160ff90911681526020016102af565b3480156103fa57600080fd5b506103ca610409366004612952565b610a4e565b34801561041a57600080fd5b506102d86104293660046128cc565b610c04565b34801561043a57600080fd5b506102f9600f5481565b34801561045057600080fd5b506103ca61045f366004612939565b610c3a565b34801561047057600080fd5b506102f960165481565b34801561048657600080fd5b506103ca610495366004612939565b610d24565b3480156104a657600080fd5b506103ca6104b5366004612952565b610e34565b3480156104c657600080fd5b506102f96104d5366004612984565b610e82565b3480156104e657600080fd5b50601a54610327906001600160a01b031681565b34801561050657600080fd5b50601a546102d890600160a81b900460ff1681565b34801561052757600080fd5b506103ca610536366004612952565b610f0f565b34801561054757600080fd5b506102d8610556366004612952565b6001600160a01b031660009081526006602052604090205460ff1690565b34801561058057600080fd5b506103ca61058f366004612952565b611062565b3480156105a057600080fd5b506102f960115481565b3480156105b657600080fd5b506102f96105c5366004612952565b6110ae565b3480156105d657600080fd5b506103ca61110d565b3480156105eb57600080fd5b50601554610327906001600160a01b031681565b34801561060b57600080fd5b50601854610327906001600160a01b031681565b34801561062b57600080fd5b506102f9601c5481565b34801561064157600080fd5b506102d8610650366004612952565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561067a57600080fd5b506000546001600160a01b0316610327565b34801561069857600080fd5b506102a261116f565b3480156106ad57600080fd5b506103ca6106bc366004612939565b61117e565b3480156106cd57600080fd5b506102d86106dc3660046128cc565b61126e565b3480156106ed57600080fd5b506103ca6112bd565b34801561070257600080fd5b506102d86107113660046128cc565b6113c3565b34801561072257600080fd5b506002546102f9565b34801561073757600080fd5b506103ca6107463660046129b0565b6113d0565b34801561075757600080fd5b506102f9601b5481565b34801561076d57600080fd5b506103ca61077c3660046129cb565b611452565b34801561078d57600080fd5b506103ca61079c366004612939565b611490565b3480156107ad57600080fd5b506102f96107bc3660046129fd565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b3480156107f357600080fd5b506103ca610802366004612952565b611515565b34801561081357600080fd5b506103ca610822366004612939565b611560565b34801561083357600080fd5b506103ca610842366004612939565b6115e7565b34801561085357600080fd5b506103ca610862366004612952565b611616565b6060600c805461087690612a36565b80601f01602080910402602001604051908101604052809291908181526020018280546108a290612a36565b80156108ef5780601f106108c4576101008083540402835291602001916108ef565b820191906000526020600020905b8154815290600101906020018083116108d257829003601f168201915b5050505050905090565b60006109063384846116ee565b5060015b92915050565b600061091d84848461180a565b61096f843361096a85604051806060016040528060288152602001612c2d602891396001600160a01b038a166000908152600560209081526040808320338452909152902054919061194f565b6116ee565b5060019392505050565b6000600a548211156109e55760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b60648201526084015b60405180910390fd5b60006109ef611989565b90506109fb83826119ac565b9392505050565b6000546001600160a01b03163314610a2c5760405162461bcd60e51b81526004016109dc90612a70565b601880546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610a785760405162461bcd60e51b81526004016109dc90612a70565b6001600160a01b03811660009081526007602052604090205460ff16610ae05760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c75646564000000000060448201526064016109dc565b60005b600854811015610c0057816001600160a01b031660088281548110610b0a57610b0a612aa5565b6000918252602090912001546001600160a01b031603610bee5760088054610b3490600190612ad1565b81548110610b4457610b44612aa5565b600091825260209091200154600880546001600160a01b039092169183908110610b7057610b70612aa5565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600482526040808220829055600790925220805460ff191690556008805480610bc857610bc8612ae8565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610bf881612afe565b915050610ae3565b5050565b3360008181526005602090815260408083206001600160a01b0387168452909152812054909161090691859061096a90866119ee565b3360008181526007602052604090205460ff1615610caf5760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b60648201526084016109dc565b6000610cba83611a4d565b505050506001600160a01b038416600090815260036020526040902054919250610ce691905082611a9c565b6001600160a01b038316600090815260036020526040902055600a54610d0c9082611a9c565b600a55600b54610d1c90846119ee565b600b55505050565b6000546001600160a01b03163314610d4e5760405162461bcd60e51b81526004016109dc90612a70565b6000610d58611989565b90506000610d668383611ade565b905082610d72336110ae565b1015610db25760405162461bcd60e51b815260206004820152600f60248201526e0c2dadeeadce840e8dede40d0d2ced608b1b60448201526064016109dc565b3360009081526003602052604081208054839290610dd1908490612b17565b925050819055508260096000828254610dea9190612ad1565b9250508190555080600a6000828254610e039190612ad1565b90915550506040518381526000903390600080516020612c75833981519152906020015b60405180910390a3505050565b6000546001600160a01b03163314610e5e5760405162461bcd60e51b81526004016109dc90612a70565b6001600160a01b03166000908152600660205260409020805460ff19166001179055565b6000600954831115610ed65760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c790060448201526064016109dc565b81610ef5576000610ee684611a4d565b5093955061090a945050505050565b6000610f0084611a4d565b5092955061090a945050505050565b6000546001600160a01b03163314610f395760405162461bcd60e51b81526004016109dc90612a70565b6001600160a01b03811660009081526007602052604090205460ff1615610fa25760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c75646564000000000060448201526064016109dc565b6001600160a01b03811660009081526003602052604090205415610ffc576001600160a01b038116600090815260036020526040902054610fe290610979565b6001600160a01b0382166000908152600460205260409020555b6001600160a01b03166000818152600760205260408120805460ff191660019081179091556008805491820181559091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319169091179055565b6000546001600160a01b0316331461108c5760405162461bcd60e51b81526004016109dc90612a70565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526007602052604081205460ff16156110eb57506001600160a01b031660009081526004602052604090205490565b6001600160a01b03821660009081526003602052604090205461090a90610979565b6000546001600160a01b031633146111375760405162461bcd60e51b81526004016109dc90612a70565b600080546040516001600160a01b0390911690600080516020612c55833981519152908390a3600080546001600160a01b0319169055565b6060600d805461087690612a36565b6000546001600160a01b031633146111a85760405162461bcd60e51b81526004016109dc90612a70565b60006111b2611989565b905060006111c08383611ade565b905080600360006111d96000546001600160a01b031690565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008282546112089190612b17565b9250508190555082600960008282546112219190612b17565b9250508190555080600a600082825461123a9190612b17565b9091555050600080546040518581526001600160a01b039091169190600080516020612c7583398151915290602001610e27565b6000610906338461096a85604051806060016040528060258152602001612c95602591393360009081526005602090815260408083206001600160a01b038d168452909152902054919061194f565b6001546001600160a01b031633146113235760405162461bcd60e51b815260206004820152602360248201527f596f7520646f6e27742068617665207065726d697373696f6e20746f20756e6c6044820152626f636b60e81b60648201526084016109dc565b60025442116113745760405162461bcd60e51b815260206004820152601f60248201527f436f6e7472616374206973206c6f636b656420756e74696c203720646179730060448201526064016109dc565b600154600080546040516001600160a01b039384169390911691600080516020612c5583398151915291a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b600061090633848461180a565b6000546001600160a01b031633146113fa5760405162461bcd60e51b81526004016109dc90612a70565b601a8054821515600160a81b0260ff60a81b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599061144790831515815260200190565b60405180910390a150565b6000546001600160a01b0316331461147c5760405162461bcd60e51b81526004016109dc90612a70565b600f93909355601191909155601655601355565b6000546001600160a01b031633146114ba5760405162461bcd60e51b81526004016109dc90612a70565b60008054600180546001600160a01b03199081166001600160a01b038416179091551690556114e98142612b17565b600255600080546040516001600160a01b0390911690600080516020612c55833981519152908390a350565b6000546001600160a01b0316331461153f5760405162461bcd60e51b81526004016109dc90612a70565b6001600160a01b03166000908152600660205260409020805460ff19169055565b6000546001600160a01b0316331461158a5760405162461bcd60e51b81526004016109dc90612a70565b601c8190556115a461019061159e60095490565b906119ac565b601c54116115e45760405162461bcd60e51b815260206004820152600d60248201526c76616c756520746f6f206c6f7760981b60448201526064016109dc565b50565b6000546001600160a01b031633146116115760405162461bcd60e51b81526004016109dc90612a70565b601b55565b6000546001600160a01b031633146116405760405162461bcd60e51b81526004016109dc90612a70565b6001600160a01b0381166116a55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109dc565b600080546040516001600160a01b0380851693921691600080516020612c5583398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166117505760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016109dc565b6001600160a01b0382166117b15760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016109dc565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259101610e27565b6001600160a01b03831661186e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016109dc565b600081116118d05760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b60648201526084016109dc565b60006118db306110ae565b601b54909150811080159081906118fc5750601a54600160a01b900460ff16155b80156119155750601a546001600160a01b038581169116145b801561192a5750601a54600160a81b900460ff165b1561193d57601b54915061193d82611b60565b611948858585611c07565b5050505050565b600081848411156119735760405162461bcd60e51b81526004016109dc9190612862565b5060006119808486612ad1565b95945050505050565b6000806000611996611e75565b90925090506119a582826119ac565b9250505090565b60006109fb83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611ff7565b6000806119fb8385612b17565b9050838110156109fb5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016109dc565b6000806000806000806000806000611a648a612025565b9250925092506000806000611a828d8686611a7d611989565b612067565b919f909e50909c50959a5093985091965092945050505050565b60006109fb83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061194f565b600082600003611af05750600061090a565b6000611afc8385612b2f565b905082611b098583612b4e565b146109fb5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016109dc565b601a805460ff60a01b1916600160a01b1790556000611b808260026119ac565b90506000611b8e8383611a9c565b905047611b9a836120b7565b6000611ba64783611a9c565b9050611bb28382612211565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050601a805460ff60a01b19169055505050565b6001600160a01b03831660009081526006602052604090205460ff1680611c4657506001600160a01b03821660009081526006602052604090205460ff165b15611c5857611c536122df565b611cbb565b601c54811115611cbb5760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b60648201526084016109dc565b6001600160a01b03831660009081526007602052604090205460ff168015611cfc57506001600160a01b03821660009081526007602052604090205460ff16155b15611d1157611d0c83838361233a565b611e0f565b6001600160a01b03831660009081526007602052604090205460ff16158015611d5257506001600160a01b03821660009081526007602052604090205460ff165b15611d6257611d0c83838361244e565b6001600160a01b03831660009081526007602052604090205460ff16158015611da457506001600160a01b03821660009081526007602052604090205460ff16155b15611db457611d0c8383836124f7565b6001600160a01b03831660009081526007602052604090205460ff168015611df457506001600160a01b03821660009081526007602052604090205460ff165b15611e0457611d0c83838361255a565b611e0f8383836124f7565b6001600160a01b03831660009081526006602052604090205460ff1680611e4e57506001600160a01b03821660009081526006602052604090205460ff165b15611e7057611e70601054600f55601254601155601454601355601754601655565b505050565b600a546009546000918291825b600854811015611fc757826003600060088481548110611ea457611ea4612aa5565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180611f0f5750816004600060088481548110611ee857611ee8612aa5565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15611f2557600a54600954945094505050509091565b611f6b6003600060088481548110611f3f57611f3f612aa5565b60009182526020808320909101546001600160a01b031683528201929092526040019020548490611a9c565b9250611fb36004600060088481548110611f8757611f87612aa5565b60009182526020808320909101546001600160a01b031683528201929092526040019020548390611a9c565b915080611fbf81612afe565b915050611e82565b50600954600a54611fd7916119ac565b821015611fee57600a546009549350935050509091565b90939092509050565b600081836120185760405162461bcd60e51b81526004016109dc9190612862565b5060006119808486612b4e565b600080600080612034856125cd565b90506000612041866125ea565b90506000612059826120538986611a9c565b90611a9c565b979296509094509092505050565b60008080806120768886611ade565b905060006120848887611ade565b905060006120928888611ade565b905060006120a4826120538686611a9c565b939b939a50919850919650505050505050565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106120ec576120ec612aa5565b6001600160a01b03928316602091820292909201810191909152601954604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612145573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121699190612b70565b8160018151811061217c5761217c612aa5565b6001600160a01b0392831660209182029290920101526019546121a291309116846116ee565b60195460405163791ac94760e01b81526001600160a01b039091169063791ac947906121db908590600090869030904290600401612b8d565b600060405180830381600087803b1580156121f557600080fd5b505af1158015612209573d6000803e3d6000fd5b505050505050565b6019546122299030906001600160a01b0316846116ee565b6019546001600160a01b031663f305d7198230856000806122526000546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af11580156122ba573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906119489190612bfe565b600f541580156122ef5750601154155b80156122fb5750601354155b80156123075750601654155b1561230e57565b600f80546010556011805460125560138054601455601680546017556000938490559183905582905555565b60008060008060008061234c87611a4d565b6001600160a01b038f16600090815260046020526040902054959b5093995091975095509350915061237e9088611a9c565b6001600160a01b038a166000908152600460209081526040808320939093556003905220546123ad9087611a9c565b6001600160a01b03808b1660009081526003602052604080822093909355908a16815220546123dc90866119ee565b6001600160a01b0389166000908152600360205260409020556123fe81612607565b612408848361268f565b876001600160a01b0316896001600160a01b0316600080516020612c758339815191528560405161243b91815260200190565b60405180910390a3505050505050505050565b60008060008060008061246087611a4d565b6001600160a01b038f16600090815260036020526040902054959b509399509197509550935091506124929087611a9c565b6001600160a01b03808b16600090815260036020908152604080832094909455918b168152600490915220546124c890846119ee565b6001600160a01b0389166000908152600460209081526040808320939093556003905220546123dc90866119ee565b60008060008060008061250987611a4d565b9550955095509550955095506125218984878a6126b3565b955092506125318984878a61279c565b6001600160a01b038b166000908152600360205260409020549096509093506123ad9087611a9c565b60008060008060008061256c87611a4d565b6001600160a01b038f16600090815260046020526040902054959b5093995091975095509350915061259e9088611a9c565b6001600160a01b038a166000908152600460209081526040808320939093556003905220546124929087611a9c565b600061090a61271061159e600f5485611ade90919063ffffffff16565b600061090a61271061159e60115485611ade90919063ffffffff16565b6000612611611989565b9050600061261f8383611ade565b3060009081526003602052604090205490915061263c90826119ee565b3060009081526003602090815260408083209390935560079052205460ff1615611e70573060009081526004602052604090205461267a90846119ee565b30600090815260046020526040902055505050565b600a5461269c9083611a9c565b600a55600b546126ac90826119ee565b600b555050565b6000806013546000036126ca575083905082612793565b6013546000906126e6906126e0866127106119ac565b90611ade565b905060006126fc6126f5611989565b8390611ade565b90506127088682611a9c565b95506127148783611a9c565b6015546001600160a01b031660009081526003602052604090205490975061273c90826119ee565b601580546001600160a01b03908116600090815260036020908152604091829020949094559154915185815291811692908b1691600080516020612c7583398151915291015b60405180910390a386869350935050505b94509492505050565b6000806016546000036127b3575083905082612793565b6016546000906127c9906126e0866127106119ac565b905060006127d86126f5611989565b90506127e48682611a9c565b95506127f08783611a9c565b6018546001600160a01b031660009081526003602052604090205490975061281890826119ee565b601880546001600160a01b03908116600090815260036020908152604091829020949094559154915185815291811692908b1691600080516020612c758339815191529101612782565b600060208083528351808285015260005b8181101561288f57858101830151858201604001528201612873565b818111156128a1576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b03811681146115e457600080fd5b600080604083850312156128df57600080fd5b82356128ea816128b7565b946020939093013593505050565b60008060006060848603121561290d57600080fd5b8335612918816128b7565b92506020840135612928816128b7565b929592945050506040919091013590565b60006020828403121561294b57600080fd5b5035919050565b60006020828403121561296457600080fd5b81356109fb816128b7565b8035801515811461297f57600080fd5b919050565b6000806040838503121561299757600080fd5b823591506129a76020840161296f565b90509250929050565b6000602082840312156129c257600080fd5b6109fb8261296f565b600080600080608085870312156129e157600080fd5b5050823594602084013594506040840135936060013592509050565b60008060408385031215612a1057600080fd5b8235612a1b816128b7565b91506020830135612a2b816128b7565b809150509250929050565b600181811c90821680612a4a57607f821691505b602082108103612a6a57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082821015612ae357612ae3612abb565b500390565b634e487b7160e01b600052603160045260246000fd5b600060018201612b1057612b10612abb565b5060010190565b60008219821115612b2a57612b2a612abb565b500190565b6000816000190483118215151615612b4957612b49612abb565b500290565b600082612b6b57634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215612b8257600080fd5b81516109fb816128b7565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612bdd5784516001600160a01b031683529383019391830191600101612bb8565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215612c1357600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63658be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122028f3a76e085cf60dab4c1d18b1cb68fa38d6cf105887bc6c313d2ae7d0b1d47664736f6c634300080e0033
Deployed Bytecode
0x6080604052600436106102815760003560e01c80636bc87c3a1161014f578063a69df4b5116100c1578063dd4670641161007a578063dd46706414610781578063dd62ed3e146107a1578063ea2f0b37146107e7578063ec28438a14610807578063f0f165af14610827578063f2fde38b1461084757600080fd5b8063a69df4b5146106e1578063a9059cbb146106f6578063b6c5232414610716578063c49b9a801461072b578063d12a76881461074b578063d38ab97d1461076157600080fd5b80637d1db4a5116101135780637d1db4a51461061f57806388f82020146106355780638da5cb5b1461066e57806395d89b411461068c578063a0712d68146106a1578063a457c2d7146106c157600080fd5b80636bc87c3a1461059457806370a08231146105aa578063715018a6146105ca57806375f0a874146105df5780637b208769146105ff57600080fd5b806339509351116101f35780634549b039116101ac5780634549b039146104ba57806349bd5a5e146104da5780634a74bb02146104fa57806352390c021461051b5780635342acb41461053b5780635d098b381461057457600080fd5b8063395093511461040e5780633b124fe71461042e5780633bd5d1731461044457806340f8007a1461046457806342966c681461047a578063437823ec1461049a57600080fd5b806322976e0d1161024557806322976e0d1461035457806323b872dd1461036a5780632d8381191461038a57806330563bd7146103aa578063313ce567146103cc5780633685d419146103ee57600080fd5b806306fdde031461028d578063095ea7b3146102b857806313114a9d146102e85780631694505e1461030757806318160ddd1461033f57600080fd5b3661028857005b600080fd5b34801561029957600080fd5b506102a2610867565b6040516102af9190612862565b60405180910390f35b3480156102c457600080fd5b506102d86102d33660046128cc565b6108f9565b60405190151581526020016102af565b3480156102f457600080fd5b50600b545b6040519081526020016102af565b34801561031357600080fd5b50601954610327906001600160a01b031681565b6040516001600160a01b0390911681526020016102af565b34801561034b57600080fd5b506009546102f9565b34801561036057600080fd5b506102f960135481565b34801561037657600080fd5b506102d86103853660046128f8565b610910565b34801561039657600080fd5b506102f96103a5366004612939565b610979565b3480156103b657600080fd5b506103ca6103c5366004612952565b610a02565b005b3480156103d857600080fd5b50600e5460405160ff90911681526020016102af565b3480156103fa57600080fd5b506103ca610409366004612952565b610a4e565b34801561041a57600080fd5b506102d86104293660046128cc565b610c04565b34801561043a57600080fd5b506102f9600f5481565b34801561045057600080fd5b506103ca61045f366004612939565b610c3a565b34801561047057600080fd5b506102f960165481565b34801561048657600080fd5b506103ca610495366004612939565b610d24565b3480156104a657600080fd5b506103ca6104b5366004612952565b610e34565b3480156104c657600080fd5b506102f96104d5366004612984565b610e82565b3480156104e657600080fd5b50601a54610327906001600160a01b031681565b34801561050657600080fd5b50601a546102d890600160a81b900460ff1681565b34801561052757600080fd5b506103ca610536366004612952565b610f0f565b34801561054757600080fd5b506102d8610556366004612952565b6001600160a01b031660009081526006602052604090205460ff1690565b34801561058057600080fd5b506103ca61058f366004612952565b611062565b3480156105a057600080fd5b506102f960115481565b3480156105b657600080fd5b506102f96105c5366004612952565b6110ae565b3480156105d657600080fd5b506103ca61110d565b3480156105eb57600080fd5b50601554610327906001600160a01b031681565b34801561060b57600080fd5b50601854610327906001600160a01b031681565b34801561062b57600080fd5b506102f9601c5481565b34801561064157600080fd5b506102d8610650366004612952565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561067a57600080fd5b506000546001600160a01b0316610327565b34801561069857600080fd5b506102a261116f565b3480156106ad57600080fd5b506103ca6106bc366004612939565b61117e565b3480156106cd57600080fd5b506102d86106dc3660046128cc565b61126e565b3480156106ed57600080fd5b506103ca6112bd565b34801561070257600080fd5b506102d86107113660046128cc565b6113c3565b34801561072257600080fd5b506002546102f9565b34801561073757600080fd5b506103ca6107463660046129b0565b6113d0565b34801561075757600080fd5b506102f9601b5481565b34801561076d57600080fd5b506103ca61077c3660046129cb565b611452565b34801561078d57600080fd5b506103ca61079c366004612939565b611490565b3480156107ad57600080fd5b506102f96107bc3660046129fd565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b3480156107f357600080fd5b506103ca610802366004612952565b611515565b34801561081357600080fd5b506103ca610822366004612939565b611560565b34801561083357600080fd5b506103ca610842366004612939565b6115e7565b34801561085357600080fd5b506103ca610862366004612952565b611616565b6060600c805461087690612a36565b80601f01602080910402602001604051908101604052809291908181526020018280546108a290612a36565b80156108ef5780601f106108c4576101008083540402835291602001916108ef565b820191906000526020600020905b8154815290600101906020018083116108d257829003601f168201915b5050505050905090565b60006109063384846116ee565b5060015b92915050565b600061091d84848461180a565b61096f843361096a85604051806060016040528060288152602001612c2d602891396001600160a01b038a166000908152600560209081526040808320338452909152902054919061194f565b6116ee565b5060019392505050565b6000600a548211156109e55760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b60648201526084015b60405180910390fd5b60006109ef611989565b90506109fb83826119ac565b9392505050565b6000546001600160a01b03163314610a2c5760405162461bcd60e51b81526004016109dc90612a70565b601880546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610a785760405162461bcd60e51b81526004016109dc90612a70565b6001600160a01b03811660009081526007602052604090205460ff16610ae05760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c75646564000000000060448201526064016109dc565b60005b600854811015610c0057816001600160a01b031660088281548110610b0a57610b0a612aa5565b6000918252602090912001546001600160a01b031603610bee5760088054610b3490600190612ad1565b81548110610b4457610b44612aa5565b600091825260209091200154600880546001600160a01b039092169183908110610b7057610b70612aa5565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600482526040808220829055600790925220805460ff191690556008805480610bc857610bc8612ae8565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610bf881612afe565b915050610ae3565b5050565b3360008181526005602090815260408083206001600160a01b0387168452909152812054909161090691859061096a90866119ee565b3360008181526007602052604090205460ff1615610caf5760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b60648201526084016109dc565b6000610cba83611a4d565b505050506001600160a01b038416600090815260036020526040902054919250610ce691905082611a9c565b6001600160a01b038316600090815260036020526040902055600a54610d0c9082611a9c565b600a55600b54610d1c90846119ee565b600b55505050565b6000546001600160a01b03163314610d4e5760405162461bcd60e51b81526004016109dc90612a70565b6000610d58611989565b90506000610d668383611ade565b905082610d72336110ae565b1015610db25760405162461bcd60e51b815260206004820152600f60248201526e0c2dadeeadce840e8dede40d0d2ced608b1b60448201526064016109dc565b3360009081526003602052604081208054839290610dd1908490612b17565b925050819055508260096000828254610dea9190612ad1565b9250508190555080600a6000828254610e039190612ad1565b90915550506040518381526000903390600080516020612c75833981519152906020015b60405180910390a3505050565b6000546001600160a01b03163314610e5e5760405162461bcd60e51b81526004016109dc90612a70565b6001600160a01b03166000908152600660205260409020805460ff19166001179055565b6000600954831115610ed65760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c790060448201526064016109dc565b81610ef5576000610ee684611a4d565b5093955061090a945050505050565b6000610f0084611a4d565b5092955061090a945050505050565b6000546001600160a01b03163314610f395760405162461bcd60e51b81526004016109dc90612a70565b6001600160a01b03811660009081526007602052604090205460ff1615610fa25760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c75646564000000000060448201526064016109dc565b6001600160a01b03811660009081526003602052604090205415610ffc576001600160a01b038116600090815260036020526040902054610fe290610979565b6001600160a01b0382166000908152600460205260409020555b6001600160a01b03166000818152600760205260408120805460ff191660019081179091556008805491820181559091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319169091179055565b6000546001600160a01b0316331461108c5760405162461bcd60e51b81526004016109dc90612a70565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526007602052604081205460ff16156110eb57506001600160a01b031660009081526004602052604090205490565b6001600160a01b03821660009081526003602052604090205461090a90610979565b6000546001600160a01b031633146111375760405162461bcd60e51b81526004016109dc90612a70565b600080546040516001600160a01b0390911690600080516020612c55833981519152908390a3600080546001600160a01b0319169055565b6060600d805461087690612a36565b6000546001600160a01b031633146111a85760405162461bcd60e51b81526004016109dc90612a70565b60006111b2611989565b905060006111c08383611ade565b905080600360006111d96000546001600160a01b031690565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008282546112089190612b17565b9250508190555082600960008282546112219190612b17565b9250508190555080600a600082825461123a9190612b17565b9091555050600080546040518581526001600160a01b039091169190600080516020612c7583398151915290602001610e27565b6000610906338461096a85604051806060016040528060258152602001612c95602591393360009081526005602090815260408083206001600160a01b038d168452909152902054919061194f565b6001546001600160a01b031633146113235760405162461bcd60e51b815260206004820152602360248201527f596f7520646f6e27742068617665207065726d697373696f6e20746f20756e6c6044820152626f636b60e81b60648201526084016109dc565b60025442116113745760405162461bcd60e51b815260206004820152601f60248201527f436f6e7472616374206973206c6f636b656420756e74696c203720646179730060448201526064016109dc565b600154600080546040516001600160a01b039384169390911691600080516020612c5583398151915291a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b600061090633848461180a565b6000546001600160a01b031633146113fa5760405162461bcd60e51b81526004016109dc90612a70565b601a8054821515600160a81b0260ff60a81b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599061144790831515815260200190565b60405180910390a150565b6000546001600160a01b0316331461147c5760405162461bcd60e51b81526004016109dc90612a70565b600f93909355601191909155601655601355565b6000546001600160a01b031633146114ba5760405162461bcd60e51b81526004016109dc90612a70565b60008054600180546001600160a01b03199081166001600160a01b038416179091551690556114e98142612b17565b600255600080546040516001600160a01b0390911690600080516020612c55833981519152908390a350565b6000546001600160a01b0316331461153f5760405162461bcd60e51b81526004016109dc90612a70565b6001600160a01b03166000908152600660205260409020805460ff19169055565b6000546001600160a01b0316331461158a5760405162461bcd60e51b81526004016109dc90612a70565b601c8190556115a461019061159e60095490565b906119ac565b601c54116115e45760405162461bcd60e51b815260206004820152600d60248201526c76616c756520746f6f206c6f7760981b60448201526064016109dc565b50565b6000546001600160a01b031633146116115760405162461bcd60e51b81526004016109dc90612a70565b601b55565b6000546001600160a01b031633146116405760405162461bcd60e51b81526004016109dc90612a70565b6001600160a01b0381166116a55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109dc565b600080546040516001600160a01b0380851693921691600080516020612c5583398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166117505760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016109dc565b6001600160a01b0382166117b15760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016109dc565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259101610e27565b6001600160a01b03831661186e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016109dc565b600081116118d05760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b60648201526084016109dc565b60006118db306110ae565b601b54909150811080159081906118fc5750601a54600160a01b900460ff16155b80156119155750601a546001600160a01b038581169116145b801561192a5750601a54600160a81b900460ff165b1561193d57601b54915061193d82611b60565b611948858585611c07565b5050505050565b600081848411156119735760405162461bcd60e51b81526004016109dc9190612862565b5060006119808486612ad1565b95945050505050565b6000806000611996611e75565b90925090506119a582826119ac565b9250505090565b60006109fb83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611ff7565b6000806119fb8385612b17565b9050838110156109fb5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016109dc565b6000806000806000806000806000611a648a612025565b9250925092506000806000611a828d8686611a7d611989565b612067565b919f909e50909c50959a5093985091965092945050505050565b60006109fb83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061194f565b600082600003611af05750600061090a565b6000611afc8385612b2f565b905082611b098583612b4e565b146109fb5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016109dc565b601a805460ff60a01b1916600160a01b1790556000611b808260026119ac565b90506000611b8e8383611a9c565b905047611b9a836120b7565b6000611ba64783611a9c565b9050611bb28382612211565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050601a805460ff60a01b19169055505050565b6001600160a01b03831660009081526006602052604090205460ff1680611c4657506001600160a01b03821660009081526006602052604090205460ff165b15611c5857611c536122df565b611cbb565b601c54811115611cbb5760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b60648201526084016109dc565b6001600160a01b03831660009081526007602052604090205460ff168015611cfc57506001600160a01b03821660009081526007602052604090205460ff16155b15611d1157611d0c83838361233a565b611e0f565b6001600160a01b03831660009081526007602052604090205460ff16158015611d5257506001600160a01b03821660009081526007602052604090205460ff165b15611d6257611d0c83838361244e565b6001600160a01b03831660009081526007602052604090205460ff16158015611da457506001600160a01b03821660009081526007602052604090205460ff16155b15611db457611d0c8383836124f7565b6001600160a01b03831660009081526007602052604090205460ff168015611df457506001600160a01b03821660009081526007602052604090205460ff165b15611e0457611d0c83838361255a565b611e0f8383836124f7565b6001600160a01b03831660009081526006602052604090205460ff1680611e4e57506001600160a01b03821660009081526006602052604090205460ff165b15611e7057611e70601054600f55601254601155601454601355601754601655565b505050565b600a546009546000918291825b600854811015611fc757826003600060088481548110611ea457611ea4612aa5565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180611f0f5750816004600060088481548110611ee857611ee8612aa5565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15611f2557600a54600954945094505050509091565b611f6b6003600060088481548110611f3f57611f3f612aa5565b60009182526020808320909101546001600160a01b031683528201929092526040019020548490611a9c565b9250611fb36004600060088481548110611f8757611f87612aa5565b60009182526020808320909101546001600160a01b031683528201929092526040019020548390611a9c565b915080611fbf81612afe565b915050611e82565b50600954600a54611fd7916119ac565b821015611fee57600a546009549350935050509091565b90939092509050565b600081836120185760405162461bcd60e51b81526004016109dc9190612862565b5060006119808486612b4e565b600080600080612034856125cd565b90506000612041866125ea565b90506000612059826120538986611a9c565b90611a9c565b979296509094509092505050565b60008080806120768886611ade565b905060006120848887611ade565b905060006120928888611ade565b905060006120a4826120538686611a9c565b939b939a50919850919650505050505050565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106120ec576120ec612aa5565b6001600160a01b03928316602091820292909201810191909152601954604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612145573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121699190612b70565b8160018151811061217c5761217c612aa5565b6001600160a01b0392831660209182029290920101526019546121a291309116846116ee565b60195460405163791ac94760e01b81526001600160a01b039091169063791ac947906121db908590600090869030904290600401612b8d565b600060405180830381600087803b1580156121f557600080fd5b505af1158015612209573d6000803e3d6000fd5b505050505050565b6019546122299030906001600160a01b0316846116ee565b6019546001600160a01b031663f305d7198230856000806122526000546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af11580156122ba573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906119489190612bfe565b600f541580156122ef5750601154155b80156122fb5750601354155b80156123075750601654155b1561230e57565b600f80546010556011805460125560138054601455601680546017556000938490559183905582905555565b60008060008060008061234c87611a4d565b6001600160a01b038f16600090815260046020526040902054959b5093995091975095509350915061237e9088611a9c565b6001600160a01b038a166000908152600460209081526040808320939093556003905220546123ad9087611a9c565b6001600160a01b03808b1660009081526003602052604080822093909355908a16815220546123dc90866119ee565b6001600160a01b0389166000908152600360205260409020556123fe81612607565b612408848361268f565b876001600160a01b0316896001600160a01b0316600080516020612c758339815191528560405161243b91815260200190565b60405180910390a3505050505050505050565b60008060008060008061246087611a4d565b6001600160a01b038f16600090815260036020526040902054959b509399509197509550935091506124929087611a9c565b6001600160a01b03808b16600090815260036020908152604080832094909455918b168152600490915220546124c890846119ee565b6001600160a01b0389166000908152600460209081526040808320939093556003905220546123dc90866119ee565b60008060008060008061250987611a4d565b9550955095509550955095506125218984878a6126b3565b955092506125318984878a61279c565b6001600160a01b038b166000908152600360205260409020549096509093506123ad9087611a9c565b60008060008060008061256c87611a4d565b6001600160a01b038f16600090815260046020526040902054959b5093995091975095509350915061259e9088611a9c565b6001600160a01b038a166000908152600460209081526040808320939093556003905220546124929087611a9c565b600061090a61271061159e600f5485611ade90919063ffffffff16565b600061090a61271061159e60115485611ade90919063ffffffff16565b6000612611611989565b9050600061261f8383611ade565b3060009081526003602052604090205490915061263c90826119ee565b3060009081526003602090815260408083209390935560079052205460ff1615611e70573060009081526004602052604090205461267a90846119ee565b30600090815260046020526040902055505050565b600a5461269c9083611a9c565b600a55600b546126ac90826119ee565b600b555050565b6000806013546000036126ca575083905082612793565b6013546000906126e6906126e0866127106119ac565b90611ade565b905060006126fc6126f5611989565b8390611ade565b90506127088682611a9c565b95506127148783611a9c565b6015546001600160a01b031660009081526003602052604090205490975061273c90826119ee565b601580546001600160a01b03908116600090815260036020908152604091829020949094559154915185815291811692908b1691600080516020612c7583398151915291015b60405180910390a386869350935050505b94509492505050565b6000806016546000036127b3575083905082612793565b6016546000906127c9906126e0866127106119ac565b905060006127d86126f5611989565b90506127e48682611a9c565b95506127f08783611a9c565b6018546001600160a01b031660009081526003602052604090205490975061281890826119ee565b601880546001600160a01b03908116600090815260036020908152604091829020949094559154915185815291811692908b1691600080516020612c758339815191529101612782565b600060208083528351808285015260005b8181101561288f57858101830151858201604001528201612873565b818111156128a1576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b03811681146115e457600080fd5b600080604083850312156128df57600080fd5b82356128ea816128b7565b946020939093013593505050565b60008060006060848603121561290d57600080fd5b8335612918816128b7565b92506020840135612928816128b7565b929592945050506040919091013590565b60006020828403121561294b57600080fd5b5035919050565b60006020828403121561296457600080fd5b81356109fb816128b7565b8035801515811461297f57600080fd5b919050565b6000806040838503121561299757600080fd5b823591506129a76020840161296f565b90509250929050565b6000602082840312156129c257600080fd5b6109fb8261296f565b600080600080608085870312156129e157600080fd5b5050823594602084013594506040840135936060013592509050565b60008060408385031215612a1057600080fd5b8235612a1b816128b7565b91506020830135612a2b816128b7565b809150509250929050565b600181811c90821680612a4a57607f821691505b602082108103612a6a57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082821015612ae357612ae3612abb565b500390565b634e487b7160e01b600052603160045260246000fd5b600060018201612b1057612b10612abb565b5060010190565b60008219821115612b2a57612b2a612abb565b500190565b6000816000190483118215151615612b4957612b49612abb565b500290565b600082612b6b57634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215612b8257600080fd5b81516109fb816128b7565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612bdd5784516001600160a01b031683529383019391830191600101612bb8565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215612c1357600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63658be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122028f3a76e085cf60dab4c1d18b1cb68fa38d6cf105887bc6c313d2ae7d0b1d47664736f6c634300080e0033
Deployed Bytecode Sourcemap
25599:21233:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28440:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29352:161;;;;;;;;;;-1:-1:-1;29352:161:0;;;;;:::i;:::-;;:::i;:::-;;;1237:14:1;;1230:22;1212:41;;1200:2;1185:18;29352:161:0;1072:187:1;30473:87:0;;;;;;;;;;-1:-1:-1;30542:10:0;;30473:87;;;1410:25:1;;;1398:2;1383:18;30473:87:0;1264:177:1;26947:42:0;;;;;;;;;;-1:-1:-1;26947:42:0;;;;-1:-1:-1;;;;;26947:42:0;;;;;;-1:-1:-1;;;;;1637:32:1;;;1619:51;;1607:2;1592:18;26947:42:0;1446:230:1;28717:95:0;;;;;;;;;;-1:-1:-1;28797:7:0;;28717:95;;26567:33;;;;;;;;;;;;;;;;29521:313;;;;;;;;;;-1:-1:-1;29521:313:0;;;;;:::i;:::-;;:::i;31397:253::-;;;;;;;;;;-1:-1:-1;31397:253:0;;;;;:::i;:::-;;:::i;45894:111::-;;;;;;;;;;-1:-1:-1;45894:111:0;;;;;:::i;:::-;;:::i;:::-;;28626:83;;;;;;;;;;-1:-1:-1;28692:9:0;;28626:83;;28692:9;;;;2721:36:1;;2709:2;2694:18;28626:83:0;2579:184:1;31999:479:0;;;;;;;;;;-1:-1:-1;31999:479:0;;;;;:::i;:::-;;:::i;29842:218::-;;;;;;;;;;-1:-1:-1;29842:218:0;;;;;:::i;:::-;;:::i;26360:27::-;;;;;;;;;;;;;;;;30568:377;;;;;;;;;;-1:-1:-1;30568:377:0;;;;;:::i;:::-;;:::i;26763:31::-;;;;;;;;;;;;;;;;45381:374;;;;;;;;;;-1:-1:-1;45381:374:0;;;;;:::i;:::-;;:::i;44840:111::-;;;;;;;;;;-1:-1:-1;44840:111:0;;;;;:::i;:::-;;:::i;30953:436::-;;;;;;;;;;-1:-1:-1;30953:436:0;;;;;:::i;:::-;;:::i;26996:29::-;;;;;;;;;;-1:-1:-1;26996:29:0;;;;-1:-1:-1;;;;;26996:29:0;;;27066:40;;;;;;;;;;-1:-1:-1;27066:40:0;;;;-1:-1:-1;;;27066:40:0;;;;;;31658:333;;;;;;;;;;-1:-1:-1;31658:333:0;;;;;:::i;:::-;;:::i;36665:123::-;;;;;;;;;;-1:-1:-1;36665:123:0;;;;;:::i;:::-;-1:-1:-1;;;;;36753:27:0;36729:4;36753:27;;;:18;:27;;;;;;;;;36665:123;45767:114;;;;;;;;;;-1:-1:-1;45767:114:0;;;;;:::i;:::-;;:::i;26457:33::-;;;;;;;;;;;;;;;;28820:198;;;;;;;;;;-1:-1:-1;28820:198:0;;;;;:::i;:::-;;:::i;2282:148::-;;;;;;;;;;;;;:::i;26675:75::-;;;;;;;;;;-1:-1:-1;26675:75:0;;;;-1:-1:-1;;;;;26675:75:0;;;26865:73;;;;;;;;;;-1:-1:-1;26865:73:0;;;;-1:-1:-1;;;;;26865:73:0;;;27183:47;;;;;;;;;;;;;;;;30345:120;;;;;;;;;;-1:-1:-1;30345:120:0;;;;;:::i;:::-;-1:-1:-1;;;;;30437:20:0;30413:4;30437:20;;;:11;:20;;;;;;;;;30345:120;1639:79;;;;;;;;;;-1:-1:-1;1677:7:0;1704:6;-1:-1:-1;;;;;1704:6:0;1639:79;;28531:87;;;;;;;;;;;;;:::i;45081:292::-;;;;;;;;;;-1:-1:-1;45081:292:0;;;;;:::i;:::-;;:::i;30068:269::-;;;;;;;;;;-1:-1:-1;30068:269:0;;;;;:::i;:::-;;:::i;3304:305::-;;;;;;;;;;;;;:::i;29026:167::-;;;;;;;;;;-1:-1:-1;29026:167:0;;;;;:::i;:::-;;:::i;2837:89::-;;;;;;;;;;-1:-1:-1;2909:9:0;;2837:89;;46652:171;;;;;;;;;;-1:-1:-1;46652:171:0;;;;;:::i;:::-;;:::i;27115:61::-;;;;;;;;;;;;;;;;46017:272;;;;;;;;;;-1:-1:-1;46017:272:0;;;;;:::i;:::-;;:::i;3002:226::-;;;;;;;;;;-1:-1:-1;3002:226:0;;;;;:::i;:::-;;:::i;29201:143::-;;;;;;;;;;-1:-1:-1;29201:143:0;;;;;:::i;:::-;-1:-1:-1;;;;;29309:18:0;;;29282:7;29309:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;29201:143;44963:110;;;;;;;;;;-1:-1:-1;44963:110:0;;;;;:::i;:::-;;:::i;46455:185::-;;;;;;;;;;-1:-1:-1;46455:185:0;;;;;:::i;:::-;;:::i;46301:142::-;;;;;;;;;;-1:-1:-1;46301:142:0;;;;;:::i;:::-;;:::i;2585:244::-;;;;;;;;;;-1:-1:-1;2585:244:0;;;;;:::i;:::-;;:::i;28440:83::-;28477:13;28510:5;28503:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28440:83;:::o;29352:161::-;29427:4;29444:39;305:10;29467:7;29476:6;29444:8;:39::i;:::-;-1:-1:-1;29501:4:0;29352:161;;;;;:::o;29521:313::-;29619:4;29636:36;29646:6;29654:9;29665:6;29636:9;:36::i;:::-;29683:121;29692:6;305:10;29714:89;29752:6;29714:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29714:19:0;;;;;;:11;:19;;;;;;;;305:10;29714:33;;;;;;;;;;:37;:89::i;:::-;29683:8;:121::i;:::-;-1:-1:-1;29822:4:0;29521:313;;;;;:::o;31397:253::-;31463:7;31502;;31491;:18;;31483:73;;;;-1:-1:-1;;;31483:73:0;;4949:2:1;31483:73:0;;;4931:21:1;4988:2;4968:18;;;4961:30;5027:34;5007:18;;;5000:62;-1:-1:-1;;;5078:18:1;;;5071:40;5128:19;;31483:73:0;;;;;;;;;31567:19;31590:10;:8;:10::i;:::-;31567:33;-1:-1:-1;31618:24:0;:7;31567:33;31618:11;:24::i;:::-;31611:31;31397:253;-1:-1:-1;;;31397:253:0:o;45894:111::-;1851:6;;-1:-1:-1;;;;;1851:6:0;305:10;1851:22;1843:67;;;;-1:-1:-1;;;1843:67:0;;;;;;;:::i;:::-;45971:13:::1;:25:::0;;-1:-1:-1;;;;;;45971:25:0::1;-1:-1:-1::0;;;;;45971:25:0;;;::::1;::::0;;;::::1;::::0;;45894:111::o;31999:479::-;1851:6;;-1:-1:-1;;;;;1851:6:0;305:10;1851:22;1843:67;;;;-1:-1:-1;;;1843:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32081:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;32073:60;;;::::0;-1:-1:-1;;;32073:60:0;;5721:2:1;32073:60:0::1;::::0;::::1;5703:21:1::0;5760:2;5740:18;;;5733:30;5799:29;5779:18;;;5772:57;5846:18;;32073:60:0::1;5519:351:1::0;32073:60:0::1;32149:9;32144:327;32168:9;:16:::0;32164:20;::::1;32144:327;;;32226:7;-1:-1:-1::0;;;;;32210:23:0::1;:9;32220:1;32210:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;32210:12:0::1;:23:::0;32206:254:::1;;32269:9;32279:16:::0;;:20:::1;::::0;32298:1:::1;::::0;32279:20:::1;:::i;:::-;32269:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;32254:9:::1;:12:::0;;-1:-1:-1;;;;;32269:31:0;;::::1;::::0;32264:1;;32254:12;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;;;;;32254:46:0::1;-1:-1:-1::0;;;;;32254:46:0;;::::1;;::::0;;32319:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;32358:11:::1;:20:::0;;;;:28;;-1:-1:-1;;32358:28:0::1;::::0;;32405:9:::1;:15:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;32405:15:0;;;;;-1:-1:-1;;;;;;32405:15:0::1;::::0;;;;;32144:327:::1;31999:479:::0;:::o;32206:254::-:1;32186:3:::0;::::1;::::0;::::1;:::i;:::-;;;;32144:327;;;;31999:479:::0;:::o;29842:218::-;305:10;29930:4;29979:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;29979:34:0;;;;;;;;;;29930:4;;29947:83;;29970:7;;29979:50;;30018:10;29979:38;:50::i;30568:377::-;305:10;30620:14;30669:19;;;:11;:19;;;;;;;;30668:20;30660:77;;;;-1:-1:-1;;;30660:77:0;;6743:2:1;30660:77:0;;;6725:21:1;6782:2;6762:18;;;6755:30;6821:34;6801:18;;;6794:62;-1:-1:-1;;;6872:18:1;;;6865:42;6924:19;;30660:77:0;6541:408:1;30660:77:0;30749:15;30773:19;30784:7;30773:10;:19::i;:::-;-1:-1:-1;;;;;;;;;30821:15:0;;;;;;:7;:15;;;;;;30748:44;;-1:-1:-1;30821:28:0;;:15;-1:-1:-1;30748:44:0;30821:19;:28::i;:::-;-1:-1:-1;;;;;30803:15:0;;;;;;:7;:15;;;;;:46;30870:7;;:20;;30882:7;30870:11;:20::i;:::-;30860:7;:30;30914:10;;:23;;30929:7;30914:14;:23::i;:::-;30901:10;:36;-1:-1:-1;;;30568:377:0:o;45381:374::-;1851:6;;-1:-1:-1;;;;;1851:6:0;305:10;1851:22;1843:67;;;;-1:-1:-1;;;1843:67:0;;;;;;;:::i;:::-;45444:12:::1;45460:10;:8;:10::i;:::-;45444:26:::0;-1:-1:-1;45481:15:0::1;45500:16;:6:::0;45444:26;45500:10:::1;:16::i;:::-;45481:35:::0;-1:-1:-1;45562:6:0;45535:23:::1;305:10:::0;28820:198;:::i;45535:23::-:1;:33;;45527:61;;;::::0;-1:-1:-1;;;45527:61:0;;7156:2:1;45527:61:0::1;::::0;::::1;7138:21:1::0;7195:2;7175:18;;;7168:30;-1:-1:-1;;;7214:18:1;;;7207:45;7269:18;;45527:61:0::1;6954:339:1::0;45527:61:0::1;305:10:::0;45599:21:::1;::::0;;;:7:::1;:21;::::0;;;;:32;;45624:7;;45599:21;:32:::1;::::0;45624:7;;45599:32:::1;:::i;:::-;;;;;;;;45654:6;45643:7;;:17;;;;;;;:::i;:::-;;;;;;;;45682:7;45671;;:18;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;45705:42:0::1;::::0;1410:25:1;;;45736:1:0::1;::::0;305:10;;-1:-1:-1;;;;;;;;;;;45705:42:0;1398:2:1;1383:18;45705:42:0::1;;;;;;;;45433:322;;45381:374:::0;:::o;44840:111::-;1851:6;;-1:-1:-1;;;;;1851:6:0;305:10;1851:22;1843:67;;;;-1:-1:-1;;;1843:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44909:27:0::1;;::::0;;;:18:::1;:27;::::0;;;;:34;;-1:-1:-1;;44909:34:0::1;44939:4;44909:34;::::0;;44840:111::o;30953:436::-;31043:7;31082;;31071;:18;;31063:62;;;;-1:-1:-1;;;31063:62:0;;7633:2:1;31063:62:0;;;7615:21:1;7672:2;7652:18;;;7645:30;7711:33;7691:18;;;7684:61;7762:18;;31063:62:0;7431:355:1;31063:62:0;31141:17;31136:246;;31176:15;31200:19;31211:7;31200:10;:19::i;:::-;-1:-1:-1;31175:44:0;;-1:-1:-1;31234:14:0;;-1:-1:-1;;;;;31234:14:0;31136:246;31283:23;31314:19;31325:7;31314:10;:19::i;:::-;-1:-1:-1;31281:52:0;;-1:-1:-1;31348:22:0;;-1:-1:-1;;;;;31348:22:0;31658:333;1851:6;;-1:-1:-1;;;;;1851:6:0;305:10;1851:22;1843:67;;;;-1:-1:-1;;;1843:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31741:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;31740:21;31732:61;;;::::0;-1:-1:-1;;;31732:61:0;;5721:2:1;31732:61:0::1;::::0;::::1;5703:21:1::0;5760:2;5740:18;;;5733:30;5799:29;5779:18;;;5772:57;5846:18;;31732:61:0::1;5519:351:1::0;31732:61:0::1;-1:-1:-1::0;;;;;31807:16:0;::::1;31826:1;31807:16:::0;;;:7:::1;:16;::::0;;;;;:20;31804:108:::1;;-1:-1:-1::0;;;;;31883:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;31863:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;31844:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;31804:108:::1;-1:-1:-1::0;;;;;31922:20:0::1;;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;31922:27:0::1;31945:4;31922:27:::0;;::::1;::::0;;;31960:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;31960:23:0::1;::::0;;::::1;::::0;;31658:333::o;45767:114::-;1851:6;;-1:-1:-1;;;;;1851:6:0;305:10;1851:22;1843:67;;;;-1:-1:-1;;;1843:67:0;;;;;;;:::i;:::-;45846:15:::1;:27:::0;;-1:-1:-1;;;;;;45846:27:0::1;-1:-1:-1::0;;;;;45846:27:0;;;::::1;::::0;;;::::1;::::0;;45767:114::o;28820:198::-;-1:-1:-1;;;;;28910:20:0;;28886:7;28910:20;;;:11;:20;;;;;;;;28906:49;;;-1:-1:-1;;;;;;28939:16:0;;;;;:7;:16;;;;;;;28820:198::o;28906:49::-;-1:-1:-1;;;;;28993:16:0;;;;;;:7;:16;;;;;;28973:37;;:19;:37::i;2282:148::-;1851:6;;-1:-1:-1;;;;;1851:6:0;305:10;1851:22;1843:67;;;;-1:-1:-1;;;1843:67:0;;;;;;;:::i;:::-;2389:1:::1;2373:6:::0;;2352:40:::1;::::0;-1:-1:-1;;;;;2373:6:0;;::::1;::::0;-1:-1:-1;;;;;;;;;;;2352:40:0;2389:1;;2352:40:::1;2420:1;2403:19:::0;;-1:-1:-1;;;;;;2403:19:0::1;::::0;;2282:148::o;28531:87::-;28570:13;28603:7;28596:14;;;;;:::i;45081:292::-;1851:6;;-1:-1:-1;;;;;1851:6:0;305:10;1851:22;1843:67;;;;-1:-1:-1;;;1843:67:0;;;;;;;:::i;:::-;45144:12:::1;45160:10;:8;:10::i;:::-;45144:26:::0;-1:-1:-1;45181:15:0::1;45200:16;:6:::0;45144:26;45200:10:::1;:16::i;:::-;45181:35;;45247:7;45227;:16;45235:7;1677::::0;1704:6;-1:-1:-1;;;;;1704:6:0;;1639:79;45235:7:::1;-1:-1:-1::0;;;;;45227:16:0::1;-1:-1:-1::0;;;;;45227:16:0::1;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;45277:6;45266:7;;:17;;;;;;;:::i;:::-;;;;;;;;45305:7;45294;;:18;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;1677:7:0;1704:6;;45328:37:::1;::::0;1410:25:1;;;-1:-1:-1;;;;;1704:6:0;;;;1677:7;-1:-1:-1;;;;;;;;;;;45328:37:0;1398:2:1;1383:18;45328:37:0::1;1264:177:1::0;30068:269:0;30161:4;30178:129;305:10;30201:7;30210:96;30249:15;30210:96;;;;;;;;;;;;;;;;;305:10;30210:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;30210:34:0;;;;;;;;;;;;:38;:96::i;3304:305::-;3356:14;;-1:-1:-1;;;;;3356:14:0;3374:10;3356:28;3348:76;;;;-1:-1:-1;;;3348:76:0;;7993:2:1;3348:76:0;;;7975:21:1;8032:2;8012:18;;;8005:30;8071:34;8051:18;;;8044:62;-1:-1:-1;;;8122:18:1;;;8115:33;8165:19;;3348:76:0;7791:399:1;3348:76:0;3461:9;;3443:15;:27;3435:72;;;;-1:-1:-1;;;3435:72:0;;8397:2:1;3435:72:0;;;8379:21:1;8436:2;8416:18;;;8409:30;8475:33;8455:18;;;8448:61;8526:18;;3435:72:0;8195:355:1;3435:72:0;3552:14;;;3544:6;;3523:44;;-1:-1:-1;;;;;3552:14:0;;;;3544:6;;;;-1:-1:-1;;;;;;;;;;;3523:44:0;;3587:14;;;3578:23;;-1:-1:-1;;;;;;3578:23:0;-1:-1:-1;;;;;3587:14:0;;;3578:23;;;;;;3304:305::o;29026:167::-;29104:4;29121:42;305:10;29145:9;29156:6;29121:9;:42::i;46652:171::-;1851:6;;-1:-1:-1;;;;;1851:6:0;305:10;1851:22;1843:67;;;;-1:-1:-1;;;1843:67:0;;;;;;;:::i;:::-;46729:21:::1;:32:::0;;;::::1;;-1:-1:-1::0;;;46729:32:0::1;-1:-1:-1::0;;;;46729:32:0;;::::1;;::::0;;46777:38:::1;::::0;::::1;::::0;::::1;::::0;46753:8;1237:14:1;1230:22;1212:41;;1200:2;1185:18;;1072:187;46777:38:0::1;;;;;;;;46652:171:::0;:::o;46017:272::-;1851:6;;-1:-1:-1;;;;;1851:6:0;305:10;1851:22;1843:67;;;;-1:-1:-1;;;1843:67:0;;;;;;;:::i;:::-;46152:7:::1;:16:::0;;;;46179:13:::1;:28:::0;;;;46218:11:::1;:24:::0;46253:13:::1;:28:::0;46017:272::o;3002:226::-;1851:6;;-1:-1:-1;;;;;1851:6:0;305:10;1851:22;1843:67;;;;-1:-1:-1;;;1843:67:0;;;;;;;:::i;:::-;3083:6:::1;::::0;;;3066:23;;-1:-1:-1;;;;;;3066:23:0;;::::1;-1:-1:-1::0;;;;;3083:6:0;::::1;3066:23;::::0;;;3100:19:::1;::::0;;3142:22:::1;3160:4:::0;3142:15:::1;:22;:::i;:::-;3130:9;:34:::0;3217:1:::1;3201:6:::0;;3180:40:::1;::::0;-1:-1:-1;;;;;3201:6:0;;::::1;::::0;-1:-1:-1;;;;;;;;;;;3180:40:0;3217:1;;3180:40:::1;3002:226:::0;:::o;44963:110::-;1851:6;;-1:-1:-1;;;;;1851:6:0;305:10;1851:22;1843:67;;;;-1:-1:-1;;;1843:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45030:27:0::1;45060:5;45030:27:::0;;;:18:::1;:27;::::0;;;;:35;;-1:-1:-1;;45030:35:0::1;::::0;;44963:110::o;46455:185::-;1851:6;;-1:-1:-1;;;;;1851:6:0;305:10;1851:22;1843:67;;;;-1:-1:-1;;;1843:67:0;;;;;;;:::i;:::-;46532:12:::1;:26:::0;;;46592:22:::1;46610:3;46592:13;28797:7:::0;;;28717:95;46592:13:::1;:17:::0;::::1;:22::i;:::-;46577:12;;:37;46569:63;;;::::0;-1:-1:-1;;;46569:63:0;;8757:2:1;46569:63:0::1;::::0;::::1;8739:21:1::0;8796:2;8776:18;;;8769:30;-1:-1:-1;;;8815:18:1;;;8808:43;8868:18;;46569:63:0::1;8555:337:1::0;46569:63:0::1;46455:185:::0;:::o;46301:142::-;1851:6;;-1:-1:-1;;;;;1851:6:0;305:10;1851:22;1843:67;;;;-1:-1:-1;;;1843:67:0;;;;;;;:::i;:::-;46394:29:::1;:41:::0;46301:142::o;2585:244::-;1851:6;;-1:-1:-1;;;;;1851:6:0;305:10;1851:22;1843:67;;;;-1:-1:-1;;;1843:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2674:22:0;::::1;2666:73;;;::::0;-1:-1:-1;;;2666:73:0;;9099:2:1;2666:73:0::1;::::0;::::1;9081:21:1::0;9138:2;9118:18;;;9111:30;9177:34;9157:18;;;9150:62;-1:-1:-1;;;9228:18:1;;;9221:36;9274:19;;2666:73:0::1;8897:402:1::0;2666:73:0::1;2776:6;::::0;;2755:38:::1;::::0;-1:-1:-1;;;;;2755:38:0;;::::1;::::0;2776:6;::::1;::::0;-1:-1:-1;;;;;;;;;;;2755:38:0;::::1;2804:6;:17:::0;;-1:-1:-1;;;;;;2804:17:0::1;-1:-1:-1::0;;;;;2804:17:0;;;::::1;::::0;;;::::1;::::0;;2585:244::o;36796:337::-;-1:-1:-1;;;;;36889:19:0;;36881:68;;;;-1:-1:-1;;;36881:68:0;;9506:2:1;36881:68:0;;;9488:21:1;9545:2;9525:18;;;9518:30;9584:34;9564:18;;;9557:62;-1:-1:-1;;;9635:18:1;;;9628:34;9679:19;;36881:68:0;9304:400:1;36881:68:0;-1:-1:-1;;;;;36968:21:0;;36960:68;;;;-1:-1:-1;;;36960:68:0;;9911:2:1;36960:68:0;;;9893:21:1;9950:2;9930:18;;;9923:30;9989:34;9969:18;;;9962:62;-1:-1:-1;;;10040:18:1;;;10033:32;10082:19;;36960:68:0;9709:398:1;36960:68:0;-1:-1:-1;;;;;37041:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;37093:32;;1410:25:1;;;37093:32:0;;1383:18:1;37093:32:0;1264:177:1;37141:1151:0;-1:-1:-1;;;;;37263:18:0;;37255:68;;;;-1:-1:-1;;;37255:68:0;;10314:2:1;37255:68:0;;;10296:21:1;10353:2;10333:18;;;10326:30;10392:34;10372:18;;;10365:62;-1:-1:-1;;;10443:18:1;;;10436:35;10488:19;;37255:68:0;10112:401:1;37255:68:0;37351:1;37342:6;:10;37334:64;;;;-1:-1:-1;;;37334:64:0;;10720:2:1;37334:64:0;;;10702:21:1;10759:2;10739:18;;;10732:30;10798:34;10778:18;;;10771:62;-1:-1:-1;;;10849:18:1;;;10842:39;10898:19;;37334:64:0;10518:405:1;37334:64:0;37693:28;37724:24;37742:4;37724:9;:24::i;:::-;37818:29;;37693:55;;-1:-1:-1;37794:53:0;;;;;;;37876;;-1:-1:-1;37913:16:0;;-1:-1:-1;;;37913:16:0;;;;37912:17;37876:53;:89;;;;-1:-1:-1;37952:13:0;;-1:-1:-1;;;;;37946:19:0;;;37952:13;;37946:19;37876:89;:127;;;;-1:-1:-1;37982:21:0;;-1:-1:-1;;;37982:21:0;;;;37876:127;37858:316;;;38053:29;;38030:52;;38126:36;38141:20;38126:14;:36::i;:::-;38254:30;38269:4;38274:2;38277:6;38254:14;:30::i;:::-;37244:1048;;37141:1151;;;:::o;7929:192::-;8015:7;8051:12;8043:6;;;;8035:29;;;;-1:-1:-1;;;8035:29:0;;;;;;;;:::i;:::-;-1:-1:-1;8075:9:0;8087:5;8091:1;8087;:5;:::i;:::-;8075:17;7929:192;-1:-1:-1;;;;;7929:192:0:o;34591:163::-;34632:7;34653:15;34670;34689:19;:17;:19::i;:::-;34652:56;;-1:-1:-1;34652:56:0;-1:-1:-1;34726:20:0;34652:56;;34726:11;:20::i;:::-;34719:27;;;;34591:163;:::o;9327:132::-;9385:7;9412:39;9416:1;9419;9412:39;;;;;;;;;;;;;;;;;:3;:39::i;7026:181::-;7084:7;;7116:5;7120:1;7116;:5;:::i;:::-;7104:17;;7145:1;7140;:6;;7132:46;;;;-1:-1:-1;;;7132:46:0;;11130:2:1;7132:46:0;;;11112:21:1;11169:2;11149:18;;;11142:30;11208:29;11188:18;;;11181:57;11255:18;;7132:46:0;10928:351:1;33389:419:0;33448:7;33457;33466;33475;33484;33493;33514:23;33539:12;33553:18;33575:20;33587:7;33575:11;:20::i;:::-;33513:82;;;;;;33607:15;33624:23;33649:12;33665:50;33677:7;33686:4;33692:10;33704;:8;:10::i;:::-;33665:11;:50::i;:::-;33606:109;;;;-1:-1:-1;33606:109:0;;-1:-1:-1;33766:15:0;;-1:-1:-1;33783:4:0;;-1:-1:-1;33789:10:0;;-1:-1:-1;33389:419:0;;-1:-1:-1;;;;;33389:419:0:o;7490:136::-;7548:7;7575:43;7579:1;7582;7575:43;;;;;;;;;;;;;;;;;:3;:43::i;8380:471::-;8438:7;8683:1;8688;8683:6;8679:47;;-1:-1:-1;8713:1:0;8706:8;;8679:47;8738:9;8750:5;8754:1;8750;:5;:::i;:::-;8738:17;-1:-1:-1;8783:1:0;8774:5;8778:1;8738:17;8774:5;:::i;:::-;:10;8766:56;;;;-1:-1:-1;;;8766:56:0;;11881:2:1;8766:56:0;;;11863:21:1;11920:2;11900:18;;;11893:30;11959:34;11939:18;;;11932:62;-1:-1:-1;;;12010:18:1;;;12003:31;12051:19;;8766:56:0;11679:397:1;38300:985:0;27537:16;:23;;-1:-1:-1;;;;27537:23:0;-1:-1:-1;;;27537:23:0;;;;38451:27:::1;:20:::0;38476:1:::1;38451:24;:27::i;:::-;38436:42:::0;-1:-1:-1;38489:17:0::1;38509:30;:20:::0;38436:42;38509:24:::1;:30::i;:::-;38489:50:::0;-1:-1:-1;38842:21:0::1;38908:22;38925:4:::0;38908:16:::1;:22::i;:::-;39061:18;39082:41;:21;39108:14:::0;39082:25:::1;:41::i;:::-;39061:62;;39173:35;39186:9;39197:10;39173:12;:35::i;:::-;39234:43;::::0;;12283:25:1;;;12339:2;12324:18;;12317:34;;;12367:18;;;12360:34;;;39234:43:0::1;::::0;12271:2:1;12256:18;39234:43:0::1;;;;;;;-1:-1:-1::0;;27583:16:0;:24;;-1:-1:-1;;;;27583:24:0;;;-1:-1:-1;;;38300:985:0:o;40484:1096::-;-1:-1:-1;;;;;40587:26:0;;;;;;:18;:26;;;;;;;;;:59;;-1:-1:-1;;;;;;40617:29:0;;;;;;:18;:29;;;;;;;;40587:59;40584:245;;;40674:14;:12;:14::i;:::-;40584:245;;;40760:12;;40750:6;:22;;40742:75;;;;-1:-1:-1;;;40742:75:0;;12607:2:1;40742:75:0;;;12589:21:1;12646:2;12626:18;;;12619:30;12685:34;12665:18;;;12658:62;-1:-1:-1;;;12736:18:1;;;12729:38;12784:19;;40742:75:0;12405:404:1;40742:75:0;-1:-1:-1;;;;;40845:19:0;;;;;;:11;:19;;;;;;;;:46;;;;-1:-1:-1;;;;;;40869:22:0;;;;;;:11;:22;;;;;;;;40868:23;40845:46;40841:597;;;40908:48;40930:6;40938:9;40949:6;40908:21;:48::i;:::-;40841:597;;;-1:-1:-1;;;;;40979:19:0;;;;;;:11;:19;;;;;;;;40978:20;:46;;;;-1:-1:-1;;;;;;41002:22:0;;;;;;:11;:22;;;;;;;;40978:46;40974:464;;;41041:46;41061:6;41069:9;41080:6;41041:19;:46::i;40974:464::-;-1:-1:-1;;;;;41110:19:0;;;;;;:11;:19;;;;;;;;41109:20;:47;;;;-1:-1:-1;;;;;;41134:22:0;;;;;;:11;:22;;;;;;;;41133:23;41109:47;41105:333;;;41173:44;41191:6;41199:9;41210:6;41173:17;:44::i;41105:333::-;-1:-1:-1;;;;;41239:19:0;;;;;;:11;:19;;;;;;;;:45;;;;-1:-1:-1;;;;;;41262:22:0;;;;;;:11;:22;;;;;;;;41239:45;41235:203;;;41301:48;41323:6;41331:9;41342:6;41301:21;:48::i;41235:203::-;41382:44;41400:6;41408:9;41419:6;41382:17;:44::i;:::-;-1:-1:-1;;;;;41461:26:0;;;;;;:18;:26;;;;;;;;;:59;;-1:-1:-1;;;;;;41491:29:0;;;;;;:18;:29;;;;;;;;41461:59;41458:115;;;41546:15;36493;;36483:7;:25;36534:21;;36518:13;:37;36581:21;;36565:13;:37;36626:19;;36612:11;:33;36440:213;41546:15;40484:1096;;;:::o;34762:561::-;34859:7;;34895;;34812;;;;;34919:289;34943:9;:16;34939:20;;34919:289;;;35009:7;34985;:21;34993:9;35003:1;34993:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;34993:12:0;34985:21;;;;;;;;;;;;;:31;;:66;;;35044:7;35020;:21;35028:9;35038:1;35028:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;35028:12:0;35020:21;;;;;;;;;;;;;:31;34985:66;34981:97;;;35061:7;;35070;;35053:25;;;;;;;34762:561;;:::o;34981:97::-;35103:34;35115:7;:21;35123:9;35133:1;35123:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;35123:12:0;35115:21;;;;;;;;;;;;;35103:7;;:11;:34::i;:::-;35093:44;;35162:34;35174:7;:21;35182:9;35192:1;35182:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;35182:12:0;35174:21;;;;;;;;;;;;;35162:7;;:11;:34::i;:::-;35152:44;-1:-1:-1;34961:3:0;;;;:::i;:::-;;;;34919:289;;;-1:-1:-1;35244:7:0;;35232;;:20;;:11;:20::i;:::-;35222:7;:30;35218:61;;;35262:7;;35271;;35254:25;;;;;;34762:561;;:::o;35218:61::-;35298:7;;35307;;-1:-1:-1;34762:561:0;-1:-1:-1;34762:561:0:o;9955:278::-;10041:7;10076:12;10069:5;10061:28;;;;-1:-1:-1;;;10061:28:0;;;;;;;;:::i;:::-;-1:-1:-1;10100:9:0;10112:5;10116:1;10112;:5;:::i;33816:330::-;33876:7;33885;33894;33914:12;33929:24;33945:7;33929:15;:24::i;:::-;33914:39;;33964:18;33985:30;34007:7;33985:21;:30::i;:::-;33964:51;-1:-1:-1;34026:23:0;34052:33;33964:51;34052:17;:7;34064:4;34052:11;:17::i;:::-;:21;;:33::i;:::-;34026:59;34121:4;;-1:-1:-1;34127:10:0;;-1:-1:-1;33816:330:0;;-1:-1:-1;;;33816:330:0:o;34154:429::-;34269:7;;;;34325:24;:7;34337:11;34325;:24::i;:::-;34307:42;-1:-1:-1;34360:12:0;34375:21;:4;34384:11;34375:8;:21::i;:::-;34360:36;-1:-1:-1;34407:18:0;34428:27;:10;34443:11;34428:14;:27::i;:::-;34407:48;-1:-1:-1;34466:23:0;34492:33;34407:48;34492:17;:7;34504:4;34492:11;:17::i;:33::-;34544:7;;;;-1:-1:-1;34570:4:0;;-1:-1:-1;34154:429:0;;-1:-1:-1;;;;;;;34154:429:0:o;39293:589::-;39443:16;;;39457:1;39443:16;;;;;;;;39419:21;;39443:16;;;;;;;;;;-1:-1:-1;39443:16:0;39419:40;;39488:4;39470;39475:1;39470:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;39470:23:0;;;:7;;;;;;;;;;:23;;;;39514:15;;:22;;;-1:-1:-1;;;39514:22:0;;;;:15;;;;;:20;;:22;;;;;39470:7;;39514:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39504:4;39509:1;39504:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;39504:32:0;;;:7;;;;;;;;;:32;39581:15;;39549:62;;39566:4;;39581:15;39599:11;39549:8;:62::i;:::-;39650:15;;:224;;-1:-1:-1;;;39650:224:0;;-1:-1:-1;;;;;39650:15:0;;;;:66;;:224;;39731:11;;39650:15;;39801:4;;39828;;39848:15;;39650:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39348:534;39293:589;:::o;39890:513::-;40070:15;;40038:62;;40055:4;;-1:-1:-1;;;;;40070:15:0;40088:11;40038:8;:62::i;:::-;40143:15;;-1:-1:-1;;;;;40143:15:0;:31;40182:9;40215:4;40235:11;40143:15;;40347:7;1677;1704:6;-1:-1:-1;;;;;1704:6:0;;1639:79;40347:7;40143:252;;;;;;-1:-1:-1;;;;;;40143:252:0;;;-1:-1:-1;;;;;14546:15:1;;;40143:252:0;;;14528:34:1;14578:18;;;14571:34;;;;14621:18;;;14614:34;;;;14664:18;;;14657:34;14728:15;;;14707:19;;;14700:44;40369:15:0;14760:19:1;;;14753:35;14462:19;;40143:252:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;35994:434::-;36040:7;;:12;:34;;;;-1:-1:-1;36056:13:0;;:18;36040:34;:54;;;;-1:-1:-1;36078:13:0;;:16;36040:54;:72;;;;-1:-1:-1;36098:11:0;;:14;36040:72;36037:84;;;35994:434::o;36037:84::-;36159:7;;;36141:15;:25;36201:13;;;36177:21;:37;36249:13;;;36225:21;:37;36295:11;;;36273:19;:33;-1:-1:-1;36327:11:0;;;;36349:17;;;;36377;;;36405:15;35994:434::o;44262:566::-;44365:15;44382:23;44407:12;44421:23;44446:12;44460:18;44482:19;44493:7;44482:10;:19::i;:::-;-1:-1:-1;;;;;44530:15:0;;;;;;:7;:15;;;;;;44364:137;;-1:-1:-1;44364:137:0;;-1:-1:-1;44364:137:0;;-1:-1:-1;44364:137:0;-1:-1:-1;44364:137:0;-1:-1:-1;44364:137:0;-1:-1:-1;44530:28:0;;44550:7;44530:19;:28::i;:::-;-1:-1:-1;;;;;44512:15:0;;;;;;:7;:15;;;;;;;;:46;;;;44587:7;:15;;;;:28;;44607:7;44587:19;:28::i;:::-;-1:-1:-1;;;;;44569:15:0;;;;;;;:7;:15;;;;;;:46;;;;44647:18;;;;;;;:39;;44670:15;44647:22;:39::i;:::-;-1:-1:-1;;;;;44626:18:0;;;;;;:7;:18;;;;;:60;44700:26;44715:10;44700:14;:26::i;:::-;44737:23;44749:4;44755;44737:11;:23::i;:::-;44793:9;-1:-1:-1;;;;;44776:44:0;44785:6;-1:-1:-1;;;;;44776:44:0;-1:-1:-1;;;;;;;;;;;44804:15:0;44776:44;;;;1410:25:1;;1398:2;1383:18;;1264:177;44776:44:0;;;;;;;;44353:475;;;;;;44262:566;;;:::o;43668:586::-;43769:15;43786:23;43811:12;43825:23;43850:12;43864:18;43886:19;43897:7;43886:10;:19::i;:::-;-1:-1:-1;;;;;43934:15:0;;;;;;:7;:15;;;;;;43768:137;;-1:-1:-1;43768:137:0;;-1:-1:-1;43768:137:0;;-1:-1:-1;43768:137:0;-1:-1:-1;43768:137:0;-1:-1:-1;43768:137:0;-1:-1:-1;43934:28:0;;43768:137;43934:19;:28::i;:::-;-1:-1:-1;;;;;43916:15:0;;;;;;;:7;:15;;;;;;;;:46;;;;43994:18;;;;;:7;:18;;;;;:39;;44017:15;43994:22;:39::i;:::-;-1:-1:-1;;;;;43973:18:0;;;;;;:7;:18;;;;;;;;:60;;;;44065:7;:18;;;;:39;;44088:15;44065:22;:39::i;41588:730::-;41693:15;41710:23;41735:12;41749:23;41774:12;41788:18;41810:19;41821:7;41810:10;:19::i;:::-;41692:137;;;;;;;;;;;;41877:64;41891:6;41899:15;41916;41933:7;41877:13;:64::i;:::-;41840:101;-1:-1:-1;41840:101:0;-1:-1:-1;41989:62:0;42001:6;41840:101;;42043:7;41989:11;:62::i;:::-;-1:-1:-1;;;;;42080:15:0;;;;;;:7;:15;;;;;;41952:99;;-1:-1:-1;41952:99:0;;-1:-1:-1;42080:28:0;;42100:7;42080:19;:28::i;32486:642::-;32589:15;32606:23;32631:12;32645:23;32670:12;32684:18;32706:19;32717:7;32706:10;:19::i;:::-;-1:-1:-1;;;;;32754:15:0;;;;;;:7;:15;;;;;;32588:137;;-1:-1:-1;32588:137:0;;-1:-1:-1;32588:137:0;;-1:-1:-1;32588:137:0;-1:-1:-1;32588:137:0;-1:-1:-1;32588:137:0;-1:-1:-1;32754:28:0;;32774:7;32754:19;:28::i;:::-;-1:-1:-1;;;;;32736:15:0;;;;;;:7;:15;;;;;;;;:46;;;;32811:7;:15;;;;:28;;32831:7;32811:19;:28::i;35702:130::-;35766:7;35793:31;35818:5;35793:20;35805:7;;35793;:11;;:20;;;;:::i;35840:142::-;35910:7;35937:37;35968:5;35937:26;35949:13;;35937:7;:11;;:26;;;;:::i;35335:355::-;35398:19;35421:10;:8;:10::i;:::-;35398:33;-1:-1:-1;35442:18:0;35463:27;:10;35398:33;35463:14;:27::i;:::-;35542:4;35526:22;;;;:7;:22;;;;;;35442:48;;-1:-1:-1;35526:38:0;;35442:48;35526:26;:38::i;:::-;35517:4;35501:22;;;;:7;:22;;;;;;;;:63;;;;35578:11;:26;;;;;;35575:107;;;35660:4;35644:22;;;;:7;:22;;;;;;:38;;35671:10;35644:26;:38::i;:::-;35635:4;35619:22;;;;:7;:22;;;;;:63;35387:303;;35335:355;:::o;33234:147::-;33312:7;;:17;;33324:4;33312:11;:17::i;:::-;33302:7;:27;33353:10;;:20;;33368:4;33353:14;:20::i;:::-;33340:10;:33;-1:-1:-1;;33234:147:0:o;42326:674::-;42454:7;42463;42491:13;;42506:1;42491:16;42488:67;;-1:-1:-1;42519:15:0;;-1:-1:-1;42536:15:0;42512:40;;42488:67;42609:13;;42565:18;;42586:37;;:18;:7;42598:5;42586:11;:18::i;:::-;:22;;:37::i;:::-;42565:58;;42634:18;42655:26;42670:10;:8;:10::i;:::-;42655;;:14;:26::i;:::-;42634:47;-1:-1:-1;42710:31:0;:15;42634:47;42710:19;:31::i;:::-;42692:49;-1:-1:-1;42770:31:0;:15;42790:10;42770:19;:31::i;:::-;42847:15;;-1:-1:-1;;;;;42847:15:0;42839:24;;;;:7;:24;;;;;;42752:49;;-1:-1:-1;42839:40:0;;42868:10;42839:28;:40::i;:::-;42820:15;;;-1:-1:-1;;;;;42820:15:0;;;42812:24;;;;:7;:24;;;;;;;;;:67;;;;42912:15;;42895:45;;1410:25:1;;;42912:15:0;;;;42895:45;;;;-1:-1:-1;;;;;;;;;;;42895:45:0;1383:18:1;42895:45:0;;;;;;;;42958:15;42975;42951:40;;;;;;42326:674;;;;;;;;:::o;43012:648::-;43138:7;43147;43175:11;;43188:1;43175:14;43172:65;;-1:-1:-1;43201:15:0;;-1:-1:-1;43218:15:0;43194:40;;43172:65;43289:11;;43247:16;;43266:35;;:18;:7;43278:5;43266:11;:18::i;:35::-;43247:54;;43312:16;43331:24;43344:10;:8;:10::i;43331:24::-;43312:43;-1:-1:-1;43384:29:0;:15;43312:43;43384:19;:29::i;:::-;43366:47;-1:-1:-1;43442:29:0;:15;43462:8;43442:19;:29::i;:::-;43515:13;;-1:-1:-1;;;;;43515:13:0;43507:22;;;;:7;:22;;;;;;43424:47;;-1:-1:-1;43507:36:0;;43534:8;43507:26;:36::i;:::-;43490:13;;;-1:-1:-1;;;;;43490:13:0;;;43482:22;;;;:7;:22;;;;;;;;;:61;;;;43576:13;;43559:41;;1410:25:1;;;43576:13:0;;;;43559:41;;;;-1:-1:-1;;;;;;;;;;;43559:41:0;1383:18:1;43559:41:0;1264:177:1;14:597;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;595:2:1;574:15;-1:-1:-1;;570:29:1;555:45;;;;602:2;551:54;;14:597;-1:-1:-1;;;14:597:1:o;616:131::-;-1:-1:-1;;;;;691:31:1;;681:42;;671:70;;737:1;734;727:12;752:315;820:6;828;881:2;869:9;860:7;856:23;852:32;849:52;;;897:1;894;887:12;849:52;936:9;923:23;955:31;980:5;955:31;:::i;:::-;1005:5;1057:2;1042:18;;;;1029:32;;-1:-1:-1;;;752:315:1:o;1681:456::-;1758:6;1766;1774;1827:2;1815:9;1806:7;1802:23;1798:32;1795:52;;;1843:1;1840;1833:12;1795:52;1882:9;1869:23;1901:31;1926:5;1901:31;:::i;:::-;1951:5;-1:-1:-1;2008:2:1;1993:18;;1980:32;2021:33;1980:32;2021:33;:::i;:::-;1681:456;;2073:7;;-1:-1:-1;;;2127:2:1;2112:18;;;;2099:32;;1681:456::o;2142:180::-;2201:6;2254:2;2242:9;2233:7;2229:23;2225:32;2222:52;;;2270:1;2267;2260:12;2222:52;-1:-1:-1;2293:23:1;;2142:180;-1:-1:-1;2142:180:1:o;2327:247::-;2386:6;2439:2;2427:9;2418:7;2414:23;2410:32;2407:52;;;2455:1;2452;2445:12;2407:52;2494:9;2481:23;2513:31;2538:5;2513:31;:::i;2768:160::-;2833:20;;2889:13;;2882:21;2872:32;;2862:60;;2918:1;2915;2908:12;2862:60;2768:160;;;:::o;2933:248::-;2998:6;3006;3059:2;3047:9;3038:7;3034:23;3030:32;3027:52;;;3075:1;3072;3065:12;3027:52;3111:9;3098:23;3088:33;;3140:35;3171:2;3160:9;3156:18;3140:35;:::i;:::-;3130:45;;2933:248;;;;;:::o;3394:180::-;3450:6;3503:2;3491:9;3482:7;3478:23;3474:32;3471:52;;;3519:1;3516;3509:12;3471:52;3542:26;3558:9;3542:26;:::i;3579:385::-;3665:6;3673;3681;3689;3742:3;3730:9;3721:7;3717:23;3713:33;3710:53;;;3759:1;3756;3749:12;3710:53;-1:-1:-1;;3782:23:1;;;3852:2;3837:18;;3824:32;;-1:-1:-1;3903:2:1;3888:18;;3875:32;;3954:2;3939:18;3926:32;;-1:-1:-1;3579:385:1;-1:-1:-1;3579:385:1:o;3969:388::-;4037:6;4045;4098:2;4086:9;4077:7;4073:23;4069:32;4066:52;;;4114:1;4111;4104:12;4066:52;4153:9;4140:23;4172:31;4197:5;4172:31;:::i;:::-;4222:5;-1:-1:-1;4279:2:1;4264:18;;4251:32;4292:33;4251:32;4292:33;:::i;:::-;4344:7;4334:17;;;3969:388;;;;;:::o;4362:380::-;4441:1;4437:12;;;;4484;;;4505:61;;4559:4;4551:6;4547:17;4537:27;;4505:61;4612:2;4604:6;4601:14;4581:18;4578:38;4575:161;;4658:10;4653:3;4649:20;4646:1;4639:31;4693:4;4690:1;4683:15;4721:4;4718:1;4711:15;4575:161;;4362:380;;;:::o;5158:356::-;5360:2;5342:21;;;5379:18;;;5372:30;5438:34;5433:2;5418:18;;5411:62;5505:2;5490:18;;5158:356::o;5875:127::-;5936:10;5931:3;5927:20;5924:1;5917:31;5967:4;5964:1;5957:15;5991:4;5988:1;5981:15;6007:127;6068:10;6063:3;6059:20;6056:1;6049:31;6099:4;6096:1;6089:15;6123:4;6120:1;6113:15;6139:125;6179:4;6207:1;6204;6201:8;6198:34;;;6212:18;;:::i;:::-;-1:-1:-1;6249:9:1;;6139:125::o;6269:127::-;6330:10;6325:3;6321:20;6318:1;6311:31;6361:4;6358:1;6351:15;6385:4;6382:1;6375:15;6401:135;6440:3;6461:17;;;6458:43;;6481:18;;:::i;:::-;-1:-1:-1;6528:1:1;6517:13;;6401:135::o;7298:128::-;7338:3;7369:1;7365:6;7362:1;7359:13;7356:39;;;7375:18;;:::i;:::-;-1:-1:-1;7411:9:1;;7298:128::o;11284:168::-;11324:7;11390:1;11386;11382:6;11378:14;11375:1;11372:21;11367:1;11360:9;11353:17;11349:45;11346:71;;;11397:18;;:::i;:::-;-1:-1:-1;11437:9:1;;11284:168::o;11457:217::-;11497:1;11523;11513:132;;11567:10;11562:3;11558:20;11555:1;11548:31;11602:4;11599:1;11592:15;11630:4;11627:1;11620:15;11513:132;-1:-1:-1;11659:9:1;;11457:217::o;12946:251::-;13016:6;13069:2;13057:9;13048:7;13044:23;13040:32;13037:52;;;13085:1;13082;13075:12;13037:52;13117:9;13111:16;13136:31;13161:5;13136:31;:::i;13202:980::-;13464:4;13512:3;13501:9;13497:19;13543:6;13532:9;13525:25;13569:2;13607:6;13602:2;13591:9;13587:18;13580:34;13650:3;13645:2;13634:9;13630:18;13623:31;13674:6;13709;13703:13;13740:6;13732;13725:22;13778:3;13767:9;13763:19;13756:26;;13817:2;13809:6;13805:15;13791:29;;13838:1;13848:195;13862:6;13859:1;13856:13;13848:195;;;13927:13;;-1:-1:-1;;;;;13923:39:1;13911:52;;14018:15;;;;13983:12;;;;13959:1;13877:9;13848:195;;;-1:-1:-1;;;;;;;14099:32:1;;;;14094:2;14079:18;;14072:60;-1:-1:-1;;;14163:3:1;14148:19;14141:35;14060:3;13202:980;-1:-1:-1;;;13202:980:1:o;14799:306::-;14887:6;14895;14903;14956:2;14944:9;14935:7;14931:23;14927:32;14924:52;;;14972:1;14969;14962:12;14924:52;15001:9;14995:16;14985:26;;15051:2;15040:9;15036:18;15030:25;15020:35;;15095:2;15084:9;15080:18;15074:25;15064:35;;14799:306;;;;;:::o
Swarm Source
ipfs://28f3a76e085cf60dab4c1d18b1cb68fa38d6cf105887bc6c313d2ae7d0b1d476
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 24 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.